import { useMemo, type HTMLAttributes } from 'react' import type { VaultEntry, ViewFile } from '../../types' import { evaluateView } from '../../utils/viewFilters' import { Funnel, PencilSimple, Trash } from '@phosphor-icons/react' import { Button } from '@/components/ui/button' import { NoteTitleIcon } from '../NoteTitleIcon' import { SidebarCountPill } from '../SidebarParts' import { SIDEBAR_ITEM_PADDING } from './sidebarStyles' import { translate, type AppLocale } from '../../lib/i18n' import { ACCENT_COLORS } from '../../utils/typeColors' interface ViewAccent { color: string background: string } interface SidebarViewItemProps { view: ViewFile isActive: boolean onSelect: () => void onEditView?: (filename: string) => void onDeleteView?: (filename: string) => void dragHandleProps?: HTMLAttributes entries: VaultEntry[] locale?: AppLocale } function resolveViewAccent(color: string | null): ViewAccent | null { const colorKey = color?.trim().toLowerCase() if (!colorKey) return null const accent = ACCENT_COLORS.find((candidate) => candidate.key === colorKey) if (!accent) return null return { color: accent.css, background: accent.cssLight, } } function getViewRowStyle(showCount: boolean, isActive: boolean, accent: ViewAccent | null) { return { padding: showCount ? SIDEBAR_ITEM_PADDING.withCount : SIDEBAR_ITEM_PADDING.regular, borderRadius: 4, ...(isActive && accent ? { background: accent.background, color: accent.color } : {}), } } function ViewIcon({ icon, isActive, accent, }: { icon: string | null isActive: boolean accent: ViewAccent | null }) { if (icon) return return } function ViewCountChip({ count, isActive, accent, }: { count: number isActive: boolean accent: ViewAccent | null }) { if (count <= 0) return null return ( ) } export function SidebarViewItem({ view, isActive, onSelect, onEditView, onDeleteView, dragHandleProps, entries, locale = 'en', }: SidebarViewItemProps) { const count = useMemo(() => evaluateView(view.definition, entries).length, [view.definition, entries]) const showCount = count > 0 const accent = resolveViewAccent(view.definition.color) return (
{view.definition.name}
{onEditView && ( )} {onDeleteView && ( )}
) }