'use client'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useRouter } from 'next/navigation'; import { ChevronRight, Plus } from 'lucide-react'; import { DocumentFormDialog } from '@/components/documents/document-form-dialog'; import { DocumentPhotosInline } from '@/components/documents/document-photo-gallery'; import { useAuth } from '@/components/id/auth-provider'; import { IdShell } from '@/components/id/shell'; import { useToast } from '@/components/id/toast-provider'; import { DOCUMENT_CATEGORIES, DOCUMENT_TYPES, getDocumentType, parseDocumentPhotos, parseMetadata, QUICK_DOCUMENT_TYPES, indexDocumentsByType, type DocumentTypeCode } from '@/lib/document-catalog'; import { apiFetch, getApiErrorMessage, UserDocument } from '@/lib/api'; import { cn } from '@/lib/utils'; import { useRequireAuth } from '@/hooks/use-require-auth'; export default function DocumentsPage() { const router = useRouter(); const { user, token } = useAuth(); const { isReady, isPinLocked } = useRequireAuth(); const { showToast } = useToast(); const [documents, setDocuments] = useState([]); const [activeType, setActiveType] = useState(null); const loadDocuments = useCallback(async () => { if (!user || !token || isPinLocked) return; try { const response = await apiFetch<{ documents?: UserDocument[] }>(`/documents/users/${user.id}`, {}, token); setDocuments(response.documents ?? []); } catch (error) { const message = getApiErrorMessage(error, 'Не удалось загрузить документы'); if (message) showToast(message); } }, [isPinLocked, showToast, token, user]); useEffect(() => { if (!isReady || !user || isPinLocked) return; void loadDocuments(); }, [isPinLocked, isReady, loadDocuments, user]); const documentsByType = useMemo(() => indexDocumentsByType(documents), [documents]); function openCreate(type: DocumentTypeCode) { setActiveType(type); } return (

Документы

Храните документы и заполняйте формы — ID подставит данные там, где вы разрешите.

Здесь будут ваши документы

Добавьте паспорт, права или полис — данные сохранятся в зашифрованном виде.

🛂
{QUICK_DOCUMENT_TYPES.map((typeCode) => { const config = getDocumentType(typeCode); if (!config) return null; const Icon = config.icon; return ( ); })}
{DOCUMENT_CATEGORIES.map((category) => (

{category.title}

{DOCUMENT_TYPES.filter((item) => item.category === category.id).map((item) => { const Icon = item.icon; const existing = documentsByType.get(item.type); const photoKeys = existing ? parseDocumentPhotos(parseMetadata(existing.metadataJson)) : []; return (
{existing && photoKeys.length > 0 && user && token ? (
) : null}
); })}
))} {activeType ? ( { if (!open) setActiveType(null); }} documentType={activeType} userId={user?.id ?? ''} token={token} existing={documentsByType.get(activeType) ?? null} onSaved={loadDocuments} /> ) : null}
); }