diff --git a/app/doctor/_components/analysis-view.tsx b/app/doctor/_components/analysis-view.tsx index 824d59a..9a369b1 100644 --- a/app/doctor/_components/analysis-view.tsx +++ b/app/doctor/_components/analysis-view.tsx @@ -86,27 +86,23 @@ export default function AnalysisView({ data: DoctorAnalysisFeedbackForm, status: 'DRAFT' | 'COMPLETED', ) => { - try { - const feedbackPromise = giveFeedbackAction({ - ...data, - analysisOrderId: order.analysisOrderId, - status, - }); + const result = await 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(); + 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) => { diff --git a/app/doctor/_components/doctor-job-select.tsx b/app/doctor/_components/doctor-job-select.tsx index 3d58904..0940d2f 100644 --- a/app/doctor/_components/doctor-job-select.tsx +++ b/app/doctor/_components/doctor-job-select.tsx @@ -10,6 +10,7 @@ import { selectJobAction, unselectJobAction, } from '@kit/doctor/actions/doctor-server-actions'; +import { ErrorReason } from '@kit/doctor/schema/error.type'; import { Button, ButtonProps } from '@kit/ui/button'; import { toast } from '@kit/ui/sonner'; import { Trans } from '@kit/ui/trans'; @@ -50,7 +51,14 @@ export default function DoctorJobSelect({ onJobUpdate(); linkTo && router.push(linkTo); } else { - toast.error('common.genericServerError'); + toast.error( + , + ); + if (result.reason === ErrorReason.JOB_ASSIGNED) { + onJobUpdate(); + } } }); }; @@ -64,7 +72,11 @@ export default function DoctorJobSelect({ if (result?.success) { onJobUpdate(); } else { - toast.error('common.genericServerError'); + toast.error( + , + ); } }); }; diff --git a/packages/features/doctor/src/lib/server/actions/doctor-server-actions.ts b/packages/features/doctor/src/lib/server/actions/doctor-server-actions.ts index 2e63362..d857aee 100644 --- a/packages/features/doctor/src/lib/server/actions/doctor-server-actions.ts +++ b/packages/features/doctor/src/lib/server/actions/doctor-server-actions.ts @@ -1,6 +1,6 @@ 'use server'; -import { revalidatePath, revalidateTag } from 'next/cache'; +import { revalidatePath } from 'next/cache'; import { enhanceAction } from '@kit/next/actions'; import { getLogger } from '@kit/shared/logger'; @@ -13,6 +13,7 @@ import { doctorJobSelectSchema, doctorJobUnselectSchema, } from '../schema/doctor-analysis.schema'; +import { ErrorReason } from '../schema/error.type'; import { selectJob, submitFeedback, @@ -29,14 +30,27 @@ export const selectJobAction = doctorAction( async ({ analysisOrderId, userId }: DoctorJobSelect) => { const logger = await getLogger(); - logger.info({ analysisOrderId }, `Selecting new job`); + try { + logger.info({ analysisOrderId }, `Selecting new job`); - await selectJob(analysisOrderId, userId); + await selectJob(analysisOrderId, userId); + logger.info({ analysisOrderId }, `Successfully selected`); - logger.info({ analysisOrderId }, `Successfully selected`); - - revalidateDoctorAnalysis(); - return { success: true }; + revalidateDoctorAnalysis(); + return { success: true }; + } catch (e) { + logger.error('Failed to select job', e); + if (e instanceof Error) { + return { + success: false, + reason: + e['message'] === ErrorReason.JOB_ASSIGNED + ? ErrorReason.JOB_ASSIGNED + : ErrorReason.UNKNOWN, + }; + } + return { success: false, reason: ErrorReason.UNKNOWN }; + } }, { schema: doctorJobSelectSchema, @@ -52,17 +66,21 @@ export const unselectJobAction = doctorAction( enhanceAction( async ({ analysisOrderId }: DoctorJobUnselect) => { const logger = await getLogger(); + try { + logger.info({ analysisOrderId }, `Removing doctor from job`); - logger.info({ analysisOrderId }, `Removing doctor from job`); + await unselectJob(analysisOrderId); - await unselectJob(analysisOrderId); - - logger.info( - { analysisOrderId }, - `Successfully removed current doctor from job`, - ); - revalidateDoctorAnalysis(); - return { success: true }; + logger.info( + { analysisOrderId }, + `Successfully removed current doctor from job`, + ); + revalidateDoctorAnalysis(); + return { success: true }; + } catch (e) { + logger.error('Failed to unselect job', e); + return { success: false, reason: ErrorReason.UNKNOWN }; + } }, { schema: doctorJobUnselectSchema, @@ -89,21 +107,21 @@ export const giveFeedbackAction = doctorAction( }) => { const logger = await getLogger(); - logger.info( - { analysisOrderId }, - `Submitting feedback for analysis order...`, - ); + try { + logger.info( + { analysisOrderId }, + `Submitting feedback for analysis order...`, + ); - const result = await submitFeedback( - analysisOrderId, - userId, - feedbackValue, - status, - ); - logger.info({ analysisOrderId }, `Successfully submitted feedback`); + await submitFeedback(analysisOrderId, userId, feedbackValue, status); + logger.info({ analysisOrderId }, `Successfully submitted feedback`); - revalidateDoctorAnalysis(); - return result; + revalidateDoctorAnalysis(); + return { success: true }; + } catch (e) { + logger.error('Failed to give feedback', e); + return { success: false, reason: ErrorReason.UNKNOWN }; + } }, { schema: doctorAnalysisFeedbackSchema, diff --git a/packages/features/doctor/src/lib/server/schema/error.type.ts b/packages/features/doctor/src/lib/server/schema/error.type.ts new file mode 100644 index 0000000..5553e75 --- /dev/null +++ b/packages/features/doctor/src/lib/server/schema/error.type.ts @@ -0,0 +1,4 @@ +export enum ErrorReason { + JOB_ASSIGNED = 'JOB_ASSIGNED', + UNKNOWN = 'UNKNOWN', +} diff --git a/packages/features/doctor/src/lib/server/services/doctor-analysis.service.ts b/packages/features/doctor/src/lib/server/services/doctor-analysis.service.ts index d45a22a..cebc5ef 100644 --- a/packages/features/doctor/src/lib/server/services/doctor-analysis.service.ts +++ b/packages/features/doctor/src/lib/server/services/doctor-analysis.service.ts @@ -12,6 +12,7 @@ import { PaginationParams, ResponseTable, } from '../schema/doctor-analysis.schema'; +import { ErrorReason } from '../schema/error.type'; async function enrichAnalysisData(analysisResponses?: AnalysisResponseBase[]) { const supabase = getSupabaseServerClient(); @@ -534,7 +535,7 @@ export async function selectJob(analysisOrderId: number, userId: string) { const jobAssignedToUserId = existingFeedback?.[0]?.doctor_user_id; if (!!jobAssignedToUserId && jobAssignedToUserId !== user.id) { - throw new Error('Job already assigned to another doctor.'); + throw new Error(ErrorReason.JOB_ASSIGNED); } const { data, error } = await supabase diff --git a/public/locales/en/doctor.json b/public/locales/en/doctor.json index d5afa91..4f6b339 100644 --- a/public/locales/en/doctor.json +++ b/public/locales/en/doctor.json @@ -39,6 +39,10 @@ "title": "Confirm publishing summary", "description": "When confirmed, the summary will be published to the patient." }, + "error": { + "UNKNOWN": "Something went wrong", + "JOB_ASSIGNED": "Job already selected" + }, "updateFeedbackSuccess": "Summary updated", "updateFeedbackLoading": "Updating summary...", "updateFeedbackError": "Failed to update summary", diff --git a/public/locales/et/doctor.json b/public/locales/et/doctor.json index c1ff2b7..e307ff8 100644 --- a/public/locales/et/doctor.json +++ b/public/locales/et/doctor.json @@ -39,6 +39,10 @@ "title": "Kinnita kokkuvõtte avaldamine", "description": "Kinnitamisel avaldatakse kokkuvõte patsiendile." }, + "error": { + "UNKNOWN": "Midagi läks valesti", + "JOB_ASSIGNED": "Töö on juba võetud" + }, "updateFeedbackSuccess": "Kokkuvõte uuendatud", "updateFeedbackLoading": "Kokkuvõtet uuendatakse...", "updateFeedbackError": "Kokkuvõtte uuendamine ebaõnnestus", diff --git a/public/locales/ru/doctor.json b/public/locales/ru/doctor.json index d5afa91..4f6b339 100644 --- a/public/locales/ru/doctor.json +++ b/public/locales/ru/doctor.json @@ -39,6 +39,10 @@ "title": "Confirm publishing summary", "description": "When confirmed, the summary will be published to the patient." }, + "error": { + "UNKNOWN": "Something went wrong", + "JOB_ASSIGNED": "Job already selected" + }, "updateFeedbackSuccess": "Summary updated", "updateFeedbackLoading": "Updating summary...", "updateFeedbackError": "Failed to update summary",