From 5d92c3425907b3ff93510ea8065a04f0d2dbfc9e Mon Sep 17 00:00:00 2001
From: Helena <37183360+helenarebane@users.noreply.github.com>
Date: Tue, 26 Aug 2025 11:43:31 +0300
Subject: [PATCH] MED-56: show specific error when job taken, other small
improvements (#58)
* show specific error when job taken, other small improvements
* enum name case
* enum value case, actually
---
app/doctor/_components/analysis-view.tsx | 34 ++++-----
app/doctor/_components/doctor-job-select.tsx | 16 +++-
.../server/actions/doctor-server-actions.ts | 76 ++++++++++++-------
.../src/lib/server/schema/error.type.ts | 4 +
.../services/doctor-analysis.service.ts | 3 +-
public/locales/en/doctor.json | 4 +
public/locales/et/doctor.json | 4 +
public/locales/ru/doctor.json | 4 +
8 files changed, 94 insertions(+), 51 deletions(-)
create mode 100644 packages/features/doctor/src/lib/server/schema/error.type.ts
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",