From 8a9879c4fbd5f5305e0f3334fcd33c278d5b3ca1 Mon Sep 17 00:00:00 2001 From: Jhony Date: Mon, 13 Oct 2025 23:30:32 -0300 Subject: [PATCH] =?UTF-8?q?aplica=C3=A7=C3=A3o=20de=20laudo=20com=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/context/AccessibilityContext.tsx | 25 +- .../[id]/laudos/[laudoId]/editar/page.tsx | 237 ++++++++++++++++++ app/doctor/medicos/[id]/laudos/novo/page.tsx | 194 ++++++++++++++ app/doctor/medicos/[id]/laudos/page.tsx | 168 +++++++++---- components/doctor-layout.tsx | 72 ++---- components/ui/tiptap-editor.tsx | 8 +- services/api.mjs | 8 +- services/reportsApi.mjs | 42 ++++ 8 files changed, 631 insertions(+), 123 deletions(-) create mode 100644 app/doctor/medicos/[id]/laudos/[laudoId]/editar/page.tsx create mode 100644 app/doctor/medicos/[id]/laudos/novo/page.tsx create mode 100644 services/reportsApi.mjs diff --git a/app/context/AccessibilityContext.tsx b/app/context/AccessibilityContext.tsx index f63e18e..1594f2e 100644 --- a/app/context/AccessibilityContext.tsx +++ b/app/context/AccessibilityContext.tsx @@ -19,19 +19,20 @@ interface AccessibilityContextProps { const AccessibilityContext = createContext(undefined); export const AccessibilityProvider = ({ children }: { children: ReactNode }) => { - const [theme, setThemeState] = useState(() => { - if (typeof window === 'undefined') return 'light'; - return (localStorage.getItem('accessibility-theme') as Theme) || 'light'; - }); - const [contrast, setContrastState] = useState(() => { - if (typeof window === 'undefined') return 'normal'; - return (localStorage.getItem('accessibility-contrast') as Contrast) || 'normal'; - }); - const [fontSize, setFontSize] = useState(() => { - if (typeof window === 'undefined') return 16; + const [theme, setThemeState] = useState('light'); + const [contrast, setContrastState] = useState('normal'); + const [fontSize, setFontSize] = useState(16); + + useEffect(() => { + const storedTheme = (localStorage.getItem('accessibility-theme') as Theme) || 'light'; + const storedContrast = (localStorage.getItem('accessibility-contrast') as Contrast) || 'normal'; const storedSize = localStorage.getItem('accessibility-font-size'); - return storedSize ? parseFloat(storedSize) : 16; - }); + setThemeState(storedTheme); + setContrastState(storedContrast); + if (storedSize) { + setFontSize(parseFloat(storedSize)); + } + }, []); useEffect(() => { const root = document.documentElement; diff --git a/app/doctor/medicos/[id]/laudos/[laudoId]/editar/page.tsx b/app/doctor/medicos/[id]/laudos/[laudoId]/editar/page.tsx new file mode 100644 index 0000000..02f1e6c --- /dev/null +++ b/app/doctor/medicos/[id]/laudos/[laudoId]/editar/page.tsx @@ -0,0 +1,237 @@ +"use client"; + +import { useParams, useRouter } from "next/navigation"; +import { useState, useEffect } from "react"; +import DoctorLayout from "@/components/doctor-layout"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Textarea } from "@/components/ui/textarea"; +import { Checkbox } from "@/components/ui/checkbox"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { Dialog, DialogContent, DialogTrigger } from "@/components/ui/dialog"; +import { Calendar } from "@/components/ui/calendar"; +import { CalendarIcon } from "lucide-react"; +import { format } from "date-fns"; +import TiptapEditor from "@/components/ui/tiptap-editor"; +import { Skeleton } from "@/components/ui/skeleton"; +import { reportsApi } from "@/services/reportsApi.mjs"; + +export default function EditarLaudoPage() { + const router = useRouter(); + const params = useParams(); + const patientId = params.id as string; + const laudoId = params.laudoId as string; + + const [formData, setFormData] = useState({}); + const [loading, setLoading] = useState(true); + const [isSubmitting, setIsSubmitting] = useState(false); + const [isDatePickerOpen, setIsDatePickerOpen] = useState(false); + + useEffect(() => { + if (laudoId) { + setLoading(true); + reportsApi.getReportById(laudoId) + .then((data: any) => { + console.log("Fetched report data:", data); + // The API now returns an array, get the first element + const reportData = Array.isArray(data) && data.length > 0 ? data[0] : null; + if (reportData) { + setFormData({ + ...reportData, + due_at: reportData.due_at ? new Date(reportData.due_at) : null, + }); + } + }) + .catch(error => { + console.error("Failed to fetch report details:", error); + // Here you could add a toast notification to inform the user + }) + .finally(() => { + setLoading(false); + }); + } else { + // If there's no laudoId, we shouldn't be in a loading state. + setLoading(false); + } + }, [laudoId]); + + const handleInputChange = (e: React.ChangeEvent) => { + const { id, value } = e.target; + setFormData((prev: any) => ({ ...prev, [id]: value })); + }; + + const handleSelectChange = (id: string, value: string) => { + setFormData((prev: any) => ({ ...prev, [id]: value })); + }; + + const handleCheckboxChange = (id: string, checked: boolean) => { + setFormData((prev: any) => ({ ...prev, [id]: checked })); + }; + + const handleDateChange = (date: Date | undefined) => { + console.log("Date selected:", date); + if (date) { + setFormData((prev: any) => ({ ...prev, due_at: date })); + } + }; + + const handleDateSelect = (date: Date | undefined) => { + handleDateChange(date); + setIsDatePickerOpen(false); // Close the dialog after selection + }; + + const handleEditorChange = (html: string, json: object) => { + setFormData((prev: any) => ({ + ...prev, + content_html: html, + content_json: json + })); + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setIsSubmitting(true); + try { + const { id, patient_id, created_at, updated_at, created_by, updated_by, ...updateData } = formData; + await reportsApi.updateReport(laudoId, updateData); + // toast({ title: "Laudo atualizado com sucesso!" }); + router.push(`/doctor/medicos/${patientId}/laudos`); + } catch (error) { + console.error("Failed to update laudo", error); + // toast({ title: "Erro ao atualizar laudo", variant: "destructive" }); + } finally { + setIsSubmitting(false); + } + }; + + if (loading) { + return ( + +
+ + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+ ) + } + + return ( + +
+ + + Editar Laudo - {formData.order_number} + + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + + + + + + + +
+
+ +
+ +