import { useEffect, useState } from 'react'; import { useParams, Link } from 'react-router-dom'; import { format, isValid } from 'date-fns'; import ptBR from 'date-fns/locale/pt-BR'; interface ProvaVerificacao { verified: boolean; message: string; prova?: { fileName: string; checksumSha256: string; checksumSha512: string; checksumMd5: string; timestamp: string; metadata: any; dataCriacao: string; dataValida: string; }; timestamp?: any; } export function PublicVerificarProva() { const { hash } = useParams<{ hash: string }>(); const [result, setResult] = useState(null); const [error, setError] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { const fetchProva = async () => { try { setLoading(true); const response = await fetch(`/api/provas/verificar/${hash}`); if (!response.ok) { throw new Error(response.statusText || 'Falha na verificação'); } const data = await response.json(); console.log('Dados recebidos:', data); setResult(data); } catch (error) { console.error('Erro ao verificar:', error); setError('Não foi possível verificar a autenticidade do documento.'); } finally { setLoading(false); } }; if (hash) { fetchProva(); } }, [hash]); // Função segura para formatar datas const formatDate = (dateString: string | undefined | null) => { if (!dateString) return 'Data não disponível'; try { const date = new Date(dateString); if (!isValid(date)) { console.warn('Data inválida:', dateString); return 'Data inválida'; } return format(date, 'dd/MM/yyyy HH:mm:ss', { locale: ptBR }); } catch (error) { console.error('Erro ao formatar data:', error); return 'Erro na formatação da data'; } }; if (loading) { return (

Carregando informações...

); } if (error || !result) { return (

Verificação Falhou

{error || 'Não foi possível verificar este documento.'}

Validar Novo Documento
); } return (
{result.verified ? ( <>

Documento Verificado

Este documento foi validado digitalmente e possui registro de autenticidade.

) : ( <>

Verificação com Problemas

{result.message}

)}
{result.prova && (

Informações do Documento

Informações de Segurança

{result.prova.metadata && (

Informações de Contexto

{result.prova.metadata.userInfo ? ( <> ) : ( <> {/* Exibir informações do navegador - baseado no user-agent */} {/* Exibir informações do sistema */} )} {/* Garantir exibição do IP */} {/* Garantir exibição da porta capturada no JSON da prova */} { const ip = result.prova.metadata.userInfo.ipAddress; const match = typeof ip === 'string' ? ip.match(/:(\d+)$/) : null; return match ? match[1] : undefined; })() ) || 'Não disponível' } /> {/* Adicionar família IP */} {/* Adicionar idioma */} {/* Adicionar timezone */} {result.prova.metadata.timezone && ( )} {/* Garantir exibição de data de modificação */} {(result.prova.metadata.file_specific?.modified || result.prova.metadata.modification_times) && ( )} {/* Exibir geolocalização capturada na prova */} {( (result.prova.metadata?.latitude !== undefined && result.prova.metadata?.latitude !== null) || (result.prova.metadata?.longitude !== undefined && result.prova.metadata?.longitude !== null) || (result.prova.metadata?.locationInfo?.latitude !== undefined && result.prova.metadata?.locationInfo?.latitude !== null) || (result.prova.metadata?.locationInfo?.longitude !== undefined && result.prova.metadata?.locationInfo?.longitude !== null) ) && ( )}
A data de modificação representa o momento real em que o arquivo foi alterado pela última vez, sendo muito mais confiável que a data de criação para efeitos de validação temporal.
)}
Validar Novo Documento {result.verified && ( Baixar Relatório )}
)}
Documento validado através do sistema AdvX Provas - Integridade e Autenticidade Digital
); } function DetailItem({ label, value }: { label: string; value: string }) { return (
{label}
{value}
); }