@diffsome/react 1.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.
package/dist/index.js ADDED
@@ -0,0 +1,2340 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ DiffsomeContext: () => DiffsomeContext,
24
+ DiffsomeProvider: () => DiffsomeProvider,
25
+ useAuth: () => useAuth,
26
+ useAvailableSlots: () => useAvailableSlots,
27
+ useBlog: () => useBlog,
28
+ useBlogCategories: () => useBlogCategories,
29
+ useBlogPost: () => useBlogPost,
30
+ useBlogSearch: () => useBlogSearch,
31
+ useBlogTags: () => useBlogTags,
32
+ useBoard: () => useBoard,
33
+ useBoardPost: () => useBoardPost,
34
+ useBoardPosts: () => useBoardPosts,
35
+ useBoards: () => useBoards,
36
+ useBundleItems: () => useBundleItems,
37
+ useBundleProducts: () => useBundleProducts,
38
+ useCanReview: () => useCanReview,
39
+ useCart: () => useCart,
40
+ useCategories: () => useCategories,
41
+ useClient: () => useClient,
42
+ useComments: () => useComments,
43
+ useCoupons: () => useCoupons,
44
+ useCreateBoardPost: () => useCreateBoardPost,
45
+ useCreateOrder: () => useCreateOrder,
46
+ useCreateReservation: () => useCreateReservation,
47
+ useCreateReview: () => useCreateReview,
48
+ useCreateSubscription: () => useCreateSubscription,
49
+ useDiffsome: () => useDiffsome,
50
+ useDigitalProducts: () => useDigitalProducts,
51
+ useDownloads: () => useDownloads,
52
+ useEntities: () => useEntities,
53
+ useEntity: () => useEntity,
54
+ useEntityRecord: () => useEntityRecord,
55
+ useEntityRecords: () => useEntityRecords,
56
+ useFeaturedBlog: () => useFeaturedBlog,
57
+ useFeaturedProducts: () => useFeaturedProducts,
58
+ useForm: () => useForm,
59
+ useMedia: () => useMedia,
60
+ useMyReservations: () => useMyReservations,
61
+ useMyReviews: () => useMyReviews,
62
+ useOrder: () => useOrder,
63
+ useOrderDownloads: () => useOrderDownloads,
64
+ useOrders: () => useOrders,
65
+ usePaymentStatus: () => usePaymentStatus,
66
+ useProduct: () => useProduct,
67
+ useProductReviews: () => useProductReviews,
68
+ useProducts: () => useProducts,
69
+ useProductsByType: () => useProductsByType,
70
+ useReservationServices: () => useReservationServices,
71
+ useReservationSettings: () => useReservationSettings,
72
+ useReservationStaffs: () => useReservationStaffs,
73
+ useSocialAuth: () => useSocialAuth,
74
+ useStripePayment: () => useStripePayment,
75
+ useSubscription: () => useSubscription,
76
+ useSubscriptionProducts: () => useSubscriptionProducts,
77
+ useSubscriptions: () => useSubscriptions,
78
+ useTossPayment: () => useTossPayment,
79
+ useTypedEntity: () => useTypedEntity,
80
+ useValidateCoupon: () => useValidateCoupon,
81
+ useWishlist: () => useWishlist
82
+ });
83
+ module.exports = __toCommonJS(index_exports);
84
+
85
+ // src/context/DiffsomeContext.tsx
86
+ var import_react = require("react");
87
+ var import_sdk = require("@diffsome/sdk");
88
+ var import_jsx_runtime = require("react/jsx-runtime");
89
+ var DiffsomeContext = (0, import_react.createContext)(null);
90
+ function DiffsomeProvider({ children, config }) {
91
+ const [isReady, setIsReady] = (0, import_react.useState)(false);
92
+ const client = (0, import_react.useMemo)(() => {
93
+ return new import_sdk.Diffsome({
94
+ ...config,
95
+ persistToken: config.persistToken ?? true,
96
+ storageType: config.storageType ?? "localStorage"
97
+ });
98
+ }, [config.tenantId, config.baseUrl, config.apiKey]);
99
+ (0, import_react.useEffect)(() => {
100
+ setIsReady(true);
101
+ }, []);
102
+ const value = (0, import_react.useMemo)(() => ({
103
+ client,
104
+ isReady
105
+ }), [client, isReady]);
106
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DiffsomeContext.Provider, { value, children });
107
+ }
108
+ function useDiffsome() {
109
+ const context = (0, import_react.useContext)(DiffsomeContext);
110
+ if (!context) {
111
+ throw new Error("useDiffsome must be used within DiffsomeProvider");
112
+ }
113
+ return context;
114
+ }
115
+ function useClient() {
116
+ const { client } = useDiffsome();
117
+ return client;
118
+ }
119
+
120
+ // src/hooks/useAuth.ts
121
+ var import_react2 = require("react");
122
+ function useAuth() {
123
+ const client = useClient();
124
+ const [user, setUser] = (0, import_react2.useState)(null);
125
+ const [loading, setLoading] = (0, import_react2.useState)(true);
126
+ const [error, setError] = (0, import_react2.useState)(null);
127
+ const isAuthenticated = !!user && client.isAuthenticated();
128
+ const fetchProfile = (0, import_react2.useCallback)(async () => {
129
+ if (!client.isAuthenticated()) {
130
+ setUser(null);
131
+ setLoading(false);
132
+ return;
133
+ }
134
+ try {
135
+ const profile = await client.auth.me();
136
+ setUser(profile);
137
+ setError(null);
138
+ } catch (err) {
139
+ setUser(null);
140
+ setError(err instanceof Error ? err : new Error("Failed to fetch profile"));
141
+ } finally {
142
+ setLoading(false);
143
+ }
144
+ }, [client]);
145
+ (0, import_react2.useEffect)(() => {
146
+ fetchProfile();
147
+ }, [fetchProfile]);
148
+ const login = (0, import_react2.useCallback)(async (credentials) => {
149
+ setLoading(true);
150
+ setError(null);
151
+ try {
152
+ const response = await client.auth.login(credentials);
153
+ setUser(response.user);
154
+ return response;
155
+ } catch (err) {
156
+ const error2 = err instanceof Error ? err : new Error("Login failed");
157
+ setError(error2);
158
+ throw error2;
159
+ } finally {
160
+ setLoading(false);
161
+ }
162
+ }, [client]);
163
+ const register = (0, import_react2.useCallback)(async (data) => {
164
+ setLoading(true);
165
+ setError(null);
166
+ try {
167
+ const response = await client.auth.register(data);
168
+ setUser(response.user);
169
+ return response;
170
+ } catch (err) {
171
+ const error2 = err instanceof Error ? err : new Error("Registration failed");
172
+ setError(error2);
173
+ throw error2;
174
+ } finally {
175
+ setLoading(false);
176
+ }
177
+ }, [client]);
178
+ const logout = (0, import_react2.useCallback)(async () => {
179
+ setLoading(true);
180
+ try {
181
+ await client.auth.logout();
182
+ } finally {
183
+ setUser(null);
184
+ setLoading(false);
185
+ }
186
+ }, [client]);
187
+ const getProfile = (0, import_react2.useCallback)(async () => {
188
+ const profile = await client.auth.me();
189
+ setUser(profile);
190
+ return profile;
191
+ }, [client]);
192
+ const updateProfile = (0, import_react2.useCallback)(async (data) => {
193
+ const profile = await client.auth.updateProfile(data);
194
+ setUser(profile);
195
+ return profile;
196
+ }, [client]);
197
+ const forgotPassword = (0, import_react2.useCallback)(async (email) => {
198
+ return await client.auth.forgotPassword({ email });
199
+ }, [client]);
200
+ const resetPassword = (0, import_react2.useCallback)(async (data) => {
201
+ return await client.auth.resetPassword(data);
202
+ }, [client]);
203
+ const refresh = (0, import_react2.useCallback)(async () => {
204
+ await fetchProfile();
205
+ }, [fetchProfile]);
206
+ return {
207
+ user,
208
+ isAuthenticated,
209
+ loading,
210
+ error,
211
+ login,
212
+ register,
213
+ logout,
214
+ getProfile,
215
+ updateProfile,
216
+ forgotPassword,
217
+ resetPassword,
218
+ refresh
219
+ };
220
+ }
221
+
222
+ // src/hooks/useSocialAuth.ts
223
+ var import_react3 = require("react");
224
+ function useSocialAuth() {
225
+ const client = useClient();
226
+ const [providers, setProviders] = (0, import_react3.useState)([]);
227
+ const [loading, setLoading] = (0, import_react3.useState)(true);
228
+ const [error, setError] = (0, import_react3.useState)(null);
229
+ const fetchProviders = (0, import_react3.useCallback)(async () => {
230
+ setLoading(true);
231
+ setError(null);
232
+ try {
233
+ const data = await client.auth.getSocialProviders();
234
+ setProviders(data);
235
+ } catch (err) {
236
+ setError(err instanceof Error ? err : new Error("Failed to fetch providers"));
237
+ } finally {
238
+ setLoading(false);
239
+ }
240
+ }, [client]);
241
+ (0, import_react3.useEffect)(() => {
242
+ fetchProviders();
243
+ }, [fetchProviders]);
244
+ const getAuthUrl = (0, import_react3.useCallback)(async (provider) => {
245
+ const result = await client.auth.getSocialAuthUrl(provider);
246
+ return result.url;
247
+ }, [client]);
248
+ const handleCallback = (0, import_react3.useCallback)(async (provider, code) => {
249
+ return await client.auth.socialCallback(provider, code);
250
+ }, [client]);
251
+ return {
252
+ providers,
253
+ loading,
254
+ error,
255
+ getAuthUrl,
256
+ handleCallback,
257
+ refresh: fetchProviders
258
+ };
259
+ }
260
+
261
+ // src/hooks/useCart.ts
262
+ var import_react4 = require("react");
263
+ function useCart() {
264
+ const client = useClient();
265
+ const [cart, setCart] = (0, import_react4.useState)(null);
266
+ const [loading, setLoading] = (0, import_react4.useState)(true);
267
+ const [error, setError] = (0, import_react4.useState)(null);
268
+ const fetchCart = (0, import_react4.useCallback)(async () => {
269
+ try {
270
+ const cartData = await client.shop.getCart();
271
+ setCart(cartData);
272
+ setError(null);
273
+ } catch (err) {
274
+ setCart(null);
275
+ setError(err instanceof Error ? err : new Error("Failed to fetch cart"));
276
+ } finally {
277
+ setLoading(false);
278
+ }
279
+ }, [client]);
280
+ (0, import_react4.useEffect)(() => {
281
+ fetchCart();
282
+ }, [fetchCart]);
283
+ const addToCart = (0, import_react4.useCallback)(async (productId, quantity = 1, variantId, options) => {
284
+ const data = {
285
+ product_id: productId,
286
+ quantity,
287
+ variant_id: variantId,
288
+ options
289
+ };
290
+ const updatedCart = await client.shop.addToCart(data);
291
+ setCart(updatedCart);
292
+ return updatedCart;
293
+ }, [client]);
294
+ const updateItem = (0, import_react4.useCallback)(async (itemId, quantity) => {
295
+ const updatedCart = await client.shop.updateCartItem(itemId, { quantity });
296
+ setCart(updatedCart);
297
+ return updatedCart;
298
+ }, [client]);
299
+ const removeItem = (0, import_react4.useCallback)(async (itemId) => {
300
+ const updatedCart = await client.shop.removeFromCart(itemId);
301
+ setCart(updatedCart);
302
+ return updatedCart;
303
+ }, [client]);
304
+ const clearCart = (0, import_react4.useCallback)(async () => {
305
+ await client.shop.clearCart();
306
+ setCart(null);
307
+ }, [client]);
308
+ const refresh = (0, import_react4.useCallback)(async () => {
309
+ setLoading(true);
310
+ await fetchCart();
311
+ }, [fetchCart]);
312
+ const isInCart = (0, import_react4.useCallback)((productId, variantId) => {
313
+ if (!cart?.items) return false;
314
+ return cart.items.some(
315
+ (item) => item.product_id === productId && (variantId === void 0 || item.variant_id === variantId)
316
+ );
317
+ }, [cart]);
318
+ const getItemQuantity = (0, import_react4.useCallback)((productId, variantId) => {
319
+ if (!cart?.items) return 0;
320
+ const item = cart.items.find(
321
+ (item2) => item2.product_id === productId && (variantId === void 0 || item2.variant_id === variantId)
322
+ );
323
+ return item?.quantity ?? 0;
324
+ }, [cart]);
325
+ return {
326
+ cart,
327
+ items: cart?.items ?? [],
328
+ itemCount: cart?.item_count ?? 0,
329
+ totalQuantity: cart?.total_quantity ?? 0,
330
+ subtotal: cart?.subtotal ?? 0,
331
+ shippingFee: cart?.shipping_fee ?? 0,
332
+ total: cart?.total ?? 0,
333
+ loading,
334
+ error,
335
+ addToCart,
336
+ updateItem,
337
+ removeItem,
338
+ clearCart,
339
+ refresh,
340
+ isInCart,
341
+ getItemQuantity
342
+ };
343
+ }
344
+
345
+ // src/hooks/useWishlist.ts
346
+ var import_react5 = require("react");
347
+ function useWishlist() {
348
+ const client = useClient();
349
+ const [items, setItems] = (0, import_react5.useState)([]);
350
+ const [loading, setLoading] = (0, import_react5.useState)(true);
351
+ const [error, setError] = (0, import_react5.useState)(null);
352
+ const [wishlistMap, setWishlistMap] = (0, import_react5.useState)({});
353
+ const fetchWishlist = (0, import_react5.useCallback)(async () => {
354
+ if (!client.isAuthenticated()) {
355
+ setItems([]);
356
+ setWishlistMap({});
357
+ setLoading(false);
358
+ return;
359
+ }
360
+ try {
361
+ const response = await client.shop.getWishlist({ per_page: 100 });
362
+ setItems(response.data);
363
+ const map = {};
364
+ response.data.forEach((item) => {
365
+ const key = item.variant_id ? `${item.product_id}_${item.variant_id}` : String(item.product_id);
366
+ map[key] = true;
367
+ });
368
+ setWishlistMap(map);
369
+ setError(null);
370
+ } catch (err) {
371
+ setItems([]);
372
+ setWishlistMap({});
373
+ setError(err instanceof Error ? err : new Error("Failed to fetch wishlist"));
374
+ } finally {
375
+ setLoading(false);
376
+ }
377
+ }, [client]);
378
+ (0, import_react5.useEffect)(() => {
379
+ fetchWishlist();
380
+ }, [fetchWishlist]);
381
+ const isInWishlist = (0, import_react5.useCallback)((productId, variantId) => {
382
+ const key = variantId ? `${productId}_${variantId}` : String(productId);
383
+ return wishlistMap[key] || false;
384
+ }, [wishlistMap]);
385
+ const toggleWishlist = (0, import_react5.useCallback)(async (productId, variantId) => {
386
+ const result = await client.shop.toggleWishlist(productId, variantId);
387
+ const key = variantId ? `${productId}_${variantId}` : String(productId);
388
+ setWishlistMap((prev) => ({
389
+ ...prev,
390
+ [key]: result.in_wishlist
391
+ }));
392
+ if (result.action === "added") {
393
+ await fetchWishlist();
394
+ } else {
395
+ setItems((prev) => prev.filter(
396
+ (item) => !(item.product_id === productId && item.variant_id === variantId)
397
+ ));
398
+ }
399
+ return result;
400
+ }, [client, fetchWishlist]);
401
+ const addToWishlist = (0, import_react5.useCallback)(async (productId, variantId, note) => {
402
+ const item = await client.shop.addToWishlist({
403
+ product_id: productId,
404
+ variant_id: variantId,
405
+ note
406
+ });
407
+ await fetchWishlist();
408
+ return item;
409
+ }, [client, fetchWishlist]);
410
+ const removeFromWishlist = (0, import_react5.useCallback)(async (wishlistId) => {
411
+ const item = items.find((i) => i.id === wishlistId);
412
+ await client.shop.removeFromWishlist(wishlistId);
413
+ if (item) {
414
+ const key = item.variant_id ? `${item.product_id}_${item.variant_id}` : String(item.product_id);
415
+ setWishlistMap((prev) => {
416
+ const next = { ...prev };
417
+ delete next[key];
418
+ return next;
419
+ });
420
+ }
421
+ setItems((prev) => prev.filter((i) => i.id !== wishlistId));
422
+ }, [client, items]);
423
+ const moveToCart = (0, import_react5.useCallback)(async (wishlistIds) => {
424
+ const result = await client.shop.moveWishlistToCart(wishlistIds);
425
+ await fetchWishlist();
426
+ return result;
427
+ }, [client, fetchWishlist]);
428
+ const updateNote = (0, import_react5.useCallback)(async (wishlistId, note) => {
429
+ const item = await client.shop.updateWishlistNote(wishlistId, note);
430
+ setItems((prev) => prev.map((i) => i.id === wishlistId ? item : i));
431
+ return item;
432
+ }, [client]);
433
+ const getProductWishlistCount = (0, import_react5.useCallback)(async (productSlug) => {
434
+ return await client.shop.getProductWishlistCount(productSlug);
435
+ }, [client]);
436
+ const refresh = (0, import_react5.useCallback)(async () => {
437
+ setLoading(true);
438
+ await fetchWishlist();
439
+ }, [fetchWishlist]);
440
+ return {
441
+ items,
442
+ count: items.length,
443
+ loading,
444
+ error,
445
+ isInWishlist,
446
+ toggleWishlist,
447
+ addToWishlist,
448
+ removeFromWishlist,
449
+ moveToCart,
450
+ updateNote,
451
+ getProductWishlistCount,
452
+ refresh
453
+ };
454
+ }
455
+
456
+ // src/hooks/useProducts.ts
457
+ var import_react6 = require("react");
458
+ function useProducts(options = {}) {
459
+ const { autoFetch = true, ...params } = options;
460
+ const client = useClient();
461
+ const [products, setProducts] = (0, import_react6.useState)([]);
462
+ const [meta, setMeta] = (0, import_react6.useState)(null);
463
+ const [loading, setLoading] = (0, import_react6.useState)(autoFetch);
464
+ const [error, setError] = (0, import_react6.useState)(null);
465
+ const [currentParams, setCurrentParams] = (0, import_react6.useState)(params);
466
+ const fetchProducts = (0, import_react6.useCallback)(async (fetchParams, append = false) => {
467
+ setLoading(true);
468
+ setError(null);
469
+ try {
470
+ const response = await client.shop.listProducts(fetchParams);
471
+ if (append) {
472
+ setProducts((prev) => [...prev, ...response.data]);
473
+ } else {
474
+ setProducts(response.data);
475
+ }
476
+ setMeta(response.meta);
477
+ } catch (err) {
478
+ setError(err instanceof Error ? err : new Error("Failed to fetch products"));
479
+ } finally {
480
+ setLoading(false);
481
+ }
482
+ }, [client]);
483
+ (0, import_react6.useEffect)(() => {
484
+ if (autoFetch) {
485
+ fetchProducts(params);
486
+ }
487
+ }, []);
488
+ const hasMore = meta ? meta.current_page < meta.last_page : false;
489
+ const loadMore = (0, import_react6.useCallback)(async () => {
490
+ if (!hasMore || loading) return;
491
+ const nextPage = (meta?.current_page ?? 0) + 1;
492
+ await fetchProducts({ ...currentParams, page: nextPage }, true);
493
+ }, [hasMore, loading, meta, currentParams, fetchProducts]);
494
+ const refresh = (0, import_react6.useCallback)(async () => {
495
+ setCurrentParams(params);
496
+ await fetchProducts(params);
497
+ }, [params, fetchProducts]);
498
+ const search = (0, import_react6.useCallback)(async (query) => {
499
+ const searchParams = { ...params, search: query, page: 1 };
500
+ setCurrentParams(searchParams);
501
+ await fetchProducts(searchParams);
502
+ }, [params, fetchProducts]);
503
+ return {
504
+ products,
505
+ meta,
506
+ loading,
507
+ error,
508
+ hasMore,
509
+ loadMore,
510
+ refresh,
511
+ search
512
+ };
513
+ }
514
+ function useProduct(idOrSlug) {
515
+ const client = useClient();
516
+ const [product, setProduct] = (0, import_react6.useState)(null);
517
+ const [loading, setLoading] = (0, import_react6.useState)(true);
518
+ const [error, setError] = (0, import_react6.useState)(null);
519
+ const fetchProduct = (0, import_react6.useCallback)(async () => {
520
+ setLoading(true);
521
+ setError(null);
522
+ try {
523
+ const data = await client.shop.getProduct(idOrSlug);
524
+ setProduct(data);
525
+ } catch (err) {
526
+ setError(err instanceof Error ? err : new Error("Failed to fetch product"));
527
+ } finally {
528
+ setLoading(false);
529
+ }
530
+ }, [client, idOrSlug]);
531
+ (0, import_react6.useEffect)(() => {
532
+ fetchProduct();
533
+ }, [fetchProduct]);
534
+ return {
535
+ product,
536
+ loading,
537
+ error,
538
+ refresh: fetchProduct
539
+ };
540
+ }
541
+ function useCategories() {
542
+ const client = useClient();
543
+ const [categories, setCategories] = (0, import_react6.useState)([]);
544
+ const [loading, setLoading] = (0, import_react6.useState)(true);
545
+ const [error, setError] = (0, import_react6.useState)(null);
546
+ const fetchCategories = (0, import_react6.useCallback)(async () => {
547
+ setLoading(true);
548
+ setError(null);
549
+ try {
550
+ const response = await client.shop.listCategories();
551
+ setCategories(response.data);
552
+ } catch (err) {
553
+ setError(err instanceof Error ? err : new Error("Failed to fetch categories"));
554
+ } finally {
555
+ setLoading(false);
556
+ }
557
+ }, [client]);
558
+ (0, import_react6.useEffect)(() => {
559
+ fetchCategories();
560
+ }, [fetchCategories]);
561
+ return {
562
+ categories,
563
+ loading,
564
+ error,
565
+ refresh: fetchCategories
566
+ };
567
+ }
568
+ function useFeaturedProducts(limit = 8) {
569
+ const client = useClient();
570
+ const [products, setProducts] = (0, import_react6.useState)([]);
571
+ const [loading, setLoading] = (0, import_react6.useState)(true);
572
+ const [error, setError] = (0, import_react6.useState)(null);
573
+ const fetchProducts = (0, import_react6.useCallback)(async () => {
574
+ setLoading(true);
575
+ setError(null);
576
+ try {
577
+ const data = await client.shop.featuredProducts(limit);
578
+ setProducts(data);
579
+ } catch (err) {
580
+ setError(err instanceof Error ? err : new Error("Failed to fetch featured products"));
581
+ } finally {
582
+ setLoading(false);
583
+ }
584
+ }, [client, limit]);
585
+ (0, import_react6.useEffect)(() => {
586
+ fetchProducts();
587
+ }, [fetchProducts]);
588
+ return {
589
+ products,
590
+ loading,
591
+ error,
592
+ refresh: fetchProducts
593
+ };
594
+ }
595
+ function useProductsByType(type, params) {
596
+ const client = useClient();
597
+ const [products, setProducts] = (0, import_react6.useState)([]);
598
+ const [meta, setMeta] = (0, import_react6.useState)(null);
599
+ const [loading, setLoading] = (0, import_react6.useState)(true);
600
+ const [error, setError] = (0, import_react6.useState)(null);
601
+ const fetchProducts = (0, import_react6.useCallback)(async () => {
602
+ setLoading(true);
603
+ setError(null);
604
+ try {
605
+ const response = await client.shop.listProductsByType(type, params);
606
+ setProducts(response.data);
607
+ setMeta(response.meta);
608
+ } catch (err) {
609
+ setError(err instanceof Error ? err : new Error("Failed to fetch products"));
610
+ } finally {
611
+ setLoading(false);
612
+ }
613
+ }, [client, type, params]);
614
+ (0, import_react6.useEffect)(() => {
615
+ fetchProducts();
616
+ }, [fetchProducts]);
617
+ return {
618
+ products,
619
+ meta,
620
+ loading,
621
+ error,
622
+ refresh: fetchProducts
623
+ };
624
+ }
625
+ function useDigitalProducts(params) {
626
+ return useProductsByType("digital", params);
627
+ }
628
+ function useSubscriptionProducts(params) {
629
+ return useProductsByType("subscription", params);
630
+ }
631
+ function useBundleProducts(params) {
632
+ return useProductsByType("bundle", params);
633
+ }
634
+ function useBundleItems(productSlug) {
635
+ const client = useClient();
636
+ const [bundle, setBundle] = (0, import_react6.useState)(null);
637
+ const [loading, setLoading] = (0, import_react6.useState)(true);
638
+ const [error, setError] = (0, import_react6.useState)(null);
639
+ const fetchBundle = (0, import_react6.useCallback)(async () => {
640
+ setLoading(true);
641
+ setError(null);
642
+ try {
643
+ const data = await client.shop.getBundleItems(productSlug);
644
+ setBundle(data);
645
+ } catch (err) {
646
+ setError(err instanceof Error ? err : new Error("Failed to fetch bundle items"));
647
+ } finally {
648
+ setLoading(false);
649
+ }
650
+ }, [client, productSlug]);
651
+ (0, import_react6.useEffect)(() => {
652
+ fetchBundle();
653
+ }, [fetchBundle]);
654
+ return {
655
+ bundle,
656
+ loading,
657
+ error,
658
+ refresh: fetchBundle
659
+ };
660
+ }
661
+
662
+ // src/hooks/useOrders.ts
663
+ var import_react7 = require("react");
664
+ function useOrders(params) {
665
+ const client = useClient();
666
+ const [orders, setOrders] = (0, import_react7.useState)([]);
667
+ const [meta, setMeta] = (0, import_react7.useState)(null);
668
+ const [loading, setLoading] = (0, import_react7.useState)(true);
669
+ const [error, setError] = (0, import_react7.useState)(null);
670
+ const fetchOrders = (0, import_react7.useCallback)(async (fetchParams, append = false) => {
671
+ if (!client.isAuthenticated()) {
672
+ setOrders([]);
673
+ setLoading(false);
674
+ return;
675
+ }
676
+ setLoading(true);
677
+ setError(null);
678
+ try {
679
+ const response = await client.shop.listOrders(fetchParams);
680
+ if (append) {
681
+ setOrders((prev) => [...prev, ...response.data]);
682
+ } else {
683
+ setOrders(response.data);
684
+ }
685
+ setMeta(response.meta);
686
+ } catch (err) {
687
+ setError(err instanceof Error ? err : new Error("Failed to fetch orders"));
688
+ } finally {
689
+ setLoading(false);
690
+ }
691
+ }, [client]);
692
+ (0, import_react7.useEffect)(() => {
693
+ fetchOrders(params);
694
+ }, []);
695
+ const hasMore = meta ? meta.current_page < meta.last_page : false;
696
+ const loadMore = (0, import_react7.useCallback)(async () => {
697
+ if (!hasMore || loading) return;
698
+ const nextPage = (meta?.current_page ?? 0) + 1;
699
+ await fetchOrders({ ...params, page: nextPage }, true);
700
+ }, [hasMore, loading, meta, params, fetchOrders]);
701
+ const refresh = (0, import_react7.useCallback)(async () => {
702
+ await fetchOrders(params);
703
+ }, [params, fetchOrders]);
704
+ return {
705
+ orders,
706
+ meta,
707
+ loading,
708
+ error,
709
+ hasMore,
710
+ loadMore,
711
+ refresh
712
+ };
713
+ }
714
+ function useOrder(idOrNumber) {
715
+ const client = useClient();
716
+ const [order, setOrder] = (0, import_react7.useState)(null);
717
+ const [loading, setLoading] = (0, import_react7.useState)(true);
718
+ const [error, setError] = (0, import_react7.useState)(null);
719
+ const fetchOrder = (0, import_react7.useCallback)(async () => {
720
+ setLoading(true);
721
+ setError(null);
722
+ try {
723
+ const data = await client.shop.getOrder(idOrNumber);
724
+ setOrder(data);
725
+ } catch (err) {
726
+ setError(err instanceof Error ? err : new Error("Failed to fetch order"));
727
+ } finally {
728
+ setLoading(false);
729
+ }
730
+ }, [client, idOrNumber]);
731
+ (0, import_react7.useEffect)(() => {
732
+ fetchOrder();
733
+ }, [fetchOrder]);
734
+ const cancel = (0, import_react7.useCallback)(async () => {
735
+ if (!order) throw new Error("Order not loaded");
736
+ const cancelled = await client.shop.cancelOrder(order.id);
737
+ setOrder(cancelled);
738
+ return cancelled;
739
+ }, [client, order]);
740
+ return {
741
+ order,
742
+ loading,
743
+ error,
744
+ cancel,
745
+ refresh: fetchOrder
746
+ };
747
+ }
748
+ function useCreateOrder() {
749
+ const client = useClient();
750
+ const [loading, setLoading] = (0, import_react7.useState)(false);
751
+ const [error, setError] = (0, import_react7.useState)(null);
752
+ const createOrder = (0, import_react7.useCallback)(async (data) => {
753
+ setLoading(true);
754
+ setError(null);
755
+ try {
756
+ return await client.shop.createOrder(data);
757
+ } catch (err) {
758
+ const error2 = err instanceof Error ? err : new Error("Failed to create order");
759
+ setError(error2);
760
+ throw error2;
761
+ } finally {
762
+ setLoading(false);
763
+ }
764
+ }, [client]);
765
+ return {
766
+ createOrder,
767
+ loading,
768
+ error
769
+ };
770
+ }
771
+
772
+ // src/hooks/usePayment.ts
773
+ var import_react8 = require("react");
774
+ function usePaymentStatus() {
775
+ const client = useClient();
776
+ const [status, setStatus] = (0, import_react8.useState)(null);
777
+ const [loading, setLoading] = (0, import_react8.useState)(true);
778
+ const [error, setError] = (0, import_react8.useState)(null);
779
+ const fetchStatus = (0, import_react8.useCallback)(async () => {
780
+ setLoading(true);
781
+ setError(null);
782
+ try {
783
+ const data = await client.shop.getPaymentStatus();
784
+ setStatus(data);
785
+ } catch (err) {
786
+ setError(err instanceof Error ? err : new Error("Failed to fetch payment status"));
787
+ } finally {
788
+ setLoading(false);
789
+ }
790
+ }, [client]);
791
+ return {
792
+ status,
793
+ loading,
794
+ error,
795
+ refresh: fetchStatus,
796
+ isTossAvailable: status?.toss?.available ?? false,
797
+ isStripeAvailable: status?.stripe?.available ?? false,
798
+ stripePublishableKey: status?.stripe?.publishable_key ?? null
799
+ };
800
+ }
801
+ function useTossPayment() {
802
+ const client = useClient();
803
+ const [loading, setLoading] = (0, import_react8.useState)(false);
804
+ const [error, setError] = (0, import_react8.useState)(null);
805
+ const preparePayment = (0, import_react8.useCallback)(async (orderNumber, successUrl, failUrl) => {
806
+ setLoading(true);
807
+ setError(null);
808
+ try {
809
+ return await client.shop.tossPaymentReady({
810
+ order_number: orderNumber,
811
+ success_url: successUrl,
812
+ fail_url: failUrl
813
+ });
814
+ } catch (err) {
815
+ const error2 = err instanceof Error ? err : new Error("Failed to prepare payment");
816
+ setError(error2);
817
+ throw error2;
818
+ } finally {
819
+ setLoading(false);
820
+ }
821
+ }, [client]);
822
+ const confirmPayment = (0, import_react8.useCallback)(async (paymentKey, orderId, amount) => {
823
+ setLoading(true);
824
+ setError(null);
825
+ try {
826
+ return await client.shop.tossPaymentConfirm({
827
+ payment_key: paymentKey,
828
+ order_id: orderId,
829
+ amount
830
+ });
831
+ } catch (err) {
832
+ const error2 = err instanceof Error ? err : new Error("Failed to confirm payment");
833
+ setError(error2);
834
+ throw error2;
835
+ } finally {
836
+ setLoading(false);
837
+ }
838
+ }, [client]);
839
+ const cancelPayment = (0, import_react8.useCallback)(async (orderNumber, reason, amount) => {
840
+ setLoading(true);
841
+ setError(null);
842
+ try {
843
+ await client.shop.tossPaymentCancel(orderNumber, reason, amount);
844
+ } catch (err) {
845
+ const error2 = err instanceof Error ? err : new Error("Failed to cancel payment");
846
+ setError(error2);
847
+ throw error2;
848
+ } finally {
849
+ setLoading(false);
850
+ }
851
+ }, [client]);
852
+ return {
853
+ preparePayment,
854
+ confirmPayment,
855
+ cancelPayment,
856
+ loading,
857
+ error
858
+ };
859
+ }
860
+ function useStripePayment() {
861
+ const client = useClient();
862
+ const [loading, setLoading] = (0, import_react8.useState)(false);
863
+ const [error, setError] = (0, import_react8.useState)(null);
864
+ const createCheckout = (0, import_react8.useCallback)(async (orderNumber, successUrl, cancelUrl) => {
865
+ setLoading(true);
866
+ setError(null);
867
+ try {
868
+ return await client.shop.stripeCheckout({
869
+ order_number: orderNumber,
870
+ success_url: successUrl,
871
+ cancel_url: cancelUrl
872
+ });
873
+ } catch (err) {
874
+ const error2 = err instanceof Error ? err : new Error("Failed to create checkout");
875
+ setError(error2);
876
+ throw error2;
877
+ } finally {
878
+ setLoading(false);
879
+ }
880
+ }, [client]);
881
+ const verifyPayment = (0, import_react8.useCallback)(async (sessionId) => {
882
+ setLoading(true);
883
+ setError(null);
884
+ try {
885
+ return await client.shop.stripeVerify({ session_id: sessionId });
886
+ } catch (err) {
887
+ const error2 = err instanceof Error ? err : new Error("Failed to verify payment");
888
+ setError(error2);
889
+ throw error2;
890
+ } finally {
891
+ setLoading(false);
892
+ }
893
+ }, [client]);
894
+ const refund = (0, import_react8.useCallback)(async (orderNumber, reason, amount) => {
895
+ setLoading(true);
896
+ setError(null);
897
+ try {
898
+ await client.shop.stripeRefund(orderNumber, reason, amount);
899
+ } catch (err) {
900
+ const error2 = err instanceof Error ? err : new Error("Failed to refund");
901
+ setError(error2);
902
+ throw error2;
903
+ } finally {
904
+ setLoading(false);
905
+ }
906
+ }, [client]);
907
+ return {
908
+ createCheckout,
909
+ verifyPayment,
910
+ refund,
911
+ loading,
912
+ error
913
+ };
914
+ }
915
+
916
+ // src/hooks/useCoupons.ts
917
+ var import_react9 = require("react");
918
+ function useCoupons() {
919
+ const client = useClient();
920
+ const [coupons, setCoupons] = (0, import_react9.useState)([]);
921
+ const [loading, setLoading] = (0, import_react9.useState)(true);
922
+ const [error, setError] = (0, import_react9.useState)(null);
923
+ const fetchCoupons = (0, import_react9.useCallback)(async () => {
924
+ if (!client.isAuthenticated()) {
925
+ setCoupons([]);
926
+ setLoading(false);
927
+ return;
928
+ }
929
+ setLoading(true);
930
+ setError(null);
931
+ try {
932
+ const data = await client.shop.myCoupons();
933
+ setCoupons(data);
934
+ } catch (err) {
935
+ setError(err instanceof Error ? err : new Error("Failed to fetch coupons"));
936
+ } finally {
937
+ setLoading(false);
938
+ }
939
+ }, [client]);
940
+ (0, import_react9.useEffect)(() => {
941
+ fetchCoupons();
942
+ }, [fetchCoupons]);
943
+ return {
944
+ coupons,
945
+ loading,
946
+ error,
947
+ refresh: fetchCoupons
948
+ };
949
+ }
950
+ function useValidateCoupon() {
951
+ const client = useClient();
952
+ const [validation, setValidation] = (0, import_react9.useState)(null);
953
+ const [loading, setLoading] = (0, import_react9.useState)(false);
954
+ const [error, setError] = (0, import_react9.useState)(null);
955
+ const validate = (0, import_react9.useCallback)(async (code, orderAmount) => {
956
+ setLoading(true);
957
+ setError(null);
958
+ try {
959
+ const result = await client.shop.validateCoupon(code, orderAmount);
960
+ setValidation(result);
961
+ return result;
962
+ } catch (err) {
963
+ const error2 = err instanceof Error ? err : new Error("Failed to validate coupon");
964
+ setError(error2);
965
+ setValidation({ valid: false, message: error2.message });
966
+ throw error2;
967
+ } finally {
968
+ setLoading(false);
969
+ }
970
+ }, [client]);
971
+ const reset = (0, import_react9.useCallback)(() => {
972
+ setValidation(null);
973
+ setError(null);
974
+ }, []);
975
+ return {
976
+ validate,
977
+ validation,
978
+ loading,
979
+ error,
980
+ reset
981
+ };
982
+ }
983
+
984
+ // src/hooks/useSubscriptions.ts
985
+ var import_react10 = require("react");
986
+ function useSubscriptions() {
987
+ const client = useClient();
988
+ const [subscriptions, setSubscriptions] = (0, import_react10.useState)([]);
989
+ const [loading, setLoading] = (0, import_react10.useState)(true);
990
+ const [error, setError] = (0, import_react10.useState)(null);
991
+ const fetchSubscriptions = (0, import_react10.useCallback)(async () => {
992
+ if (!client.isAuthenticated()) {
993
+ setSubscriptions([]);
994
+ setLoading(false);
995
+ return;
996
+ }
997
+ setLoading(true);
998
+ setError(null);
999
+ try {
1000
+ const data = await client.shop.getSubscriptions();
1001
+ setSubscriptions(data);
1002
+ } catch (err) {
1003
+ setError(err instanceof Error ? err : new Error("Failed to fetch subscriptions"));
1004
+ } finally {
1005
+ setLoading(false);
1006
+ }
1007
+ }, [client]);
1008
+ (0, import_react10.useEffect)(() => {
1009
+ fetchSubscriptions();
1010
+ }, [fetchSubscriptions]);
1011
+ const activeSubscription = subscriptions.find((s) => s.is_active) ?? null;
1012
+ const hasActiveSubscription = !!activeSubscription;
1013
+ return {
1014
+ subscriptions,
1015
+ loading,
1016
+ error,
1017
+ activeSubscription,
1018
+ hasActiveSubscription,
1019
+ refresh: fetchSubscriptions
1020
+ };
1021
+ }
1022
+ function useSubscription(id) {
1023
+ const client = useClient();
1024
+ const [subscription, setSubscription] = (0, import_react10.useState)(null);
1025
+ const [loading, setLoading] = (0, import_react10.useState)(true);
1026
+ const [error, setError] = (0, import_react10.useState)(null);
1027
+ const fetchSubscription = (0, import_react10.useCallback)(async () => {
1028
+ setLoading(true);
1029
+ setError(null);
1030
+ try {
1031
+ const data = await client.shop.getSubscription(id);
1032
+ setSubscription(data);
1033
+ } catch (err) {
1034
+ setError(err instanceof Error ? err : new Error("Failed to fetch subscription"));
1035
+ } finally {
1036
+ setLoading(false);
1037
+ }
1038
+ }, [client, id]);
1039
+ (0, import_react10.useEffect)(() => {
1040
+ fetchSubscription();
1041
+ }, [fetchSubscription]);
1042
+ const cancel = (0, import_react10.useCallback)(async (immediately = false) => {
1043
+ const updated = await client.shop.cancelSubscription(id, immediately);
1044
+ setSubscription(updated);
1045
+ return updated;
1046
+ }, [client, id]);
1047
+ const pause = (0, import_react10.useCallback)(async () => {
1048
+ const updated = await client.shop.pauseSubscription(id);
1049
+ setSubscription(updated);
1050
+ return updated;
1051
+ }, [client, id]);
1052
+ const resume = (0, import_react10.useCallback)(async () => {
1053
+ const updated = await client.shop.resumeSubscription(id);
1054
+ setSubscription(updated);
1055
+ return updated;
1056
+ }, [client, id]);
1057
+ return {
1058
+ subscription,
1059
+ loading,
1060
+ error,
1061
+ cancel,
1062
+ pause,
1063
+ resume,
1064
+ refresh: fetchSubscription
1065
+ };
1066
+ }
1067
+ function useCreateSubscription() {
1068
+ const client = useClient();
1069
+ const [loading, setLoading] = (0, import_react10.useState)(false);
1070
+ const [error, setError] = (0, import_react10.useState)(null);
1071
+ const createCheckout = (0, import_react10.useCallback)(async (planId, successUrl, cancelUrl) => {
1072
+ setLoading(true);
1073
+ setError(null);
1074
+ try {
1075
+ return await client.shop.createSubscriptionCheckout({
1076
+ plan_id: planId,
1077
+ success_url: successUrl,
1078
+ cancel_url: cancelUrl
1079
+ });
1080
+ } catch (err) {
1081
+ const error2 = err instanceof Error ? err : new Error("Failed to create checkout");
1082
+ setError(error2);
1083
+ throw error2;
1084
+ } finally {
1085
+ setLoading(false);
1086
+ }
1087
+ }, [client]);
1088
+ const verifyCheckout = (0, import_react10.useCallback)(async (sessionId) => {
1089
+ setLoading(true);
1090
+ setError(null);
1091
+ try {
1092
+ const result = await client.shop.verifySubscriptionCheckout(sessionId);
1093
+ return result.subscription;
1094
+ } catch (err) {
1095
+ const error2 = err instanceof Error ? err : new Error("Failed to verify checkout");
1096
+ setError(error2);
1097
+ throw error2;
1098
+ } finally {
1099
+ setLoading(false);
1100
+ }
1101
+ }, [client]);
1102
+ const createSetupIntent = (0, import_react10.useCallback)(async () => {
1103
+ setLoading(true);
1104
+ setError(null);
1105
+ try {
1106
+ const result = await client.shop.createSetupIntent();
1107
+ return result.client_secret;
1108
+ } catch (err) {
1109
+ const error2 = err instanceof Error ? err : new Error("Failed to create setup intent");
1110
+ setError(error2);
1111
+ throw error2;
1112
+ } finally {
1113
+ setLoading(false);
1114
+ }
1115
+ }, [client]);
1116
+ return {
1117
+ createCheckout,
1118
+ verifyCheckout,
1119
+ createSetupIntent,
1120
+ loading,
1121
+ error
1122
+ };
1123
+ }
1124
+
1125
+ // src/hooks/useDownloads.ts
1126
+ var import_react11 = require("react");
1127
+ function useDownloads() {
1128
+ const client = useClient();
1129
+ const [downloads, setDownloads] = (0, import_react11.useState)([]);
1130
+ const [loading, setLoading] = (0, import_react11.useState)(true);
1131
+ const [error, setError] = (0, import_react11.useState)(null);
1132
+ const fetchDownloads = (0, import_react11.useCallback)(async () => {
1133
+ if (!client.isAuthenticated()) {
1134
+ setDownloads([]);
1135
+ setLoading(false);
1136
+ return;
1137
+ }
1138
+ setLoading(true);
1139
+ setError(null);
1140
+ try {
1141
+ const data = await client.shop.getMyDownloads();
1142
+ setDownloads(data);
1143
+ } catch (err) {
1144
+ setError(err instanceof Error ? err : new Error("Failed to fetch downloads"));
1145
+ } finally {
1146
+ setLoading(false);
1147
+ }
1148
+ }, [client]);
1149
+ (0, import_react11.useEffect)(() => {
1150
+ fetchDownloads();
1151
+ }, [fetchDownloads]);
1152
+ const getDownloadUrl = (0, import_react11.useCallback)((token) => {
1153
+ return client.shop.getDownloadUrl(token);
1154
+ }, [client]);
1155
+ const getDownloadInfo = (0, import_react11.useCallback)(async (token) => {
1156
+ return await client.shop.getDownloadInfo(token);
1157
+ }, [client]);
1158
+ return {
1159
+ downloads,
1160
+ loading,
1161
+ error,
1162
+ getDownloadUrl,
1163
+ getDownloadInfo,
1164
+ refresh: fetchDownloads
1165
+ };
1166
+ }
1167
+ function useOrderDownloads(orderNumber) {
1168
+ const client = useClient();
1169
+ const [downloads, setDownloads] = (0, import_react11.useState)([]);
1170
+ const [loading, setLoading] = (0, import_react11.useState)(true);
1171
+ const [error, setError] = (0, import_react11.useState)(null);
1172
+ const fetchDownloads = (0, import_react11.useCallback)(async () => {
1173
+ if (!client.isAuthenticated()) {
1174
+ setDownloads([]);
1175
+ setLoading(false);
1176
+ return;
1177
+ }
1178
+ setLoading(true);
1179
+ setError(null);
1180
+ try {
1181
+ const data = await client.shop.getOrderDownloads(orderNumber);
1182
+ setDownloads(data);
1183
+ } catch (err) {
1184
+ setError(err instanceof Error ? err : new Error("Failed to fetch downloads"));
1185
+ } finally {
1186
+ setLoading(false);
1187
+ }
1188
+ }, [client, orderNumber]);
1189
+ (0, import_react11.useEffect)(() => {
1190
+ fetchDownloads();
1191
+ }, [fetchDownloads]);
1192
+ const getDownloadUrl = (0, import_react11.useCallback)((token) => {
1193
+ return client.shop.getDownloadUrl(token);
1194
+ }, [client]);
1195
+ const getDownloadInfo = (0, import_react11.useCallback)(async (token) => {
1196
+ return await client.shop.getDownloadInfo(token);
1197
+ }, [client]);
1198
+ return {
1199
+ downloads,
1200
+ loading,
1201
+ error,
1202
+ getDownloadUrl,
1203
+ getDownloadInfo,
1204
+ refresh: fetchDownloads
1205
+ };
1206
+ }
1207
+
1208
+ // src/hooks/useReviews.ts
1209
+ var import_react12 = require("react");
1210
+ function useProductReviews(productSlug, params) {
1211
+ const client = useClient();
1212
+ const [reviews, setReviews] = (0, import_react12.useState)([]);
1213
+ const [stats, setStats] = (0, import_react12.useState)(null);
1214
+ const [meta, setMeta] = (0, import_react12.useState)(null);
1215
+ const [loading, setLoading] = (0, import_react12.useState)(true);
1216
+ const [error, setError] = (0, import_react12.useState)(null);
1217
+ const fetchReviews = (0, import_react12.useCallback)(async () => {
1218
+ setLoading(true);
1219
+ setError(null);
1220
+ try {
1221
+ const response = await client.shop.getProductReviews(productSlug, params);
1222
+ setReviews(response.data);
1223
+ setStats(response.stats);
1224
+ setMeta(response.meta);
1225
+ } catch (err) {
1226
+ setError(err instanceof Error ? err : new Error("Failed to fetch reviews"));
1227
+ } finally {
1228
+ setLoading(false);
1229
+ }
1230
+ }, [client, productSlug, params]);
1231
+ (0, import_react12.useEffect)(() => {
1232
+ fetchReviews();
1233
+ }, [fetchReviews]);
1234
+ return {
1235
+ reviews,
1236
+ stats,
1237
+ meta,
1238
+ loading,
1239
+ error,
1240
+ refresh: fetchReviews
1241
+ };
1242
+ }
1243
+ function useCanReview(productSlug) {
1244
+ const client = useClient();
1245
+ const [canReview, setCanReview] = (0, import_react12.useState)(false);
1246
+ const [reason, setReason] = (0, import_react12.useState)(null);
1247
+ const [loading, setLoading] = (0, import_react12.useState)(true);
1248
+ const [error, setError] = (0, import_react12.useState)(null);
1249
+ const check = (0, import_react12.useCallback)(async () => {
1250
+ setLoading(true);
1251
+ setError(null);
1252
+ try {
1253
+ const response = await client.shop.canReviewProduct(productSlug);
1254
+ setCanReview(response.can_review);
1255
+ setReason(response.reason ?? null);
1256
+ return response;
1257
+ } catch (err) {
1258
+ setError(err instanceof Error ? err : new Error("Failed to check review eligibility"));
1259
+ return { can_review: false, reason: "not_logged_in" };
1260
+ } finally {
1261
+ setLoading(false);
1262
+ }
1263
+ }, [client, productSlug]);
1264
+ (0, import_react12.useEffect)(() => {
1265
+ if (client.isAuthenticated()) {
1266
+ check();
1267
+ } else {
1268
+ setCanReview(false);
1269
+ setReason("not_logged_in");
1270
+ setLoading(false);
1271
+ }
1272
+ }, [check, client]);
1273
+ return {
1274
+ canReview,
1275
+ reason,
1276
+ loading,
1277
+ error,
1278
+ check
1279
+ };
1280
+ }
1281
+ function useCreateReview() {
1282
+ const client = useClient();
1283
+ const [loading, setLoading] = (0, import_react12.useState)(false);
1284
+ const [error, setError] = (0, import_react12.useState)(null);
1285
+ const createReview = (0, import_react12.useCallback)(async (productSlug, data) => {
1286
+ setLoading(true);
1287
+ setError(null);
1288
+ try {
1289
+ return await client.shop.createReview(productSlug, data);
1290
+ } catch (err) {
1291
+ const error2 = err instanceof Error ? err : new Error("Failed to create review");
1292
+ setError(error2);
1293
+ throw error2;
1294
+ } finally {
1295
+ setLoading(false);
1296
+ }
1297
+ }, [client]);
1298
+ return {
1299
+ createReview,
1300
+ loading,
1301
+ error
1302
+ };
1303
+ }
1304
+ function useMyReviews(params) {
1305
+ const client = useClient();
1306
+ const [reviews, setReviews] = (0, import_react12.useState)([]);
1307
+ const [meta, setMeta] = (0, import_react12.useState)(null);
1308
+ const [loading, setLoading] = (0, import_react12.useState)(true);
1309
+ const [error, setError] = (0, import_react12.useState)(null);
1310
+ const fetchReviews = (0, import_react12.useCallback)(async () => {
1311
+ if (!client.isAuthenticated()) {
1312
+ setReviews([]);
1313
+ setLoading(false);
1314
+ return;
1315
+ }
1316
+ setLoading(true);
1317
+ setError(null);
1318
+ try {
1319
+ const response = await client.shop.myReviews(params);
1320
+ setReviews(response.data);
1321
+ setMeta(response.meta);
1322
+ } catch (err) {
1323
+ setError(err instanceof Error ? err : new Error("Failed to fetch reviews"));
1324
+ } finally {
1325
+ setLoading(false);
1326
+ }
1327
+ }, [client, params]);
1328
+ (0, import_react12.useEffect)(() => {
1329
+ fetchReviews();
1330
+ }, [fetchReviews]);
1331
+ const deleteReview = (0, import_react12.useCallback)(async (reviewId) => {
1332
+ await client.shop.deleteReview(reviewId);
1333
+ setReviews((prev) => prev.filter((r) => r.id !== reviewId));
1334
+ }, [client]);
1335
+ const updateReview = (0, import_react12.useCallback)(async (reviewId, data) => {
1336
+ const updated = await client.shop.updateReview(reviewId, data);
1337
+ setReviews((prev) => prev.map((r) => r.id === reviewId ? updated : r));
1338
+ return updated;
1339
+ }, [client]);
1340
+ return {
1341
+ reviews,
1342
+ meta,
1343
+ loading,
1344
+ error,
1345
+ refresh: fetchReviews,
1346
+ deleteReview,
1347
+ updateReview
1348
+ };
1349
+ }
1350
+
1351
+ // src/hooks/useBlog.ts
1352
+ var import_react13 = require("react");
1353
+ function useBlog(options = {}) {
1354
+ const { autoFetch = true, ...params } = options;
1355
+ const client = useClient();
1356
+ const [posts, setPosts] = (0, import_react13.useState)([]);
1357
+ const [meta, setMeta] = (0, import_react13.useState)(null);
1358
+ const [loading, setLoading] = (0, import_react13.useState)(autoFetch);
1359
+ const [error, setError] = (0, import_react13.useState)(null);
1360
+ const [currentParams, setCurrentParams] = (0, import_react13.useState)(params);
1361
+ const fetchPosts = (0, import_react13.useCallback)(async (fetchParams, append = false) => {
1362
+ setLoading(true);
1363
+ setError(null);
1364
+ try {
1365
+ const response = await client.blog.list(fetchParams);
1366
+ if (append) {
1367
+ setPosts((prev) => [...prev, ...response.data]);
1368
+ } else {
1369
+ setPosts(response.data);
1370
+ }
1371
+ setMeta(response.meta);
1372
+ } catch (err) {
1373
+ setError(err instanceof Error ? err : new Error("Failed to fetch blog posts"));
1374
+ } finally {
1375
+ setLoading(false);
1376
+ }
1377
+ }, [client]);
1378
+ (0, import_react13.useEffect)(() => {
1379
+ if (autoFetch) {
1380
+ fetchPosts(params);
1381
+ }
1382
+ }, []);
1383
+ const hasMore = meta ? meta.current_page < meta.last_page : false;
1384
+ const loadMore = (0, import_react13.useCallback)(async () => {
1385
+ if (!hasMore || loading) return;
1386
+ const nextPage = (meta?.current_page ?? 0) + 1;
1387
+ await fetchPosts({ ...currentParams, page: nextPage }, true);
1388
+ }, [hasMore, loading, meta, currentParams, fetchPosts]);
1389
+ const refresh = (0, import_react13.useCallback)(async () => {
1390
+ setCurrentParams(params);
1391
+ await fetchPosts(params);
1392
+ }, [params, fetchPosts]);
1393
+ return {
1394
+ posts,
1395
+ meta,
1396
+ loading,
1397
+ error,
1398
+ hasMore,
1399
+ loadMore,
1400
+ refresh
1401
+ };
1402
+ }
1403
+ function useBlogPost(slug) {
1404
+ const client = useClient();
1405
+ const [post, setPost] = (0, import_react13.useState)(null);
1406
+ const [loading, setLoading] = (0, import_react13.useState)(true);
1407
+ const [error, setError] = (0, import_react13.useState)(null);
1408
+ const fetchPost = (0, import_react13.useCallback)(async () => {
1409
+ setLoading(true);
1410
+ setError(null);
1411
+ try {
1412
+ const data = await client.blog.get(slug);
1413
+ setPost(data);
1414
+ } catch (err) {
1415
+ setError(err instanceof Error ? err : new Error("Failed to fetch blog post"));
1416
+ } finally {
1417
+ setLoading(false);
1418
+ }
1419
+ }, [client, slug]);
1420
+ (0, import_react13.useEffect)(() => {
1421
+ fetchPost();
1422
+ }, [fetchPost]);
1423
+ return {
1424
+ post,
1425
+ loading,
1426
+ error,
1427
+ refresh: fetchPost
1428
+ };
1429
+ }
1430
+ function useBlogCategories() {
1431
+ const client = useClient();
1432
+ const [categories, setCategories] = (0, import_react13.useState)([]);
1433
+ const [loading, setLoading] = (0, import_react13.useState)(true);
1434
+ const [error, setError] = (0, import_react13.useState)(null);
1435
+ const fetchCategories = (0, import_react13.useCallback)(async () => {
1436
+ setLoading(true);
1437
+ setError(null);
1438
+ try {
1439
+ const data = await client.blog.categories();
1440
+ setCategories(data);
1441
+ } catch (err) {
1442
+ setError(err instanceof Error ? err : new Error("Failed to fetch blog categories"));
1443
+ } finally {
1444
+ setLoading(false);
1445
+ }
1446
+ }, [client]);
1447
+ (0, import_react13.useEffect)(() => {
1448
+ fetchCategories();
1449
+ }, [fetchCategories]);
1450
+ return {
1451
+ categories,
1452
+ loading,
1453
+ error,
1454
+ refresh: fetchCategories
1455
+ };
1456
+ }
1457
+ function useBlogTags() {
1458
+ const client = useClient();
1459
+ const [tags, setTags] = (0, import_react13.useState)([]);
1460
+ const [loading, setLoading] = (0, import_react13.useState)(true);
1461
+ const [error, setError] = (0, import_react13.useState)(null);
1462
+ const fetchTags = (0, import_react13.useCallback)(async () => {
1463
+ setLoading(true);
1464
+ setError(null);
1465
+ try {
1466
+ const data = await client.blog.tags();
1467
+ setTags(data);
1468
+ } catch (err) {
1469
+ setError(err instanceof Error ? err : new Error("Failed to fetch blog tags"));
1470
+ } finally {
1471
+ setLoading(false);
1472
+ }
1473
+ }, [client]);
1474
+ (0, import_react13.useEffect)(() => {
1475
+ fetchTags();
1476
+ }, [fetchTags]);
1477
+ return {
1478
+ tags,
1479
+ loading,
1480
+ error,
1481
+ refresh: fetchTags
1482
+ };
1483
+ }
1484
+ function useFeaturedBlog(limit = 5) {
1485
+ const client = useClient();
1486
+ const [posts, setPosts] = (0, import_react13.useState)([]);
1487
+ const [loading, setLoading] = (0, import_react13.useState)(true);
1488
+ const [error, setError] = (0, import_react13.useState)(null);
1489
+ const fetchPosts = (0, import_react13.useCallback)(async () => {
1490
+ setLoading(true);
1491
+ setError(null);
1492
+ try {
1493
+ const data = await client.blog.featured(limit);
1494
+ setPosts(data);
1495
+ } catch (err) {
1496
+ setError(err instanceof Error ? err : new Error("Failed to fetch featured posts"));
1497
+ } finally {
1498
+ setLoading(false);
1499
+ }
1500
+ }, [client, limit]);
1501
+ (0, import_react13.useEffect)(() => {
1502
+ fetchPosts();
1503
+ }, [fetchPosts]);
1504
+ return {
1505
+ posts,
1506
+ loading,
1507
+ error,
1508
+ refresh: fetchPosts
1509
+ };
1510
+ }
1511
+ function useBlogSearch() {
1512
+ const client = useClient();
1513
+ const [posts, setPosts] = (0, import_react13.useState)([]);
1514
+ const [meta, setMeta] = (0, import_react13.useState)(null);
1515
+ const [loading, setLoading] = (0, import_react13.useState)(false);
1516
+ const [error, setError] = (0, import_react13.useState)(null);
1517
+ const search = (0, import_react13.useCallback)(async (query) => {
1518
+ setLoading(true);
1519
+ setError(null);
1520
+ try {
1521
+ const response = await client.blog.search(query);
1522
+ setPosts(response.data);
1523
+ setMeta(response.meta);
1524
+ } catch (err) {
1525
+ setError(err instanceof Error ? err : new Error("Failed to search posts"));
1526
+ } finally {
1527
+ setLoading(false);
1528
+ }
1529
+ }, [client]);
1530
+ return {
1531
+ posts,
1532
+ meta,
1533
+ loading,
1534
+ error,
1535
+ search
1536
+ };
1537
+ }
1538
+
1539
+ // src/hooks/useBoards.ts
1540
+ var import_react14 = require("react");
1541
+ function useBoards(params) {
1542
+ const client = useClient();
1543
+ const [boards, setBoards] = (0, import_react14.useState)([]);
1544
+ const [loading, setLoading] = (0, import_react14.useState)(true);
1545
+ const [error, setError] = (0, import_react14.useState)(null);
1546
+ const fetchBoards = (0, import_react14.useCallback)(async () => {
1547
+ setLoading(true);
1548
+ setError(null);
1549
+ try {
1550
+ const response = await client.boards.list(params);
1551
+ setBoards(response.data);
1552
+ } catch (err) {
1553
+ setError(err instanceof Error ? err : new Error("Failed to fetch boards"));
1554
+ } finally {
1555
+ setLoading(false);
1556
+ }
1557
+ }, [client, params]);
1558
+ (0, import_react14.useEffect)(() => {
1559
+ fetchBoards();
1560
+ }, [fetchBoards]);
1561
+ return {
1562
+ boards,
1563
+ loading,
1564
+ error,
1565
+ refresh: fetchBoards
1566
+ };
1567
+ }
1568
+ function useBoard(slug) {
1569
+ const client = useClient();
1570
+ const [board, setBoard] = (0, import_react14.useState)(null);
1571
+ const [loading, setLoading] = (0, import_react14.useState)(true);
1572
+ const [error, setError] = (0, import_react14.useState)(null);
1573
+ const fetchBoard = (0, import_react14.useCallback)(async () => {
1574
+ setLoading(true);
1575
+ setError(null);
1576
+ try {
1577
+ const data = await client.boards.get(slug);
1578
+ setBoard(data);
1579
+ } catch (err) {
1580
+ setError(err instanceof Error ? err : new Error("Failed to fetch board"));
1581
+ } finally {
1582
+ setLoading(false);
1583
+ }
1584
+ }, [client, slug]);
1585
+ (0, import_react14.useEffect)(() => {
1586
+ fetchBoard();
1587
+ }, [fetchBoard]);
1588
+ return {
1589
+ board,
1590
+ loading,
1591
+ error,
1592
+ refresh: fetchBoard
1593
+ };
1594
+ }
1595
+ function useBoardPosts(boardSlug, params) {
1596
+ const client = useClient();
1597
+ const [posts, setPosts] = (0, import_react14.useState)([]);
1598
+ const [meta, setMeta] = (0, import_react14.useState)(null);
1599
+ const [loading, setLoading] = (0, import_react14.useState)(true);
1600
+ const [error, setError] = (0, import_react14.useState)(null);
1601
+ const [currentParams, setCurrentParams] = (0, import_react14.useState)(params);
1602
+ const fetchPosts = (0, import_react14.useCallback)(async (fetchParams, append = false) => {
1603
+ setLoading(true);
1604
+ setError(null);
1605
+ try {
1606
+ const response = await client.boards.listPosts(boardSlug, fetchParams);
1607
+ if (append) {
1608
+ setPosts((prev) => [...prev, ...response.data]);
1609
+ } else {
1610
+ setPosts(response.data);
1611
+ }
1612
+ setMeta(response.meta);
1613
+ } catch (err) {
1614
+ setError(err instanceof Error ? err : new Error("Failed to fetch posts"));
1615
+ } finally {
1616
+ setLoading(false);
1617
+ }
1618
+ }, [client, boardSlug]);
1619
+ (0, import_react14.useEffect)(() => {
1620
+ fetchPosts(params);
1621
+ }, []);
1622
+ const hasMore = meta ? meta.current_page < meta.last_page : false;
1623
+ const loadMore = (0, import_react14.useCallback)(async () => {
1624
+ if (!hasMore || loading) return;
1625
+ const nextPage = (meta?.current_page ?? 0) + 1;
1626
+ await fetchPosts({ ...currentParams, page: nextPage }, true);
1627
+ }, [hasMore, loading, meta, currentParams, fetchPosts]);
1628
+ const refresh = (0, import_react14.useCallback)(async () => {
1629
+ setCurrentParams(params);
1630
+ await fetchPosts(params);
1631
+ }, [params, fetchPosts]);
1632
+ return {
1633
+ posts,
1634
+ meta,
1635
+ loading,
1636
+ error,
1637
+ hasMore,
1638
+ loadMore,
1639
+ refresh
1640
+ };
1641
+ }
1642
+ function useBoardPost(postId) {
1643
+ const client = useClient();
1644
+ const [post, setPost] = (0, import_react14.useState)(null);
1645
+ const [loading, setLoading] = (0, import_react14.useState)(true);
1646
+ const [error, setError] = (0, import_react14.useState)(null);
1647
+ const fetchPost = (0, import_react14.useCallback)(async () => {
1648
+ setLoading(true);
1649
+ setError(null);
1650
+ try {
1651
+ const data = await client.boards.getPost(postId);
1652
+ setPost(data);
1653
+ } catch (err) {
1654
+ setError(err instanceof Error ? err : new Error("Failed to fetch post"));
1655
+ } finally {
1656
+ setLoading(false);
1657
+ }
1658
+ }, [client, postId]);
1659
+ (0, import_react14.useEffect)(() => {
1660
+ fetchPost();
1661
+ }, [fetchPost]);
1662
+ return {
1663
+ post,
1664
+ loading,
1665
+ error,
1666
+ refresh: fetchPost
1667
+ };
1668
+ }
1669
+ function useCreateBoardPost() {
1670
+ const client = useClient();
1671
+ const [loading, setLoading] = (0, import_react14.useState)(false);
1672
+ const [error, setError] = (0, import_react14.useState)(null);
1673
+ const createPost = (0, import_react14.useCallback)(async (data) => {
1674
+ setLoading(true);
1675
+ setError(null);
1676
+ try {
1677
+ return await client.boards.createPost(data);
1678
+ } catch (err) {
1679
+ const error2 = err instanceof Error ? err : new Error("Failed to create post");
1680
+ setError(error2);
1681
+ throw error2;
1682
+ } finally {
1683
+ setLoading(false);
1684
+ }
1685
+ }, [client]);
1686
+ return {
1687
+ createPost,
1688
+ loading,
1689
+ error
1690
+ };
1691
+ }
1692
+
1693
+ // src/hooks/useComments.ts
1694
+ var import_react15 = require("react");
1695
+ function useComments(options) {
1696
+ const { type, target, page, per_page } = options;
1697
+ const client = useClient();
1698
+ const [comments, setComments] = (0, import_react15.useState)([]);
1699
+ const [meta, setMeta] = (0, import_react15.useState)(null);
1700
+ const [loading, setLoading] = (0, import_react15.useState)(true);
1701
+ const [error, setError] = (0, import_react15.useState)(null);
1702
+ const fetchComments = (0, import_react15.useCallback)(async () => {
1703
+ setLoading(true);
1704
+ setError(null);
1705
+ try {
1706
+ let response;
1707
+ const params = { page, per_page };
1708
+ switch (type) {
1709
+ case "board":
1710
+ response = await client.comments.boardPost(target, params);
1711
+ break;
1712
+ case "blog":
1713
+ response = await client.comments.blogPost(target, params);
1714
+ break;
1715
+ case "standalone":
1716
+ response = await client.comments.standalone(target, params);
1717
+ break;
1718
+ }
1719
+ setComments(response.data);
1720
+ setMeta(response.meta);
1721
+ } catch (err) {
1722
+ setError(err instanceof Error ? err : new Error("Failed to fetch comments"));
1723
+ } finally {
1724
+ setLoading(false);
1725
+ }
1726
+ }, [client, type, target, page, per_page]);
1727
+ (0, import_react15.useEffect)(() => {
1728
+ fetchComments();
1729
+ }, [fetchComments]);
1730
+ const createComment = (0, import_react15.useCallback)(async (data) => {
1731
+ let response;
1732
+ switch (type) {
1733
+ case "board":
1734
+ response = await client.comments.createBoardPost(target, data);
1735
+ break;
1736
+ case "blog":
1737
+ response = await client.comments.createBlogPost(target, data);
1738
+ break;
1739
+ case "standalone":
1740
+ response = await client.comments.createStandalone(target, data);
1741
+ break;
1742
+ }
1743
+ await fetchComments();
1744
+ return response.data;
1745
+ }, [client, type, target, fetchComments]);
1746
+ const updateComment = (0, import_react15.useCallback)(async (commentId, content) => {
1747
+ const response = await client.comments.update(commentId, { content });
1748
+ setComments((prev) => prev.map((c) => c.id === commentId ? response.data : c));
1749
+ return response.data;
1750
+ }, [client]);
1751
+ const deleteComment = (0, import_react15.useCallback)(async (commentId, password) => {
1752
+ await client.comments.delete(commentId, password ? { password } : void 0);
1753
+ setComments((prev) => prev.filter((c) => c.id !== commentId));
1754
+ }, [client]);
1755
+ const likeComment = (0, import_react15.useCallback)(async (commentId) => {
1756
+ const response = await client.comments.like(commentId);
1757
+ setComments((prev) => prev.map(
1758
+ (c) => c.id === commentId ? { ...c, likes: response.data.likes } : c
1759
+ ));
1760
+ return response.data.likes;
1761
+ }, [client]);
1762
+ return {
1763
+ comments,
1764
+ meta,
1765
+ loading,
1766
+ error,
1767
+ createComment,
1768
+ updateComment,
1769
+ deleteComment,
1770
+ likeComment,
1771
+ refresh: fetchComments
1772
+ };
1773
+ }
1774
+
1775
+ // src/hooks/useForms.ts
1776
+ var import_react16 = require("react");
1777
+ function useForm(formSlug) {
1778
+ const client = useClient();
1779
+ const [form, setForm] = (0, import_react16.useState)(null);
1780
+ const [loading, setLoading] = (0, import_react16.useState)(true);
1781
+ const [error, setError] = (0, import_react16.useState)(null);
1782
+ const [submitting, setSubmitting] = (0, import_react16.useState)(false);
1783
+ const [submitted, setSubmitted] = (0, import_react16.useState)(false);
1784
+ const fetchForm = (0, import_react16.useCallback)(async () => {
1785
+ setLoading(true);
1786
+ setError(null);
1787
+ try {
1788
+ const data = await client.forms.get(formSlug);
1789
+ setForm(data);
1790
+ } catch (err) {
1791
+ setError(err instanceof Error ? err : new Error("Failed to fetch form"));
1792
+ } finally {
1793
+ setLoading(false);
1794
+ }
1795
+ }, [client, formSlug]);
1796
+ (0, import_react16.useEffect)(() => {
1797
+ fetchForm();
1798
+ }, [fetchForm]);
1799
+ const submit = (0, import_react16.useCallback)(async (data) => {
1800
+ setSubmitting(true);
1801
+ setError(null);
1802
+ try {
1803
+ const submission = await client.forms.submit(formSlug, data);
1804
+ setSubmitted(true);
1805
+ return submission;
1806
+ } catch (err) {
1807
+ const error2 = err instanceof Error ? err : new Error("Failed to submit form");
1808
+ setError(error2);
1809
+ throw error2;
1810
+ } finally {
1811
+ setSubmitting(false);
1812
+ }
1813
+ }, [client, formSlug]);
1814
+ const reset = (0, import_react16.useCallback)(() => {
1815
+ setSubmitted(false);
1816
+ setError(null);
1817
+ }, []);
1818
+ return {
1819
+ form,
1820
+ loading,
1821
+ error,
1822
+ submit,
1823
+ submitting,
1824
+ submitted,
1825
+ reset
1826
+ };
1827
+ }
1828
+
1829
+ // src/hooks/useReservation.ts
1830
+ var import_react17 = require("react");
1831
+ function useReservationServices() {
1832
+ const client = useClient();
1833
+ const [services, setServices] = (0, import_react17.useState)([]);
1834
+ const [loading, setLoading] = (0, import_react17.useState)(true);
1835
+ const [error, setError] = (0, import_react17.useState)(null);
1836
+ const fetchServices = (0, import_react17.useCallback)(async () => {
1837
+ setLoading(true);
1838
+ setError(null);
1839
+ try {
1840
+ const data = await client.reservation.listServices();
1841
+ setServices(data);
1842
+ } catch (err) {
1843
+ setError(err instanceof Error ? err : new Error("Failed to fetch services"));
1844
+ } finally {
1845
+ setLoading(false);
1846
+ }
1847
+ }, [client]);
1848
+ (0, import_react17.useEffect)(() => {
1849
+ fetchServices();
1850
+ }, [fetchServices]);
1851
+ return {
1852
+ services,
1853
+ loading,
1854
+ error,
1855
+ refresh: fetchServices
1856
+ };
1857
+ }
1858
+ function useReservationStaffs() {
1859
+ const client = useClient();
1860
+ const [staffs, setStaffs] = (0, import_react17.useState)([]);
1861
+ const [loading, setLoading] = (0, import_react17.useState)(true);
1862
+ const [error, setError] = (0, import_react17.useState)(null);
1863
+ const fetchStaffs = (0, import_react17.useCallback)(async () => {
1864
+ setLoading(true);
1865
+ setError(null);
1866
+ try {
1867
+ const data = await client.reservation.listStaff();
1868
+ setStaffs(data);
1869
+ } catch (err) {
1870
+ setError(err instanceof Error ? err : new Error("Failed to fetch staffs"));
1871
+ } finally {
1872
+ setLoading(false);
1873
+ }
1874
+ }, [client]);
1875
+ (0, import_react17.useEffect)(() => {
1876
+ fetchStaffs();
1877
+ }, [fetchStaffs]);
1878
+ return {
1879
+ staffs,
1880
+ loading,
1881
+ error,
1882
+ refresh: fetchStaffs
1883
+ };
1884
+ }
1885
+ function useAvailableSlots(serviceId, date, staffId) {
1886
+ const client = useClient();
1887
+ const [slots, setSlots] = (0, import_react17.useState)([]);
1888
+ const [loading, setLoading] = (0, import_react17.useState)(true);
1889
+ const [error, setError] = (0, import_react17.useState)(null);
1890
+ const fetchSlots = (0, import_react17.useCallback)(async () => {
1891
+ if (!serviceId || !date) {
1892
+ setSlots([]);
1893
+ setLoading(false);
1894
+ return;
1895
+ }
1896
+ setLoading(true);
1897
+ setError(null);
1898
+ try {
1899
+ const data = await client.reservation.getAvailableSlots({
1900
+ service_id: serviceId,
1901
+ date,
1902
+ staff_id: staffId
1903
+ });
1904
+ setSlots(data);
1905
+ } catch (err) {
1906
+ setError(err instanceof Error ? err : new Error("Failed to fetch slots"));
1907
+ } finally {
1908
+ setLoading(false);
1909
+ }
1910
+ }, [client, serviceId, date, staffId]);
1911
+ (0, import_react17.useEffect)(() => {
1912
+ fetchSlots();
1913
+ }, [fetchSlots]);
1914
+ return {
1915
+ slots,
1916
+ loading,
1917
+ error,
1918
+ refresh: fetchSlots
1919
+ };
1920
+ }
1921
+ function useMyReservations(params) {
1922
+ const client = useClient();
1923
+ const [reservations, setReservations] = (0, import_react17.useState)([]);
1924
+ const [meta, setMeta] = (0, import_react17.useState)(null);
1925
+ const [loading, setLoading] = (0, import_react17.useState)(true);
1926
+ const [error, setError] = (0, import_react17.useState)(null);
1927
+ const fetchReservations = (0, import_react17.useCallback)(async () => {
1928
+ if (!client.isAuthenticated()) {
1929
+ setReservations([]);
1930
+ setLoading(false);
1931
+ return;
1932
+ }
1933
+ setLoading(true);
1934
+ setError(null);
1935
+ try {
1936
+ const response = await client.reservation.list(params);
1937
+ setReservations(response.data);
1938
+ setMeta(response.meta);
1939
+ } catch (err) {
1940
+ setError(err instanceof Error ? err : new Error("Failed to fetch reservations"));
1941
+ } finally {
1942
+ setLoading(false);
1943
+ }
1944
+ }, [client, params]);
1945
+ (0, import_react17.useEffect)(() => {
1946
+ fetchReservations();
1947
+ }, [fetchReservations]);
1948
+ return {
1949
+ reservations,
1950
+ meta,
1951
+ loading,
1952
+ error,
1953
+ refresh: fetchReservations
1954
+ };
1955
+ }
1956
+ function useCreateReservation() {
1957
+ const client = useClient();
1958
+ const [loading, setLoading] = (0, import_react17.useState)(false);
1959
+ const [error, setError] = (0, import_react17.useState)(null);
1960
+ const createReservation = (0, import_react17.useCallback)(async (data) => {
1961
+ setLoading(true);
1962
+ setError(null);
1963
+ try {
1964
+ const result = await client.reservation.create(data);
1965
+ return result.reservation;
1966
+ } catch (err) {
1967
+ const error2 = err instanceof Error ? err : new Error("Failed to create reservation");
1968
+ setError(error2);
1969
+ throw error2;
1970
+ } finally {
1971
+ setLoading(false);
1972
+ }
1973
+ }, [client]);
1974
+ return {
1975
+ createReservation,
1976
+ loading,
1977
+ error
1978
+ };
1979
+ }
1980
+ function useReservationSettings() {
1981
+ const client = useClient();
1982
+ const [settings, setSettings] = (0, import_react17.useState)(null);
1983
+ const [loading, setLoading] = (0, import_react17.useState)(true);
1984
+ const [error, setError] = (0, import_react17.useState)(null);
1985
+ const fetchSettings = (0, import_react17.useCallback)(async () => {
1986
+ setLoading(true);
1987
+ setError(null);
1988
+ try {
1989
+ const data = await client.reservation.getSettings();
1990
+ setSettings(data);
1991
+ } catch (err) {
1992
+ setError(err instanceof Error ? err : new Error("Failed to fetch settings"));
1993
+ } finally {
1994
+ setLoading(false);
1995
+ }
1996
+ }, [client]);
1997
+ (0, import_react17.useEffect)(() => {
1998
+ fetchSettings();
1999
+ }, [fetchSettings]);
2000
+ return {
2001
+ settings,
2002
+ loading,
2003
+ error,
2004
+ refresh: fetchSettings
2005
+ };
2006
+ }
2007
+
2008
+ // src/hooks/useMedia.ts
2009
+ var import_react18 = require("react");
2010
+ function useMedia(options = {}) {
2011
+ const { type, page, per_page, autoFetch = true } = options;
2012
+ const client = useClient();
2013
+ const [files, setFiles] = (0, import_react18.useState)([]);
2014
+ const [meta, setMeta] = (0, import_react18.useState)(null);
2015
+ const [loading, setLoading] = (0, import_react18.useState)(autoFetch);
2016
+ const [error, setError] = (0, import_react18.useState)(null);
2017
+ const [uploading, setUploading] = (0, import_react18.useState)(false);
2018
+ const [uploadProgress, setUploadProgress] = (0, import_react18.useState)(0);
2019
+ const fetchMedia = (0, import_react18.useCallback)(async () => {
2020
+ if (!client.isAuthenticated()) {
2021
+ setFiles([]);
2022
+ setLoading(false);
2023
+ return;
2024
+ }
2025
+ setLoading(true);
2026
+ setError(null);
2027
+ try {
2028
+ const response = await client.media.list({ type, page, per_page });
2029
+ setFiles(response.data);
2030
+ setMeta(response.meta);
2031
+ } catch (err) {
2032
+ setError(err instanceof Error ? err : new Error("Failed to fetch media"));
2033
+ } finally {
2034
+ setLoading(false);
2035
+ }
2036
+ }, [client, type, page, per_page]);
2037
+ (0, import_react18.useEffect)(() => {
2038
+ if (autoFetch) {
2039
+ fetchMedia();
2040
+ }
2041
+ }, [autoFetch, fetchMedia]);
2042
+ const upload = (0, import_react18.useCallback)(async (file) => {
2043
+ setUploading(true);
2044
+ setUploadProgress(0);
2045
+ setError(null);
2046
+ try {
2047
+ const media = await client.media.upload(file);
2048
+ setFiles((prev) => [media, ...prev]);
2049
+ setUploadProgress(100);
2050
+ return media;
2051
+ } catch (err) {
2052
+ const error2 = err instanceof Error ? err : new Error("Failed to upload file");
2053
+ setError(error2);
2054
+ throw error2;
2055
+ } finally {
2056
+ setUploading(false);
2057
+ }
2058
+ }, [client]);
2059
+ const uploadMultiple = (0, import_react18.useCallback)(async (filesToUpload) => {
2060
+ setUploading(true);
2061
+ setUploadProgress(0);
2062
+ setError(null);
2063
+ try {
2064
+ const results = [];
2065
+ for (let i = 0; i < filesToUpload.length; i++) {
2066
+ const media = await client.media.upload(filesToUpload[i]);
2067
+ results.push(media);
2068
+ setUploadProgress(Math.round((i + 1) / filesToUpload.length * 100));
2069
+ }
2070
+ setFiles((prev) => [...results, ...prev]);
2071
+ return results;
2072
+ } catch (err) {
2073
+ const error2 = err instanceof Error ? err : new Error("Failed to upload files");
2074
+ setError(error2);
2075
+ throw error2;
2076
+ } finally {
2077
+ setUploading(false);
2078
+ }
2079
+ }, [client]);
2080
+ const deleteFile = (0, import_react18.useCallback)(async (mediaId) => {
2081
+ await client.media.delete(mediaId);
2082
+ setFiles((prev) => prev.filter((f) => f.id !== mediaId));
2083
+ }, [client]);
2084
+ return {
2085
+ files,
2086
+ meta,
2087
+ loading,
2088
+ error,
2089
+ upload,
2090
+ uploadMultiple,
2091
+ deleteFile,
2092
+ refresh: fetchMedia,
2093
+ uploading,
2094
+ uploadProgress
2095
+ };
2096
+ }
2097
+
2098
+ // src/hooks/useEntities.ts
2099
+ var import_react19 = require("react");
2100
+ function useEntities() {
2101
+ const client = useClient();
2102
+ const [entities, setEntities] = (0, import_react19.useState)([]);
2103
+ const [loading, setLoading] = (0, import_react19.useState)(true);
2104
+ const [error, setError] = (0, import_react19.useState)(null);
2105
+ const fetchEntities = (0, import_react19.useCallback)(async () => {
2106
+ setLoading(true);
2107
+ setError(null);
2108
+ try {
2109
+ const data = await client.entities.list();
2110
+ setEntities(data);
2111
+ } catch (err) {
2112
+ setError(err instanceof Error ? err : new Error("Failed to fetch entities"));
2113
+ } finally {
2114
+ setLoading(false);
2115
+ }
2116
+ }, [client]);
2117
+ (0, import_react19.useEffect)(() => {
2118
+ fetchEntities();
2119
+ }, [fetchEntities]);
2120
+ return {
2121
+ entities,
2122
+ loading,
2123
+ error,
2124
+ refresh: fetchEntities
2125
+ };
2126
+ }
2127
+ function useEntity(slug) {
2128
+ const client = useClient();
2129
+ const [entity, setEntity] = (0, import_react19.useState)(null);
2130
+ const [loading, setLoading] = (0, import_react19.useState)(true);
2131
+ const [error, setError] = (0, import_react19.useState)(null);
2132
+ const fetchEntity = (0, import_react19.useCallback)(async () => {
2133
+ setLoading(true);
2134
+ setError(null);
2135
+ try {
2136
+ const data = await client.entities.get(slug);
2137
+ setEntity(data);
2138
+ } catch (err) {
2139
+ setError(err instanceof Error ? err : new Error("Failed to fetch entity"));
2140
+ } finally {
2141
+ setLoading(false);
2142
+ }
2143
+ }, [client, slug]);
2144
+ (0, import_react19.useEffect)(() => {
2145
+ fetchEntity();
2146
+ }, [fetchEntity]);
2147
+ return {
2148
+ entity,
2149
+ loading,
2150
+ error,
2151
+ refresh: fetchEntity
2152
+ };
2153
+ }
2154
+ function useEntityRecords(slug, params) {
2155
+ const client = useClient();
2156
+ const [records, setRecords] = (0, import_react19.useState)([]);
2157
+ const [meta, setMeta] = (0, import_react19.useState)(null);
2158
+ const [loading, setLoading] = (0, import_react19.useState)(true);
2159
+ const [error, setError] = (0, import_react19.useState)(null);
2160
+ const [currentParams, setCurrentParams] = (0, import_react19.useState)(params);
2161
+ const fetchRecords = (0, import_react19.useCallback)(async (fetchParams, append = false) => {
2162
+ setLoading(true);
2163
+ setError(null);
2164
+ try {
2165
+ const response = await client.entities.listRecords(slug, fetchParams);
2166
+ if (append) {
2167
+ setRecords((prev) => [...prev, ...response.data]);
2168
+ } else {
2169
+ setRecords(response.data);
2170
+ }
2171
+ setMeta(response.meta);
2172
+ } catch (err) {
2173
+ setError(err instanceof Error ? err : new Error("Failed to fetch records"));
2174
+ } finally {
2175
+ setLoading(false);
2176
+ }
2177
+ }, [client, slug]);
2178
+ (0, import_react19.useEffect)(() => {
2179
+ fetchRecords(params);
2180
+ }, []);
2181
+ const hasMore = meta ? meta.current_page < meta.last_page : false;
2182
+ const loadMore = (0, import_react19.useCallback)(async () => {
2183
+ if (!hasMore || loading) return;
2184
+ const nextPage = (meta?.current_page ?? 0) + 1;
2185
+ await fetchRecords({ ...currentParams, page: nextPage }, true);
2186
+ }, [hasMore, loading, meta, currentParams, fetchRecords]);
2187
+ const createRecord = (0, import_react19.useCallback)(async (data) => {
2188
+ const record = await client.entities.createRecord(slug, data);
2189
+ setRecords((prev) => [record, ...prev]);
2190
+ return record;
2191
+ }, [client, slug]);
2192
+ const updateRecord = (0, import_react19.useCallback)(async (id, data) => {
2193
+ const record = await client.entities.updateRecord(slug, id, data);
2194
+ setRecords((prev) => prev.map((r) => r.id === id ? record : r));
2195
+ return record;
2196
+ }, [client, slug]);
2197
+ const deleteRecord = (0, import_react19.useCallback)(async (id) => {
2198
+ await client.entities.deleteRecord(slug, id);
2199
+ setRecords((prev) => prev.filter((r) => r.id !== id));
2200
+ }, [client, slug]);
2201
+ const refresh = (0, import_react19.useCallback)(async () => {
2202
+ setCurrentParams(params);
2203
+ await fetchRecords(params);
2204
+ }, [params, fetchRecords]);
2205
+ return {
2206
+ records,
2207
+ meta,
2208
+ loading,
2209
+ error,
2210
+ hasMore,
2211
+ loadMore,
2212
+ createRecord,
2213
+ updateRecord,
2214
+ deleteRecord,
2215
+ refresh
2216
+ };
2217
+ }
2218
+ function useEntityRecord(slug, id) {
2219
+ const client = useClient();
2220
+ const [record, setRecord] = (0, import_react19.useState)(null);
2221
+ const [loading, setLoading] = (0, import_react19.useState)(true);
2222
+ const [error, setError] = (0, import_react19.useState)(null);
2223
+ const fetchRecord = (0, import_react19.useCallback)(async () => {
2224
+ setLoading(true);
2225
+ setError(null);
2226
+ try {
2227
+ const data = await client.entities.getRecord(slug, id);
2228
+ setRecord(data);
2229
+ } catch (err) {
2230
+ setError(err instanceof Error ? err : new Error("Failed to fetch record"));
2231
+ } finally {
2232
+ setLoading(false);
2233
+ }
2234
+ }, [client, slug, id]);
2235
+ (0, import_react19.useEffect)(() => {
2236
+ fetchRecord();
2237
+ }, [fetchRecord]);
2238
+ const update = (0, import_react19.useCallback)(async (data) => {
2239
+ const updated = await client.entities.updateRecord(slug, id, data);
2240
+ setRecord(updated);
2241
+ return updated;
2242
+ }, [client, slug, id]);
2243
+ return {
2244
+ record,
2245
+ loading,
2246
+ error,
2247
+ update,
2248
+ refresh: fetchRecord
2249
+ };
2250
+ }
2251
+ function useTypedEntity(slug) {
2252
+ const client = useClient();
2253
+ return (0, import_react19.useMemo)(() => ({
2254
+ useRecords: (params) => {
2255
+ const result = useEntityRecords(slug, params);
2256
+ return {
2257
+ ...result,
2258
+ records: result.records
2259
+ };
2260
+ },
2261
+ useRecord: (id) => {
2262
+ const result = useEntityRecord(slug, id);
2263
+ return {
2264
+ ...result,
2265
+ record: result.record
2266
+ };
2267
+ },
2268
+ create: async (data) => {
2269
+ const record = await client.entities.createRecord(slug, data);
2270
+ return record;
2271
+ },
2272
+ update: async (id, data) => {
2273
+ const record = await client.entities.updateRecord(slug, id, data);
2274
+ return record;
2275
+ },
2276
+ delete: (id) => client.entities.deleteRecord(slug, id)
2277
+ }), [client, slug]);
2278
+ }
2279
+ // Annotate the CommonJS export names for ESM import in node:
2280
+ 0 && (module.exports = {
2281
+ DiffsomeContext,
2282
+ DiffsomeProvider,
2283
+ useAuth,
2284
+ useAvailableSlots,
2285
+ useBlog,
2286
+ useBlogCategories,
2287
+ useBlogPost,
2288
+ useBlogSearch,
2289
+ useBlogTags,
2290
+ useBoard,
2291
+ useBoardPost,
2292
+ useBoardPosts,
2293
+ useBoards,
2294
+ useBundleItems,
2295
+ useBundleProducts,
2296
+ useCanReview,
2297
+ useCart,
2298
+ useCategories,
2299
+ useClient,
2300
+ useComments,
2301
+ useCoupons,
2302
+ useCreateBoardPost,
2303
+ useCreateOrder,
2304
+ useCreateReservation,
2305
+ useCreateReview,
2306
+ useCreateSubscription,
2307
+ useDiffsome,
2308
+ useDigitalProducts,
2309
+ useDownloads,
2310
+ useEntities,
2311
+ useEntity,
2312
+ useEntityRecord,
2313
+ useEntityRecords,
2314
+ useFeaturedBlog,
2315
+ useFeaturedProducts,
2316
+ useForm,
2317
+ useMedia,
2318
+ useMyReservations,
2319
+ useMyReviews,
2320
+ useOrder,
2321
+ useOrderDownloads,
2322
+ useOrders,
2323
+ usePaymentStatus,
2324
+ useProduct,
2325
+ useProductReviews,
2326
+ useProducts,
2327
+ useProductsByType,
2328
+ useReservationServices,
2329
+ useReservationSettings,
2330
+ useReservationStaffs,
2331
+ useSocialAuth,
2332
+ useStripePayment,
2333
+ useSubscription,
2334
+ useSubscriptionProducts,
2335
+ useSubscriptions,
2336
+ useTossPayment,
2337
+ useTypedEntity,
2338
+ useValidateCoupon,
2339
+ useWishlist
2340
+ });