@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/inventory/api/movement.ts"],"names":[],"mappings":";;;;AAiBA,IAAM,WAAA,GAAN,cAA0B,OAAA,CAAuB;AAAA,EAC/C,WAAA,CAAY,MAAA,GAAS,EAAC,EAAG;AACvB,IAAA,KAAA,CAAM,uBAAuB,MAAM,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,IAAA,CAAK;AAAA,IACT,KAAA;AAAA,IACA,SAAS,EAAC;AAAA,IACV,UAAU;AAAC,GACb,EAI8C;AAC5C,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,aAAA,CAAc,MAAiC,CAAA;AAC5E,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,UAAA,CAAW;AAAA,IACf,KAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAS,EAAC;AAAA,IACV,UAAU;AAAC,GACb,EAK8C;AAC5C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAK,EAAG,OAAA,EAAS,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,CAAc;AAAA,IAClB,KAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAS,EAAC;AAAA,IACV,UAAU;AAAC,GACb,EAK8C;AAC5C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAU,EAAG,OAAA,EAAS,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAA,CAAS;AAAA,IACb,KAAA;AAAA,IACA,SAAS,EAAC;AAAA,IACV,UAAU;AAAC,GACb,EAIyC;AACvC,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AACjD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,iBAAA,CAAkB,eAAe,CAAA;AAC1D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,cAAc,YAAY,CAAA;AAE/D,IAAA,OAAO,iBAAiB,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAI;AAAA,MAC1D,KAAA;AAAA,MACA,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,MACnB,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AACF;AAEO,IAAM,WAAA,GAAc,IAAI,WAAA","file":"chunk-SZYWG5IB.js","sourcesContent":["/**\r\n * Movement API - Stock Audit Trail\r\n *\r\n * Every stock change creates an immutable StockMovement record.\r\n * Types: purchase, sale, return, adjustment, transfer_in, transfer_out, initial, recount\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 {\r\n StockMovement,\r\n MovementQueryParams,\r\n LowStockItem,\r\n} from \"../types\";\r\n\r\ntype FetchOptions = Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n\r\nclass MovementApi extends BaseApi<StockMovement> {\r\n constructor(config = {}) {\r\n super(\"inventory/movements\", config);\r\n }\r\n\r\n /**\r\n * Get stock movements (audit trail)\r\n * GET /inventory/movements\r\n *\r\n * @param params - Filters (productId, branchId, type, startDate, endDate, page, limit, sort, after/cursor)\r\n */\r\n async list({\r\n token,\r\n params = {},\r\n options = {},\r\n }: {\r\n token: string;\r\n params?: MovementQueryParams;\r\n options?: FetchOptions;\r\n }): Promise<PaginatedResponse<StockMovement>> {\r\n const processedParams = this.prepareParams(params as Record<string, unknown>);\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 movements by type\r\n * GET /inventory/movements?type=<type>\r\n */\r\n async listByType({\r\n token,\r\n type,\r\n params = {},\r\n options = {},\r\n }: {\r\n token: string;\r\n type: StockMovement[\"type\"];\r\n params?: Omit<MovementQueryParams, \"type\">;\r\n options?: FetchOptions;\r\n }): Promise<PaginatedResponse<StockMovement>> {\r\n return this.list({ token, params: { ...params, type }, options });\r\n }\r\n\r\n /**\r\n * Get movements for a specific product\r\n * GET /inventory/movements?productId=<id>\r\n */\r\n async listByProduct({\r\n token,\r\n productId,\r\n params = {},\r\n options = {},\r\n }: {\r\n token: string;\r\n productId: string;\r\n params?: Omit<MovementQueryParams, \"productId\">;\r\n options?: FetchOptions;\r\n }): Promise<PaginatedResponse<StockMovement>> {\r\n return this.list({ token, params: { ...params, productId }, options });\r\n }\r\n\r\n /**\r\n * Get low stock items\r\n * GET /inventory/low-stock\r\n */\r\n async lowStock({\r\n token,\r\n params = {},\r\n options = {},\r\n }: {\r\n token: string;\r\n params?: { branchId?: string; threshold?: number };\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<LowStockItem[]>> {\r\n const processedParams = this.prepareParams(params);\r\n const queryString = this.createQueryString(processedParams);\r\n const baseUrl = this.baseUrl.replace(\"/movements\", \"/low-stock\");\r\n\r\n return handleApiRequest(\"GET\", `${baseUrl}?${queryString}`, {\r\n token,\r\n cache: this.config.cache,\r\n ...options,\r\n });\r\n }\r\n}\r\n\r\nexport const movementApi = new MovementApi();\r\nexport { MovementApi };\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"]}
|