'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 [isDraftSubmitting, setIsDraftSubmitting] = 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', ) => { const result = await giveFeedbackAction({ ...data, analysisOrderId: order.analysisOrderId, status, }); if (!result.success) { return toast.error(); } queryClient.invalidateQueries({ predicate: (query) => query.queryKey.includes('doctor-jobs'), }); toast.success(); return setIsConfirmOpen(false); }; const handleDraftSubmit = async (e: React.FormEvent) => { setIsDraftSubmitting(true); e.preventDefault(); form.formState.errors.feedbackValue = undefined; const formData = form.getValues(); await onSubmit(formData, 'DRAFT'); setIsDraftSubmitting(false); }; const handleCompleteSubmit = form.handleSubmit(async () => { setIsConfirmOpen(true); }); const confirmComplete = form.handleSubmit(async (data) => { await onSubmit(data, '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}
{patient?.weight && patient?.height ? bmiFromMetric(patient.weight, patient.height) : '-'}
-
{patient.phone}
{patient.email}
queryClient.invalidateQueries({ predicate: (query) => query.queryKey.includes('doctor-jobs'), }) } />

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

{feedback?.value ?? '-'}

{!isReadOnly && (
(