@kenyaemr/esm-shr-app 5.4.4-pre.43 → 5.4.4-pre.430
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +5 -5
- package/dist/1072.js +1 -1
- package/dist/1072.js.map +1 -1
- package/dist/1278.js +1 -0
- package/dist/1278.js.map +1 -0
- package/dist/15.js +1 -0
- package/dist/15.js.map +1 -0
- package/dist/1620.js +1 -0
- package/dist/1620.js.map +1 -0
- package/dist/1789.js +1 -0
- package/dist/1789.js.map +1 -0
- package/dist/1823.js +1 -0
- package/dist/1823.js.map +1 -0
- package/dist/1831.js +1 -0
- package/dist/1831.js.map +1 -0
- package/dist/1844.js +1 -0
- package/dist/1844.js.map +1 -0
- package/dist/1854.js +1 -0
- package/dist/1854.js.map +1 -0
- package/dist/1919.js +1 -0
- package/dist/1919.js.map +1 -0
- package/dist/1946.js +1 -0
- package/dist/1946.js.map +1 -0
- package/dist/2007.js +1 -1
- package/dist/2007.js.map +1 -1
- package/dist/2127.js +1 -0
- package/dist/2127.js.map +1 -0
- package/dist/2146.js +1 -0
- package/dist/2146.js.map +1 -0
- package/dist/2202.js +1 -0
- package/dist/2202.js.map +1 -0
- package/dist/2394.js +1 -0
- package/dist/2394.js.map +1 -0
- package/dist/2468.js +1 -0
- package/dist/2468.js.map +1 -0
- package/dist/2498.js +1 -0
- package/dist/2498.js.map +1 -0
- package/dist/2534.js +1 -1
- package/dist/2534.js.map +1 -1
- package/dist/2556.js +1 -0
- package/dist/2556.js.map +1 -0
- package/dist/26.js +1 -0
- package/dist/26.js.map +1 -0
- package/dist/{2561.js → 2648.js} +1 -1
- package/dist/2648.js.map +1 -0
- package/dist/2709.js +1 -0
- package/dist/2709.js.map +1 -0
- package/dist/2744.js +1 -0
- package/dist/2744.js.map +1 -0
- package/dist/2823.js +1 -0
- package/dist/2823.js.map +1 -0
- package/dist/2840.js +1 -0
- package/dist/2840.js.map +1 -0
- package/dist/2842.js +1 -0
- package/dist/2842.js.map +1 -0
- package/dist/2916.js +1 -0
- package/dist/2916.js.map +1 -0
- package/dist/2924.js +1 -0
- package/dist/2924.js.map +1 -0
- package/dist/3137.js +1 -0
- package/dist/3137.js.map +1 -0
- package/dist/3219.js +1 -0
- package/dist/3219.js.map +1 -0
- package/dist/3285.js +1 -0
- package/dist/3285.js.map +1 -0
- package/dist/3302.js +1 -0
- package/dist/3302.js.map +1 -0
- package/dist/3335.js +1 -0
- package/dist/3335.js.map +1 -0
- package/dist/3378.js +1 -0
- package/dist/3378.js.map +1 -0
- package/dist/3504.js +1 -0
- package/dist/3504.js.map +1 -0
- package/dist/356.js +1 -0
- package/dist/356.js.map +1 -0
- package/dist/3569.js +1 -0
- package/dist/3569.js.map +1 -0
- package/dist/3580.js +1 -0
- package/dist/3580.js.map +1 -0
- package/dist/3690.js +1 -0
- package/dist/3690.js.map +1 -0
- package/dist/3723.js +1 -0
- package/dist/3723.js.map +1 -0
- package/dist/3745.js +1 -0
- package/dist/3745.js.map +1 -0
- package/dist/3796.js +1 -0
- package/dist/3796.js.map +1 -0
- package/dist/3813.js +1 -0
- package/dist/3813.js.map +1 -0
- package/dist/3847.js +1 -0
- package/dist/3847.js.map +1 -0
- package/dist/393.js +6 -0
- package/dist/393.js.map +1 -0
- package/dist/3953.js +1 -0
- package/dist/3953.js.map +1 -0
- package/dist/4178.js +1 -1
- package/dist/4178.js.map +1 -1
- package/dist/4212.js +1 -0
- package/dist/4212.js.map +1 -0
- package/dist/4308.js +1 -1
- package/dist/4308.js.map +1 -1
- package/dist/4487.js +11 -0
- package/dist/4487.js.map +1 -0
- package/dist/4588.js +1 -0
- package/dist/4588.js.map +1 -0
- package/dist/4637.js +1 -1
- package/dist/4637.js.map +1 -1
- package/dist/466.js +1 -1
- package/dist/466.js.map +1 -1
- package/dist/4711.js +1 -0
- package/dist/4711.js.map +1 -0
- package/dist/4759.js +1 -0
- package/dist/4759.js.map +1 -0
- package/dist/4817.js +1 -0
- package/dist/4817.js.map +1 -0
- package/dist/4818.js +1 -0
- package/dist/4818.js.map +1 -0
- package/dist/500.js +1 -0
- package/dist/500.js.map +1 -0
- package/dist/5086.js +1 -1
- package/dist/5086.js.map +1 -1
- package/dist/5117.js +1 -0
- package/dist/5117.js.map +1 -0
- package/dist/5256.js +1 -0
- package/dist/5256.js.map +1 -0
- package/dist/5262.js +1 -0
- package/dist/5262.js.map +1 -0
- package/dist/5362.js +1 -0
- package/dist/5362.js.map +1 -0
- package/dist/5366.js +1 -0
- package/dist/5366.js.map +1 -0
- package/dist/5567.js +1 -0
- package/dist/5567.js.map +1 -0
- package/dist/5598.js +1 -0
- package/dist/5598.js.map +1 -0
- package/dist/5676.js +1 -1
- package/dist/5676.js.map +1 -1
- package/dist/5731.js +5 -0
- package/dist/5731.js.map +1 -0
- package/dist/5821.js +1 -0
- package/dist/5821.js.map +1 -0
- package/dist/5825.js +1 -0
- package/dist/5825.js.map +1 -0
- package/dist/5932.js +1 -0
- package/dist/5932.js.map +1 -0
- package/dist/5941.js +1 -0
- package/dist/5941.js.map +1 -0
- package/dist/6104.js +1 -1
- package/dist/6104.js.map +1 -1
- package/dist/6273.js +1 -0
- package/dist/6273.js.map +1 -0
- package/dist/6337.js +1 -0
- package/dist/6337.js.map +1 -0
- package/dist/6357.js +1 -0
- package/dist/6357.js.map +1 -0
- package/dist/6427.js +1 -1
- package/dist/6427.js.map +1 -1
- package/dist/6478.js +7 -0
- package/dist/6478.js.map +1 -0
- package/dist/6479.js +1 -1
- package/dist/6479.js.map +1 -1
- package/dist/6508.js +1 -0
- package/dist/6508.js.map +1 -0
- package/dist/6567.js +1 -0
- package/dist/6567.js.map +1 -0
- package/dist/6570.js +1 -0
- package/dist/6570.js.map +1 -0
- package/dist/6634.js +1 -0
- package/dist/6634.js.map +1 -0
- package/dist/6688.js +1 -0
- package/dist/6688.js.map +1 -0
- package/dist/6698.js +1 -0
- package/dist/6698.js.map +1 -0
- package/dist/682.js +1 -1
- package/dist/682.js.map +1 -1
- package/dist/689.js +1 -1
- package/dist/689.js.map +1 -1
- package/dist/7085.js +1 -0
- package/dist/7085.js.map +1 -0
- package/dist/740.js +1 -0
- package/dist/740.js.map +1 -0
- package/dist/7478.js +1 -1
- package/dist/7478.js.map +1 -1
- package/dist/7539.js +1 -0
- package/dist/7539.js.map +1 -0
- package/dist/7686.js +1 -0
- package/dist/7686.js.map +1 -0
- package/dist/7782.js +1 -0
- package/dist/7782.js.map +1 -0
- package/dist/7808.js +1 -0
- package/dist/7808.js.map +1 -0
- package/dist/781.js +1 -1
- package/dist/781.js.map +1 -1
- package/dist/8183.js +1 -0
- package/dist/8183.js.map +1 -0
- package/dist/8196.js +1 -1
- package/dist/8196.js.map +1 -1
- package/dist/820.js +1 -0
- package/dist/820.js.map +1 -0
- package/dist/8240.js +1 -1
- package/dist/8240.js.map +1 -1
- package/dist/8455.js +1 -0
- package/dist/8455.js.map +1 -0
- package/dist/8472.js +1 -0
- package/dist/8472.js.map +1 -0
- package/dist/8521.js +1 -0
- package/dist/8521.js.map +1 -0
- package/dist/8602.js +1 -0
- package/dist/8602.js.map +1 -0
- package/dist/8607.js +1 -0
- package/dist/8607.js.map +1 -0
- package/dist/8743.js +1 -0
- package/dist/8743.js.map +1 -0
- package/dist/8762.js +1 -0
- package/dist/8762.js.map +1 -0
- package/dist/8812.js +1 -0
- package/dist/8812.js.map +1 -0
- package/dist/8985.js +1 -0
- package/dist/8985.js.map +1 -0
- package/dist/9.js +1 -0
- package/dist/9.js.map +1 -0
- package/dist/901.js +1 -0
- package/dist/901.js.map +1 -0
- package/dist/9011.js +1 -1
- package/dist/9011.js.map +1 -1
- package/dist/9087.js +1 -0
- package/dist/9087.js.map +1 -0
- package/dist/9148.js +1 -0
- package/dist/9148.js.map +1 -0
- package/dist/9168.js +1 -0
- package/dist/9168.js.map +1 -0
- package/dist/935.js +1 -0
- package/dist/935.js.map +1 -0
- package/dist/9425.js +1 -1
- package/dist/9520.js +1 -1
- package/dist/9520.js.map +1 -1
- package/dist/9547.js +1 -0
- package/dist/9547.js.map +1 -0
- package/dist/9549.js +1 -0
- package/dist/9549.js.map +1 -0
- package/dist/9612.js +1 -0
- package/dist/9612.js.map +1 -0
- package/dist/9621.js +1 -0
- package/dist/9621.js.map +1 -0
- package/dist/9774.js +1 -0
- package/dist/9774.js.map +1 -0
- package/dist/9800.js +1 -0
- package/dist/9800.js.map +1 -0
- package/dist/9806.js +1 -0
- package/dist/9806.js.map +1 -0
- package/dist/9885.js +1 -0
- package/dist/9885.js.map +1 -0
- package/dist/992.js +1 -0
- package/dist/992.js.map +1 -0
- package/dist/kenyaemr-esm-shr-app.js +6 -5
- package/dist/kenyaemr-esm-shr-app.js.buildmanifest.json +1495 -598
- package/dist/kenyaemr-esm-shr-app.js.map +1 -1
- package/dist/main.js +6 -5
- package/dist/main.js.map +1 -1
- package/dist/routes.json +1 -1
- package/package.json +2 -2
- package/src/config-schema.ts +6 -6
- package/src/hooks/usePatient.ts +23 -9
- package/src/hooks/useSHRSummary.ts +1 -3
- package/src/index.ts +1 -4
- package/src/referrals/dependents/dependents.component.tsx +8 -1
- package/src/referrals/referral-reasons/referral-reasons.component.tsx +2 -2
- package/src/referrals/referral-tabs/referrals-tabs.component.tsx +9 -2
- package/src/referrals/referrals-actions.component.tsx +66 -7
- package/src/referrals/referrals.component.tsx +2 -2
- package/src/routes.json +92 -78
- package/src/shr-summary/shr-summary.component.tsx +12 -35
- package/src/shr-summary/shr-summary.resource.ts +74 -74
- package/src/shr-summary/tables/shr-summary-table.component.tsx +53 -23
- package/src/utils/function.tsx +9 -4
- package/src/workspace/referral-workspace.resource.ts +1 -2
- package/src/workspace/referral.workspace.scss +4 -2
- package/src/workspace/referrals.workspace.component.tsx +190 -183
- package/translations/am.json +4 -2
- package/translations/en.json +4 -2
- package/translations/fr.json +4 -2
- package/translations/sw.json +4 -2
- package/tsconfig.json +1 -1
- package/dist/1172.js +0 -1
- package/dist/1172.js.map +0 -1
- package/dist/132.js +0 -1
- package/dist/132.js.map +0 -1
- package/dist/1525.js +0 -1
- package/dist/1525.js.map +0 -1
- package/dist/1729.js +0 -17
- package/dist/1729.js.map +0 -1
- package/dist/1761.js +0 -1
- package/dist/1761.js.map +0 -1
- package/dist/1809.js +0 -7
- package/dist/1809.js.map +0 -1
- package/dist/1866.js +0 -1
- package/dist/1866.js.map +0 -1
- package/dist/1962.js +0 -1
- package/dist/1962.js.map +0 -1
- package/dist/2045.js +0 -1
- package/dist/2045.js.map +0 -1
- package/dist/2163.js +0 -1
- package/dist/2163.js.map +0 -1
- package/dist/2267.js +0 -1
- package/dist/2267.js.map +0 -1
- package/dist/235.js +0 -1
- package/dist/235.js.map +0 -1
- package/dist/2561.js.map +0 -1
- package/dist/2564.js +0 -1
- package/dist/2564.js.map +0 -1
- package/dist/2810.js +0 -2
- package/dist/2810.js.map +0 -1
- package/dist/2867.js +0 -1
- package/dist/2867.js.map +0 -1
- package/dist/3040.js +0 -1
- package/dist/3228.js +0 -1
- package/dist/3228.js.map +0 -1
- package/dist/329.js +0 -1
- package/dist/329.js.map +0 -1
- package/dist/3491.js +0 -1
- package/dist/3491.js.map +0 -1
- package/dist/3509.js +0 -1
- package/dist/3509.js.map +0 -1
- package/dist/3576.js +0 -1
- package/dist/3576.js.map +0 -1
- package/dist/4146.js +0 -1
- package/dist/4146.js.map +0 -1
- package/dist/4224.js +0 -1
- package/dist/4224.js.map +0 -1
- package/dist/4402.js +0 -1
- package/dist/4402.js.map +0 -1
- package/dist/4724.js +0 -1
- package/dist/4724.js.map +0 -1
- package/dist/4972.js +0 -1
- package/dist/4972.js.map +0 -1
- package/dist/509.js +0 -1
- package/dist/509.js.map +0 -1
- package/dist/5096.js +0 -1
- package/dist/5096.js.map +0 -1
- package/dist/5119.js +0 -1
- package/dist/5119.js.map +0 -1
- package/dist/5159.js +0 -13
- package/dist/5159.js.map +0 -1
- package/dist/5361.js +0 -1
- package/dist/5361.js.map +0 -1
- package/dist/5576.js +0 -1
- package/dist/5576.js.map +0 -1
- package/dist/5600.js +0 -1
- package/dist/5600.js.map +0 -1
- package/dist/5604.js +0 -1
- package/dist/5604.js.map +0 -1
- package/dist/5633.js +0 -1
- package/dist/5633.js.map +0 -1
- package/dist/5809.js +0 -1
- package/dist/5809.js.map +0 -1
- package/dist/5882.js +0 -1
- package/dist/5939.js +0 -5
- package/dist/5939.js.map +0 -1
- package/dist/6004.js +0 -1
- package/dist/6004.js.map +0 -1
- package/dist/6121.js +0 -3
- package/dist/6121.js.map +0 -1
- package/dist/6129.js +0 -1
- package/dist/6129.js.map +0 -1
- package/dist/6137.js +0 -1
- package/dist/6137.js.map +0 -1
- package/dist/6232.js +0 -1
- package/dist/6232.js.map +0 -1
- package/dist/6356.js +0 -1
- package/dist/6356.js.map +0 -1
- package/dist/6548.js +0 -1
- package/dist/6548.js.map +0 -1
- package/dist/6571.js +0 -1
- package/dist/6571.js.map +0 -1
- package/dist/6589.js +0 -1
- package/dist/6589.js.map +0 -1
- package/dist/6626.js +0 -1
- package/dist/6626.js.map +0 -1
- package/dist/6643.js +0 -1
- package/dist/6643.js.map +0 -1
- package/dist/6721.js +0 -1
- package/dist/6721.js.map +0 -1
- package/dist/6868.js +0 -1
- package/dist/6868.js.map +0 -1
- package/dist/7127.js +0 -1
- package/dist/7177.js +0 -1
- package/dist/7177.js.map +0 -1
- package/dist/7402.js +0 -1
- package/dist/7402.js.map +0 -1
- package/dist/7419.js +0 -1
- package/dist/7419.js.map +0 -1
- package/dist/7544.js +0 -1
- package/dist/7544.js.map +0 -1
- package/dist/7560.js +0 -1
- package/dist/7560.js.map +0 -1
- package/dist/8179.js +0 -6
- package/dist/8179.js.map +0 -1
- package/dist/8189.js +0 -1
- package/dist/8189.js.map +0 -1
- package/dist/8249.js +0 -1
- package/dist/8249.js.map +0 -1
- package/dist/8502.js +0 -1
- package/dist/8502.js.map +0 -1
- package/dist/8512.js +0 -1
- package/dist/8512.js.map +0 -1
- package/dist/8522.js +0 -1
- package/dist/8522.js.map +0 -1
- package/dist/8633.js +0 -1
- package/dist/8633.js.map +0 -1
- package/dist/8775.js +0 -11
- package/dist/8775.js.map +0 -1
- package/dist/8776.js +0 -1
- package/dist/8776.js.map +0 -1
- package/dist/8869.js +0 -1
- package/dist/8869.js.map +0 -1
- package/dist/887.js +0 -1
- package/dist/887.js.map +0 -1
- package/dist/8927.js +0 -1
- package/dist/8927.js.map +0 -1
- package/dist/916.js +0 -1
- package/dist/9355.js +0 -1
- package/dist/9355.js.map +0 -1
- package/dist/9675.js +0 -1
- package/dist/9675.js.map +0 -1
- package/dist/9931.js +0 -1
- package/dist/9931.js.map +0 -1
- package/jest.config.js +0 -3
- package/src/shr-summary/shr-authorization-form.workspace.tsx +0 -149
|
@@ -1,91 +1,91 @@
|
|
|
1
1
|
import { openmrsFetch, restBaseUrl } from '@openmrs/esm-framework';
|
|
2
|
-
import dayjs from 'dayjs';
|
|
3
|
-
import { z } from 'zod';
|
|
4
|
-
import { PHONE_NUMBER_REGEX } from '../constants';
|
|
5
2
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
3
|
+
interface SmsResponseData {
|
|
4
|
+
status: string;
|
|
5
|
+
message: string;
|
|
6
|
+
id: string;
|
|
7
|
+
}
|
|
8
|
+
interface TokenResponse {
|
|
9
|
+
token: string;
|
|
10
|
+
issued: number; // Unix timestamp in milliseconds
|
|
11
|
+
expires: number; // Unix timestamp in milliseconds
|
|
12
|
+
status: string; // e.g., "success"
|
|
13
|
+
expires_in: number; // Expiration duration in milliseconds (e.g., 1440000 ms = 24 minutes)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface VerifyResponseData {
|
|
17
|
+
response: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const sendSHAOtp = async (phoneNumber: string, nationalId: string): Promise<SmsResponseData> => {
|
|
21
|
+
const messageTemplate = 'Message template';
|
|
22
|
+
const response = await openmrsFetch(
|
|
23
|
+
`${restBaseUrl}/kenyaemr/send-kenyaemr-sms?phone=${phoneNumber}&nationalId=${nationalId}&message=${messageTemplate}`,
|
|
19
24
|
{
|
|
20
|
-
|
|
21
|
-
|
|
25
|
+
method: 'POST',
|
|
26
|
+
headers: { 'Content-Type': 'application/json' },
|
|
22
27
|
},
|
|
23
28
|
);
|
|
24
29
|
|
|
25
|
-
|
|
26
|
-
let otpNumbers = '0123456789';
|
|
27
|
-
let OTP = '';
|
|
28
|
-
const len = otpNumbers.length;
|
|
29
|
-
for (let i = 0; i < length; i++) {
|
|
30
|
-
OTP += otpNumbers[Math.floor(Math.random() * len)];
|
|
31
|
-
}
|
|
32
|
-
return OTP;
|
|
33
|
-
}
|
|
30
|
+
const rawResponseText = response.data;
|
|
34
31
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
JSON.stringify({
|
|
39
|
-
otp,
|
|
40
|
-
timestamp: new Date().toISOString(),
|
|
41
|
-
}),
|
|
42
|
-
);
|
|
43
|
-
}
|
|
32
|
+
if (!rawResponseText) {
|
|
33
|
+
throw new Error('SMS Gateway returned an empty response.');
|
|
34
|
+
}
|
|
44
35
|
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
{ otp, patient_name: patientName, expiry_time: 5 },
|
|
48
|
-
'Dear {{patient_name}}, your OTP for accessing your Shared Health Records (SHR) is {{otp}}. Please enter this code to proceed. The code is valid for {{expiry_time}} minutes.',
|
|
49
|
-
);
|
|
36
|
+
// Use the extraction logic
|
|
37
|
+
const extractedData = extractSmsData(rawResponseText);
|
|
50
38
|
|
|
51
|
-
|
|
39
|
+
// Throw an error if parsing failed or the payload was missing
|
|
40
|
+
if (!extractedData) {
|
|
41
|
+
throw new Error(`Failed to parse SMS gateway response. Raw response: ${rawResponseText}`);
|
|
42
|
+
}
|
|
52
43
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
});
|
|
57
|
-
if (res.ok) {
|
|
58
|
-
return await res.json();
|
|
44
|
+
// Explicitly check for successful status from the gateway payload
|
|
45
|
+
if (extractedData.status !== 'success') {
|
|
46
|
+
throw new Error(`SMS delivery failed with status: ${extractedData.status}. Message: ${extractedData.message}`);
|
|
59
47
|
}
|
|
60
|
-
throw new Error('Error sending otp');
|
|
61
|
-
}
|
|
62
48
|
|
|
63
|
-
|
|
64
|
-
|
|
49
|
+
// Return the strongly-typed data to the caller
|
|
50
|
+
return extractedData;
|
|
51
|
+
};
|
|
65
52
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Extracts and parses the JSON payload from a mixed-text SMS API response.
|
|
55
|
+
* @param responseString The raw string response from the provider
|
|
56
|
+
* @returns SmsResponseData object or null if parsing fails
|
|
57
|
+
*/
|
|
58
|
+
export function extractSmsData(responseString: string): SmsResponseData | null {
|
|
59
|
+
try {
|
|
60
|
+
// Regex to capture everything between the first '{' and the last '}'
|
|
61
|
+
const jsonMatch = responseString.match(/\{.*\}/);
|
|
62
|
+
|
|
63
|
+
if (!jsonMatch) {
|
|
64
|
+
console.error('No JSON payload found in the response string.');
|
|
65
|
+
return null;
|
|
71
66
|
}
|
|
72
|
-
});
|
|
73
67
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
68
|
+
// Parse the extracted JSON string
|
|
69
|
+
const parsedData: SmsResponseData = JSON.parse(jsonMatch[0]);
|
|
70
|
+
return parsedData;
|
|
71
|
+
} catch (error) {
|
|
72
|
+
console.error('Failed to parse SMS response data:', error);
|
|
73
|
+
return null;
|
|
80
74
|
}
|
|
81
|
-
const { otp: storedOtp, timestamp } = JSON.parse(data);
|
|
82
|
-
const isExpired = dayjs(timestamp).add(5, 'minutes').isBefore(dayjs());
|
|
83
|
-
if (storedOtp !== otp) {
|
|
84
|
-
throw new Error('Invalid OTP');
|
|
85
|
-
}
|
|
86
|
-
if (isExpired) {
|
|
87
|
-
throw new Error('OTP Expired');
|
|
88
|
-
}
|
|
89
|
-
sessionStorage.removeItem(patientUuid);
|
|
90
|
-
return 'Verification success';
|
|
91
75
|
}
|
|
76
|
+
|
|
77
|
+
export const verifyOtp = async (otp: string, uuid: string) => {
|
|
78
|
+
const url = `${restBaseUrl}/kenyaemr/validate-otp`;
|
|
79
|
+
const res = await openmrsFetch<VerifyResponseData>(url, {
|
|
80
|
+
method: 'POST',
|
|
81
|
+
headers: { 'Content-Type': 'application/json' },
|
|
82
|
+
body: { id: uuid, otp },
|
|
83
|
+
});
|
|
84
|
+
const data = res?.data?.response;
|
|
85
|
+
try {
|
|
86
|
+
const _data = JSON.parse(data) as TokenResponse;
|
|
87
|
+
return { status: 'success', data: _data };
|
|
88
|
+
} catch (error) {
|
|
89
|
+
return { status: 'error', error: data };
|
|
90
|
+
}
|
|
91
|
+
};
|
|
@@ -1,29 +1,25 @@
|
|
|
1
1
|
import { Button, DataTableSkeleton, Layer, Tile } from '@carbon/react';
|
|
2
2
|
import { ArrowRight } from '@carbon/react/icons';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
EmptyDataIllustration,
|
|
7
|
-
ErrorState,
|
|
8
|
-
getPatientUuidFromStore,
|
|
9
|
-
} from '@openmrs/esm-patient-common-lib';
|
|
10
|
-
import React, { useState } from 'react';
|
|
3
|
+
import { showModal, showSnackbar } from '@openmrs/esm-framework';
|
|
4
|
+
import { CardHeader, EmptyDataIllustration, ErrorState } from '@openmrs/esm-patient-common-lib';
|
|
5
|
+
import React, { useRef, useState } from 'react';
|
|
11
6
|
import { useTranslation } from 'react-i18next';
|
|
12
7
|
import usePatient from '../../hooks/usePatient';
|
|
13
8
|
import SharedHealthRecordsSummary from '../../shrpatient-summary/shrpatient-summary.component';
|
|
9
|
+
import { sendSHAOtp, verifyOtp } from '../shr-summary.resource';
|
|
14
10
|
import styles from './shr-tables.scss';
|
|
15
11
|
|
|
16
|
-
interface PatientSHRSummaryTableProps {
|
|
12
|
+
interface PatientSHRSummaryTableProps {
|
|
13
|
+
patientUuid: string;
|
|
14
|
+
patient: fhir.Patient;
|
|
15
|
+
}
|
|
17
16
|
|
|
18
|
-
const PatientSHRSummaryTable: React.FC<PatientSHRSummaryTableProps> = () => {
|
|
17
|
+
const PatientSHRSummaryTable: React.FC<PatientSHRSummaryTableProps> = ({ patient, patientUuid }) => {
|
|
19
18
|
const { t } = useTranslation();
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
const patientUuid = getPatientUuidFromStore();
|
|
25
|
-
const [accessGranted, setAccessGranted] = useState(false);
|
|
26
|
-
const { error, isLoading, patientPhoneNumber, patientName } = usePatient(patientUuid);
|
|
19
|
+
const idRef = useRef<string>();
|
|
20
|
+
const [accessGranted, setAccessGranted] = useState(true);
|
|
21
|
+
const [isAuthorizing, setIsAuthorizing] = useState(false);
|
|
22
|
+
const { error, isLoading, patientPhoneNumber, patientName, nationalId } = usePatient(patientUuid);
|
|
27
23
|
|
|
28
24
|
if (isLoading) {
|
|
29
25
|
return <DataTableSkeleton />;
|
|
@@ -33,14 +29,48 @@ const PatientSHRSummaryTable: React.FC<PatientSHRSummaryTableProps> = () => {
|
|
|
33
29
|
}
|
|
34
30
|
|
|
35
31
|
const handleInitiateAuthorization = () => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
32
|
+
const dispose = showModal('otp-verification-modal', {
|
|
33
|
+
onClose: () => {
|
|
34
|
+
if (!accessGranted) {
|
|
35
|
+
setIsAuthorizing(false);
|
|
36
|
+
}
|
|
37
|
+
dispose();
|
|
38
|
+
},
|
|
39
|
+
phoneNumber: patientPhoneNumber || '',
|
|
40
|
+
otpLength: 5,
|
|
41
|
+
expiryMinutes: 5,
|
|
42
|
+
centerBoxes: true,
|
|
43
|
+
onRequestOtp: async (_phone: string) => {
|
|
44
|
+
const { status, id } = await sendSHAOtp(_phone, nationalId as string);
|
|
45
|
+
idRef.current = id;
|
|
46
|
+
if (status !== 'success') {
|
|
47
|
+
throw new Error(t('otpFailed', 'Failed to send OTP'));
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
onVerify: async (enteredOtp: string) => {
|
|
52
|
+
const { status, data, error } = await verifyOtp(enteredOtp, idRef.current as string);
|
|
53
|
+
if (status !== 'success') {
|
|
54
|
+
throw new Error(t('authorizeFailed', 'Authorization failed'));
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
onVerificationSuccess: () => {
|
|
59
|
+
dispose();
|
|
60
|
+
setIsAuthorizing(false);
|
|
40
61
|
setAccessGranted(true);
|
|
62
|
+
showSnackbar({
|
|
63
|
+
title: t('success', 'Success'),
|
|
64
|
+
subtitle: t('otpVerificationSuccessMessage', 'OTP Vefification succesfull'),
|
|
65
|
+
kind: 'success',
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
onCleanup: () => {
|
|
70
|
+
if (!accessGranted) {
|
|
71
|
+
setIsAuthorizing(false);
|
|
72
|
+
}
|
|
41
73
|
},
|
|
42
|
-
patientPhoneNumber,
|
|
43
|
-
patientName,
|
|
44
74
|
});
|
|
45
75
|
};
|
|
46
76
|
|
package/src/utils/function.tsx
CHANGED
|
@@ -139,11 +139,10 @@ export const getPatientAddress = (patient: Patient) => {
|
|
|
139
139
|
|
|
140
140
|
export const getPatientIdentifiers = (patient: Patient) => {
|
|
141
141
|
const identifiers = [];
|
|
142
|
-
|
|
143
|
-
if (patient?.identifiers?.length) {
|
|
142
|
+
if (patient?.identifiers?.length && patient.identifiers.length > 0) {
|
|
144
143
|
patient.identifiers.forEach((id) => {
|
|
145
|
-
if (id.identifier && id.identifierType?.
|
|
146
|
-
const idTypeName = id.identifierType.
|
|
144
|
+
if (id.identifier && id.identifierType?.display) {
|
|
145
|
+
const idTypeName = id.identifierType.display.toUpperCase();
|
|
147
146
|
|
|
148
147
|
if (
|
|
149
148
|
idTypeName.includes('CCC') ||
|
|
@@ -168,6 +167,12 @@ export const getPatientIdentifiers = (patient: Patient) => {
|
|
|
168
167
|
IDENTIFIER_TYPE: 'FACILITY_ID',
|
|
169
168
|
ASSIGNING_AUTHORITY: 'FACILITY',
|
|
170
169
|
});
|
|
170
|
+
} else if (idTypeName.includes('CR')) {
|
|
171
|
+
identifiers.push({
|
|
172
|
+
ID: id.identifier,
|
|
173
|
+
IDENTIFIER_TYPE: 'CR_NUMBER',
|
|
174
|
+
ASSIGNING_AUTHORITY: 'SHA',
|
|
175
|
+
});
|
|
171
176
|
}
|
|
172
177
|
}
|
|
173
178
|
});
|
|
@@ -20,10 +20,9 @@ export const useFacilities = (searchTerm: string) => {
|
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
export const useSendReferralToArtDirectory = () => {
|
|
23
|
-
const { artDirectoryUrl } = useConfig<ReferralConfigObject>();
|
|
24
|
-
|
|
25
23
|
const sendReferral = async (apiPayload: ReferralPayload): Promise<ReferralResponse> => {
|
|
26
24
|
try {
|
|
25
|
+
const artDirectoryUrl = `${restBaseUrl}/kenyaemril/outboundReferral`;
|
|
27
26
|
const response = await openmrsFetch(artDirectoryUrl, {
|
|
28
27
|
method: 'POST',
|
|
29
28
|
headers: {
|
|
@@ -23,14 +23,16 @@
|
|
|
23
23
|
display: flex;
|
|
24
24
|
flex-direction: column;
|
|
25
25
|
height: 100%;
|
|
26
|
-
padding-bottom: 20px;
|
|
27
26
|
}
|
|
28
27
|
|
|
29
28
|
.buttonSet {
|
|
30
29
|
margin-top: auto;
|
|
31
30
|
display: flex;
|
|
32
31
|
justify-content: flex-end;
|
|
33
|
-
|
|
32
|
+
|
|
33
|
+
& > button {
|
|
34
|
+
min-width: 50%;
|
|
35
|
+
}
|
|
34
36
|
}
|
|
35
37
|
|
|
36
38
|
.grid {
|