import { useMemo, useState } from 'react'; import { useT } from '../i18n'; import type { DesignSystemSummary, Project, SkillSummary } from '../types'; import { Icon } from './Icon'; type SubTab = 'recent' | 'yours'; interface Props { projects: Project[]; skills: SkillSummary[]; designSystems: DesignSystemSummary[]; onOpen: (id: string) => void; onDelete: (id: string) => void; } export function DesignsTab({ projects, skills, designSystems, onOpen, onDelete }: Props) { const t = useT(); const [filter, setFilter] = useState(''); const [sub, setSub] = useState('recent'); const filtered = useMemo(() => { const q = filter.trim().toLowerCase(); let list = projects; if (sub === 'recent') { list = [...list].sort((a, b) => b.updatedAt - a.updatedAt); } if (!q) return list; return list.filter((p) => p.name.toLowerCase().includes(q)); }, [projects, filter, sub]); const skillName = (id: string | null) => skills.find((s) => s.id === id)?.name ?? ''; const dsName = (id: string | null) => designSystems.find((d) => d.id === id)?.title ?? ''; return (
setFilter(e.target.value)} />
{filtered.length === 0 ? (
{projects.length === 0 ? t('designs.emptyNoProjects') : t('designs.emptyNoMatch')}
) : (
{filtered.map((p) => { const skill = skillName(p.skillId); const ds = dsName(p.designSystemId); return (
onOpen(p.id)} onKeyDown={(e) => { if (e.key === 'Enter') onOpen(p.id); }} >
{p.name}
{ds ? ( {ds} ) : ( {t('designs.cardFreeform')} )} {skill ? ` · ${skill}` : ''} {' · '} {relativeTime(p.updatedAt, t)}
); })}
)}
); } function relativeTime(ts: number, t: ReturnType): string { const diff = Date.now() - ts; const min = 60_000; const hr = 60 * min; const day = 24 * hr; if (diff < min) return t('common.justNow'); if (diff < hr) return t('common.minutesAgo', { n: Math.floor(diff / min) }); if (diff < day) return t('common.hoursAgo', { n: Math.floor(diff / hr) }); if (diff < 7 * day) return t('common.daysAgo', { n: Math.floor(diff / day) }); return new Date(ts).toLocaleDateString(); }