From 86dc221cc6ff9245f27bb7ea438d8fc883b5890b Mon Sep 17 00:00:00 2001
From: Helena <37183360+helenarebane@users.noreply.github.com>
Date: Thu, 28 Aug 2025 13:05:07 +0300
Subject: [PATCH 1/6] MED-145: send notification to patient when summary
completed (#61)
* MED-145: send notification to patient when summary completed
* MED-145: send notification to patient when summary completed
* use aliased imports where possible, revert cart service urls
* save language preference to local db
* remove unnecessary optional chaning
---
app/doctor/_components/analysis-view.tsx | 37 ++--
.../audit/notificationEntries.service.ts | 35 ++++
lib/services/mailer.service.ts | 28 +++-
lib/services/medusaCart.service.ts | 158 +++++++++---------
.../emails/doctor-summary-received.email.tsx | 97 +++++++++++
packages/email-templates/src/index.ts | 1 +
.../en/doctor-summary-received-email.json | 8 +
.../et/doctor-summary-received-email.json | 8 +
.../src/locales/ru/common.json | 8 +
.../src/locales/ru/company-offer-email.json | 8 +
.../ru/doctor-summary-received-email.json | 8 +
.../src/locales/ru/synlab-email.json | 12 ++
.../server/actions/doctor-server-actions.ts | 24 ++-
.../services/doctor-analysis.service.ts | 39 +++++
.../src/components/confirmation-modal.tsx | 2 +-
packages/supabase/src/database.types.ts | 156 ++++++++++++-----
.../ui/src/makerkit/language-selector.tsx | 52 ++++--
public/locales/en/account.json | 7 +-
public/locales/et/account.json | 7 +-
public/locales/ru/account.json | 5 +-
.../20250827044719_add_locale_to_account.sql | 7 +
...827080119_add_notification_audit_table.sql | 13 ++
22 files changed, 551 insertions(+), 169 deletions(-)
create mode 100644 lib/services/audit/notificationEntries.service.ts
create mode 100644 packages/email-templates/src/emails/doctor-summary-received.email.tsx
create mode 100644 packages/email-templates/src/locales/en/doctor-summary-received-email.json
create mode 100644 packages/email-templates/src/locales/et/doctor-summary-received-email.json
create mode 100644 packages/email-templates/src/locales/ru/common.json
create mode 100644 packages/email-templates/src/locales/ru/company-offer-email.json
create mode 100644 packages/email-templates/src/locales/ru/doctor-summary-received-email.json
create mode 100644 packages/email-templates/src/locales/ru/synlab-email.json
create mode 100644 supabase/migrations/20250827044719_add_locale_to_account.sql
create mode 100644 supabase/migrations/20250827080119_add_notification_audit_table.sql
diff --git a/app/doctor/_components/analysis-view.tsx b/app/doctor/_components/analysis-view.tsx
index 9a369b1..47033a0 100644
--- a/app/doctor/_components/analysis-view.tsx
+++ b/app/doctor/_components/analysis-view.tsx
@@ -53,6 +53,7 @@ export default function AnalysisView({
feedback?: DoctorFeedback;
}) {
const [isConfirmOpen, setIsConfirmOpen] = useState(false);
+ const [isDraftSubmitting, setIsDraftSubmitting] = useState(false);
const { data: user } = useUser();
@@ -106,28 +107,22 @@ export default function AnalysisView({
};
const handleDraftSubmit = async (e: React.FormEvent) => {
+ setIsDraftSubmitting(true);
e.preventDefault();
form.formState.errors.feedbackValue = undefined;
const formData = form.getValues();
- onSubmit(formData, 'DRAFT');
+ await onSubmit(formData, 'DRAFT');
+ setIsDraftSubmitting(false);
};
- const handleCompleteSubmit = async (e: React.FormEvent) => {
- e.preventDefault();
-
- const isValid = await form.trigger();
- if (!isValid) {
- return;
- }
-
+ const handleCompleteSubmit = form.handleSubmit(async () => {
setIsConfirmOpen(true);
- };
+ });
- const confirmComplete = () => {
- const formData = form.getValues();
- onSubmit(formData, 'COMPLETED');
- };
+ const confirmComplete = form.handleSubmit(async (data) => {
+ await onSubmit(data, 'COMPLETED');
+ });
return (
<>
@@ -179,7 +174,11 @@ export default function AnalysisView({
- {bmiFromMetric(patient?.weight ?? 0, patient?.height ?? 0)}
+
+ {patient?.weight && patient?.height
+ ? bmiFromMetric(patient.weight, patient.height)
+ : '-'}
+
@@ -245,7 +244,9 @@ export default function AnalysisView({
type="button"
variant="outline"
onClick={handleDraftSubmit}
- disabled={isReadOnly}
+ disabled={
+ isReadOnly || isDraftSubmitting || form.formState.isSubmitting
+ }
className="xs:w-1/4 w-full"
>
@@ -253,7 +254,9 @@ export default function AnalysisView({