@instockng/api-client 1.0.2 → 1.0.4
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 +106 -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 +280 -0
- package/dist/apps/backend/src/lib/cart-helpers.js +93 -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 +167 -0
- package/dist/apps/backend/src/lib/delivery-zone-response.d.ts +62 -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 +48 -0
- package/dist/apps/backend/src/lib/meta-capi.js +120 -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 +367 -0
- package/dist/apps/backend/src/lib/order-recovery.js +373 -0
- package/dist/apps/backend/src/lib/order-response.d.ts +136 -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/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 +55 -0
- package/dist/apps/backend/src/notifications/producers/meta-capi-producer.js +125 -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 +306 -0
- package/dist/apps/backend/src/routes/admin/customers.js +39 -0
- package/dist/apps/backend/src/routes/admin/delivery-zones.d.ts +438 -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 +189 -0
- package/dist/apps/backend/src/routes/admin/orders.d.ts +1478 -0
- package/dist/apps/backend/src/routes/admin/orders.js +503 -0
- package/dist/apps/backend/src/routes/admin/products.d.ts +860 -0
- package/dist/apps/backend/src/routes/admin/products.js +107 -0
- package/dist/apps/backend/src/routes/admin/stats.d.ts +288 -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 +173 -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 +2655 -0
- package/dist/apps/backend/src/routes/public/carts.js +631 -0
- package/dist/apps/backend/src/routes/public/delivery-zones.d.ts +35 -0
- package/dist/apps/backend/src/routes/public/delivery-zones.js +62 -0
- package/dist/apps/backend/src/routes/public/orders.d.ts +323 -0
- package/dist/apps/backend/src/routes/public/orders.js +160 -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 +42 -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 +31 -0
- package/dist/apps/backend/src/validators/delivery-zone.js +51 -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 +87 -0
- package/dist/apps/backend/src/validators/order.js +61 -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/carts.d.ts +751 -755
- package/dist/fetchers/carts.js +4 -2
- package/dist/hooks/public/carts.d.ts +753 -755
- package/dist/hooks/public/carts.js +2 -2
- 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/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 +2335 -0
- package/dist/packages/api-client/src/fetchers/carts.js +169 -0
- package/dist/packages/api-client/src/fetchers/delivery-zones.d.ts +28 -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 +283 -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 +79 -0
- package/dist/packages/api-client/src/hooks/admin/brands.d.ts +79 -0
- package/dist/packages/api-client/src/hooks/admin/brands.js +103 -0
- package/dist/packages/api-client/src/hooks/admin/customers.d.ts +278 -0
- package/dist/packages/api-client/src/hooks/admin/customers.js +25 -0
- package/dist/packages/api-client/src/hooks/admin/delivery-zones.d.ts +270 -0
- package/dist/packages/api-client/src/hooks/admin/delivery-zones.js +168 -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 +157 -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 +102 -0
- package/dist/packages/api-client/src/hooks/admin/orders.d.ts +1380 -0
- package/dist/packages/api-client/src/hooks/admin/orders.js +169 -0
- package/dist/packages/api-client/src/hooks/admin/products.d.ts +374 -0
- package/dist/packages/api-client/src/hooks/admin/products.js +84 -0
- package/dist/packages/api-client/src/hooks/admin/stats.d.ts +277 -0
- package/dist/packages/api-client/src/hooks/admin/stats.js +24 -0
- package/dist/packages/api-client/src/hooks/admin/variants.d.ts +115 -0
- package/dist/packages/api-client/src/hooks/admin/variants.js +121 -0
- package/dist/packages/api-client/src/hooks/admin/warehouses.d.ts +277 -0
- package/dist/packages/api-client/src/hooks/admin/warehouses.js +103 -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 +2405 -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 +34 -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 +302 -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 +11 -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 +33 -0
- package/dist/packages/api-client/src/provider.js +52 -0
- package/dist/packages/api-client/src/rpc-client.d.ts +9035 -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 +33 -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 +685 -693
- package/package.json +2 -2
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-safe RPC hooks for product operations
|
|
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 { UseQueryOptions } from '@tanstack/react-query';
|
|
8
|
+
import { fetchProductsByBrand, fetchProductBySlug } from '../../fetchers/products';
|
|
9
|
+
/**
|
|
10
|
+
* Hook to get products by brand using RPC
|
|
11
|
+
*
|
|
12
|
+
* @param brandId - Brand UUID
|
|
13
|
+
* @param options - React Query options
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* const { data: products, isLoading } = useGetProducts('brand-123');
|
|
18
|
+
* console.log(products?.data[0].name); // Fully typed!
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function useGetProducts(brandId: string, options?: Omit<UseQueryOptions<Awaited<ReturnType<typeof fetchProductsByBrand>>, Error>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
|
|
22
|
+
brand: {
|
|
23
|
+
createdAt: string;
|
|
24
|
+
updatedAt: string;
|
|
25
|
+
deletedAt: string;
|
|
26
|
+
name: string;
|
|
27
|
+
id: string;
|
|
28
|
+
slug: string;
|
|
29
|
+
logoUrl: string | null;
|
|
30
|
+
siteUrl: string;
|
|
31
|
+
domain: string;
|
|
32
|
+
metaPixelId: string | null;
|
|
33
|
+
};
|
|
34
|
+
variants: {
|
|
35
|
+
createdAt: string;
|
|
36
|
+
updatedAt: string;
|
|
37
|
+
price: number;
|
|
38
|
+
deletedAt: string;
|
|
39
|
+
name: string | null;
|
|
40
|
+
id: string;
|
|
41
|
+
isActive: boolean;
|
|
42
|
+
thumbnailUrl: string | null;
|
|
43
|
+
productId: string;
|
|
44
|
+
sku: string;
|
|
45
|
+
trackInventory: boolean;
|
|
46
|
+
lowStockThreshold: number | null;
|
|
47
|
+
}[];
|
|
48
|
+
name: string;
|
|
49
|
+
id: string;
|
|
50
|
+
slug: string;
|
|
51
|
+
createdAt: string;
|
|
52
|
+
updatedAt: string;
|
|
53
|
+
deletedAt: string;
|
|
54
|
+
brandId: string;
|
|
55
|
+
isActive: boolean;
|
|
56
|
+
description: string | null;
|
|
57
|
+
thumbnailUrl: string | null;
|
|
58
|
+
quantityDiscounts: string | number | boolean | {
|
|
59
|
+
[x: string]: string | number | boolean | /*elided*/ any | {
|
|
60
|
+
[x: number]: string | number | boolean | /*elided*/ any | /*elided*/ any;
|
|
61
|
+
length: number;
|
|
62
|
+
toString: never;
|
|
63
|
+
toLocaleString: never;
|
|
64
|
+
pop: never;
|
|
65
|
+
push: never;
|
|
66
|
+
concat: never;
|
|
67
|
+
join: never;
|
|
68
|
+
reverse: never;
|
|
69
|
+
shift: never;
|
|
70
|
+
slice: never;
|
|
71
|
+
sort: never;
|
|
72
|
+
splice: never;
|
|
73
|
+
unshift: never;
|
|
74
|
+
indexOf: never;
|
|
75
|
+
lastIndexOf: never;
|
|
76
|
+
every: never;
|
|
77
|
+
some: never;
|
|
78
|
+
forEach: never;
|
|
79
|
+
map: never;
|
|
80
|
+
filter: never;
|
|
81
|
+
reduce: never;
|
|
82
|
+
reduceRight: never;
|
|
83
|
+
find: never;
|
|
84
|
+
findIndex: never;
|
|
85
|
+
fill: never;
|
|
86
|
+
copyWithin: never;
|
|
87
|
+
entries: never;
|
|
88
|
+
keys: never;
|
|
89
|
+
values: never;
|
|
90
|
+
includes: never;
|
|
91
|
+
flatMap: never;
|
|
92
|
+
flat: never;
|
|
93
|
+
[Symbol.iterator]: never;
|
|
94
|
+
readonly [Symbol.unscopables]: {
|
|
95
|
+
[x: number]: boolean;
|
|
96
|
+
length?: boolean;
|
|
97
|
+
toString?: boolean;
|
|
98
|
+
toLocaleString?: boolean;
|
|
99
|
+
pop?: boolean;
|
|
100
|
+
push?: boolean;
|
|
101
|
+
concat?: boolean;
|
|
102
|
+
join?: boolean;
|
|
103
|
+
reverse?: boolean;
|
|
104
|
+
shift?: boolean;
|
|
105
|
+
slice?: boolean;
|
|
106
|
+
sort?: boolean;
|
|
107
|
+
splice?: boolean;
|
|
108
|
+
unshift?: boolean;
|
|
109
|
+
indexOf?: boolean;
|
|
110
|
+
lastIndexOf?: boolean;
|
|
111
|
+
every?: boolean;
|
|
112
|
+
some?: boolean;
|
|
113
|
+
forEach?: boolean;
|
|
114
|
+
map?: boolean;
|
|
115
|
+
filter?: boolean;
|
|
116
|
+
reduce?: boolean;
|
|
117
|
+
reduceRight?: boolean;
|
|
118
|
+
find?: boolean;
|
|
119
|
+
findIndex?: boolean;
|
|
120
|
+
fill?: boolean;
|
|
121
|
+
copyWithin?: boolean;
|
|
122
|
+
entries?: boolean;
|
|
123
|
+
keys?: boolean;
|
|
124
|
+
values?: boolean;
|
|
125
|
+
includes?: boolean;
|
|
126
|
+
flatMap?: boolean;
|
|
127
|
+
flat?: boolean;
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
} | {
|
|
131
|
+
[x: number]: string | number | boolean | {
|
|
132
|
+
[x: string]: string | number | boolean | /*elided*/ any | /*elided*/ any;
|
|
133
|
+
} | /*elided*/ any;
|
|
134
|
+
length: number;
|
|
135
|
+
toString: never;
|
|
136
|
+
toLocaleString: never;
|
|
137
|
+
pop: never;
|
|
138
|
+
push: never;
|
|
139
|
+
concat: never;
|
|
140
|
+
join: never;
|
|
141
|
+
reverse: never;
|
|
142
|
+
shift: never;
|
|
143
|
+
slice: never;
|
|
144
|
+
sort: never;
|
|
145
|
+
splice: never;
|
|
146
|
+
unshift: never;
|
|
147
|
+
indexOf: never;
|
|
148
|
+
lastIndexOf: never;
|
|
149
|
+
every: never;
|
|
150
|
+
some: never;
|
|
151
|
+
forEach: never;
|
|
152
|
+
map: never;
|
|
153
|
+
filter: never;
|
|
154
|
+
reduce: never;
|
|
155
|
+
reduceRight: never;
|
|
156
|
+
find: never;
|
|
157
|
+
findIndex: never;
|
|
158
|
+
fill: never;
|
|
159
|
+
copyWithin: never;
|
|
160
|
+
entries: never;
|
|
161
|
+
keys: never;
|
|
162
|
+
values: never;
|
|
163
|
+
includes: never;
|
|
164
|
+
flatMap: never;
|
|
165
|
+
flat: never;
|
|
166
|
+
[Symbol.iterator]: never;
|
|
167
|
+
readonly [Symbol.unscopables]: {
|
|
168
|
+
[x: number]: boolean;
|
|
169
|
+
length?: boolean;
|
|
170
|
+
toString?: boolean;
|
|
171
|
+
toLocaleString?: boolean;
|
|
172
|
+
pop?: boolean;
|
|
173
|
+
push?: boolean;
|
|
174
|
+
concat?: boolean;
|
|
175
|
+
join?: boolean;
|
|
176
|
+
reverse?: boolean;
|
|
177
|
+
shift?: boolean;
|
|
178
|
+
slice?: boolean;
|
|
179
|
+
sort?: boolean;
|
|
180
|
+
splice?: boolean;
|
|
181
|
+
unshift?: boolean;
|
|
182
|
+
indexOf?: boolean;
|
|
183
|
+
lastIndexOf?: boolean;
|
|
184
|
+
every?: boolean;
|
|
185
|
+
some?: boolean;
|
|
186
|
+
forEach?: boolean;
|
|
187
|
+
map?: boolean;
|
|
188
|
+
filter?: boolean;
|
|
189
|
+
reduce?: boolean;
|
|
190
|
+
reduceRight?: boolean;
|
|
191
|
+
find?: boolean;
|
|
192
|
+
findIndex?: boolean;
|
|
193
|
+
fill?: boolean;
|
|
194
|
+
copyWithin?: boolean;
|
|
195
|
+
entries?: boolean;
|
|
196
|
+
keys?: boolean;
|
|
197
|
+
values?: boolean;
|
|
198
|
+
includes?: boolean;
|
|
199
|
+
flatMap?: boolean;
|
|
200
|
+
flat?: boolean;
|
|
201
|
+
};
|
|
202
|
+
};
|
|
203
|
+
}[], Error>;
|
|
204
|
+
/**
|
|
205
|
+
* Hook to get a single product by slug using RPC
|
|
206
|
+
*
|
|
207
|
+
* @param slug - Product slug
|
|
208
|
+
* @param options - React Query options
|
|
209
|
+
*
|
|
210
|
+
* @example
|
|
211
|
+
* ```tsx
|
|
212
|
+
* const { data: product, isLoading } = useGetProduct('cotton-t-shirt');
|
|
213
|
+
* console.log(product?.name); // Fully typed!
|
|
214
|
+
* ```
|
|
215
|
+
*/
|
|
216
|
+
export declare function useGetProduct(slug: string, options?: Omit<UseQueryOptions<Awaited<ReturnType<typeof fetchProductBySlug>>, Error>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
|
|
217
|
+
brand: {
|
|
218
|
+
createdAt: string;
|
|
219
|
+
updatedAt: string;
|
|
220
|
+
deletedAt: string;
|
|
221
|
+
name: string;
|
|
222
|
+
id: string;
|
|
223
|
+
slug: string;
|
|
224
|
+
logoUrl: string | null;
|
|
225
|
+
siteUrl: string;
|
|
226
|
+
domain: string;
|
|
227
|
+
metaPixelId: string | null;
|
|
228
|
+
};
|
|
229
|
+
variants: {
|
|
230
|
+
createdAt: string;
|
|
231
|
+
updatedAt: string;
|
|
232
|
+
price: number;
|
|
233
|
+
deletedAt: string;
|
|
234
|
+
name: string | null;
|
|
235
|
+
id: string;
|
|
236
|
+
isActive: boolean;
|
|
237
|
+
thumbnailUrl: string | null;
|
|
238
|
+
productId: string;
|
|
239
|
+
sku: string;
|
|
240
|
+
trackInventory: boolean;
|
|
241
|
+
lowStockThreshold: number | null;
|
|
242
|
+
}[];
|
|
243
|
+
name: string;
|
|
244
|
+
id: string;
|
|
245
|
+
slug: string;
|
|
246
|
+
createdAt: string;
|
|
247
|
+
updatedAt: string;
|
|
248
|
+
deletedAt: string;
|
|
249
|
+
brandId: string;
|
|
250
|
+
isActive: boolean;
|
|
251
|
+
description: string | null;
|
|
252
|
+
thumbnailUrl: string | null;
|
|
253
|
+
quantityDiscounts: string | number | boolean | {
|
|
254
|
+
[x: string]: string | number | boolean | /*elided*/ any | {
|
|
255
|
+
[x: number]: string | number | boolean | /*elided*/ any | /*elided*/ any;
|
|
256
|
+
length: number;
|
|
257
|
+
toString: never;
|
|
258
|
+
toLocaleString: never;
|
|
259
|
+
pop: never;
|
|
260
|
+
push: never;
|
|
261
|
+
concat: never;
|
|
262
|
+
join: never;
|
|
263
|
+
reverse: never;
|
|
264
|
+
shift: never;
|
|
265
|
+
slice: never;
|
|
266
|
+
sort: never;
|
|
267
|
+
splice: never;
|
|
268
|
+
unshift: never;
|
|
269
|
+
indexOf: never;
|
|
270
|
+
lastIndexOf: never;
|
|
271
|
+
every: never;
|
|
272
|
+
some: never;
|
|
273
|
+
forEach: never;
|
|
274
|
+
map: never;
|
|
275
|
+
filter: never;
|
|
276
|
+
reduce: never;
|
|
277
|
+
reduceRight: never;
|
|
278
|
+
find: never;
|
|
279
|
+
findIndex: never;
|
|
280
|
+
fill: never;
|
|
281
|
+
copyWithin: never;
|
|
282
|
+
entries: never;
|
|
283
|
+
keys: never;
|
|
284
|
+
values: never;
|
|
285
|
+
includes: never;
|
|
286
|
+
flatMap: never;
|
|
287
|
+
flat: never;
|
|
288
|
+
[Symbol.iterator]: never;
|
|
289
|
+
readonly [Symbol.unscopables]: {
|
|
290
|
+
[x: number]: boolean;
|
|
291
|
+
length?: boolean;
|
|
292
|
+
toString?: boolean;
|
|
293
|
+
toLocaleString?: boolean;
|
|
294
|
+
pop?: boolean;
|
|
295
|
+
push?: boolean;
|
|
296
|
+
concat?: boolean;
|
|
297
|
+
join?: boolean;
|
|
298
|
+
reverse?: boolean;
|
|
299
|
+
shift?: boolean;
|
|
300
|
+
slice?: boolean;
|
|
301
|
+
sort?: boolean;
|
|
302
|
+
splice?: boolean;
|
|
303
|
+
unshift?: boolean;
|
|
304
|
+
indexOf?: boolean;
|
|
305
|
+
lastIndexOf?: boolean;
|
|
306
|
+
every?: boolean;
|
|
307
|
+
some?: boolean;
|
|
308
|
+
forEach?: boolean;
|
|
309
|
+
map?: boolean;
|
|
310
|
+
filter?: boolean;
|
|
311
|
+
reduce?: boolean;
|
|
312
|
+
reduceRight?: boolean;
|
|
313
|
+
find?: boolean;
|
|
314
|
+
findIndex?: boolean;
|
|
315
|
+
fill?: boolean;
|
|
316
|
+
copyWithin?: boolean;
|
|
317
|
+
entries?: boolean;
|
|
318
|
+
keys?: boolean;
|
|
319
|
+
values?: boolean;
|
|
320
|
+
includes?: boolean;
|
|
321
|
+
flatMap?: boolean;
|
|
322
|
+
flat?: boolean;
|
|
323
|
+
};
|
|
324
|
+
};
|
|
325
|
+
} | {
|
|
326
|
+
[x: number]: string | number | boolean | {
|
|
327
|
+
[x: string]: string | number | boolean | /*elided*/ any | /*elided*/ any;
|
|
328
|
+
} | /*elided*/ any;
|
|
329
|
+
length: number;
|
|
330
|
+
toString: never;
|
|
331
|
+
toLocaleString: never;
|
|
332
|
+
pop: never;
|
|
333
|
+
push: never;
|
|
334
|
+
concat: never;
|
|
335
|
+
join: never;
|
|
336
|
+
reverse: never;
|
|
337
|
+
shift: never;
|
|
338
|
+
slice: never;
|
|
339
|
+
sort: never;
|
|
340
|
+
splice: never;
|
|
341
|
+
unshift: never;
|
|
342
|
+
indexOf: never;
|
|
343
|
+
lastIndexOf: never;
|
|
344
|
+
every: never;
|
|
345
|
+
some: never;
|
|
346
|
+
forEach: never;
|
|
347
|
+
map: never;
|
|
348
|
+
filter: never;
|
|
349
|
+
reduce: never;
|
|
350
|
+
reduceRight: never;
|
|
351
|
+
find: never;
|
|
352
|
+
findIndex: never;
|
|
353
|
+
fill: never;
|
|
354
|
+
copyWithin: never;
|
|
355
|
+
entries: never;
|
|
356
|
+
keys: never;
|
|
357
|
+
values: never;
|
|
358
|
+
includes: never;
|
|
359
|
+
flatMap: never;
|
|
360
|
+
flat: never;
|
|
361
|
+
[Symbol.iterator]: never;
|
|
362
|
+
readonly [Symbol.unscopables]: {
|
|
363
|
+
[x: number]: boolean;
|
|
364
|
+
length?: boolean;
|
|
365
|
+
toString?: boolean;
|
|
366
|
+
toLocaleString?: boolean;
|
|
367
|
+
pop?: boolean;
|
|
368
|
+
push?: boolean;
|
|
369
|
+
concat?: boolean;
|
|
370
|
+
join?: boolean;
|
|
371
|
+
reverse?: boolean;
|
|
372
|
+
shift?: boolean;
|
|
373
|
+
slice?: boolean;
|
|
374
|
+
sort?: boolean;
|
|
375
|
+
splice?: boolean;
|
|
376
|
+
unshift?: boolean;
|
|
377
|
+
indexOf?: boolean;
|
|
378
|
+
lastIndexOf?: boolean;
|
|
379
|
+
every?: boolean;
|
|
380
|
+
some?: boolean;
|
|
381
|
+
forEach?: boolean;
|
|
382
|
+
map?: boolean;
|
|
383
|
+
filter?: boolean;
|
|
384
|
+
reduce?: boolean;
|
|
385
|
+
reduceRight?: boolean;
|
|
386
|
+
find?: boolean;
|
|
387
|
+
findIndex?: boolean;
|
|
388
|
+
fill?: boolean;
|
|
389
|
+
copyWithin?: boolean;
|
|
390
|
+
entries?: boolean;
|
|
391
|
+
keys?: boolean;
|
|
392
|
+
values?: boolean;
|
|
393
|
+
includes?: boolean;
|
|
394
|
+
flatMap?: boolean;
|
|
395
|
+
flat?: boolean;
|
|
396
|
+
};
|
|
397
|
+
};
|
|
398
|
+
}, Error>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-safe RPC hooks for product operations
|
|
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 { useQueryUnwrapped } from '../use-query-unwrapped';
|
|
8
|
+
import { queryKeys } from '../../utils/query-keys';
|
|
9
|
+
import { fetchProductsByBrand, fetchProductBySlug } from '../../fetchers/products';
|
|
10
|
+
/**
|
|
11
|
+
* Hook to get products by brand using RPC
|
|
12
|
+
*
|
|
13
|
+
* @param brandId - Brand UUID
|
|
14
|
+
* @param options - React Query options
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* const { data: products, isLoading } = useGetProducts('brand-123');
|
|
19
|
+
* console.log(products?.data[0].name); // Fully typed!
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function useGetProducts(brandId, options) {
|
|
23
|
+
return useQueryUnwrapped({
|
|
24
|
+
queryKey: queryKeys.public.products.list(brandId),
|
|
25
|
+
queryFn: () => fetchProductsByBrand(brandId),
|
|
26
|
+
...options,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Hook to get a single product by slug using RPC
|
|
31
|
+
*
|
|
32
|
+
* @param slug - Product slug
|
|
33
|
+
* @param options - React Query options
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```tsx
|
|
37
|
+
* const { data: product, isLoading } = useGetProduct('cotton-t-shirt');
|
|
38
|
+
* console.log(product?.name); // Fully typed!
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export function useGetProduct(slug, options) {
|
|
42
|
+
return useQueryUnwrapped({
|
|
43
|
+
queryKey: queryKeys.public.products.detail(slug),
|
|
44
|
+
queryFn: () => fetchProductBySlug(slug),
|
|
45
|
+
...options,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';
|
|
2
|
+
/**
|
|
3
|
+
* Wrapper around useQuery that narrows the data type to exclude error responses
|
|
4
|
+
*
|
|
5
|
+
* Since our hooks throw on HTTP errors (via `if (!res.ok) throw new Error(...)`),
|
|
6
|
+
* the data will never actually be an error response at runtime. This wrapper
|
|
7
|
+
* tells TypeScript that truth.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* // Instead of:
|
|
12
|
+
* return useQuery({ ... }) // Returns UseQueryResult<Data | { error: ... }, Error>
|
|
13
|
+
*
|
|
14
|
+
* // Use:
|
|
15
|
+
* return useQueryUnwrapped({ ... }) // Returns UseQueryResult<Data, Error>
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare function useQueryUnwrapped<TData, TError = Error, TQueryKey extends readonly unknown[] = readonly unknown[]>(options: UseQueryOptions<TData, TError, TData, TQueryKey>): UseQueryResult<Exclude<TData, {
|
|
19
|
+
error: any;
|
|
20
|
+
}>, TError>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useQuery } from '@tanstack/react-query';
|
|
2
|
+
/**
|
|
3
|
+
* Wrapper around useQuery that narrows the data type to exclude error responses
|
|
4
|
+
*
|
|
5
|
+
* Since our hooks throw on HTTP errors (via `if (!res.ok) throw new Error(...)`),
|
|
6
|
+
* the data will never actually be an error response at runtime. This wrapper
|
|
7
|
+
* tells TypeScript that truth.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* // Instead of:
|
|
12
|
+
* return useQuery({ ... }) // Returns UseQueryResult<Data | { error: ... }, Error>
|
|
13
|
+
*
|
|
14
|
+
* // Use:
|
|
15
|
+
* return useQueryUnwrapped({ ... }) // Returns UseQueryResult<Data, Error>
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export function useQueryUnwrapped(options) {
|
|
19
|
+
const result = useQuery(options);
|
|
20
|
+
// Cast the data to exclude error types since we throw on errors
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook to access API configuration from context
|
|
3
|
+
*/
|
|
4
|
+
import { useApiClientContext } from '../provider';
|
|
5
|
+
/**
|
|
6
|
+
* Get API configuration from context
|
|
7
|
+
*/
|
|
8
|
+
export function useApiConfig() {
|
|
9
|
+
const { baseURL, authToken } = useApiClientContext();
|
|
10
|
+
return {
|
|
11
|
+
baseURL,
|
|
12
|
+
authToken: authToken || '',
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @oms/api-client
|
|
3
|
+
*
|
|
4
|
+
* Type-safe React Query hooks for OMS API using Hono RPC
|
|
5
|
+
*/
|
|
6
|
+
export { ApiClientProvider, useApiClientContext } from './provider';
|
|
7
|
+
export type { ApiClientProviderProps } from './provider';
|
|
8
|
+
export { useApiConfig } from './hooks/useApiConfig';
|
|
9
|
+
export type { ApiConfig } from './hooks/useApiConfig';
|
|
10
|
+
export { getApiClient, initializeApiClient, resetApiClient } from './client';
|
|
11
|
+
export type { ApiClientConfig } from './client';
|
|
12
|
+
export { createRpcClients, createAdminRpcClients, authHeaders } from './rpc-client';
|
|
13
|
+
export type { RpcClients, AdminRpcClients } from './rpc-client';
|
|
14
|
+
export * from './fetchers';
|
|
15
|
+
export { queryKeys } from './utils/query-keys';
|
|
16
|
+
export * from './hooks/public';
|
|
17
|
+
import * as publicHooks from './hooks/public';
|
|
18
|
+
import * as adminHooks from './hooks/admin';
|
|
19
|
+
export { publicHooks as publicApi, adminHooks as adminApi };
|
|
20
|
+
export type * from './types';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @oms/api-client
|
|
3
|
+
*
|
|
4
|
+
* Type-safe React Query hooks for OMS API using Hono RPC
|
|
5
|
+
*/
|
|
6
|
+
// Export provider
|
|
7
|
+
export { ApiClientProvider, useApiClientContext } from './provider';
|
|
8
|
+
// Export API config hook
|
|
9
|
+
export { useApiConfig } from './hooks/useApiConfig';
|
|
10
|
+
// Export client utilities (legacy axios client - deprecated)
|
|
11
|
+
export { getApiClient, initializeApiClient, resetApiClient } from './client';
|
|
12
|
+
// Export RPC client utilities (type-safe Hono RPC)
|
|
13
|
+
export { createRpcClients, createAdminRpcClients, authHeaders } from './rpc-client';
|
|
14
|
+
// Export fetchers for Server Components (can be used without hooks)
|
|
15
|
+
export * from './fetchers';
|
|
16
|
+
// Export query keys for advanced usage
|
|
17
|
+
export { queryKeys } from './utils/query-keys';
|
|
18
|
+
// Export all public hooks directly from main package
|
|
19
|
+
// These can be imported as: import { useGetCart } from '@oms/api-client'
|
|
20
|
+
export * from './hooks/public';
|
|
21
|
+
// Export namespaced versions for backward compatibility
|
|
22
|
+
// These can be imported as: import { publicApi, adminApi } from '@oms/api-client'
|
|
23
|
+
import * as publicHooks from './hooks/public';
|
|
24
|
+
import * as adminHooks from './hooks/admin';
|
|
25
|
+
export { publicHooks as publicApi, adminHooks as adminApi };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React context provider for API client configuration
|
|
3
|
+
*/
|
|
4
|
+
import { ReactNode } from 'react';
|
|
5
|
+
import { QueryClient } from '@tanstack/react-query';
|
|
6
|
+
import { AxiosError } from 'axios';
|
|
7
|
+
interface ApiClientContextValue {
|
|
8
|
+
baseURL: string;
|
|
9
|
+
authToken?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ApiClientProviderProps {
|
|
12
|
+
children: ReactNode;
|
|
13
|
+
baseURL?: string;
|
|
14
|
+
authToken?: string;
|
|
15
|
+
onError?: (error: AxiosError) => void;
|
|
16
|
+
queryClient?: QueryClient;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Provider component that initializes the API client and React Query
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* <ApiClientProvider>
|
|
24
|
+
* <App />
|
|
25
|
+
* </ApiClientProvider>
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function ApiClientProvider({ children, baseURL, authToken, onError, queryClient: externalQueryClient }: ApiClientProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
/**
|
|
30
|
+
* Hook to access API client context
|
|
31
|
+
*/
|
|
32
|
+
export declare function useApiClientContext(): ApiClientContextValue;
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* React context provider for API client configuration
|
|
4
|
+
*/
|
|
5
|
+
import { createContext, useContext, useEffect, useMemo } from 'react';
|
|
6
|
+
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
7
|
+
import { initializeApiClient } from './client';
|
|
8
|
+
const ApiClientContext = createContext(null);
|
|
9
|
+
/**
|
|
10
|
+
* Provider component that initializes the API client and React Query
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <ApiClientProvider>
|
|
15
|
+
* <App />
|
|
16
|
+
* </ApiClientProvider>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export function ApiClientProvider({ children, baseURL = 'https://oms-api.instock.ng', authToken, onError, queryClient: externalQueryClient }) {
|
|
20
|
+
// Initialize client synchronously on first render
|
|
21
|
+
const config = {
|
|
22
|
+
baseURL,
|
|
23
|
+
onError,
|
|
24
|
+
};
|
|
25
|
+
initializeApiClient(config);
|
|
26
|
+
// Update client when config changes
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
initializeApiClient(config);
|
|
29
|
+
}, [baseURL, onError]);
|
|
30
|
+
// Create a default query client if one isn't provided
|
|
31
|
+
const queryClient = useMemo(() => externalQueryClient ||
|
|
32
|
+
new QueryClient({
|
|
33
|
+
defaultOptions: {
|
|
34
|
+
queries: {
|
|
35
|
+
retry: 1,
|
|
36
|
+
refetchOnWindowFocus: false,
|
|
37
|
+
staleTime: 5000,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
}), [externalQueryClient]);
|
|
41
|
+
return (_jsx(QueryClientProvider, { client: queryClient, children: _jsx(ApiClientContext.Provider, { value: { baseURL, authToken }, children: children }) }));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Hook to access API client context
|
|
45
|
+
*/
|
|
46
|
+
export function useApiClientContext() {
|
|
47
|
+
const context = useContext(ApiClientContext);
|
|
48
|
+
if (!context) {
|
|
49
|
+
throw new Error('useApiClientContext must be used within ApiClientProvider');
|
|
50
|
+
}
|
|
51
|
+
return context;
|
|
52
|
+
}
|