From 2f81002e815b738510d6646830d343e450a32d35 Mon Sep 17 00:00:00 2001 From: Danel Kungla Date: Tue, 7 Oct 2025 16:10:55 +0300 Subject: [PATCH] MED-203: fix doctor feedback form --- app/doctor/_components/analysis-feedback.tsx | 156 ++++++++++++++++++ app/doctor/_components/analysis-view.tsx | 133 +-------------- .../doctor-analysis-detail-view.schema.ts | 2 +- ...155300_allow_doctor_to_update_analysis.sql | 12 ++ 4 files changed, 173 insertions(+), 130 deletions(-) create mode 100644 app/doctor/_components/analysis-feedback.tsx create mode 100644 supabase/migrations/20251007155300_allow_doctor_to_update_analysis.sql diff --git a/app/doctor/_components/analysis-feedback.tsx b/app/doctor/_components/analysis-feedback.tsx new file mode 100644 index 0000000..c1d4c54 --- /dev/null +++ b/app/doctor/_components/analysis-feedback.tsx @@ -0,0 +1,156 @@ +import React, { useState } from 'react'; + +import { giveFeedbackAction } from '@/packages/features/doctor/src/lib/server/actions/doctor-server-actions'; +import { + DoctorFeedback, + Order, + Patient, +} from '@/packages/features/doctor/src/lib/server/schema/doctor-analysis-detail-view.schema'; +import { + DoctorAnalysisFeedbackForm, + doctorAnalysisFeedbackFormSchema, +} from '@/packages/features/doctor/src/lib/server/schema/doctor-analysis.schema'; +import ConfirmationModal from '@/packages/shared/src/components/confirmation-modal'; +import { useUser } from '@/packages/supabase/src/hooks/use-user'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { useQueryClient } from '@tanstack/react-query'; +import { useForm } from 'react-hook-form'; + +import { Trans } from '@kit/ui/makerkit/trans'; +import { Button } from '@kit/ui/shadcn/button'; +import { + Form, + FormControl, + FormField, + FormItem, + FormMessage, +} from '@kit/ui/shadcn/form'; +import { toast } from '@kit/ui/shadcn/sonner'; +import { Textarea } from '@kit/ui/shadcn/textarea'; + +const AnalysisFeedback = ({ + feedback, + patient, + order, +}: { + feedback?: DoctorFeedback; + patient: Patient; + order: Order; +}) => { + const [isDraftSubmitting, setIsDraftSubmitting] = useState(false); + const [isConfirmOpen, setIsConfirmOpen] = useState(false); + const { data: user } = useUser(); + const queryClient = useQueryClient(); + + const form = useForm({ + resolver: zodResolver(doctorAnalysisFeedbackFormSchema), + reValidateMode: 'onChange', + defaultValues: { + feedbackValue: feedback?.value ?? '', + userId: patient.userId, + }, + }); + + const isReadOnly = + !!feedback?.doctor_user_id && feedback?.doctor_user_id !== user?.id; + + 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 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 confirmComplete = form.handleSubmit(async (data) => { + await onSubmit(data, 'COMPLETED'); + }); + + return ( + <> +

+ +

+

{feedback?.value ?? '-'}

+ {!isReadOnly && ( +
+ + ( + + +