@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.

Files changed (131) hide show
  1. package/LICENSE +14 -0
  2. package/README.md +104 -0
  3. package/dist/adjustment-DTSLM7AN.js +5 -0
  4. package/dist/adjustment-DTSLM7AN.js.map +1 -0
  5. package/dist/analytics/index.d.ts +27 -0
  6. package/dist/analytics/index.js +6 -0
  7. package/dist/analytics/index.js.map +1 -0
  8. package/dist/analytics-DMcD-o8w.d.ts +76 -0
  9. package/dist/api-factory-B_h4RKBm.d.ts +280 -0
  10. package/dist/auth/index.d.ts +39 -0
  11. package/dist/auth/index.js +5 -0
  12. package/dist/auth/index.js.map +1 -0
  13. package/dist/catalog/index.d.ts +479 -0
  14. package/dist/catalog/index.js +9 -0
  15. package/dist/catalog/index.js.map +1 -0
  16. package/dist/chunk-4ZQK3FFN.js +40 -0
  17. package/dist/chunk-4ZQK3FFN.js.map +1 -0
  18. package/dist/chunk-5L6EXDGH.js +465 -0
  19. package/dist/chunk-5L6EXDGH.js.map +1 -0
  20. package/dist/chunk-5ZFW3FEI.js +183 -0
  21. package/dist/chunk-5ZFW3FEI.js.map +1 -0
  22. package/dist/chunk-66OQAZSL.js +94 -0
  23. package/dist/chunk-66OQAZSL.js.map +1 -0
  24. package/dist/chunk-6RYGA6MF.js +123 -0
  25. package/dist/chunk-6RYGA6MF.js.map +1 -0
  26. package/dist/chunk-B6MPVOV7.js +328 -0
  27. package/dist/chunk-B6MPVOV7.js.map +1 -0
  28. package/dist/chunk-BDA2WSJA.js +148 -0
  29. package/dist/chunk-BDA2WSJA.js.map +1 -0
  30. package/dist/chunk-EIVYT3HM.js +126 -0
  31. package/dist/chunk-EIVYT3HM.js.map +1 -0
  32. package/dist/chunk-EPQN7ZKZ.js +27 -0
  33. package/dist/chunk-EPQN7ZKZ.js.map +1 -0
  34. package/dist/chunk-FA7QFJ2G.js +177 -0
  35. package/dist/chunk-FA7QFJ2G.js.map +1 -0
  36. package/dist/chunk-I5TIKUIQ.js +261 -0
  37. package/dist/chunk-I5TIKUIQ.js.map +1 -0
  38. package/dist/chunk-ILQUH444.js +135 -0
  39. package/dist/chunk-ILQUH444.js.map +1 -0
  40. package/dist/chunk-IXMWZJLV.js +616 -0
  41. package/dist/chunk-IXMWZJLV.js.map +1 -0
  42. package/dist/chunk-KZIGRIQG.js +75 -0
  43. package/dist/chunk-KZIGRIQG.js.map +1 -0
  44. package/dist/chunk-OF5M6R2S.js +769 -0
  45. package/dist/chunk-OF5M6R2S.js.map +1 -0
  46. package/dist/chunk-PYYLHUV6.js +3 -0
  47. package/dist/chunk-PYYLHUV6.js.map +1 -0
  48. package/dist/chunk-QO5AGZFP.js +159 -0
  49. package/dist/chunk-QO5AGZFP.js.map +1 -0
  50. package/dist/chunk-QUMTBLNE.js +76 -0
  51. package/dist/chunk-QUMTBLNE.js.map +1 -0
  52. package/dist/chunk-R5Z7NYLH.js +126 -0
  53. package/dist/chunk-R5Z7NYLH.js.map +1 -0
  54. package/dist/chunk-SZYWG5IB.js +75 -0
  55. package/dist/chunk-SZYWG5IB.js.map +1 -0
  56. package/dist/chunk-U3XT35GZ.js +202 -0
  57. package/dist/chunk-U3XT35GZ.js.map +1 -0
  58. package/dist/chunk-UGELTUIZ.js +830 -0
  59. package/dist/chunk-UGELTUIZ.js.map +1 -0
  60. package/dist/chunk-VR36QVX2.js +122 -0
  61. package/dist/chunk-VR36QVX2.js.map +1 -0
  62. package/dist/chunk-WUOQK7BO.js +13 -0
  63. package/dist/chunk-WUOQK7BO.js.map +1 -0
  64. package/dist/chunk-X6PV5MHG.js +582 -0
  65. package/dist/chunk-X6PV5MHG.js.map +1 -0
  66. package/dist/chunk-ZWLMFLLH.js +534 -0
  67. package/dist/chunk-ZWLMFLLH.js.map +1 -0
  68. package/dist/content/index.d.ts +309 -0
  69. package/dist/content/index.js +6 -0
  70. package/dist/content/index.js.map +1 -0
  71. package/dist/core/index.d.ts +107 -0
  72. package/dist/core/index.js +5 -0
  73. package/dist/core/index.js.map +1 -0
  74. package/dist/core/react.d.ts +107 -0
  75. package/dist/core/react.js +5 -0
  76. package/dist/core/react.js.map +1 -0
  77. package/dist/coupon-CHFcw7cd.d.ts +632 -0
  78. package/dist/coupon-zGkvO-Xx.d.ts +129 -0
  79. package/dist/crud.factory-DyKaPHcU.d.ts +181 -0
  80. package/dist/finance/index.d.ts +81 -0
  81. package/dist/finance/index.js +5 -0
  82. package/dist/finance/index.js.map +1 -0
  83. package/dist/finance-BJdfKRw0.d.ts +135 -0
  84. package/dist/index.d.ts +31 -0
  85. package/dist/index.js +29 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/inventory/index.d.ts +512 -0
  88. package/dist/inventory/index.js +16 -0
  89. package/dist/inventory/index.js.map +1 -0
  90. package/dist/inventory-DCiIZh8P.d.ts +742 -0
  91. package/dist/logistics/index.d.ts +226 -0
  92. package/dist/logistics/index.js +7 -0
  93. package/dist/logistics/index.js.map +1 -0
  94. package/dist/logistics-V8a9lUN3.d.ts +428 -0
  95. package/dist/media-CNLJK93J.d.ts +721 -0
  96. package/dist/movement-7MV3ADY5.js +5 -0
  97. package/dist/movement-7MV3ADY5.js.map +1 -0
  98. package/dist/payment-BRboLqvU.d.ts +127 -0
  99. package/dist/payments/index.d.ts +55 -0
  100. package/dist/payments/index.js +6 -0
  101. package/dist/payments/index.js.map +1 -0
  102. package/dist/platform/index.d.ts +645 -0
  103. package/dist/platform/index.js +8 -0
  104. package/dist/platform/index.js.map +1 -0
  105. package/dist/pos-D1jkkFl0.d.ts +885 -0
  106. package/dist/product-p09zXkXB.d.ts +260 -0
  107. package/dist/purchase-24BGT2HA.js +5 -0
  108. package/dist/purchase-24BGT2HA.js.map +1 -0
  109. package/dist/request-652PS6VR.js +5 -0
  110. package/dist/request-652PS6VR.js.map +1 -0
  111. package/dist/sales/index.d.ts +585 -0
  112. package/dist/sales/index.js +9 -0
  113. package/dist/sales/index.js.map +1 -0
  114. package/dist/server.d.ts +120 -0
  115. package/dist/server.js +27 -0
  116. package/dist/server.js.map +1 -0
  117. package/dist/size-guide-DgjzjM5P.d.ts +554 -0
  118. package/dist/stock-DEApGC-w.d.ts +632 -0
  119. package/dist/stock-OOUW57VQ.js +5 -0
  120. package/dist/stock-OOUW57VQ.js.map +1 -0
  121. package/dist/supplier-OC6JAWV6.js +5 -0
  122. package/dist/supplier-OC6JAWV6.js.map +1 -0
  123. package/dist/transaction/index.d.ts +104 -0
  124. package/dist/transaction/index.js +8 -0
  125. package/dist/transaction/index.js.map +1 -0
  126. package/dist/transaction-BTmoHpWh.d.ts +428 -0
  127. package/dist/transaction-u5oaNuav.d.ts +84 -0
  128. package/dist/transfer-7SYSH3RG.js +5 -0
  129. package/dist/transfer-7SYSH3RG.js.map +1 -0
  130. package/dist/user-data-DdLjAGwO.d.ts +132 -0
  131. 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"]}