'use client'; import { useState } from 'react'; import { Plus, Pencil, Trash2, Search, PenTool, Stamp, Type, History, AlertTriangle } from 'lucide-react'; import { Button } from '@/shared/components/ui/button'; import { Input } from '@/shared/components/ui/input'; import { Label } from '@/shared/components/ui/label'; import { Textarea } from '@/shared/components/ui/textarea'; import { Badge } from '@/shared/components/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@/shared/components/ui/card'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/shared/components/ui/select'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from '@/shared/components/ui/dialog'; import type { CompanyId } from '@/core/auth/types'; import type { SignatureAsset, SignatureAssetType } from '../types'; import { useSignatures } from '../hooks/use-signatures'; const TYPE_LABELS: Record = { signature: 'Semnătură', stamp: 'Ștampilă', initials: 'Inițiale', }; const TYPE_ICONS: Record = { signature: PenTool, stamp: Stamp, initials: Type, }; type ViewMode = 'list' | 'add' | 'edit'; export function DigitalSignaturesModule() { const { assets, allAssets, loading, filters, updateFilter, addAsset, updateAsset, addVersion, removeAsset } = useSignatures(); const [viewMode, setViewMode] = useState('list'); const [editingAsset, setEditingAsset] = useState(null); const [deletingId, setDeletingId] = useState(null); const [versionAsset, setVersionAsset] = useState(null); const handleSubmit = async (data: Omit) => { if (viewMode === 'edit' && editingAsset) { await updateAsset(editingAsset.id, data); } else { await addAsset(data); } setViewMode('list'); setEditingAsset(null); }; const handleDeleteConfirm = async () => { if (deletingId) { await removeAsset(deletingId); setDeletingId(null); } }; const handleAddVersion = async (imageUrl: string, notes: string) => { if (versionAsset) { await addVersion(versionAsset.id, imageUrl, notes); setVersionAsset(null); } }; const isExpiringSoon = (date?: string) => { if (!date) return false; const diff = new Date(date).getTime() - Date.now(); return diff > 0 && diff < 30 * 24 * 60 * 60 * 1000; // 30 days }; const isExpired = (date?: string) => { if (!date) return false; return new Date(date).getTime() < Date.now(); }; return (
{/* Stats */}

Total

{allAssets.length}

{(Object.keys(TYPE_LABELS) as SignatureAssetType[]).map((type) => (

{TYPE_LABELS[type]}

{allAssets.filter((a) => a.type === type).length}

))}
{viewMode === 'list' && ( <>
updateFilter('search', e.target.value)} className="pl-9" />
{loading ? (

Se încarcă...

) : assets.length === 0 ? (

Niciun element găsit. Adaugă o semnătură, ștampilă sau inițiale.

) : (
{assets.map((asset) => { const Icon = TYPE_ICONS[asset.type]; const expired = isExpired(asset.expirationDate); const expiringSoon = isExpiringSoon(asset.expirationDate); return (
{asset.imageUrl ? ( // eslint-disable-next-line @next/next/no-img-element {asset.label} ) : ( )}

{asset.label}

{TYPE_LABELS[asset.type]} {asset.owner}
{/* Metadata row */}
{asset.legalStatus && (

Status legal: {asset.legalStatus}

)} {asset.expirationDate && (
{(expired || expiringSoon) && } {expired ? 'Expirat' : expiringSoon ? 'Expiră curând' : 'Expiră'}: {asset.expirationDate}
)} {asset.usageNotes && (

Note: {asset.usageNotes}

)} {asset.versions.length > 0 && (

Versiuni: {asset.versions.length + 1}

)}
); })}
)} )} {(viewMode === 'add' || viewMode === 'edit') && ( {viewMode === 'edit' ? 'Editare' : 'Element nou'} { setViewMode('list'); setEditingAsset(null); }} /> )} {/* Delete confirmation */} { if (!open) setDeletingId(null); }}> Confirmare ștergere

Ești sigur că vrei să ștergi acest element? Acțiunea este ireversibilă.

{/* Add version dialog */} { if (!open) setVersionAsset(null); }}> Versiune nouă — {versionAsset?.label} setVersionAsset(null)} history={versionAsset?.versions ?? []} />
); } function AddVersionForm({ onSubmit, onCancel, history }: { onSubmit: (imageUrl: string, notes: string) => void; onCancel: () => void; history: Array<{ id: string; imageUrl: string; notes: string; createdAt: string }>; }) { const [imageUrl, setImageUrl] = useState(''); const [notes, setNotes] = useState(''); return (
{history.length > 0 && (

Istoric versiuni

{history.map((v) => (
{v.notes || 'Fără note'} {v.createdAt.slice(0, 10)}
))}
)}
setImageUrl(e.target.value)} className="mt-1" placeholder="https://... sau data:image/png;base64,..." required />
setNotes(e.target.value)} className="mt-1" placeholder="Ce s-a schimbat..." />
); } function AssetForm({ initial, onSubmit, onCancel }: { initial?: SignatureAsset; onSubmit: (data: Omit) => void; onCancel: () => void; }) { const [label, setLabel] = useState(initial?.label ?? ''); const [type, setType] = useState(initial?.type ?? 'signature'); const [imageUrl, setImageUrl] = useState(initial?.imageUrl ?? ''); const [owner, setOwner] = useState(initial?.owner ?? ''); const [company, setCompany] = useState(initial?.company ?? 'beletage'); const [expirationDate, setExpirationDate] = useState(initial?.expirationDate ?? ''); const [legalStatus, setLegalStatus] = useState(initial?.legalStatus ?? ''); const [usageNotes, setUsageNotes] = useState(initial?.usageNotes ?? ''); return (
{ e.preventDefault(); onSubmit({ label, type, imageUrl, owner, company, expirationDate: expirationDate || undefined, legalStatus, usageNotes, versions: initial?.versions ?? [], tags: initial?.tags ?? [], visibility: initial?.visibility ?? 'all', }); }} className="space-y-4">
setLabel(e.target.value)} className="mt-1" required />
setOwner(e.target.value)} className="mt-1" />
setImageUrl(e.target.value)} className="mt-1" placeholder="https://... sau data:image/png;base64,..." />

URL către imaginea semnăturii/ștampilei. Suportă URL-uri externe sau base64.

setExpirationDate(e.target.value)} className="mt-1" />
setLegalStatus(e.target.value)} className="mt-1" placeholder="Valid, Anulat..." />
setUsageNotes(e.target.value)} className="mt-1" placeholder="Doar pentru contracte..." />
); }