@instockng/api-client 1.0.16 → 1.0.18
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/fetchers/carts.d.ts +203 -1
- package/dist/fetchers/carts.js +23 -2
- package/dist/hooks/admin/stats.d.ts +15 -1
- package/dist/hooks/admin/stats.js +3 -1
- package/dist/hooks/public/carts.d.ts +207 -2
- package/dist/hooks/public/carts.js +24 -3
- package/dist/rpc-client.d.ts +242 -1
- package/dist/utils/query-keys.d.ts +1 -1
- package/dist/utils/query-keys.js +1 -1
- package/package.json +1 -1
package/dist/fetchers/carts.d.ts
CHANGED
|
@@ -794,9 +794,11 @@ export declare function updateCart(cartId: string, data: {
|
|
|
794
794
|
* @param quantity - Quantity to add
|
|
795
795
|
* @param fbc - Facebook Click ID (optional)
|
|
796
796
|
* @param fbp - Facebook Browser ID (optional)
|
|
797
|
+
* @param ttp - TikTok Click ID (_ttp cookie) (optional)
|
|
798
|
+
* @param ttclid - TikTok Click ID (URL parameter) (optional)
|
|
797
799
|
* @returns Updated cart
|
|
798
800
|
*/
|
|
799
|
-
export declare function addCartItem(cartId: string, sku: string, quantity: number, fbc?: string, fbp?: string): Promise<{
|
|
801
|
+
export declare function addCartItem(cartId: string, sku: string, quantity: number, fbc?: string, fbp?: string, ttp?: string, ttclid?: string): Promise<{
|
|
800
802
|
id: string;
|
|
801
803
|
brand: {
|
|
802
804
|
createdAt: string;
|
|
@@ -2099,6 +2101,8 @@ export declare function checkoutCart(cartId: string, checkoutData: {
|
|
|
2099
2101
|
ifUnmodifiedSince?: string;
|
|
2100
2102
|
fbc?: string;
|
|
2101
2103
|
fbp?: string;
|
|
2104
|
+
ttp?: string;
|
|
2105
|
+
ttclid?: string;
|
|
2102
2106
|
}): Promise<{
|
|
2103
2107
|
subtotal: number;
|
|
2104
2108
|
deliveryCharge: number;
|
|
@@ -2362,3 +2366,201 @@ export declare function checkoutCart(cartId: string, checkoutData: {
|
|
|
2362
2366
|
prospectReason: import("@prisma/client").$Enums.ProspectReason | null;
|
|
2363
2367
|
userActionToken: string;
|
|
2364
2368
|
}>;
|
|
2369
|
+
/**
|
|
2370
|
+
* Fetch recommended products for a cart
|
|
2371
|
+
*
|
|
2372
|
+
* @param cartId - Cart UUID
|
|
2373
|
+
* @param limit - Maximum number of recommendations (default: 6)
|
|
2374
|
+
* @returns Array of recommended products from the same brand
|
|
2375
|
+
*/
|
|
2376
|
+
export declare function fetchCartRecommendations(cartId: string, limit: number): Promise<{
|
|
2377
|
+
brand: {
|
|
2378
|
+
createdAt: string;
|
|
2379
|
+
updatedAt: string;
|
|
2380
|
+
deletedAt: string;
|
|
2381
|
+
id: string;
|
|
2382
|
+
name: string;
|
|
2383
|
+
slug: string;
|
|
2384
|
+
logoUrl: string | null;
|
|
2385
|
+
siteUrl: string;
|
|
2386
|
+
domain: string;
|
|
2387
|
+
metaPixelId: string | null;
|
|
2388
|
+
tiktokPixelId: string | null;
|
|
2389
|
+
paystackPublicKey: string | null;
|
|
2390
|
+
paystackSecretKey: string | null;
|
|
2391
|
+
};
|
|
2392
|
+
variants: {
|
|
2393
|
+
createdAt: string;
|
|
2394
|
+
updatedAt: string;
|
|
2395
|
+
price: number;
|
|
2396
|
+
deletedAt: string;
|
|
2397
|
+
id: string;
|
|
2398
|
+
name: string | null;
|
|
2399
|
+
isActive: boolean;
|
|
2400
|
+
thumbnailUrl: string | null;
|
|
2401
|
+
productId: string;
|
|
2402
|
+
sku: string;
|
|
2403
|
+
trackInventory: boolean;
|
|
2404
|
+
lowStockThreshold: number | null;
|
|
2405
|
+
}[];
|
|
2406
|
+
id: string;
|
|
2407
|
+
name: string;
|
|
2408
|
+
slug: string;
|
|
2409
|
+
createdAt: string;
|
|
2410
|
+
updatedAt: string;
|
|
2411
|
+
deletedAt: string;
|
|
2412
|
+
brandId: string;
|
|
2413
|
+
isActive: boolean;
|
|
2414
|
+
description: string | null;
|
|
2415
|
+
thumbnailUrl: string | null;
|
|
2416
|
+
quantityDiscounts: string | number | boolean | {
|
|
2417
|
+
[x: string]: string | number | boolean | /*elided*/ any | {
|
|
2418
|
+
[x: number]: string | number | boolean | /*elided*/ any | /*elided*/ any;
|
|
2419
|
+
length: number;
|
|
2420
|
+
toString: never;
|
|
2421
|
+
toLocaleString: never;
|
|
2422
|
+
pop: never;
|
|
2423
|
+
push: never;
|
|
2424
|
+
concat: never;
|
|
2425
|
+
join: never;
|
|
2426
|
+
reverse: never;
|
|
2427
|
+
shift: never;
|
|
2428
|
+
slice: never;
|
|
2429
|
+
sort: never;
|
|
2430
|
+
splice: never;
|
|
2431
|
+
unshift: never;
|
|
2432
|
+
indexOf: never;
|
|
2433
|
+
lastIndexOf: never;
|
|
2434
|
+
every: never;
|
|
2435
|
+
some: never;
|
|
2436
|
+
forEach: never;
|
|
2437
|
+
map: never;
|
|
2438
|
+
filter: never;
|
|
2439
|
+
reduce: never;
|
|
2440
|
+
reduceRight: never;
|
|
2441
|
+
find: never;
|
|
2442
|
+
findIndex: never;
|
|
2443
|
+
fill: never;
|
|
2444
|
+
copyWithin: never;
|
|
2445
|
+
entries: never;
|
|
2446
|
+
keys: never;
|
|
2447
|
+
values: never;
|
|
2448
|
+
includes: never;
|
|
2449
|
+
flatMap: never;
|
|
2450
|
+
flat: never;
|
|
2451
|
+
[Symbol.iterator]: never;
|
|
2452
|
+
readonly [Symbol.unscopables]: {
|
|
2453
|
+
[x: number]: boolean;
|
|
2454
|
+
length?: boolean;
|
|
2455
|
+
toString?: boolean;
|
|
2456
|
+
toLocaleString?: boolean;
|
|
2457
|
+
pop?: boolean;
|
|
2458
|
+
push?: boolean;
|
|
2459
|
+
concat?: boolean;
|
|
2460
|
+
join?: boolean;
|
|
2461
|
+
reverse?: boolean;
|
|
2462
|
+
shift?: boolean;
|
|
2463
|
+
slice?: boolean;
|
|
2464
|
+
sort?: boolean;
|
|
2465
|
+
splice?: boolean;
|
|
2466
|
+
unshift?: boolean;
|
|
2467
|
+
indexOf?: boolean;
|
|
2468
|
+
lastIndexOf?: boolean;
|
|
2469
|
+
every?: boolean;
|
|
2470
|
+
some?: boolean;
|
|
2471
|
+
forEach?: boolean;
|
|
2472
|
+
map?: boolean;
|
|
2473
|
+
filter?: boolean;
|
|
2474
|
+
reduce?: boolean;
|
|
2475
|
+
reduceRight?: boolean;
|
|
2476
|
+
find?: boolean;
|
|
2477
|
+
findIndex?: boolean;
|
|
2478
|
+
fill?: boolean;
|
|
2479
|
+
copyWithin?: boolean;
|
|
2480
|
+
entries?: boolean;
|
|
2481
|
+
keys?: boolean;
|
|
2482
|
+
values?: boolean;
|
|
2483
|
+
includes?: boolean;
|
|
2484
|
+
flatMap?: boolean;
|
|
2485
|
+
flat?: boolean;
|
|
2486
|
+
};
|
|
2487
|
+
};
|
|
2488
|
+
} | {
|
|
2489
|
+
[x: number]: string | number | boolean | {
|
|
2490
|
+
[x: string]: string | number | boolean | /*elided*/ any | /*elided*/ any;
|
|
2491
|
+
} | /*elided*/ any;
|
|
2492
|
+
length: number;
|
|
2493
|
+
toString: never;
|
|
2494
|
+
toLocaleString: never;
|
|
2495
|
+
pop: never;
|
|
2496
|
+
push: never;
|
|
2497
|
+
concat: never;
|
|
2498
|
+
join: never;
|
|
2499
|
+
reverse: never;
|
|
2500
|
+
shift: never;
|
|
2501
|
+
slice: never;
|
|
2502
|
+
sort: never;
|
|
2503
|
+
splice: never;
|
|
2504
|
+
unshift: never;
|
|
2505
|
+
indexOf: never;
|
|
2506
|
+
lastIndexOf: never;
|
|
2507
|
+
every: never;
|
|
2508
|
+
some: never;
|
|
2509
|
+
forEach: never;
|
|
2510
|
+
map: never;
|
|
2511
|
+
filter: never;
|
|
2512
|
+
reduce: never;
|
|
2513
|
+
reduceRight: never;
|
|
2514
|
+
find: never;
|
|
2515
|
+
findIndex: never;
|
|
2516
|
+
fill: never;
|
|
2517
|
+
copyWithin: never;
|
|
2518
|
+
entries: never;
|
|
2519
|
+
keys: never;
|
|
2520
|
+
values: never;
|
|
2521
|
+
includes: never;
|
|
2522
|
+
flatMap: never;
|
|
2523
|
+
flat: never;
|
|
2524
|
+
[Symbol.iterator]: never;
|
|
2525
|
+
readonly [Symbol.unscopables]: {
|
|
2526
|
+
[x: number]: boolean;
|
|
2527
|
+
length?: boolean;
|
|
2528
|
+
toString?: boolean;
|
|
2529
|
+
toLocaleString?: boolean;
|
|
2530
|
+
pop?: boolean;
|
|
2531
|
+
push?: boolean;
|
|
2532
|
+
concat?: boolean;
|
|
2533
|
+
join?: boolean;
|
|
2534
|
+
reverse?: boolean;
|
|
2535
|
+
shift?: boolean;
|
|
2536
|
+
slice?: boolean;
|
|
2537
|
+
sort?: boolean;
|
|
2538
|
+
splice?: boolean;
|
|
2539
|
+
unshift?: boolean;
|
|
2540
|
+
indexOf?: boolean;
|
|
2541
|
+
lastIndexOf?: boolean;
|
|
2542
|
+
every?: boolean;
|
|
2543
|
+
some?: boolean;
|
|
2544
|
+
forEach?: boolean;
|
|
2545
|
+
map?: boolean;
|
|
2546
|
+
filter?: boolean;
|
|
2547
|
+
reduce?: boolean;
|
|
2548
|
+
reduceRight?: boolean;
|
|
2549
|
+
find?: boolean;
|
|
2550
|
+
findIndex?: boolean;
|
|
2551
|
+
fill?: boolean;
|
|
2552
|
+
copyWithin?: boolean;
|
|
2553
|
+
entries?: boolean;
|
|
2554
|
+
keys?: boolean;
|
|
2555
|
+
values?: boolean;
|
|
2556
|
+
includes?: boolean;
|
|
2557
|
+
flatMap?: boolean;
|
|
2558
|
+
flat?: boolean;
|
|
2559
|
+
};
|
|
2560
|
+
};
|
|
2561
|
+
}[] | {
|
|
2562
|
+
error: {
|
|
2563
|
+
code: string;
|
|
2564
|
+
message: string;
|
|
2565
|
+
};
|
|
2566
|
+
}>;
|
package/dist/fetchers/carts.js
CHANGED
|
@@ -67,14 +67,16 @@ export async function updateCart(cartId, data) {
|
|
|
67
67
|
* @param quantity - Quantity to add
|
|
68
68
|
* @param fbc - Facebook Click ID (optional)
|
|
69
69
|
* @param fbp - Facebook Browser ID (optional)
|
|
70
|
+
* @param ttp - TikTok Click ID (_ttp cookie) (optional)
|
|
71
|
+
* @param ttclid - TikTok Click ID (URL parameter) (optional)
|
|
70
72
|
* @returns Updated cart
|
|
71
73
|
*/
|
|
72
|
-
export async function addCartItem(cartId, sku, quantity, fbc, fbp) {
|
|
74
|
+
export async function addCartItem(cartId, sku, quantity, fbc, fbp, ttp, ttclid) {
|
|
73
75
|
const clients = createRpcClients(API_URL);
|
|
74
76
|
const res = await clients.carts[':id'].items.$post({
|
|
75
77
|
param: { id: cartId },
|
|
76
78
|
// @ts-expect-error - Hono RPC type inference issue
|
|
77
|
-
json: { sku, quantity, fbc, fbp },
|
|
79
|
+
json: { sku, quantity, fbc, fbp, ttp, ttclid },
|
|
78
80
|
});
|
|
79
81
|
if (!res.ok) {
|
|
80
82
|
throw new Error(`Failed to add item to cart: ${res.statusText}`);
|
|
@@ -172,3 +174,22 @@ export async function checkoutCart(cartId, checkoutData) {
|
|
|
172
174
|
}
|
|
173
175
|
return res.json();
|
|
174
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* Fetch recommended products for a cart
|
|
179
|
+
*
|
|
180
|
+
* @param cartId - Cart UUID
|
|
181
|
+
* @param limit - Maximum number of recommendations (default: 6)
|
|
182
|
+
* @returns Array of recommended products from the same brand
|
|
183
|
+
*/
|
|
184
|
+
export async function fetchCartRecommendations(cartId, limit) {
|
|
185
|
+
const clients = createRpcClients(API_URL);
|
|
186
|
+
const res = await clients.carts[':id'].recommendations.$get({
|
|
187
|
+
param: { id: cartId },
|
|
188
|
+
// @ts-ignore - Hono RPC type inference issue with query parameters
|
|
189
|
+
query: { limit: limit.toString() },
|
|
190
|
+
});
|
|
191
|
+
if (!res.ok) {
|
|
192
|
+
throw new Error(`Failed to fetch cart recommendations: ${res.statusText}`);
|
|
193
|
+
}
|
|
194
|
+
return res.json();
|
|
195
|
+
}
|
|
@@ -8,13 +8,27 @@ import { createAdminRpcClients } from '../../rpc-client';
|
|
|
8
8
|
*/
|
|
9
9
|
export declare function useGetStats(params?: {
|
|
10
10
|
brandId?: string;
|
|
11
|
+
period?: string;
|
|
11
12
|
}, options?: Omit<UseQueryOptions<Awaited<ReturnType<Awaited<ReturnType<ReturnType<typeof createAdminRpcClients>['stats']['index']['$get']>>['json']>>, Error>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
|
|
12
13
|
overview: {
|
|
13
14
|
totalOrders: number;
|
|
15
|
+
totalOrdersChange: number;
|
|
16
|
+
totalOrdersPrevious: number;
|
|
14
17
|
pendingOrders: number;
|
|
18
|
+
pendingOrdersChange: number;
|
|
19
|
+
pendingOrdersPrevious: number;
|
|
15
20
|
shippedOrders: number;
|
|
21
|
+
shippedOrdersChange: number;
|
|
22
|
+
shippedOrdersPrevious: number;
|
|
16
23
|
deliveredOrders: number;
|
|
17
|
-
|
|
24
|
+
deliveredOrdersChange: number;
|
|
25
|
+
deliveredOrdersPrevious: number;
|
|
26
|
+
realizedRevenue: number;
|
|
27
|
+
realizedRevenueChange: number;
|
|
28
|
+
realizedRevenuePrevious: number;
|
|
29
|
+
unrealizedRevenue: number;
|
|
30
|
+
unrealizedRevenueChange: number;
|
|
31
|
+
unrealizedRevenuePrevious: number;
|
|
18
32
|
};
|
|
19
33
|
recentOrders: {
|
|
20
34
|
subtotal: number;
|
|
@@ -11,7 +11,7 @@ import { useApiConfig } from '../useApiConfig';
|
|
|
11
11
|
export function useGetStats(params, options) {
|
|
12
12
|
const { baseURL, getAuthToken } = useApiConfig();
|
|
13
13
|
return useQueryUnwrapped({
|
|
14
|
-
queryKey: queryKeys.admin.stats.overview(params?.brandId),
|
|
14
|
+
queryKey: queryKeys.admin.stats.overview(params?.brandId, params?.period),
|
|
15
15
|
queryFn: async () => {
|
|
16
16
|
const token = await getAuthToken();
|
|
17
17
|
const clients = createAdminRpcClients(baseURL);
|
|
@@ -20,6 +20,8 @@ export function useGetStats(params, options) {
|
|
|
20
20
|
throw new Error(`Failed to fetch statistics: ${res.statusText}`);
|
|
21
21
|
return res.json();
|
|
22
22
|
},
|
|
23
|
+
staleTime: 0,
|
|
24
|
+
gcTime: 0,
|
|
23
25
|
...options,
|
|
24
26
|
});
|
|
25
27
|
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* providing end-to-end type safety without code generation.
|
|
6
6
|
*/
|
|
7
7
|
import { UseQueryOptions, UseMutationOptions } from '@tanstack/react-query';
|
|
8
|
-
import { fetchCart, updateCart, createCart, addCartItem, updateCartItem, removeCartItem, applyDiscount, removeDiscount, checkoutCart } from '../../fetchers/carts';
|
|
8
|
+
import { fetchCart, updateCart, createCart, addCartItem, updateCartItem, removeCartItem, applyDiscount, removeDiscount, checkoutCart, fetchCartRecommendations } from '../../fetchers/carts';
|
|
9
9
|
/**
|
|
10
10
|
* Hook to get cart by ID using RPC
|
|
11
11
|
*
|
|
@@ -1343,7 +1343,7 @@ export declare function useRemoveDiscount(cartId: string, options?: UseMutationO
|
|
|
1343
1343
|
* @example
|
|
1344
1344
|
* ```tsx
|
|
1345
1345
|
* const addItem = useAddCartItem('cart-123');
|
|
1346
|
-
* addItem.mutate({ sku: 'PROD-001', quantity: 2, fbc: '_fbc_cookie', fbp: '_fbp_cookie' });
|
|
1346
|
+
* addItem.mutate({ sku: 'PROD-001', quantity: 2, fbc: '_fbc_cookie', fbp: '_fbp_cookie', ttp: '_ttp_cookie', ttclid: 'tiktok_click_id' });
|
|
1347
1347
|
* ```
|
|
1348
1348
|
*/
|
|
1349
1349
|
export declare function useAddCartItem(cartId: string, options?: UseMutationOptions<Awaited<ReturnType<typeof addCartItem>>, Error, {
|
|
@@ -1351,6 +1351,8 @@ export declare function useAddCartItem(cartId: string, options?: UseMutationOpti
|
|
|
1351
1351
|
quantity: number;
|
|
1352
1352
|
fbc?: string;
|
|
1353
1353
|
fbp?: string;
|
|
1354
|
+
ttp?: string;
|
|
1355
|
+
ttclid?: string;
|
|
1354
1356
|
}>): import("@tanstack/react-query").UseMutationResult<{
|
|
1355
1357
|
id: string;
|
|
1356
1358
|
brand: {
|
|
@@ -1608,6 +1610,8 @@ export declare function useAddCartItem(cartId: string, options?: UseMutationOpti
|
|
|
1608
1610
|
quantity: number;
|
|
1609
1611
|
fbc?: string;
|
|
1610
1612
|
fbp?: string;
|
|
1613
|
+
ttp?: string;
|
|
1614
|
+
ttclid?: string;
|
|
1611
1615
|
}, unknown>;
|
|
1612
1616
|
/**
|
|
1613
1617
|
* Hook to update cart item quantity using RPC
|
|
@@ -2431,4 +2435,205 @@ export declare function useCheckoutCart(cartId: string, options?: UseMutationOpt
|
|
|
2431
2435
|
ifUnmodifiedSince?: string;
|
|
2432
2436
|
fbc?: string;
|
|
2433
2437
|
fbp?: string;
|
|
2438
|
+
ttp?: string;
|
|
2439
|
+
ttclid?: string;
|
|
2434
2440
|
}, unknown>;
|
|
2441
|
+
/**
|
|
2442
|
+
* Hook to get recommended products for a cart using RPC
|
|
2443
|
+
*
|
|
2444
|
+
* @param cartId - Cart UUID
|
|
2445
|
+
* @param limit - Maximum number of recommendations (default: 6)
|
|
2446
|
+
* @param options - React Query options
|
|
2447
|
+
*
|
|
2448
|
+
* @example
|
|
2449
|
+
* ```tsx
|
|
2450
|
+
* const { data: recommendations, isLoading } = useGetCartRecommendations('cart-123', 6);
|
|
2451
|
+
* console.log(recommendations); // Array of products from same brand
|
|
2452
|
+
* ```
|
|
2453
|
+
*/
|
|
2454
|
+
export declare function useGetCartRecommendations(cartId: string | null | undefined, limit: number, options?: Omit<UseQueryOptions<Awaited<ReturnType<typeof fetchCartRecommendations>>, Error>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
|
|
2455
|
+
brand: {
|
|
2456
|
+
createdAt: string;
|
|
2457
|
+
updatedAt: string;
|
|
2458
|
+
deletedAt: string;
|
|
2459
|
+
id: string;
|
|
2460
|
+
name: string;
|
|
2461
|
+
slug: string;
|
|
2462
|
+
logoUrl: string | null;
|
|
2463
|
+
siteUrl: string;
|
|
2464
|
+
domain: string;
|
|
2465
|
+
metaPixelId: string | null;
|
|
2466
|
+
tiktokPixelId: string | null;
|
|
2467
|
+
paystackPublicKey: string | null;
|
|
2468
|
+
paystackSecretKey: string | null;
|
|
2469
|
+
};
|
|
2470
|
+
variants: {
|
|
2471
|
+
createdAt: string;
|
|
2472
|
+
updatedAt: string;
|
|
2473
|
+
price: number;
|
|
2474
|
+
deletedAt: string;
|
|
2475
|
+
id: string;
|
|
2476
|
+
name: string | null;
|
|
2477
|
+
isActive: boolean;
|
|
2478
|
+
thumbnailUrl: string | null;
|
|
2479
|
+
productId: string;
|
|
2480
|
+
sku: string;
|
|
2481
|
+
trackInventory: boolean;
|
|
2482
|
+
lowStockThreshold: number | null;
|
|
2483
|
+
}[];
|
|
2484
|
+
id: string;
|
|
2485
|
+
name: string;
|
|
2486
|
+
slug: string;
|
|
2487
|
+
createdAt: string;
|
|
2488
|
+
updatedAt: string;
|
|
2489
|
+
deletedAt: string;
|
|
2490
|
+
brandId: string;
|
|
2491
|
+
isActive: boolean;
|
|
2492
|
+
description: string | null;
|
|
2493
|
+
thumbnailUrl: string | null;
|
|
2494
|
+
quantityDiscounts: string | number | boolean | {
|
|
2495
|
+
[x: string]: string | number | boolean | /*elided*/ any | {
|
|
2496
|
+
[x: number]: string | number | boolean | /*elided*/ any | /*elided*/ any;
|
|
2497
|
+
length: number;
|
|
2498
|
+
toString: never;
|
|
2499
|
+
toLocaleString: never;
|
|
2500
|
+
pop: never;
|
|
2501
|
+
push: never;
|
|
2502
|
+
concat: never;
|
|
2503
|
+
join: never;
|
|
2504
|
+
reverse: never;
|
|
2505
|
+
shift: never;
|
|
2506
|
+
slice: never;
|
|
2507
|
+
sort: never;
|
|
2508
|
+
splice: never;
|
|
2509
|
+
unshift: never;
|
|
2510
|
+
indexOf: never;
|
|
2511
|
+
lastIndexOf: never;
|
|
2512
|
+
every: never;
|
|
2513
|
+
some: never;
|
|
2514
|
+
forEach: never;
|
|
2515
|
+
map: never;
|
|
2516
|
+
filter: never;
|
|
2517
|
+
reduce: never;
|
|
2518
|
+
reduceRight: never;
|
|
2519
|
+
find: never;
|
|
2520
|
+
findIndex: never;
|
|
2521
|
+
fill: never;
|
|
2522
|
+
copyWithin: never;
|
|
2523
|
+
entries: never;
|
|
2524
|
+
keys: never;
|
|
2525
|
+
values: never;
|
|
2526
|
+
includes: never;
|
|
2527
|
+
flatMap: never;
|
|
2528
|
+
flat: never;
|
|
2529
|
+
[Symbol.iterator]: never;
|
|
2530
|
+
readonly [Symbol.unscopables]: {
|
|
2531
|
+
[x: number]: boolean;
|
|
2532
|
+
length?: boolean;
|
|
2533
|
+
toString?: boolean;
|
|
2534
|
+
toLocaleString?: boolean;
|
|
2535
|
+
pop?: boolean;
|
|
2536
|
+
push?: boolean;
|
|
2537
|
+
concat?: boolean;
|
|
2538
|
+
join?: boolean;
|
|
2539
|
+
reverse?: boolean;
|
|
2540
|
+
shift?: boolean;
|
|
2541
|
+
slice?: boolean;
|
|
2542
|
+
sort?: boolean;
|
|
2543
|
+
splice?: boolean;
|
|
2544
|
+
unshift?: boolean;
|
|
2545
|
+
indexOf?: boolean;
|
|
2546
|
+
lastIndexOf?: boolean;
|
|
2547
|
+
every?: boolean;
|
|
2548
|
+
some?: boolean;
|
|
2549
|
+
forEach?: boolean;
|
|
2550
|
+
map?: boolean;
|
|
2551
|
+
filter?: boolean;
|
|
2552
|
+
reduce?: boolean;
|
|
2553
|
+
reduceRight?: boolean;
|
|
2554
|
+
find?: boolean;
|
|
2555
|
+
findIndex?: boolean;
|
|
2556
|
+
fill?: boolean;
|
|
2557
|
+
copyWithin?: boolean;
|
|
2558
|
+
entries?: boolean;
|
|
2559
|
+
keys?: boolean;
|
|
2560
|
+
values?: boolean;
|
|
2561
|
+
includes?: boolean;
|
|
2562
|
+
flatMap?: boolean;
|
|
2563
|
+
flat?: boolean;
|
|
2564
|
+
};
|
|
2565
|
+
};
|
|
2566
|
+
} | {
|
|
2567
|
+
[x: number]: string | number | boolean | {
|
|
2568
|
+
[x: string]: string | number | boolean | /*elided*/ any | /*elided*/ any;
|
|
2569
|
+
} | /*elided*/ any;
|
|
2570
|
+
length: number;
|
|
2571
|
+
toString: never;
|
|
2572
|
+
toLocaleString: never;
|
|
2573
|
+
pop: never;
|
|
2574
|
+
push: never;
|
|
2575
|
+
concat: never;
|
|
2576
|
+
join: never;
|
|
2577
|
+
reverse: never;
|
|
2578
|
+
shift: never;
|
|
2579
|
+
slice: never;
|
|
2580
|
+
sort: never;
|
|
2581
|
+
splice: never;
|
|
2582
|
+
unshift: never;
|
|
2583
|
+
indexOf: never;
|
|
2584
|
+
lastIndexOf: never;
|
|
2585
|
+
every: never;
|
|
2586
|
+
some: never;
|
|
2587
|
+
forEach: never;
|
|
2588
|
+
map: never;
|
|
2589
|
+
filter: never;
|
|
2590
|
+
reduce: never;
|
|
2591
|
+
reduceRight: never;
|
|
2592
|
+
find: never;
|
|
2593
|
+
findIndex: never;
|
|
2594
|
+
fill: never;
|
|
2595
|
+
copyWithin: never;
|
|
2596
|
+
entries: never;
|
|
2597
|
+
keys: never;
|
|
2598
|
+
values: never;
|
|
2599
|
+
includes: never;
|
|
2600
|
+
flatMap: never;
|
|
2601
|
+
flat: never;
|
|
2602
|
+
[Symbol.iterator]: never;
|
|
2603
|
+
readonly [Symbol.unscopables]: {
|
|
2604
|
+
[x: number]: boolean;
|
|
2605
|
+
length?: boolean;
|
|
2606
|
+
toString?: boolean;
|
|
2607
|
+
toLocaleString?: boolean;
|
|
2608
|
+
pop?: boolean;
|
|
2609
|
+
push?: boolean;
|
|
2610
|
+
concat?: boolean;
|
|
2611
|
+
join?: boolean;
|
|
2612
|
+
reverse?: boolean;
|
|
2613
|
+
shift?: boolean;
|
|
2614
|
+
slice?: boolean;
|
|
2615
|
+
sort?: boolean;
|
|
2616
|
+
splice?: boolean;
|
|
2617
|
+
unshift?: boolean;
|
|
2618
|
+
indexOf?: boolean;
|
|
2619
|
+
lastIndexOf?: boolean;
|
|
2620
|
+
every?: boolean;
|
|
2621
|
+
some?: boolean;
|
|
2622
|
+
forEach?: boolean;
|
|
2623
|
+
map?: boolean;
|
|
2624
|
+
filter?: boolean;
|
|
2625
|
+
reduce?: boolean;
|
|
2626
|
+
reduceRight?: boolean;
|
|
2627
|
+
find?: boolean;
|
|
2628
|
+
findIndex?: boolean;
|
|
2629
|
+
fill?: boolean;
|
|
2630
|
+
copyWithin?: boolean;
|
|
2631
|
+
entries?: boolean;
|
|
2632
|
+
keys?: boolean;
|
|
2633
|
+
values?: boolean;
|
|
2634
|
+
includes?: boolean;
|
|
2635
|
+
flatMap?: boolean;
|
|
2636
|
+
flat?: boolean;
|
|
2637
|
+
};
|
|
2638
|
+
};
|
|
2639
|
+
}[], Error>;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
|
8
8
|
import { useQueryUnwrapped } from '../use-query-unwrapped';
|
|
9
9
|
import { queryKeys } from '../../utils/query-keys';
|
|
10
|
-
import { fetchCart, updateCart, createCart, addCartItem, updateCartItem, removeCartItem, applyDiscount, removeDiscount, checkoutCart, } from '../../fetchers/carts';
|
|
10
|
+
import { fetchCart, updateCart, createCart, addCartItem, updateCartItem, removeCartItem, applyDiscount, removeDiscount, checkoutCart, fetchCartRecommendations, } from '../../fetchers/carts';
|
|
11
11
|
/**
|
|
12
12
|
* Hook to get cart by ID using RPC
|
|
13
13
|
*
|
|
@@ -122,13 +122,13 @@ export function useRemoveDiscount(cartId, options) {
|
|
|
122
122
|
* @example
|
|
123
123
|
* ```tsx
|
|
124
124
|
* const addItem = useAddCartItem('cart-123');
|
|
125
|
-
* addItem.mutate({ sku: 'PROD-001', quantity: 2, fbc: '_fbc_cookie', fbp: '_fbp_cookie' });
|
|
125
|
+
* addItem.mutate({ sku: 'PROD-001', quantity: 2, fbc: '_fbc_cookie', fbp: '_fbp_cookie', ttp: '_ttp_cookie', ttclid: 'tiktok_click_id' });
|
|
126
126
|
* ```
|
|
127
127
|
*/
|
|
128
128
|
export function useAddCartItem(cartId, options) {
|
|
129
129
|
const queryClient = useQueryClient();
|
|
130
130
|
return useMutation({
|
|
131
|
-
mutationFn: (data) => addCartItem(cartId, data.sku, data.quantity, data.fbc, data.fbp),
|
|
131
|
+
mutationFn: (data) => addCartItem(cartId, data.sku, data.quantity, data.fbc, data.fbp, data.ttp, data.ttclid),
|
|
132
132
|
onSuccess: () => {
|
|
133
133
|
queryClient.invalidateQueries({ queryKey: queryKeys.public.carts.detail(cartId) });
|
|
134
134
|
},
|
|
@@ -211,3 +211,24 @@ export function useCheckoutCart(cartId, options) {
|
|
|
211
211
|
...options,
|
|
212
212
|
});
|
|
213
213
|
}
|
|
214
|
+
/**
|
|
215
|
+
* Hook to get recommended products for a cart using RPC
|
|
216
|
+
*
|
|
217
|
+
* @param cartId - Cart UUID
|
|
218
|
+
* @param limit - Maximum number of recommendations (default: 6)
|
|
219
|
+
* @param options - React Query options
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* ```tsx
|
|
223
|
+
* const { data: recommendations, isLoading } = useGetCartRecommendations('cart-123', 6);
|
|
224
|
+
* console.log(recommendations); // Array of products from same brand
|
|
225
|
+
* ```
|
|
226
|
+
*/
|
|
227
|
+
export function useGetCartRecommendations(cartId, limit, options) {
|
|
228
|
+
return useQueryUnwrapped({
|
|
229
|
+
queryKey: ['carts', cartId, 'recommendations', limit],
|
|
230
|
+
queryFn: () => fetchCartRecommendations(cartId, limit),
|
|
231
|
+
enabled: !!cartId,
|
|
232
|
+
...options,
|
|
233
|
+
});
|
|
234
|
+
}
|
package/dist/rpc-client.d.ts
CHANGED
|
@@ -2707,6 +2707,234 @@ export declare function createRpcClients(baseURL: string): {
|
|
|
2707
2707
|
};
|
|
2708
2708
|
}>;
|
|
2709
2709
|
};
|
|
2710
|
+
} & {
|
|
2711
|
+
":id": {
|
|
2712
|
+
recommendations: import("hono/client").ClientRequest<{
|
|
2713
|
+
$get: {
|
|
2714
|
+
input: {
|
|
2715
|
+
param: {
|
|
2716
|
+
id: string;
|
|
2717
|
+
};
|
|
2718
|
+
};
|
|
2719
|
+
output: {
|
|
2720
|
+
brand: {
|
|
2721
|
+
createdAt: string;
|
|
2722
|
+
updatedAt: string;
|
|
2723
|
+
deletedAt: string;
|
|
2724
|
+
id: string;
|
|
2725
|
+
name: string;
|
|
2726
|
+
slug: string;
|
|
2727
|
+
logoUrl: string | null;
|
|
2728
|
+
siteUrl: string;
|
|
2729
|
+
domain: string;
|
|
2730
|
+
metaPixelId: string | null;
|
|
2731
|
+
tiktokPixelId: string | null;
|
|
2732
|
+
paystackPublicKey: string | null;
|
|
2733
|
+
paystackSecretKey: string | null;
|
|
2734
|
+
};
|
|
2735
|
+
variants: {
|
|
2736
|
+
createdAt: string;
|
|
2737
|
+
updatedAt: string;
|
|
2738
|
+
price: number;
|
|
2739
|
+
deletedAt: string;
|
|
2740
|
+
id: string;
|
|
2741
|
+
name: string | null;
|
|
2742
|
+
isActive: boolean;
|
|
2743
|
+
thumbnailUrl: string | null;
|
|
2744
|
+
productId: string;
|
|
2745
|
+
sku: string;
|
|
2746
|
+
trackInventory: boolean;
|
|
2747
|
+
lowStockThreshold: number | null;
|
|
2748
|
+
}[];
|
|
2749
|
+
id: string;
|
|
2750
|
+
name: string;
|
|
2751
|
+
slug: string;
|
|
2752
|
+
createdAt: string;
|
|
2753
|
+
updatedAt: string;
|
|
2754
|
+
deletedAt: string;
|
|
2755
|
+
brandId: string;
|
|
2756
|
+
isActive: boolean;
|
|
2757
|
+
description: string | null;
|
|
2758
|
+
thumbnailUrl: string | null;
|
|
2759
|
+
quantityDiscounts: string | number | boolean | {
|
|
2760
|
+
[x: string]: string | number | boolean | /*elided*/ any | {
|
|
2761
|
+
[x: number]: string | number | boolean | /*elided*/ any | /*elided*/ any;
|
|
2762
|
+
length: number;
|
|
2763
|
+
toString: never;
|
|
2764
|
+
toLocaleString: never;
|
|
2765
|
+
pop: never;
|
|
2766
|
+
push: never;
|
|
2767
|
+
concat: never;
|
|
2768
|
+
join: never;
|
|
2769
|
+
reverse: never;
|
|
2770
|
+
shift: never;
|
|
2771
|
+
slice: never;
|
|
2772
|
+
sort: never;
|
|
2773
|
+
splice: never;
|
|
2774
|
+
unshift: never;
|
|
2775
|
+
indexOf: never;
|
|
2776
|
+
lastIndexOf: never;
|
|
2777
|
+
every: never;
|
|
2778
|
+
some: never;
|
|
2779
|
+
forEach: never;
|
|
2780
|
+
map: never;
|
|
2781
|
+
filter: never;
|
|
2782
|
+
reduce: never;
|
|
2783
|
+
reduceRight: never;
|
|
2784
|
+
find: never;
|
|
2785
|
+
findIndex: never;
|
|
2786
|
+
fill: never;
|
|
2787
|
+
copyWithin: never;
|
|
2788
|
+
entries: never;
|
|
2789
|
+
keys: never;
|
|
2790
|
+
values: never;
|
|
2791
|
+
includes: never;
|
|
2792
|
+
flatMap: never;
|
|
2793
|
+
flat: never;
|
|
2794
|
+
[Symbol.iterator]: never;
|
|
2795
|
+
readonly [Symbol.unscopables]: {
|
|
2796
|
+
[x: number]: boolean;
|
|
2797
|
+
length?: boolean;
|
|
2798
|
+
toString?: boolean;
|
|
2799
|
+
toLocaleString?: boolean;
|
|
2800
|
+
pop?: boolean;
|
|
2801
|
+
push?: boolean;
|
|
2802
|
+
concat?: boolean;
|
|
2803
|
+
join?: boolean;
|
|
2804
|
+
reverse?: boolean;
|
|
2805
|
+
shift?: boolean;
|
|
2806
|
+
slice?: boolean;
|
|
2807
|
+
sort?: boolean;
|
|
2808
|
+
splice?: boolean;
|
|
2809
|
+
unshift?: boolean;
|
|
2810
|
+
indexOf?: boolean;
|
|
2811
|
+
lastIndexOf?: boolean;
|
|
2812
|
+
every?: boolean;
|
|
2813
|
+
some?: boolean;
|
|
2814
|
+
forEach?: boolean;
|
|
2815
|
+
map?: boolean;
|
|
2816
|
+
filter?: boolean;
|
|
2817
|
+
reduce?: boolean;
|
|
2818
|
+
reduceRight?: boolean;
|
|
2819
|
+
find?: boolean;
|
|
2820
|
+
findIndex?: boolean;
|
|
2821
|
+
fill?: boolean;
|
|
2822
|
+
copyWithin?: boolean;
|
|
2823
|
+
entries?: boolean;
|
|
2824
|
+
keys?: boolean;
|
|
2825
|
+
values?: boolean;
|
|
2826
|
+
includes?: boolean;
|
|
2827
|
+
flatMap?: boolean;
|
|
2828
|
+
flat?: boolean;
|
|
2829
|
+
};
|
|
2830
|
+
};
|
|
2831
|
+
} | {
|
|
2832
|
+
[x: number]: string | number | boolean | {
|
|
2833
|
+
[x: string]: string | number | boolean | /*elided*/ any | /*elided*/ any;
|
|
2834
|
+
} | /*elided*/ any;
|
|
2835
|
+
length: number;
|
|
2836
|
+
toString: never;
|
|
2837
|
+
toLocaleString: never;
|
|
2838
|
+
pop: never;
|
|
2839
|
+
push: never;
|
|
2840
|
+
concat: never;
|
|
2841
|
+
join: never;
|
|
2842
|
+
reverse: never;
|
|
2843
|
+
shift: never;
|
|
2844
|
+
slice: never;
|
|
2845
|
+
sort: never;
|
|
2846
|
+
splice: never;
|
|
2847
|
+
unshift: never;
|
|
2848
|
+
indexOf: never;
|
|
2849
|
+
lastIndexOf: never;
|
|
2850
|
+
every: never;
|
|
2851
|
+
some: never;
|
|
2852
|
+
forEach: never;
|
|
2853
|
+
map: never;
|
|
2854
|
+
filter: never;
|
|
2855
|
+
reduce: never;
|
|
2856
|
+
reduceRight: never;
|
|
2857
|
+
find: never;
|
|
2858
|
+
findIndex: never;
|
|
2859
|
+
fill: never;
|
|
2860
|
+
copyWithin: never;
|
|
2861
|
+
entries: never;
|
|
2862
|
+
keys: never;
|
|
2863
|
+
values: never;
|
|
2864
|
+
includes: never;
|
|
2865
|
+
flatMap: never;
|
|
2866
|
+
flat: never;
|
|
2867
|
+
[Symbol.iterator]: never;
|
|
2868
|
+
readonly [Symbol.unscopables]: {
|
|
2869
|
+
[x: number]: boolean;
|
|
2870
|
+
length?: boolean;
|
|
2871
|
+
toString?: boolean;
|
|
2872
|
+
toLocaleString?: boolean;
|
|
2873
|
+
pop?: boolean;
|
|
2874
|
+
push?: boolean;
|
|
2875
|
+
concat?: boolean;
|
|
2876
|
+
join?: boolean;
|
|
2877
|
+
reverse?: boolean;
|
|
2878
|
+
shift?: boolean;
|
|
2879
|
+
slice?: boolean;
|
|
2880
|
+
sort?: boolean;
|
|
2881
|
+
splice?: boolean;
|
|
2882
|
+
unshift?: boolean;
|
|
2883
|
+
indexOf?: boolean;
|
|
2884
|
+
lastIndexOf?: boolean;
|
|
2885
|
+
every?: boolean;
|
|
2886
|
+
some?: boolean;
|
|
2887
|
+
forEach?: boolean;
|
|
2888
|
+
map?: boolean;
|
|
2889
|
+
filter?: boolean;
|
|
2890
|
+
reduce?: boolean;
|
|
2891
|
+
reduceRight?: boolean;
|
|
2892
|
+
find?: boolean;
|
|
2893
|
+
findIndex?: boolean;
|
|
2894
|
+
fill?: boolean;
|
|
2895
|
+
copyWithin?: boolean;
|
|
2896
|
+
entries?: boolean;
|
|
2897
|
+
keys?: boolean;
|
|
2898
|
+
values?: boolean;
|
|
2899
|
+
includes?: boolean;
|
|
2900
|
+
flatMap?: boolean;
|
|
2901
|
+
flat?: boolean;
|
|
2902
|
+
};
|
|
2903
|
+
};
|
|
2904
|
+
}[];
|
|
2905
|
+
outputFormat: "json";
|
|
2906
|
+
status: 200;
|
|
2907
|
+
} | {
|
|
2908
|
+
input: {
|
|
2909
|
+
param: {
|
|
2910
|
+
id: string;
|
|
2911
|
+
};
|
|
2912
|
+
};
|
|
2913
|
+
output: {
|
|
2914
|
+
error: {
|
|
2915
|
+
code: string;
|
|
2916
|
+
message: string;
|
|
2917
|
+
};
|
|
2918
|
+
};
|
|
2919
|
+
outputFormat: "json";
|
|
2920
|
+
status: any;
|
|
2921
|
+
} | {
|
|
2922
|
+
input: {
|
|
2923
|
+
param: {
|
|
2924
|
+
id: string;
|
|
2925
|
+
};
|
|
2926
|
+
};
|
|
2927
|
+
output: {
|
|
2928
|
+
error: {
|
|
2929
|
+
code: string;
|
|
2930
|
+
message: any;
|
|
2931
|
+
};
|
|
2932
|
+
};
|
|
2933
|
+
outputFormat: "json";
|
|
2934
|
+
status: 500;
|
|
2935
|
+
};
|
|
2936
|
+
}>;
|
|
2937
|
+
};
|
|
2710
2938
|
};
|
|
2711
2939
|
orders: {
|
|
2712
2940
|
":id": {
|
|
@@ -8269,10 +8497,23 @@ export declare function createAdminRpcClients(baseURL: string): {
|
|
|
8269
8497
|
output: {
|
|
8270
8498
|
overview: {
|
|
8271
8499
|
totalOrders: number;
|
|
8500
|
+
totalOrdersChange: number;
|
|
8501
|
+
totalOrdersPrevious: number;
|
|
8272
8502
|
pendingOrders: number;
|
|
8503
|
+
pendingOrdersChange: number;
|
|
8504
|
+
pendingOrdersPrevious: number;
|
|
8273
8505
|
shippedOrders: number;
|
|
8506
|
+
shippedOrdersChange: number;
|
|
8507
|
+
shippedOrdersPrevious: number;
|
|
8274
8508
|
deliveredOrders: number;
|
|
8275
|
-
|
|
8509
|
+
deliveredOrdersChange: number;
|
|
8510
|
+
deliveredOrdersPrevious: number;
|
|
8511
|
+
realizedRevenue: number;
|
|
8512
|
+
realizedRevenueChange: number;
|
|
8513
|
+
realizedRevenuePrevious: number;
|
|
8514
|
+
unrealizedRevenue: number;
|
|
8515
|
+
unrealizedRevenueChange: number;
|
|
8516
|
+
unrealizedRevenuePrevious: number;
|
|
8276
8517
|
};
|
|
8277
8518
|
recentOrders: {
|
|
8278
8519
|
subtotal: number;
|
|
@@ -74,7 +74,7 @@ export declare const queryKeys: {
|
|
|
74
74
|
};
|
|
75
75
|
stats: {
|
|
76
76
|
all: readonly ["admin", "stats"];
|
|
77
|
-
overview: (brandId?: string) => readonly ["admin", "stats", "overview", string];
|
|
77
|
+
overview: (brandId?: string, period?: string) => readonly ["admin", "stats", "overview", string, string];
|
|
78
78
|
};
|
|
79
79
|
abandonedCarts: {
|
|
80
80
|
all: readonly ["admin", "abandoned-carts"];
|
package/dist/utils/query-keys.js
CHANGED
|
@@ -76,7 +76,7 @@ export const queryKeys = {
|
|
|
76
76
|
},
|
|
77
77
|
stats: {
|
|
78
78
|
all: ['admin', 'stats'],
|
|
79
|
-
overview: (brandId) => ['admin', 'stats', 'overview', brandId],
|
|
79
|
+
overview: (brandId, period) => ['admin', 'stats', 'overview', brandId, period],
|
|
80
80
|
},
|
|
81
81
|
abandonedCarts: {
|
|
82
82
|
all: ['admin', 'abandoned-carts'],
|