Ver informações do paciente
@@ -850,962 +461,7 @@ const ProfissionalPage = () => {
};
- function PacientesSection({
- handleAbrirProntuario,
- setActiveSection,
- }: {
- handleAbrirProntuario: (paciente: any) => void;
- setActiveSection: (section: string) => void;
- }) {
- return (
-
-
Gerenciamento de Pacientes
-
-
-
- {/* Tabela de pacientes padrão */}
-
-
Pacientes Recentes
-
-
-
- Paciente
- CPF
- Idade
- Status do laudo
- Ações
-
-
-
- {pacientes.map((paciente) => (
-
- {paciente.nome}
- {paciente.cpf}
- {paciente.idade}
- {paciente.statusLaudo}
-
-
-
-
-
- Ver informações do paciente
-
-
-
-
-
-
-
- ))}
-
-
-
-
- );
- };
-
- const renderProntuarioSection = () => (
-
-
-
Prontuário do Paciente
-
- {/* Informações do Paciente Selecionado */}
- {pacienteSelecionado && (
-
-
-
Dados do Paciente
-
-
-
-
-
-
-
-
Nome:
-
{pacienteSelecionado.nome}
-
-
-
CPF:
-
{pacienteSelecionado.cpf}
-
-
-
Idade:
-
{pacienteSelecionado.idade} anos
-
-
-
- )}
-
- {/* Seletor de Paciente */}
- {!pacienteSelecionado && (
-
-
-
-
-
Selecionar Paciente
-
Escolha um paciente para visualizar o prontuário completo
-
-
-
-
-
-
-
-
- {/* Cards de pacientes para seleção rápida */}
-
-
Ou selecione rapidamente:
-
- {pacientes.map((paciente) => (
-
setPacienteSelecionado(paciente)}
- className="border rounded-lg p-4 hover:shadow-md hover:border-primary transition-all cursor-pointer group"
- >
-
-
-
-
-
-
{paciente.nome}
-
CPF: {paciente.cpf}
-
{paciente.idade} anos
-
-
-
-
- {paciente.statusLaudo}
-
-
-
-
- ))}
-
-
-
- )}
-
- {/* Tabs de Navegação do Prontuário */}
- {pacienteSelecionado && (
-
-
-
- )}
-
- {/* Conteúdo das Abas */}
- {pacienteSelecionado && (
-
- {abaProntuarioAtiva === 'nova-consulta' && renderNovaConsultaTab()}
- {abaProntuarioAtiva === 'consultas' && renderConsultasTab()}
- {abaProntuarioAtiva === 'historico' && renderHistoricoTab()}
- {abaProntuarioAtiva === 'prescricoes' && renderPrescricoesTab()}
- {abaProntuarioAtiva === 'exames' && renderExamesTab()}
- {abaProntuarioAtiva === 'diagnosticos' && renderDiagnosticosTab()}
- {abaProntuarioAtiva === 'evolucao' && renderEvolucaoTab()}
- {abaProntuarioAtiva === 'anexos' && renderAnexosTab()}
-
- )}
-
-
- );
-
- // Função para alterar campos da consulta atual
- const handleConsultaChange = (field: string, value: string) => {
- setConsultaAtual(prev => ({
- ...prev,
- [field]: value
- }));
- };
-
- // Função para salvar a consulta
- const handleSalvarConsulta = () => {
- if (!consultaAtual.anamnese || !consultaAtual.exameFisico) {
- alert('Por favor, preencha os campos que são obrigatórios.');
- return;
- }
-
- const novaConsulta = {
- ...consultaAtual,
- id: Date.now(),
- paciente: pacienteSelecionado?.nome,
- dataCriacao: new Date().toLocaleString(),
- profissional: medico.nome
- };
-
- setConsultasRegistradas(prev => [novaConsulta, ...prev]);
-
- setConsultaAtual({
- dataConsulta: new Date().toISOString().split('T')[0],
- anamnese: "",
- exameFisico: "",
- hipotesesDiagnosticas: "",
- condutaMedica: "",
- prescricoes: "",
- retornoAgendado: "",
- cid10: ""
- });
-
- alert('Consulta registrada com sucesso!');
- };
-
- // Funções para renderizar cada aba do prontuário
- const renderNovaConsultaTab = () => (
-
-
-
Registrar Nova Consulta
-
-
-
-
-
-
-
- {/* Data da Consulta */}
-
-
- {/* Anamnese */}
-
-
-
-
- {/* Exame Físico */}
-
-
-
-
- {/* Hipóteses Diagnósticas */}
-
-
-
-
- {/* Conduta Médica */}
-
-
-
-
- {/* Prescrições */}
-
-
-
-
- {/* Retorno Agendado */}
-
-
- handleConsultaChange('retornoAgendado', e.target.value)}
- className="w-full"
- />
-
-
- {/* Informações do Registro */}
-
-
-
-
Paciente:
-
{pacienteSelecionado?.nome}
-
-
-
Profissional:
-
{medico.nome}
-
-
-
Data do Registro:
-
{new Date().toLocaleDateString('pt-BR')}
-
-
-
-
-
- {/* Consultas Anteriores do Paciente */}
- {consultasRegistradas.length > 0 && (
-
-
Consultas Anteriores
-
- {consultasRegistradas
- .filter(consulta => consulta.paciente === pacienteSelecionado?.nome)
- .slice(0, 3)
- .map((consulta) => (
-
-
-
-
- Consulta de {new Date(consulta.dataConsulta).toLocaleDateString('pt-BR')}
-
-
- Registrada em: {consulta.dataCriacao}
-
-
- {consulta.cid10 && (
-
- {consulta.cid10}
-
- )}
-
-
-
Anamnese: {consulta.anamnese.substring(0, 100)}...
- {consulta.hipotesesDiagnosticas && (
-
Diagnóstico: {consulta.hipotesesDiagnosticas.substring(0, 80)}...
- )}
-
-
- ))}
-
-
- )}
-
- );
-
- const renderConsultasTab = () => (
-
-
-
Registro de Consultas
-
-
-
-
-
-
-
Consulta Cardiológica
-
27/09/2025 - 09:00
-
-
Finalizada
-
-
-
-
Motivo:
-
Dor no peito e falta de ar
-
-
-
Duração:
-
45 minutos
-
-
-
-
Observações:
-
Paciente relatou melhora dos sintomas após início do tratamento. Pressão arterial controlada.
-
-
-
-
-
-
-
Consulta Dermatológica
-
15/09/2025 - 14:30
-
-
Retorno Agendado
-
-
-
-
Motivo:
-
Avaliação de lesão cutânea
-
-
-
Duração:
-
30 minutos
-
-
-
-
-
- );
-
- const renderHistoricoTab = () => (
-
-
-
Histórico Médico Completo
-
-
-
-
-
-
Condições Pré-existentes
-
- - Hipertensão arterial (diagnosticada em 2020)
- - Diabetes tipo 2 (diagnosticada em 2018)
- - Histórico familiar de doenças cardiovasculares
-
-
-
-
-
Cirurgias Anteriores
-
-
- Apendicectomia
- 15/03/2010
-
-
- Colecistectomia laparoscópica
- 22/08/2019
-
-
-
-
-
-
Alergias e Reações Adversas
-
-
- Alergia
- Penicilina - reação cutânea
-
-
- Intolerância
- Lactose - sintomas gastrintestinais
-
-
-
-
-
- );
-
- const renderPrescricoesTab = () => (
-
-
-
Prescrições Médicas
-
-
-
-
-
-
-
-
Prescrição Atual
-
Prescrita em 27/09/2025
-
-
Ativa
-
-
-
-
-
-
Losartana 50mg
-
1 comprimido pela manhã
-
Duração: 30 dias
-
-
-
-
-
-
-
-
Metformina 850mg
-
1 comprimido após café e jantar
-
Duração: 60 dias
-
-
-
-
-
-
-
-
-
-
-
Prescrições Anteriores
-
Histórico de medicamentos
-
-
-
-
-
-
Sinvastatina 20mg
-
Prescrita em 15/08/2025 - Finalizada
-
-
-
-
-
-
-
- );
-
- const renderExamesTab = () => (
-
-
-
Exames Solicitados
-
-
-
-
-
-
-
-
-
-
Ecocardiograma
-
Solicitado em 25/09/2025
-
Urgência: Normal
-
-
Pendente
-
-
-
-
-
Hemograma Completo
-
Solicitado em 27/09/2025
-
Urgência: Normal
-
-
Agendado
-
-
-
-
-
-
-
-
Resultados Disponíveis
-
-
-
-
-
-
Glicemia de Jejum
-
Realizado em 20/09/2025
-
Resultado: 95 mg/dL (Normal)
-
-
-
-
-
-
-
-
-
-
- );
-
- const renderDiagnosticosTab = () => (
-
-
-
Diagnósticos
-
-
-
-
-
-
Diagnósticos Ativos
-
-
-
-
-
Hipertensão Arterial Sistêmica
-
CID-10: I10
-
Diagnosticado em: 15/03/2020
-
Status: Controlada com medicação
-
-
Ativo
-
-
-
-
-
-
-
Diabetes Mellitus Tipo 2
-
CID-10: E11
-
Diagnosticado em: 10/08/2018
-
Status: Controlada com dieta e medicação
-
-
Ativo
-
-
-
-
-
-
-
Histórico de Diagnósticos
-
-
-
-
Gastrite Aguda
-
CID-10: K29.0 - Resolvido em 2023
-
-
Resolvido
-
-
-
-
-
- );
-
- const renderEvolucaoTab = () => (
-
-
-
Evolução do Quadro
-
-
-
-
-
-
-
-
Evolução Recente
-
27/09/2025 - 09:15
-
-
Melhora
-
-
-
Subjetivo: Paciente relatou diminuição significativa da dor no peito e melhora da capacidade respiratória.
-
Objetivo: PA: 130/80 mmHg, FC: 72 bpm, ausculta cardíaca sem alterações.
-
Avaliação: Resposta positiva ao tratamento iniciado, pressão arterial em níveis aceitáveis.
-
Plano: Manter medicação atual, retorno em 30 dias.
-
-
-
-
-
-
-
Evolução Anterior
-
15/09/2025 - 14:45
-
-
Estável
-
-
-
Subjetivo: Paciente apresentou episódios esporádicos de dor torácica leve.
-
Objetivo: Exame físico sem alterações significativas.
-
Plano: Ajuste da medicação e solicitação de exames complementares.
-
-
-
-
- );
-
- const renderAnexosTab = () => (
-
-
-
Anexos (Exames, Imagens)
-
-
-
-
-
-
Exames de Imagem
-
-
-
-
-
-
-
-
Radiografia de Tórax
-
20/09/2025
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Laudos e Documentos
-
-
-
-
-
-
-
-
Laudo de Ecocardiograma
-
10/08/2025 - Dr. Carlos Andrade
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Relatório de Consulta Especializada
-
05/09/2025 - Cardiologia
-
-
-
-
-
-
-
-
-
-
-
- );
-
const renderLaudosSection = () => (
@@ -2199,14 +855,14 @@ Nevo melanocítico benigno. Seguimento clínico recomendado.
{/* Dados do Paciente */}
-
+
Dados do Paciente:
-
Nome: {laudo.paciente.nome}
-
ID: {laudo.paciente.id}
-
CPF: {laudo.paciente.cpf}
-
Idade: {laudo.paciente.idade} anos
-
Sexo: {laudo.paciente.sexo}
+
Nome: {getPatientName(laudo.paciente)}
+
ID: {getPatientId(laudo.paciente)}
+
CPF: {getPatientCpf(laudo.paciente)}
+
Idade: {getPatientAge(laudo.paciente)} anos
+
Sexo: {getPatientSex(laudo.paciente)}
CID: {laudo.cid}
@@ -2264,10 +920,34 @@ Nevo melanocítico benigno. Seguimento clínico recomendado.
// Editor de Laudo Avançado (para novos laudos)
function LaudoEditor({ pacientes, laudo, onClose, isNewLaudo, preSelectedPatient }: { pacientes?: any[]; laudo?: any; onClose: () => void; isNewLaudo?: boolean; preSelectedPatient?: any }) {
+ // Import useToast at the top level of the component
+ const { toast } = require('@/hooks/use-toast').useToast();
const [activeTab, setActiveTab] = useState("editor");
const [content, setContent] = useState(laudo?.conteudo || "");
const [showPreview, setShowPreview] = useState(false);
const [pacienteSelecionado, setPacienteSelecionado] = useState
(preSelectedPatient || null);
+ const [listaPacientes, setListaPacientes] = useState([]);
+
+ // Pega token do usuário logado (passado explicitamente para listarPacientes)
+ const { token } = useAuth();
+
+ // Carregar pacientes reais do Supabase ao abrir o modal ou quando o token mudar
+ useEffect(() => {
+ async function fetchPacientes() {
+ try {
+ if (!token) {
+ setListaPacientes([]);
+ return;
+ }
+ const pacientes = await listarPacientes();
+ setListaPacientes(pacientes || []);
+ } catch (err) {
+ console.warn('Erro ao carregar pacientes:', err);
+ setListaPacientes([]);
+ }
+ }
+ fetchPacientes();
+ }, [token]);
const [campos, setCampos] = useState({
cid: laudo?.cid || "",
diagnostico: laudo?.diagnostico || "",
@@ -2287,8 +967,38 @@ Nevo melanocítico benigno. Seguimento clínico recomendado.
"Recomendo seguimento com especialista"
]);
+
const sigCanvasRef = useRef(null);
+ // Estado para imagem da assinatura
+ const [assinaturaImg, setAssinaturaImg] = useState(null);
+
+ useEffect(() => {
+ if (!sigCanvasRef.current) return;
+ const handleEnd = () => {
+ const url = sigCanvasRef.current.getTrimmedCanvas().toDataURL('image/png');
+ setAssinaturaImg(url);
+ };
+ const canvas = sigCanvasRef.current;
+ if (canvas && canvas.canvas) {
+ canvas.canvas.addEventListener('mouseup', handleEnd);
+ canvas.canvas.addEventListener('touchend', handleEnd);
+ }
+ return () => {
+ if (canvas && canvas.canvas) {
+ canvas.canvas.removeEventListener('mouseup', handleEnd);
+ canvas.canvas.removeEventListener('touchend', handleEnd);
+ }
+ };
+ }, [sigCanvasRef]);
+
+ const handleClearSignature = () => {
+ if (sigCanvasRef.current) {
+ sigCanvasRef.current.clear();
+ }
+ setAssinaturaImg(null);
+ };
+
// Carregar dados do laudo existente quando disponível
useEffect(() => {
if (laudo && !isNewLaudo) {
@@ -2303,6 +1013,9 @@ Nevo melanocítico benigno. Seguimento clínico recomendado.
mostrarAssinatura: true
});
setPacienteSelecionado(laudo.paciente);
+ if (laudo.assinaturaImg) {
+ setAssinaturaImg(laudo.assinaturaImg);
+ }
}
}, [laudo, isNewLaudo]);
@@ -2463,16 +1176,16 @@ Nevo melanocítico benigno. Seguimento clínico recomendado.
Selecionar Paciente *
)}
- {/* Assinatura */}
+ {/* Assinatura Digital em tempo real */}
{campos.mostrarAssinatura && (
-
+ {assinaturaImg && assinaturaImg.length > 30 ? (
+

+ ) : (
+
Assine no campo ao lado para visualizar aqui.
+ )}
+
Dr. Carlos Andrade
CRM 000000
@@ -3037,7 +1652,46 @@ Nevo melanocítico benigno. Seguimento clínico recomendado.
Salvar Rascunho
-
+ {
+ if (!isNewLaudo) return; // só cria novo laudo
+ try {
+ // Monta os dados do laudo conforme CreateReportData do Supabase
+ // Preencher campos obrigatórios com valores válidos
+ const userId = user?.id || '00000000-0000-0000-0000-000000000001'; // fallback seguro
+ const novoLaudo = {
+ patient_id: pacienteSelecionado?.id, // agora sempre UUID real do paciente
+ order_number: '',
+ exam: campos.exame || '',
+ diagnosis: campos.diagnostico || '',
+ conclusion: campos.conclusao || '',
+ cid_code: campos.cid || '',
+ content_html: content,
+ content_json: {},
+ status: 'draft',
+ requested_by: userId,
+ due_at: new Date().toISOString(),
+ hide_date: !campos.mostrarData,
+ hide_signature: !campos.mostrarAssinatura,
+ created_by: userId,
+ };
+ const resp = await import('@/lib/reports').then(m => m.criarRelatorio(novoLaudo, token || undefined));
+ toast({
+ title: 'Laudo criado com sucesso!',
+ description: 'O laudo foi liberado e salvo.',
+ variant: 'default',
+ });
+ onClose();
+ } catch (err) {
+ toast({
+ title: 'Erro ao criar laudo',
+ description: (err && typeof err === 'object' && 'message' in err) ? (err as any).message : String(err) || 'Tente novamente.',
+ variant: 'destructive',
+ });
+ }
+ }}
+ >
{isNewLaudo ? "Liberar Laudo" : "Atualizar Laudo"}
@@ -3112,429 +1766,6 @@ Nevo melanocítico benigno. Seguimento clínico recomendado.