'use client'; import { useState } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { useQueryClient } from '@tanstack/react-query'; import { useForm } from 'react-hook-form'; import { giveFeedbackAction } from '@kit/doctor/actions/doctor-server-actions'; import { getDOBWithAgeStringFromPersonalCode, getResultSetName, } from '@kit/doctor/lib/helpers'; import { AnalysisResponse, DoctorFeedback, Order, Patient, } from '@kit/doctor/schema/doctor-analysis-detail-view.schema'; import { DoctorAnalysisFeedbackForm, doctorAnalysisFeedbackFormSchema, } from '@kit/doctor/schema/doctor-analysis.schema'; import ConfirmationModal from '@kit/shared/components/confirmation-modal'; import { getFullName } from '@kit/shared/utils'; import { useUser } from '@kit/supabase/hooks/use-user'; import { Button } from '@kit/ui/button'; import { Form, FormControl, FormField, FormItem, FormMessage, } from '@kit/ui/form'; import { toast } from '@kit/ui/sonner'; import { Textarea } from '@kit/ui/textarea'; import { Trans } from '@kit/ui/trans'; import { bmiFromMetric } from '~/lib/utils'; import DoctorAnalysisWrapper from './doctor-analysis-wrapper'; import DoctorJobSelect from './doctor-job-select'; export default function AnalysisView({ patient, order, analyses, feedback, }: { patient: Patient; order: Order; analyses: AnalysisResponse[]; feedback?: DoctorFeedback; }) { const [isConfirmOpen, setIsConfirmOpen] = useState(false); const { data: user } = useUser(); const isInProgress = !!( !!feedback?.status && feedback?.doctor_user_id && feedback?.status !== 'COMPLETED' ); const isCurrentDoctorJob = !!feedback?.doctor_user_id && feedback?.doctor_user_id === user?.id; const isReadOnly = !isInProgress || (!!feedback?.doctor_user_id && feedback?.doctor_user_id !== user?.id); const form = useForm({ resolver: zodResolver(doctorAnalysisFeedbackFormSchema), reValidateMode: 'onChange', defaultValues: { feedbackValue: feedback?.value ?? '', userId: patient.userId, }, }); const queryClient = useQueryClient(); if (!patient || !order || !analyses) { return null; } const onSubmit = async ( data: DoctorAnalysisFeedbackForm, status: 'DRAFT' | 'COMPLETED', ) => { try { const feedbackPromise = giveFeedbackAction({ ...data, analysisOrderId: order.analysisOrderId, status, }); toast.promise(() => feedbackPromise, { success: , error: , loading: , }); queryClient.invalidateQueries({ predicate: (query) => query.queryKey.includes('doctor-jobs'), }); return setIsConfirmOpen(false); } catch (error) { toast.error(); } }; const handleDraftSubmit = async (e: React.FormEvent) => { e.preventDefault(); form.formState.errors.feedbackValue = undefined; const formData = form.getValues(); onSubmit(formData, 'DRAFT'); }; const handleCompleteSubmit = async (e: React.FormEvent) => { e.preventDefault(); const isValid = await form.trigger(); if (!isValid) { return; } setIsConfirmOpen(true); }; const confirmComplete = () => { const formData = form.getValues(); onSubmit(formData, 'COMPLETED'); }; return ( <>

queryClient.invalidateQueries({ predicate: (query) => query.queryKey.includes('doctor-jobs'), }) } />
{getFullName(patient.firstName, patient.lastName)}
{patient.personalCode ?? ''}
{getDOBWithAgeStringFromPersonalCode(patient.personalCode)}
{patient.height}
{patient.weight}
{bmiFromMetric(patient?.height ?? 0, patient?.weight ?? 0)}
-
{patient.phone}
{patient.email}
queryClient.invalidateQueries({ predicate: (query) => query.queryKey.includes('doctor-jobs'), }) } />

{analyses.map((analysisData) => { return ( ); })}

{feedback?.value ?? '-'}

{!isReadOnly && (
(