import { CopyIcon, EditIcon, Plus, RocketIcon, Trash2Icon } from "lucide-react"; import { useEffect, useState } from "react"; import { toast } from "sonner"; import { startGame } from "@/client"; import InstanceCreationModal from "@/components/instance-creation-modal"; import InstanceEditorModal from "@/components/instance-editor-modal"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { cn } from "@/lib/utils"; import { useInstanceStore } from "@/models/instance"; import type { Instance } from "@/types"; export function InstancesView() { const instancesStore = useInstanceStore(); // Modal / UI state const [showCreateModal, setShowCreateModal] = useState(false); const [showEditModal, setShowEditModal] = useState(false); const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const [showDuplicateModal, setShowDuplicateModal] = useState(false); // Selected / editing instance state const [selectedInstance, setSelectedInstance] = useState( null, ); const [editingInstance, setEditingInstance] = useState(null); // Form fields const [duplicateName, setDuplicateName] = useState(""); useEffect(() => { instancesStore.refresh(); }, [instancesStore.refresh]); // Handlers to open modals const openCreate = () => { setShowCreateModal(true); }; const openEdit = (instance: Instance) => { setEditingInstance({ ...instance }); setShowEditModal(true); }; const openDelete = (instance: Instance) => { setSelectedInstance(instance); setShowDeleteConfirm(true); }; const openDuplicate = (instance: Instance) => { setSelectedInstance(instance); setDuplicateName(`${instance.name} (Copy)`); setShowDuplicateModal(true); }; const confirmDelete = async () => { if (!selectedInstance) return; await instancesStore.delete(selectedInstance.id); setSelectedInstance(null); setShowDeleteConfirm(false); }; const confirmDuplicate = async () => { if (!selectedInstance) return; const name = duplicateName.trim(); if (!name) return; await instancesStore.duplicate(selectedInstance.id, name); setSelectedInstance(null); setDuplicateName(""); setShowDuplicateModal(false); }; return (

Instances

{instancesStore.instances.length === 0 ? (

No instances yet

Create your first instance to get started

) : (
    {instancesStore.instances.map((instance) => { const isActive = instancesStore.activeInstance?.id === instance.id; return (
  • instancesStore.setActiveInstance(instance)} onKeyDown={async (e) => { if (e.key === "Enter") { try { await instancesStore.setActiveInstance(instance); } catch (e) { console.error("Failed to set active instance:", e); toast.error("Error setting active instance"); } } }} className="cursor-pointer" >
    {instance.iconPath ? (
    {instance.name}
    ) : (
    {instance.name.charAt(0).toUpperCase()}
    )}

    {instance.name}

    {instance.versionId ? (

    {instance.versionId}

    ) : (

    No version selected

    )}
  • ); })}
)} { setShowEditModal(open); if (!open) setEditingInstance(null); }} /> {/* Delete Confirmation */} Delete Instance Are you sure you want to delete "{selectedInstance?.name}"? This action cannot be undone. {/* Duplicate Modal */} Duplicate Instance Provide a name for the duplicated instance.
setDuplicateName(e.target.value)} placeholder="New instance name" onKeyDown={(e) => e.key === "Enter" && confirmDuplicate()} />
); }