"use client"; import { useEffect, useMemo, useState } from "react"; import { CheckSquare, FileJson, GitBranch, Moon, Plus, Square, Sun, Trash2, X } from "lucide-react"; import { Button } from "@/components/ui/Button"; import { Badge } from "@/components/ui/Badge"; import type { TreeSummary } from "@/lib/tree/types"; import { cn } from "@/lib/utils"; interface TreeLibraryRailProps { trees: TreeSummary[]; selectedTreeId: string | null; isLoading: boolean; isDeleting: boolean; darkMode: boolean; width: number; onResizeStart: (event: React.PointerEvent) => void; onToggleDarkMode: () => void; onCreate: () => void; onSelect: (treeId: string) => void; onDelete: (treeId: string) => void; onBulkDelete: (treeIds: string[]) => void; onDeleteAll: () => void; } export function TreeLibraryRail({ trees, selectedTreeId, isLoading, isDeleting, darkMode, width, onResizeStart, onToggleDarkMode, onCreate, onSelect, onDelete, onBulkDelete, onDeleteAll }: TreeLibraryRailProps) { const [bulkDeleteMode, setBulkDeleteMode] = useState(false); const [selectedDeleteIds, setSelectedDeleteIds] = useState>(() => new Set()); useEffect(() => { const availableIds = new Set(trees.map((tree) => tree.id)); setSelectedDeleteIds((current) => { const next = new Set([...current].filter((treeId) => availableIds.has(treeId))); return next.size === current.size ? current : next; }); if (trees.length === 0) setBulkDeleteMode(false); }, [trees]); const selectedCount = selectedDeleteIds.size; const allSelected = useMemo( () => trees.length > 0 && trees.every((tree) => selectedDeleteIds.has(tree.id)), [selectedDeleteIds, trees] ); const toggleBulkDeleteMode = () => { setBulkDeleteMode((current) => { if (current) setSelectedDeleteIds(new Set()); return !current; }); }; const toggleDeleteSelection = (treeId: string) => { setSelectedDeleteIds((current) => { const next = new Set(current); if (next.has(treeId)) next.delete(treeId); else next.add(treeId); return next; }); }; const toggleSelectAll = () => { setSelectedDeleteIds(allSelected ? new Set() : new Set(trees.map((tree) => tree.id))); }; const deleteSelectedTrees = () => { const treeIds = [...selectedDeleteIds]; if (treeIds.length === 0) return; if (!window.confirm(`Delete ${treeIds.length} selected saved tree${treeIds.length === 1 ? "" : "s"}?`)) return; onBulkDelete(treeIds); setSelectedDeleteIds(new Set()); }; const deleteEveryTree = () => { if (trees.length === 0) return; if (!window.confirm(`Delete all ${trees.length} saved trees? This cannot be undone.`)) return; onDeleteAll(); setSelectedDeleteIds(new Set()); setBulkDeleteMode(false); }; return ( ); }