@instockng/api-client 1.0.17 → 1.0.19
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 +198 -0
- package/dist/fetchers/carts.js +19 -0
- package/dist/hooks/admin/stats.d.ts +15 -1
- package/dist/hooks/admin/stats.js +3 -1
- package/dist/hooks/public/carts.d.ts +202 -1
- package/dist/hooks/public/carts.js +29 -2
- package/dist/rpc-client.d.ts +242 -1
- package/dist/utils/query-keys.d.ts +2 -1
- package/dist/utils/query-keys.js +4 -1
- package/package.json +1 -1
package/dist/fetchers/carts.d.ts
CHANGED
|
@@ -2366,3 +2366,201 @@ export declare function checkoutCart(cartId: string, checkoutData: {
|
|
|
2366
2366
|
prospectReason: import("@prisma/client").$Enums.ProspectReason | null;
|
|
2367
2367
|
userActionToken: string;
|
|
2368
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
|
@@ -174,3 +174,22 @@ export async function checkoutCart(cartId, checkoutData) {
|
|
|
174
174
|
}
|
|
175
175
|
return res.json();
|
|
176
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
|
*
|
|
@@ -1353,6 +1353,7 @@ export declare function useAddCartItem(cartId: string, options?: UseMutationOpti
|
|
|
1353
1353
|
fbp?: string;
|
|
1354
1354
|
ttp?: string;
|
|
1355
1355
|
ttclid?: string;
|
|
1356
|
+
refreshRecommendations?: boolean;
|
|
1356
1357
|
}>): import("@tanstack/react-query").UseMutationResult<{
|
|
1357
1358
|
id: string;
|
|
1358
1359
|
brand: {
|
|
@@ -1612,6 +1613,7 @@ export declare function useAddCartItem(cartId: string, options?: UseMutationOpti
|
|
|
1612
1613
|
fbp?: string;
|
|
1613
1614
|
ttp?: string;
|
|
1614
1615
|
ttclid?: string;
|
|
1616
|
+
refreshRecommendations?: boolean;
|
|
1615
1617
|
}, unknown>;
|
|
1616
1618
|
/**
|
|
1617
1619
|
* Hook to update cart item quantity using RPC
|
|
@@ -2438,3 +2440,202 @@ export declare function useCheckoutCart(cartId: string, options?: UseMutationOpt
|
|
|
2438
2440
|
ttp?: string;
|
|
2439
2441
|
ttclid?: string;
|
|
2440
2442
|
}, unknown>;
|
|
2443
|
+
/**
|
|
2444
|
+
* Hook to get recommended products for a cart using RPC
|
|
2445
|
+
*
|
|
2446
|
+
* @param cartId - Cart UUID
|
|
2447
|
+
* @param limit - Maximum number of recommendations (default: 6)
|
|
2448
|
+
* @param options - React Query options
|
|
2449
|
+
*
|
|
2450
|
+
* @example
|
|
2451
|
+
* ```tsx
|
|
2452
|
+
* const { data: recommendations, isLoading } = useGetCartRecommendations('cart-123', 6);
|
|
2453
|
+
* console.log(recommendations); // Array of products from same brand
|
|
2454
|
+
* ```
|
|
2455
|
+
*/
|
|
2456
|
+
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<{
|
|
2457
|
+
brand: {
|
|
2458
|
+
createdAt: string;
|
|
2459
|
+
updatedAt: string;
|
|
2460
|
+
deletedAt: string;
|
|
2461
|
+
id: string;
|
|
2462
|
+
name: string;
|
|
2463
|
+
slug: string;
|
|
2464
|
+
logoUrl: string | null;
|
|
2465
|
+
siteUrl: string;
|
|
2466
|
+
domain: string;
|
|
2467
|
+
metaPixelId: string | null;
|
|
2468
|
+
tiktokPixelId: string | null;
|
|
2469
|
+
paystackPublicKey: string | null;
|
|
2470
|
+
paystackSecretKey: string | null;
|
|
2471
|
+
};
|
|
2472
|
+
variants: {
|
|
2473
|
+
createdAt: string;
|
|
2474
|
+
updatedAt: string;
|
|
2475
|
+
price: number;
|
|
2476
|
+
deletedAt: string;
|
|
2477
|
+
id: string;
|
|
2478
|
+
name: string | null;
|
|
2479
|
+
isActive: boolean;
|
|
2480
|
+
thumbnailUrl: string | null;
|
|
2481
|
+
productId: string;
|
|
2482
|
+
sku: string;
|
|
2483
|
+
trackInventory: boolean;
|
|
2484
|
+
lowStockThreshold: number | null;
|
|
2485
|
+
}[];
|
|
2486
|
+
id: string;
|
|
2487
|
+
name: string;
|
|
2488
|
+
slug: string;
|
|
2489
|
+
createdAt: string;
|
|
2490
|
+
updatedAt: string;
|
|
2491
|
+
deletedAt: string;
|
|
2492
|
+
brandId: string;
|
|
2493
|
+
isActive: boolean;
|
|
2494
|
+
description: string | null;
|
|
2495
|
+
thumbnailUrl: string | null;
|
|
2496
|
+
quantityDiscounts: string | number | boolean | {
|
|
2497
|
+
[x: string]: string | number | boolean | /*elided*/ any | {
|
|
2498
|
+
[x: number]: string | number | boolean | /*elided*/ any | /*elided*/ any;
|
|
2499
|
+
length: number;
|
|
2500
|
+
toString: never;
|
|
2501
|
+
toLocaleString: never;
|
|
2502
|
+
pop: never;
|
|
2503
|
+
push: never;
|
|
2504
|
+
concat: never;
|
|
2505
|
+
join: never;
|
|
2506
|
+
reverse: never;
|
|
2507
|
+
shift: never;
|
|
2508
|
+
slice: never;
|
|
2509
|
+
sort: never;
|
|
2510
|
+
splice: never;
|
|
2511
|
+
unshift: never;
|
|
2512
|
+
indexOf: never;
|
|
2513
|
+
lastIndexOf: never;
|
|
2514
|
+
every: never;
|
|
2515
|
+
some: never;
|
|
2516
|
+
forEach: never;
|
|
2517
|
+
map: never;
|
|
2518
|
+
filter: never;
|
|
2519
|
+
reduce: never;
|
|
2520
|
+
reduceRight: never;
|
|
2521
|
+
find: never;
|
|
2522
|
+
findIndex: never;
|
|
2523
|
+
fill: never;
|
|
2524
|
+
copyWithin: never;
|
|
2525
|
+
entries: never;
|
|
2526
|
+
keys: never;
|
|
2527
|
+
values: never;
|
|
2528
|
+
includes: never;
|
|
2529
|
+
flatMap: never;
|
|
2530
|
+
flat: never;
|
|
2531
|
+
[Symbol.iterator]: never;
|
|
2532
|
+
readonly [Symbol.unscopables]: {
|
|
2533
|
+
[x: number]: boolean;
|
|
2534
|
+
length?: boolean;
|
|
2535
|
+
toString?: boolean;
|
|
2536
|
+
toLocaleString?: boolean;
|
|
2537
|
+
pop?: boolean;
|
|
2538
|
+
push?: boolean;
|
|
2539
|
+
concat?: boolean;
|
|
2540
|
+
join?: boolean;
|
|
2541
|
+
reverse?: boolean;
|
|
2542
|
+
shift?: boolean;
|
|
2543
|
+
slice?: boolean;
|
|
2544
|
+
sort?: boolean;
|
|
2545
|
+
splice?: boolean;
|
|
2546
|
+
unshift?: boolean;
|
|
2547
|
+
indexOf?: boolean;
|
|
2548
|
+
lastIndexOf?: boolean;
|
|
2549
|
+
every?: boolean;
|
|
2550
|
+
some?: boolean;
|
|
2551
|
+
forEach?: boolean;
|
|
2552
|
+
map?: boolean;
|
|
2553
|
+
filter?: boolean;
|
|
2554
|
+
reduce?: boolean;
|
|
2555
|
+
reduceRight?: boolean;
|
|
2556
|
+
find?: boolean;
|
|
2557
|
+
findIndex?: boolean;
|
|
2558
|
+
fill?: boolean;
|
|
2559
|
+
copyWithin?: boolean;
|
|
2560
|
+
entries?: boolean;
|
|
2561
|
+
keys?: boolean;
|
|
2562
|
+
values?: boolean;
|
|
2563
|
+
includes?: boolean;
|
|
2564
|
+
flatMap?: boolean;
|
|
2565
|
+
flat?: boolean;
|
|
2566
|
+
};
|
|
2567
|
+
};
|
|
2568
|
+
} | {
|
|
2569
|
+
[x: number]: string | number | boolean | {
|
|
2570
|
+
[x: string]: string | number | boolean | /*elided*/ any | /*elided*/ any;
|
|
2571
|
+
} | /*elided*/ any;
|
|
2572
|
+
length: number;
|
|
2573
|
+
toString: never;
|
|
2574
|
+
toLocaleString: never;
|
|
2575
|
+
pop: never;
|
|
2576
|
+
push: never;
|
|
2577
|
+
concat: never;
|
|
2578
|
+
join: never;
|
|
2579
|
+
reverse: never;
|
|
2580
|
+
shift: never;
|
|
2581
|
+
slice: never;
|
|
2582
|
+
sort: never;
|
|
2583
|
+
splice: never;
|
|
2584
|
+
unshift: never;
|
|
2585
|
+
indexOf: never;
|
|
2586
|
+
lastIndexOf: never;
|
|
2587
|
+
every: never;
|
|
2588
|
+
some: never;
|
|
2589
|
+
forEach: never;
|
|
2590
|
+
map: never;
|
|
2591
|
+
filter: never;
|
|
2592
|
+
reduce: never;
|
|
2593
|
+
reduceRight: never;
|
|
2594
|
+
find: never;
|
|
2595
|
+
findIndex: never;
|
|
2596
|
+
fill: never;
|
|
2597
|
+
copyWithin: never;
|
|
2598
|
+
entries: never;
|
|
2599
|
+
keys: never;
|
|
2600
|
+
values: never;
|
|
2601
|
+
includes: never;
|
|
2602
|
+
flatMap: never;
|
|
2603
|
+
flat: never;
|
|
2604
|
+
[Symbol.iterator]: never;
|
|
2605
|
+
readonly [Symbol.unscopables]: {
|
|
2606
|
+
[x: number]: boolean;
|
|
2607
|
+
length?: boolean;
|
|
2608
|
+
toString?: boolean;
|
|
2609
|
+
toLocaleString?: boolean;
|
|
2610
|
+
pop?: boolean;
|
|
2611
|
+
push?: boolean;
|
|
2612
|
+
concat?: boolean;
|
|
2613
|
+
join?: boolean;
|
|
2614
|
+
reverse?: boolean;
|
|
2615
|
+
shift?: boolean;
|
|
2616
|
+
slice?: boolean;
|
|
2617
|
+
sort?: boolean;
|
|
2618
|
+
splice?: boolean;
|
|
2619
|
+
unshift?: boolean;
|
|
2620
|
+
indexOf?: boolean;
|
|
2621
|
+
lastIndexOf?: boolean;
|
|
2622
|
+
every?: boolean;
|
|
2623
|
+
some?: boolean;
|
|
2624
|
+
forEach?: boolean;
|
|
2625
|
+
map?: boolean;
|
|
2626
|
+
filter?: boolean;
|
|
2627
|
+
reduce?: boolean;
|
|
2628
|
+
reduceRight?: boolean;
|
|
2629
|
+
find?: boolean;
|
|
2630
|
+
findIndex?: boolean;
|
|
2631
|
+
fill?: boolean;
|
|
2632
|
+
copyWithin?: boolean;
|
|
2633
|
+
entries?: boolean;
|
|
2634
|
+
keys?: boolean;
|
|
2635
|
+
values?: boolean;
|
|
2636
|
+
includes?: boolean;
|
|
2637
|
+
flatMap?: boolean;
|
|
2638
|
+
flat?: boolean;
|
|
2639
|
+
};
|
|
2640
|
+
};
|
|
2641
|
+
}[], 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
|
*
|
|
@@ -129,8 +129,12 @@ export function useAddCartItem(cartId, options) {
|
|
|
129
129
|
const queryClient = useQueryClient();
|
|
130
130
|
return useMutation({
|
|
131
131
|
mutationFn: (data) => addCartItem(cartId, data.sku, data.quantity, data.fbc, data.fbp, data.ttp, data.ttclid),
|
|
132
|
-
onSuccess: () => {
|
|
132
|
+
onSuccess: (_, variables) => {
|
|
133
133
|
queryClient.invalidateQueries({ queryKey: queryKeys.public.carts.detail(cartId) });
|
|
134
|
+
// Refresh recommendations only if cart is not visible (refreshRecommendations flag is true)
|
|
135
|
+
if (variables.refreshRecommendations) {
|
|
136
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.public.carts.recommendations(cartId) });
|
|
137
|
+
}
|
|
134
138
|
},
|
|
135
139
|
...options,
|
|
136
140
|
});
|
|
@@ -175,6 +179,8 @@ export function useRemoveCartItem(cartId, options) {
|
|
|
175
179
|
mutationFn: (itemId) => removeCartItem(cartId, itemId),
|
|
176
180
|
onSuccess: () => {
|
|
177
181
|
queryClient.invalidateQueries({ queryKey: queryKeys.public.carts.detail(cartId) });
|
|
182
|
+
// Refresh recommendations when item is removed
|
|
183
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.public.carts.recommendations(cartId) });
|
|
178
184
|
},
|
|
179
185
|
...options,
|
|
180
186
|
});
|
|
@@ -211,3 +217,24 @@ export function useCheckoutCart(cartId, options) {
|
|
|
211
217
|
...options,
|
|
212
218
|
});
|
|
213
219
|
}
|
|
220
|
+
/**
|
|
221
|
+
* Hook to get recommended products for a cart using RPC
|
|
222
|
+
*
|
|
223
|
+
* @param cartId - Cart UUID
|
|
224
|
+
* @param limit - Maximum number of recommendations (default: 6)
|
|
225
|
+
* @param options - React Query options
|
|
226
|
+
*
|
|
227
|
+
* @example
|
|
228
|
+
* ```tsx
|
|
229
|
+
* const { data: recommendations, isLoading } = useGetCartRecommendations('cart-123', 6);
|
|
230
|
+
* console.log(recommendations); // Array of products from same brand
|
|
231
|
+
* ```
|
|
232
|
+
*/
|
|
233
|
+
export function useGetCartRecommendations(cartId, limit, options) {
|
|
234
|
+
return useQueryUnwrapped({
|
|
235
|
+
queryKey: cartId ? queryKeys.public.carts.recommendations(cartId, limit) : ['public', 'carts', 'recommendations'],
|
|
236
|
+
queryFn: () => fetchCartRecommendations(cartId, limit),
|
|
237
|
+
enabled: !!cartId,
|
|
238
|
+
...options,
|
|
239
|
+
});
|
|
240
|
+
}
|
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;
|
|
@@ -12,6 +12,7 @@ export declare const queryKeys: {
|
|
|
12
12
|
carts: {
|
|
13
13
|
all: readonly ["public", "carts"];
|
|
14
14
|
detail: (id: string) => readonly ["public", "carts", string];
|
|
15
|
+
recommendations: (id: string, limit?: number) => readonly ["public", "carts", string, "recommendations", number] | readonly ["public", "carts", string, "recommendations"];
|
|
15
16
|
};
|
|
16
17
|
orders: {
|
|
17
18
|
all: readonly ["public", "orders"];
|
|
@@ -74,7 +75,7 @@ export declare const queryKeys: {
|
|
|
74
75
|
};
|
|
75
76
|
stats: {
|
|
76
77
|
all: readonly ["admin", "stats"];
|
|
77
|
-
overview: (brandId?: string) => readonly ["admin", "stats", "overview", string];
|
|
78
|
+
overview: (brandId?: string, period?: string) => readonly ["admin", "stats", "overview", string, string];
|
|
78
79
|
};
|
|
79
80
|
abandonedCarts: {
|
|
80
81
|
all: readonly ["admin", "abandoned-carts"];
|
package/dist/utils/query-keys.js
CHANGED
|
@@ -13,6 +13,9 @@ export const queryKeys = {
|
|
|
13
13
|
carts: {
|
|
14
14
|
all: ['public', 'carts'],
|
|
15
15
|
detail: (id) => ['public', 'carts', id],
|
|
16
|
+
recommendations: (id, limit) => limit !== undefined
|
|
17
|
+
? ['public', 'carts', id, 'recommendations', limit]
|
|
18
|
+
: ['public', 'carts', id, 'recommendations'],
|
|
16
19
|
},
|
|
17
20
|
orders: {
|
|
18
21
|
all: ['public', 'orders'],
|
|
@@ -76,7 +79,7 @@ export const queryKeys = {
|
|
|
76
79
|
},
|
|
77
80
|
stats: {
|
|
78
81
|
all: ['admin', 'stats'],
|
|
79
|
-
overview: (brandId) => ['admin', 'stats', 'overview', brandId],
|
|
82
|
+
overview: (brandId, period) => ['admin', 'stats', 'overview', brandId, period],
|
|
80
83
|
},
|
|
81
84
|
abandonedCarts: {
|
|
82
85
|
all: ['admin', 'abandoned-carts'],
|