import { Home, Archive, Settings, Tag, ChevronRight, Pencil, Trash2, MoreHorizontal } from "lucide-react" import { Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarMenu, SidebarMenuButton, SidebarMenuItem, } from "@/components/ui/sidebar" import { Link, useLocation, useSearchParams, useNavigate } from "react-router-dom" import { SettingsDialog } from "@/components/settings-dialog" import { useState } from "react" import { useTags, useDeleteTag, useRenameTag } from "@/hooks/use-notes" import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible" import { ScrollArea } from "@/components/ui/scroll-area" import { Badge } from "@/components/ui/badge" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { toast } from "sonner" const items = [ { title: "Notes", url: "/", icon: Home, }, { title: "Archive", url: "/archive", icon: Archive, }, ] interface TagItemProps { tag: { id: string; name: string }; isActive: boolean; } function TagItem({ tag, isActive }: TagItemProps) { const [isEditing, setIsEditing] = useState(false); const [editName, setEditName] = useState(tag.name); const { mutate: deleteTag } = useDeleteTag(); const { mutate: renameTag } = useRenameTag(); const navigate = useNavigate(); const handleDelete = () => { if (confirm(`Delete tag "${tag.name}"? Notes will keep their content.`)) { deleteTag(tag.id, { onSuccess: () => { toast.success("Tag deleted"); navigate("/"); }, onError: (err: any) => toast.error(err.message) }); } }; const handleRename = () => { if (editName.trim() && editName.trim() !== tag.name) { renameTag({ id: tag.id, name: editName.trim() }, { onSuccess: () => { toast.success("Tag renamed"); setIsEditing(false); }, onError: (err: any) => { toast.error(err.message); setEditName(tag.name); } }); } else { setIsEditing(false); setEditName(tag.name); } }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter") { handleRename(); } else if (e.key === "Escape") { setIsEditing(false); setEditName(tag.name); } }; if (isEditing) { return ( setEditName(e.target.value)} onBlur={handleRename} onKeyDown={handleKeyDown} autoFocus className="h-7 text-xs" /> ); } return ( {tag.name} e.preventDefault()}> { e.preventDefault(); setIsEditing(true); }}> Rename { e.preventDefault(); handleDelete(); }} className="text-destructive focus:text-destructive"> Delete ); } export function AppSidebar() { const location = useLocation(); const [searchParams] = useSearchParams(); const [settingsOpen, setSettingsOpen] = useState(false); const [tagsOpen, setTagsOpen] = useState(true); const { data: tags } = useTags(); const activeTag = searchParams.get("tag"); return ( <> K-Notes {items.map((item) => ( {item.title} ))} setSettingsOpen(true)} tooltip="Settings"> Settings {/* Tag Browser Section */}
Tags
{tags && tags.length > 0 ? ( tags.map((tag: { id: string; name: string }) => ( )) ) : (
No tags yet
)}
) }