@instockng/api-client 1.0.6 → 1.0.8
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/apps/backend/src/generated/zod/index.d.ts +1114 -0
- package/dist/apps/backend/src/generated/zod/index.js +670 -0
- package/dist/apps/backend/src/http-app.d.ts +40 -0
- package/dist/apps/backend/src/http-app.js +134 -0
- package/dist/apps/backend/src/lib/brand-response.d.ts +14 -0
- package/dist/apps/backend/src/lib/brand-response.js +8 -0
- package/dist/apps/backend/src/lib/cart-helpers.d.ts +282 -0
- package/dist/apps/backend/src/lib/cart-helpers.js +121 -0
- package/dist/apps/backend/src/lib/cart-recovery.d.ts +30 -0
- package/dist/apps/backend/src/lib/cart-recovery.js +147 -0
- package/dist/apps/backend/src/lib/cart-response.d.ts +121 -0
- package/dist/apps/backend/src/lib/cart-response.js +150 -0
- package/dist/apps/backend/src/lib/clerk.d.ts +18 -0
- package/dist/apps/backend/src/lib/clerk.js +190 -0
- package/dist/apps/backend/src/lib/delivery-zone-response.d.ts +64 -0
- package/dist/apps/backend/src/lib/delivery-zone-response.js +24 -0
- package/dist/apps/backend/src/lib/discount-code-response.d.ts +42 -0
- package/dist/apps/backend/src/lib/discount-code-response.js +19 -0
- package/dist/apps/backend/src/lib/discount.d.ts +20 -0
- package/dist/apps/backend/src/lib/discount.js +35 -0
- package/dist/apps/backend/src/lib/inventory.d.ts +26 -0
- package/dist/apps/backend/src/lib/inventory.js +160 -0
- package/dist/apps/backend/src/lib/meta-capi.d.ts +53 -0
- package/dist/apps/backend/src/lib/meta-capi.js +151 -0
- package/dist/apps/backend/src/lib/openapi.d.ts +36 -0
- package/dist/apps/backend/src/lib/openapi.js +69 -0
- package/dist/apps/backend/src/lib/order-recovery.d.ts +459 -0
- package/dist/apps/backend/src/lib/order-recovery.js +378 -0
- package/dist/apps/backend/src/lib/order-response.d.ts +138 -0
- package/dist/apps/backend/src/lib/order-response.js +61 -0
- package/dist/apps/backend/src/lib/pricing.d.ts +39 -0
- package/dist/apps/backend/src/lib/pricing.js +62 -0
- package/dist/apps/backend/src/lib/prisma.d.ts +9 -0
- package/dist/apps/backend/src/lib/prisma.js +30 -0
- package/dist/apps/backend/src/lib/product-response.d.ts +82 -0
- package/dist/apps/backend/src/lib/product-response.js +29 -0
- package/dist/apps/backend/src/lib/sentry.d.ts +48 -0
- package/dist/apps/backend/src/lib/sentry.js +180 -0
- package/dist/apps/backend/src/lib/utils.d.ts +32 -0
- package/dist/apps/backend/src/lib/utils.js +63 -0
- package/dist/apps/backend/src/middleware/clerk-auth.d.ts +8 -0
- package/dist/apps/backend/src/middleware/clerk-auth.js +89 -0
- package/dist/apps/backend/src/middleware/cors.d.ts +8 -0
- package/dist/apps/backend/src/middleware/cors.js +11 -0
- package/dist/apps/backend/src/notifications/producers/meta-capi-producer.d.ts +62 -0
- package/dist/apps/backend/src/notifications/producers/meta-capi-producer.js +180 -0
- package/dist/apps/backend/src/notifications/producers/order-notification.d.ts +9 -0
- package/dist/apps/backend/src/notifications/producers/order-notification.js +18 -0
- package/dist/apps/backend/src/notifications/producers/prospect-recovery-notification.d.ts +10 -0
- package/dist/apps/backend/src/notifications/producers/prospect-recovery-notification.js +11 -0
- package/dist/apps/backend/src/routes/admin/abandoned-carts.d.ts +605 -0
- package/dist/apps/backend/src/routes/admin/abandoned-carts.js +194 -0
- package/dist/apps/backend/src/routes/admin/brands.d.ts +175 -0
- package/dist/apps/backend/src/routes/admin/brands.js +118 -0
- package/dist/apps/backend/src/routes/admin/customers.d.ts +308 -0
- package/dist/apps/backend/src/routes/admin/customers.js +39 -0
- package/dist/apps/backend/src/routes/admin/delivery-zones.d.ts +446 -0
- package/dist/apps/backend/src/routes/admin/delivery-zones.js +300 -0
- package/dist/apps/backend/src/routes/admin/discount-codes.d.ts +478 -0
- package/dist/apps/backend/src/routes/admin/discount-codes.js +418 -0
- package/dist/apps/backend/src/routes/admin/inventory.d.ts +273 -0
- package/dist/apps/backend/src/routes/admin/inventory.js +199 -0
- package/dist/apps/backend/src/routes/admin/orders.d.ts +1780 -0
- package/dist/apps/backend/src/routes/admin/orders.js +552 -0
- package/dist/apps/backend/src/routes/admin/products.d.ts +860 -0
- package/dist/apps/backend/src/routes/admin/products.js +126 -0
- package/dist/apps/backend/src/routes/admin/stats.d.ts +290 -0
- package/dist/apps/backend/src/routes/admin/stats.js +55 -0
- package/dist/apps/backend/src/routes/admin/variants.d.ts +239 -0
- package/dist/apps/backend/src/routes/admin/variants.js +197 -0
- package/dist/apps/backend/src/routes/admin/warehouses.d.ts +373 -0
- package/dist/apps/backend/src/routes/admin/warehouses.js +123 -0
- package/dist/apps/backend/src/routes/public/brands.d.ts +40 -0
- package/dist/apps/backend/src/routes/public/brands.js +38 -0
- package/dist/apps/backend/src/routes/public/carts.d.ts +2657 -0
- package/dist/apps/backend/src/routes/public/carts.js +778 -0
- package/dist/apps/backend/src/routes/public/delivery-zones.d.ts +37 -0
- package/dist/apps/backend/src/routes/public/delivery-zones.js +64 -0
- package/dist/apps/backend/src/routes/public/orders.d.ts +609 -0
- package/dist/apps/backend/src/routes/public/orders.js +184 -0
- package/dist/apps/backend/src/routes/public/products.d.ts +449 -0
- package/dist/apps/backend/src/routes/public/products.js +133 -0
- package/dist/apps/backend/src/types/index.d.ts +43 -0
- package/dist/apps/backend/src/types/index.js +2 -0
- package/dist/apps/backend/src/validators/brand.d.ts +17 -0
- package/dist/apps/backend/src/validators/brand.js +15 -0
- package/dist/apps/backend/src/validators/delivery-zone.d.ts +35 -0
- package/dist/apps/backend/src/validators/delivery-zone.js +55 -0
- package/dist/apps/backend/src/validators/discount-code.d.ts +74 -0
- package/dist/apps/backend/src/validators/discount-code.js +50 -0
- package/dist/apps/backend/src/validators/inventory.d.ts +20 -0
- package/dist/apps/backend/src/validators/inventory.js +15 -0
- package/dist/apps/backend/src/validators/order.d.ts +58 -0
- package/dist/apps/backend/src/validators/order.js +62 -0
- package/dist/apps/backend/src/validators/product.d.ts +18 -0
- package/dist/apps/backend/src/validators/product.js +19 -0
- package/dist/apps/backend/src/validators/variant.d.ts +19 -0
- package/dist/apps/backend/src/validators/variant.js +19 -0
- package/dist/apps/backend/src/validators/warehouse.d.ts +15 -0
- package/dist/apps/backend/src/validators/warehouse.js +15 -0
- package/dist/fetchers/orders.d.ts +258 -1
- package/dist/hooks/admin/orders.d.ts +285 -3
- package/dist/hooks/admin/orders.js +7 -4
- package/dist/hooks/public/orders.d.ts +258 -1
- package/dist/packages/api-client/src/backend-types.d.ts +10 -0
- package/dist/packages/api-client/src/backend-types.js +10 -0
- package/dist/packages/api-client/src/client.d.ts +20 -0
- package/dist/packages/api-client/src/client.js +40 -0
- package/dist/packages/api-client/src/enum-types.d.ts +8 -0
- package/dist/packages/api-client/src/enum-types.js +5 -0
- package/dist/packages/api-client/src/fetchers/brands.d.ts +25 -0
- package/dist/packages/api-client/src/fetchers/brands.js +26 -0
- package/dist/packages/api-client/src/fetchers/carts.d.ts +2337 -0
- package/dist/packages/api-client/src/fetchers/carts.js +174 -0
- package/dist/packages/api-client/src/fetchers/delivery-zones.d.ts +30 -0
- package/dist/packages/api-client/src/fetchers/delivery-zones.js +26 -0
- package/dist/packages/api-client/src/fetchers/index.d.ts +22 -0
- package/dist/packages/api-client/src/fetchers/index.js +22 -0
- package/dist/packages/api-client/src/fetchers/orders.d.ts +544 -0
- package/dist/packages/api-client/src/fetchers/orders.js +44 -0
- package/dist/packages/api-client/src/fetchers/products.d.ts +386 -0
- package/dist/packages/api-client/src/fetchers/products.js +42 -0
- package/dist/packages/api-client/src/hooks/admin/abandoned-carts.d.ts +535 -0
- package/dist/packages/api-client/src/hooks/admin/abandoned-carts.js +83 -0
- package/dist/packages/api-client/src/hooks/admin/brands.d.ts +79 -0
- package/dist/packages/api-client/src/hooks/admin/brands.js +108 -0
- package/dist/packages/api-client/src/hooks/admin/customers.d.ts +280 -0
- package/dist/packages/api-client/src/hooks/admin/customers.js +26 -0
- package/dist/packages/api-client/src/hooks/admin/delivery-zones.d.ts +278 -0
- package/dist/packages/api-client/src/hooks/admin/delivery-zones.js +176 -0
- package/dist/packages/api-client/src/hooks/admin/discount-codes.d.ts +299 -0
- package/dist/packages/api-client/src/hooks/admin/discount-codes.js +165 -0
- package/dist/packages/api-client/src/hooks/admin/index.d.ts +16 -0
- package/dist/packages/api-client/src/hooks/admin/index.js +16 -0
- package/dist/packages/api-client/src/hooks/admin/inventory.d.ts +224 -0
- package/dist/packages/api-client/src/hooks/admin/inventory.js +107 -0
- package/dist/packages/api-client/src/hooks/admin/orders.d.ts +1674 -0
- package/dist/packages/api-client/src/hooks/admin/orders.js +178 -0
- package/dist/packages/api-client/src/hooks/admin/products.d.ts +374 -0
- package/dist/packages/api-client/src/hooks/admin/products.js +89 -0
- package/dist/packages/api-client/src/hooks/admin/stats.d.ts +279 -0
- package/dist/packages/api-client/src/hooks/admin/stats.js +25 -0
- package/dist/packages/api-client/src/hooks/admin/variants.d.ts +115 -0
- package/dist/packages/api-client/src/hooks/admin/variants.js +127 -0
- package/dist/packages/api-client/src/hooks/admin/warehouses.d.ts +277 -0
- package/dist/packages/api-client/src/hooks/admin/warehouses.js +108 -0
- package/dist/packages/api-client/src/hooks/public/brands.d.ts +33 -0
- package/dist/packages/api-client/src/hooks/public/brands.js +30 -0
- package/dist/packages/api-client/src/hooks/public/carts.d.ts +2407 -0
- package/dist/packages/api-client/src/hooks/public/carts.js +213 -0
- package/dist/packages/api-client/src/hooks/public/delivery-zones.d.ts +36 -0
- package/dist/packages/api-client/src/hooks/public/delivery-zones.js +28 -0
- package/dist/packages/api-client/src/hooks/public/index.d.ts +10 -0
- package/dist/packages/api-client/src/hooks/public/index.js +10 -0
- package/dist/packages/api-client/src/hooks/public/orders.d.ts +563 -0
- package/dist/packages/api-client/src/hooks/public/orders.js +50 -0
- package/dist/packages/api-client/src/hooks/public/products.d.ts +398 -0
- package/dist/packages/api-client/src/hooks/public/products.js +47 -0
- package/dist/packages/api-client/src/hooks/use-query-unwrapped.d.ts +20 -0
- package/dist/packages/api-client/src/hooks/use-query-unwrapped.js +22 -0
- package/dist/packages/api-client/src/hooks/useApiConfig.d.ts +12 -0
- package/dist/packages/api-client/src/hooks/useApiConfig.js +14 -0
- package/dist/packages/api-client/src/index.d.ts +20 -0
- package/dist/packages/api-client/src/index.js +25 -0
- package/dist/packages/api-client/src/provider.d.ts +36 -0
- package/dist/packages/api-client/src/provider.js +54 -0
- package/dist/packages/api-client/src/rpc-client.d.ts +9639 -0
- package/dist/packages/api-client/src/rpc-client.js +78 -0
- package/dist/packages/api-client/src/rpc-types.d.ts +76 -0
- package/dist/packages/api-client/src/rpc-types.js +7 -0
- package/dist/packages/api-client/src/types.d.ts +34 -0
- package/dist/packages/api-client/src/types.js +16 -0
- package/dist/packages/api-client/src/utils/query-keys.d.ts +106 -0
- package/dist/packages/api-client/src/utils/query-keys.js +108 -0
- package/dist/rpc-client.d.ts +891 -319
- package/dist/utils/query-keys.d.ts +1 -1
- package/dist/utils/query-keys.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-safe admin RPC hooks for order management
|
|
3
|
+
*
|
|
4
|
+
* These hooks use Hono RPC client with types directly from the backend,
|
|
5
|
+
* providing end-to-end type safety without code generation.
|
|
6
|
+
*/
|
|
7
|
+
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
|
8
|
+
import { useQueryUnwrapped } from '../use-query-unwrapped';
|
|
9
|
+
import { createAdminRpcClients, authHeaders } from '../../rpc-client';
|
|
10
|
+
import { queryKeys } from '../../utils/query-keys';
|
|
11
|
+
import { useApiConfig } from '../useApiConfig';
|
|
12
|
+
/**
|
|
13
|
+
* Hook to list all orders with pagination using admin RPC
|
|
14
|
+
*
|
|
15
|
+
* @param filters - Query parameters for filtering orders
|
|
16
|
+
* @param options - React Query options
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* const { data: orders, isLoading } = useListOrders({ search: 'john', page: 1 });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function useListOrders(filters, options) {
|
|
24
|
+
const { baseURL, getAuthToken } = useApiConfig();
|
|
25
|
+
return useQueryUnwrapped({
|
|
26
|
+
queryKey: queryKeys.admin.orders.list(filters),
|
|
27
|
+
queryFn: async () => {
|
|
28
|
+
const token = await getAuthToken();
|
|
29
|
+
const clients = createAdminRpcClients(baseURL);
|
|
30
|
+
// Clean undefined values from filters
|
|
31
|
+
const cleanFilters = filters ? Object.fromEntries(Object.entries(filters).filter(([_, v]) => v !== undefined)) : undefined;
|
|
32
|
+
const res = await clients.orders.index.$get({ query: cleanFilters }, authHeaders(token));
|
|
33
|
+
if (!res.ok) {
|
|
34
|
+
throw new Error(`Failed to fetch orders: ${res.statusText}`);
|
|
35
|
+
}
|
|
36
|
+
return res.json();
|
|
37
|
+
},
|
|
38
|
+
...options,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Hook to get order by ID using admin RPC
|
|
43
|
+
*
|
|
44
|
+
* @param orderId - Order UUID
|
|
45
|
+
* @param options - React Query options
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```tsx
|
|
49
|
+
* const { data: order } = useGetOrder('order-123');
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export function useGetOrder(orderId, options) {
|
|
53
|
+
const { baseURL, getAuthToken } = useApiConfig();
|
|
54
|
+
return useQueryUnwrapped({
|
|
55
|
+
queryKey: queryKeys.admin.orders.detail(orderId),
|
|
56
|
+
queryFn: async () => {
|
|
57
|
+
const token = await getAuthToken();
|
|
58
|
+
const clients = createAdminRpcClients(baseURL);
|
|
59
|
+
const res = await clients.orders[':id'].$get({ param: { id: orderId } }, authHeaders(token));
|
|
60
|
+
if (!res.ok) {
|
|
61
|
+
throw new Error(`Failed to fetch order: ${res.statusText}`);
|
|
62
|
+
}
|
|
63
|
+
return res.json();
|
|
64
|
+
},
|
|
65
|
+
...options,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Hook to create a new order using admin RPC
|
|
70
|
+
*
|
|
71
|
+
* @param options - React Query mutation options
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```tsx
|
|
75
|
+
* const createOrder = useCreateOrder();
|
|
76
|
+
* createOrder.mutate({
|
|
77
|
+
* brandSlug: 'my-brand',
|
|
78
|
+
* items: [{ sku: 'SKU-001', quantity: 2 }],
|
|
79
|
+
* // ... other order fields
|
|
80
|
+
* });
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export function useCreateOrder(options) {
|
|
84
|
+
const { baseURL, getAuthToken } = useApiConfig();
|
|
85
|
+
const queryClient = useQueryClient();
|
|
86
|
+
return useMutation({
|
|
87
|
+
mutationFn: async (data) => {
|
|
88
|
+
const token = await getAuthToken();
|
|
89
|
+
const clients = createAdminRpcClients(baseURL);
|
|
90
|
+
const res = await clients.orders.index.$post({ json: data }, authHeaders(token));
|
|
91
|
+
if (!res.ok) {
|
|
92
|
+
throw new Error(`Failed to create order: ${res.statusText}`);
|
|
93
|
+
}
|
|
94
|
+
return res.json();
|
|
95
|
+
},
|
|
96
|
+
onSuccess: () => {
|
|
97
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.admin.orders.all });
|
|
98
|
+
},
|
|
99
|
+
...options,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Hook to update an order using admin RPC
|
|
104
|
+
*
|
|
105
|
+
* @param orderId - Order UUID
|
|
106
|
+
* @param options - React Query mutation options
|
|
107
|
+
*/
|
|
108
|
+
export function useUpdateOrder(orderId, options) {
|
|
109
|
+
const { baseURL, getAuthToken } = useApiConfig();
|
|
110
|
+
const queryClient = useQueryClient();
|
|
111
|
+
return useMutation({
|
|
112
|
+
mutationFn: async (data) => {
|
|
113
|
+
const token = await getAuthToken();
|
|
114
|
+
const clients = createAdminRpcClients(baseURL);
|
|
115
|
+
const res = await clients.orders[':id'].$patch({ param: { id: orderId }, json: data }, authHeaders(token));
|
|
116
|
+
if (!res.ok) {
|
|
117
|
+
throw new Error(`Failed to update order: ${res.statusText}`);
|
|
118
|
+
}
|
|
119
|
+
return res.json();
|
|
120
|
+
},
|
|
121
|
+
onSuccess: () => {
|
|
122
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.admin.orders.detail(orderId) });
|
|
123
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.admin.orders.all });
|
|
124
|
+
},
|
|
125
|
+
...options,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Hook to update order status using admin RPC
|
|
130
|
+
*
|
|
131
|
+
* @param orderId - Order UUID
|
|
132
|
+
* @param options - React Query mutation options
|
|
133
|
+
*/
|
|
134
|
+
export function useUpdateOrderStatus(orderId, options) {
|
|
135
|
+
const { baseURL, getAuthToken } = useApiConfig();
|
|
136
|
+
const queryClient = useQueryClient();
|
|
137
|
+
return useMutation({
|
|
138
|
+
mutationFn: async (data) => {
|
|
139
|
+
const token = await getAuthToken();
|
|
140
|
+
const clients = createAdminRpcClients(baseURL);
|
|
141
|
+
const res = await clients.orders[':id'].status.$patch({ param: { id: orderId }, json: data }, authHeaders(token));
|
|
142
|
+
if (!res.ok) {
|
|
143
|
+
throw new Error(`Failed to update order status: ${res.statusText}`);
|
|
144
|
+
}
|
|
145
|
+
return res.json();
|
|
146
|
+
},
|
|
147
|
+
onSuccess: () => {
|
|
148
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.admin.orders.detail(orderId) });
|
|
149
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.admin.orders.all });
|
|
150
|
+
},
|
|
151
|
+
...options,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Hook to delete an order using admin RPC
|
|
156
|
+
*
|
|
157
|
+
* @param orderId - Order UUID
|
|
158
|
+
* @param options - React Query mutation options
|
|
159
|
+
*/
|
|
160
|
+
export function useDeleteOrder(orderId, options) {
|
|
161
|
+
const { baseURL, getAuthToken } = useApiConfig();
|
|
162
|
+
const queryClient = useQueryClient();
|
|
163
|
+
return useMutation({
|
|
164
|
+
mutationFn: async () => {
|
|
165
|
+
const token = await getAuthToken();
|
|
166
|
+
const clients = createAdminRpcClients(baseURL);
|
|
167
|
+
const res = await clients.orders[':id'].$delete({ param: { id: orderId } }, authHeaders(token));
|
|
168
|
+
if (!res.ok) {
|
|
169
|
+
throw new Error(`Failed to delete order: ${res.statusText}`);
|
|
170
|
+
}
|
|
171
|
+
return res.json();
|
|
172
|
+
},
|
|
173
|
+
onSuccess: () => {
|
|
174
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.admin.orders.all });
|
|
175
|
+
},
|
|
176
|
+
...options,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-safe admin RPC hooks for product management
|
|
3
|
+
*/
|
|
4
|
+
import { UseQueryOptions, UseMutationOptions } from '@tanstack/react-query';
|
|
5
|
+
import { createAdminRpcClients } from '../../rpc-client';
|
|
6
|
+
export declare function useListProducts(brandId?: string, options?: Omit<UseQueryOptions<Awaited<ReturnType<Awaited<ReturnType<ReturnType<typeof createAdminRpcClients>['products']['index']['$get']>>['json']>>, Error>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
|
|
7
|
+
brand: {
|
|
8
|
+
createdAt: string;
|
|
9
|
+
updatedAt: string;
|
|
10
|
+
deletedAt: string;
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
slug: string;
|
|
14
|
+
logoUrl: string | null;
|
|
15
|
+
siteUrl: string;
|
|
16
|
+
domain: string;
|
|
17
|
+
metaPixelId: string | null;
|
|
18
|
+
};
|
|
19
|
+
variants: {
|
|
20
|
+
createdAt: string;
|
|
21
|
+
updatedAt: string;
|
|
22
|
+
price: number;
|
|
23
|
+
deletedAt: string;
|
|
24
|
+
id: string;
|
|
25
|
+
name: string | null;
|
|
26
|
+
isActive: boolean;
|
|
27
|
+
thumbnailUrl: string | null;
|
|
28
|
+
productId: string;
|
|
29
|
+
sku: string;
|
|
30
|
+
trackInventory: boolean;
|
|
31
|
+
lowStockThreshold: number | null;
|
|
32
|
+
}[];
|
|
33
|
+
id: string;
|
|
34
|
+
name: string;
|
|
35
|
+
slug: string;
|
|
36
|
+
createdAt: string;
|
|
37
|
+
updatedAt: string;
|
|
38
|
+
deletedAt: string;
|
|
39
|
+
brandId: string;
|
|
40
|
+
isActive: boolean;
|
|
41
|
+
description: string | null;
|
|
42
|
+
thumbnailUrl: string | null;
|
|
43
|
+
quantityDiscounts: string | number | boolean | {
|
|
44
|
+
[x: string]: string | number | boolean | /*elided*/ any | {
|
|
45
|
+
[x: number]: string | number | boolean | /*elided*/ any | /*elided*/ any;
|
|
46
|
+
length: number;
|
|
47
|
+
toString: never;
|
|
48
|
+
toLocaleString: never;
|
|
49
|
+
pop: never;
|
|
50
|
+
push: never;
|
|
51
|
+
concat: never;
|
|
52
|
+
join: never;
|
|
53
|
+
reverse: never;
|
|
54
|
+
shift: never;
|
|
55
|
+
slice: never;
|
|
56
|
+
sort: never;
|
|
57
|
+
splice: never;
|
|
58
|
+
unshift: never;
|
|
59
|
+
indexOf: never;
|
|
60
|
+
lastIndexOf: never;
|
|
61
|
+
every: never;
|
|
62
|
+
some: never;
|
|
63
|
+
forEach: never;
|
|
64
|
+
map: never;
|
|
65
|
+
filter: never;
|
|
66
|
+
reduce: never;
|
|
67
|
+
reduceRight: never;
|
|
68
|
+
find: never;
|
|
69
|
+
findIndex: never;
|
|
70
|
+
fill: never;
|
|
71
|
+
copyWithin: never;
|
|
72
|
+
entries: never;
|
|
73
|
+
keys: never;
|
|
74
|
+
values: never;
|
|
75
|
+
includes: never;
|
|
76
|
+
flatMap: never;
|
|
77
|
+
flat: never;
|
|
78
|
+
[Symbol.iterator]: never;
|
|
79
|
+
readonly [Symbol.unscopables]: {
|
|
80
|
+
[x: number]: boolean;
|
|
81
|
+
length?: boolean;
|
|
82
|
+
toString?: boolean;
|
|
83
|
+
toLocaleString?: boolean;
|
|
84
|
+
pop?: boolean;
|
|
85
|
+
push?: boolean;
|
|
86
|
+
concat?: boolean;
|
|
87
|
+
join?: boolean;
|
|
88
|
+
reverse?: boolean;
|
|
89
|
+
shift?: boolean;
|
|
90
|
+
slice?: boolean;
|
|
91
|
+
sort?: boolean;
|
|
92
|
+
splice?: boolean;
|
|
93
|
+
unshift?: boolean;
|
|
94
|
+
indexOf?: boolean;
|
|
95
|
+
lastIndexOf?: boolean;
|
|
96
|
+
every?: boolean;
|
|
97
|
+
some?: boolean;
|
|
98
|
+
forEach?: boolean;
|
|
99
|
+
map?: boolean;
|
|
100
|
+
filter?: boolean;
|
|
101
|
+
reduce?: boolean;
|
|
102
|
+
reduceRight?: boolean;
|
|
103
|
+
find?: boolean;
|
|
104
|
+
findIndex?: boolean;
|
|
105
|
+
fill?: boolean;
|
|
106
|
+
copyWithin?: boolean;
|
|
107
|
+
entries?: boolean;
|
|
108
|
+
keys?: boolean;
|
|
109
|
+
values?: boolean;
|
|
110
|
+
includes?: boolean;
|
|
111
|
+
flatMap?: boolean;
|
|
112
|
+
flat?: boolean;
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
} | {
|
|
116
|
+
[x: number]: string | number | boolean | {
|
|
117
|
+
[x: string]: string | number | boolean | /*elided*/ any | /*elided*/ any;
|
|
118
|
+
} | /*elided*/ any;
|
|
119
|
+
length: number;
|
|
120
|
+
toString: never;
|
|
121
|
+
toLocaleString: never;
|
|
122
|
+
pop: never;
|
|
123
|
+
push: never;
|
|
124
|
+
concat: never;
|
|
125
|
+
join: never;
|
|
126
|
+
reverse: never;
|
|
127
|
+
shift: never;
|
|
128
|
+
slice: never;
|
|
129
|
+
sort: never;
|
|
130
|
+
splice: never;
|
|
131
|
+
unshift: never;
|
|
132
|
+
indexOf: never;
|
|
133
|
+
lastIndexOf: never;
|
|
134
|
+
every: never;
|
|
135
|
+
some: never;
|
|
136
|
+
forEach: never;
|
|
137
|
+
map: never;
|
|
138
|
+
filter: never;
|
|
139
|
+
reduce: never;
|
|
140
|
+
reduceRight: never;
|
|
141
|
+
find: never;
|
|
142
|
+
findIndex: never;
|
|
143
|
+
fill: never;
|
|
144
|
+
copyWithin: never;
|
|
145
|
+
entries: never;
|
|
146
|
+
keys: never;
|
|
147
|
+
values: never;
|
|
148
|
+
includes: never;
|
|
149
|
+
flatMap: never;
|
|
150
|
+
flat: never;
|
|
151
|
+
[Symbol.iterator]: never;
|
|
152
|
+
readonly [Symbol.unscopables]: {
|
|
153
|
+
[x: number]: boolean;
|
|
154
|
+
length?: boolean;
|
|
155
|
+
toString?: boolean;
|
|
156
|
+
toLocaleString?: boolean;
|
|
157
|
+
pop?: boolean;
|
|
158
|
+
push?: boolean;
|
|
159
|
+
concat?: boolean;
|
|
160
|
+
join?: boolean;
|
|
161
|
+
reverse?: boolean;
|
|
162
|
+
shift?: boolean;
|
|
163
|
+
slice?: boolean;
|
|
164
|
+
sort?: boolean;
|
|
165
|
+
splice?: boolean;
|
|
166
|
+
unshift?: boolean;
|
|
167
|
+
indexOf?: boolean;
|
|
168
|
+
lastIndexOf?: boolean;
|
|
169
|
+
every?: boolean;
|
|
170
|
+
some?: boolean;
|
|
171
|
+
forEach?: boolean;
|
|
172
|
+
map?: boolean;
|
|
173
|
+
filter?: boolean;
|
|
174
|
+
reduce?: boolean;
|
|
175
|
+
reduceRight?: boolean;
|
|
176
|
+
find?: boolean;
|
|
177
|
+
findIndex?: boolean;
|
|
178
|
+
fill?: boolean;
|
|
179
|
+
copyWithin?: boolean;
|
|
180
|
+
entries?: boolean;
|
|
181
|
+
keys?: boolean;
|
|
182
|
+
values?: boolean;
|
|
183
|
+
includes?: boolean;
|
|
184
|
+
flatMap?: boolean;
|
|
185
|
+
flat?: boolean;
|
|
186
|
+
};
|
|
187
|
+
};
|
|
188
|
+
}[], Error>;
|
|
189
|
+
export declare function useGetProduct(productId: string, options?: Omit<UseQueryOptions<Awaited<ReturnType<Awaited<ReturnType<ReturnType<typeof createAdminRpcClients>['products'][':id']['$get']>>['json']>>, Error>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
|
|
190
|
+
brand: {
|
|
191
|
+
createdAt: string;
|
|
192
|
+
updatedAt: string;
|
|
193
|
+
deletedAt: string;
|
|
194
|
+
id: string;
|
|
195
|
+
name: string;
|
|
196
|
+
slug: string;
|
|
197
|
+
logoUrl: string | null;
|
|
198
|
+
siteUrl: string;
|
|
199
|
+
domain: string;
|
|
200
|
+
metaPixelId: string | null;
|
|
201
|
+
};
|
|
202
|
+
variants: {
|
|
203
|
+
createdAt: string;
|
|
204
|
+
updatedAt: string;
|
|
205
|
+
price: number;
|
|
206
|
+
deletedAt: string;
|
|
207
|
+
id: string;
|
|
208
|
+
name: string | null;
|
|
209
|
+
isActive: boolean;
|
|
210
|
+
thumbnailUrl: string | null;
|
|
211
|
+
productId: string;
|
|
212
|
+
sku: string;
|
|
213
|
+
trackInventory: boolean;
|
|
214
|
+
lowStockThreshold: number | null;
|
|
215
|
+
}[];
|
|
216
|
+
id: string;
|
|
217
|
+
name: string;
|
|
218
|
+
slug: string;
|
|
219
|
+
createdAt: string;
|
|
220
|
+
updatedAt: string;
|
|
221
|
+
deletedAt: string;
|
|
222
|
+
brandId: string;
|
|
223
|
+
isActive: boolean;
|
|
224
|
+
description: string | null;
|
|
225
|
+
thumbnailUrl: string | null;
|
|
226
|
+
quantityDiscounts: string | number | boolean | {
|
|
227
|
+
[x: string]: string | number | boolean | /*elided*/ any | {
|
|
228
|
+
[x: number]: string | number | boolean | /*elided*/ any | /*elided*/ any;
|
|
229
|
+
length: number;
|
|
230
|
+
toString: never;
|
|
231
|
+
toLocaleString: never;
|
|
232
|
+
pop: never;
|
|
233
|
+
push: never;
|
|
234
|
+
concat: never;
|
|
235
|
+
join: never;
|
|
236
|
+
reverse: never;
|
|
237
|
+
shift: never;
|
|
238
|
+
slice: never;
|
|
239
|
+
sort: never;
|
|
240
|
+
splice: never;
|
|
241
|
+
unshift: never;
|
|
242
|
+
indexOf: never;
|
|
243
|
+
lastIndexOf: never;
|
|
244
|
+
every: never;
|
|
245
|
+
some: never;
|
|
246
|
+
forEach: never;
|
|
247
|
+
map: never;
|
|
248
|
+
filter: never;
|
|
249
|
+
reduce: never;
|
|
250
|
+
reduceRight: never;
|
|
251
|
+
find: never;
|
|
252
|
+
findIndex: never;
|
|
253
|
+
fill: never;
|
|
254
|
+
copyWithin: never;
|
|
255
|
+
entries: never;
|
|
256
|
+
keys: never;
|
|
257
|
+
values: never;
|
|
258
|
+
includes: never;
|
|
259
|
+
flatMap: never;
|
|
260
|
+
flat: never;
|
|
261
|
+
[Symbol.iterator]: never;
|
|
262
|
+
readonly [Symbol.unscopables]: {
|
|
263
|
+
[x: number]: boolean;
|
|
264
|
+
length?: boolean;
|
|
265
|
+
toString?: boolean;
|
|
266
|
+
toLocaleString?: boolean;
|
|
267
|
+
pop?: boolean;
|
|
268
|
+
push?: boolean;
|
|
269
|
+
concat?: boolean;
|
|
270
|
+
join?: boolean;
|
|
271
|
+
reverse?: boolean;
|
|
272
|
+
shift?: boolean;
|
|
273
|
+
slice?: boolean;
|
|
274
|
+
sort?: boolean;
|
|
275
|
+
splice?: boolean;
|
|
276
|
+
unshift?: boolean;
|
|
277
|
+
indexOf?: boolean;
|
|
278
|
+
lastIndexOf?: boolean;
|
|
279
|
+
every?: boolean;
|
|
280
|
+
some?: boolean;
|
|
281
|
+
forEach?: boolean;
|
|
282
|
+
map?: boolean;
|
|
283
|
+
filter?: boolean;
|
|
284
|
+
reduce?: boolean;
|
|
285
|
+
reduceRight?: boolean;
|
|
286
|
+
find?: boolean;
|
|
287
|
+
findIndex?: boolean;
|
|
288
|
+
fill?: boolean;
|
|
289
|
+
copyWithin?: boolean;
|
|
290
|
+
entries?: boolean;
|
|
291
|
+
keys?: boolean;
|
|
292
|
+
values?: boolean;
|
|
293
|
+
includes?: boolean;
|
|
294
|
+
flatMap?: boolean;
|
|
295
|
+
flat?: boolean;
|
|
296
|
+
};
|
|
297
|
+
};
|
|
298
|
+
} | {
|
|
299
|
+
[x: number]: string | number | boolean | {
|
|
300
|
+
[x: string]: string | number | boolean | /*elided*/ any | /*elided*/ any;
|
|
301
|
+
} | /*elided*/ any;
|
|
302
|
+
length: number;
|
|
303
|
+
toString: never;
|
|
304
|
+
toLocaleString: never;
|
|
305
|
+
pop: never;
|
|
306
|
+
push: never;
|
|
307
|
+
concat: never;
|
|
308
|
+
join: never;
|
|
309
|
+
reverse: never;
|
|
310
|
+
shift: never;
|
|
311
|
+
slice: never;
|
|
312
|
+
sort: never;
|
|
313
|
+
splice: never;
|
|
314
|
+
unshift: never;
|
|
315
|
+
indexOf: never;
|
|
316
|
+
lastIndexOf: never;
|
|
317
|
+
every: never;
|
|
318
|
+
some: never;
|
|
319
|
+
forEach: never;
|
|
320
|
+
map: never;
|
|
321
|
+
filter: never;
|
|
322
|
+
reduce: never;
|
|
323
|
+
reduceRight: never;
|
|
324
|
+
find: never;
|
|
325
|
+
findIndex: never;
|
|
326
|
+
fill: never;
|
|
327
|
+
copyWithin: never;
|
|
328
|
+
entries: never;
|
|
329
|
+
keys: never;
|
|
330
|
+
values: never;
|
|
331
|
+
includes: never;
|
|
332
|
+
flatMap: never;
|
|
333
|
+
flat: never;
|
|
334
|
+
[Symbol.iterator]: never;
|
|
335
|
+
readonly [Symbol.unscopables]: {
|
|
336
|
+
[x: number]: boolean;
|
|
337
|
+
length?: boolean;
|
|
338
|
+
toString?: boolean;
|
|
339
|
+
toLocaleString?: boolean;
|
|
340
|
+
pop?: boolean;
|
|
341
|
+
push?: boolean;
|
|
342
|
+
concat?: boolean;
|
|
343
|
+
join?: boolean;
|
|
344
|
+
reverse?: boolean;
|
|
345
|
+
shift?: boolean;
|
|
346
|
+
slice?: boolean;
|
|
347
|
+
sort?: boolean;
|
|
348
|
+
splice?: boolean;
|
|
349
|
+
unshift?: boolean;
|
|
350
|
+
indexOf?: boolean;
|
|
351
|
+
lastIndexOf?: boolean;
|
|
352
|
+
every?: boolean;
|
|
353
|
+
some?: boolean;
|
|
354
|
+
forEach?: boolean;
|
|
355
|
+
map?: boolean;
|
|
356
|
+
filter?: boolean;
|
|
357
|
+
reduce?: boolean;
|
|
358
|
+
reduceRight?: boolean;
|
|
359
|
+
find?: boolean;
|
|
360
|
+
findIndex?: boolean;
|
|
361
|
+
fill?: boolean;
|
|
362
|
+
copyWithin?: boolean;
|
|
363
|
+
entries?: boolean;
|
|
364
|
+
keys?: boolean;
|
|
365
|
+
values?: boolean;
|
|
366
|
+
includes?: boolean;
|
|
367
|
+
flatMap?: boolean;
|
|
368
|
+
flat?: boolean;
|
|
369
|
+
};
|
|
370
|
+
};
|
|
371
|
+
}, Error>;
|
|
372
|
+
export declare function useCreateProduct(options?: UseMutationOptions<any, Error, any>): import("@tanstack/react-query").UseMutationResult<any, Error, any, unknown>;
|
|
373
|
+
export declare function useUpdateProduct(productId: string, options?: UseMutationOptions<any, Error, any>): import("@tanstack/react-query").UseMutationResult<any, Error, any, unknown>;
|
|
374
|
+
export declare function useDeleteProduct(productId: string, options?: UseMutationOptions<any, Error, void>): import("@tanstack/react-query").UseMutationResult<any, Error, void, unknown>;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-safe admin RPC hooks for product management
|
|
3
|
+
*/
|
|
4
|
+
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
|
5
|
+
import { useQueryUnwrapped } from '../use-query-unwrapped';
|
|
6
|
+
import { createAdminRpcClients, authHeaders } from '../../rpc-client';
|
|
7
|
+
import { queryKeys } from '../../utils/query-keys';
|
|
8
|
+
import { useApiConfig } from '../useApiConfig';
|
|
9
|
+
export function useListProducts(brandId, options) {
|
|
10
|
+
const { baseURL, getAuthToken } = useApiConfig();
|
|
11
|
+
return useQueryUnwrapped({
|
|
12
|
+
queryKey: queryKeys.admin.products.list(brandId),
|
|
13
|
+
queryFn: async () => {
|
|
14
|
+
const token = await getAuthToken();
|
|
15
|
+
const clients = createAdminRpcClients(baseURL);
|
|
16
|
+
const res = await clients.products.index.$get(brandId ? { query: { brandId } } : {}, authHeaders(token));
|
|
17
|
+
if (!res.ok)
|
|
18
|
+
throw new Error(`Failed to fetch products: ${res.statusText}`);
|
|
19
|
+
return res.json();
|
|
20
|
+
},
|
|
21
|
+
...options,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export function useGetProduct(productId, options) {
|
|
25
|
+
const { baseURL, getAuthToken } = useApiConfig();
|
|
26
|
+
return useQueryUnwrapped({
|
|
27
|
+
queryKey: queryKeys.admin.products.detail(productId),
|
|
28
|
+
queryFn: async () => {
|
|
29
|
+
const token = await getAuthToken();
|
|
30
|
+
const clients = createAdminRpcClients(baseURL);
|
|
31
|
+
const res = await clients.products[':id'].$get({ param: { id: productId } }, authHeaders(token));
|
|
32
|
+
if (!res.ok)
|
|
33
|
+
throw new Error(`Failed to fetch product: ${res.statusText}`);
|
|
34
|
+
return res.json();
|
|
35
|
+
},
|
|
36
|
+
...options,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
export function useCreateProduct(options) {
|
|
40
|
+
const { baseURL, getAuthToken } = useApiConfig();
|
|
41
|
+
const queryClient = useQueryClient();
|
|
42
|
+
return useMutation({
|
|
43
|
+
mutationFn: async (data) => {
|
|
44
|
+
const token = await getAuthToken();
|
|
45
|
+
const clients = createAdminRpcClients(baseURL);
|
|
46
|
+
const res = await clients.products.index.$post({ json: data }, authHeaders(token));
|
|
47
|
+
if (!res.ok)
|
|
48
|
+
throw new Error(`Failed to create product: ${res.statusText}`);
|
|
49
|
+
return res.json();
|
|
50
|
+
},
|
|
51
|
+
onSuccess: () => queryClient.invalidateQueries({ queryKey: queryKeys.admin.products.all }),
|
|
52
|
+
...options,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
export function useUpdateProduct(productId, options) {
|
|
56
|
+
const { baseURL, getAuthToken } = useApiConfig();
|
|
57
|
+
const queryClient = useQueryClient();
|
|
58
|
+
return useMutation({
|
|
59
|
+
mutationFn: async (data) => {
|
|
60
|
+
const token = await getAuthToken();
|
|
61
|
+
const clients = createAdminRpcClients(baseURL);
|
|
62
|
+
const res = await clients.products[':id'].$patch({ param: { id: productId }, json: data }, authHeaders(token));
|
|
63
|
+
if (!res.ok)
|
|
64
|
+
throw new Error(`Failed to update product: ${res.statusText}`);
|
|
65
|
+
return res.json();
|
|
66
|
+
},
|
|
67
|
+
onSuccess: () => {
|
|
68
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.admin.products.detail(productId) });
|
|
69
|
+
queryClient.invalidateQueries({ queryKey: queryKeys.admin.products.all });
|
|
70
|
+
},
|
|
71
|
+
...options,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
export function useDeleteProduct(productId, options) {
|
|
75
|
+
const { baseURL, getAuthToken } = useApiConfig();
|
|
76
|
+
const queryClient = useQueryClient();
|
|
77
|
+
return useMutation({
|
|
78
|
+
mutationFn: async () => {
|
|
79
|
+
const token = await getAuthToken();
|
|
80
|
+
const clients = createAdminRpcClients(baseURL);
|
|
81
|
+
const res = await clients.products[':id'].$delete({ param: { id: productId } }, authHeaders(token));
|
|
82
|
+
if (!res.ok)
|
|
83
|
+
throw new Error(`Failed to delete product: ${res.statusText}`);
|
|
84
|
+
return res.json();
|
|
85
|
+
},
|
|
86
|
+
onSuccess: () => queryClient.invalidateQueries({ queryKey: queryKeys.admin.products.all }),
|
|
87
|
+
...options,
|
|
88
|
+
});
|
|
89
|
+
}
|