@djb25/digit-ui-module-ekyc 1.0.16 → 1.0.18

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.16",
3
+ "version": "1.0.18",
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,181 @@
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
- },
145
- {
146
- kno: "2020202020",
147
- consumerName: "Simran Kaur",
148
- locality: "Tilak Nagar",
149
- pincode: "110018",
150
- status: "PENDING",
151
- route: "R11",
152
- },
153
- {
154
- kno: "3030303030",
155
- consumerName: "Mohit Saini",
156
- locality: "Narela",
157
- pincode: "110040",
158
- status: "VERIFIED",
159
- route: "R6",
160
- },
161
- {
162
- kno: "4040404040",
163
- consumerName: "Ritika Sharma",
164
- locality: "Bawana",
165
- pincode: "110039",
166
- status: "PENDING",
167
- route: "R7",
168
- },
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(
169
51
  {
170
- kno: "5050505050",
171
- consumerName: "Yash Aggarwal",
172
- locality: "Okhla",
173
- pincode: "110020",
174
- status: "ASSIGNED",
175
- route: "R8",
176
- },
177
- ];
52
+ tenantId: "dl.djb",
53
+ offset: currentPage * pageSize,
54
+ limit: pageSize,
178
55
 
179
- const filteredKnos = useMemo(() => {
180
- return knoList.filter((item) => {
181
- const matchesPincode = filters.pincode ? item.pincode.includes(filters.pincode) : true;
56
+ ...(debouncedFilters.kno && {
57
+ kno: debouncedFilters.kno,
58
+ }),
182
59
 
183
- const matchesLocality = filters.locality ? item.locality.toLowerCase().includes(filters.locality.toLowerCase()) : true;
60
+ ...(debouncedFilters.ekycStatus && {
61
+ ekycStatus: debouncedFilters.ekycStatus,
62
+ }),
184
63
 
185
- const matchesStatus = filters.status ? item.status === filters.status : true;
64
+ ...(debouncedFilters.zoneName && {
65
+ zoneName: debouncedFilters.zoneName,
66
+ }),
186
67
 
187
- const matchesRoute = filters.route ? item.route.toLowerCase().includes(filters.route.toLowerCase()) : true;
68
+ ...(debouncedFilters.assembly && {
69
+ assembly: debouncedFilters.assembly,
70
+ }),
188
71
 
189
- const matchesSearch = filters.search
190
- ? item.kno.includes(filters.search) || item.consumerName.toLowerCase().includes(filters.search.toLowerCase())
191
- : true;
72
+ ...(debouncedFilters.ward && {
73
+ ward: debouncedFilters.ward,
74
+ }),
192
75
 
193
- return matchesPincode && matchesLocality && matchesStatus && matchesRoute && matchesSearch;
194
- });
195
- }, [filters, knoList]);
76
+ ...(debouncedFilters.mrkey && {
77
+ mrkey: debouncedFilters.mrkey,
78
+ }),
196
79
 
197
- const handleSelect = (kno) => {
198
- setSelectedKnos((prev) => (prev.includes(kno) ? prev.filter((item) => item !== kno) : [...prev, kno]));
80
+ ...(debouncedFilters.pincode && {
81
+ pincode: debouncedFilters.pincode,
82
+ }),
83
+ },
84
+ {
85
+ keepPreviousData: true,
86
+ }
87
+ );
88
+
89
+ const assignmentMutation = Digit.Hooks.ekyc.useEkycAssignmentCreate({
90
+ onSuccess: (response) => {
91
+ console.log("Assignment successful", response);
92
+ closeModal();
93
+ },
94
+ onError: (error) => {
95
+ console.error("Assignment failed", error);
96
+ // show toast here
97
+ },
98
+ });
99
+
100
+ const tableData = applicationData?.consumerList || [];
101
+
102
+ const handleAssign = () => {
103
+ assignmentMutation.mutate({
104
+ tenantId: "dl.djb",
105
+ surveyorId: surveyor?.uuid,
106
+ assignmentType: "KNO",
107
+ assignmentValue: getAssignmentValue(),
108
+ });
199
109
  };
200
110
 
201
111
  const handleSelectAll = () => {
202
- const visibleKnos = filteredKnos.map((item) => item.kno);
112
+ const pageKnos = tableData.map((item) => item.kno);
203
113
 
204
- const allSelected = visibleKnos.every((kno) => selectedKnos.includes(kno));
114
+ const allSelected = pageKnos.length > 0 && pageKnos.every((kno) => selectedKnos.includes(kno));
205
115
 
206
- if (allSelected) {
207
- setSelectedKnos((prev) => prev.filter((kno) => !visibleKnos.includes(kno)));
208
- } else {
209
- setSelectedKnos((prev) => [...new Set([...prev, ...visibleKnos])]);
210
- }
116
+ setSelectedKnos((prev) => (allSelected ? prev.filter((kno) => !pageKnos.includes(kno)) : [...new Set([...prev, ...pageKnos])]));
211
117
  };
