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" import { useTranslation } from "react-i18next" const items = [ { titleKey: "Notes", url: "/", icon: Home, }, { titleKey: "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 { t } = useTranslation(); const handleDelete = () => { if (confirm(t("Delete tag \"{{name}}\"? Notes will keep their content.", { name: tag.name }))) { deleteTag(tag.id, { onSuccess: () => { toast.success(t("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(t("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); }}> {t("Rename")} { e.preventDefault(); handleDelete(); }} className="text-destructive focus:text-destructive"> {t("Delete")} ); } export function AppSidebar() { const location = useLocation(); const [searchParams] = useSearchParams(); const [settingsOpen, setSettingsOpen] = useState(false); const [tagsOpen, setTagsOpen] = useState(true); const { t } = useTranslation(); const { data: tags } = useTags(); const activeTag = searchParams.get("tag"); return ( <> {t("K-Notes")} {items.map((item) => ( {t(item.titleKey)} ))} setSettingsOpen(true)} tooltip={t("Settings")}> {t("Settings")} {/* Tag Browser Section */}
{t("Tags")}
{tags && tags.length > 0 ? ( tags.map((tag: { id: string; name: string }) => ( )) ) : (
{t("No tags yet")}
)}
) }