"use client"; import { useCallback, useRef, useState } from "react"; import { IconLayout, IconCheck, IconDeviceFloppy, IconColumns3, IconFileText, IconDeviceDesktop, IconBrandVscode, IconTrash, } from "@tabler/icons-react"; import { Button } from "@kandev/ui/button"; import { Input } from "@kandev/ui/input"; import { Label } from "@kandev/ui/label"; import { Checkbox } from "@kandev/ui/checkbox"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@kandev/ui/dialog"; import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@kandev/ui/dropdown-menu"; import { Tooltip, TooltipContent, TooltipTrigger } from "@kandev/ui/tooltip"; import { Badge } from "@kandev/ui/badge"; import { useDockviewStore, type BuiltInPreset } from "@/lib/state/dockview-store"; import { useAppStore } from "@/components/state-provider"; import { updateUserSettings } from "@/lib/api/domains/settings-api"; import type { SavedLayout } from "@/lib/types/http"; type PresetOption = { id: BuiltInPreset; label: string; description: string; icon: React.ElementType; }; const BUILT_IN_PRESETS: PresetOption[] = [ { id: "default", label: "Default", description: "Sidebar + Agent + Changes/Files/Terminal", icon: IconColumns3, }, { id: "plan", label: "Plan Mode", description: "Sidebar + Agent + Plan (side-by-side)", icon: IconFileText, }, { id: "preview", label: "Preview Mode", description: "Sidebar + Agent + Browser (side-by-side)", icon: IconDeviceDesktop, }, { id: "vscode", label: "VS Code", description: "Sidebar + Agent/VS Code (tabbed)", icon: IconBrandVscode, }, ]; function SaveLayoutDialog({ open, onOpenChange, }: { open: boolean; onOpenChange: (open: boolean) => void; }) { const [name, setName] = useState(""); const [isDefault, setIsDefault] = useState(false); const [saving, setSaving] = useState(false); const captureCurrentLayout = useDockviewStore((s) => s.captureCurrentLayout); const savedLayouts = useAppStore((s) => s.userSettings.savedLayouts); const handleSave = useCallback(async () => { const trimmed = name.trim(); if (!trimmed) return; setSaving(true); try { const layout = captureCurrentLayout(); const newLayout: SavedLayout = { id: `layout-${Date.now()}`, name: trimmed, is_default: isDefault, layout, created_at: new Date().toISOString(), }; // If this layout is the default, unset other defaults const updated = savedLayouts.map((l) => (isDefault ? { ...l, is_default: false } : l)); await updateUserSettings({ saved_layouts: [...updated, newLayout], }); setName(""); setIsDefault(false); onOpenChange(false); } finally { setSaving(false); } }, [name, isDefault, captureCurrentLayout, savedLayouts, onOpenChange]); return ( ); } function SavedLayoutItems({ layouts, onApply, onDelete, }: { layouts: SavedLayout[]; onApply: (layout: SavedLayout) => void; onDelete: (layoutId: string) => void; }) { if (layouts.length === 0) { return