@diffsome/react 1.1.3 → 1.2.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/dist/index.d.mts +33 -6
- package/dist/index.d.ts +33 -6
- package/dist/index.js +547 -432
- package/dist/index.mjs +390 -277
- package/package.json +3 -3
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/context/DiffsomeContext.tsx
|
|
2
|
-
import { createContext, useContext, useState, useEffect, useMemo } from "react";
|
|
2
|
+
import { createContext, useContext, useState, useEffect, useCallback, useMemo } from "react";
|
|
3
3
|
import { Diffsome } from "@diffsome/sdk";
|
|
4
4
|
import { jsx } from "react/jsx-runtime";
|
|
5
5
|
var DiffsomeContext = createContext(null);
|
|
@@ -14,6 +14,10 @@ var getEnvVar = (key) => {
|
|
|
14
14
|
};
|
|
15
15
|
function DiffsomeProvider({ children, config = {} }) {
|
|
16
16
|
const [isReady, setIsReady] = useState(false);
|
|
17
|
+
const [cart, setCart] = useState(null);
|
|
18
|
+
const [cartLoading, setCartLoading] = useState(true);
|
|
19
|
+
const [wishlistItems, setWishlistItems] = useState([]);
|
|
20
|
+
const [wishlistLoading, setWishlistLoading] = useState(true);
|
|
17
21
|
const tenantId = config.tenantId || getEnvVar("DIFFSOME_TENANT_ID");
|
|
18
22
|
const apiKey = config.apiKey || getEnvVar("DIFFSOME_API_KEY");
|
|
19
23
|
const baseUrl = config.baseUrl || getEnvVar("DIFFSOME_BASE_URL");
|
|
@@ -31,13 +35,73 @@ function DiffsomeProvider({ children, config = {} }) {
|
|
|
31
35
|
storageType: config.storageType ?? "localStorage"
|
|
32
36
|
});
|
|
33
37
|
}, [tenantId, baseUrl, apiKey, config.persistToken, config.storageType]);
|
|
38
|
+
const refreshCart = useCallback(async () => {
|
|
39
|
+
setCartLoading(true);
|
|
40
|
+
try {
|
|
41
|
+
const cartData = await client.shop.getCart();
|
|
42
|
+
setCart(cartData);
|
|
43
|
+
} catch (err) {
|
|
44
|
+
setCart(null);
|
|
45
|
+
} finally {
|
|
46
|
+
setCartLoading(false);
|
|
47
|
+
}
|
|
48
|
+
}, [client]);
|
|
49
|
+
const refreshWishlist = useCallback(async () => {
|
|
50
|
+
if (!client.isAuthenticated()) {
|
|
51
|
+
setWishlistItems([]);
|
|
52
|
+
setWishlistLoading(false);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
setWishlistLoading(true);
|
|
56
|
+
try {
|
|
57
|
+
const response = await client.shop.getWishlist({ per_page: 100 });
|
|
58
|
+
setWishlistItems(response.data);
|
|
59
|
+
} catch (err) {
|
|
60
|
+
setWishlistItems([]);
|
|
61
|
+
} finally {
|
|
62
|
+
setWishlistLoading(false);
|
|
63
|
+
}
|
|
64
|
+
}, [client]);
|
|
34
65
|
useEffect(() => {
|
|
35
|
-
|
|
36
|
-
|
|
66
|
+
let mounted = true;
|
|
67
|
+
const init = async () => {
|
|
68
|
+
if (!mounted) return;
|
|
69
|
+
setIsReady(true);
|
|
70
|
+
try {
|
|
71
|
+
const cartData = await client.shop.getCart();
|
|
72
|
+
if (mounted) setCart(cartData);
|
|
73
|
+
} catch (err) {
|
|
74
|
+
if (mounted) setCart(null);
|
|
75
|
+
} finally {
|
|
76
|
+
if (mounted) setCartLoading(false);
|
|
77
|
+
}
|
|
78
|
+
if (client.isAuthenticated()) {
|
|
79
|
+
try {
|
|
80
|
+
const response = await client.shop.getWishlist({ per_page: 100 });
|
|
81
|
+
if (mounted) setWishlistItems(response.data);
|
|
82
|
+
} catch (err) {
|
|
83
|
+
if (mounted) setWishlistItems([]);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (mounted) setWishlistLoading(false);
|
|
87
|
+
};
|
|
88
|
+
init();
|
|
89
|
+
return () => {
|
|
90
|
+
mounted = false;
|
|
91
|
+
};
|
|
92
|
+
}, [client]);
|
|
37
93
|
const value = useMemo(() => ({
|
|
38
94
|
client,
|
|
39
|
-
isReady
|
|
40
|
-
|
|
95
|
+
isReady,
|
|
96
|
+
cart,
|
|
97
|
+
cartLoading,
|
|
98
|
+
setCart,
|
|
99
|
+
refreshCart,
|
|
100
|
+
wishlistItems,
|
|
101
|
+
wishlistLoading,
|
|
102
|
+
setWishlistItems,
|
|
103
|
+
refreshWishlist
|
|
104
|
+
}), [client, isReady, cart, cartLoading, refreshCart, wishlistItems, wishlistLoading, refreshWishlist]);
|
|
41
105
|
return /* @__PURE__ */ jsx(DiffsomeContext.Provider, { value, children });
|
|
42
106
|
}
|
|
43
107
|
function useDiffsome() {
|
|
@@ -52,15 +116,104 @@ function useClient() {
|
|
|
52
116
|
return client;
|
|
53
117
|
}
|
|
54
118
|
|
|
55
|
-
// src/hooks/
|
|
56
|
-
import { useState as useState2,
|
|
57
|
-
|
|
119
|
+
// src/hooks/useSite.ts
|
|
120
|
+
import { useState as useState2, useCallback as useCallback2, useEffect as useEffect2 } from "react";
|
|
121
|
+
var DEFAULT_CURRENCY = {
|
|
122
|
+
code: "KRW",
|
|
123
|
+
symbol: "\u20A9",
|
|
124
|
+
position: "before",
|
|
125
|
+
decimals: 0
|
|
126
|
+
};
|
|
127
|
+
function useSite() {
|
|
58
128
|
const client = useClient();
|
|
59
|
-
const [
|
|
129
|
+
const [site, setSite] = useState2(null);
|
|
60
130
|
const [loading, setLoading] = useState2(true);
|
|
61
131
|
const [error, setError] = useState2(null);
|
|
132
|
+
const fetchSite = useCallback2(async () => {
|
|
133
|
+
setLoading(true);
|
|
134
|
+
setError(null);
|
|
135
|
+
try {
|
|
136
|
+
const data = await client.site.getInfo();
|
|
137
|
+
setSite(data);
|
|
138
|
+
} catch (err) {
|
|
139
|
+
setError(err instanceof Error ? err : new Error("Failed to fetch site info"));
|
|
140
|
+
} finally {
|
|
141
|
+
setLoading(false);
|
|
142
|
+
}
|
|
143
|
+
}, [client]);
|
|
144
|
+
useEffect2(() => {
|
|
145
|
+
fetchSite();
|
|
146
|
+
}, [fetchSite]);
|
|
147
|
+
const currency = site?.currency ?? null;
|
|
148
|
+
const formatPrice = useCallback2((amount) => {
|
|
149
|
+
const curr = currency ?? DEFAULT_CURRENCY;
|
|
150
|
+
const formatted = amount.toLocaleString(void 0, {
|
|
151
|
+
minimumFractionDigits: curr.decimals,
|
|
152
|
+
maximumFractionDigits: curr.decimals
|
|
153
|
+
});
|
|
154
|
+
if (curr.position === "after") {
|
|
155
|
+
return `${formatted}${curr.symbol}`;
|
|
156
|
+
}
|
|
157
|
+
return `${curr.symbol}${formatted}`;
|
|
158
|
+
}, [currency]);
|
|
159
|
+
return {
|
|
160
|
+
site,
|
|
161
|
+
loading,
|
|
162
|
+
error,
|
|
163
|
+
refresh: fetchSite,
|
|
164
|
+
currency,
|
|
165
|
+
formatPrice
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
function useCurrency() {
|
|
169
|
+
const client = useClient();
|
|
170
|
+
const [currency, setCurrency] = useState2(null);
|
|
171
|
+
const [loading, setLoading] = useState2(true);
|
|
172
|
+
const [error, setError] = useState2(null);
|
|
173
|
+
const fetchCurrency = useCallback2(async () => {
|
|
174
|
+
setLoading(true);
|
|
175
|
+
setError(null);
|
|
176
|
+
try {
|
|
177
|
+
const data = await client.site.getCurrency();
|
|
178
|
+
setCurrency(data);
|
|
179
|
+
} catch (err) {
|
|
180
|
+
setError(err instanceof Error ? err : new Error("Failed to fetch currency"));
|
|
181
|
+
} finally {
|
|
182
|
+
setLoading(false);
|
|
183
|
+
}
|
|
184
|
+
}, [client]);
|
|
185
|
+
useEffect2(() => {
|
|
186
|
+
fetchCurrency();
|
|
187
|
+
}, [fetchCurrency]);
|
|
188
|
+
const formatPrice = useCallback2((amount) => {
|
|
189
|
+
const curr = currency ?? DEFAULT_CURRENCY;
|
|
190
|
+
const formatted = amount.toLocaleString(void 0, {
|
|
191
|
+
minimumFractionDigits: curr.decimals,
|
|
192
|
+
maximumFractionDigits: curr.decimals
|
|
193
|
+
});
|
|
194
|
+
if (curr.position === "after") {
|
|
195
|
+
return `${formatted}${curr.symbol}`;
|
|
196
|
+
}
|
|
197
|
+
return `${curr.symbol}${formatted}`;
|
|
198
|
+
}, [currency]);
|
|
199
|
+
return {
|
|
200
|
+
currency,
|
|
201
|
+
loading,
|
|
202
|
+
error,
|
|
203
|
+
formatPrice,
|
|
204
|
+
refresh: fetchCurrency
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// src/hooks/useAuth.ts
|
|
209
|
+
import { useState as useState3, useEffect as useEffect3, useCallback as useCallback3 } from "react";
|
|
210
|
+
function useAuth() {
|
|
211
|
+
const client = useClient();
|
|
212
|
+
const [user, setUser] = useState3(null);
|
|
213
|
+
const [loading, setLoading] = useState3(true);
|
|
214
|
+
const [error, setError] = useState3(null);
|
|
62
215
|
const isAuthenticated = !!user && client.isAuthenticated();
|
|
63
|
-
const fetchProfile =
|
|
216
|
+
const fetchProfile = useCallback3(async () => {
|
|
64
217
|
if (!client.isAuthenticated()) {
|
|
65
218
|
setUser(null);
|
|
66
219
|
setLoading(false);
|
|
@@ -77,10 +230,10 @@ function useAuth() {
|
|
|
77
230
|
setLoading(false);
|
|
78
231
|
}
|
|
79
232
|
}, [client]);
|
|
80
|
-
|
|
233
|
+
useEffect3(() => {
|
|
81
234
|
fetchProfile();
|
|
82
235
|
}, [fetchProfile]);
|
|
83
|
-
const login =
|
|
236
|
+
const login = useCallback3(async (credentials) => {
|
|
84
237
|
setLoading(true);
|
|
85
238
|
setError(null);
|
|
86
239
|
try {
|
|
@@ -95,7 +248,7 @@ function useAuth() {
|
|
|
95
248
|
setLoading(false);
|
|
96
249
|
}
|
|
97
250
|
}, [client]);
|
|
98
|
-
const register =
|
|
251
|
+
const register = useCallback3(async (data) => {
|
|
99
252
|
setLoading(true);
|
|
100
253
|
setError(null);
|
|
101
254
|
try {
|
|
@@ -110,7 +263,7 @@ function useAuth() {
|
|
|
110
263
|
setLoading(false);
|
|
111
264
|
}
|
|
112
265
|
}, [client]);
|
|
113
|
-
const logout =
|
|
266
|
+
const logout = useCallback3(async () => {
|
|
114
267
|
setLoading(true);
|
|
115
268
|
try {
|
|
116
269
|
await client.auth.logout();
|
|
@@ -119,23 +272,23 @@ function useAuth() {
|
|
|
119
272
|
setLoading(false);
|
|
120
273
|
}
|
|
121
274
|
}, [client]);
|
|
122
|
-
const getProfile =
|
|
275
|
+
const getProfile = useCallback3(async () => {
|
|
123
276
|
const profile = await client.auth.me();
|
|
124
277
|
setUser(profile);
|
|
125
278
|
return profile;
|
|
126
279
|
}, [client]);
|
|
127
|
-
const updateProfile =
|
|
280
|
+
const updateProfile = useCallback3(async (data) => {
|
|
128
281
|
const profile = await client.auth.updateProfile(data);
|
|
129
282
|
setUser(profile);
|
|
130
283
|
return profile;
|
|
131
284
|
}, [client]);
|
|
132
|
-
const forgotPassword =
|
|
285
|
+
const forgotPassword = useCallback3(async (email) => {
|
|
133
286
|
return await client.auth.forgotPassword({ email });
|
|
134
287
|
}, [client]);
|
|
135
|
-
const resetPassword =
|
|
288
|
+
const resetPassword = useCallback3(async (data) => {
|
|
136
289
|
return await client.auth.resetPassword(data);
|
|
137
290
|
}, [client]);
|
|
138
|
-
const refresh =
|
|
291
|
+
const refresh = useCallback3(async () => {
|
|
139
292
|
await fetchProfile();
|
|
140
293
|
}, [fetchProfile]);
|
|
141
294
|
return {
|
|
@@ -155,13 +308,13 @@ function useAuth() {
|
|
|
155
308
|
}
|
|
156
309
|
|
|
157
310
|
// src/hooks/useSocialAuth.ts
|
|
158
|
-
import { useState as
|
|
311
|
+
import { useState as useState4, useEffect as useEffect4, useCallback as useCallback4 } from "react";
|
|
159
312
|
function useSocialAuth() {
|
|
160
313
|
const client = useClient();
|
|
161
|
-
const [providers, setProviders] =
|
|
162
|
-
const [loading, setLoading] =
|
|
163
|
-
const [error, setError] =
|
|
164
|
-
const fetchProviders =
|
|
314
|
+
const [providers, setProviders] = useState4([]);
|
|
315
|
+
const [loading, setLoading] = useState4(true);
|
|
316
|
+
const [error, setError] = useState4(null);
|
|
317
|
+
const fetchProviders = useCallback4(async () => {
|
|
165
318
|
setLoading(true);
|
|
166
319
|
setError(null);
|
|
167
320
|
try {
|
|
@@ -173,14 +326,14 @@ function useSocialAuth() {
|
|
|
173
326
|
setLoading(false);
|
|
174
327
|
}
|
|
175
328
|
}, [client]);
|
|
176
|
-
|
|
329
|
+
useEffect4(() => {
|
|
177
330
|
fetchProviders();
|
|
178
331
|
}, [fetchProviders]);
|
|
179
|
-
const getAuthUrl =
|
|
332
|
+
const getAuthUrl = useCallback4(async (provider) => {
|
|
180
333
|
const result = await client.auth.getSocialAuthUrl(provider);
|
|
181
334
|
return result.url;
|
|
182
335
|
}, [client]);
|
|
183
|
-
const handleCallback =
|
|
336
|
+
const handleCallback = useCallback4(async (provider, code) => {
|
|
184
337
|
return await client.auth.socialCallback(provider, code);
|
|
185
338
|
}, [client]);
|
|
186
339
|
return {
|
|
@@ -194,28 +347,10 @@ function useSocialAuth() {
|
|
|
194
347
|
}
|
|
195
348
|
|
|
196
349
|
// src/hooks/useCart.ts
|
|
197
|
-
import {
|
|
350
|
+
import { useCallback as useCallback5 } from "react";
|
|
198
351
|
function useCart() {
|
|
199
|
-
const client =
|
|
200
|
-
const
|
|
201
|
-
const [loading, setLoading] = useState4(true);
|
|
202
|
-
const [error, setError] = useState4(null);
|
|
203
|
-
const fetchCart = useCallback4(async () => {
|
|
204
|
-
try {
|
|
205
|
-
const cartData = await client.shop.getCart();
|
|
206
|
-
setCart(cartData);
|
|
207
|
-
setError(null);
|
|
208
|
-
} catch (err) {
|
|
209
|
-
setCart(null);
|
|
210
|
-
setError(err instanceof Error ? err : new Error("Failed to fetch cart"));
|
|
211
|
-
} finally {
|
|
212
|
-
setLoading(false);
|
|
213
|
-
}
|
|
214
|
-
}, [client]);
|
|
215
|
-
useEffect4(() => {
|
|
216
|
-
fetchCart();
|
|
217
|
-
}, [fetchCart]);
|
|
218
|
-
const addToCart = useCallback4(async (productId, quantity = 1, variantId, options) => {
|
|
352
|
+
const { client, cart, cartLoading, setCart, refreshCart } = useDiffsome();
|
|
353
|
+
const addToCart = useCallback5(async (productId, quantity = 1, variantId, options) => {
|
|
219
354
|
const data = {
|
|
220
355
|
product_id: productId,
|
|
221
356
|
quantity,
|
|
@@ -225,32 +360,28 @@ function useCart() {
|
|
|
225
360
|
const updatedCart = await client.shop.addToCart(data);
|
|
226
361
|
setCart(updatedCart);
|
|
227
362
|
return updatedCart;
|
|
228
|
-
}, [client]);
|
|
229
|
-
const updateItem =
|
|
363
|
+
}, [client, setCart]);
|
|
364
|
+
const updateItem = useCallback5(async (itemId, quantity) => {
|
|
230
365
|
const updatedCart = await client.shop.updateCartItem(itemId, { quantity });
|
|
231
366
|
setCart(updatedCart);
|
|
232
367
|
return updatedCart;
|
|
233
|
-
}, [client]);
|
|
234
|
-
const removeItem =
|
|
368
|
+
}, [client, setCart]);
|
|
369
|
+
const removeItem = useCallback5(async (itemId) => {
|
|
235
370
|
const updatedCart = await client.shop.removeFromCart(itemId);
|
|
236
371
|
setCart(updatedCart);
|
|
237
372
|
return updatedCart;
|
|
238
|
-
}, [client]);
|
|
239
|
-
const clearCart =
|
|
373
|
+
}, [client, setCart]);
|
|
374
|
+
const clearCart = useCallback5(async () => {
|
|
240
375
|
await client.shop.clearCart();
|
|
241
376
|
setCart(null);
|
|
242
|
-
}, [client]);
|
|
243
|
-
const
|
|
244
|
-
setLoading(true);
|
|
245
|
-
await fetchCart();
|
|
246
|
-
}, [fetchCart]);
|
|
247
|
-
const isInCart = useCallback4((productId, variantId) => {
|
|
377
|
+
}, [client, setCart]);
|
|
378
|
+
const isInCart = useCallback5((productId, variantId) => {
|
|
248
379
|
if (!cart?.items) return false;
|
|
249
380
|
return cart.items.some(
|
|
250
381
|
(item) => item.product_id === productId && (variantId === void 0 || item.variant_id === variantId)
|
|
251
382
|
);
|
|
252
383
|
}, [cart]);
|
|
253
|
-
const getItemQuantity =
|
|
384
|
+
const getItemQuantity = useCallback5((productId, variantId) => {
|
|
254
385
|
if (!cart?.items) return 0;
|
|
255
386
|
const item = cart.items.find(
|
|
256
387
|
(item2) => item2.product_id === productId && (variantId === void 0 || item2.variant_id === variantId)
|
|
@@ -265,117 +396,77 @@ function useCart() {
|
|
|
265
396
|
subtotal: cart?.subtotal ?? 0,
|
|
266
397
|
shippingFee: cart?.shipping_fee ?? 0,
|
|
267
398
|
total: cart?.total ?? 0,
|
|
268
|
-
loading,
|
|
269
|
-
error,
|
|
399
|
+
loading: cartLoading,
|
|
270
400
|
addToCart,
|
|
271
401
|
updateItem,
|
|
272
402
|
removeItem,
|
|
273
403
|
clearCart,
|
|
274
|
-
refresh,
|
|
404
|
+
refresh: refreshCart,
|
|
275
405
|
isInCart,
|
|
276
406
|
getItemQuantity
|
|
277
407
|
};
|
|
278
408
|
}
|
|
279
409
|
|
|
280
410
|
// src/hooks/useWishlist.ts
|
|
281
|
-
import { useState as useState5,
|
|
411
|
+
import { useState as useState5, useCallback as useCallback6, useMemo as useMemo2 } from "react";
|
|
282
412
|
function useWishlist() {
|
|
283
|
-
const client =
|
|
284
|
-
const [items, setItems] = useState5([]);
|
|
285
|
-
const [loading, setLoading] = useState5(true);
|
|
413
|
+
const { client, wishlistItems, wishlistLoading, setWishlistItems, refreshWishlist, setCart } = useDiffsome();
|
|
286
414
|
const [error, setError] = useState5(null);
|
|
287
|
-
const
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
const response = await client.shop.getWishlist({ per_page: 100 });
|
|
297
|
-
setItems(response.data);
|
|
298
|
-
const map = {};
|
|
299
|
-
response.data.forEach((item) => {
|
|
300
|
-
const key = item.variant_id ? `${item.product_id}_${item.variant_id}` : String(item.product_id);
|
|
301
|
-
map[key] = true;
|
|
302
|
-
});
|
|
303
|
-
setWishlistMap(map);
|
|
304
|
-
setError(null);
|
|
305
|
-
} catch (err) {
|
|
306
|
-
setItems([]);
|
|
307
|
-
setWishlistMap({});
|
|
308
|
-
setError(err instanceof Error ? err : new Error("Failed to fetch wishlist"));
|
|
309
|
-
} finally {
|
|
310
|
-
setLoading(false);
|
|
311
|
-
}
|
|
312
|
-
}, [client]);
|
|
313
|
-
useEffect5(() => {
|
|
314
|
-
fetchWishlist();
|
|
315
|
-
}, [fetchWishlist]);
|
|
316
|
-
const isInWishlist = useCallback5((productId, variantId) => {
|
|
415
|
+
const wishlistMap = useMemo2(() => {
|
|
416
|
+
const map = {};
|
|
417
|
+
wishlistItems.forEach((item) => {
|
|
418
|
+
const key = item.variant_id ? `${item.product_id}_${item.variant_id}` : String(item.product_id);
|
|
419
|
+
map[key] = true;
|
|
420
|
+
});
|
|
421
|
+
return map;
|
|
422
|
+
}, [wishlistItems]);
|
|
423
|
+
const isInWishlist = useCallback6((productId, variantId) => {
|
|
317
424
|
const key = variantId ? `${productId}_${variantId}` : String(productId);
|
|
318
425
|
return wishlistMap[key] || false;
|
|
319
426
|
}, [wishlistMap]);
|
|
320
|
-
const toggleWishlist =
|
|
427
|
+
const toggleWishlist = useCallback6(async (productId, variantId) => {
|
|
321
428
|
const result = await client.shop.toggleWishlist(productId, variantId);
|
|
322
|
-
const key = variantId ? `${productId}_${variantId}` : String(productId);
|
|
323
|
-
setWishlistMap((prev) => ({
|
|
324
|
-
...prev,
|
|
325
|
-
[key]: result.in_wishlist
|
|
326
|
-
}));
|
|
327
429
|
if (result.action === "added") {
|
|
328
|
-
await
|
|
430
|
+
await refreshWishlist();
|
|
329
431
|
} else {
|
|
330
|
-
|
|
432
|
+
setWishlistItems(wishlistItems.filter(
|
|
331
433
|
(item) => !(item.product_id === productId && item.variant_id === variantId)
|
|
332
434
|
));
|
|
333
435
|
}
|
|
334
436
|
return result;
|
|
335
|
-
}, [client,
|
|
336
|
-
const addToWishlist =
|
|
437
|
+
}, [client, refreshWishlist, setWishlistItems, wishlistItems]);
|
|
438
|
+
const addToWishlist = useCallback6(async (productId, variantId, note) => {
|
|
337
439
|
const item = await client.shop.addToWishlist({
|
|
338
440
|
product_id: productId,
|
|
339
441
|
variant_id: variantId,
|
|
340
442
|
note
|
|
341
443
|
});
|
|
342
|
-
await
|
|
444
|
+
await refreshWishlist();
|
|
343
445
|
return item;
|
|
344
|
-
}, [client,
|
|
345
|
-
const removeFromWishlist =
|
|
346
|
-
const item = items.find((i) => i.id === wishlistId);
|
|
446
|
+
}, [client, refreshWishlist]);
|
|
447
|
+
const removeFromWishlist = useCallback6(async (wishlistId) => {
|
|
347
448
|
await client.shop.removeFromWishlist(wishlistId);
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
const next = { ...prev };
|
|
352
|
-
delete next[key];
|
|
353
|
-
return next;
|
|
354
|
-
});
|
|
355
|
-
}
|
|
356
|
-
setItems((prev) => prev.filter((i) => i.id !== wishlistId));
|
|
357
|
-
}, [client, items]);
|
|
358
|
-
const moveToCart = useCallback5(async (wishlistIds) => {
|
|
449
|
+
setWishlistItems(wishlistItems.filter((i) => i.id !== wishlistId));
|
|
450
|
+
}, [client, setWishlistItems, wishlistItems]);
|
|
451
|
+
const moveToCart = useCallback6(async (wishlistIds) => {
|
|
359
452
|
const result = await client.shop.moveWishlistToCart(wishlistIds);
|
|
360
|
-
await
|
|
453
|
+
await refreshWishlist();
|
|
454
|
+
const cartData = await client.shop.getCart();
|
|
455
|
+
setCart(cartData);
|
|
361
456
|
return result;
|
|
362
|
-
}, [client,
|
|
363
|
-
const updateNote =
|
|
457
|
+
}, [client, refreshWishlist, setCart]);
|
|
458
|
+
const updateNote = useCallback6(async (wishlistId, note) => {
|
|
364
459
|
const item = await client.shop.updateWishlistNote(wishlistId, note);
|
|
365
|
-
|
|
460
|
+
setWishlistItems(wishlistItems.map((i) => i.id === wishlistId ? item : i));
|
|
366
461
|
return item;
|
|
367
|
-
}, [client]);
|
|
368
|
-
const getProductWishlistCount =
|
|
462
|
+
}, [client, setWishlistItems, wishlistItems]);
|
|
463
|
+
const getProductWishlistCount = useCallback6(async (productSlug) => {
|
|
369
464
|
return await client.shop.getProductWishlistCount(productSlug);
|
|
370
465
|
}, [client]);
|
|
371
|
-
const refresh = useCallback5(async () => {
|
|
372
|
-
setLoading(true);
|
|
373
|
-
await fetchWishlist();
|
|
374
|
-
}, [fetchWishlist]);
|
|
375
466
|
return {
|
|
376
|
-
items,
|
|
377
|
-
count:
|
|
378
|
-
loading,
|
|
467
|
+
items: wishlistItems,
|
|
468
|
+
count: wishlistItems.length,
|
|
469
|
+
loading: wishlistLoading,
|
|
379
470
|
error,
|
|
380
471
|
isInWishlist,
|
|
381
472
|
toggleWishlist,
|
|
@@ -384,12 +475,12 @@ function useWishlist() {
|
|
|
384
475
|
moveToCart,
|
|
385
476
|
updateNote,
|
|
386
477
|
getProductWishlistCount,
|
|
387
|
-
refresh
|
|
478
|
+
refresh: refreshWishlist
|
|
388
479
|
};
|
|
389
480
|
}
|
|
390
481
|
|
|
391
482
|
// src/hooks/useProducts.ts
|
|
392
|
-
import { useState as useState6, useEffect as
|
|
483
|
+
import { useState as useState6, useEffect as useEffect5, useCallback as useCallback7 } from "react";
|
|
393
484
|
function useProducts(options = {}) {
|
|
394
485
|
const { autoFetch = true, ...params } = options;
|
|
395
486
|
const client = useClient();
|
|
@@ -398,7 +489,7 @@ function useProducts(options = {}) {
|
|
|
398
489
|
const [loading, setLoading] = useState6(autoFetch);
|
|
399
490
|
const [error, setError] = useState6(null);
|
|
400
491
|
const [currentParams, setCurrentParams] = useState6(params);
|
|
401
|
-
const fetchProducts =
|
|
492
|
+
const fetchProducts = useCallback7(async (fetchParams, append = false) => {
|
|
402
493
|
setLoading(true);
|
|
403
494
|
setError(null);
|
|
404
495
|
try {
|
|
@@ -415,22 +506,22 @@ function useProducts(options = {}) {
|
|
|
415
506
|
setLoading(false);
|
|
416
507
|
}
|
|
417
508
|
}, [client]);
|
|
418
|
-
|
|
509
|
+
useEffect5(() => {
|
|
419
510
|
if (autoFetch) {
|
|
420
511
|
fetchProducts(params);
|
|
421
512
|
}
|
|
422
513
|
}, []);
|
|
423
514
|
const hasMore = meta ? meta.current_page < meta.last_page : false;
|
|
424
|
-
const loadMore =
|
|
515
|
+
const loadMore = useCallback7(async () => {
|
|
425
516
|
if (!hasMore || loading) return;
|
|
426
517
|
const nextPage = (meta?.current_page ?? 0) + 1;
|
|
427
518
|
await fetchProducts({ ...currentParams, page: nextPage }, true);
|
|
428
519
|
}, [hasMore, loading, meta, currentParams, fetchProducts]);
|
|
429
|
-
const refresh =
|
|
520
|
+
const refresh = useCallback7(async () => {
|
|
430
521
|
setCurrentParams(params);
|
|
431
522
|
await fetchProducts(params);
|
|
432
523
|
}, [params, fetchProducts]);
|
|
433
|
-
const search =
|
|
524
|
+
const search = useCallback7(async (query) => {
|
|
434
525
|
const searchParams = { ...params, search: query, page: 1 };
|
|
435
526
|
setCurrentParams(searchParams);
|
|
436
527
|
await fetchProducts(searchParams);
|
|
@@ -451,7 +542,7 @@ function useProduct(idOrSlug) {
|
|
|
451
542
|
const [product, setProduct] = useState6(null);
|
|
452
543
|
const [loading, setLoading] = useState6(true);
|
|
453
544
|
const [error, setError] = useState6(null);
|
|
454
|
-
const fetchProduct =
|
|
545
|
+
const fetchProduct = useCallback7(async () => {
|
|
455
546
|
setLoading(true);
|
|
456
547
|
setError(null);
|
|
457
548
|
try {
|
|
@@ -463,7 +554,7 @@ function useProduct(idOrSlug) {
|
|
|
463
554
|
setLoading(false);
|
|
464
555
|
}
|
|
465
556
|
}, [client, idOrSlug]);
|
|
466
|
-
|
|
557
|
+
useEffect5(() => {
|
|
467
558
|
fetchProduct();
|
|
468
559
|
}, [fetchProduct]);
|
|
469
560
|
return {
|
|
@@ -478,7 +569,7 @@ function useCategories() {
|
|
|
478
569
|
const [categories, setCategories] = useState6([]);
|
|
479
570
|
const [loading, setLoading] = useState6(true);
|
|
480
571
|
const [error, setError] = useState6(null);
|
|
481
|
-
const fetchCategories =
|
|
572
|
+
const fetchCategories = useCallback7(async () => {
|
|
482
573
|
setLoading(true);
|
|
483
574
|
setError(null);
|
|
484
575
|
try {
|
|
@@ -490,7 +581,7 @@ function useCategories() {
|
|
|
490
581
|
setLoading(false);
|
|
491
582
|
}
|
|
492
583
|
}, [client]);
|
|
493
|
-
|
|
584
|
+
useEffect5(() => {
|
|
494
585
|
fetchCategories();
|
|
495
586
|
}, [fetchCategories]);
|
|
496
587
|
return {
|
|
@@ -505,7 +596,7 @@ function useFeaturedProducts(limit = 8) {
|
|
|
505
596
|
const [products, setProducts] = useState6([]);
|
|
506
597
|
const [loading, setLoading] = useState6(true);
|
|
507
598
|
const [error, setError] = useState6(null);
|
|
508
|
-
const fetchProducts =
|
|
599
|
+
const fetchProducts = useCallback7(async () => {
|
|
509
600
|
setLoading(true);
|
|
510
601
|
setError(null);
|
|
511
602
|
try {
|
|
@@ -517,7 +608,7 @@ function useFeaturedProducts(limit = 8) {
|
|
|
517
608
|
setLoading(false);
|
|
518
609
|
}
|
|
519
610
|
}, [client, limit]);
|
|
520
|
-
|
|
611
|
+
useEffect5(() => {
|
|
521
612
|
fetchProducts();
|
|
522
613
|
}, [fetchProducts]);
|
|
523
614
|
return {
|
|
@@ -533,7 +624,7 @@ function useProductsByType(type, params) {
|
|
|
533
624
|
const [meta, setMeta] = useState6(null);
|
|
534
625
|
const [loading, setLoading] = useState6(true);
|
|
535
626
|
const [error, setError] = useState6(null);
|
|
536
|
-
const fetchProducts =
|
|
627
|
+
const fetchProducts = useCallback7(async () => {
|
|
537
628
|
setLoading(true);
|
|
538
629
|
setError(null);
|
|
539
630
|
try {
|
|
@@ -546,7 +637,7 @@ function useProductsByType(type, params) {
|
|
|
546
637
|
setLoading(false);
|
|
547
638
|
}
|
|
548
639
|
}, [client, type, params]);
|
|
549
|
-
|
|
640
|
+
useEffect5(() => {
|
|
550
641
|
fetchProducts();
|
|
551
642
|
}, [fetchProducts]);
|
|
552
643
|
return {
|
|
@@ -571,7 +662,7 @@ function useBundleItems(productSlug) {
|
|
|
571
662
|
const [bundle, setBundle] = useState6(null);
|
|
572
663
|
const [loading, setLoading] = useState6(true);
|
|
573
664
|
const [error, setError] = useState6(null);
|
|
574
|
-
const fetchBundle =
|
|
665
|
+
const fetchBundle = useCallback7(async () => {
|
|
575
666
|
setLoading(true);
|
|
576
667
|
setError(null);
|
|
577
668
|
try {
|
|
@@ -583,7 +674,7 @@ function useBundleItems(productSlug) {
|
|
|
583
674
|
setLoading(false);
|
|
584
675
|
}
|
|
585
676
|
}, [client, productSlug]);
|
|
586
|
-
|
|
677
|
+
useEffect5(() => {
|
|
587
678
|
fetchBundle();
|
|
588
679
|
}, [fetchBundle]);
|
|
589
680
|
return {
|
|
@@ -595,14 +686,14 @@ function useBundleItems(productSlug) {
|
|
|
595
686
|
}
|
|
596
687
|
|
|
597
688
|
// src/hooks/useOrders.ts
|
|
598
|
-
import { useState as useState7, useEffect as
|
|
689
|
+
import { useState as useState7, useEffect as useEffect6, useCallback as useCallback8 } from "react";
|
|
599
690
|
function useOrders(params) {
|
|
600
691
|
const client = useClient();
|
|
601
692
|
const [orders, setOrders] = useState7([]);
|
|
602
693
|
const [meta, setMeta] = useState7(null);
|
|
603
694
|
const [loading, setLoading] = useState7(true);
|
|
604
695
|
const [error, setError] = useState7(null);
|
|
605
|
-
const fetchOrders =
|
|
696
|
+
const fetchOrders = useCallback8(async (fetchParams, append = false) => {
|
|
606
697
|
if (!client.isAuthenticated()) {
|
|
607
698
|
setOrders([]);
|
|
608
699
|
setLoading(false);
|
|
@@ -624,16 +715,16 @@ function useOrders(params) {
|
|
|
624
715
|
setLoading(false);
|
|
625
716
|
}
|
|
626
717
|
}, [client]);
|
|
627
|
-
|
|
718
|
+
useEffect6(() => {
|
|
628
719
|
fetchOrders(params);
|
|
629
720
|
}, []);
|
|
630
721
|
const hasMore = meta ? meta.current_page < meta.last_page : false;
|
|
631
|
-
const loadMore =
|
|
722
|
+
const loadMore = useCallback8(async () => {
|
|
632
723
|
if (!hasMore || loading) return;
|
|
633
724
|
const nextPage = (meta?.current_page ?? 0) + 1;
|
|
634
725
|
await fetchOrders({ ...params, page: nextPage }, true);
|
|
635
726
|
}, [hasMore, loading, meta, params, fetchOrders]);
|
|
636
|
-
const refresh =
|
|
727
|
+
const refresh = useCallback8(async () => {
|
|
637
728
|
await fetchOrders(params);
|
|
638
729
|
}, [params, fetchOrders]);
|
|
639
730
|
return {
|
|
@@ -651,7 +742,7 @@ function useOrder(idOrNumber) {
|
|
|
651
742
|
const [order, setOrder] = useState7(null);
|
|
652
743
|
const [loading, setLoading] = useState7(true);
|
|
653
744
|
const [error, setError] = useState7(null);
|
|
654
|
-
const fetchOrder =
|
|
745
|
+
const fetchOrder = useCallback8(async () => {
|
|
655
746
|
setLoading(true);
|
|
656
747
|
setError(null);
|
|
657
748
|
try {
|
|
@@ -663,10 +754,10 @@ function useOrder(idOrNumber) {
|
|
|
663
754
|
setLoading(false);
|
|
664
755
|
}
|
|
665
756
|
}, [client, idOrNumber]);
|
|
666
|
-
|
|
757
|
+
useEffect6(() => {
|
|
667
758
|
fetchOrder();
|
|
668
759
|
}, [fetchOrder]);
|
|
669
|
-
const cancel =
|
|
760
|
+
const cancel = useCallback8(async () => {
|
|
670
761
|
if (!order) throw new Error("Order not loaded");
|
|
671
762
|
const cancelled = await client.shop.cancelOrder(order.id);
|
|
672
763
|
setOrder(cancelled);
|
|
@@ -684,7 +775,7 @@ function useCreateOrder() {
|
|
|
684
775
|
const client = useClient();
|
|
685
776
|
const [loading, setLoading] = useState7(false);
|
|
686
777
|
const [error, setError] = useState7(null);
|
|
687
|
-
const createOrder =
|
|
778
|
+
const createOrder = useCallback8(async (data) => {
|
|
688
779
|
setLoading(true);
|
|
689
780
|
setError(null);
|
|
690
781
|
try {
|
|
@@ -705,13 +796,19 @@ function useCreateOrder() {
|
|
|
705
796
|
}
|
|
706
797
|
|
|
707
798
|
// src/hooks/usePayment.ts
|
|
708
|
-
import { useState as useState8, useCallback as
|
|
799
|
+
import { useState as useState8, useCallback as useCallback9 } from "react";
|
|
800
|
+
var DEFAULT_CURRENCY2 = {
|
|
801
|
+
code: "KRW",
|
|
802
|
+
symbol: "\u20A9",
|
|
803
|
+
position: "before",
|
|
804
|
+
decimals: 0
|
|
805
|
+
};
|
|
709
806
|
function usePaymentStatus() {
|
|
710
807
|
const client = useClient();
|
|
711
808
|
const [status, setStatus] = useState8(null);
|
|
712
809
|
const [loading, setLoading] = useState8(true);
|
|
713
810
|
const [error, setError] = useState8(null);
|
|
714
|
-
const fetchStatus =
|
|
811
|
+
const fetchStatus = useCallback9(async () => {
|
|
715
812
|
setLoading(true);
|
|
716
813
|
setError(null);
|
|
717
814
|
try {
|
|
@@ -723,11 +820,25 @@ function usePaymentStatus() {
|
|
|
723
820
|
setLoading(false);
|
|
724
821
|
}
|
|
725
822
|
}, [client]);
|
|
823
|
+
const currency = status?.currency ?? null;
|
|
824
|
+
const formatPrice = useCallback9((amount) => {
|
|
825
|
+
const curr = currency ?? DEFAULT_CURRENCY2;
|
|
826
|
+
const formatted = amount.toLocaleString(void 0, {
|
|
827
|
+
minimumFractionDigits: curr.decimals,
|
|
828
|
+
maximumFractionDigits: curr.decimals
|
|
829
|
+
});
|
|
830
|
+
if (curr.position === "after") {
|
|
831
|
+
return `${formatted}${curr.symbol}`;
|
|
832
|
+
}
|
|
833
|
+
return `${curr.symbol}${formatted}`;
|
|
834
|
+
}, [currency]);
|
|
726
835
|
return {
|
|
727
836
|
status,
|
|
728
837
|
loading,
|
|
729
838
|
error,
|
|
730
839
|
refresh: fetchStatus,
|
|
840
|
+
currency,
|
|
841
|
+
formatPrice,
|
|
731
842
|
isTossAvailable: status?.toss?.available ?? false,
|
|
732
843
|
isStripeAvailable: status?.stripe?.available ?? false,
|
|
733
844
|
stripePublishableKey: status?.stripe?.publishable_key ?? null
|
|
@@ -737,7 +848,7 @@ function useTossPayment() {
|
|
|
737
848
|
const client = useClient();
|
|
738
849
|
const [loading, setLoading] = useState8(false);
|
|
739
850
|
const [error, setError] = useState8(null);
|
|
740
|
-
const preparePayment =
|
|
851
|
+
const preparePayment = useCallback9(async (orderNumber, successUrl, failUrl) => {
|
|
741
852
|
setLoading(true);
|
|
742
853
|
setError(null);
|
|
743
854
|
try {
|
|
@@ -754,7 +865,7 @@ function useTossPayment() {
|
|
|
754
865
|
setLoading(false);
|
|
755
866
|
}
|
|
756
867
|
}, [client]);
|
|
757
|
-
const confirmPayment =
|
|
868
|
+
const confirmPayment = useCallback9(async (paymentKey, orderId, amount) => {
|
|
758
869
|
setLoading(true);
|
|
759
870
|
setError(null);
|
|
760
871
|
try {
|
|
@@ -771,7 +882,7 @@ function useTossPayment() {
|
|
|
771
882
|
setLoading(false);
|
|
772
883
|
}
|
|
773
884
|
}, [client]);
|
|
774
|
-
const cancelPayment =
|
|
885
|
+
const cancelPayment = useCallback9(async (orderNumber, reason, amount) => {
|
|
775
886
|
setLoading(true);
|
|
776
887
|
setError(null);
|
|
777
888
|
try {
|
|
@@ -796,7 +907,7 @@ function useStripePayment() {
|
|
|
796
907
|
const client = useClient();
|
|
797
908
|
const [loading, setLoading] = useState8(false);
|
|
798
909
|
const [error, setError] = useState8(null);
|
|
799
|
-
const createCheckout =
|
|
910
|
+
const createCheckout = useCallback9(async (orderNumber, successUrl, cancelUrl) => {
|
|
800
911
|
setLoading(true);
|
|
801
912
|
setError(null);
|
|
802
913
|
try {
|
|
@@ -813,7 +924,7 @@ function useStripePayment() {
|
|
|
813
924
|
setLoading(false);
|
|
814
925
|
}
|
|
815
926
|
}, [client]);
|
|
816
|
-
const verifyPayment =
|
|
927
|
+
const verifyPayment = useCallback9(async (sessionId) => {
|
|
817
928
|
setLoading(true);
|
|
818
929
|
setError(null);
|
|
819
930
|
try {
|
|
@@ -826,7 +937,7 @@ function useStripePayment() {
|
|
|
826
937
|
setLoading(false);
|
|
827
938
|
}
|
|
828
939
|
}, [client]);
|
|
829
|
-
const refund =
|
|
940
|
+
const refund = useCallback9(async (orderNumber, reason, amount) => {
|
|
830
941
|
setLoading(true);
|
|
831
942
|
setError(null);
|
|
832
943
|
try {
|
|
@@ -849,13 +960,13 @@ function useStripePayment() {
|
|
|
849
960
|
}
|
|
850
961
|
|
|
851
962
|
// src/hooks/useCoupons.ts
|
|
852
|
-
import { useState as useState9, useEffect as
|
|
963
|
+
import { useState as useState9, useEffect as useEffect7, useCallback as useCallback10 } from "react";
|
|
853
964
|
function useCoupons() {
|
|
854
965
|
const client = useClient();
|
|
855
966
|
const [coupons, setCoupons] = useState9([]);
|
|
856
967
|
const [loading, setLoading] = useState9(true);
|
|
857
968
|
const [error, setError] = useState9(null);
|
|
858
|
-
const fetchCoupons =
|
|
969
|
+
const fetchCoupons = useCallback10(async () => {
|
|
859
970
|
if (!client.isAuthenticated()) {
|
|
860
971
|
setCoupons([]);
|
|
861
972
|
setLoading(false);
|
|
@@ -872,7 +983,7 @@ function useCoupons() {
|
|
|
872
983
|
setLoading(false);
|
|
873
984
|
}
|
|
874
985
|
}, [client]);
|
|
875
|
-
|
|
986
|
+
useEffect7(() => {
|
|
876
987
|
fetchCoupons();
|
|
877
988
|
}, [fetchCoupons]);
|
|
878
989
|
return {
|
|
@@ -887,7 +998,7 @@ function useValidateCoupon() {
|
|
|
887
998
|
const [validation, setValidation] = useState9(null);
|
|
888
999
|
const [loading, setLoading] = useState9(false);
|
|
889
1000
|
const [error, setError] = useState9(null);
|
|
890
|
-
const validate =
|
|
1001
|
+
const validate = useCallback10(async (code, orderAmount) => {
|
|
891
1002
|
setLoading(true);
|
|
892
1003
|
setError(null);
|
|
893
1004
|
try {
|
|
@@ -903,7 +1014,7 @@ function useValidateCoupon() {
|
|
|
903
1014
|
setLoading(false);
|
|
904
1015
|
}
|
|
905
1016
|
}, [client]);
|
|
906
|
-
const reset =
|
|
1017
|
+
const reset = useCallback10(() => {
|
|
907
1018
|
setValidation(null);
|
|
908
1019
|
setError(null);
|
|
909
1020
|
}, []);
|
|
@@ -917,13 +1028,13 @@ function useValidateCoupon() {
|
|
|
917
1028
|
}
|
|
918
1029
|
|
|
919
1030
|
// src/hooks/useSubscriptions.ts
|
|
920
|
-
import { useState as useState10, useEffect as
|
|
1031
|
+
import { useState as useState10, useEffect as useEffect8, useCallback as useCallback11 } from "react";
|
|
921
1032
|
function useSubscriptions() {
|
|
922
1033
|
const client = useClient();
|
|
923
1034
|
const [subscriptions, setSubscriptions] = useState10([]);
|
|
924
1035
|
const [loading, setLoading] = useState10(true);
|
|
925
1036
|
const [error, setError] = useState10(null);
|
|
926
|
-
const fetchSubscriptions =
|
|
1037
|
+
const fetchSubscriptions = useCallback11(async () => {
|
|
927
1038
|
if (!client.isAuthenticated()) {
|
|
928
1039
|
setSubscriptions([]);
|
|
929
1040
|
setLoading(false);
|
|
@@ -940,7 +1051,7 @@ function useSubscriptions() {
|
|
|
940
1051
|
setLoading(false);
|
|
941
1052
|
}
|
|
942
1053
|
}, [client]);
|
|
943
|
-
|
|
1054
|
+
useEffect8(() => {
|
|
944
1055
|
fetchSubscriptions();
|
|
945
1056
|
}, [fetchSubscriptions]);
|
|
946
1057
|
const activeSubscription = subscriptions.find((s) => s.is_active) ?? null;
|
|
@@ -959,7 +1070,7 @@ function useSubscription(id) {
|
|
|
959
1070
|
const [subscription, setSubscription] = useState10(null);
|
|
960
1071
|
const [loading, setLoading] = useState10(true);
|
|
961
1072
|
const [error, setError] = useState10(null);
|
|
962
|
-
const fetchSubscription =
|
|
1073
|
+
const fetchSubscription = useCallback11(async () => {
|
|
963
1074
|
setLoading(true);
|
|
964
1075
|
setError(null);
|
|
965
1076
|
try {
|
|
@@ -971,20 +1082,20 @@ function useSubscription(id) {
|
|
|
971
1082
|
setLoading(false);
|
|
972
1083
|
}
|
|
973
1084
|
}, [client, id]);
|
|
974
|
-
|
|
1085
|
+
useEffect8(() => {
|
|
975
1086
|
fetchSubscription();
|
|
976
1087
|
}, [fetchSubscription]);
|
|
977
|
-
const cancel =
|
|
1088
|
+
const cancel = useCallback11(async (immediately = false) => {
|
|
978
1089
|
const updated = await client.shop.cancelSubscription(id, immediately);
|
|
979
1090
|
setSubscription(updated);
|
|
980
1091
|
return updated;
|
|
981
1092
|
}, [client, id]);
|
|
982
|
-
const pause =
|
|
1093
|
+
const pause = useCallback11(async () => {
|
|
983
1094
|
const updated = await client.shop.pauseSubscription(id);
|
|
984
1095
|
setSubscription(updated);
|
|
985
1096
|
return updated;
|
|
986
1097
|
}, [client, id]);
|
|
987
|
-
const resume =
|
|
1098
|
+
const resume = useCallback11(async () => {
|
|
988
1099
|
const updated = await client.shop.resumeSubscription(id);
|
|
989
1100
|
setSubscription(updated);
|
|
990
1101
|
return updated;
|
|
@@ -1003,7 +1114,7 @@ function useCreateSubscription() {
|
|
|
1003
1114
|
const client = useClient();
|
|
1004
1115
|
const [loading, setLoading] = useState10(false);
|
|
1005
1116
|
const [error, setError] = useState10(null);
|
|
1006
|
-
const createCheckout =
|
|
1117
|
+
const createCheckout = useCallback11(async (planId, successUrl, cancelUrl) => {
|
|
1007
1118
|
setLoading(true);
|
|
1008
1119
|
setError(null);
|
|
1009
1120
|
try {
|
|
@@ -1020,7 +1131,7 @@ function useCreateSubscription() {
|
|
|
1020
1131
|
setLoading(false);
|
|
1021
1132
|
}
|
|
1022
1133
|
}, [client]);
|
|
1023
|
-
const verifyCheckout =
|
|
1134
|
+
const verifyCheckout = useCallback11(async (sessionId) => {
|
|
1024
1135
|
setLoading(true);
|
|
1025
1136
|
setError(null);
|
|
1026
1137
|
try {
|
|
@@ -1034,7 +1145,7 @@ function useCreateSubscription() {
|
|
|
1034
1145
|
setLoading(false);
|
|
1035
1146
|
}
|
|
1036
1147
|
}, [client]);
|
|
1037
|
-
const createSetupIntent =
|
|
1148
|
+
const createSetupIntent = useCallback11(async () => {
|
|
1038
1149
|
setLoading(true);
|
|
1039
1150
|
setError(null);
|
|
1040
1151
|
try {
|
|
@@ -1058,13 +1169,13 @@ function useCreateSubscription() {
|
|
|
1058
1169
|
}
|
|
1059
1170
|
|
|
1060
1171
|
// src/hooks/useDownloads.ts
|
|
1061
|
-
import { useState as useState11, useEffect as
|
|
1172
|
+
import { useState as useState11, useEffect as useEffect9, useCallback as useCallback12 } from "react";
|
|
1062
1173
|
function useDownloads() {
|
|
1063
1174
|
const client = useClient();
|
|
1064
1175
|
const [downloads, setDownloads] = useState11([]);
|
|
1065
1176
|
const [loading, setLoading] = useState11(true);
|
|
1066
1177
|
const [error, setError] = useState11(null);
|
|
1067
|
-
const fetchDownloads =
|
|
1178
|
+
const fetchDownloads = useCallback12(async () => {
|
|
1068
1179
|
if (!client.isAuthenticated()) {
|
|
1069
1180
|
setDownloads([]);
|
|
1070
1181
|
setLoading(false);
|
|
@@ -1081,13 +1192,13 @@ function useDownloads() {
|
|
|
1081
1192
|
setLoading(false);
|
|
1082
1193
|
}
|
|
1083
1194
|
}, [client]);
|
|
1084
|
-
|
|
1195
|
+
useEffect9(() => {
|
|
1085
1196
|
fetchDownloads();
|
|
1086
1197
|
}, [fetchDownloads]);
|
|
1087
|
-
const getDownloadUrl =
|
|
1198
|
+
const getDownloadUrl = useCallback12((token) => {
|
|
1088
1199
|
return client.shop.getDownloadUrl(token);
|
|
1089
1200
|
}, [client]);
|
|
1090
|
-
const getDownloadInfo =
|
|
1201
|
+
const getDownloadInfo = useCallback12(async (token) => {
|
|
1091
1202
|
return await client.shop.getDownloadInfo(token);
|
|
1092
1203
|
}, [client]);
|
|
1093
1204
|
return {
|
|
@@ -1104,7 +1215,7 @@ function useOrderDownloads(orderNumber) {
|
|
|
1104
1215
|
const [downloads, setDownloads] = useState11([]);
|
|
1105
1216
|
const [loading, setLoading] = useState11(true);
|
|
1106
1217
|
const [error, setError] = useState11(null);
|
|
1107
|
-
const fetchDownloads =
|
|
1218
|
+
const fetchDownloads = useCallback12(async () => {
|
|
1108
1219
|
if (!client.isAuthenticated()) {
|
|
1109
1220
|
setDownloads([]);
|
|
1110
1221
|
setLoading(false);
|
|
@@ -1121,13 +1232,13 @@ function useOrderDownloads(orderNumber) {
|
|
|
1121
1232
|
setLoading(false);
|
|
1122
1233
|
}
|
|
1123
1234
|
}, [client, orderNumber]);
|
|
1124
|
-
|
|
1235
|
+
useEffect9(() => {
|
|
1125
1236
|
fetchDownloads();
|
|
1126
1237
|
}, [fetchDownloads]);
|
|
1127
|
-
const getDownloadUrl =
|
|
1238
|
+
const getDownloadUrl = useCallback12((token) => {
|
|
1128
1239
|
return client.shop.getDownloadUrl(token);
|
|
1129
1240
|
}, [client]);
|
|
1130
|
-
const getDownloadInfo =
|
|
1241
|
+
const getDownloadInfo = useCallback12(async (token) => {
|
|
1131
1242
|
return await client.shop.getDownloadInfo(token);
|
|
1132
1243
|
}, [client]);
|
|
1133
1244
|
return {
|
|
@@ -1141,7 +1252,7 @@ function useOrderDownloads(orderNumber) {
|
|
|
1141
1252
|
}
|
|
1142
1253
|
|
|
1143
1254
|
// src/hooks/useReviews.ts
|
|
1144
|
-
import { useState as useState12, useEffect as
|
|
1255
|
+
import { useState as useState12, useEffect as useEffect10, useCallback as useCallback13 } from "react";
|
|
1145
1256
|
function useProductReviews(productSlug, params) {
|
|
1146
1257
|
const client = useClient();
|
|
1147
1258
|
const [reviews, setReviews] = useState12([]);
|
|
@@ -1149,7 +1260,7 @@ function useProductReviews(productSlug, params) {
|
|
|
1149
1260
|
const [meta, setMeta] = useState12(null);
|
|
1150
1261
|
const [loading, setLoading] = useState12(true);
|
|
1151
1262
|
const [error, setError] = useState12(null);
|
|
1152
|
-
const fetchReviews =
|
|
1263
|
+
const fetchReviews = useCallback13(async () => {
|
|
1153
1264
|
setLoading(true);
|
|
1154
1265
|
setError(null);
|
|
1155
1266
|
try {
|
|
@@ -1163,7 +1274,7 @@ function useProductReviews(productSlug, params) {
|
|
|
1163
1274
|
setLoading(false);
|
|
1164
1275
|
}
|
|
1165
1276
|
}, [client, productSlug, params]);
|
|
1166
|
-
|
|
1277
|
+
useEffect10(() => {
|
|
1167
1278
|
fetchReviews();
|
|
1168
1279
|
}, [fetchReviews]);
|
|
1169
1280
|
return {
|
|
@@ -1181,7 +1292,7 @@ function useCanReview(productSlug) {
|
|
|
1181
1292
|
const [reason, setReason] = useState12(null);
|
|
1182
1293
|
const [loading, setLoading] = useState12(true);
|
|
1183
1294
|
const [error, setError] = useState12(null);
|
|
1184
|
-
const check =
|
|
1295
|
+
const check = useCallback13(async () => {
|
|
1185
1296
|
setLoading(true);
|
|
1186
1297
|
setError(null);
|
|
1187
1298
|
try {
|
|
@@ -1196,7 +1307,7 @@ function useCanReview(productSlug) {
|
|
|
1196
1307
|
setLoading(false);
|
|
1197
1308
|
}
|
|
1198
1309
|
}, [client, productSlug]);
|
|
1199
|
-
|
|
1310
|
+
useEffect10(() => {
|
|
1200
1311
|
if (client.isAuthenticated()) {
|
|
1201
1312
|
check();
|
|
1202
1313
|
} else {
|
|
@@ -1217,7 +1328,7 @@ function useCreateReview() {
|
|
|
1217
1328
|
const client = useClient();
|
|
1218
1329
|
const [loading, setLoading] = useState12(false);
|
|
1219
1330
|
const [error, setError] = useState12(null);
|
|
1220
|
-
const createReview =
|
|
1331
|
+
const createReview = useCallback13(async (productSlug, data) => {
|
|
1221
1332
|
setLoading(true);
|
|
1222
1333
|
setError(null);
|
|
1223
1334
|
try {
|
|
@@ -1242,7 +1353,7 @@ function useMyReviews(params) {
|
|
|
1242
1353
|
const [meta, setMeta] = useState12(null);
|
|
1243
1354
|
const [loading, setLoading] = useState12(true);
|
|
1244
1355
|
const [error, setError] = useState12(null);
|
|
1245
|
-
const fetchReviews =
|
|
1356
|
+
const fetchReviews = useCallback13(async () => {
|
|
1246
1357
|
if (!client.isAuthenticated()) {
|
|
1247
1358
|
setReviews([]);
|
|
1248
1359
|
setLoading(false);
|
|
@@ -1260,14 +1371,14 @@ function useMyReviews(params) {
|
|
|
1260
1371
|
setLoading(false);
|
|
1261
1372
|
}
|
|
1262
1373
|
}, [client, params]);
|
|
1263
|
-
|
|
1374
|
+
useEffect10(() => {
|
|
1264
1375
|
fetchReviews();
|
|
1265
1376
|
}, [fetchReviews]);
|
|
1266
|
-
const deleteReview =
|
|
1377
|
+
const deleteReview = useCallback13(async (reviewId) => {
|
|
1267
1378
|
await client.shop.deleteReview(reviewId);
|
|
1268
1379
|
setReviews((prev) => prev.filter((r) => r.id !== reviewId));
|
|
1269
1380
|
}, [client]);
|
|
1270
|
-
const updateReview =
|
|
1381
|
+
const updateReview = useCallback13(async (reviewId, data) => {
|
|
1271
1382
|
const updated = await client.shop.updateReview(reviewId, data);
|
|
1272
1383
|
setReviews((prev) => prev.map((r) => r.id === reviewId ? updated : r));
|
|
1273
1384
|
return updated;
|
|
@@ -1284,7 +1395,7 @@ function useMyReviews(params) {
|
|
|
1284
1395
|
}
|
|
1285
1396
|
|
|
1286
1397
|
// src/hooks/useBlog.ts
|
|
1287
|
-
import { useState as useState13, useEffect as
|
|
1398
|
+
import { useState as useState13, useEffect as useEffect11, useCallback as useCallback14 } from "react";
|
|
1288
1399
|
function useBlog(options = {}) {
|
|
1289
1400
|
const { autoFetch = true, ...params } = options;
|
|
1290
1401
|
const client = useClient();
|
|
@@ -1293,7 +1404,7 @@ function useBlog(options = {}) {
|
|
|
1293
1404
|
const [loading, setLoading] = useState13(autoFetch);
|
|
1294
1405
|
const [error, setError] = useState13(null);
|
|
1295
1406
|
const [currentParams, setCurrentParams] = useState13(params);
|
|
1296
|
-
const fetchPosts =
|
|
1407
|
+
const fetchPosts = useCallback14(async (fetchParams, append = false) => {
|
|
1297
1408
|
setLoading(true);
|
|
1298
1409
|
setError(null);
|
|
1299
1410
|
try {
|
|
@@ -1310,18 +1421,18 @@ function useBlog(options = {}) {
|
|
|
1310
1421
|
setLoading(false);
|
|
1311
1422
|
}
|
|
1312
1423
|
}, [client]);
|
|
1313
|
-
|
|
1424
|
+
useEffect11(() => {
|
|
1314
1425
|
if (autoFetch) {
|
|
1315
1426
|
fetchPosts(params);
|
|
1316
1427
|
}
|
|
1317
1428
|
}, []);
|
|
1318
1429
|
const hasMore = meta ? meta.current_page < meta.last_page : false;
|
|
1319
|
-
const loadMore =
|
|
1430
|
+
const loadMore = useCallback14(async () => {
|
|
1320
1431
|
if (!hasMore || loading) return;
|
|
1321
1432
|
const nextPage = (meta?.current_page ?? 0) + 1;
|
|
1322
1433
|
await fetchPosts({ ...currentParams, page: nextPage }, true);
|
|
1323
1434
|
}, [hasMore, loading, meta, currentParams, fetchPosts]);
|
|
1324
|
-
const refresh =
|
|
1435
|
+
const refresh = useCallback14(async () => {
|
|
1325
1436
|
setCurrentParams(params);
|
|
1326
1437
|
await fetchPosts(params);
|
|
1327
1438
|
}, [params, fetchPosts]);
|
|
@@ -1340,7 +1451,7 @@ function useBlogPost(slug) {
|
|
|
1340
1451
|
const [post, setPost] = useState13(null);
|
|
1341
1452
|
const [loading, setLoading] = useState13(true);
|
|
1342
1453
|
const [error, setError] = useState13(null);
|
|
1343
|
-
const fetchPost =
|
|
1454
|
+
const fetchPost = useCallback14(async () => {
|
|
1344
1455
|
setLoading(true);
|
|
1345
1456
|
setError(null);
|
|
1346
1457
|
try {
|
|
@@ -1352,7 +1463,7 @@ function useBlogPost(slug) {
|
|
|
1352
1463
|
setLoading(false);
|
|
1353
1464
|
}
|
|
1354
1465
|
}, [client, slug]);
|
|
1355
|
-
|
|
1466
|
+
useEffect11(() => {
|
|
1356
1467
|
fetchPost();
|
|
1357
1468
|
}, [fetchPost]);
|
|
1358
1469
|
return {
|
|
@@ -1367,7 +1478,7 @@ function useBlogCategories() {
|
|
|
1367
1478
|
const [categories, setCategories] = useState13([]);
|
|
1368
1479
|
const [loading, setLoading] = useState13(true);
|
|
1369
1480
|
const [error, setError] = useState13(null);
|
|
1370
|
-
const fetchCategories =
|
|
1481
|
+
const fetchCategories = useCallback14(async () => {
|
|
1371
1482
|
setLoading(true);
|
|
1372
1483
|
setError(null);
|
|
1373
1484
|
try {
|
|
@@ -1379,7 +1490,7 @@ function useBlogCategories() {
|
|
|
1379
1490
|
setLoading(false);
|
|
1380
1491
|
}
|
|
1381
1492
|
}, [client]);
|
|
1382
|
-
|
|
1493
|
+
useEffect11(() => {
|
|
1383
1494
|
fetchCategories();
|
|
1384
1495
|
}, [fetchCategories]);
|
|
1385
1496
|
return {
|
|
@@ -1394,7 +1505,7 @@ function useBlogTags() {
|
|
|
1394
1505
|
const [tags, setTags] = useState13([]);
|
|
1395
1506
|
const [loading, setLoading] = useState13(true);
|
|
1396
1507
|
const [error, setError] = useState13(null);
|
|
1397
|
-
const fetchTags =
|
|
1508
|
+
const fetchTags = useCallback14(async () => {
|
|
1398
1509
|
setLoading(true);
|
|
1399
1510
|
setError(null);
|
|
1400
1511
|
try {
|
|
@@ -1406,7 +1517,7 @@ function useBlogTags() {
|
|
|
1406
1517
|
setLoading(false);
|
|
1407
1518
|
}
|
|
1408
1519
|
}, [client]);
|
|
1409
|
-
|
|
1520
|
+
useEffect11(() => {
|
|
1410
1521
|
fetchTags();
|
|
1411
1522
|
}, [fetchTags]);
|
|
1412
1523
|
return {
|
|
@@ -1421,7 +1532,7 @@ function useFeaturedBlog(limit = 5) {
|
|
|
1421
1532
|
const [posts, setPosts] = useState13([]);
|
|
1422
1533
|
const [loading, setLoading] = useState13(true);
|
|
1423
1534
|
const [error, setError] = useState13(null);
|
|
1424
|
-
const fetchPosts =
|
|
1535
|
+
const fetchPosts = useCallback14(async () => {
|
|
1425
1536
|
setLoading(true);
|
|
1426
1537
|
setError(null);
|
|
1427
1538
|
try {
|
|
@@ -1433,7 +1544,7 @@ function useFeaturedBlog(limit = 5) {
|
|
|
1433
1544
|
setLoading(false);
|
|
1434
1545
|
}
|
|
1435
1546
|
}, [client, limit]);
|
|
1436
|
-
|
|
1547
|
+
useEffect11(() => {
|
|
1437
1548
|
fetchPosts();
|
|
1438
1549
|
}, [fetchPosts]);
|
|
1439
1550
|
return {
|
|
@@ -1449,7 +1560,7 @@ function useBlogSearch() {
|
|
|
1449
1560
|
const [meta, setMeta] = useState13(null);
|
|
1450
1561
|
const [loading, setLoading] = useState13(false);
|
|
1451
1562
|
const [error, setError] = useState13(null);
|
|
1452
|
-
const search =
|
|
1563
|
+
const search = useCallback14(async (query) => {
|
|
1453
1564
|
setLoading(true);
|
|
1454
1565
|
setError(null);
|
|
1455
1566
|
try {
|
|
@@ -1472,13 +1583,13 @@ function useBlogSearch() {
|
|
|
1472
1583
|
}
|
|
1473
1584
|
|
|
1474
1585
|
// src/hooks/useBoards.ts
|
|
1475
|
-
import { useState as useState14, useEffect as
|
|
1586
|
+
import { useState as useState14, useEffect as useEffect12, useCallback as useCallback15 } from "react";
|
|
1476
1587
|
function useBoards(params) {
|
|
1477
1588
|
const client = useClient();
|
|
1478
1589
|
const [boards, setBoards] = useState14([]);
|
|
1479
1590
|
const [loading, setLoading] = useState14(true);
|
|
1480
1591
|
const [error, setError] = useState14(null);
|
|
1481
|
-
const fetchBoards =
|
|
1592
|
+
const fetchBoards = useCallback15(async () => {
|
|
1482
1593
|
setLoading(true);
|
|
1483
1594
|
setError(null);
|
|
1484
1595
|
try {
|
|
@@ -1490,7 +1601,7 @@ function useBoards(params) {
|
|
|
1490
1601
|
setLoading(false);
|
|
1491
1602
|
}
|
|
1492
1603
|
}, [client, params]);
|
|
1493
|
-
|
|
1604
|
+
useEffect12(() => {
|
|
1494
1605
|
fetchBoards();
|
|
1495
1606
|
}, [fetchBoards]);
|
|
1496
1607
|
return {
|
|
@@ -1505,7 +1616,7 @@ function useBoard(slug) {
|
|
|
1505
1616
|
const [board, setBoard] = useState14(null);
|
|
1506
1617
|
const [loading, setLoading] = useState14(true);
|
|
1507
1618
|
const [error, setError] = useState14(null);
|
|
1508
|
-
const fetchBoard =
|
|
1619
|
+
const fetchBoard = useCallback15(async () => {
|
|
1509
1620
|
setLoading(true);
|
|
1510
1621
|
setError(null);
|
|
1511
1622
|
try {
|
|
@@ -1517,7 +1628,7 @@ function useBoard(slug) {
|
|
|
1517
1628
|
setLoading(false);
|
|
1518
1629
|
}
|
|
1519
1630
|
}, [client, slug]);
|
|
1520
|
-
|
|
1631
|
+
useEffect12(() => {
|
|
1521
1632
|
fetchBoard();
|
|
1522
1633
|
}, [fetchBoard]);
|
|
1523
1634
|
return {
|
|
@@ -1534,7 +1645,7 @@ function useBoardPosts(boardSlug, params) {
|
|
|
1534
1645
|
const [loading, setLoading] = useState14(true);
|
|
1535
1646
|
const [error, setError] = useState14(null);
|
|
1536
1647
|
const [currentParams, setCurrentParams] = useState14(params);
|
|
1537
|
-
const fetchPosts =
|
|
1648
|
+
const fetchPosts = useCallback15(async (fetchParams, append = false) => {
|
|
1538
1649
|
setLoading(true);
|
|
1539
1650
|
setError(null);
|
|
1540
1651
|
try {
|
|
@@ -1551,16 +1662,16 @@ function useBoardPosts(boardSlug, params) {
|
|
|
1551
1662
|
setLoading(false);
|
|
1552
1663
|
}
|
|
1553
1664
|
}, [client, boardSlug]);
|
|
1554
|
-
|
|
1665
|
+
useEffect12(() => {
|
|
1555
1666
|
fetchPosts(params);
|
|
1556
1667
|
}, []);
|
|
1557
1668
|
const hasMore = meta ? meta.current_page < meta.last_page : false;
|
|
1558
|
-
const loadMore =
|
|
1669
|
+
const loadMore = useCallback15(async () => {
|
|
1559
1670
|
if (!hasMore || loading) return;
|
|
1560
1671
|
const nextPage = (meta?.current_page ?? 0) + 1;
|
|
1561
1672
|
await fetchPosts({ ...currentParams, page: nextPage }, true);
|
|
1562
1673
|
}, [hasMore, loading, meta, currentParams, fetchPosts]);
|
|
1563
|
-
const refresh =
|
|
1674
|
+
const refresh = useCallback15(async () => {
|
|
1564
1675
|
setCurrentParams(params);
|
|
1565
1676
|
await fetchPosts(params);
|
|
1566
1677
|
}, [params, fetchPosts]);
|
|
@@ -1579,7 +1690,7 @@ function useBoardPost(postId) {
|
|
|
1579
1690
|
const [post, setPost] = useState14(null);
|
|
1580
1691
|
const [loading, setLoading] = useState14(true);
|
|
1581
1692
|
const [error, setError] = useState14(null);
|
|
1582
|
-
const fetchPost =
|
|
1693
|
+
const fetchPost = useCallback15(async () => {
|
|
1583
1694
|
setLoading(true);
|
|
1584
1695
|
setError(null);
|
|
1585
1696
|
try {
|
|
@@ -1591,7 +1702,7 @@ function useBoardPost(postId) {
|
|
|
1591
1702
|
setLoading(false);
|
|
1592
1703
|
}
|
|
1593
1704
|
}, [client, postId]);
|
|
1594
|
-
|
|
1705
|
+
useEffect12(() => {
|
|
1595
1706
|
fetchPost();
|
|
1596
1707
|
}, [fetchPost]);
|
|
1597
1708
|
return {
|
|
@@ -1605,7 +1716,7 @@ function useCreateBoardPost() {
|
|
|
1605
1716
|
const client = useClient();
|
|
1606
1717
|
const [loading, setLoading] = useState14(false);
|
|
1607
1718
|
const [error, setError] = useState14(null);
|
|
1608
|
-
const createPost =
|
|
1719
|
+
const createPost = useCallback15(async (data) => {
|
|
1609
1720
|
setLoading(true);
|
|
1610
1721
|
setError(null);
|
|
1611
1722
|
try {
|
|
@@ -1626,7 +1737,7 @@ function useCreateBoardPost() {
|
|
|
1626
1737
|
}
|
|
1627
1738
|
|
|
1628
1739
|
// src/hooks/useComments.ts
|
|
1629
|
-
import { useState as useState15, useEffect as
|
|
1740
|
+
import { useState as useState15, useEffect as useEffect13, useCallback as useCallback16 } from "react";
|
|
1630
1741
|
function useComments(options) {
|
|
1631
1742
|
const { type, target, page, per_page } = options;
|
|
1632
1743
|
const client = useClient();
|
|
@@ -1634,7 +1745,7 @@ function useComments(options) {
|
|
|
1634
1745
|
const [meta, setMeta] = useState15(null);
|
|
1635
1746
|
const [loading, setLoading] = useState15(true);
|
|
1636
1747
|
const [error, setError] = useState15(null);
|
|
1637
|
-
const fetchComments =
|
|
1748
|
+
const fetchComments = useCallback16(async () => {
|
|
1638
1749
|
setLoading(true);
|
|
1639
1750
|
setError(null);
|
|
1640
1751
|
try {
|
|
@@ -1659,10 +1770,10 @@ function useComments(options) {
|
|
|
1659
1770
|
setLoading(false);
|
|
1660
1771
|
}
|
|
1661
1772
|
}, [client, type, target, page, per_page]);
|
|
1662
|
-
|
|
1773
|
+
useEffect13(() => {
|
|
1663
1774
|
fetchComments();
|
|
1664
1775
|
}, [fetchComments]);
|
|
1665
|
-
const createComment =
|
|
1776
|
+
const createComment = useCallback16(async (data) => {
|
|
1666
1777
|
let response;
|
|
1667
1778
|
switch (type) {
|
|
1668
1779
|
case "board":
|
|
@@ -1678,16 +1789,16 @@ function useComments(options) {
|
|
|
1678
1789
|
await fetchComments();
|
|
1679
1790
|
return response.data;
|
|
1680
1791
|
}, [client, type, target, fetchComments]);
|
|
1681
|
-
const updateComment =
|
|
1792
|
+
const updateComment = useCallback16(async (commentId, content) => {
|
|
1682
1793
|
const response = await client.comments.update(commentId, { content });
|
|
1683
1794
|
setComments((prev) => prev.map((c) => c.id === commentId ? response.data : c));
|
|
1684
1795
|
return response.data;
|
|
1685
1796
|
}, [client]);
|
|
1686
|
-
const deleteComment =
|
|
1797
|
+
const deleteComment = useCallback16(async (commentId, password) => {
|
|
1687
1798
|
await client.comments.delete(commentId, password ? { password } : void 0);
|
|
1688
1799
|
setComments((prev) => prev.filter((c) => c.id !== commentId));
|
|
1689
1800
|
}, [client]);
|
|
1690
|
-
const likeComment =
|
|
1801
|
+
const likeComment = useCallback16(async (commentId) => {
|
|
1691
1802
|
const response = await client.comments.like(commentId);
|
|
1692
1803
|
setComments((prev) => prev.map(
|
|
1693
1804
|
(c) => c.id === commentId ? { ...c, likes: response.data.likes } : c
|
|
@@ -1708,7 +1819,7 @@ function useComments(options) {
|
|
|
1708
1819
|
}
|
|
1709
1820
|
|
|
1710
1821
|
// src/hooks/useForms.ts
|
|
1711
|
-
import { useState as useState16, useEffect as
|
|
1822
|
+
import { useState as useState16, useEffect as useEffect14, useCallback as useCallback17 } from "react";
|
|
1712
1823
|
function useForm(formSlug) {
|
|
1713
1824
|
const client = useClient();
|
|
1714
1825
|
const [form, setForm] = useState16(null);
|
|
@@ -1716,7 +1827,7 @@ function useForm(formSlug) {
|
|
|
1716
1827
|
const [error, setError] = useState16(null);
|
|
1717
1828
|
const [submitting, setSubmitting] = useState16(false);
|
|
1718
1829
|
const [submitted, setSubmitted] = useState16(false);
|
|
1719
|
-
const fetchForm =
|
|
1830
|
+
const fetchForm = useCallback17(async () => {
|
|
1720
1831
|
setLoading(true);
|
|
1721
1832
|
setError(null);
|
|
1722
1833
|
try {
|
|
@@ -1728,10 +1839,10 @@ function useForm(formSlug) {
|
|
|
1728
1839
|
setLoading(false);
|
|
1729
1840
|
}
|
|
1730
1841
|
}, [client, formSlug]);
|
|
1731
|
-
|
|
1842
|
+
useEffect14(() => {
|
|
1732
1843
|
fetchForm();
|
|
1733
1844
|
}, [fetchForm]);
|
|
1734
|
-
const submit =
|
|
1845
|
+
const submit = useCallback17(async (data) => {
|
|
1735
1846
|
setSubmitting(true);
|
|
1736
1847
|
setError(null);
|
|
1737
1848
|
try {
|
|
@@ -1746,7 +1857,7 @@ function useForm(formSlug) {
|
|
|
1746
1857
|
setSubmitting(false);
|
|
1747
1858
|
}
|
|
1748
1859
|
}, [client, formSlug]);
|
|
1749
|
-
const reset =
|
|
1860
|
+
const reset = useCallback17(() => {
|
|
1750
1861
|
setSubmitted(false);
|
|
1751
1862
|
setError(null);
|
|
1752
1863
|
}, []);
|
|
@@ -1762,13 +1873,13 @@ function useForm(formSlug) {
|
|
|
1762
1873
|
}
|
|
1763
1874
|
|
|
1764
1875
|
// src/hooks/useReservation.ts
|
|
1765
|
-
import { useState as useState17, useEffect as
|
|
1876
|
+
import { useState as useState17, useEffect as useEffect15, useCallback as useCallback18 } from "react";
|
|
1766
1877
|
function useReservationServices() {
|
|
1767
1878
|
const client = useClient();
|
|
1768
1879
|
const [services, setServices] = useState17([]);
|
|
1769
1880
|
const [loading, setLoading] = useState17(true);
|
|
1770
1881
|
const [error, setError] = useState17(null);
|
|
1771
|
-
const fetchServices =
|
|
1882
|
+
const fetchServices = useCallback18(async () => {
|
|
1772
1883
|
setLoading(true);
|
|
1773
1884
|
setError(null);
|
|
1774
1885
|
try {
|
|
@@ -1780,7 +1891,7 @@ function useReservationServices() {
|
|
|
1780
1891
|
setLoading(false);
|
|
1781
1892
|
}
|
|
1782
1893
|
}, [client]);
|
|
1783
|
-
|
|
1894
|
+
useEffect15(() => {
|
|
1784
1895
|
fetchServices();
|
|
1785
1896
|
}, [fetchServices]);
|
|
1786
1897
|
return {
|
|
@@ -1795,7 +1906,7 @@ function useReservationStaffs() {
|
|
|
1795
1906
|
const [staffs, setStaffs] = useState17([]);
|
|
1796
1907
|
const [loading, setLoading] = useState17(true);
|
|
1797
1908
|
const [error, setError] = useState17(null);
|
|
1798
|
-
const fetchStaffs =
|
|
1909
|
+
const fetchStaffs = useCallback18(async () => {
|
|
1799
1910
|
setLoading(true);
|
|
1800
1911
|
setError(null);
|
|
1801
1912
|
try {
|
|
@@ -1807,7 +1918,7 @@ function useReservationStaffs() {
|
|
|
1807
1918
|
setLoading(false);
|
|
1808
1919
|
}
|
|
1809
1920
|
}, [client]);
|
|
1810
|
-
|
|
1921
|
+
useEffect15(() => {
|
|
1811
1922
|
fetchStaffs();
|
|
1812
1923
|
}, [fetchStaffs]);
|
|
1813
1924
|
return {
|
|
@@ -1822,7 +1933,7 @@ function useAvailableSlots(serviceId, date, staffId) {
|
|
|
1822
1933
|
const [slots, setSlots] = useState17([]);
|
|
1823
1934
|
const [loading, setLoading] = useState17(true);
|
|
1824
1935
|
const [error, setError] = useState17(null);
|
|
1825
|
-
const fetchSlots =
|
|
1936
|
+
const fetchSlots = useCallback18(async () => {
|
|
1826
1937
|
if (!serviceId || !date) {
|
|
1827
1938
|
setSlots([]);
|
|
1828
1939
|
setLoading(false);
|
|
@@ -1843,7 +1954,7 @@ function useAvailableSlots(serviceId, date, staffId) {
|
|
|
1843
1954
|
setLoading(false);
|
|
1844
1955
|
}
|
|
1845
1956
|
}, [client, serviceId, date, staffId]);
|
|
1846
|
-
|
|
1957
|
+
useEffect15(() => {
|
|
1847
1958
|
fetchSlots();
|
|
1848
1959
|
}, [fetchSlots]);
|
|
1849
1960
|
return {
|
|
@@ -1859,7 +1970,7 @@ function useMyReservations(params) {
|
|
|
1859
1970
|
const [meta, setMeta] = useState17(null);
|
|
1860
1971
|
const [loading, setLoading] = useState17(true);
|
|
1861
1972
|
const [error, setError] = useState17(null);
|
|
1862
|
-
const fetchReservations =
|
|
1973
|
+
const fetchReservations = useCallback18(async () => {
|
|
1863
1974
|
if (!client.isAuthenticated()) {
|
|
1864
1975
|
setReservations([]);
|
|
1865
1976
|
setLoading(false);
|
|
@@ -1877,7 +1988,7 @@ function useMyReservations(params) {
|
|
|
1877
1988
|
setLoading(false);
|
|
1878
1989
|
}
|
|
1879
1990
|
}, [client, params]);
|
|
1880
|
-
|
|
1991
|
+
useEffect15(() => {
|
|
1881
1992
|
fetchReservations();
|
|
1882
1993
|
}, [fetchReservations]);
|
|
1883
1994
|
return {
|
|
@@ -1892,7 +2003,7 @@ function useCreateReservation() {
|
|
|
1892
2003
|
const client = useClient();
|
|
1893
2004
|
const [loading, setLoading] = useState17(false);
|
|
1894
2005
|
const [error, setError] = useState17(null);
|
|
1895
|
-
const createReservation =
|
|
2006
|
+
const createReservation = useCallback18(async (data) => {
|
|
1896
2007
|
setLoading(true);
|
|
1897
2008
|
setError(null);
|
|
1898
2009
|
try {
|
|
@@ -1917,7 +2028,7 @@ function useReservationSettings() {
|
|
|
1917
2028
|
const [settings, setSettings] = useState17(null);
|
|
1918
2029
|
const [loading, setLoading] = useState17(true);
|
|
1919
2030
|
const [error, setError] = useState17(null);
|
|
1920
|
-
const fetchSettings =
|
|
2031
|
+
const fetchSettings = useCallback18(async () => {
|
|
1921
2032
|
setLoading(true);
|
|
1922
2033
|
setError(null);
|
|
1923
2034
|
try {
|
|
@@ -1929,7 +2040,7 @@ function useReservationSettings() {
|
|
|
1929
2040
|
setLoading(false);
|
|
1930
2041
|
}
|
|
1931
2042
|
}, [client]);
|
|
1932
|
-
|
|
2043
|
+
useEffect15(() => {
|
|
1933
2044
|
fetchSettings();
|
|
1934
2045
|
}, [fetchSettings]);
|
|
1935
2046
|
return {
|
|
@@ -1941,7 +2052,7 @@ function useReservationSettings() {
|
|
|
1941
2052
|
}
|
|
1942
2053
|
|
|
1943
2054
|
// src/hooks/useMedia.ts
|
|
1944
|
-
import { useState as useState18, useEffect as
|
|
2055
|
+
import { useState as useState18, useEffect as useEffect16, useCallback as useCallback19 } from "react";
|
|
1945
2056
|
function useMedia(options = {}) {
|
|
1946
2057
|
const { type, page, per_page, autoFetch = true } = options;
|
|
1947
2058
|
const client = useClient();
|
|
@@ -1951,7 +2062,7 @@ function useMedia(options = {}) {
|
|
|
1951
2062
|
const [error, setError] = useState18(null);
|
|
1952
2063
|
const [uploading, setUploading] = useState18(false);
|
|
1953
2064
|
const [uploadProgress, setUploadProgress] = useState18(0);
|
|
1954
|
-
const fetchMedia =
|
|
2065
|
+
const fetchMedia = useCallback19(async () => {
|
|
1955
2066
|
if (!client.isAuthenticated()) {
|
|
1956
2067
|
setFiles([]);
|
|
1957
2068
|
setLoading(false);
|
|
@@ -1969,12 +2080,12 @@ function useMedia(options = {}) {
|
|
|
1969
2080
|
setLoading(false);
|
|
1970
2081
|
}
|
|
1971
2082
|
}, [client, type, page, per_page]);
|
|
1972
|
-
|
|
2083
|
+
useEffect16(() => {
|
|
1973
2084
|
if (autoFetch) {
|
|
1974
2085
|
fetchMedia();
|
|
1975
2086
|
}
|
|
1976
2087
|
}, [autoFetch, fetchMedia]);
|
|
1977
|
-
const upload =
|
|
2088
|
+
const upload = useCallback19(async (file) => {
|
|
1978
2089
|
setUploading(true);
|
|
1979
2090
|
setUploadProgress(0);
|
|
1980
2091
|
setError(null);
|
|
@@ -1991,7 +2102,7 @@ function useMedia(options = {}) {
|
|
|
1991
2102
|
setUploading(false);
|
|
1992
2103
|
}
|
|
1993
2104
|
}, [client]);
|
|
1994
|
-
const uploadMultiple =
|
|
2105
|
+
const uploadMultiple = useCallback19(async (filesToUpload) => {
|
|
1995
2106
|
setUploading(true);
|
|
1996
2107
|
setUploadProgress(0);
|
|
1997
2108
|
setError(null);
|
|
@@ -2012,7 +2123,7 @@ function useMedia(options = {}) {
|
|
|
2012
2123
|
setUploading(false);
|
|
2013
2124
|
}
|
|
2014
2125
|
}, [client]);
|
|
2015
|
-
const deleteFile =
|
|
2126
|
+
const deleteFile = useCallback19(async (mediaId) => {
|
|
2016
2127
|
await client.media.delete(mediaId);
|
|
2017
2128
|
setFiles((prev) => prev.filter((f) => f.id !== mediaId));
|
|
2018
2129
|
}, [client]);
|
|
@@ -2031,13 +2142,13 @@ function useMedia(options = {}) {
|
|
|
2031
2142
|
}
|
|
2032
2143
|
|
|
2033
2144
|
// src/hooks/useEntities.ts
|
|
2034
|
-
import { useState as useState19, useEffect as
|
|
2145
|
+
import { useState as useState19, useEffect as useEffect17, useCallback as useCallback20, useMemo as useMemo3 } from "react";
|
|
2035
2146
|
function useEntities() {
|
|
2036
2147
|
const client = useClient();
|
|
2037
2148
|
const [entities, setEntities] = useState19([]);
|
|
2038
2149
|
const [loading, setLoading] = useState19(true);
|
|
2039
2150
|
const [error, setError] = useState19(null);
|
|
2040
|
-
const fetchEntities =
|
|
2151
|
+
const fetchEntities = useCallback20(async () => {
|
|
2041
2152
|
setLoading(true);
|
|
2042
2153
|
setError(null);
|
|
2043
2154
|
try {
|
|
@@ -2049,7 +2160,7 @@ function useEntities() {
|
|
|
2049
2160
|
setLoading(false);
|
|
2050
2161
|
}
|
|
2051
2162
|
}, [client]);
|
|
2052
|
-
|
|
2163
|
+
useEffect17(() => {
|
|
2053
2164
|
fetchEntities();
|
|
2054
2165
|
}, [fetchEntities]);
|
|
2055
2166
|
return {
|
|
@@ -2064,7 +2175,7 @@ function useEntity(slug) {
|
|
|
2064
2175
|
const [entity, setEntity] = useState19(null);
|
|
2065
2176
|
const [loading, setLoading] = useState19(true);
|
|
2066
2177
|
const [error, setError] = useState19(null);
|
|
2067
|
-
const fetchEntity =
|
|
2178
|
+
const fetchEntity = useCallback20(async () => {
|
|
2068
2179
|
setLoading(true);
|
|
2069
2180
|
setError(null);
|
|
2070
2181
|
try {
|
|
@@ -2076,7 +2187,7 @@ function useEntity(slug) {
|
|
|
2076
2187
|
setLoading(false);
|
|
2077
2188
|
}
|
|
2078
2189
|
}, [client, slug]);
|
|
2079
|
-
|
|
2190
|
+
useEffect17(() => {
|
|
2080
2191
|
fetchEntity();
|
|
2081
2192
|
}, [fetchEntity]);
|
|
2082
2193
|
return {
|
|
@@ -2093,7 +2204,7 @@ function useEntityRecords(slug, params) {
|
|
|
2093
2204
|
const [loading, setLoading] = useState19(true);
|
|
2094
2205
|
const [error, setError] = useState19(null);
|
|
2095
2206
|
const [currentParams, setCurrentParams] = useState19(params);
|
|
2096
|
-
const fetchRecords =
|
|
2207
|
+
const fetchRecords = useCallback20(async (fetchParams, append = false) => {
|
|
2097
2208
|
setLoading(true);
|
|
2098
2209
|
setError(null);
|
|
2099
2210
|
try {
|
|
@@ -2110,30 +2221,30 @@ function useEntityRecords(slug, params) {
|
|
|
2110
2221
|
setLoading(false);
|
|
2111
2222
|
}
|
|
2112
2223
|
}, [client, slug]);
|
|
2113
|
-
|
|
2224
|
+
useEffect17(() => {
|
|
2114
2225
|
fetchRecords(params);
|
|
2115
2226
|
}, []);
|
|
2116
2227
|
const hasMore = meta ? meta.current_page < meta.last_page : false;
|
|
2117
|
-
const loadMore =
|
|
2228
|
+
const loadMore = useCallback20(async () => {
|
|
2118
2229
|
if (!hasMore || loading) return;
|
|
2119
2230
|
const nextPage = (meta?.current_page ?? 0) + 1;
|
|
2120
2231
|
await fetchRecords({ ...currentParams, page: nextPage }, true);
|
|
2121
2232
|
}, [hasMore, loading, meta, currentParams, fetchRecords]);
|
|
2122
|
-
const createRecord =
|
|
2233
|
+
const createRecord = useCallback20(async (data) => {
|
|
2123
2234
|
const record = await client.entities.createRecord(slug, data);
|
|
2124
2235
|
setRecords((prev) => [record, ...prev]);
|
|
2125
2236
|
return record;
|
|
2126
2237
|
}, [client, slug]);
|
|
2127
|
-
const updateRecord =
|
|
2238
|
+
const updateRecord = useCallback20(async (id, data) => {
|
|
2128
2239
|
const record = await client.entities.updateRecord(slug, id, data);
|
|
2129
2240
|
setRecords((prev) => prev.map((r) => r.id === id ? record : r));
|
|
2130
2241
|
return record;
|
|
2131
2242
|
}, [client, slug]);
|
|
2132
|
-
const deleteRecord =
|
|
2243
|
+
const deleteRecord = useCallback20(async (id) => {
|
|
2133
2244
|
await client.entities.deleteRecord(slug, id);
|
|
2134
2245
|
setRecords((prev) => prev.filter((r) => r.id !== id));
|
|
2135
2246
|
}, [client, slug]);
|
|
2136
|
-
const refresh =
|
|
2247
|
+
const refresh = useCallback20(async () => {
|
|
2137
2248
|
setCurrentParams(params);
|
|
2138
2249
|
await fetchRecords(params);
|
|
2139
2250
|
}, [params, fetchRecords]);
|
|
@@ -2155,7 +2266,7 @@ function useEntityRecord(slug, id) {
|
|
|
2155
2266
|
const [record, setRecord] = useState19(null);
|
|
2156
2267
|
const [loading, setLoading] = useState19(true);
|
|
2157
2268
|
const [error, setError] = useState19(null);
|
|
2158
|
-
const fetchRecord =
|
|
2269
|
+
const fetchRecord = useCallback20(async () => {
|
|
2159
2270
|
setLoading(true);
|
|
2160
2271
|
setError(null);
|
|
2161
2272
|
try {
|
|
@@ -2167,10 +2278,10 @@ function useEntityRecord(slug, id) {
|
|
|
2167
2278
|
setLoading(false);
|
|
2168
2279
|
}
|
|
2169
2280
|
}, [client, slug, id]);
|
|
2170
|
-
|
|
2281
|
+
useEffect17(() => {
|
|
2171
2282
|
fetchRecord();
|
|
2172
2283
|
}, [fetchRecord]);
|
|
2173
|
-
const update =
|
|
2284
|
+
const update = useCallback20(async (data) => {
|
|
2174
2285
|
const updated = await client.entities.updateRecord(slug, id, data);
|
|
2175
2286
|
setRecord(updated);
|
|
2176
2287
|
return updated;
|
|
@@ -2185,7 +2296,7 @@ function useEntityRecord(slug, id) {
|
|
|
2185
2296
|
}
|
|
2186
2297
|
function useTypedEntity(slug) {
|
|
2187
2298
|
const client = useClient();
|
|
2188
|
-
return
|
|
2299
|
+
return useMemo3(() => ({
|
|
2189
2300
|
useRecords: (params) => {
|
|
2190
2301
|
const result = useEntityRecords(slug, params);
|
|
2191
2302
|
return {
|
|
@@ -2238,6 +2349,7 @@ export {
|
|
|
2238
2349
|
useCreateReservation,
|
|
2239
2350
|
useCreateReview,
|
|
2240
2351
|
useCreateSubscription,
|
|
2352
|
+
useCurrency,
|
|
2241
2353
|
useDiffsome,
|
|
2242
2354
|
useDigitalProducts,
|
|
2243
2355
|
useDownloads,
|
|
@@ -2262,6 +2374,7 @@ export {
|
|
|
2262
2374
|
useReservationServices,
|
|
2263
2375
|
useReservationSettings,
|
|
2264
2376
|
useReservationStaffs,
|
|
2377
|
+
useSite,
|
|
2265
2378
|
useSocialAuth,
|
|
2266
2379
|
useStripePayment,
|
|
2267
2380
|
useSubscription,
|