@classytic/commerce-sdk 0.1.0
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.
Potentially problematic release.
This version of @classytic/commerce-sdk might be problematic. Click here for more details.
- package/LICENSE +14 -0
- package/README.md +104 -0
- package/dist/adjustment-DTSLM7AN.js +5 -0
- package/dist/adjustment-DTSLM7AN.js.map +1 -0
- package/dist/analytics/index.d.ts +27 -0
- package/dist/analytics/index.js +6 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics-DMcD-o8w.d.ts +76 -0
- package/dist/api-factory-B_h4RKBm.d.ts +280 -0
- package/dist/auth/index.d.ts +39 -0
- package/dist/auth/index.js +5 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/catalog/index.d.ts +479 -0
- package/dist/catalog/index.js +9 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/chunk-4ZQK3FFN.js +40 -0
- package/dist/chunk-4ZQK3FFN.js.map +1 -0
- package/dist/chunk-5L6EXDGH.js +465 -0
- package/dist/chunk-5L6EXDGH.js.map +1 -0
- package/dist/chunk-5ZFW3FEI.js +183 -0
- package/dist/chunk-5ZFW3FEI.js.map +1 -0
- package/dist/chunk-66OQAZSL.js +94 -0
- package/dist/chunk-66OQAZSL.js.map +1 -0
- package/dist/chunk-6RYGA6MF.js +123 -0
- package/dist/chunk-6RYGA6MF.js.map +1 -0
- package/dist/chunk-B6MPVOV7.js +328 -0
- package/dist/chunk-B6MPVOV7.js.map +1 -0
- package/dist/chunk-BDA2WSJA.js +148 -0
- package/dist/chunk-BDA2WSJA.js.map +1 -0
- package/dist/chunk-EIVYT3HM.js +126 -0
- package/dist/chunk-EIVYT3HM.js.map +1 -0
- package/dist/chunk-EPQN7ZKZ.js +27 -0
- package/dist/chunk-EPQN7ZKZ.js.map +1 -0
- package/dist/chunk-FA7QFJ2G.js +177 -0
- package/dist/chunk-FA7QFJ2G.js.map +1 -0
- package/dist/chunk-I5TIKUIQ.js +261 -0
- package/dist/chunk-I5TIKUIQ.js.map +1 -0
- package/dist/chunk-ILQUH444.js +135 -0
- package/dist/chunk-ILQUH444.js.map +1 -0
- package/dist/chunk-IXMWZJLV.js +616 -0
- package/dist/chunk-IXMWZJLV.js.map +1 -0
- package/dist/chunk-KZIGRIQG.js +75 -0
- package/dist/chunk-KZIGRIQG.js.map +1 -0
- package/dist/chunk-OF5M6R2S.js +769 -0
- package/dist/chunk-OF5M6R2S.js.map +1 -0
- package/dist/chunk-PYYLHUV6.js +3 -0
- package/dist/chunk-PYYLHUV6.js.map +1 -0
- package/dist/chunk-QO5AGZFP.js +159 -0
- package/dist/chunk-QO5AGZFP.js.map +1 -0
- package/dist/chunk-QUMTBLNE.js +76 -0
- package/dist/chunk-QUMTBLNE.js.map +1 -0
- package/dist/chunk-R5Z7NYLH.js +126 -0
- package/dist/chunk-R5Z7NYLH.js.map +1 -0
- package/dist/chunk-SZYWG5IB.js +75 -0
- package/dist/chunk-SZYWG5IB.js.map +1 -0
- package/dist/chunk-U3XT35GZ.js +202 -0
- package/dist/chunk-U3XT35GZ.js.map +1 -0
- package/dist/chunk-UGELTUIZ.js +830 -0
- package/dist/chunk-UGELTUIZ.js.map +1 -0
- package/dist/chunk-VR36QVX2.js +122 -0
- package/dist/chunk-VR36QVX2.js.map +1 -0
- package/dist/chunk-WUOQK7BO.js +13 -0
- package/dist/chunk-WUOQK7BO.js.map +1 -0
- package/dist/chunk-X6PV5MHG.js +582 -0
- package/dist/chunk-X6PV5MHG.js.map +1 -0
- package/dist/chunk-ZWLMFLLH.js +534 -0
- package/dist/chunk-ZWLMFLLH.js.map +1 -0
- package/dist/content/index.d.ts +309 -0
- package/dist/content/index.js +6 -0
- package/dist/content/index.js.map +1 -0
- package/dist/core/index.d.ts +107 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/react.d.ts +107 -0
- package/dist/core/react.js +5 -0
- package/dist/core/react.js.map +1 -0
- package/dist/coupon-CHFcw7cd.d.ts +632 -0
- package/dist/coupon-zGkvO-Xx.d.ts +129 -0
- package/dist/crud.factory-DyKaPHcU.d.ts +181 -0
- package/dist/finance/index.d.ts +81 -0
- package/dist/finance/index.js +5 -0
- package/dist/finance/index.js.map +1 -0
- package/dist/finance-BJdfKRw0.d.ts +135 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/inventory/index.d.ts +512 -0
- package/dist/inventory/index.js +16 -0
- package/dist/inventory/index.js.map +1 -0
- package/dist/inventory-DCiIZh8P.d.ts +742 -0
- package/dist/logistics/index.d.ts +226 -0
- package/dist/logistics/index.js +7 -0
- package/dist/logistics/index.js.map +1 -0
- package/dist/logistics-V8a9lUN3.d.ts +428 -0
- package/dist/media-CNLJK93J.d.ts +721 -0
- package/dist/movement-7MV3ADY5.js +5 -0
- package/dist/movement-7MV3ADY5.js.map +1 -0
- package/dist/payment-BRboLqvU.d.ts +127 -0
- package/dist/payments/index.d.ts +55 -0
- package/dist/payments/index.js +6 -0
- package/dist/payments/index.js.map +1 -0
- package/dist/platform/index.d.ts +645 -0
- package/dist/platform/index.js +8 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/pos-D1jkkFl0.d.ts +885 -0
- package/dist/product-p09zXkXB.d.ts +260 -0
- package/dist/purchase-24BGT2HA.js +5 -0
- package/dist/purchase-24BGT2HA.js.map +1 -0
- package/dist/request-652PS6VR.js +5 -0
- package/dist/request-652PS6VR.js.map +1 -0
- package/dist/sales/index.d.ts +585 -0
- package/dist/sales/index.js +9 -0
- package/dist/sales/index.js.map +1 -0
- package/dist/server.d.ts +120 -0
- package/dist/server.js +27 -0
- package/dist/server.js.map +1 -0
- package/dist/size-guide-DgjzjM5P.d.ts +554 -0
- package/dist/stock-DEApGC-w.d.ts +632 -0
- package/dist/stock-OOUW57VQ.js +5 -0
- package/dist/stock-OOUW57VQ.js.map +1 -0
- package/dist/supplier-OC6JAWV6.js +5 -0
- package/dist/supplier-OC6JAWV6.js.map +1 -0
- package/dist/transaction/index.d.ts +104 -0
- package/dist/transaction/index.js +8 -0
- package/dist/transaction/index.js.map +1 -0
- package/dist/transaction-BTmoHpWh.d.ts +428 -0
- package/dist/transaction-u5oaNuav.d.ts +84 -0
- package/dist/transfer-7SYSH3RG.js +5 -0
- package/dist/transfer-7SYSH3RG.js.map +1 -0
- package/dist/user-data-DdLjAGwO.d.ts +132 -0
- package/package.json +146 -0
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { createOptimisticMutation } from './chunk-U3XT35GZ.js';
|
|
2
|
+
import { useQueryClient, useQuery } from '@tanstack/react-query';
|
|
3
|
+
import { useEffect, useCallback } from 'react';
|
|
4
|
+
import { useRouter } from 'next/navigation';
|
|
5
|
+
|
|
6
|
+
var DEFAULT_QUERY_CONFIG = {
|
|
7
|
+
staleTime: 5 * 60 * 1e3,
|
|
8
|
+
// 5 minutes
|
|
9
|
+
gcTime: 30 * 60 * 1e3,
|
|
10
|
+
// 30 minutes
|
|
11
|
+
refetchOnWindowFocus: false,
|
|
12
|
+
retry: 1
|
|
13
|
+
};
|
|
14
|
+
function createListQuery({
|
|
15
|
+
queryKey,
|
|
16
|
+
queryFn,
|
|
17
|
+
enabled = true,
|
|
18
|
+
options = {},
|
|
19
|
+
prefillDetailCache = true,
|
|
20
|
+
detailKeyBuilder
|
|
21
|
+
}) {
|
|
22
|
+
const queryClient = useQueryClient();
|
|
23
|
+
const query = useQuery({
|
|
24
|
+
queryKey,
|
|
25
|
+
queryFn,
|
|
26
|
+
enabled,
|
|
27
|
+
...DEFAULT_QUERY_CONFIG,
|
|
28
|
+
...options,
|
|
29
|
+
placeholderData: (previousData) => previousData
|
|
30
|
+
});
|
|
31
|
+
const data = query.data;
|
|
32
|
+
const items = data?.docs || data?.data || data || [];
|
|
33
|
+
const dataObj = data;
|
|
34
|
+
const hasPagination = dataObj?.total != null || dataObj?.totalDocs != null;
|
|
35
|
+
const pagination = hasPagination ? {
|
|
36
|
+
total: dataObj?.total ?? dataObj?.totalDocs ?? 0,
|
|
37
|
+
pages: dataObj?.pages ?? dataObj?.totalPages ?? 1,
|
|
38
|
+
page: dataObj?.page ?? dataObj?.currentPage ?? 1,
|
|
39
|
+
limit: dataObj?.limit ?? 10,
|
|
40
|
+
hasNext: dataObj?.hasNext ?? dataObj?.hasNextPage ?? false,
|
|
41
|
+
hasPrev: dataObj?.hasPrev ?? dataObj?.hasPrevPage ?? false,
|
|
42
|
+
totalDocs: dataObj?.totalDocs ?? dataObj?.total ?? 0,
|
|
43
|
+
totalPages: dataObj?.totalPages ?? dataObj?.pages ?? 1,
|
|
44
|
+
currentPage: dataObj?.currentPage ?? dataObj?.page ?? 1,
|
|
45
|
+
hasNextPage: dataObj?.hasNextPage ?? dataObj?.hasNext ?? false,
|
|
46
|
+
hasPrevPage: dataObj?.hasPrevPage ?? dataObj?.hasPrev ?? false
|
|
47
|
+
} : null;
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (prefillDetailCache && items.length > 0 && detailKeyBuilder) {
|
|
50
|
+
items.forEach((item) => {
|
|
51
|
+
const id = getItemId(item);
|
|
52
|
+
if (id) {
|
|
53
|
+
const detailKey = detailKeyBuilder(id);
|
|
54
|
+
queryClient.setQueryData(detailKey, { data: item });
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}, [items, prefillDetailCache, detailKeyBuilder, queryClient]);
|
|
59
|
+
return {
|
|
60
|
+
items,
|
|
61
|
+
pagination,
|
|
62
|
+
isLoading: query.isLoading,
|
|
63
|
+
isFetching: query.isFetching,
|
|
64
|
+
isError: query.isError,
|
|
65
|
+
error: query.error,
|
|
66
|
+
refetch: query.refetch,
|
|
67
|
+
data: query.data
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function createDetailQuery({
|
|
71
|
+
queryKey,
|
|
72
|
+
queryFn,
|
|
73
|
+
enabled = true,
|
|
74
|
+
options = {}
|
|
75
|
+
}) {
|
|
76
|
+
const query = useQuery({
|
|
77
|
+
queryKey,
|
|
78
|
+
queryFn,
|
|
79
|
+
enabled,
|
|
80
|
+
...DEFAULT_QUERY_CONFIG,
|
|
81
|
+
...options
|
|
82
|
+
});
|
|
83
|
+
const data = query.data;
|
|
84
|
+
const item = data?.data || data || null;
|
|
85
|
+
return {
|
|
86
|
+
item,
|
|
87
|
+
isLoading: query.isLoading,
|
|
88
|
+
isFetching: query.isFetching,
|
|
89
|
+
isError: query.isError,
|
|
90
|
+
error: query.error,
|
|
91
|
+
refetch: query.refetch,
|
|
92
|
+
data: query.data
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function updateListCache(listData, updater) {
|
|
96
|
+
if (!listData) return listData;
|
|
97
|
+
const data = listData;
|
|
98
|
+
if (typeof data === "object" && data.docs) {
|
|
99
|
+
const updatedDocs = updater(data.docs);
|
|
100
|
+
const updatedCount = Array.isArray(updatedDocs) ? updatedDocs.length : data.totalDocs;
|
|
101
|
+
return {
|
|
102
|
+
...data,
|
|
103
|
+
docs: updatedDocs,
|
|
104
|
+
totalDocs: updatedCount,
|
|
105
|
+
total: data.total ?? updatedCount
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
if (Array.isArray(listData)) {
|
|
109
|
+
return updater(listData);
|
|
110
|
+
}
|
|
111
|
+
if (data.data && Array.isArray(data.data)) {
|
|
112
|
+
return {
|
|
113
|
+
...data,
|
|
114
|
+
data: updater(data.data)
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
return listData;
|
|
118
|
+
}
|
|
119
|
+
function getItemId(item) {
|
|
120
|
+
const obj = item;
|
|
121
|
+
return obj?._id ?? obj?.id ?? null;
|
|
122
|
+
}
|
|
123
|
+
function createQueryKeys(entityKey) {
|
|
124
|
+
return {
|
|
125
|
+
all: [entityKey],
|
|
126
|
+
lists: () => [entityKey, "list"],
|
|
127
|
+
list: (params) => [entityKey, "list", params],
|
|
128
|
+
details: () => [entityKey, "detail"],
|
|
129
|
+
detail: (id) => [entityKey, "detail", id],
|
|
130
|
+
custom: (key) => [entityKey, key],
|
|
131
|
+
scopedList: (scope, params) => [entityKey, "list", { _scope: scope, ...params }]
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// src/core/react/crud.factory.ts
|
|
136
|
+
function createCrudHooks({
|
|
137
|
+
api,
|
|
138
|
+
entityKey,
|
|
139
|
+
singular,
|
|
140
|
+
plural,
|
|
141
|
+
defaults = {}
|
|
142
|
+
}) {
|
|
143
|
+
const KEYS = createQueryKeys(entityKey);
|
|
144
|
+
const config = {
|
|
145
|
+
...DEFAULT_QUERY_CONFIG,
|
|
146
|
+
...defaults,
|
|
147
|
+
structuralSharing: defaults.structuralSharing,
|
|
148
|
+
messages: {
|
|
149
|
+
createSuccess: `${singular} created successfully`,
|
|
150
|
+
createError: `Failed to create ${singular.toLowerCase()}`,
|
|
151
|
+
updateSuccess: `${singular} updated successfully`,
|
|
152
|
+
updateError: `Failed to update ${singular.toLowerCase()}`,
|
|
153
|
+
deleteSuccess: `${singular} deleted successfully`,
|
|
154
|
+
deleteError: `Failed to delete ${singular.toLowerCase()}`,
|
|
155
|
+
...defaults.messages || {}
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
function useList(token, params = {}, options = {}) {
|
|
159
|
+
const { organizationId, ...restParams } = params;
|
|
160
|
+
const scope = options._scope || (organizationId ? "tenant" : "super-admin");
|
|
161
|
+
return createListQuery({
|
|
162
|
+
queryKey: KEYS.scopedList(scope, { organizationId, ...restParams }),
|
|
163
|
+
queryFn: () => api.getAll({
|
|
164
|
+
token,
|
|
165
|
+
organizationId,
|
|
166
|
+
params: restParams
|
|
167
|
+
}),
|
|
168
|
+
enabled: options.enabled ?? true,
|
|
169
|
+
options: {
|
|
170
|
+
staleTime: options.staleTime ?? config.staleTime,
|
|
171
|
+
gcTime: options.gcTime ?? config.gcTime,
|
|
172
|
+
refetchOnWindowFocus: options.refetchOnWindowFocus ?? config.refetchOnWindowFocus,
|
|
173
|
+
structuralSharing: options.structuralSharing ?? config.structuralSharing,
|
|
174
|
+
...options
|
|
175
|
+
},
|
|
176
|
+
prefillDetailCache: options.prefillDetailCache ?? true,
|
|
177
|
+
detailKeyBuilder: (id) => KEYS.detail(id)
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
function useDetail(id, token, options = {}) {
|
|
181
|
+
const { organizationId, ...restOptions } = options;
|
|
182
|
+
return createDetailQuery({
|
|
183
|
+
queryKey: KEYS.detail(id || ""),
|
|
184
|
+
queryFn: () => api.getById({
|
|
185
|
+
id,
|
|
186
|
+
token,
|
|
187
|
+
organizationId
|
|
188
|
+
}),
|
|
189
|
+
enabled: !!id && (restOptions.enabled ?? true),
|
|
190
|
+
options: {
|
|
191
|
+
staleTime: restOptions.staleTime ?? config.staleTime,
|
|
192
|
+
gcTime: restOptions.gcTime ?? config.gcTime,
|
|
193
|
+
structuralSharing: restOptions.structuralSharing ?? config.structuralSharing,
|
|
194
|
+
refetchInterval: restOptions.refetchInterval,
|
|
195
|
+
refetchIntervalInBackground: restOptions.refetchIntervalInBackground,
|
|
196
|
+
...restOptions
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
function useActions() {
|
|
201
|
+
const queryClient = useQueryClient();
|
|
202
|
+
const createMutation = createOptimisticMutation({
|
|
203
|
+
mutationFn: ({
|
|
204
|
+
token,
|
|
205
|
+
organizationId,
|
|
206
|
+
data
|
|
207
|
+
}) => api.create({ token, organizationId, data }),
|
|
208
|
+
queryClient,
|
|
209
|
+
queryKeys: [KEYS.lists()],
|
|
210
|
+
optimisticUpdate: (oldData, { data }) => {
|
|
211
|
+
const optimisticItem = {
|
|
212
|
+
...data,
|
|
213
|
+
_optimistic: true,
|
|
214
|
+
[getItemId(data) ? "id" : "_id"]: getItemId(data) ?? `temp-${Date.now()}`
|
|
215
|
+
};
|
|
216
|
+
return updateListCache(oldData, (arr) => [
|
|
217
|
+
optimisticItem,
|
|
218
|
+
...arr || []
|
|
219
|
+
]);
|
|
220
|
+
},
|
|
221
|
+
messages: {
|
|
222
|
+
success: config.messages.createSuccess,
|
|
223
|
+
error: config.messages.createError
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
const updateMutation = createOptimisticMutation({
|
|
227
|
+
mutationFn: ({
|
|
228
|
+
token,
|
|
229
|
+
organizationId,
|
|
230
|
+
id,
|
|
231
|
+
data
|
|
232
|
+
}) => api.update({ token, organizationId, id, data }),
|
|
233
|
+
queryClient,
|
|
234
|
+
queryKeys: [KEYS.lists()],
|
|
235
|
+
optimisticUpdate: (oldData, { id, data }) => {
|
|
236
|
+
const updated = updateListCache(
|
|
237
|
+
oldData,
|
|
238
|
+
(arr) => (arr || []).map(
|
|
239
|
+
(item) => getItemId(item) === id ? { ...item, ...data } : item
|
|
240
|
+
)
|
|
241
|
+
);
|
|
242
|
+
queryClient.setQueryData(
|
|
243
|
+
KEYS.detail(id),
|
|
244
|
+
(current) => current ? { ...current, ...data } : current
|
|
245
|
+
);
|
|
246
|
+
return updated;
|
|
247
|
+
},
|
|
248
|
+
onSuccess: (_, { id }) => {
|
|
249
|
+
queryClient.invalidateQueries({ queryKey: KEYS.detail(id) });
|
|
250
|
+
},
|
|
251
|
+
messages: {
|
|
252
|
+
success: config.messages.updateSuccess,
|
|
253
|
+
error: config.messages.updateError
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
const deleteMutation = createOptimisticMutation({
|
|
257
|
+
mutationFn: ({
|
|
258
|
+
token,
|
|
259
|
+
organizationId,
|
|
260
|
+
id
|
|
261
|
+
}) => api.delete({ token, organizationId, id }),
|
|
262
|
+
queryClient,
|
|
263
|
+
queryKeys: [KEYS.lists()],
|
|
264
|
+
optimisticUpdate: (oldData, { id }) => {
|
|
265
|
+
const updated = updateListCache(
|
|
266
|
+
oldData,
|
|
267
|
+
(arr) => (arr || []).filter((item) => getItemId(item) !== id)
|
|
268
|
+
);
|
|
269
|
+
queryClient.removeQueries({ queryKey: KEYS.detail(id) });
|
|
270
|
+
return updated;
|
|
271
|
+
},
|
|
272
|
+
messages: {
|
|
273
|
+
success: config.messages.deleteSuccess,
|
|
274
|
+
error: config.messages.deleteError
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
return {
|
|
278
|
+
create: createMutation.mutateAsync,
|
|
279
|
+
update: updateMutation.mutateAsync,
|
|
280
|
+
remove: deleteMutation.mutateAsync,
|
|
281
|
+
updateOnly: ({
|
|
282
|
+
token,
|
|
283
|
+
organizationId,
|
|
284
|
+
id,
|
|
285
|
+
data
|
|
286
|
+
}) => updateMutation.mutateAsync({
|
|
287
|
+
token,
|
|
288
|
+
organizationId,
|
|
289
|
+
id,
|
|
290
|
+
data,
|
|
291
|
+
skipListInvalidation: true
|
|
292
|
+
}),
|
|
293
|
+
isCreating: createMutation.isPending,
|
|
294
|
+
isUpdating: updateMutation.isPending,
|
|
295
|
+
isDeleting: deleteMutation.isPending
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
function useNavigation() {
|
|
299
|
+
const queryClient = useQueryClient();
|
|
300
|
+
const router = useRouter();
|
|
301
|
+
return useCallback(
|
|
302
|
+
(href, item, options = {}) => {
|
|
303
|
+
const id = getItemId(item);
|
|
304
|
+
if (id) {
|
|
305
|
+
queryClient.setQueryData(KEYS.detail(id), item);
|
|
306
|
+
}
|
|
307
|
+
const { scroll = true, replace = false } = options;
|
|
308
|
+
if (replace) {
|
|
309
|
+
router.replace(href, { scroll });
|
|
310
|
+
} else {
|
|
311
|
+
router.push(href, { scroll });
|
|
312
|
+
}
|
|
313
|
+
},
|
|
314
|
+
[queryClient, router]
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
return {
|
|
318
|
+
KEYS,
|
|
319
|
+
useList,
|
|
320
|
+
useDetail,
|
|
321
|
+
useActions,
|
|
322
|
+
useNavigation
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
export { DEFAULT_QUERY_CONFIG, createCrudHooks, createDetailQuery, createListQuery, createQueryKeys, getItemId, updateListCache };
|
|
327
|
+
//# sourceMappingURL=chunk-B6MPVOV7.js.map
|
|
328
|
+
//# sourceMappingURL=chunk-B6MPVOV7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/react/query.factory.ts","../src/core/react/crud.factory.ts"],"names":["useQueryClient"],"mappings":"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","file":"chunk-B6MPVOV7.js","sourcesContent":["\"use client\";\r\n\r\nimport { useQuery, useQueryClient, type QueryKey } from \"@tanstack/react-query\";\r\nimport { useEffect } from \"react\";\r\n\r\nexport interface QueryConfig {\r\n staleTime: number;\r\n gcTime: number;\r\n refetchOnWindowFocus: boolean;\r\n retry: number;\r\n}\r\n\r\nexport const DEFAULT_QUERY_CONFIG: QueryConfig = {\r\n staleTime: 5 * 60 * 1000, // 5 minutes\r\n gcTime: 30 * 60 * 1000, // 30 minutes\r\n refetchOnWindowFocus: false,\r\n retry: 1,\r\n};\r\n\r\nexport interface PaginationData {\r\n total: number;\r\n pages: number;\r\n page: number;\r\n limit: number;\r\n hasNext: boolean;\r\n hasPrev: boolean;\r\n // Legacy aliases\r\n totalDocs: number;\r\n totalPages: number;\r\n currentPage: number;\r\n hasNextPage: boolean;\r\n hasPrevPage: boolean;\r\n}\r\n\r\nexport interface ListQueryResult<T> {\r\n items: T[];\r\n pagination: PaginationData | null;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n isError: boolean;\r\n error: Error | null;\r\n refetch: () => void;\r\n data: unknown;\r\n}\r\n\r\nexport interface DetailQueryResult<T> {\r\n item: T | null;\r\n isLoading: boolean;\r\n isFetching: boolean;\r\n isError: boolean;\r\n error: Error | null;\r\n refetch: () => void;\r\n data: unknown;\r\n}\r\n\r\nexport interface CreateListQueryOptions<T> {\r\n queryKey: QueryKey;\r\n queryFn: () => Promise<unknown>;\r\n enabled?: boolean;\r\n options?: Record<string, unknown>;\r\n prefillDetailCache?: boolean;\r\n detailKeyBuilder?: (id: string) => QueryKey;\r\n}\r\n\r\nexport function createListQuery<T>({\r\n queryKey,\r\n queryFn,\r\n enabled = true,\r\n options = {},\r\n prefillDetailCache = true,\r\n detailKeyBuilder,\r\n}: CreateListQueryOptions<T>): ListQueryResult<T> {\r\n const queryClient = useQueryClient();\r\n\r\n const query = useQuery({\r\n queryKey,\r\n queryFn,\r\n enabled,\r\n ...DEFAULT_QUERY_CONFIG,\r\n ...options,\r\n placeholderData: (previousData: unknown) => previousData,\r\n });\r\n\r\n const data = query.data as Record<string, unknown> | T[] | undefined;\r\n const items = (\r\n (data as Record<string, unknown>)?.docs ||\r\n (data as Record<string, unknown>)?.data ||\r\n data ||\r\n []\r\n ) as T[];\r\n\r\n // Normalize pagination\r\n const dataObj = data as Record<string, unknown> | undefined;\r\n const hasPagination = dataObj?.total != null || dataObj?.totalDocs != null;\r\n const pagination: PaginationData | null = hasPagination\r\n ? {\r\n total: (dataObj?.total ?? dataObj?.totalDocs ?? 0) as number,\r\n pages: (dataObj?.pages ?? dataObj?.totalPages ?? 1) as number,\r\n page: (dataObj?.page ?? dataObj?.currentPage ?? 1) as number,\r\n limit: (dataObj?.limit ?? 10) as number,\r\n hasNext: (dataObj?.hasNext ?? dataObj?.hasNextPage ?? false) as boolean,\r\n hasPrev: (dataObj?.hasPrev ?? dataObj?.hasPrevPage ?? false) as boolean,\r\n totalDocs: (dataObj?.totalDocs ?? dataObj?.total ?? 0) as number,\r\n totalPages: (dataObj?.totalPages ?? dataObj?.pages ?? 1) as number,\r\n currentPage: (dataObj?.currentPage ?? dataObj?.page ?? 1) as number,\r\n hasNextPage: (dataObj?.hasNextPage ?? dataObj?.hasNext ?? false) as boolean,\r\n hasPrevPage: (dataObj?.hasPrevPage ?? dataObj?.hasPrev ?? false) as boolean,\r\n }\r\n : null;\r\n\r\n // Prefill detail cache\r\n useEffect(() => {\r\n if (prefillDetailCache && items.length > 0 && detailKeyBuilder) {\r\n items.forEach((item) => {\r\n const id = getItemId(item);\r\n if (id) {\r\n const detailKey = detailKeyBuilder(id);\r\n queryClient.setQueryData(detailKey, { data: item });\r\n }\r\n });\r\n }\r\n }, [items, prefillDetailCache, detailKeyBuilder, queryClient]);\r\n\r\n return {\r\n items,\r\n pagination,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n isError: query.isError,\r\n error: query.error,\r\n refetch: query.refetch,\r\n data: query.data,\r\n };\r\n}\r\n\r\nexport interface CreateDetailQueryOptions {\r\n queryKey: QueryKey;\r\n queryFn: () => Promise<unknown>;\r\n enabled?: boolean;\r\n options?: Record<string, unknown>;\r\n}\r\n\r\nexport function createDetailQuery<T>({\r\n queryKey,\r\n queryFn,\r\n enabled = true,\r\n options = {},\r\n}: CreateDetailQueryOptions): DetailQueryResult<T> {\r\n const query = useQuery({\r\n queryKey,\r\n queryFn,\r\n enabled,\r\n ...DEFAULT_QUERY_CONFIG,\r\n ...options,\r\n });\r\n\r\n const data = query.data as Record<string, unknown> | T | undefined;\r\n const item = ((data as Record<string, unknown>)?.data || data || null) as T | null;\r\n\r\n return {\r\n item,\r\n isLoading: query.isLoading,\r\n isFetching: query.isFetching,\r\n isError: query.isError,\r\n error: query.error,\r\n refetch: query.refetch,\r\n data: query.data,\r\n };\r\n}\r\n\r\nexport function updateListCache<T>(\r\n listData: unknown,\r\n updater: (arr: T[]) => T[]\r\n): unknown {\r\n if (!listData) return listData;\r\n\r\n const data = listData as Record<string, unknown>;\r\n\r\n if (typeof data === \"object\" && data.docs) {\r\n const updatedDocs = updater(data.docs as T[]);\r\n const updatedCount = Array.isArray(updatedDocs) ? updatedDocs.length : data.totalDocs;\r\n return {\r\n ...data,\r\n docs: updatedDocs,\r\n totalDocs: updatedCount,\r\n total: data.total ?? updatedCount,\r\n };\r\n }\r\n\r\n if (Array.isArray(listData)) {\r\n return updater(listData as T[]);\r\n }\r\n\r\n if (data.data && Array.isArray(data.data)) {\r\n return {\r\n ...data,\r\n data: updater(data.data as T[]),\r\n };\r\n }\r\n\r\n return listData;\r\n}\r\n\r\nexport function getItemId(item: unknown): string | null {\r\n const obj = item as Record<string, unknown> | null;\r\n return (obj?._id ?? obj?.id ?? null) as string | null;\r\n}\r\n\r\nexport interface QueryKeys {\r\n all: string[];\r\n lists: () => QueryKey;\r\n list: (params: unknown) => QueryKey;\r\n details: () => QueryKey;\r\n detail: (id: string) => QueryKey;\r\n custom: (key: string) => QueryKey;\r\n scopedList: (scope: string, params: unknown) => QueryKey;\r\n}\r\n\r\nexport function createQueryKeys(entityKey: string): QueryKeys {\r\n return {\r\n all: [entityKey],\r\n lists: () => [entityKey, \"list\"],\r\n list: (params) => [entityKey, \"list\", params],\r\n details: () => [entityKey, \"detail\"],\r\n detail: (id) => [entityKey, \"detail\", id],\r\n custom: (key) => [entityKey, key],\r\n scopedList: (scope, params) => [entityKey, \"list\", { _scope: scope, ...params as object }],\r\n };\r\n}\r\n","\"use client\";\r\n\r\nimport { useQueryClient } from \"@tanstack/react-query\";\r\nimport { useCallback } from \"react\";\r\nimport { useRouter } from \"next/navigation\";\r\nimport { createOptimisticMutation } from \"./mutation.factory\";\r\nimport {\r\n createListQuery,\r\n createDetailQuery,\r\n updateListCache,\r\n getItemId,\r\n createQueryKeys,\r\n DEFAULT_QUERY_CONFIG,\r\n type QueryKeys,\r\n type ListQueryResult,\r\n type DetailQueryResult,\r\n} from \"./query.factory\";\r\n\r\n// API interface that crud hooks expect\r\nexport interface CrudApi<T, TCreate, TUpdate> {\r\n getAll: (options: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n params?: Record<string, unknown>;\r\n }) => Promise<unknown>;\r\n getById: (options: {\r\n id: string;\r\n token?: string | null;\r\n organizationId?: string | null;\r\n }) => Promise<unknown>;\r\n create: (options: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n data: TCreate;\r\n }) => Promise<T>;\r\n update: (options: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n id: string;\r\n data: TUpdate;\r\n }) => Promise<T>;\r\n delete: (options: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n id: string;\r\n }) => Promise<unknown>;\r\n}\r\n\r\nexport interface CrudHooksConfig<T, TCreate, TUpdate> {\r\n api: CrudApi<T, TCreate, TUpdate>;\r\n entityKey: string;\r\n singular: string;\r\n plural: string;\r\n defaults?: {\r\n staleTime?: number;\r\n gcTime?: number;\r\n refetchOnWindowFocus?: boolean;\r\n structuralSharing?: boolean;\r\n messages?: {\r\n createSuccess?: string;\r\n createError?: string;\r\n updateSuccess?: string;\r\n updateError?: string;\r\n deleteSuccess?: string;\r\n deleteError?: string;\r\n };\r\n };\r\n}\r\n\r\nexport interface ListOptions {\r\n public?: boolean;\r\n enabled?: boolean;\r\n staleTime?: number;\r\n gcTime?: number;\r\n refetchOnWindowFocus?: boolean;\r\n structuralSharing?: boolean;\r\n prefillDetailCache?: boolean;\r\n _scope?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface DetailOptions {\r\n organizationId?: string | null;\r\n enabled?: boolean;\r\n staleTime?: number;\r\n gcTime?: number;\r\n structuralSharing?: boolean;\r\n refetchInterval?: number;\r\n refetchIntervalInBackground?: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface CrudActions<TCreate, TUpdate> {\r\n create: (params: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n data: TCreate;\r\n }) => Promise<unknown>;\r\n update: (params: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n id: string;\r\n data: TUpdate;\r\n }) => Promise<unknown>;\r\n remove: (params: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n id: string;\r\n }) => Promise<unknown>;\r\n updateOnly: (params: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n id: string;\r\n data: TUpdate;\r\n }) => Promise<unknown>;\r\n isCreating: boolean;\r\n isUpdating: boolean;\r\n isDeleting: boolean;\r\n}\r\n\r\nexport interface NavigationOptions {\r\n scroll?: boolean;\r\n replace?: boolean;\r\n}\r\n\r\nexport type NavigateFn<T> = (\r\n href: string,\r\n item: T,\r\n options?: NavigationOptions\r\n) => void;\r\n\r\nexport interface CrudHooksReturn<T, TCreate, TUpdate> {\r\n KEYS: QueryKeys;\r\n useList: (\r\n token: string | null,\r\n params?: Record<string, unknown>,\r\n options?: ListOptions\r\n ) => ListQueryResult<T>;\r\n useDetail: (\r\n id: string | null,\r\n token: string | null,\r\n options?: DetailOptions\r\n ) => DetailQueryResult<T>;\r\n useActions: () => CrudActions<TCreate, TUpdate>;\r\n useNavigation: () => NavigateFn<T>;\r\n}\r\n\r\nexport function createCrudHooks<T, TCreate = Partial<T>, TUpdate = Partial<T>>({\r\n api,\r\n entityKey,\r\n singular,\r\n plural,\r\n defaults = {},\r\n}: CrudHooksConfig<T, TCreate, TUpdate>): CrudHooksReturn<T, TCreate, TUpdate> {\r\n const KEYS = createQueryKeys(entityKey);\r\n\r\n const config = {\r\n ...DEFAULT_QUERY_CONFIG,\r\n ...defaults,\r\n structuralSharing: defaults.structuralSharing,\r\n messages: {\r\n createSuccess: `${singular} created successfully`,\r\n createError: `Failed to create ${singular.toLowerCase()}`,\r\n updateSuccess: `${singular} updated successfully`,\r\n updateError: `Failed to update ${singular.toLowerCase()}`,\r\n deleteSuccess: `${singular} deleted successfully`,\r\n deleteError: `Failed to delete ${singular.toLowerCase()}`,\r\n ...(defaults.messages || {}),\r\n },\r\n };\r\n\r\n function useList(\r\n token: string | null,\r\n params: Record<string, unknown> = {},\r\n options: ListOptions = {}\r\n ): ListQueryResult<T> {\r\n const { organizationId, ...restParams } = params;\r\n\r\n const scope =\r\n options._scope || (organizationId ? \"tenant\" : \"super-admin\");\r\n\r\n return createListQuery<T>({\r\n queryKey: KEYS.scopedList(scope, { organizationId, ...restParams }),\r\n queryFn: () =>\r\n api.getAll({\r\n token,\r\n organizationId: organizationId as string | null,\r\n params: restParams,\r\n }),\r\n enabled: options.enabled ?? true,\r\n options: {\r\n staleTime: options.staleTime ?? config.staleTime,\r\n gcTime: options.gcTime ?? config.gcTime,\r\n refetchOnWindowFocus:\r\n options.refetchOnWindowFocus ?? config.refetchOnWindowFocus,\r\n structuralSharing: options.structuralSharing ?? config.structuralSharing,\r\n ...options,\r\n },\r\n prefillDetailCache: options.prefillDetailCache ?? true,\r\n detailKeyBuilder: (id) => KEYS.detail(id),\r\n });\r\n }\r\n\r\n function useDetail(\r\n id: string | null,\r\n token: string | null,\r\n options: DetailOptions = {}\r\n ): DetailQueryResult<T> {\r\n const { organizationId, ...restOptions } = options;\r\n\r\n return createDetailQuery<T>({\r\n queryKey: KEYS.detail(id || \"\"),\r\n queryFn: () =>\r\n api.getById({\r\n id: id!,\r\n token,\r\n organizationId,\r\n }),\r\n enabled: !!id && (restOptions.enabled ?? true),\r\n options: {\r\n staleTime: restOptions.staleTime ?? config.staleTime,\r\n gcTime: restOptions.gcTime ?? config.gcTime,\r\n structuralSharing:\r\n restOptions.structuralSharing ?? config.structuralSharing,\r\n refetchInterval: restOptions.refetchInterval,\r\n refetchIntervalInBackground: restOptions.refetchIntervalInBackground,\r\n ...restOptions,\r\n },\r\n });\r\n }\r\n\r\n function useActions(): CrudActions<TCreate, TUpdate> {\r\n const queryClient = useQueryClient();\r\n\r\n const createMutation = createOptimisticMutation({\r\n mutationFn: ({\r\n token,\r\n organizationId,\r\n data,\r\n }: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n data: TCreate;\r\n }) => api.create({ token, organizationId, data }),\r\n queryClient,\r\n queryKeys: [KEYS.lists()],\r\n optimisticUpdate: (oldData, { data }) => {\r\n const optimisticItem = {\r\n ...(data as object),\r\n _optimistic: true,\r\n [getItemId(data) ? \"id\" : \"_id\"]:\r\n getItemId(data) ?? `temp-${Date.now()}`,\r\n };\r\n return updateListCache(oldData, (arr: unknown[]) => [\r\n optimisticItem,\r\n ...(arr || []),\r\n ]);\r\n },\r\n messages: {\r\n success: config.messages.createSuccess,\r\n error: config.messages.createError,\r\n },\r\n });\r\n\r\n const updateMutation = createOptimisticMutation({\r\n mutationFn: ({\r\n token,\r\n organizationId,\r\n id,\r\n data,\r\n }: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n id: string;\r\n data: TUpdate;\r\n }) => api.update({ token, organizationId, id, data }),\r\n queryClient,\r\n queryKeys: [KEYS.lists()],\r\n optimisticUpdate: (oldData, { id, data }) => {\r\n const updated = updateListCache(oldData, (arr: unknown[]) =>\r\n (arr || []).map((item) =>\r\n getItemId(item) === id ? { ...(item as object), ...(data as object) } : item\r\n )\r\n );\r\n queryClient.setQueryData(KEYS.detail(id), (current: unknown) =>\r\n current ? { ...(current as object), ...(data as object) } : current\r\n );\r\n return updated;\r\n },\r\n onSuccess: (_, { id }) => {\r\n queryClient.invalidateQueries({ queryKey: KEYS.detail(id as string) });\r\n },\r\n messages: {\r\n success: config.messages.updateSuccess,\r\n error: config.messages.updateError,\r\n },\r\n });\r\n\r\n const deleteMutation = createOptimisticMutation({\r\n mutationFn: ({\r\n token,\r\n organizationId,\r\n id,\r\n }: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n id: string;\r\n }) => api.delete({ token, organizationId, id }),\r\n queryClient,\r\n queryKeys: [KEYS.lists()],\r\n optimisticUpdate: (oldData, { id }) => {\r\n const updated = updateListCache(oldData, (arr: unknown[]) =>\r\n (arr || []).filter((item) => getItemId(item) !== id)\r\n );\r\n queryClient.removeQueries({ queryKey: KEYS.detail(id) });\r\n return updated;\r\n },\r\n messages: {\r\n success: config.messages.deleteSuccess,\r\n error: config.messages.deleteError,\r\n },\r\n });\r\n\r\n return {\r\n create: createMutation.mutateAsync,\r\n update: updateMutation.mutateAsync,\r\n remove: deleteMutation.mutateAsync,\r\n updateOnly: ({\r\n token,\r\n organizationId,\r\n id,\r\n data,\r\n }: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n id: string;\r\n data: TUpdate;\r\n }) =>\r\n updateMutation.mutateAsync({\r\n token,\r\n organizationId,\r\n id,\r\n data,\r\n skipListInvalidation: true,\r\n } as Parameters<typeof updateMutation.mutateAsync>[0]),\r\n isCreating: createMutation.isPending,\r\n isUpdating: updateMutation.isPending,\r\n isDeleting: deleteMutation.isPending,\r\n };\r\n }\r\n\r\n function useNavigation(): NavigateFn<T> {\r\n const queryClient = useQueryClient();\r\n const router = useRouter();\r\n\r\n return useCallback(\r\n (href: string, item: T, options: NavigationOptions = {}) => {\r\n const id = getItemId(item);\r\n if (id) {\r\n queryClient.setQueryData(KEYS.detail(id), item);\r\n }\r\n\r\n const { scroll = true, replace = false } = options;\r\n if (replace) {\r\n router.replace(href, { scroll });\r\n } else {\r\n router.push(href, { scroll });\r\n }\r\n },\r\n [queryClient, router]\r\n );\r\n }\r\n\r\n return {\r\n KEYS,\r\n useList,\r\n useDetail,\r\n useActions,\r\n useNavigation,\r\n };\r\n}\r\n\r\nexport default createCrudHooks;\r\n"]}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { handleApiRequest } from './chunk-VR36QVX2.js';
|
|
2
|
+
import { useMutation } from '@tanstack/react-query';
|
|
3
|
+
|
|
4
|
+
// src/auth/types.ts
|
|
5
|
+
var UserRole = {
|
|
6
|
+
SUPER_ADMIN: "superadmin",
|
|
7
|
+
ADMIN: "admin",
|
|
8
|
+
CUSTOMER: "user",
|
|
9
|
+
FINANCE_ADMIN: "finance-admin",
|
|
10
|
+
FINANCE_MANAGER: "finance-manager",
|
|
11
|
+
STORE_MANAGER: "store-manager",
|
|
12
|
+
STORE_STAFF: "store-staff",
|
|
13
|
+
WAREHOUSE_ADMIN: "warehouse-admin",
|
|
14
|
+
WAREHOUSE_STAFF: "warehouse-staff"
|
|
15
|
+
};
|
|
16
|
+
var DISCOUNT_ALLOWED_ROLES = [
|
|
17
|
+
"superadmin",
|
|
18
|
+
"admin",
|
|
19
|
+
"store-manager"
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
// src/auth/api/user-data.ts
|
|
23
|
+
var forgetPassApi = async (data) => {
|
|
24
|
+
return handleApiRequest("POST", "/api/v1/auth/forgot-password", {
|
|
25
|
+
body: data
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
var resetPassApi = async (data) => {
|
|
29
|
+
return handleApiRequest("POST", "/api/v1/auth/reset-password", {
|
|
30
|
+
body: data
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
var tokenRefreshApi = async (data) => {
|
|
34
|
+
return handleApiRequest("POST", "/api/v1/auth/refresh", {
|
|
35
|
+
body: data
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
var loginApi = async (data) => {
|
|
39
|
+
return handleApiRequest("POST", "/api/v1/auth/login", {
|
|
40
|
+
body: data
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
var verifyManagerAuth = async (data) => {
|
|
44
|
+
const { email, password, allowedRoles = DISCOUNT_ALLOWED_ROLES } = data;
|
|
45
|
+
try {
|
|
46
|
+
const response = await handleApiRequest(
|
|
47
|
+
"POST",
|
|
48
|
+
"/api/v1/auth/login",
|
|
49
|
+
{
|
|
50
|
+
body: { email, password }
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
const user = response.user;
|
|
54
|
+
if (!user) {
|
|
55
|
+
return { success: false, message: "Invalid credentials" };
|
|
56
|
+
}
|
|
57
|
+
const hasAllowedRole = user.roles?.some(
|
|
58
|
+
(role) => allowedRoles.includes(role)
|
|
59
|
+
);
|
|
60
|
+
if (!hasAllowedRole) {
|
|
61
|
+
return {
|
|
62
|
+
success: false,
|
|
63
|
+
message: "You don't have permission to authorize discounts"
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return { success: true, user };
|
|
67
|
+
} catch (error) {
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
message: error instanceof Error ? error.message : "Authentication failed"
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
var registerApi = async (data) => {
|
|
75
|
+
return handleApiRequest("POST", "/api/v1/auth/register", {
|
|
76
|
+
body: data
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
var oauthLoginApi = async (data) => {
|
|
80
|
+
return handleApiRequest("POST", "/api/v1/auth/oauth-login", {
|
|
81
|
+
body: data
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
var getUser = async (email, token) => {
|
|
85
|
+
const endpoint = `/api/v1/users?email=${email}`;
|
|
86
|
+
return handleApiRequest("GET", endpoint, { token });
|
|
87
|
+
};
|
|
88
|
+
var getUserByPhone = async (phone, token) => {
|
|
89
|
+
const endpoint = `/api/v1/customers?phone=${phone}`;
|
|
90
|
+
return handleApiRequest("GET", endpoint, { token });
|
|
91
|
+
};
|
|
92
|
+
async function createUser(name, email, password, phone, address) {
|
|
93
|
+
const endpoint = "/api/v1/auth/register";
|
|
94
|
+
return handleApiRequest("POST", endpoint, {
|
|
95
|
+
body: { name, email, password, phone, address }
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
var getProfile = async (token) => {
|
|
99
|
+
return handleApiRequest("GET", "/api/v1/users/me", { token });
|
|
100
|
+
};
|
|
101
|
+
var updateUser = async (token, userId, data) => {
|
|
102
|
+
return handleApiRequest("PATCH", `/api/v1/users/me`, {
|
|
103
|
+
token,
|
|
104
|
+
body: data
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
var authApi = {
|
|
108
|
+
login: loginApi,
|
|
109
|
+
register: registerApi,
|
|
110
|
+
oauthLogin: oauthLoginApi,
|
|
111
|
+
forgotPassword: forgetPassApi,
|
|
112
|
+
resetPassword: resetPassApi,
|
|
113
|
+
refreshToken: tokenRefreshApi,
|
|
114
|
+
verifyManager: verifyManagerAuth,
|
|
115
|
+
getUser,
|
|
116
|
+
getUserByPhone,
|
|
117
|
+
createUser,
|
|
118
|
+
getProfile,
|
|
119
|
+
updateUser
|
|
120
|
+
};
|
|
121
|
+
var user_data_default = authApi;
|
|
122
|
+
function useUserSearch({ token }) {
|
|
123
|
+
const searchUserMutation = useMutation({
|
|
124
|
+
mutationFn: async ({ value, by = "email" }) => {
|
|
125
|
+
if (by === "phone") {
|
|
126
|
+
return getUserByPhone(value, token);
|
|
127
|
+
}
|
|
128
|
+
return getUser(value, token);
|
|
129
|
+
},
|
|
130
|
+
onError: (error) => {
|
|
131
|
+
console.error("User search error:", error);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
return {
|
|
135
|
+
searchUser: (value, by = "email") => {
|
|
136
|
+
searchUserMutation.mutate({ value, by });
|
|
137
|
+
},
|
|
138
|
+
user: searchUserMutation.data?.docs?.[0],
|
|
139
|
+
notFound: Array.isArray(searchUserMutation.data?.docs) && searchUserMutation.data.docs.length === 0,
|
|
140
|
+
isSearching: searchUserMutation.isPending,
|
|
141
|
+
error: searchUserMutation.error,
|
|
142
|
+
reset: searchUserMutation.reset
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export { DISCOUNT_ALLOWED_ROLES, UserRole, authApi, createUser, forgetPassApi, getProfile, getUser, getUserByPhone, loginApi, oauthLoginApi, registerApi, resetPassApi, tokenRefreshApi, updateUser, useUserSearch, user_data_default, verifyManagerAuth };
|
|
147
|
+
//# sourceMappingURL=chunk-BDA2WSJA.js.map
|
|
148
|
+
//# sourceMappingURL=chunk-BDA2WSJA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/auth/types.ts","../src/auth/api/user-data.ts","../src/auth/hooks/user-search.ts"],"names":[],"mappings":"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","file":"chunk-BDA2WSJA.js","sourcesContent":["/**\r\n * @classytic/commerce-sdk - Auth Types\r\n *\r\n * Type definitions for authentication and user management.\r\n */\r\n\r\nexport const UserRole = {\r\n SUPER_ADMIN: \"superadmin\",\r\n ADMIN: \"admin\",\r\n CUSTOMER: \"user\",\r\n FINANCE_ADMIN: \"finance-admin\",\r\n FINANCE_MANAGER: \"finance-manager\",\r\n STORE_MANAGER: \"store-manager\",\r\n STORE_STAFF: \"store-staff\",\r\n WAREHOUSE_ADMIN: \"warehouse-admin\",\r\n WAREHOUSE_STAFF: \"warehouse-staff\",\r\n} as const;\r\n\r\nexport type UserRoleType = (typeof UserRole)[keyof typeof UserRole];\r\n\r\nexport interface User {\r\n id: string;\r\n _id?: string;\r\n name: string;\r\n email: string;\r\n phone?: string;\r\n roles: UserRoleType[];\r\n image?: string;\r\n organization?: string;\r\n}\r\n\r\nexport interface AuthResponse {\r\n success: boolean;\r\n token: string;\r\n refreshToken: string;\r\n user: User;\r\n}\r\n\r\nexport interface RefreshResponse {\r\n success: boolean;\r\n token: string;\r\n refreshToken: string;\r\n}\r\n\r\nexport interface AuthApiResponse {\r\n success: boolean;\r\n message?: string;\r\n}\r\n\r\nexport interface LoginCredentials {\r\n email: string;\r\n password: string;\r\n}\r\n\r\nexport interface RegisterData {\r\n name: string;\r\n email: string;\r\n password: string;\r\n phone?: string;\r\n address?: string;\r\n}\r\n\r\nexport interface OAuthLoginData {\r\n email: string;\r\n name: string;\r\n provider: string;\r\n providerAccountId: string;\r\n image?: string;\r\n}\r\n\r\nexport interface ForgotPasswordData {\r\n email: string;\r\n}\r\n\r\nexport interface ResetPasswordData {\r\n newPassword: string;\r\n token: string;\r\n}\r\n\r\nexport interface RefreshTokenData {\r\n token: string;\r\n}\r\n\r\nexport interface VerifyManagerData {\r\n email: string;\r\n password: string;\r\n allowedRoles?: UserRoleType[];\r\n}\r\n\r\nexport interface VerifyManagerResponse {\r\n success: boolean;\r\n user?: User;\r\n message?: string;\r\n}\r\n\r\n/** Allowed roles for discount authorization */\r\nexport const DISCOUNT_ALLOWED_ROLES: UserRoleType[] = [\r\n \"superadmin\",\r\n \"admin\",\r\n \"store-manager\",\r\n];\r\n","/**\r\n * @classytic/commerce-sdk - Auth API\r\n *\r\n * Authentication and user management APIs.\r\n */\r\n\r\nimport { handleApiRequest } from \"../../core/api-handler\";\r\nimport type {\r\n User,\r\n AuthResponse,\r\n RefreshResponse,\r\n AuthApiResponse,\r\n LoginCredentials,\r\n RegisterData,\r\n OAuthLoginData,\r\n ForgotPasswordData,\r\n ResetPasswordData,\r\n RefreshTokenData,\r\n VerifyManagerData,\r\n VerifyManagerResponse,\r\n UserRoleType,\r\n} from \"../types\";\r\nimport { DISCOUNT_ALLOWED_ROLES } from \"../types\";\r\n\r\nexport const forgetPassApi = async (\r\n data: ForgotPasswordData\r\n): Promise<AuthApiResponse> => {\r\n return handleApiRequest(\"POST\", \"/api/v1/auth/forgot-password\", {\r\n body: data,\r\n });\r\n};\r\n\r\nexport const resetPassApi = async (\r\n data: ResetPasswordData\r\n): Promise<AuthApiResponse> => {\r\n return handleApiRequest(\"POST\", \"/api/v1/auth/reset-password\", {\r\n body: data,\r\n });\r\n};\r\n\r\nexport const tokenRefreshApi = async (\r\n data: RefreshTokenData\r\n): Promise<RefreshResponse> => {\r\n return handleApiRequest(\"POST\", \"/api/v1/auth/refresh\", {\r\n body: data,\r\n });\r\n};\r\n\r\nexport const loginApi = async (\r\n data: LoginCredentials\r\n): Promise<AuthResponse> => {\r\n return handleApiRequest(\"POST\", \"/api/v1/auth/login\", {\r\n body: data,\r\n });\r\n};\r\n\r\n/**\r\n * Verify manager credentials for discount authorization\r\n * Returns the user if credentials are valid AND user has allowed roles\r\n */\r\nexport const verifyManagerAuth = async (\r\n data: VerifyManagerData\r\n): Promise<VerifyManagerResponse> => {\r\n const { email, password, allowedRoles = DISCOUNT_ALLOWED_ROLES } = data;\r\n\r\n try {\r\n const response = await handleApiRequest<AuthResponse>(\r\n \"POST\",\r\n \"/api/v1/auth/login\",\r\n {\r\n body: { email, password },\r\n }\r\n );\r\n\r\n const user = response.user;\r\n if (!user) {\r\n return { success: false, message: \"Invalid credentials\" };\r\n }\r\n\r\n // Check if user has any of the allowed roles\r\n const hasAllowedRole = user.roles?.some((role: UserRoleType) =>\r\n allowedRoles.includes(role)\r\n );\r\n if (!hasAllowedRole) {\r\n return {\r\n success: false,\r\n message: \"You don't have permission to authorize discounts\",\r\n };\r\n }\r\n\r\n return { success: true, user };\r\n } catch (error: unknown) {\r\n return {\r\n success: false,\r\n message:\r\n error instanceof Error ? error.message : \"Authentication failed\",\r\n };\r\n }\r\n};\r\n\r\nexport const registerApi = async (\r\n data: RegisterData\r\n): Promise<AuthApiResponse> => {\r\n return handleApiRequest(\"POST\", \"/api/v1/auth/register\", {\r\n body: data,\r\n });\r\n};\r\n\r\nexport const oauthLoginApi = async (\r\n data: OAuthLoginData\r\n): Promise<AuthResponse & { access_token: string; refresh_token: string }> => {\r\n return handleApiRequest(\"POST\", \"/api/v1/auth/oauth-login\", {\r\n body: data,\r\n });\r\n};\r\n\r\nexport interface UserSearchResponse {\r\n success: boolean;\r\n docs?: User[];\r\n message?: string;\r\n}\r\n\r\nexport const getUser = async (email: string, token: string): Promise<UserSearchResponse> => {\r\n const endpoint = `/api/v1/users?email=${email}`;\r\n return handleApiRequest(\"GET\", endpoint, { token });\r\n};\r\n\r\nexport const getUserByPhone = async (phone: string, token: string): Promise<UserSearchResponse> => {\r\n const endpoint = `/api/v1/customers?phone=${phone}`;\r\n return handleApiRequest(\"GET\", endpoint, { token });\r\n};\r\n\r\nexport async function createUser(\r\n name: string,\r\n email: string,\r\n password: string,\r\n phone?: string,\r\n address?: string\r\n) {\r\n const endpoint = \"/api/v1/auth/register\";\r\n return handleApiRequest(\"POST\", endpoint, {\r\n body: { name, email, password, phone, address },\r\n });\r\n}\r\n\r\nexport const getProfile = async (token: string) => {\r\n return handleApiRequest(\"GET\", \"/api/v1/users/me\", { token });\r\n};\r\n\r\nexport const updateUser = async (\r\n token: string,\r\n userId: string,\r\n data: Partial<User>\r\n) => {\r\n return handleApiRequest(\"PATCH\", `/api/v1/users/me`, {\r\n token,\r\n body: data,\r\n });\r\n};\r\n\r\n// Auth API object for convenience\r\nexport const authApi = {\r\n login: loginApi,\r\n register: registerApi,\r\n oauthLogin: oauthLoginApi,\r\n forgotPassword: forgetPassApi,\r\n resetPassword: resetPassApi,\r\n refreshToken: tokenRefreshApi,\r\n verifyManager: verifyManagerAuth,\r\n getUser,\r\n getUserByPhone,\r\n createUser,\r\n getProfile,\r\n updateUser,\r\n};\r\n\r\nexport default authApi;\r\n","\"use client\";\r\n\r\n/**\r\n * User Search Hook\r\n *\r\n * React hook for searching users by email or phone number.\r\n */\r\n\r\nimport { useMutation } from \"@tanstack/react-query\";\r\nimport { getUser, getUserByPhone, type UserSearchResponse } from \"../api\";\r\nimport type { User } from \"../types\";\r\n\r\ninterface UseUserSearchOptions {\r\n token: string;\r\n}\r\n\r\ninterface UseUserSearchReturn {\r\n /** Search for user by email or phone */\r\n searchUser: (value: string, by?: \"email\" | \"phone\") => void;\r\n /** Found user (first match) */\r\n user: User | undefined;\r\n /** No user found for the search */\r\n notFound: boolean;\r\n /** Search in progress */\r\n isSearching: boolean;\r\n /** Search error */\r\n error: Error | null;\r\n /** Reset search state */\r\n reset: () => void;\r\n}\r\n\r\n/**\r\n * Hook for searching users by email or phone number\r\n *\r\n * @param options.token - Auth token (required)\r\n *\r\n * @example\r\n * ```tsx\r\n * const { searchUser, user, isSearching, notFound } = useUserSearch({ token });\r\n *\r\n * // Search by email\r\n * searchUser(\"user@example.com\");\r\n *\r\n * // Search by phone\r\n * searchUser(\"01712345678\", \"phone\");\r\n * ```\r\n */\r\nexport function useUserSearch({ token }: UseUserSearchOptions): UseUserSearchReturn {\r\n const searchUserMutation = useMutation<UserSearchResponse, Error, { value: string; by: \"email\" | \"phone\" }>({\r\n mutationFn: async ({ value, by = \"email\" }) => {\r\n if (by === \"phone\") {\r\n return getUserByPhone(value, token);\r\n }\r\n return getUser(value, token);\r\n },\r\n onError: (error) => {\r\n console.error(\"User search error:\", error);\r\n },\r\n });\r\n\r\n return {\r\n searchUser: (value: string, by: \"email\" | \"phone\" = \"email\") => {\r\n searchUserMutation.mutate({ value, by });\r\n },\r\n user: searchUserMutation.data?.docs?.[0],\r\n notFound:\r\n Array.isArray(searchUserMutation.data?.docs) &&\r\n searchUserMutation.data.docs.length === 0,\r\n isSearching: searchUserMutation.isPending,\r\n error: searchUserMutation.error,\r\n reset: searchUserMutation.reset,\r\n };\r\n}\r\n"]}
|