@djb25/digit-ui-module-ekyc 1.0.25 → 1.0.26

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.
@@ -1,24 +1,27 @@
1
1
  import React, { useState, Fragment, useEffect } from "react";
2
2
  import { useLocation } from "react-router-dom";
3
- import {
4
- CardLabel,
5
- TextInput,
6
- Dropdown,
7
- UploadFile,
8
- Toast,
9
- FormStep,
10
- Loader
11
- } from "@djb25/digit-ui-react-components";
3
+ import { Toast, Loader, FormComposer } from "@djb25/digit-ui-react-components";
4
+ import { useTranslation } from "react-i18next";
5
+ import MeterDetailsConfig from "../config/MeterDetailsConfig";
12
6
 
13
7
  const MeterDetails = ({ config, onSelect, formData }) => {
8
+ const { t } = useTranslation();
14
9
  const location = useLocation();
15
10
  const flowState = location.state || {};
16
11
  const tenantId = Digit.ULBService.getCurrentTenantId();
17
12
 
18
- const searchKno = flowState?.kNumber || flowState?.kno || formData?.kNumber || formData?.kno || sessionStorage.getItem("EKYC_K_NUMBER");
13
+ const queryParams = new URLSearchParams(location.search);
14
+ const urlKno = queryParams.get("kno");
15
+ const searchKno =
16
+ urlKno ||
17
+ flowState?.kNumber ||
18
+ flowState?.kno ||
19
+ formData?.kNumber ||
20
+ formData?.kno ||
21
+ sessionStorage.getItem("EKYC_K_NUMBER");
19
22
 
20
23
  const { isLoading, data: searchData } = Digit.Hooks.ekyc.useSearchConnection(
21
- { tenantId, details: { kno: searchKno } },
24
+ { tenantId, details: { kno: searchKno, fetchType: "METER" } },
22
25
  { enabled: !!searchKno, cacheTime: 0 }
23
26
  );
24
27
 
@@ -27,101 +30,92 @@ const MeterDetails = ({ config, onSelect, formData }) => {
27
30
  const savedData = formData?.meterDetails || {};
28
31
 
29
32
  // 🔹 STATES
30
- const [connectionCategory, setConnectionCategory] = useState(savedData.connectionCategory || "");
31
- const [saType, setSaType] = useState(savedData.saType || "");
32
- const [status, setStatus] = useState(savedData.status || "");
33
-
34
- const [mrCode, setMrCode] = useState(savedData.mrCode || "");
35
- const [areaCode, setAreaCode] = useState(savedData.areaCode || "");
36
- const [mrKey, setMrKey] = useState(savedData.mrKey || "");
37
-
38
- const [meterNumber, setMeterNumber] = useState(savedData.meterNumber || "");
39
- const [meterMaker, setMeterMaker] = useState(savedData.meterMaker || "");
40
-
41
- const [meterStatus, setMeterStatus] = useState(savedData.meterStatus ? { name: savedData.meterStatus } : null);
42
- const [meterCondition, setMeterCondition] = useState(savedData.meterCondition ? { name: savedData.meterCondition } : null);
43
- const [meterLocation, setMeterLocation] = useState(savedData.meterLocation ? { name: savedData.meterLocation } : null);
44
-
45
- const [lastBillReceived, setLastBillReceived] = useState(savedData.lastBillReceived ? { name: savedData.lastBillReceived } : null);
46
- const [billMonthYear, setBillMonthYear] = useState(savedData.billMonthYear ? { name: savedData.billMonthYear } : null);
47
- const [reason, setReason] = useState(savedData.reason || "");
48
-
49
- const [accessToMeter, setAccessToMeter] = useState(savedData.accessToMeter ? { name: savedData.accessToMeter } : null);
50
- const [sewerConnection, setSewerConnection] = useState(savedData.sewerConnection ? { name: savedData.sewerConnection } : null);
51
- const [septicTank, setSepticTank] = useState(savedData.septicTank ? { name: savedData.septicTank } : null);
52
-
53
33
  const [meterPhoto, setMeterPhoto] = useState(null);
54
34
  const [meterPhotoId, setMeterPhotoId] = useState(savedData.meterPhotoId || null);
55
-
56
35
  const [toast, setToast] = useState(null);
57
-
58
- // 🔹 OPTIONS
59
- const yesNo = [{ name: "Yes" }, { name: "No" }];
60
-
61
- const meterStatusOptions = [
62
- { name: "Metered" },
63
- { name: "Unmetered" },
64
- { name: "Can not be identified" },
65
- ];
66
-
67
- const meterConditionOptions = [
68
- { name: "Damaged" },
69
- { name: "Not-Damaged" },
70
- ];
71
-
72
- const meterLocationOptions = [
73
- { name: "Inside" },
74
- { name: "Outside" },
75
- ];
76
-
77
- // 🔹 MONTH-YEAR OPTIONS (1998–2026)
78
- const monthYearOptions = [];
79
- for (let y = 1998; y <= 2026; y++) {
80
- for (let m = 1; m <= 12; m++) {
81
- monthYearOptions.push({ name: `${m}/${y}` });
82
- }
83
- }
36
+ const [isDataLoaded, setIsDataLoaded] = useState(false);
37
+ const [canSubmit, setCanSubmit] = useState(false);
38
+
39
+ const [defaultValues, setDefaultValues] = useState(() => ({
40
+ connectionCategory: savedData.connectionCategory || "",
41
+ saType: savedData.saType || "",
42
+ status: savedData.status || "",
43
+ mrCode: savedData.mrCode || "",
44
+ areaCode: savedData.areaCode || "",
45
+ mrKey: savedData.mrKey || "",
46
+ meterNumber: savedData.meterNumber || "",
47
+ meterMaker: savedData.meterMaker || "",
48
+ meterStatus: savedData.meterStatus ? { name: savedData.meterStatus } : null,
49
+ meterCondition: savedData.meterCondition ? { name: savedData.meterCondition } : null,
50
+ meterLocation: savedData.meterLocation ? { name: savedData.meterLocation } : null,
51
+ lastBillReceived: savedData.lastBillReceived ? { name: savedData.lastBillReceived } : null,
52
+ billMonthYear: savedData.billMonthYear ? { name: savedData.billMonthYear } : null,
53
+ reason: savedData.reason || "",
54
+ accessToMeter: savedData.accessToMeter ? { name: savedData.accessToMeter } : null,
55
+ sewerConnection: savedData.sewerConnection ? { name: savedData.sewerConnection } : null,
56
+ septicTank: savedData.septicTank ? { name: savedData.septicTank } : null,
57
+ meterPhoto: savedData.meterPhotoId ? "Uploaded" : null,
58
+ }));
59
+
60
+ const [localFormData, setLocalFormData] = useState(defaultValues);
61
+
62
+ const extractApplicationData = (searchData) => {
63
+ if (!searchData) return null;
64
+ const reviewWrapper =
65
+ searchData?.applicationReviewInfo || searchData?.applicationReview || searchData;
66
+ const applicationData = (Array.isArray(reviewWrapper) ? reviewWrapper[0] : reviewWrapper) || {};
67
+ return applicationData?.newData || applicationData;
68
+ };
84
69
 
85
70
  useEffect(() => {
86
- const rawData = searchData || formData?.connectionDetails;
71
+ const appData = extractApplicationData(searchData);
72
+ const rawData = appData || formData?.connectionDetails;
87
73
  const apiMeter = rawData?.meterDetails || rawData || {};
88
74
 
89
- if (apiMeter && Object.keys(apiMeter).length > 0 && !savedData.connectionCategory) {
90
- if (apiMeter.connectionCategory) setConnectionCategory(apiMeter.connectionCategory);
91
- if (apiMeter.saType) setSaType(apiMeter.saType);
92
- if (apiMeter.statusFlag) setStatus(apiMeter.statusFlag);
93
-
94
- if (apiMeter.mrcode) setMrCode(String(apiMeter.mrcode));
95
- if (apiMeter.areacode) setAreaCode(String(apiMeter.areacode));
96
- if (apiMeter.mrkey) setMrKey(String(apiMeter.mrkey));
97
-
98
- if (apiMeter.meterNumber) setMeterNumber(apiMeter.meterNumber);
99
- if (apiMeter.meterMake) setMeterMaker(apiMeter.meterMake);
75
+ if (apiMeter && Object.keys(apiMeter).length > 0 && !isDataLoaded) {
76
+ let mStatus = null;
77
+ let mCondition = null;
78
+ let mLoc = null;
79
+ let billRec = null;
80
+ let billMonYr = null;
81
+ let accToMeter = null;
82
+ let sewerConn = null;
83
+ let sepTank = null;
100
84
 
101
85
  if (apiMeter.meterStatus) {
102
- const matchingStatus = meterStatusOptions.find(o => o.name.toLowerCase() === apiMeter.meterStatus.toLowerCase());
103
- if (matchingStatus) setMeterStatus(matchingStatus);
104
- else setMeterStatus({ name: apiMeter.meterStatus });
86
+ const matchingStatus = [
87
+ { name: "Metered" },
88
+ { name: "Unmetered" },
89
+ { name: "Can not be identified" },
90
+ ].find((o) => o.name.toLowerCase() === apiMeter.meterStatus.toLowerCase());
91
+ if (matchingStatus) mStatus = matchingStatus;
92
+ else mStatus = { name: apiMeter.meterStatus };
105
93
  } else if (apiMeter.metered !== undefined) {
106
- setMeterStatus({ name: apiMeter.metered ? "Metered" : "Unmetered" });
94
+ mStatus = { name: apiMeter.metered ? "Metered" : "Unmetered" };
107
95
  }
108
96
 
109
97
  if (apiMeter.meterCondition) {
110
- const matchingCond = meterConditionOptions.find(o => o.name.toLowerCase() === apiMeter.meterCondition.toLowerCase());
111
- if (matchingCond) setMeterCondition(matchingCond);
112
- else setMeterCondition({ name: apiMeter.meterCondition });
98
+ const matchingCond = [{ name: "Damaged" }, { name: "Not-Damaged" }].find(
99
+ (o) => o.name.toLowerCase() === apiMeter.meterCondition.toLowerCase()
100
+ );
101
+ if (matchingCond) mCondition = matchingCond;
102
+ else mCondition = { name: apiMeter.meterCondition };
113
103
  }
114
104
 
115
105
  if (apiMeter.meterLocation) {
116
- const matchingLoc = meterLocationOptions.find(o => o.name.toLowerCase() === apiMeter.meterLocation.toLowerCase() || apiMeter.meterLocation.toLowerCase().includes(o.name.toLowerCase()));
117
- if (matchingLoc) setMeterLocation(matchingLoc);
118
- else setMeterLocation({ name: apiMeter.meterLocation });
106
+ const matchingLoc = [{ name: "Inside" }, { name: "Outside" }].find(
107
+ (o) =>
108
+ o.name.toLowerCase() === apiMeter.meterLocation.toLowerCase() ||
109
+ apiMeter.meterLocation.toLowerCase().includes(o.name.toLowerCase())
110
+ );
111
+ if (matchingLoc) mLoc = matchingLoc;
112
+ else mLoc = { name: apiMeter.meterLocation };
119
113
  }
120
114
 
121
115
  if (apiMeter.lastBillRaised !== undefined && apiMeter.lastBillRaised !== null) {
122
116
  const strVal = String(apiMeter.lastBillRaised).toLowerCase();
123
- if (strVal === "true" || strVal === "yes") setLastBillReceived({ name: "Yes" });
124
- else setLastBillReceived({ name: "No" });
117
+ if (strVal === "true" || strVal === "yes") billRec = { name: "Yes" };
118
+ else billRec = { name: "No" };
125
119
  }
126
120
 
127
121
  if (apiMeter.lastBillReceivedDate) {
@@ -130,106 +124,157 @@ const MeterDetails = ({ config, onSelect, formData }) => {
130
124
  if (parsedParts.length === 2) {
131
125
  const mon = parseInt(parsedParts[0], 10);
132
126
  const yr = parseInt(parsedParts[1], 10);
133
- setBillMonthYear({ name: `${mon}/${yr}` });
127
+ billMonYr = { name: `${mon}/${yr}` };
134
128
  } else {
135
- setBillMonthYear({ name: apiMeter.lastBillReceivedDate });
129
+ billMonYr = { name: apiMeter.lastBillReceivedDate };
136
130
  }
137
131
  }
138
132
 
139
- if (apiMeter.lastBillNotRaisedReason) setReason(apiMeter.lastBillNotRaisedReason);
140
-
141
133
  if (apiMeter.accessToMeter !== undefined && apiMeter.accessToMeter !== null) {
142
134
  const strVal = String(apiMeter.accessToMeter).toLowerCase();
143
- if (strVal === "true" || strVal === "yes") setAccessToMeter({ name: "Yes" });
144
- else setAccessToMeter({ name: "No" });
135
+ if (strVal === "true" || strVal === "yes") accToMeter = { name: "Yes" };
136
+ else accToMeter = { name: "No" };
145
137
  }
146
138
 
147
139
  if (apiMeter.sewerConnection !== undefined && apiMeter.sewerConnection !== null) {
148
140
  const strVal = String(apiMeter.sewerConnection).toLowerCase();
149
- if (strVal === "true" || strVal === "yes") setSewerConnection({ name: "Yes" });
150
- else setSewerConnection({ name: "No" });
141
+ if (strVal === "true" || strVal === "yes") sewerConn = { name: "Yes" };
142
+ else sewerConn = { name: "No" };
151
143
  }
152
144
 
153
145
  if (apiMeter.septicTank !== undefined && apiMeter.septicTank !== null) {
154
146
  const strVal = String(apiMeter.septicTank).toLowerCase();
155
- if (strVal === "true" || strVal === "yes") setSepticTank({ name: "Yes" });
156
- else setSepticTank({ name: "No" });
147
+ if (strVal === "true" || strVal === "yes") sepTank = { name: "Yes" };
148
+ else sepTank = { name: "No" };
157
149
  }
158
150
 
159
- if (apiMeter.meterPhotoFileStoreId) setMeterPhotoId(apiMeter.meterPhotoFileStoreId);
151
+ const updatedDefaults = {
152
+ connectionCategory: savedData.connectionCategory || apiMeter.connectionCategory || "",
153
+ saType: savedData.saType || apiMeter.saType || "",
154
+ status: savedData.status || apiMeter.statusFlag || "",
155
+ mrCode: savedData.mrCode || (apiMeter.mrcode ? String(apiMeter.mrcode) : ""),
156
+ areaCode: savedData.areaCode || (apiMeter.areacode ? String(apiMeter.areacode) : ""),
157
+ mrKey: savedData.mrKey || (apiMeter.mrkey ? String(apiMeter.mrkey) : ""),
158
+ meterNumber: savedData.meterNumber || apiMeter.meterNumber || "",
159
+ meterMaker: savedData.meterMaker || apiMeter.meterMake || "",
160
+ meterStatus: savedData.meterStatus ? { name: savedData.meterStatus } : mStatus,
161
+ meterCondition: savedData.meterCondition ? { name: savedData.meterCondition } : mCondition,
162
+ meterLocation: savedData.meterLocation ? { name: savedData.meterLocation } : mLoc,
163
+ lastBillReceived: savedData.lastBillReceived ? { name: savedData.lastBillReceived } : billRec,
164
+ billMonthYear: savedData.billMonthYear ? { name: savedData.billMonthYear } : billMonYr,
165
+ reason: savedData.reason || apiMeter.lastBillNotRaisedReason || "",
166
+ accessToMeter: savedData.accessToMeter ? { name: savedData.accessToMeter } : accToMeter,
167
+ sewerConnection: savedData.sewerConnection ? { name: savedData.sewerConnection } : sewerConn,
168
+ septicTank: savedData.septicTank ? { name: savedData.septicTank } : sepTank,
169
+ meterPhoto: savedData.meterPhotoId || apiMeter.meterPhotoFileStoreId || null,
170
+ };
171
+
172
+ setDefaultValues(updatedDefaults);
173
+ setLocalFormData(updatedDefaults);
174
+ if (updatedDefaults.meterPhoto) {
175
+ setMeterPhotoId(updatedDefaults.meterPhoto);
176
+ }
177
+ setIsDataLoaded(true);
160
178
  }
161
- }, [searchData, formData?.connectionDetails]);
162
-
163
- // 🔹 FREEZE LOGIC
164
- const isFrozen = meterStatus?.name === "Can not be identified";
179
+ }, [searchData, formData?.connectionDetails, isDataLoaded]);
165
180
 
166
181
  // 🔹 FILE UPLOAD
167
- const uploadPhoto = async (e) => {
182
+ const handleUpload = async (e, onChange) => {
168
183
  const file = e.target.files[0];
169
184
  if (!file) return;
170
185
 
186
+ if (file.size > 2000000) {
187
+ setToast({ type: "error", message: t("Max size 2MB exceeded") });
188
+ return;
189
+ }
190
+
171
191
  try {
172
192
  const res = await Digit.UploadServices.Filestorage("EKYC", file, tenantId);
173
- const id = res?.data?.files?.[0]?.fileStoreId;
193
+ const fileStoreId = res?.data?.files?.[0]?.fileStoreId;
174
194
 
175
- if (id) {
176
- setMeterPhotoId(id);
195
+ if (fileStoreId) {
196
+ onChange(file.name);
197
+ setMeterPhotoId(fileStoreId);
177
198
 
178
199
  const reader = new FileReader();
179
200
  reader.onloadend = () => setMeterPhoto(reader.result);
180
201
  reader.readAsDataURL(file);
202
+
203
+ setToast({ type: "success", message: t("Upload successful") });
181
204
  }
182
205
  } catch {
183
- setToast({ type: "error", message: "Upload failed" });
206
+ setToast({ type: "error", message: t("Upload failed") });
184
207
  }
185
208
  };
186
209
 
187
- // 🔹 VALIDATION
188
- const isValid = () => {
189
- if (!connectionCategory) return false;
190
- if (!meterStatus) return false;
191
- if (!meterLocation) return false;
192
- if (!lastBillReceived) return false;
193
- if (!sewerConnection) return false;
210
+ const onFormValueChange = (setValue, data) => {
211
+ const meterStatusChanged =
212
+ (data?.meterStatus?.name || data?.meterStatus) !==
213
+ (localFormData?.meterStatus?.name || localFormData?.meterStatus);
194
214
 
195
- if (meterStatus?.name === "Metered" && !meterPhotoId) return false;
215
+ const lastBillReceivedChanged =
216
+ (data?.lastBillReceived?.name || data?.lastBillReceived) !==
217
+ (localFormData?.lastBillReceived?.name || localFormData?.lastBillReceived);
196
218
 
197
- if (lastBillReceived?.name === "No" && !reason) return false;
198
- if (lastBillReceived?.name === "Yes" && !billMonthYear) return false;
219
+ const sewerConnectionChanged =
220
+ (data?.sewerConnection?.name || data?.sewerConnection) !==
221
+ (localFormData?.sewerConnection?.name || localFormData?.sewerConnection);
199
222
 
200
- if (sewerConnection?.name === "No" && !septicTank) return false;
223
+ if (meterStatusChanged || lastBillReceivedChanged || sewerConnectionChanged) {
224
+ setLocalFormData((prev) => ({
225
+ ...prev,
226
+ ...data,
227
+ }));
228
+ }
201
229
 
202
- return true;
230
+ // Determine validation
231
+ const connCatVal = data?.connectionCategory;
232
+ const mStatusVal = data?.meterStatus;
233
+ const mLocVal = data?.meterLocation;
234
+ const billRecVal = data?.lastBillReceived;
235
+ const sewerConnVal = data?.sewerConnection;
236
+ const mPhotoId = meterPhotoId || data?.meterPhoto;
237
+ const reasonVal = data?.reason;
238
+ const billMonYrVal = data?.billMonthYear;
239
+ const sepTankVal = data?.septicTank;
240
+
241
+ let valid = true;
242
+ if (!connCatVal) valid = false;
243
+ if (!mStatusVal) valid = false;
244
+ if (!mLocVal) valid = false;
245
+ if (!billRecVal) valid = false;
246
+ if (!sewerConnVal) valid = false;
247
+
248
+ if (mStatusVal?.name === "Metered" && !mPhotoId) valid = false;
249
+ if (billRecVal?.name === "No" && !reasonVal) valid = false;
250
+ if (billRecVal?.name === "Yes" && !billMonYrVal) valid = false;
251
+ if (sewerConnVal?.name === "No" && !sepTankVal) valid = false;
252
+
253
+ if (valid !== canSubmit) {
254
+ setCanSubmit(valid);
255
+ }
203
256
  };
204
257
 
205
- // 🔹 SUBMIT
206
- const onStepSelect = async () => {
207
- /*
208
- if (!isValid()) {
209
- setToast({ type: "error", message: "Fill all mandatory fields" });
210
- return;
211
- }
212
- */
213
-
214
- const data = {
215
- connectionCategory,
216
- saType,
217
- status,
218
- mrCode,
219
- areaCode,
220
- mrKey,
221
- meterNumber,
222
- meterMaker,
223
- meterStatus: meterStatus?.name,
224
- meterCondition: meterCondition?.name,
225
- meterLocation: meterLocation?.name,
226
- lastBillReceived: lastBillReceived?.name,
227
- billMonthYear: billMonthYear?.name,
228
- reason,
229
- accessToMeter: accessToMeter?.name,
230
- sewerConnection: sewerConnection?.name,
231
- septicTank: septicTank?.name,
232
- meterPhotoId,
258
+ const onSubmit = async (data) => {
259
+ const submitData = {
260
+ connectionCategory: data.connectionCategory,
261
+ saType: data.saType,
262
+ status: data.status,
263
+ mrCode: data.mrCode,
264
+ areaCode: data.areaCode,
265
+ mrKey: data.mrKey,
266
+ meterNumber: data.meterNumber,
267
+ meterMaker: data.meterMaker,
268
+ meterStatus: data.meterStatus?.name || data.meterStatus,
269
+ meterCondition: data.meterCondition?.name || data.meterCondition,
270
+ meterLocation: data.meterLocation?.name || data.meterLocation,
271
+ lastBillReceived: data.lastBillReceived?.name || data.lastBillReceived,
272
+ billMonthYear: data.billMonthYear?.name || data.billMonthYear,
273
+ reason: data.reason,
274
+ accessToMeter: data.accessToMeter?.name || data.accessToMeter,
275
+ sewerConnection: data.sewerConnection?.name || data.sewerConnection,
276
+ septicTank: data.septicTank?.name || data.septicTank,
277
+ meterPhotoId: meterPhotoId,
233
278
  };
234
279
 
235
280
  try {
@@ -237,12 +282,12 @@ const MeterDetails = ({ config, onSelect, formData }) => {
237
282
  RequestInfo: {},
238
283
  updateType: "METER",
239
284
  kno: searchKno,
240
- ...data,
285
+ ...submitData,
241
286
  });
242
- setToast({ type: "success", message: "Meter details updated successfully!" });
243
- onSelect(config.key, data);
287
+ setToast({ type: "success", message: t("Meter details updated successfully!") });
288
+ onSelect(config.key, submitData);
244
289
  } catch (error) {
245
- setToast({ type: "error", message: "Failed to update meter details" });
290
+ setToast({ type: "error", message: t("Failed to update meter details") });
246
291
  }
247
292
  };
248
293
 
@@ -250,121 +295,40 @@ const MeterDetails = ({ config, onSelect, formData }) => {
250
295
  return <Loader />;
251
296
  }
252
297
 
298
+ const Config = MeterDetailsConfig(
299
+ t,
300
+ localFormData,
301
+ handleUpload,
302
+ meterPhoto,
303
+ meterPhotoId,
304
+ setMeterPhoto,
305
+ setMeterPhotoId
306
+ );
307
+
253
308
  return (
254
309
  <Fragment>
255
- <FormStep onSelect={onStepSelect} config={config} isDisabled={!isValid()}>
256
- <div>
257
- <CardLabel>Connection Category *</CardLabel>
258
- <TextInput value={connectionCategory} onChange={(e) => setConnectionCategory(e.target.value)} />
259
- </div>
260
-
261
- <div>
262
- <CardLabel>SA Type</CardLabel>
263
- <TextInput value={saType} onChange={(e) => setSaType(e.target.value)} />
264
- </div>
265
-
266
- <div>
267
- <CardLabel>Status</CardLabel>
268
- <TextInput value={status} onChange={(e) => setStatus(e.target.value)} />
269
- </div>
270
-
271
- <div>
272
- <CardLabel>MR Code</CardLabel>
273
- <TextInput value={mrCode} onChange={(e) => setMrCode(e.target.value)} />
274
- </div>
275
-
276
- <div>
277
- <CardLabel>Area Code</CardLabel>
278
- <TextInput value={areaCode} onChange={(e) => setAreaCode(e.target.value)} />
279
- </div>
280
-
281
- <div>
282
- <CardLabel>MR Key</CardLabel>
283
- <TextInput value={mrKey} onChange={(e) => setMrKey(e.target.value)} />
284
- </div>
285
-
286
- {!isFrozen && (
287
- <Fragment>
288
- <div>
289
- <CardLabel>Meter Number</CardLabel>
290
- <TextInput value={meterNumber} onChange={(e) => setMeterNumber(e.target.value)} />
291
- </div>
292
-
293
- <div>
294
- <CardLabel>Meter Maker</CardLabel>
295
- <TextInput value={meterMaker} onChange={(e) => setMeterMaker(e.target.value)} />
296
- </div>
297
-
298
- <div>
299
- <CardLabel>Meter Condition</CardLabel>
300
- <Dropdown option={meterConditionOptions} selected={meterCondition} select={setMeterCondition} />
301
- </div>
302
-
303
- {meterStatus?.name === "Metered" && (
304
- <Fragment>
305
- <div>
306
- <CardLabel>Meter Photo *</CardLabel>
307
- <UploadFile onUpload={uploadPhoto} message={meterPhotoId ? "Uploaded" : "No file"} />
308
- </div>
309
- {meterPhoto && (
310
- <div style={{ gridColumn: "span 2" }}>
311
- <img src={meterPhoto} style={{ width: "100%" }} />
312
- </div>
313
- )}
314
- </Fragment>
315
- )}
316
- </Fragment>
317
- )}
318
-
319
- <div>
320
- <CardLabel>Meter Status *</CardLabel>
321
- <Dropdown option={meterStatusOptions} selected={meterStatus} select={setMeterStatus} />
322
- </div>
323
-
324
- <div>
325
- <CardLabel>Meter Location *</CardLabel>
326
- <Dropdown option={meterLocationOptions} selected={meterLocation} select={setMeterLocation} />
327
- </div>
328
-
329
- <div>
330
- <CardLabel>Last Bill Received *</CardLabel>
331
- <Dropdown option={yesNo} selected={lastBillReceived} select={setLastBillReceived} />
332
- </div>
333
-
334
- {lastBillReceived?.name === "Yes" && (
335
- <div>
336
- <CardLabel>When was the last bill received *</CardLabel>
337
- <Dropdown option={monthYearOptions} selected={billMonthYear} select={setBillMonthYear} />
338
- </div>
339
- )}
340
-
341
- {lastBillReceived?.name === "No" && (
342
- <div>
343
- <CardLabel>Reason *</CardLabel>
344
- <TextInput value={reason} onChange={(e) => setReason(e.target.value)} />
345
- </div>
346
- )}
347
-
348
- <div>
349
- <CardLabel>Access to Meter</CardLabel>
350
- <Dropdown option={yesNo} selected={accessToMeter} select={setAccessToMeter} />
351
- </div>
352
-
353
- <div>
354
- <CardLabel>Sewer Connection *</CardLabel>
355
- <Dropdown option={yesNo} selected={sewerConnection} select={setSewerConnection} />
356
- </div>
357
-
358
- {sewerConnection?.name === "No" && (
359
- <div>
360
- <CardLabel>Septic Tank *</CardLabel>
361
- <Dropdown option={yesNo} selected={septicTank} select={setSepticTank} />
362
- </div>
363
- )}
364
-
365
- {toast && <Toast label={toast.message} error={toast.type === "error"} onClose={() => setToast(null)} />}
366
-
367
- </FormStep>
310
+ <FormComposer
311
+ key={isDataLoaded ? "loaded" : "loading"}
312
+ isDisabled={!canSubmit}
313
+ label={t("ES_COMMON_CONTINUE")}
314
+ config={Config.map((item) => ({
315
+ ...item,
316
+ isCollapsible: true,
317
+ isDefaultOpen: true,
318
+ }))}
319
+ onSubmit={onSubmit}
320
+ defaultValues={defaultValues}
321
+ onFormValueChange={onFormValueChange}
322
+ noCard={false}
323
+ submitInForm={true}
324
+ />
325
+ {toast && (
326
+ <Toast
327
+ error={toast.type === "error"}
328
+ label={toast.message}
329
+ onClose={() => setToast(null)}
330
+ />
331
+ )}
368
332
  </Fragment>
369
333
  );
370
334
  };