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 && (
)}
)
}