Skip to content

Commit 5d25cf6

Browse files
mohan-13arshiya2125devsingh05298rahu1ramesh
authored
BAH-4146 | Add. ABHA Verification through Aadhaar Number (#95)
* BAH-4137. Add Resend OTP component for create Abha and verify Abha flows. * BAH-4137 | Add. Styling for info messages in resend otp * BAH-4137. Add success message on Resend OTP. * BAH-4137. Add common scss file. * BAH-4137 | Fix alignment for OTP success message * BAH-4137 | Add Resend OTP for communication mobile verification * BAH-4137. Add Resend OTP feature for verify by Abha Address and Abha number * BAH-4137. Add Resend OTP feature for verify by Mobile Number * BAH-4137. Remove console.log() * BAH-4138 | Add validation for custom ABHA Address input * Update CreateABHAAddress.jsx BAH-4138 | Add validation for Custom Abha Address * [Rahul] | Fix. Lint Issue * BAH-4146 | Add. ABHA Verification through Aadhaar Number --------- Co-authored-by: arshiyaTW2021 <arshiya.flamingo@gmail.com> Co-authored-by: Dev Singh <88476780+devsingh05298@users.noreply.github.com> Co-authored-by: Rahul Ramesh <121226043+rahu1ramesh@users.noreply.github.com>
1 parent 77c4364 commit 5d25cf6

File tree

3 files changed

+240
-2
lines changed

3 files changed

+240
-2
lines changed

src/api/hipServiceApi.js

+31-2
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,8 @@ export const getAbhaAddresCard = async () => {
450450

451451
export const abhaNumberRequestOtp = async (abhaNumber, authMode) => {
452452
const data = {
453-
"abhaNumber": abhaNumber,
453+
"identifier": abhaNumber,
454+
"identifierType": "ABHA_NUMBER",
454455
"authMethod": authMode,
455456
};
456457
try {
@@ -475,6 +476,33 @@ export const abhaNumberVerifyOtp = async (otp) => {
475476
}
476477
};
477478

479+
export const aadhaarNumberRequestOtp = async (aadhaarNumber) => {
480+
const data = {
481+
"identifier": aadhaarNumber,
482+
"identifierType": "AADHAAR_NUMBER",
483+
};
484+
try {
485+
const response = await axios.post(Constants.hipServiceUrl + Constants.verificationRequestOtp, data, Constants.headers);
486+
return response;
487+
}
488+
catch (error) {
489+
return parseAPIError(error);
490+
}
491+
};
492+
493+
export const aadhaarNumberVerifyOtp = async (otp) => {
494+
const data = {
495+
"otp": otp,
496+
};
497+
try {
498+
const response = await axios.post(Constants.hipServiceUrl + Constants.verificationVerifyOtp, data, Constants.headers);
499+
return response;
500+
}
501+
catch (error) {
502+
return parseAPIError(error);
503+
}
504+
};
505+
478506
export const createDefaultHealthId = async () => {
479507
try {
480508
const response = await axios.get(Constants.hipServiceUrl + Constants.createDefaultHealthId, Constants.headers);
@@ -503,7 +531,8 @@ export const updateHealthId = async (healthId) => {
503531

504532
export const mobileGenerateOtp = async (mobileNumber) => {
505533
const data = {
506-
"mobileNumber": mobileNumber
534+
"identifier": mobileNumber,
535+
"identifierType": "MOBILE_NUMBER",
507536
};
508537
try {
509538
const response = await axios.post(Constants.hipServiceUrl + Constants.verificationRequestOtp, data, Constants.headers);

src/components/verifyHealthId/verifyHealthId.jsx

+7
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import CreateHealthId from "../otp-verification/create-healthId";
1515
import {enableHealthIdVerificationThroughMobileNumber} from "../../api/constants";
1616
import VerifyHealthIdThroughMobileNumber from "./verifyHealthIdThroughMobileNumber";
1717
import { formatAbhaNumber, validateAbhaNumber } from "../Common/FormatAndValidationUtils";
18+
import VerifyThroughAadhaarNumber from "./verifyThroughAadhaarNumber";
1819

1920
const VerifyHealthId = () => {
2021
const [abhaNumber, setAbhaNumber] = useState('');
@@ -236,6 +237,7 @@ const VerifyHealthId = () => {
236237
<option value="ABHA_NUMBER">ABHA Number</option>
237238
<option value="ABHA_ADDRESS">ABHA Address</option>
238239
{isVerifyThroughMobileNumberEnabled && <option value="MOBILE_NUMBER">Mobile Number</option> }
240+
<option value="AADHAAR_NUMBER">Aadhaar Number</option>
239241
</select>
240242
</div>
241243
</div>
@@ -269,6 +271,11 @@ const VerifyHealthId = () => {
269271
<VerifyHealthIdThroughMobileNumber isDisabled={showAuthModes} setIsDisabled={setIsDisabled} setIsMobileOtpVerified={setIsMobileOtpVerified}
270272
ndhmDetails={ndhmDetails} setNdhmDetails={setNdhmDetails} setBack={setBack}/>
271273
</div>}
274+
{selectedIdentifierType ==="AADHAAR_NUMBER" &&
275+
<div>
276+
<VerifyThroughAadhaarNumber setIsDisabled={setIsDisabled} setNdhmDetails={setNdhmDetails}/>
277+
</div>
278+
}
272279
{matchingPatientFound && <div className="patient-existed" onClick={redirectToPatientDashboard}>
273280
Matching record with Health ID/PHR Address found
274281
</div>}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
import React, { useState } from "react";
2+
import {
3+
aadhaarNumberRequestOtp,
4+
aadhaarNumberVerifyOtp,
5+
fetchPatientFromBahmniWithHealthId,
6+
getPatientProfile,
7+
} from "../../api/hipServiceApi";
8+
import Spinner from "../spinner/spinner";
9+
import "./verifyHealthId.scss";
10+
import { mapPatient } from "../Common/patientMapper";
11+
import { validateOtp } from "../Common/FormatAndValidationUtils";
12+
import ResendOtp from "../Common/ResendOtp";
13+
import { isAadhaarValid } from "../Common/AadhaarValidation";
14+
15+
const VerifyThroughAadhaarNumber = (props) => {
16+
const [aadhaarNumber, setAadhaarNumber] = useState("");
17+
const [showOtpInput, setShowOtpInput] = useState(false);
18+
const [otp, setOtp] = useState("");
19+
const [matchingPatientFound, setMatchingPatientFound] = useState(false);
20+
const [matchingpatientUuid, setMatchingPatientUuid] = useState("");
21+
const [showError, setShowError] = useState(false);
22+
const [loader, setLoader] = useState(false);
23+
const [error, setError] = useState("");
24+
const [showResendSuccessMessage, setShowResendSuccessMessage] =
25+
useState(false);
26+
27+
function idOnChangeHandler(e) {
28+
setShowError(false);
29+
setError("");
30+
setAadhaarNumber(e.target.value);
31+
setShowOtpInput(false);
32+
}
33+
34+
function otpOnChangeHandler(e) {
35+
setOtp(e.target.value);
36+
}
37+
38+
async function onResendOtp() {
39+
setError("");
40+
setLoader(true);
41+
setShowError(false);
42+
var response = await aadhaarNumberRequestOtp(aadhaarNumber);
43+
setLoader(false);
44+
if (response.error) {
45+
setShowError(true);
46+
setError(response.error.message);
47+
} else {
48+
setShowResendSuccessMessage(true);
49+
setTimeout(() => {
50+
setShowResendSuccessMessage(false);
51+
}, 3000);
52+
}
53+
}
54+
55+
async function verifyAadhaarNumber() {
56+
let formattedAadhaarNumber = aadhaarNumber.trim();
57+
if (!isAadhaarValid(formattedAadhaarNumber)) {
58+
setShowError(true);
59+
setError("Invalid Aadhaar Number");
60+
return;
61+
}
62+
setError("");
63+
setLoader(true);
64+
setShowError(false);
65+
const response = await aadhaarNumberRequestOtp(aadhaarNumber);
66+
if (response.data !== undefined) {
67+
setShowOtpInput(true);
68+
props.setIsDisabled(true);
69+
} else {
70+
setShowError(true);
71+
setError(response.error.message);
72+
}
73+
setLoader(false);
74+
}
75+
76+
async function verifyOtp() {
77+
setError("");
78+
setShowError(false);
79+
if (!validateOtp(otp)) {
80+
setShowError(true);
81+
setError("Invalid OTP. OTP should be 6 digits");
82+
} else {
83+
setLoader(true);
84+
var response = await aadhaarNumberVerifyOtp(otp);
85+
if (response) {
86+
setLoader(false);
87+
if (response.data === undefined) {
88+
setShowError(true);
89+
setError(response.error.message);
90+
} else {
91+
if (response.data.authResult === "success") await getABHAProfile();
92+
else {
93+
setError(response.data.message);
94+
setShowError(true);
95+
}
96+
}
97+
}
98+
}
99+
}
100+
101+
function redirectToPatientDashboard() {
102+
window.parent.postMessage({ patientUuid: matchingpatientUuid }, "*");
103+
}
104+
105+
async function getABHAProfile() {
106+
setError("");
107+
setShowError(false);
108+
setLoader(true);
109+
const response = await getPatientProfile();
110+
if (response) {
111+
setLoader(false);
112+
if (response.data === undefined) {
113+
setShowError(true);
114+
setError(response.error.message);
115+
} else {
116+
const matchingPatientId = await fetchPatientFromBahmniWithHealthId(
117+
response.data.abhaNumber
118+
);
119+
if (
120+
matchingPatientId.Error === undefined &&
121+
matchingPatientId.validPatient === true
122+
) {
123+
setMatchingPatientFound(true);
124+
setMatchingPatientUuid(matchingPatientId.patientUuid);
125+
} else {
126+
if (matchingPatientId.Error !== undefined) {
127+
setShowError(true);
128+
setError(matchingPatientId.Error.message);
129+
} else {
130+
props.setNdhmDetails(mapPatient(response.data));
131+
}
132+
}
133+
}
134+
}
135+
}
136+
137+
return (
138+
<div>
139+
<div className="verify-health-id">
140+
<label htmlFor="aadhaarNumber" className="label">
141+
Enter Aadhaar Number:{" "}
142+
</label>
143+
<div className="verify-health-id-input-btn">
144+
<div className="verify-health-id-input">
145+
<input
146+
type="text"
147+
id="aadhaarNumber"
148+
name="aadhaarNumber"
149+
value={aadhaarNumber}
150+
onChange={idOnChangeHandler}
151+
/>
152+
</div>
153+
<button
154+
name="verify-btn"
155+
type="button"
156+
onClick={verifyAadhaarNumber}
157+
disabled={showOtpInput}
158+
>
159+
Verify
160+
</button>
161+
{!showOtpInput && showError && <h6 className="error ">{error}</h6>}
162+
</div>
163+
</div>
164+
{showOtpInput && (
165+
<div>
166+
<div className="otp-verify">
167+
<label htmlFor="otp">Enter OTP </label>
168+
<div className="otp-verify-input-btn">
169+
<div className="otp-verify-input">
170+
<input
171+
type="text"
172+
id="otp"
173+
name="otp"
174+
value={otp}
175+
onChange={otpOnChangeHandler}
176+
/>
177+
</div>
178+
<ResendOtp onResend={onResendOtp} />
179+
{showResendSuccessMessage && (
180+
<div className="success_text">OTP Sent Successfully</div>
181+
)}
182+
{showError && <h6 className="error ">{error}</h6>}
183+
</div>
184+
</div>
185+
<div className="qr-code-scanner">
186+
{" "}
187+
<button type="button" onClick={verifyOtp}>
188+
Fetch ABDM Data
189+
</button>
190+
</div>
191+
</div>
192+
)}
193+
{matchingPatientFound && (
194+
<div className="patient-existed" onClick={redirectToPatientDashboard}>
195+
Matching record with Health ID/PHR Address found
196+
</div>
197+
)}
198+
{loader && <Spinner />}
199+
</div>
200+
);
201+
};
202+
export default VerifyThroughAadhaarNumber;

0 commit comments

Comments
 (0)