@djb25/digit-ui-module-ekyc 1.0.17 → 1.0.19

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@djb25/digit-ui-module-ekyc",
3
- "version": "1.0.17",
3
+ "version": "1.0.19",
4
4
  "description": "Digit UI Module for Ekyc",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.modern.js",
@@ -33,23 +33,6 @@ const AssignEkyc = () => {
33
33
  { enabled: !!tenantId, keepPreviousData: true }
34
34
  );
35
35
 
36
- const handleSort = useCallback((args) => {
37
- if (args?.length === 0) return;
38
- setSortParams(args);
39
- }, []);
40
-
41
- const fetchNextPage = () => {
42
- setPageOffset((prevState) => prevState + pageSize);
43
- };
44
-
45
- const fetchPrevPage = () => {
46
- setPageOffset((prevState) => prevState - pageSize);
47
- };
48
-
49
- const handlePageSizeChange = (e) => {
50
- setPageSize(Number(e.target.value));
51
- };
52
-
53
36
  const searchDetails = useMemo(
54
37
  () => ({
55
38
  kno: formState?.searchForm?.kNumber || "",
@@ -1,225 +1,182 @@
1
- import React, { useMemo, useState } from "react";
2
- import { Modal, Close } from "@djb25/digit-ui-react-components";
1
+ import React, { useMemo, useState, useEffect } from "react";
2
+ import { Modal, Close, Table } from "@djb25/digit-ui-react-components";
3
3
 
4
4
  const AssignEkycModal = ({ surveyor, closeModal }) => {
5
5
  const [selectedKnos, setSelectedKnos] = useState([]);
6
-
6
+ const [assignmentType, setAssignmentType] = useState("KNO");
7
+ const [currentPage, setCurrentPage] = useState(0);
8
+ const [pageSize, setPageSize] = useState(10);
7
9
  const [filters, setFilters] = useState({
10
+ kno: "", // search value
11
+ ekycStatus: "",
12
+ zoneName: "",
13
+ assembly: "",
14
+ ward: "",
15
+ mrkey: "",
8
16
  pincode: "",
9
- locality: "",
10
- status: "",
11
- route: "",
12
- search: "",
13
17
  });
14
18
 
15
- // eslint-disable-next-line react-hooks/exhaustive-deps
16
- const knoList = [
17
- {
18
- kno: "1029384756",
19
- consumerName: "Rahul Sharma",
20
- locality: "Rohini",
21
- pincode: "110085",
22
- status: "PENDING",
23
- route: "R1",
24
- },
25
- {
26
- kno: "9283746555",
27
- consumerName: "Amit Kumar",
28
- locality: "Pitampura",
29
- pincode: "110034",
30
- status: "VERIFIED",
31
- route: "R2",
32
- },
33
- {
34
- kno: "8473625147",
35
- consumerName: "Neha Verma",
36
- locality: "Dwarka",
37
- pincode: "110075",
38
- status: "PENDING",
39
- route: "R3",
40
- },
41
- {
42
- kno: "5647382910",
43
- consumerName: "Sanjay Singh",
44
- locality: "Janakpuri",
45
- pincode: "110058",
46
- status: "ASSIGNED",
47
- route: "R1",
48
- },
49
- {
50
- kno: "9182736450",
51
- consumerName: "Priya Mehta",
52
- locality: "Laxmi Nagar",
53
- pincode: "110092",
54
- status: "PENDING",
55
- route: "R4",
56
- },
57
- {
58
- kno: "7463829105",
59
- consumerName: "Vikas Gupta",
60
- locality: "Karol Bagh",
61
- pincode: "110005",
62
- status: "VERIFIED",
63
- route: "R2",
64
- },
65
- {
66
- kno: "1122334455",
67
- consumerName: "Anjali Kapoor",
68
- locality: "Saket",
69
- pincode: "110017",
70
- status: "PENDING",
71
- route: "R5",
72
- },
73
- {
74
- kno: "6677889900",
75
- consumerName: "Rohit Yadav",
76
- locality: "Uttam Nagar",
77
- pincode: "110059",
78
- status: "ASSIGNED",
79
- route: "R3",
80
- },
81
- {
82
- kno: "8899776655",
83
- consumerName: "Deepak Chauhan",
84
- locality: "Burari",
85
- pincode: "110084",
86
- status: "PENDING",
87
- route: "R6",
88
- },
89
- {
90
- kno: "5544332211",
91
- consumerName: "Sneha Arora",
92
- locality: "Shahdara",
93
- pincode: "110032",
94
- status: "VERIFIED",
95
- route: "R4",
96
- },
97
- {
98
- kno: "3344556677",
99
- consumerName: "Karan Malhotra",
100
- locality: "Mayur Vihar",
101
- pincode: "110091",
102
- status: "PENDING",
103
- route: "R7",
104
- },
105
- {
106
- kno: "9988776654",
107
- consumerName: "Pooja Bansal",
108
- locality: "Patel Nagar",
109
- pincode: "110008",
110
- status: "ASSIGNED",
111
- route: "R5",
112
- },
113
- {
114
- kno: "7766554433",
115
- consumerName: "Harsh Jain",
116
- locality: "Punjabi Bagh",
117
- pincode: "110026",
118
- status: "PENDING",
119
- route: "R8",
120
- },
121
- {
122
- kno: "2233445566",
123
- consumerName: "Nitin Sharma",
124
- locality: "Rajouri Garden",
125
- pincode: "110027",
126
- status: "VERIFIED",
127
- route: "R1",
128
- },
129
- {
130
- kno: "4433221100",
131
- consumerName: "Megha Sethi",
132
- locality: "Ashok Vihar",
133
- pincode: "110052",
134
- status: "PENDING",
135
- route: "R9",
136
- },
137
- {
138
- kno: "1010101010",
139
- consumerName: "Aditya Rana",
140
- locality: "Model Town",
141
- pincode: "110009",
142
- status: "ASSIGNED",
143
- route: "R10",
144
- },
19
+ const getAssignmentValue = () => {
20
+ switch (assignmentType) {
21
+ case "MRKEY":
22
+ return filters.mrkey;
23
+
24
+ case "ASSEMBLY":
25
+ return filters.assembly;
26
+
27
+ case "WARD":
28
+ return filters.ward;
29
+
30
+ case "KNO":
31
+ default:
32
+ return selectedKnos.join(",");
33
+ }
34
+ };
35
+
36
+ const [debouncedFilters, setDebouncedFilters] = useState(filters);
37
+
38
+ useEffect(() => {
39
+ const timer = setTimeout(() => {
40
+ setDebouncedFilters(filters);
41
+ }, 500);
42
+
43
+ return () => clearTimeout(timer);
44
+ }, [filters]);
45
+
46
+ useEffect(() => {
47
+ setCurrentPage(0);
48
+ }, [debouncedFilters]);
49
+
50
+ const { data: applicationData, isLoading } = Digit.Hooks.ekyc.useEkycApplicationList(
145
51
  {
146
- kno: "2020202020",
147
- consumerName: "Simran Kaur",
148
- locality: "Tilak Nagar",
149
- pincode: "110018",
150
- status: "PENDING",
151
- route: "R11",
52
+ ...(debouncedFilters.kno && {
53
+ kno: debouncedFilters.kno,
54
+ }),
55
+
56
+ ...(debouncedFilters.ekycStatus && {
57
+ ekycStatus: debouncedFilters.ekycStatus,
58
+ }),
59
+
60
+ ...(debouncedFilters.zoneName && {
61
+ zoneName: debouncedFilters.zoneName,
62
+ }),
63
+
64
+ ...(debouncedFilters.assembly && {
65
+ assembly: debouncedFilters.assembly,
66
+ }),
67
+
68
+ ...(debouncedFilters.ward && {
69
+ ward: debouncedFilters.ward,
70
+ }),
71
+
72
+ ...(debouncedFilters.mrkey && {
73
+ mrkey: debouncedFilters.mrkey,
74
+ }),
75
+
76
+ ...(debouncedFilters.pincode && {
77
+ pincode: debouncedFilters.pincode,
78
+ }),
152
79
  },
153
80
  {
154
- kno: "3030303030",
155
- consumerName: "Mohit Saini",
156
- locality: "Narela",
157
- pincode: "110040",
158
- status: "VERIFIED",
159
- route: "R6",
81
+ tenantId: "dl.djb",
82
+ offset: currentPage * pageSize,
83
+ limit: pageSize,
160
84
  },
161
85
  {
162
- kno: "4040404040",
163
- consumerName: "Ritika Sharma",
164
- locality: "Bawana",
165
- pincode: "110039",
166
- status: "PENDING",
167
- route: "R7",
86
+ keepPreviousData: true,
87
+ }
88
+ );
89
+
90
+ const assignmentMutation = Digit.Hooks.ekyc.useEkycAssignmentCreate({
91
+ onSuccess: (response) => {
92
+ console.log("Assignment successful", response);
93
+ closeModal();
168
94
  },
169
- {
170
- kno: "5050505050",
171
- consumerName: "Yash Aggarwal",
172
- locality: "Okhla",
173
- pincode: "110020",
174
- status: "ASSIGNED",
175
- route: "R8",
95
+ onError: (error) => {
96
+ console.error("Assignment failed", error);
97
+ // show toast here
176
98
  },
177
- ];
178
-
179
- const filteredKnos = useMemo(() => {
180
- return knoList.filter((item) => {
181
- const matchesPincode = filters.pincode ? item.pincode.includes(filters.pincode) : true;
182
-
183
- const matchesLocality = filters.locality ? item.locality.toLowerCase().includes(filters.locality.toLowerCase()) : true;
184
-
185
- const matchesStatus = filters.status ? item.status === filters.status : true;
186
-
187
- const matchesRoute = filters.route ? item.route.toLowerCase().includes(filters.route.toLowerCase()) : true;
99
+ });
188
100
 
189
- const matchesSearch = filters.search
190
- ? item.kno.includes(filters.search) || item.consumerName.toLowerCase().includes(filters.search.toLowerCase())
191
- : true;
101
+ const tableData = applicationData?.consumerList || [];
192
102
 
193
- return matchesPincode && matchesLocality && matchesStatus && matchesRoute && matchesSearch;
103
+ const handleAssign = () => {
104
+ assignmentMutation.mutate({
105
+ tenantId: "dl.djb",
106
+ surveyorId: surveyor?.uuid,
107
+ assignmentType: "KNO",
108
+ assignmentValue: getAssignmentValue(),
194
109
  });
195
- }, [filters, knoList]);
196
-
197
- const handleSelect = (kno) => {
198
- setSelectedKnos((prev) => (prev.includes(kno) ? prev.filter((item) => item !== kno) : [...prev, kno]));
199
110
  };
200
111
 
201
112
  const handleSelectAll = () => {
202
- const visibleKnos = filteredKnos.map((item) => item.kno);
113
+ const pageKnos = tableData.map((item) => item.kno);
203
114
 
204
- const allSelected = visibleKnos.every((kno) => selectedKnos.includes(kno));
115
+ const allSelected = pageKnos.length > 0 && pageKnos.every((kno) => selectedKnos.includes(kno));
205
116
 
206
- if (allSelected) {
207
- setSelectedKnos((prev) => prev.filter((kno) => !visibleKnos.includes(kno)));
208
- } else {
209
- setSelectedKnos((prev) => [...new Set([...prev, ...visibleKnos])]);
210
- }
117
+ setSelectedKnos((prev) => (allSelected ? prev.filter((kno) => !pageKnos.includes(kno)) : [...new Set([...prev, ...pageKnos])]));
211
118
  };
212
119
 
213
- const handleAssign = () => {
214
- const payload = {
215
- surveyorId: surveyor?.uuid,
216
- knos: selectedKnos,
217
- filters,
218
- };
120
+ const handleFilterChange = (key, value) => {
121
+ setFilters((prev) => ({
122
+ ...prev,
123
+ [key]: value,
124
+ }));
125
+ };
219
126
 
220
- console.log(payload);
127
+ const columns = useMemo(
128
+ () => [
129
+ {
130
+ Header: () => (
131
+ <input
132
+ type="checkbox"
133
+ checked={tableData.length > 0 && tableData.every((item) => selectedKnos.includes(item.kno))}
134
+ onChange={handleSelectAll}
135
+ />
136
+ ),
137
+ id: "selection",
138
+ Cell: ({ row }) => {
139
+ const kno = row.original.kno;
140
+
141
+ return <input type="checkbox" checked={selectedKnos.includes(kno)} onChange={() => handleSelect(kno)} />;
142
+ },
143
+ },
144
+ {
145
+ Header: "KNO",
146
+ accessor: "kno",
147
+ },
148
+ {
149
+ Header: "Consumer Name",
150
+ accessor: (row) => `${row.firstName || ""} ${row.middleName || ""} ${row.lastName || ""}`.trim(),
151
+ id: "consumerName",
152
+ },
153
+ {
154
+ Header: "Zone",
155
+ accessor: "zoneName",
156
+ },
157
+ {
158
+ Header: "Pincode",
159
+ accessor: "pincode",
160
+ },
161
+ {
162
+ Header: "Status",
163
+ accessor: "status",
164
+ Cell: ({ value }) => (
165
+ <span className={`status-badge ${value === "ACTIVE" ? "verified" : value === "PENDING" ? "pending" : "assigned"}`}>{value}</span>
166
+ ),
167
+ },
168
+ {
169
+ Header: "eKYC Status",
170
+ accessor: "ekycStatus",
171
+ Cell: ({ value }) => value || "-",
172
+ },
173
+ ],
174
+ // eslint-disable-next-line react-hooks/exhaustive-deps
175
+ [selectedKnos, tableData]
176
+ );
221
177
 
222
- closeModal();
178
+ const handleSelect = (kno) => {
179
+ setSelectedKnos((prev) => (prev.includes(kno) ? prev.filter((item) => item !== kno) : [...prev, kno]));
223
180
  };
224
181
 
225
182
  return (
@@ -234,126 +191,81 @@ const AssignEkycModal = ({ surveyor, closeModal }) => {
234
191
  <div className="assign-knos-modal">
235
192
  {/* Filters */}
236
193
  <div className="filters-grid">
237
- <input
238
- className="form-control"
239
- placeholder="Search by KNO / Consumer"
240
- value={filters.search}
241
- onChange={(e) =>
242
- setFilters({
243
- ...filters,
244
- search: e.target.value,
245
- })
246
- }
247
- />
194
+ <input className="form-control" placeholder="KNO" value={filters.kno} onChange={(e) => handleFilterChange("kno", e.target.value)} />
248
195
 
249
196
  <input
250
197
  className="form-control"
251
198
  placeholder="Pincode"
252
199
  value={filters.pincode}
253
- onChange={(e) =>
254
- setFilters({
255
- ...filters,
256
- pincode: e.target.value,
257
- })
258
- }
200
+ onChange={(e) => handleFilterChange("pincode", e.target.value)}
259
201
  />
260
202
 
261
203
  <input
262
204
  className="form-control"
263
- placeholder="Locality"
264
- value={filters.locality}
265
- onChange={(e) =>
266
- setFilters({
267
- ...filters,
268
- locality: e.target.value,
269
- })
270
- }
205
+ placeholder="Zone"
206
+ value={filters.zoneName}
207
+ onChange={(e) => handleFilterChange("zoneName", e.target.value)}
271
208
  />
272
209
 
210
+ <input className="form-control" placeholder="Ward" value={filters.ward} onChange={(e) => handleFilterChange("ward", e.target.value)} />
211
+
273
212
  <input
274
213
  className="form-control"
275
- placeholder="Route"
276
- value={filters.route}
277
- onChange={(e) =>
278
- setFilters({
279
- ...filters,
280
- route: e.target.value,
281
- })
282
- }
214
+ placeholder="Assembly"
215
+ value={filters.assembly}
216
+ onChange={(e) => handleFilterChange("assembly", e.target.value)}
283
217
  />
284
218
 
285
- <select
286
- className="form-control"
287
- value={filters.status}
288
- onChange={(e) =>
289
- setFilters({
290
- ...filters,
291
- status: e.target.value,
292
- })
293
- }
294
- >
295
- <option value="">All Status</option>
219
+ <input className="form-control" placeholder="MR Key" value={filters.mrkey} onChange={(e) => handleFilterChange("mrkey", e.target.value)} />
220
+
221
+ <select className="form-control" value={filters.ekycStatus} onChange={(e) => handleFilterChange("ekycStatus", e.target.value)}>
222
+ <option value="">All eKYC Status</option>
296
223
  <option value="PENDING">Pending</option>
297
- <option value="VERIFIED">Verified</option>
298
- <option value="ASSIGNED">Assigned</option>
224
+ <option value="APPROVED">Approved</option>
225
+ <option value="REJECTED">Rejected</option>
299
226
  </select>
300
- </div>
301
227
 
302
- {/* Summary */}
303
- <div className="summary-bar">
304
- <div>Total Records: {filteredKnos.length}</div>
305
- <div>Selected KNOs: {selectedKnos.length}</div>
228
+ <select className="form-control" value={assignmentType} onChange={(e) => setAssignmentType(e.target.value)}>
229
+ <option value="KNO">KNO</option>
230
+ <option value="MRKEY">MR Key</option>
231
+ <option value="WARD">Ward</option>
232
+ <option value="ASSEMBLY">Assembly</option>
233
+ </select>
306
234
  </div>
307
235
 
308
236
  {/* Table */}
309
- <div className="table-wrapper">
310
- {/* Header */}
311
- <div className="table-header">
312
- <div>
313
- <input
314
- type="checkbox"
315
- checked={filteredKnos.length > 0 && filteredKnos.every((item) => selectedKnos.includes(item.kno))}
316
- onChange={handleSelectAll}
317
- />
318
- </div>
319
-
320
- <div>KNO</div>
321
- <div>Consumer Name</div>
322
- <div>Locality</div>
323
- <div>Pincode</div>
324
- <div>Status</div>
325
- <div>Route</div>
326
- </div>
327
-
328
- {/* Rows */}
329
- <div className="table-body">
330
- {filteredKnos.length > 0 ? (
331
- filteredKnos.map((item, index) => (
332
- <div key={item.kno} className={`table-row ${index % 2 === 0 ? "even" : "odd"}`}>
333
- <div>
334
- <input type="checkbox" checked={selectedKnos.includes(item.kno)} onChange={() => handleSelect(item.kno)} />
335
- </div>
336
-
337
- <div className="kno-value">{item.kno}</div>
338
-
339
- <div>{item.consumerName}</div>
340
- <div>{item.locality}</div>
341
- <div>{item.pincode}</div>
342
-
343
- <div>
344
- <span className={`status-badge ${item.status === "PENDING" ? "pending" : item.status === "VERIFIED" ? "verified" : "assigned"}`}>
345
- {item.status}
346
- </span>
347
- </div>
348
-
349
- <div>{item.route}</div>
350
- </div>
351
- ))
352
- ) : (
353
- <div className="empty-state">No KNO records found</div>
354
- )}
355
- </div>
356
- </div>
237
+ <Table
238
+ tableTitle="eKYC Applications"
239
+ tableClass="ekycTable"
240
+ data={tableData}
241
+ columns={columns}
242
+ isLoading={isLoading}
243
+ totalRecords={applicationData?.totalCount || 0}
244
+ currentPage={currentPage}
245
+ pageSizeLimit={pageSize}
246
+ manualPagination={true}
247
+ isPaginationRequired={true}
248
+ onNextPage={() => {
249
+ if (currentPage < (applicationData?.totalPages || 1) - 1) {
250
+ setCurrentPage((prev) => prev + 1);
251
+ }
252
+ }}
253
+ onPrevPage={() => {
254
+ if (currentPage > 0) {
255
+ setCurrentPage((prev) => prev - 1);
256
+ }
257
+ }}
258
+ onFirstPage={() => {
259
+ setCurrentPage(0);
260
+ }}
261
+ onLastPage={() => {
262
+ setCurrentPage(Math.max((applicationData?.totalPages || 1) - 1, 0));
263
+ }}
264
+ onPageSizeChange={(e) => {
265
+ setPageSize(Number(e.target.value));
266
+ setCurrentPage(0);
267
+ }}
268
+ />
357
269
  </div>
358
270
  </Modal>
359
271
  );
@@ -23,16 +23,19 @@ const Inbox = ({ parentRoute, businessService = "EKYC", initialStates = {}, filt
23
23
 
24
24
  const [formState, dispatch] = useReducer(formReducer, formInitValue);
25
25
 
26
+ const filters = useMemo(() => {
27
+ return formState?.searchForm || {};
28
+ }, [formState?.searchForm]);
29
+
26
30
  const queryParams = useMemo(() => {
27
31
  return {
28
32
  tenantId,
29
33
  offset: formState?.tableForm?.offset || 0,
30
34
  limit: formState?.tableForm?.limit || 10,
31
- search: formState?.searchForm || {},
32
35
  };
33
- }, [tenantId, formState?.tableForm?.offset, formState?.tableForm?.limit, formState?.searchForm]);
36
+ }, [tenantId, formState?.tableForm?.offset, formState?.tableForm?.limit]);
34
37
 
35
- const { isLoading: isListLoading, data: listData = {} } = Digit.Hooks.ekyc.useEkycApplicationList({}, queryParams, {
38
+ const { isLoading: isListLoading, data: listData = {} } = Digit.Hooks.ekyc.useEkycApplicationList(filters, queryParams, {
36
39
  enabled: !!tenantId,
37
40
  keepPreviousData: true,
38
41
  });
@@ -247,11 +250,11 @@ const Inbox = ({ parentRoute, businessService = "EKYC", initialStates = {}, filt
247
250
  propsForInboxTable,
248
251
  // propsForInboxMobileCards,
249
252
  formState,
250
- countData: listData,
251
- }}
252
- />
253
- </div>
254
- );
253
+ countData: listData,
254
+ }}
255
+ />
256
+ </div>
257
+ );
255
258
  };
256
259
 
257
260
  export default Inbox;