212
118
 
213
- const handleAssign = () => {
214
- const payload = {
215
- surveyorId: surveyor?.uuid,
216
- knos: selectedKnos,
217
- filters,
218
- };
119
+ const handleFilterChange = (key, value) => {
120
+ setFilters((prev) => ({
121
+ ...prev,
122
+ [key]: value,
123
+ }));
124
+ };
125
+
126
+ const columns = useMemo(
127
+ () => [
128
+ {
129
+ Header: () => (
130
+ <input
131
+ type="checkbox"
132
+ checked={tableData.length > 0 && tableData.every((item) => selectedKnos.includes(item.kno))}
133
+ onChange={handleSelectAll}
134
+ />
135
+ ),
136
+ id: "selection",
137
+ Cell: ({ row }) => {
138
+ const kno = row.original.kno;
219
139
 
220
- console.log(payload);
140
+ return <input type="checkbox" checked={selectedKnos.includes(kno)} onChange={() => handleSelect(kno)} />;
141
+ },
142
+ },
143
+ {
144
+ Header: "KNO",
145
+ accessor: "kno",
146
+ },
147
+ {
148
+ Header: "Consumer Name",
149
+ accessor: (row) => `${row.firstName || ""} ${row.middleName || ""} ${row.lastName || ""}`.trim(),
150
+ id: "consumerName",
151
+ },
152
+ {
153
+ Header: "Zone",
154
+ accessor: "zoneName",
155
+ },
156
+ {
157
+ Header: "Pincode",
158
+ accessor: "pincode",
159
+ },
160
+ {
161
+ Header: "Status",
162
+ accessor: "status",
163
+ Cell: ({ value }) => (
164
+ <span className={`status-badge ${value === "ACTIVE" ? "verified" : value === "PENDING" ? "pending" : "assigned"}`}>{value}</span>
165
+ ),
166
+ },
167
+ {
168
+ Header: "eKYC Status",
169
+ accessor: "ekycStatus",
170
+ Cell: ({ value }) => value || "-",
171
+ },
172
+ ],
173
+ // eslint-disable-next-line react-hooks/exhaustive-deps
174
+ [selectedKnos, tableData]
175
+ );
221
176
 
222
- closeModal();
177
+ const handleSelect = (kno) => {
178
+ setSelectedKnos((prev) => (prev.includes(kno) ? prev.filter((item) => item !== kno) : [...prev, kno]));
223
179
  };
224
180
 
225
181
  return (
@@ -234,126 +190,81 @@ const AssignEkycModal = ({ surveyor, closeModal }) => {
234
190
  <div className="assign-knos-modal">
235
191
  {/* Filters */}
236
192
  <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
- />
193
+ <input className="form-control" placeholder="KNO" value={filters.kno} onChange={(e) => handleFilterChange("kno", e.target.value)} />
248
194
 
249
195
  <input
250
196
  className="form-control"
251
197
  placeholder="Pincode"
252
198
  value={filters.pincode}
253
- onChange={(e) =>
254
- setFilters({
255
- ...filters,
256
- pincode: e.target.value,
257
- })
258
- }
199
+ onChange={(e) => handleFilterChange("pincode", e.target.value)}
259
200
  />
260
201
 
261
202
  <input
262
203
  className="form-control"
263
- placeholder="Locality"
264
- value={filters.locality}
265
- onChange={(e) =>
266
- setFilters({
267
- ...filters,
268
- locality: e.target.value,
269
- })
270
- }
204
+ placeholder="Zone"
205
+ value={filters.zoneName}
206
+ onChange={(e) => handleFilterChange("zoneName", e.target.value)}
271
207
  />
272
208
 
209
+ <input className="form-control" placeholder="Ward" value={filters.ward} onChange={(e) => handleFilterChange("ward", e.target.value)} />
210
+
273
211
  <input
274
212
  className="form-control"
275
- placeholder="Route"
276
- value={filters.route}
277
- onChange={(e) =>
278
- setFilters({
279
- ...filters,
280
- route: e.target.value,
281
- })
282
- }
213
+ placeholder="Assembly"
214
+ value={filters.assembly}
215
+ onChange={(e) => handleFilterChange("assembly", e.target.value)}
283
216
  />
284
217
 
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>
218
+ <input className="form-control" placeholder="MR Key" value={filters.mrkey} onChange={(e) => handleFilterChange("mrkey", e.target.value)} />
219
+
220
+ <select className="form-control" value={filters.ekycStatus} onChange={(e) => handleFilterChange("ekycStatus", e.target.value)}>
221
+ <option value="">All eKYC Status</option>
296
222
  <option value="PENDING">Pending</option>
297
- <option value="VERIFIED">Verified</option>
298
- <option value="ASSIGNED">Assigned</option>
223
+ <option value="APPROVED">Approved</option>
224
+ <option value="REJECTED">Rejected</option>
299
225
  </select>
300
- </div>
301
226
 
302
- {/* Summary */}
303
- <div className="summary-bar">
304
- <div>Total Records: {filteredKnos.length}</div>
305
- <div>Selected KNOs: {selectedKnos.length}</div>
227
+ <select className="form-control" value={assignmentType} onChange={(e) => setAssignmentType(e.target.value)}>
228
+ <option value="KNO">KNO</option>
229
+ <option value="MRKEY">MR Key</option>
230
+ <option value="WARD">Ward</option>
231
+ <option value="ASSEMBLY">Assembly</option>
232
+ </select>
306
233
  </div>
307
234
 
308
235
  {/* 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>
236
+ <Table
237
+ tableTitle="eKYC Applications"
238
+ tableClass="ekycTable"
239
+ data={tableData}
240
+ columns={columns}
241
+ isLoading={isLoading}
242
+ totalRecords={applicationData?.totalCount || 0}
243
+ currentPage={currentPage}
244
+ pageSizeLimit={pageSize}
245
+ manualPagination={true}
246
+ isPaginationRequired={true}
247
+ onNextPage={() => {
248
+ if (currentPage < (applicationData?.totalPages || 1) - 1) {
249
+ setCurrentPage((prev) => prev + 1);
250
+ }
251
+ }}
252
+ onPrevPage={() => {
253
+ if (currentPage > 0) {
254
+ setCurrentPage((prev) => prev - 1);
255
+ }
256
+ }}
257
+ onFirstPage={() => {
258
+ setCurrentPage(0);
259
+ }}
260
+ onLastPage={() => {
261
+ setCurrentPage(Math.max((applicationData?.totalPages || 1) - 1, 0));
262
+ }}
263
+ onPageSizeChange={(e) => {
264
+ setPageSize(Number(e.target.value));
265
+ setCurrentPage(0);
266
+ }}
267
+ />
357
268
  </div>
358
269
  </Modal>
359
270
  );
@@ -32,7 +32,7 @@ const Inbox = ({ parentRoute, businessService = "EKYC", initialStates = {}, filt
32
32
  };
33
33
  }, [tenantId, formState?.tableForm?.offset, formState?.tableForm?.limit, formState?.searchForm]);
34
34
 
35
- const { isLoading, data: dashboardData = {} } = Digit.Hooks.ekyc.useEkycSurveyorDashboard({}, queryParams, {
35
+ const { isLoading: isListLoading, data: listData = {} } = Digit.Hooks.ekyc.useEkycApplicationList({}, queryParams, {
36
36
  enabled: !!tenantId,
37
37
  keepPreviousData: true,
38
38
  });
@@ -64,8 +64,8 @@ const Inbox = ({ parentRoute, businessService = "EKYC", initialStates = {}, filt
64
64
  return [searchData];
65
65
  }
66
66
 
67
- return dashboardData?.dashboardInfo?.consumerList || [];
68
- }, [isSearchActive, searchData, dashboardData]);
67
+ return listData?.consumerList || [];
68
+ }, [isSearchActive, searchData, listData]);
69
69
 
70
70
  const filteredData = useMemo(() => {
71
71
  return (sourceData || []).map((item) => {
@@ -99,7 +99,7 @@ const Inbox = ({ parentRoute, businessService = "EKYC", initialStates = {}, filt
99
99
  });
100
100
  }, [sourceData]);
101
101
 
102
- const totalRecords = dashboardData?.dashboardInfo?.totalRecords || dashboardData?.totalCount || 0;
102
+ const totalRecords = listData?.totalCount || 0;
103
103
 
104
104
  const checkPathName = location.pathname.includes("ekyc/inbox");
105
105
  const PropsForInboxLinks = {
@@ -233,7 +233,7 @@ const Inbox = ({ parentRoute, businessService = "EKYC", initialStates = {}, filt
233
233
  },
234
234
  });
235
235
 
236
- const isInboxLoading = isLoading || isSearchLoading;
236
+ const isInboxLoading = isListLoading || isSearchLoading;
237
237
 
238
238
  return (
239
239
  <div className="app-container">
@@ -247,11 +247,11 @@ const Inbox = ({ parentRoute, businessService = "EKYC", initialStates = {}, filt
247
247
  propsForInboxTable,
248
248
  // propsForInboxMobileCards,
249
249
  formState,
250
- countData: dashboardData?.dashboardInfo,
251
- }}
252
- />
253
- </div>
254
- );
250
+ countData: listData,
251
+ }}
252
+ />
253
+ </div>
254
+ );
255
255
  };
256
256
 
257
257
  export default Inbox;