diff options
| author | 2026-02-25 00:16:53 +0800 | |
|---|---|---|
| committer | 2026-02-25 00:16:53 +0800 | |
| commit | a6773bd092db654360c599ca6b0108ea0e456e8c (patch) | |
| tree | c78c802a2563fff7aef908532a0706c0299830ac /packages/ui-new/src/models/instances.ts | |
| parent | b275a3668b140d9ce4663de646519d2dbd4297e7 (diff) | |
| download | DropOut-a6773bd092db654360c599ca6b0108ea0e456e8c.tar.gz DropOut-a6773bd092db654360c599ca6b0108ea0e456e8c.zip | |
feat: prepare for nightly alpha
Diffstat (limited to 'packages/ui-new/src/models/instances.ts')
| -rw-r--r-- | packages/ui-new/src/models/instances.ts | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/packages/ui-new/src/models/instances.ts b/packages/ui-new/src/models/instances.ts new file mode 100644 index 0000000..f434c7c --- /dev/null +++ b/packages/ui-new/src/models/instances.ts @@ -0,0 +1,135 @@ +import { toast } from "sonner"; +import { create } from "zustand"; +import { + createInstance, + deleteInstance, + duplicateInstance, + getActiveInstance, + getInstance, + listInstances, + setActiveInstance, + updateInstance, +} from "@/client"; +import type { Instance } from "@/types"; + +interface InstancesState { + // State + instances: Instance[]; + activeInstance: Instance | null; + + // Actions + refresh: () => Promise<void>; + create: (name: string) => Promise<Instance | null>; + delete: (id: string) => Promise<void>; + update: (instance: Instance) => Promise<void>; + setActiveInstance: (instance: Instance) => Promise<void>; + duplicate: (id: string, newName: string) => Promise<Instance | null>; + getInstance: (id: string) => Promise<Instance | null>; +} + +export const useInstancesStore = create<InstancesState>((set, get) => ({ + // Initial state + instances: [], + activeInstance: null, + + // Actions + refresh: async () => { + const { setActiveInstance } = get(); + try { + const instances = await listInstances(); + const active = await getActiveInstance(); + + if (!active && instances.length > 0) { + // If no active instance but instances exist, set the first one as active + await setActiveInstance(instances[0]); + } + + set({ instances }); + } catch (e) { + console.error("Failed to load instances:", e); + toast.error("Error loading instances"); + } + }, + + create: async (name) => { + const { refresh } = get(); + try { + const instance = await createInstance(name); + await refresh(); + toast.success(`Instance "${name}" created successfully`); + return instance; + } catch (e) { + console.error("Failed to create instance:", e); + toast.error("Error creating instance"); + return null; + } + }, + + delete: async (id) => { + const { refresh, instances, activeInstance, setActiveInstance } = get(); + try { + await deleteInstance(id); + await refresh(); + + // If deleted instance was active, set another as active + if (activeInstance?.id === id) { + if (instances.length > 0) { + await setActiveInstance(instances[0]); + } else { + set({ activeInstance: null }); + } + } + + toast.success("Instance deleted successfully"); + } catch (e) { + console.error("Failed to delete instance:", e); + toast.error("Error deleting instance"); + } + }, + + update: async (instance) => { + const { refresh } = get(); + try { + await updateInstance(instance); + await refresh(); + toast.success("Instance updated successfully"); + } catch (e) { + console.error("Failed to update instance:", e); + toast.error("Error updating instance"); + } + }, + + setActiveInstance: async (instance) => { + try { + await setActiveInstance(instance.id); + set({ activeInstance: instance }); + toast.success("Active instance changed"); + } catch (e) { + console.error("Failed to set active instance:", e); + toast.error("Error setting active instance"); + } + }, + + duplicate: async (id, newName) => { + const { refresh } = get(); + try { + const instance = await duplicateInstance(id, newName); + await refresh(); + toast.success(`Instance duplicated as "${newName}"`); + return instance; + } catch (e) { + console.error("Failed to duplicate instance:", e); + toast.error("Error duplicating instance"); + return null; + } + }, + + getInstance: async (id) => { + try { + return await getInstance(id); + } catch (e) { + console.error("Failed to get instance:", e); + return null; + } + }, +})); |