@classytic/commerce-sdk 0.1.1
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/LICENSE +14 -0
- package/README.md +164 -0
- package/dist/adjustment-MNH3AT6S.js +5 -0
- package/dist/adjustment-MNH3AT6S.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 +571 -0
- package/dist/catalog/index.js +9 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/chunk-24FDD6UR.js +75 -0
- package/dist/chunk-24FDD6UR.js.map +1 -0
- package/dist/chunk-2TF7QNYV.js +159 -0
- package/dist/chunk-2TF7QNYV.js.map +1 -0
- package/dist/chunk-2YAZ5WG6.js +479 -0
- package/dist/chunk-2YAZ5WG6.js.map +1 -0
- package/dist/chunk-36NLLAVH.js +177 -0
- package/dist/chunk-36NLLAVH.js.map +1 -0
- package/dist/chunk-3OYSJB3P.js +126 -0
- package/dist/chunk-3OYSJB3P.js.map +1 -0
- package/dist/chunk-5E57JODA.js +135 -0
- package/dist/chunk-5E57JODA.js.map +1 -0
- package/dist/chunk-7LZCW4VF.js +13 -0
- package/dist/chunk-7LZCW4VF.js.map +1 -0
- package/dist/chunk-ANYGZ6O5.js +830 -0
- package/dist/chunk-ANYGZ6O5.js.map +1 -0
- package/dist/chunk-AQAISI4F.js +183 -0
- package/dist/chunk-AQAISI4F.js.map +1 -0
- package/dist/chunk-B6MPVOV7.js +328 -0
- package/dist/chunk-B6MPVOV7.js.map +1 -0
- package/dist/chunk-CILP56G2.js +94 -0
- package/dist/chunk-CILP56G2.js.map +1 -0
- package/dist/chunk-ERQ52WHY.js +534 -0
- package/dist/chunk-ERQ52WHY.js.map +1 -0
- package/dist/chunk-FOTUJPM4.js +640 -0
- package/dist/chunk-FOTUJPM4.js.map +1 -0
- package/dist/chunk-IHCBBLLW.js +198 -0
- package/dist/chunk-IHCBBLLW.js.map +1 -0
- package/dist/chunk-J4JBQET2.js +76 -0
- package/dist/chunk-J4JBQET2.js.map +1 -0
- package/dist/chunk-L4OEI4VZ.js +123 -0
- package/dist/chunk-L4OEI4VZ.js.map +1 -0
- package/dist/chunk-LRV7MWWX.js +616 -0
- package/dist/chunk-LRV7MWWX.js.map +1 -0
- package/dist/chunk-N43VE355.js +126 -0
- package/dist/chunk-N43VE355.js.map +1 -0
- package/dist/chunk-PYYLHUV6.js +3 -0
- package/dist/chunk-PYYLHUV6.js.map +1 -0
- package/dist/chunk-QCTXAMLA.js +261 -0
- package/dist/chunk-QCTXAMLA.js.map +1 -0
- package/dist/chunk-RIKAPJNG.js +40 -0
- package/dist/chunk-RIKAPJNG.js.map +1 -0
- package/dist/chunk-U3XT35GZ.js +202 -0
- package/dist/chunk-U3XT35GZ.js.map +1 -0
- package/dist/chunk-W22WB3WZ.js +148 -0
- package/dist/chunk-W22WB3WZ.js.map +1 -0
- package/dist/chunk-WTIJMKML.js +27 -0
- package/dist/chunk-WTIJMKML.js.map +1 -0
- package/dist/chunk-X2CQFJPR.js +75 -0
- package/dist/chunk-X2CQFJPR.js.map +1 -0
- package/dist/chunk-YYFKLOKO.js +769 -0
- package/dist/chunk-YYFKLOKO.js.map +1 -0
- package/dist/client-Cs7E_usr.d.ts +113 -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 +166 -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-BZSZ0y3n.d.ts +129 -0
- package/dist/coupon-CDzL4bJG.d.ts +655 -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 +32 -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-B5pssqRx.d.ts +748 -0
- package/dist/logistics/index.d.ts +248 -0
- package/dist/logistics/index.js +7 -0
- package/dist/logistics/index.js.map +1 -0
- package/dist/logistics-CrpKadKE.d.ts +410 -0
- package/dist/media-CNLJK93J.d.ts +721 -0
- package/dist/movement-R3CERFAM.js +5 -0
- package/dist/movement-R3CERFAM.js.map +1 -0
- package/dist/order-B3dCvHgK.d.ts +360 -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-BCqkx2-K.d.ts +527 -0
- package/dist/product-p09zXkXB.d.ts +260 -0
- package/dist/purchase-54PER2PY.js +5 -0
- package/dist/purchase-54PER2PY.js.map +1 -0
- package/dist/request-MP6NV5ZE.js +5 -0
- package/dist/request-MP6NV5ZE.js.map +1 -0
- package/dist/sales/index.d.ts +587 -0
- package/dist/sales/index.js +9 -0
- package/dist/sales/index.js.map +1 -0
- package/dist/server.d.ts +23 -0
- package/dist/server.js +37 -0
- package/dist/server.js.map +1 -0
- package/dist/size-guide-DgjzjM5P.d.ts +554 -0
- package/dist/stock-2LP4HJSB.js +5 -0
- package/dist/stock-2LP4HJSB.js.map +1 -0
- package/dist/stock-CfrU5_Wr.d.ts +632 -0
- package/dist/supplier-BWJTRZ5Z.js +5 -0
- package/dist/supplier-BWJTRZ5Z.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-Bf6WjYCh.d.ts +84 -0
- package/dist/transaction-dL3WW-er.d.ts +442 -0
- package/dist/transfer-4XSS6HWT.js +5 -0
- package/dist/transfer-4XSS6HWT.js.map +1 -0
- package/dist/user-data-DdLjAGwO.d.ts +132 -0
- package/package.json +147 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { handleApiRequest } from './chunk-IHCBBLLW.js';
|
|
2
|
+
|
|
3
|
+
// src/analytics/api/analytics.ts
|
|
4
|
+
var AnalyticsApi = class {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.baseUrl = "/api/v1/analytics";
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Get dashboard analytics
|
|
10
|
+
* GET /analytics/dashboard
|
|
11
|
+
*
|
|
12
|
+
* @param token - Auth token (required)
|
|
13
|
+
* @param params.period - Time period: '7d', '30d', '90d', '1y' (default: '30d')
|
|
14
|
+
* @param params.branchId - Optional branch filter
|
|
15
|
+
*/
|
|
16
|
+
async getDashboard({
|
|
17
|
+
token,
|
|
18
|
+
params = {},
|
|
19
|
+
options = {}
|
|
20
|
+
}) {
|
|
21
|
+
if (!token) {
|
|
22
|
+
throw new Error("Authentication required");
|
|
23
|
+
}
|
|
24
|
+
const queryParams = new URLSearchParams();
|
|
25
|
+
if (params.period) queryParams.append("period", params.period);
|
|
26
|
+
if (params.branchId) queryParams.append("branchId", params.branchId);
|
|
27
|
+
const url = `${this.baseUrl}/dashboard${queryParams.toString() ? `?${queryParams}` : ""}`;
|
|
28
|
+
return handleApiRequest("GET", url, {
|
|
29
|
+
token,
|
|
30
|
+
cache: "no-store",
|
|
31
|
+
// Always fetch fresh analytics data
|
|
32
|
+
...options
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
var analyticsApi = new AnalyticsApi();
|
|
37
|
+
|
|
38
|
+
export { AnalyticsApi, analyticsApi };
|
|
39
|
+
//# sourceMappingURL=chunk-RIKAPJNG.js.map
|
|
40
|
+
//# sourceMappingURL=chunk-RIKAPJNG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/analytics/api/analytics.ts"],"names":[],"mappings":";;;AAgBA,IAAM,eAAN,MAAmB;AAAA,EAGjB,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,mBAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,YAAA,CAAa;AAAA,IACjB,KAAA;AAAA,IACA,SAAS,EAAC;AAAA,IACV,UAAU;AAAC,GACb,EAI6C;AAC3C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,IAAA,IAAI,OAAO,MAAA,EAAQ,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,OAAO,MAAM,CAAA;AAC7D,IAAA,IAAI,OAAO,QAAA,EAAU,WAAA,CAAY,MAAA,CAAO,UAAA,EAAY,OAAO,QAAQ,CAAA;AAEnE,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,UAAA,EAAa,WAAA,CAAY,QAAA,EAAS,GAAI,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAEvF,IAAA,OAAO,gBAAA,CAAiB,OAAO,GAAA,EAAK;AAAA,MAClC,KAAA;AAAA,MACA,KAAA,EAAO,UAAA;AAAA;AAAA,MACP,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AACF;AAEO,IAAM,YAAA,GAAe,IAAI,YAAA","file":"chunk-RIKAPJNG.js","sourcesContent":["/**\r\n * Analytics API - Dashboard and reporting\r\n *\r\n * Endpoints:\r\n * - getDashboard({ token, params }) - Get dashboard analytics\r\n *\r\n * Roles:\r\n * - admin, superadmin, finance-admin, finance-manager\r\n */\r\n\r\nimport { handleApiRequest } from \"../../core/api-handler\";\r\nimport type { ApiResponse, RequestOptions } from \"../../core/api-factory\";\r\nimport type { AnalyticsDashboard, AnalyticsDashboardParams } from \"../types\";\r\n\r\ntype FetchOptions = Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n\r\nclass AnalyticsApi {\r\n private baseUrl: string;\r\n\r\n constructor() {\r\n this.baseUrl = \"/api/v1/analytics\";\r\n }\r\n\r\n /**\r\n * Get dashboard analytics\r\n * GET /analytics/dashboard\r\n *\r\n * @param token - Auth token (required)\r\n * @param params.period - Time period: '7d', '30d', '90d', '1y' (default: '30d')\r\n * @param params.branchId - Optional branch filter\r\n */\r\n async getDashboard({\r\n token,\r\n params = {},\r\n options = {},\r\n }: {\r\n token: string;\r\n params?: AnalyticsDashboardParams;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<AnalyticsDashboard>> {\r\n if (!token) {\r\n throw new Error(\"Authentication required\");\r\n }\r\n\r\n const queryParams = new URLSearchParams();\r\n if (params.period) queryParams.append(\"period\", params.period);\r\n if (params.branchId) queryParams.append(\"branchId\", params.branchId);\r\n\r\n const url = `${this.baseUrl}/dashboard${queryParams.toString() ? `?${queryParams}` : \"\"}`;\r\n\r\n return handleApiRequest(\"GET\", url, {\r\n token,\r\n cache: \"no-store\", // Always fetch fresh analytics data\r\n ...options,\r\n });\r\n }\r\n}\r\n\r\nexport const analyticsApi = new AnalyticsApi();\r\nexport { AnalyticsApi };\r\n"]}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { useQueryClient, useMutation } from '@tanstack/react-query';
|
|
2
|
+
import { useTransition } from 'react';
|
|
3
|
+
|
|
4
|
+
// src/core/react/mutation.factory.ts
|
|
5
|
+
var toastHandler = {
|
|
6
|
+
success: (message) => console.log("[Success]", message),
|
|
7
|
+
error: (message) => console.error("[Error]", message)
|
|
8
|
+
};
|
|
9
|
+
function configureToast(handler) {
|
|
10
|
+
toastHandler = handler;
|
|
11
|
+
}
|
|
12
|
+
function getToastHandler() {
|
|
13
|
+
return toastHandler;
|
|
14
|
+
}
|
|
15
|
+
function useMutationWithTransition(config) {
|
|
16
|
+
const {
|
|
17
|
+
mutationFn,
|
|
18
|
+
invalidateQueries = [],
|
|
19
|
+
onSuccess,
|
|
20
|
+
onError,
|
|
21
|
+
messages = {},
|
|
22
|
+
useTransition: shouldUseTransition = true,
|
|
23
|
+
showToast = true
|
|
24
|
+
} = config;
|
|
25
|
+
const queryClient = useQueryClient();
|
|
26
|
+
const [isPending, startTransition] = useTransition();
|
|
27
|
+
const mutation = useMutation({
|
|
28
|
+
mutationFn,
|
|
29
|
+
onSuccess: (data, variables, context) => {
|
|
30
|
+
if (shouldUseTransition && invalidateQueries.length > 0) {
|
|
31
|
+
startTransition(() => {
|
|
32
|
+
invalidateQueries.forEach((queryKey) => {
|
|
33
|
+
queryClient.invalidateQueries({ queryKey });
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
} else if (invalidateQueries.length > 0) {
|
|
37
|
+
invalidateQueries.forEach((queryKey) => {
|
|
38
|
+
queryClient.invalidateQueries({ queryKey });
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
if (showToast && messages.success) {
|
|
42
|
+
toastHandler.success(
|
|
43
|
+
typeof messages.success === "function" ? messages.success(data, variables) : messages.success
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
onSuccess?.(data, variables, context);
|
|
47
|
+
},
|
|
48
|
+
onError: (error, variables, context) => {
|
|
49
|
+
if (showToast) {
|
|
50
|
+
const errorMessage = typeof messages.error === "function" ? messages.error(error, variables) : messages.error || error?.message || "An error occurred";
|
|
51
|
+
toastHandler.error(errorMessage);
|
|
52
|
+
}
|
|
53
|
+
onError?.(error, variables, context);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
return {
|
|
57
|
+
mutate: mutation.mutate,
|
|
58
|
+
mutateAsync: mutation.mutateAsync,
|
|
59
|
+
isLoading: mutation.isPending || isPending,
|
|
60
|
+
isPending: mutation.isPending || isPending,
|
|
61
|
+
isSuccess: mutation.isSuccess,
|
|
62
|
+
error: mutation.error,
|
|
63
|
+
data: mutation.data,
|
|
64
|
+
reset: mutation.reset
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function useMutationWithOptimistic(config) {
|
|
68
|
+
const {
|
|
69
|
+
mutationFn,
|
|
70
|
+
queryKeys = [],
|
|
71
|
+
optimisticUpdate,
|
|
72
|
+
messages = {},
|
|
73
|
+
onSuccess,
|
|
74
|
+
onError,
|
|
75
|
+
showToast = true
|
|
76
|
+
} = config;
|
|
77
|
+
const queryClient = useQueryClient();
|
|
78
|
+
const mutation = useMutation({
|
|
79
|
+
mutationFn,
|
|
80
|
+
onMutate: async (variables) => {
|
|
81
|
+
await Promise.all(
|
|
82
|
+
queryKeys.map((queryKey) => queryClient.cancelQueries({ queryKey }))
|
|
83
|
+
);
|
|
84
|
+
const previousData = queryKeys.map((queryKey) => ({
|
|
85
|
+
queryKey,
|
|
86
|
+
data: queryClient.getQueryData(queryKey)
|
|
87
|
+
}));
|
|
88
|
+
if (optimisticUpdate) {
|
|
89
|
+
queryKeys.forEach((queryKey) => {
|
|
90
|
+
queryClient.setQueryData(
|
|
91
|
+
queryKey,
|
|
92
|
+
(old) => optimisticUpdate(old, variables)
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return { previousData };
|
|
97
|
+
},
|
|
98
|
+
onSuccess: (data, variables, context) => {
|
|
99
|
+
queryKeys.forEach((queryKey) => {
|
|
100
|
+
queryClient.invalidateQueries({ queryKey });
|
|
101
|
+
});
|
|
102
|
+
if (showToast && messages.success) {
|
|
103
|
+
toastHandler.success(
|
|
104
|
+
typeof messages.success === "function" ? messages.success(data, variables) : messages.success
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
onSuccess?.(data, variables, context);
|
|
108
|
+
},
|
|
109
|
+
onError: (error, variables, context) => {
|
|
110
|
+
const ctx = context;
|
|
111
|
+
if (ctx?.previousData) {
|
|
112
|
+
ctx.previousData.forEach(({ queryKey, data }) => {
|
|
113
|
+
queryClient.setQueryData(queryKey, data);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
if (showToast) {
|
|
117
|
+
const errorMessage = typeof messages.error === "function" ? messages.error(error, variables) : messages.error || error?.message || "An error occurred";
|
|
118
|
+
toastHandler.error(errorMessage);
|
|
119
|
+
}
|
|
120
|
+
onError?.(error, variables, context);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
return {
|
|
124
|
+
mutate: mutation.mutate,
|
|
125
|
+
mutateAsync: mutation.mutateAsync,
|
|
126
|
+
isLoading: mutation.isPending,
|
|
127
|
+
isPending: mutation.isPending,
|
|
128
|
+
isSuccess: mutation.isSuccess,
|
|
129
|
+
error: mutation.error,
|
|
130
|
+
data: mutation.data,
|
|
131
|
+
reset: mutation.reset
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function createOptimisticMutation({
|
|
135
|
+
mutationFn,
|
|
136
|
+
queryClient,
|
|
137
|
+
queryKeys,
|
|
138
|
+
optimisticUpdate,
|
|
139
|
+
onSuccess,
|
|
140
|
+
onError,
|
|
141
|
+
messages
|
|
142
|
+
}) {
|
|
143
|
+
return useMutation({
|
|
144
|
+
mutationFn,
|
|
145
|
+
onMutate: async (variables) => {
|
|
146
|
+
await Promise.all(
|
|
147
|
+
queryKeys.map(
|
|
148
|
+
(key) => queryClient.cancelQueries({ queryKey: key, exact: false })
|
|
149
|
+
)
|
|
150
|
+
);
|
|
151
|
+
const previous = queryKeys.map((key) => ({
|
|
152
|
+
key,
|
|
153
|
+
data: queryClient.getQueriesData({ queryKey: key })
|
|
154
|
+
}));
|
|
155
|
+
if (optimisticUpdate) {
|
|
156
|
+
queryKeys.forEach((key) => {
|
|
157
|
+
const queries = queryClient.getQueriesData({ queryKey: key });
|
|
158
|
+
queries.forEach(([queryKey, queryData]) => {
|
|
159
|
+
queryClient.setQueryData(queryKey, optimisticUpdate(queryData, variables));
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
return { previous };
|
|
164
|
+
},
|
|
165
|
+
onSuccess: (data, variables, context) => {
|
|
166
|
+
if (messages?.success) {
|
|
167
|
+
toastHandler.success(
|
|
168
|
+
typeof messages.success === "function" ? messages.success(data, variables) : messages.success
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
queryKeys.forEach((key) => {
|
|
172
|
+
queryClient.invalidateQueries({ queryKey: key });
|
|
173
|
+
});
|
|
174
|
+
onSuccess?.(data, variables, context);
|
|
175
|
+
},
|
|
176
|
+
onError: (error, variables, context) => {
|
|
177
|
+
const ctx = context;
|
|
178
|
+
if (ctx?.previous) {
|
|
179
|
+
ctx.previous.forEach(({ data }) => {
|
|
180
|
+
data.forEach(([queryKey, queryData]) => {
|
|
181
|
+
queryClient.setQueryData(queryKey, queryData);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
toastHandler.error(
|
|
186
|
+
typeof messages?.error === "function" ? messages.error(error, variables) : messages?.error || error?.message || "An error occurred"
|
|
187
|
+
);
|
|
188
|
+
onError?.(error, variables, context);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
var QUERY_CONFIGS = {
|
|
193
|
+
realtime: { staleTime: 2e4, refetchInterval: 3e4 },
|
|
194
|
+
frequent: { staleTime: 6e4, refetchInterval: false },
|
|
195
|
+
stable: { staleTime: 3e5, refetchInterval: false },
|
|
196
|
+
static: { staleTime: 6e5, refetchInterval: false }
|
|
197
|
+
};
|
|
198
|
+
var createMessage = (fn) => fn;
|
|
199
|
+
|
|
200
|
+
export { QUERY_CONFIGS, configureToast, createMessage, createOptimisticMutation, getToastHandler, useMutationWithOptimistic, useMutationWithTransition };
|
|
201
|
+
//# sourceMappingURL=chunk-U3XT35GZ.js.map
|
|
202
|
+
//# sourceMappingURL=chunk-U3XT35GZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/react/mutation.factory.ts"],"names":[],"mappings":"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","file":"chunk-U3XT35GZ.js","sourcesContent":["\"use client\";\r\n\r\nimport {\r\n useMutation,\r\n useQueryClient,\r\n type QueryClient,\r\n type QueryKey,\r\n} from \"@tanstack/react-query\";\r\nimport { useTransition } from \"react\";\r\n\r\n// Configurable toast handler - users can override this\r\nlet toastHandler: ToastHandler = {\r\n success: (message: string) => console.log(\"[Success]\", message),\r\n error: (message: string) => console.error(\"[Error]\", message),\r\n};\r\n\r\nexport interface ToastHandler {\r\n success: (message: string) => void;\r\n error: (message: string) => void;\r\n}\r\n\r\n/**\r\n * Configure the toast handler for mutations\r\n * @example\r\n * import { toast } from 'sonner';\r\n * configureToast({ success: toast.success, error: toast.error });\r\n */\r\nexport function configureToast(handler: ToastHandler): void {\r\n toastHandler = handler;\r\n}\r\n\r\n/**\r\n * Get the current toast handler (for internal use)\r\n */\r\nexport function getToastHandler(): ToastHandler {\r\n return toastHandler;\r\n}\r\n\r\nexport interface MutationMessages {\r\n success?: string | ((data: unknown, variables: unknown) => string);\r\n error?: string | ((error: Error, variables: unknown) => string);\r\n}\r\n\r\nexport interface MutationWithTransitionConfig<TData, TVariables> {\r\n mutationFn: (variables: TVariables) => Promise<TData>;\r\n invalidateQueries?: QueryKey[];\r\n onSuccess?: (data: TData, variables: TVariables, context: unknown) => void;\r\n onError?: (error: Error, variables: TVariables, context: unknown) => void;\r\n messages?: MutationMessages;\r\n useTransition?: boolean;\r\n showToast?: boolean;\r\n}\r\n\r\nexport function useMutationWithTransition<TData, TVariables>(\r\n config: MutationWithTransitionConfig<TData, TVariables>\r\n) {\r\n const {\r\n mutationFn,\r\n invalidateQueries = [],\r\n onSuccess,\r\n onError,\r\n messages = {},\r\n useTransition: shouldUseTransition = true,\r\n showToast = true,\r\n } = config;\r\n\r\n const queryClient = useQueryClient();\r\n const [isPending, startTransition] = useTransition();\r\n\r\n const mutation = useMutation({\r\n mutationFn,\r\n\r\n onSuccess: (data, variables, context) => {\r\n if (shouldUseTransition && invalidateQueries.length > 0) {\r\n startTransition(() => {\r\n invalidateQueries.forEach((queryKey) => {\r\n queryClient.invalidateQueries({ queryKey });\r\n });\r\n });\r\n } else if (invalidateQueries.length > 0) {\r\n invalidateQueries.forEach((queryKey) => {\r\n queryClient.invalidateQueries({ queryKey });\r\n });\r\n }\r\n\r\n if (showToast && messages.success) {\r\n toastHandler.success(\r\n typeof messages.success === \"function\"\r\n ? messages.success(data, variables)\r\n : messages.success\r\n );\r\n }\r\n\r\n onSuccess?.(data, variables, context);\r\n },\r\n\r\n onError: (error, variables, context) => {\r\n if (showToast) {\r\n const errorMessage =\r\n typeof messages.error === \"function\"\r\n ? messages.error(error as Error, variables)\r\n : messages.error || (error as Error)?.message || \"An error occurred\";\r\n\r\n toastHandler.error(errorMessage);\r\n }\r\n\r\n onError?.(error as Error, variables, context);\r\n },\r\n });\r\n\r\n return {\r\n mutate: mutation.mutate,\r\n mutateAsync: mutation.mutateAsync,\r\n isLoading: mutation.isPending || isPending,\r\n isPending: mutation.isPending || isPending,\r\n isSuccess: mutation.isSuccess,\r\n error: mutation.error,\r\n data: mutation.data,\r\n reset: mutation.reset,\r\n };\r\n}\r\n\r\nexport interface MutationWithOptimisticConfig<TData, TVariables> {\r\n mutationFn: (variables: TVariables) => Promise<TData>;\r\n queryKeys?: QueryKey[];\r\n optimisticUpdate?: (oldData: unknown, variables: TVariables) => unknown;\r\n messages?: MutationMessages;\r\n onSuccess?: (data: TData, variables: TVariables, context: unknown) => void;\r\n onError?: (error: Error, variables: TVariables, context: unknown) => void;\r\n showToast?: boolean;\r\n}\r\n\r\nexport function useMutationWithOptimistic<TData, TVariables>(\r\n config: MutationWithOptimisticConfig<TData, TVariables>\r\n) {\r\n const {\r\n mutationFn,\r\n queryKeys = [],\r\n optimisticUpdate,\r\n messages = {},\r\n onSuccess,\r\n onError,\r\n showToast = true,\r\n } = config;\r\n\r\n const queryClient = useQueryClient();\r\n\r\n const mutation = useMutation({\r\n mutationFn,\r\n\r\n onMutate: async (variables) => {\r\n await Promise.all(\r\n queryKeys.map((queryKey) => queryClient.cancelQueries({ queryKey }))\r\n );\r\n\r\n const previousData = queryKeys.map((queryKey) => ({\r\n queryKey,\r\n data: queryClient.getQueryData(queryKey),\r\n }));\r\n\r\n if (optimisticUpdate) {\r\n queryKeys.forEach((queryKey) => {\r\n queryClient.setQueryData(queryKey, (old: unknown) =>\r\n optimisticUpdate(old, variables)\r\n );\r\n });\r\n }\r\n\r\n return { previousData };\r\n },\r\n\r\n onSuccess: (data, variables, context) => {\r\n queryKeys.forEach((queryKey) => {\r\n queryClient.invalidateQueries({ queryKey });\r\n });\r\n\r\n if (showToast && messages.success) {\r\n toastHandler.success(\r\n typeof messages.success === \"function\"\r\n ? messages.success(data, variables)\r\n : messages.success\r\n );\r\n }\r\n\r\n onSuccess?.(data, variables, context);\r\n },\r\n\r\n onError: (error, variables, context) => {\r\n const ctx = context as { previousData?: Array<{ queryKey: QueryKey; data: unknown }> };\r\n if (ctx?.previousData) {\r\n ctx.previousData.forEach(({ queryKey, data }) => {\r\n queryClient.setQueryData(queryKey, data);\r\n });\r\n }\r\n\r\n if (showToast) {\r\n const errorMessage =\r\n typeof messages.error === \"function\"\r\n ? messages.error(error as Error, variables)\r\n : messages.error || (error as Error)?.message || \"An error occurred\";\r\n\r\n toastHandler.error(errorMessage);\r\n }\r\n\r\n onError?.(error as Error, variables, context);\r\n },\r\n });\r\n\r\n return {\r\n mutate: mutation.mutate,\r\n mutateAsync: mutation.mutateAsync,\r\n isLoading: mutation.isPending,\r\n isPending: mutation.isPending,\r\n isSuccess: mutation.isSuccess,\r\n error: mutation.error,\r\n data: mutation.data,\r\n reset: mutation.reset,\r\n };\r\n}\r\n\r\nexport interface CreateOptimisticMutationConfig<TData, TVariables> {\r\n mutationFn: (variables: TVariables) => Promise<TData>;\r\n queryClient: QueryClient;\r\n queryKeys: QueryKey[];\r\n optimisticUpdate?: (oldData: unknown, variables: TVariables) => unknown;\r\n onSuccess?: (data: TData, variables: TVariables, context: unknown) => void;\r\n onError?: (error: Error, variables: TVariables, context: unknown) => void;\r\n messages?: MutationMessages;\r\n}\r\n\r\nexport function createOptimisticMutation<TData, TVariables>({\r\n mutationFn,\r\n queryClient,\r\n queryKeys,\r\n optimisticUpdate,\r\n onSuccess,\r\n onError,\r\n messages,\r\n}: CreateOptimisticMutationConfig<TData, TVariables>) {\r\n return useMutation({\r\n mutationFn,\r\n\r\n onMutate: async (variables) => {\r\n await Promise.all(\r\n queryKeys.map((key) =>\r\n queryClient.cancelQueries({ queryKey: key, exact: false })\r\n )\r\n );\r\n\r\n const previous = queryKeys.map((key) => ({\r\n key,\r\n data: queryClient.getQueriesData({ queryKey: key }),\r\n }));\r\n\r\n if (optimisticUpdate) {\r\n queryKeys.forEach((key) => {\r\n const queries = queryClient.getQueriesData({ queryKey: key });\r\n queries.forEach(([queryKey, queryData]) => {\r\n queryClient.setQueryData(queryKey, optimisticUpdate(queryData, variables));\r\n });\r\n });\r\n }\r\n\r\n return { previous };\r\n },\r\n\r\n onSuccess: (data, variables, context) => {\r\n if (messages?.success) {\r\n toastHandler.success(\r\n typeof messages.success === \"function\"\r\n ? messages.success(data, variables)\r\n : messages.success\r\n );\r\n }\r\n\r\n queryKeys.forEach((key) => {\r\n queryClient.invalidateQueries({ queryKey: key });\r\n });\r\n\r\n onSuccess?.(data, variables, context);\r\n },\r\n\r\n onError: (error, variables, context) => {\r\n const ctx = context as {\r\n previous?: Array<{ key: QueryKey; data: Array<[QueryKey, unknown]> }>;\r\n };\r\n if (ctx?.previous) {\r\n ctx.previous.forEach(({ data }) => {\r\n data.forEach(([queryKey, queryData]) => {\r\n queryClient.setQueryData(queryKey, queryData);\r\n });\r\n });\r\n }\r\n\r\n toastHandler.error(\r\n typeof messages?.error === \"function\"\r\n ? messages.error(error as Error, variables)\r\n : messages?.error || (error as Error)?.message || \"An error occurred\"\r\n );\r\n\r\n onError?.(error as Error, variables, context);\r\n },\r\n });\r\n}\r\n\r\nexport const QUERY_CONFIGS = {\r\n realtime: { staleTime: 20000, refetchInterval: 30000 },\r\n frequent: { staleTime: 60000, refetchInterval: false },\r\n stable: { staleTime: 300000, refetchInterval: false },\r\n static: { staleTime: 600000, refetchInterval: false },\r\n} as const;\r\n\r\nexport const createMessage = <T>(fn: T): T => fn;\r\n"]}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { handleApiRequest } from './chunk-IHCBBLLW.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-W22WB3WZ.js.map
|
|
148
|
+
//# sourceMappingURL=chunk-W22WB3WZ.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-W22WB3WZ.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"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { analyticsApi } from './chunk-RIKAPJNG.js';
|
|
2
|
+
import { useQuery } from '@tanstack/react-query';
|
|
3
|
+
|
|
4
|
+
var ANALYTICS_KEYS = {
|
|
5
|
+
all: ["analytics"],
|
|
6
|
+
dashboard: (period) => ["analytics", "dashboard", period]
|
|
7
|
+
};
|
|
8
|
+
function useAnalyticsDashboard(token, params = {}, options = {}) {
|
|
9
|
+
const period = params.period || "30d";
|
|
10
|
+
return useQuery({
|
|
11
|
+
queryKey: ANALYTICS_KEYS.dashboard(period),
|
|
12
|
+
queryFn: () => analyticsApi.getDashboard({ token, params }),
|
|
13
|
+
enabled: !!token && options.enabled !== false,
|
|
14
|
+
staleTime: 2 * 60 * 1e3,
|
|
15
|
+
// 2 minutes (analytics data updates frequently)
|
|
16
|
+
gcTime: 10 * 60 * 1e3,
|
|
17
|
+
// 10 minutes
|
|
18
|
+
refetchOnWindowFocus: true,
|
|
19
|
+
// Refresh analytics on window focus
|
|
20
|
+
retry: 1,
|
|
21
|
+
select: (data) => data?.data
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { ANALYTICS_KEYS, useAnalyticsDashboard };
|
|
26
|
+
//# sourceMappingURL=chunk-WTIJMKML.js.map
|
|
27
|
+
//# sourceMappingURL=chunk-WTIJMKML.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/analytics/hooks/analytics.ts"],"names":[],"mappings":";;;AAWO,IAAM,cAAA,GAAiB;AAAA,EAC5B,GAAA,EAAK,CAAC,WAAW,CAAA;AAAA,EACjB,WAAW,CAAC,MAAA,KAAoB,CAAC,WAAA,EAAa,aAAa,MAAM;AACnE;AAeO,SAAS,sBACd,KAAA,EACA,MAAA,GAAmC,EAAC,EACpC,OAAA,GAAiC,EAAC,EAClC;AACA,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,KAAA;AAEhC,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,cAAA,CAAe,SAAA,CAAU,MAAM,CAAA;AAAA,IACzC,SAAS,MAAM,YAAA,CAAa,aAAa,EAAE,KAAA,EAAO,QAAQ,CAAA;AAAA,IAC1D,OAAA,EAAS,CAAC,CAAC,KAAA,IAAS,QAAQ,OAAA,KAAY,KAAA;AAAA,IACxC,SAAA,EAAW,IAAI,EAAA,GAAK,GAAA;AAAA;AAAA,IACpB,MAAA,EAAQ,KAAK,EAAA,GAAK,GAAA;AAAA;AAAA,IAClB,oBAAA,EAAsB,IAAA;AAAA;AAAA,IACtB,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAC,IAAA,KAAS,IAAA,EAAM;AAAA,GACzB,CAAA;AACH","file":"chunk-WTIJMKML.js","sourcesContent":["/**\r\n * Analytics Hooks\r\n *\r\n * React Query hooks for analytics data\r\n */\r\n\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { analyticsApi } from \"../api\";\r\nimport type { AnalyticsDashboard, AnalyticsDashboardParams } from \"../types\";\r\n\r\n// Query keys for analytics\r\nexport const ANALYTICS_KEYS = {\r\n all: [\"analytics\"] as const,\r\n dashboard: (period?: string) => [\"analytics\", \"dashboard\", period] as const,\r\n};\r\n\r\n/**\r\n * Hook to fetch dashboard analytics data\r\n *\r\n * @param token - Auth token (required)\r\n * @param params.period - Time period: '7d' | '30d' | '90d' | '1y' (default: '30d')\r\n * @param params.branchId - Optional branch filter\r\n * @param options.enabled - Enable/disable query (default: true)\r\n *\r\n * @example\r\n * ```tsx\r\n * const { data, isLoading } = useAnalyticsDashboard(token, { period: '30d' });\r\n * ```\r\n */\r\nexport function useAnalyticsDashboard(\r\n token: string,\r\n params: AnalyticsDashboardParams = {},\r\n options: { enabled?: boolean } = {}\r\n) {\r\n const period = params.period || \"30d\";\r\n\r\n return useQuery({\r\n queryKey: ANALYTICS_KEYS.dashboard(period),\r\n queryFn: () => analyticsApi.getDashboard({ token, params }),\r\n enabled: !!token && options.enabled !== false,\r\n staleTime: 2 * 60 * 1000, // 2 minutes (analytics data updates frequently)\r\n gcTime: 10 * 60 * 1000, // 10 minutes\r\n refetchOnWindowFocus: true, // Refresh analytics on window focus\r\n retry: 1,\r\n select: (data) => data?.data as AnalyticsDashboard,\r\n });\r\n}\r\n"]}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { BaseApi } from './chunk-QCTXAMLA.js';
|
|
2
|
+
import { handleApiRequest } from './chunk-IHCBBLLW.js';
|
|
3
|
+
|
|
4
|
+
// src/inventory/api/stock.ts
|
|
5
|
+
var StockApi = class extends BaseApi {
|
|
6
|
+
constructor(config = {}) {
|
|
7
|
+
super("inventory", config);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* List stock entries
|
|
11
|
+
* GET /inventory
|
|
12
|
+
*/
|
|
13
|
+
async list({
|
|
14
|
+
token,
|
|
15
|
+
params = {},
|
|
16
|
+
options = {}
|
|
17
|
+
}) {
|
|
18
|
+
const processedParams = this.prepareParams(params);
|
|
19
|
+
const queryString = this.createQueryString(processedParams);
|
|
20
|
+
return handleApiRequest("GET", `${this.baseUrl}?${queryString}`, {
|
|
21
|
+
token,
|
|
22
|
+
cache: this.config.cache,
|
|
23
|
+
...options
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get stock entry by ID
|
|
28
|
+
* GET /inventory/:id
|
|
29
|
+
*/
|
|
30
|
+
async getById({
|
|
31
|
+
token,
|
|
32
|
+
id,
|
|
33
|
+
options = {}
|
|
34
|
+
}) {
|
|
35
|
+
if (!id) {
|
|
36
|
+
throw new Error("Stock entry ID is required");
|
|
37
|
+
}
|
|
38
|
+
return handleApiRequest("GET", `${this.baseUrl}/${id}`, {
|
|
39
|
+
token,
|
|
40
|
+
cache: this.config.cache,
|
|
41
|
+
...options
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get stock for a specific product
|
|
46
|
+
* GET /inventory?productId=<id>
|
|
47
|
+
*/
|
|
48
|
+
async getByProduct({
|
|
49
|
+
token,
|
|
50
|
+
productId,
|
|
51
|
+
branchId,
|
|
52
|
+
options = {}
|
|
53
|
+
}) {
|
|
54
|
+
const params = { productId };
|
|
55
|
+
if (branchId) params.branchId = branchId;
|
|
56
|
+
return this.list({ token, params, options });
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get stock for a specific branch
|
|
60
|
+
* GET /inventory?branchId=<id>
|
|
61
|
+
*/
|
|
62
|
+
async getByBranch({
|
|
63
|
+
token,
|
|
64
|
+
branchId,
|
|
65
|
+
params = {},
|
|
66
|
+
options = {}
|
|
67
|
+
}) {
|
|
68
|
+
return this.list({ token, params: { ...params, branchId }, options });
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
var stockApi = new StockApi();
|
|
72
|
+
|
|
73
|
+
export { StockApi, stockApi };
|
|
74
|
+
//# sourceMappingURL=chunk-X2CQFJPR.js.map
|
|
75
|
+
//# sourceMappingURL=chunk-X2CQFJPR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/inventory/api/stock.ts"],"names":[],"mappings":";;;;AAaA,IAAM,QAAA,GAAN,cAAuB,OAAA,CAAoB;AAAA,EACzC,WAAA,CAAY,MAAA,GAAS,EAAC,EAAG;AACvB,IAAA,KAAA,CAAM,aAAa,MAAM,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAA,CAAK;AAAA,IACT,KAAA;AAAA,IACA,SAAS,EAAC;AAAA,IACV,UAAU;AAAC,GACb,EAI2C;AACzC,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AACjD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,iBAAA,CAAkB,eAAe,CAAA;AAE1D,IAAA,OAAO,iBAAiB,KAAA,EAAO,CAAA,EAAG,KAAK,OAAO,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAI;AAAA,MAC/D,KAAA;AAAA,MACA,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,MACnB,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,CAAQ;AAAA,IACZ,KAAA;AAAA,IACA,EAAA;AAAA,IACA,UAAU;AAAC,GACb,EAIqC;AACnC,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,iBAAiB,KAAA,EAAO,CAAA,EAAG,KAAK,OAAO,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI;AAAA,MACtD,KAAA;AAAA,MACA,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,MACnB,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAA,CAAa;AAAA,IACjB,KAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAU;AAAC,GACb,EAK2C;AACzC,IAAA,MAAM,MAAA,GAAkC,EAAE,SAAA,EAAU;AACpD,IAAA,IAAI,QAAA,SAAiB,QAAA,GAAW,QAAA;AAEhC,IAAA,OAAO,KAAK,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,SAAS,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAA,CAAY;AAAA,IAChB,KAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAS,EAAC;AAAA,IACV,UAAU;AAAC,GACb,EAK2C;AACzC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,QAAA,EAAS,EAAG,OAAA,EAAS,CAAA;AAAA,EACtE;AACF;AAEO,IAAM,QAAA,GAAW,IAAI,QAAA","file":"chunk-X2CQFJPR.js","sourcesContent":["/**\r\n * Stock API - Stock Entry Management\r\n *\r\n * Provides access to stock entry records.\r\n * Stock entries track quantity per product/variant/branch combination.\r\n */\r\n\r\nimport { BaseApi, type ApiResponse, type PaginatedResponse, type RequestOptions } from \"../../core/api-factory\";\r\nimport { handleApiRequest } from \"../../core/api-handler\";\r\nimport type { StockEntry } from \"../types\";\r\n\r\ntype FetchOptions = Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n\r\nclass StockApi extends BaseApi<StockEntry> {\r\n constructor(config = {}) {\r\n super(\"inventory\", config);\r\n }\r\n\r\n /**\r\n * List stock entries\r\n * GET /inventory\r\n */\r\n async list({\r\n token,\r\n params = {},\r\n options = {},\r\n }: {\r\n token: string;\r\n params?: Record<string, unknown>;\r\n options?: FetchOptions;\r\n }): Promise<PaginatedResponse<StockEntry>> {\r\n const processedParams = this.prepareParams(params);\r\n const queryString = this.createQueryString(processedParams);\r\n\r\n return handleApiRequest(\"GET\", `${this.baseUrl}?${queryString}`, {\r\n token,\r\n cache: this.config.cache,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Get stock entry by ID\r\n * GET /inventory/:id\r\n */\r\n async getById({\r\n token,\r\n id,\r\n options = {},\r\n }: {\r\n token: string;\r\n id: string;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<StockEntry>> {\r\n if (!id) {\r\n throw new Error(\"Stock entry ID is required\");\r\n }\r\n\r\n return handleApiRequest(\"GET\", `${this.baseUrl}/${id}`, {\r\n token,\r\n cache: this.config.cache,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Get stock for a specific product\r\n * GET /inventory?productId=<id>\r\n */\r\n async getByProduct({\r\n token,\r\n productId,\r\n branchId,\r\n options = {},\r\n }: {\r\n token: string;\r\n productId: string;\r\n branchId?: string;\r\n options?: FetchOptions;\r\n }): Promise<PaginatedResponse<StockEntry>> {\r\n const params: Record<string, unknown> = { productId };\r\n if (branchId) params.branchId = branchId;\r\n\r\n return this.list({ token, params, options });\r\n }\r\n\r\n /**\r\n * Get stock for a specific branch\r\n * GET /inventory?branchId=<id>\r\n */\r\n async getByBranch({\r\n token,\r\n branchId,\r\n params = {},\r\n options = {},\r\n }: {\r\n token: string;\r\n branchId: string;\r\n params?: Record<string, unknown>;\r\n options?: FetchOptions;\r\n }): Promise<PaginatedResponse<StockEntry>> {\r\n return this.list({ token, params: { ...params, branchId }, options });\r\n }\r\n}\r\n\r\nexport const stockApi = new StockApi();\r\nexport { StockApi };\r\n"]}
|