'use client' import { useState } from 'react' import { toast } from 'sonner' import { LayoutGrid } from 'lucide-react' import { createArea, updateArea, deleteArea } from '@/lib/actions' import { Card } from './card' import { useConfirm } from '@/components/ui/confirm' import { Empty, EmptyHeader, EmptyMedia, EmptyTitle, EmptyDescription } from '@/components/ui/empty' import type { Area } from './types' export function AreasPanel({ isAdmin, areas: initial }: { isAdmin: boolean; areas: Area[] }) { const confirm = useConfirm() const [areas, setAreas] = useState(initial) const [showNew, setShowNew] = useState(false) const [d, setD] = useState({ code: '', name: '', icon: '' }) return ( setShowNew(v => !v)} className="font-mono text-[10px] border border-border px-3 py-1.5 rounded hover:border-primary hover:text-primary transition whitespace-nowrap">{showNew ? 'Cancel' : '+ New area'} : undefined} > {showNew && (
{ e.preventDefault() const result = await createArea({ code: d.code.trim().toLowerCase(), name: d.name.trim(), icon: d.icon.trim() || undefined }) if ('error' in result && result.error) { toast.error(result.error); return } toast.success('Area created') const created = result as { data?: { id: string } } setAreas(prev => [...prev, { id: created.data?.id ?? crypto.randomUUID(), code: d.code.trim().toLowerCase(), name: d.name.trim(), icon: d.icon.trim() || null, sort_order: 100, is_archived: false }]) setShowNew(false); setD({ code: '', name: '', icon: '' }) }} className="mb-4 p-4 border border-border rounded bg-background grid grid-cols-1 md:grid-cols-3 gap-3" > setD({ ...d, code: e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, '-') })} placeholder="code" className="bg-background border border-border text-foreground font-mono text-xs rounded px-2 py-1.5 focus:outline-none focus:border-primary" /> setD({ ...d, name: e.target.value })} placeholder="Display name" className="bg-background border border-border text-foreground font-sans text-sm rounded px-2 py-1.5 focus:outline-none focus:border-primary" /> setD({ ...d, icon: e.target.value })} placeholder="Icon (emoji, optional)" className="bg-background border border-border text-foreground font-sans text-sm rounded px-2 py-1.5 focus:outline-none focus:border-primary" />
)} {areas.length === 0 && ( No areas yet Areas tag tasks, projects, and knowledge base entries by shop space. )}
) }