import { motion } from "framer-motion"; import { Check, ChevronRight, Cloud, Pencil, Plus, Server, Trash2 } from "lucide-react"; import { useState } from "react"; import { type ConnectionPreset, SettingsForm } from "@/components/settings/SettingsForm"; import { Button } from "@/components/ui/button"; import { Muted } from "@/components/ui/typography"; import { useInstances } from "@/hooks/useInstances"; import { HONCHO_CLOUD_URL, type Instance, isCloudInstance } from "@/lib/config"; import { COLOR } from "@/lib/constants"; type Mode = | { kind: "list" } | { kind: "choose-type" } | { kind: "create"; preset: ConnectionPreset } | { kind: "edit"; id: string }; interface InstancesManagerProps { onActivated?: () => void; } export function InstancesManager({ onActivated }: InstancesManagerProps) { const { instances, activeId, activate, remove } = useInstances(); const isFirstRun = instances.length === 0; const [mode, setMode] = useState(isFirstRun ? { kind: "choose-type" } : { kind: "list" }); const backFromCreate = () => setMode(isFirstRun ? { kind: "choose-type" } : { kind: "list" }); if (mode.kind === "choose-type") { return ( setMode({ kind: "create", preset })} onCancel={isFirstRun ? undefined : () => setMode({ kind: "list" })} /> ); } if (mode.kind === "create") { return ( { setMode({ kind: "list" }); onActivated?.(); }} onCancel={backFromCreate} hideCancel={false} submitLabel={isFirstRun ? "Save Connection" : undefined} /> ); } if (mode.kind === "edit") { const target = instances.find((i) => i.id === mode.id); if (!target) return null; return ( setMode({ kind: "list" })} onCancel={() => setMode({ kind: "list" })} /> ); } return (
{instances.map((inst) => ( { activate(inst.id); onActivated?.(); }} onEdit={() => setMode({ kind: "edit", id: inst.id })} onDelete={() => remove(inst.id)} /> ))}
); } interface ConnectionTypeChooserProps { onPick: (preset: ConnectionPreset) => void; onCancel?: () => void; } function ConnectionTypeChooser({ onPick, onCancel }: ConnectionTypeChooserProps) { return (

How do you want to connect?

You can add more connections later — Cloud, self-hosted, or both.
onPick("cloud")} /> onPick("self-hosted")} /> {onCancel && (
)}
); } interface ConnectionTypeButtonProps { icon: typeof Cloud; title: string; description: string; accent?: boolean; onClick: () => void; } function ConnectionTypeButton({ icon: Icon, title, description, accent, onClick, }: ConnectionTypeButtonProps) { return ( ); } interface InstanceRowProps { instance: Instance; active: boolean; onActivate: () => void; onEdit: () => void; onDelete: () => void; } function InstanceRow({ instance, active, onActivate, onEdit, onDelete }: InstanceRowProps) { const [confirmingDelete, setConfirmingDelete] = useState(false); const cloud = isCloudInstance(instance); return (
{confirmingDelete ? ( ) : ( )}
); }