Skip to content

Commit

Permalink
SSGSO-7: Configure PRO form language (#3)
Browse files Browse the repository at this point in the history
* SSGSO-7: Configure PRO form language

* Address comments

* Fix failing test
  • Loading branch information
reagan-meant authored Nov 19, 2024
1 parent a797bc4 commit 6ac13cb
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export type SmsFormData = {
body: string;
source: string;
patientUuid: string;
locale: string;
};

export type UpdateSmsPayload = SmsFormData & {};
Original file line number Diff line number Diff line change
@@ -1,18 +1,35 @@
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import classNames from 'classnames';
import { Button, ButtonSet, Form, InlineLoading, InlineNotification, Row, Stack } from '@carbon/react';
import {
Button,
ButtonSet,
Form,
InlineLoading,
InlineNotification,
Row,
Stack,
Select,
SelectItem,
} from '@carbon/react';
import { v4 as uuid } from 'uuid';
import { FormProvider, useForm } from 'react-hook-form';
import { first } from 'rxjs/operators';
import { useTranslation } from 'react-i18next';
import { z } from 'zod';
import { zodResolver } from '@hookform/resolvers/zod';
import { ExtensionSlot, showSnackbar, useConnectivity, useLayoutType, usePatient } from '@openmrs/esm-framework';
import {
ExtensionSlot,
showSnackbar,
useConnectivity,
useLayoutType,
usePatient,
useSession,
} from '@openmrs/esm-framework';
import { type DefaultPatientWorkspaceProps } from '@openmrs/esm-patient-common-lib';
import { type SmsFormData } from './common/types';
import styles from './send-sms-form.scss';
import { saveQuestionnaire } from './common';
import SendSmsField from './send-sms-input.componet';
import SendSmsField from './send-sms-input.component';
import styles from './send-sms-form.scss';

interface SendSmsFormProps extends DefaultPatientWorkspaceProps {
showPatientHeader?: boolean;
Expand All @@ -27,8 +44,20 @@ const SendSmsForm: React.FC<SendSmsFormProps> = ({
const isTablet = useLayoutType() === 'tablet';
const isOnline = useConnectivity();
const { patientUuid, patient } = usePatient();
const { locale, allowedLocales } = useSession();
const visitHeaderSlotState = useMemo(() => ({ patientUuid }), [patientUuid]);
const [isSubmitting, setIsSubmitting] = useState(false);
const [selectedLocale, setSelectedLocale] = useState(locale);
const languageNames = useMemo(
() =>
Object.fromEntries(
(allowedLocales ?? []).map((locale) => [
locale,
new Intl.DisplayNames([locale], { type: 'language' }).of(locale),
]),
),
[allowedLocales],
);

const [errorFetchingResources] = useState<{
blockSavingForm: boolean;
Expand All @@ -38,6 +67,7 @@ const SendSmsForm: React.FC<SendSmsFormProps> = ({
const phoneValidation = /^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/;
return z.object({
to: z.string().regex(phoneValidation, { message: 'Invalid phone number' }),
locale: z.string().min(1, { message: 'Language selection is required' }),
});
}, []);

Expand All @@ -58,17 +88,26 @@ const SendSmsForm: React.FC<SendSmsFormProps> = ({
promptBeforeClosing(() => isDirty);
}, [isDirty, promptBeforeClosing, patient]);

useEffect(() => {
methods.setValue('locale', selectedLocale);
}, [selectedLocale, methods]);

const onSubmit = useCallback(
(data: SmsFormData, event: any) => {
if (!patientUuid) {
return;
}

setIsSubmitting(true);

const { to } = data;

const guid = uuid();
const body = window.location.host.concat(`/outcomes?pid=${guid}`);
const url = new URL(window.location.origin);
const params = new URLSearchParams({ pid: guid, locale: selectedLocale });
url.pathname = '/outcomes';
url.search = params.toString();
const body = url.toString();

const source = window.location.host;

let payload: SmsFormData = {
Expand All @@ -77,6 +116,7 @@ const SendSmsForm: React.FC<SendSmsFormProps> = ({
body: body,
source: source,
patientUuid: patientUuid,
locale: selectedLocale,
};

const abortController = new AbortController();
Expand All @@ -96,7 +136,7 @@ const SendSmsForm: React.FC<SendSmsFormProps> = ({
} else {
closeWorkspace({ ignoreChanges: true });
showSnackbar({
title: t('smsError', 'SMS seding failed'),
title: t('smsError', 'Sending SMS failed'),
kind: 'error',
isLowContrast: false,
subtitle: t('sendSmsError', 'Error sending PRO Questionnaire url (SMS)!!'),
Expand All @@ -114,7 +154,7 @@ const SendSmsForm: React.FC<SendSmsFormProps> = ({
});
}
},
[closeWorkspace, isOnline, patientUuid, t],
[closeWorkspace, isOnline, patientUuid, selectedLocale, t],
);

return (
Expand Down Expand Up @@ -157,6 +197,17 @@ const SendSmsForm: React.FC<SendSmsFormProps> = ({
inputFieldType="text"
inputFieldPlaceholder={t('smsReceiver', 'SMS Recipient phone number')}
/>
<div>
<Select
id="language-select"
labelText={t('selectLanguage', 'Select Language')}
value={selectedLocale}
onChange={(event) => setSelectedLocale(event.target.value)}>
{allowedLocales?.map((locale, i) => (
<SelectItem key={`locale-option-${locale}-${i}`} value={locale} text={languageNames[locale]} />
))}
</Select>
</div>
</Stack>
</div>
<ButtonSet
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ const payload: SmsFormData = {
body: bodyValue,
source: sourceValue,
patientUuid: mockPatient.id,
locale: '',
};

const testProps = {
Expand All @@ -36,6 +37,7 @@ describe('SendSmsForm', () => {
render(<SendSmsForm {...testProps} />);

expect(screen.getByText(/Phone number/i)).toBeInTheDocument();
expect(screen.getByRole('combobox', { name: /Select Language/i })).toBeInTheDocument();
expect(screen.getByRole('button', { name: /Send SMS/i })).toBeInTheDocument();
});

Expand Down
3 changes: 2 additions & 1 deletion packages/esm-patient-outcomes-app/translations/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@
"partOfFormDidntLoad": "Part of the form did not load",
"proQuestionnaireUrlSent": "PRO Questionnaire url (SMS) sent to Patient successfully!",
"refreshToTryAgain": "Please refresh to try again",
"selectLanguage": "Select Language",
"sendingSms": "Sending SMS",
"sendSMS": "Send PRO SMS",
"sendSmsError": "Error sending PRO Questionnaire url (SMS)!!",
"sendSmsInternetError": "Cannot send SMS without Intenet connection!!",
"smsError": "SMS seding failed",
"smsError": "Sending SMS failed",
"smsReceiver": "SMS Recipient phone number",
"smsSent": "SMS sent"
}

0 comments on commit 6ac13cb

Please sign in to comment.