import { useCallback, useRef, useState } from "react"; import { useNavigate } from "@tanstack/react-router"; import { Plus, Loader2, ChevronDown, Pencil, Check, X } from "lucide-react"; import { useCurrentWorkspace, useWorkspaceRole } from "@/client/components/workspace/use-workspace-view"; import { useMemberWorkspaces } from "@/client/stores/workspace-directory"; import { directoryCommands } from "@/client/stores/db/workspace-directory"; import { replicaCommands } from "@/client/stores/db/workspace-replica"; import { useCreateWorkspace } from "@/client/hooks/use-create-workspace"; import { api } from "@/client/lib/api"; import { slugify } from "@/lib/slugify"; import { toast } from "@/client/components/toast-store"; import { DropdownPortal } from "@/client/components/ui/dropdown-portal"; import { EmojiIcon } from "@/client/components/ui/emoji-icon"; export function WorkspaceSwitcher() { const navigate = useNavigate(); const currentWorkspace = useCurrentWorkspace(); const isOwner = useWorkspaceRole() === "owner"; const workspaces = useMemberWorkspaces(); const [dropdownOpen, setDropdownOpen] = useState(false); const [showCreateForm, setShowCreateForm] = useState(false); const [createName, setCreateName] = useState(""); const [createSlug, setCreateSlug] = useState(""); const [renaming, setRenaming] = useState(false); const [renameName, setRenameName] = useState(""); const triggerRef = useRef(null); const { createWorkspace, isCreating: creatingWs } = useCreateWorkspace(); const handleClose = useCallback(() => { setDropdownOpen(false); setShowCreateForm(false); setRenaming(false); }, []); const handleRename = useCallback(async () => { if (!currentWorkspace || !renameName.trim()) return; try { const updated = await api.workspaces.update(currentWorkspace.id, { name: renameName.trim() }); // Workspace PATCH returns plain Workspace (no role). Both stores take // the plain patch and preserve their role-aware fields. await replicaCommands.patchWorkspaceHead(currentWorkspace.id, updated); await directoryCommands.patch(currentWorkspace.id, updated); } catch { toast.error("Failed to rename workspace"); } setRenaming(false); }, [currentWorkspace, renameName]); return ( <>
{dropdownOpen && (
{workspaces.map((ws) => (
{renaming && ws.id === currentWorkspace?.id ? (
{ e.preventDefault(); handleRename(); }} > setRenameName(e.target.value)} onKeyDown={(e) => { if (e.key === "Escape") setRenaming(false); }} aria-label="Workspace name" className="flex-1 rounded border border-zinc-600 bg-zinc-800 px-1.5 py-0.5 text-xs text-zinc-200 outline-none focus:border-accent-500" />
) : ( <> {ws.id === currentWorkspace?.id && isOwner && ( )} )}
))}
{showCreateForm ? (
{ setCreateName(e.target.value); setCreateSlug(slugify(e.target.value)); }} className="rounded border border-zinc-600 bg-zinc-800 px-2 py-1 text-xs text-zinc-200 outline-none focus:border-accent-500" /> setCreateSlug(e.target.value)} className="rounded border border-zinc-600 bg-zinc-800 px-2 py-1 text-xs text-zinc-300 outline-none focus:border-accent-500" />
) : ( )}
)} ); }