@rovela-ai/sdk 0.3.6 → 0.3.7
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/admin/components/CategoryForm.d.ts.map +1 -1
- package/dist/admin/components/CategoryForm.js +54 -65
- package/dist/admin/components/CategoryForm.js.map +1 -1
- package/dist/admin/components/CategorySelect.d.ts.map +1 -1
- package/dist/admin/components/CategorySelect.js +9 -14
- package/dist/admin/components/CategorySelect.js.map +1 -1
- package/dist/admin/components/CustomerDetails.js +3 -3
- package/dist/admin/components/CustomerDetails.js.map +1 -1
- package/dist/admin/components/CustomerTable.js +3 -3
- package/dist/admin/components/CustomerTable.js.map +1 -1
- package/dist/admin/components/LogoUpload.d.ts.map +1 -1
- package/dist/admin/components/LogoUpload.js +49 -67
- package/dist/admin/components/LogoUpload.js.map +1 -1
- package/dist/admin/components/OrderDetails.d.ts.map +1 -1
- package/dist/admin/components/OrderDetails.js +34 -65
- package/dist/admin/components/OrderDetails.js.map +1 -1
- package/dist/admin/components/OrderTable.js +2 -2
- package/dist/admin/components/OrderTable.js.map +1 -1
- package/dist/admin/components/PaymentSettings.d.ts.map +1 -1
- package/dist/admin/components/PaymentSettings.js +28 -51
- package/dist/admin/components/PaymentSettings.js.map +1 -1
- package/dist/admin/components/ProductTable.js +3 -3
- package/dist/admin/components/ProductTable.js.map +1 -1
- package/dist/admin/components/ShippingSettings.d.ts.map +1 -1
- package/dist/admin/components/ShippingSettings.js +177 -244
- package/dist/admin/components/ShippingSettings.js.map +1 -1
- package/dist/admin/components/StoreSettings.d.ts.map +1 -1
- package/dist/admin/components/StoreSettings.js +28 -42
- package/dist/admin/components/StoreSettings.js.map +1 -1
- package/dist/admin/components/TaxSettings.d.ts.map +1 -1
- package/dist/admin/components/TaxSettings.js +49 -81
- package/dist/admin/components/TaxSettings.js.map +1 -1
- package/dist/admin/hooks/fetchAdminApi.d.ts +65 -0
- package/dist/admin/hooks/fetchAdminApi.d.ts.map +1 -0
- package/dist/admin/hooks/fetchAdminApi.js +96 -0
- package/dist/admin/hooks/fetchAdminApi.js.map +1 -0
- package/dist/admin/hooks/useAdminCategories.d.ts +0 -27
- package/dist/admin/hooks/useAdminCategories.d.ts.map +1 -1
- package/dist/admin/hooks/useAdminCategories.js +39 -147
- package/dist/admin/hooks/useAdminCategories.js.map +1 -1
- package/dist/admin/hooks/useAdminCustomers.d.ts +0 -38
- package/dist/admin/hooks/useAdminCustomers.d.ts.map +1 -1
- package/dist/admin/hooks/useAdminCustomers.js +66 -172
- package/dist/admin/hooks/useAdminCustomers.js.map +1 -1
- package/dist/admin/hooks/useAdminMe.d.ts.map +1 -1
- package/dist/admin/hooks/useAdminMe.js +31 -59
- package/dist/admin/hooks/useAdminMe.js.map +1 -1
- package/dist/admin/hooks/useAdminOrders.d.ts +0 -38
- package/dist/admin/hooks/useAdminOrders.d.ts.map +1 -1
- package/dist/admin/hooks/useAdminOrders.js +66 -208
- package/dist/admin/hooks/useAdminOrders.js.map +1 -1
- package/dist/admin/hooks/useAdminProducts.d.ts +0 -36
- package/dist/admin/hooks/useAdminProducts.d.ts.map +1 -1
- package/dist/admin/hooks/useAdminProducts.js +61 -180
- package/dist/admin/hooks/useAdminProducts.js.map +1 -1
- package/dist/admin/hooks/useAdminStats.d.ts.map +1 -1
- package/dist/admin/hooks/useAdminStats.js +26 -38
- package/dist/admin/hooks/useAdminStats.js.map +1 -1
- package/dist/admin/hooks/useAdminUsers.d.ts.map +1 -1
- package/dist/admin/hooks/useAdminUsers.js +82 -145
- package/dist/admin/hooks/useAdminUsers.js.map +1 -1
- package/dist/admin/types.d.ts +4 -4
- package/dist/admin/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -2,218 +2,99 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* @rovela/sdk/admin/hooks/useAdminProducts
|
|
4
4
|
*
|
|
5
|
-
* Product management hook for admin panel.
|
|
5
|
+
* Product management hook for admin panel. All HTTP calls go through
|
|
6
|
+
* `fetchAdminApi` which returns a discriminated union instead of throwing
|
|
7
|
+
* on non-ok responses — that keeps expected 403/404 from surfacing as
|
|
8
|
+
* Next.js dev overlays and ensures callers receive specific server error
|
|
9
|
+
* messages (including the friendly "You don't have permission to do this."
|
|
10
|
+
* translation for curt 403 responses).
|
|
6
11
|
*/
|
|
7
12
|
import { useState, useCallback } from 'react';
|
|
13
|
+
import { fetchAdminApi } from './fetchAdminApi';
|
|
8
14
|
// =============================================================================
|
|
9
15
|
// Hook Implementation
|
|
10
16
|
// =============================================================================
|
|
11
|
-
/**
|
|
12
|
-
* Product management hook for admin panel.
|
|
13
|
-
*
|
|
14
|
-
* @returns Products data and CRUD methods
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* function ProductsPage() {
|
|
19
|
-
* const {
|
|
20
|
-
* products,
|
|
21
|
-
* total,
|
|
22
|
-
* page,
|
|
23
|
-
* isLoading,
|
|
24
|
-
* error,
|
|
25
|
-
* fetchProducts,
|
|
26
|
-
* createProduct,
|
|
27
|
-
* updateProduct,
|
|
28
|
-
* deleteProduct,
|
|
29
|
-
* updateVariant,
|
|
30
|
-
* } = useAdminProducts()
|
|
31
|
-
*
|
|
32
|
-
* useEffect(() => {
|
|
33
|
-
* fetchProducts({ status: 'active', sort: 'newest' })
|
|
34
|
-
* }, [fetchProducts])
|
|
35
|
-
*
|
|
36
|
-
* const handleCreate = async (data: ProductFormData) => {
|
|
37
|
-
* const result = await createProduct(data)
|
|
38
|
-
* if (result.success) {
|
|
39
|
-
* fetchProducts() // Refresh list
|
|
40
|
-
* }
|
|
41
|
-
* }
|
|
42
|
-
*
|
|
43
|
-
* return <ProductTable products={products} onCreate={handleCreate} />
|
|
44
|
-
* }
|
|
45
|
-
* ```
|
|
46
|
-
*/
|
|
47
17
|
export function useAdminProducts() {
|
|
48
18
|
const [products, setProducts] = useState([]);
|
|
49
19
|
const [total, setTotal] = useState(0);
|
|
50
20
|
const [page, setPage] = useState(1);
|
|
51
21
|
const [isLoading, setIsLoading] = useState(false);
|
|
52
22
|
const [error, setError] = useState(null);
|
|
53
|
-
/**
|
|
54
|
-
* Fetch products with optional filters.
|
|
55
|
-
*/
|
|
56
23
|
const fetchProducts = useCallback(async (options = {}) => {
|
|
57
24
|
const { search, category, status, sort = 'newest', page: pageNum = 1, limit = 20, } = options;
|
|
58
25
|
setIsLoading(true);
|
|
59
26
|
setError(null);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
const data = await response.json();
|
|
77
|
-
setProducts(data.data || []);
|
|
78
|
-
setTotal(data.total || 0);
|
|
79
|
-
setPage(data.page || 1);
|
|
80
|
-
}
|
|
81
|
-
catch (err) {
|
|
82
|
-
console.error('[useAdminProducts] Fetch error:', err);
|
|
83
|
-
setError(err instanceof Error ? err.message : 'Failed to fetch products');
|
|
84
|
-
}
|
|
85
|
-
finally {
|
|
86
|
-
setIsLoading(false);
|
|
27
|
+
const params = new URLSearchParams();
|
|
28
|
+
if (search)
|
|
29
|
+
params.set('search', search);
|
|
30
|
+
if (category)
|
|
31
|
+
params.set('category', category);
|
|
32
|
+
if (status)
|
|
33
|
+
params.set('status', status);
|
|
34
|
+
params.set('sort', sort);
|
|
35
|
+
params.set('page', pageNum.toString());
|
|
36
|
+
params.set('limit', limit.toString());
|
|
37
|
+
const res = await fetchAdminApi(`/api/admin/products?${params.toString()}`);
|
|
38
|
+
setIsLoading(false);
|
|
39
|
+
if (!res.ok) {
|
|
40
|
+
setError(res.error);
|
|
41
|
+
return;
|
|
87
42
|
}
|
|
43
|
+
setProducts(res.data.data || []);
|
|
44
|
+
setTotal(res.data.total || 0);
|
|
45
|
+
setPage(res.data.page || 1);
|
|
88
46
|
}, []);
|
|
89
|
-
/**
|
|
90
|
-
* Get a single product by ID.
|
|
91
|
-
*/
|
|
92
47
|
const getProduct = useCallback(async (id) => {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const data = await response.json();
|
|
97
|
-
throw new Error(data.error || 'Failed to fetch product');
|
|
98
|
-
}
|
|
99
|
-
const data = await response.json();
|
|
100
|
-
return data.data;
|
|
101
|
-
}
|
|
102
|
-
catch (err) {
|
|
103
|
-
console.error('[useAdminProducts] Get product error:', err);
|
|
104
|
-
setError(err instanceof Error ? err.message : 'Failed to fetch product');
|
|
48
|
+
const res = await fetchAdminApi(`/api/admin/products/${id}`);
|
|
49
|
+
if (!res.ok) {
|
|
50
|
+
setError(res.error);
|
|
105
51
|
return null;
|
|
106
52
|
}
|
|
53
|
+
return res.data.data;
|
|
107
54
|
}, []);
|
|
108
|
-
/**
|
|
109
|
-
* Create a new product.
|
|
110
|
-
*/
|
|
111
55
|
const createProduct = useCallback(async (data) => {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if (!response.ok) {
|
|
120
|
-
return {
|
|
121
|
-
success: false,
|
|
122
|
-
error: result.error || 'Failed to create product',
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
return {
|
|
126
|
-
success: true,
|
|
127
|
-
data: result.data,
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
catch (err) {
|
|
131
|
-
console.error('[useAdminProducts] Create error:', err);
|
|
132
|
-
return {
|
|
133
|
-
success: false,
|
|
134
|
-
error: err instanceof Error ? err.message : 'Failed to create product',
|
|
135
|
-
};
|
|
56
|
+
const res = await fetchAdminApi('/api/admin/products', {
|
|
57
|
+
method: 'POST',
|
|
58
|
+
headers: { 'Content-Type': 'application/json' },
|
|
59
|
+
body: JSON.stringify(data),
|
|
60
|
+
});
|
|
61
|
+
if (!res.ok) {
|
|
62
|
+
return { success: false, error: res.error };
|
|
136
63
|
}
|
|
64
|
+
return { success: true, data: res.data.data };
|
|
137
65
|
}, []);
|
|
138
|
-
/**
|
|
139
|
-
* Update an existing product.
|
|
140
|
-
*/
|
|
141
66
|
const updateProduct = useCallback(async (id, data) => {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
if (!response.ok) {
|
|
150
|
-
return {
|
|
151
|
-
success: false,
|
|
152
|
-
error: result.error || 'Failed to update product',
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
return {
|
|
156
|
-
success: true,
|
|
157
|
-
data: result.data,
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
catch (err) {
|
|
161
|
-
console.error('[useAdminProducts] Update error:', err);
|
|
162
|
-
return {
|
|
163
|
-
success: false,
|
|
164
|
-
error: err instanceof Error ? err.message : 'Failed to update product',
|
|
165
|
-
};
|
|
67
|
+
const res = await fetchAdminApi(`/api/admin/products/${id}`, {
|
|
68
|
+
method: 'PUT',
|
|
69
|
+
headers: { 'Content-Type': 'application/json' },
|
|
70
|
+
body: JSON.stringify(data),
|
|
71
|
+
});
|
|
72
|
+
if (!res.ok) {
|
|
73
|
+
return { success: false, error: res.error };
|
|
166
74
|
}
|
|
75
|
+
return { success: true, data: res.data.data };
|
|
167
76
|
}, []);
|
|
168
|
-
/**
|
|
169
|
-
* Delete a product.
|
|
170
|
-
*/
|
|
171
77
|
const deleteProduct = useCallback(async (id) => {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
throw new Error(data.error || 'Failed to delete product');
|
|
179
|
-
}
|
|
180
|
-
return true;
|
|
181
|
-
}
|
|
182
|
-
catch (err) {
|
|
183
|
-
console.error('[useAdminProducts] Delete error:', err);
|
|
184
|
-
setError(err instanceof Error ? err.message : 'Failed to delete product');
|
|
185
|
-
return false;
|
|
78
|
+
const res = await fetchAdminApi(`/api/admin/products/${id}`, {
|
|
79
|
+
method: 'DELETE',
|
|
80
|
+
});
|
|
81
|
+
if (!res.ok) {
|
|
82
|
+
setError(res.error);
|
|
83
|
+
return { success: false, error: res.error };
|
|
186
84
|
}
|
|
85
|
+
setError(null);
|
|
86
|
+
return { success: true };
|
|
187
87
|
}, []);
|
|
188
|
-
/**
|
|
189
|
-
* Update a product variant.
|
|
190
|
-
*/
|
|
191
88
|
const updateVariant = useCallback(async (productId, variantId, data) => {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
if (!response.ok) {
|
|
200
|
-
return {
|
|
201
|
-
success: false,
|
|
202
|
-
error: result.error || 'Failed to update variant',
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
return {
|
|
206
|
-
success: true,
|
|
207
|
-
data: result.data,
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
catch (err) {
|
|
211
|
-
console.error('[useAdminProducts] Update variant error:', err);
|
|
212
|
-
return {
|
|
213
|
-
success: false,
|
|
214
|
-
error: err instanceof Error ? err.message : 'Failed to update variant',
|
|
215
|
-
};
|
|
89
|
+
const res = await fetchAdminApi(`/api/admin/products/${productId}/variants/${variantId}`, {
|
|
90
|
+
method: 'PUT',
|
|
91
|
+
headers: { 'Content-Type': 'application/json' },
|
|
92
|
+
body: JSON.stringify(data),
|
|
93
|
+
});
|
|
94
|
+
if (!res.ok) {
|
|
95
|
+
return { success: false, error: res.error };
|
|
216
96
|
}
|
|
97
|
+
return { success: true, data: res.data.data };
|
|
217
98
|
}, []);
|
|
218
99
|
return {
|
|
219
100
|
products,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAdminProducts.js","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminProducts.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ
|
|
1
|
+
{"version":3,"file":"useAdminProducts.js","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminProducts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAdminStats.d.ts","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminStats.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useAdminStats.d.ts","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminStats.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAMV,mBAAmB,EACpB,MAAM,UAAU,CAAA;AAMjB,UAAU,YAAY;IACpB,kCAAkC;IAClC,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,qCAAqC;IACrC,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,uCAAuC;IACvC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,yCAAyC;IACzC,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,YAAiB,GAAG,mBAAmB,CAmF7E"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Dashboard statistics hook for admin panel.
|
|
6
6
|
*/
|
|
7
7
|
import { useState, useCallback, useEffect } from 'react';
|
|
8
|
+
import { fetchAdminApi } from './fetchAdminApi';
|
|
8
9
|
// =============================================================================
|
|
9
10
|
// Hook Implementation
|
|
10
11
|
// =============================================================================
|
|
@@ -48,45 +49,32 @@ export function useAdminStats(options = {}) {
|
|
|
48
49
|
const refresh = useCallback(async () => {
|
|
49
50
|
setIsLoading(true);
|
|
50
51
|
setError(null);
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
throw new Error(data.error || 'Failed to fetch stats');
|
|
64
|
-
}
|
|
65
|
-
const data = await response.json();
|
|
66
|
-
setStats(data.stats);
|
|
67
|
-
setLowStock(data.lowStock || []);
|
|
68
|
-
// Map API response to RecentOrder type
|
|
69
|
-
setRecentOrders((data.recentOrders || []).map((order) => ({
|
|
70
|
-
id: order.id,
|
|
71
|
-
email: order.email,
|
|
72
|
-
status: order.status,
|
|
73
|
-
total: order.total,
|
|
74
|
-
createdAt: order.createdAt,
|
|
75
|
-
})));
|
|
76
|
-
if (data.revenueByDay) {
|
|
77
|
-
setRevenueByDay(data.revenueByDay);
|
|
78
|
-
}
|
|
79
|
-
if (data.ordersByStatus) {
|
|
80
|
-
setOrdersByStatus(data.ordersByStatus);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
catch (err) {
|
|
84
|
-
console.error('[useAdminStats] Fetch error:', err);
|
|
85
|
-
setError(err instanceof Error ? err.message : 'Failed to fetch stats');
|
|
86
|
-
}
|
|
87
|
-
finally {
|
|
88
|
-
setIsLoading(false);
|
|
52
|
+
const params = new URLSearchParams();
|
|
53
|
+
if (includeRevenue)
|
|
54
|
+
params.set('includeRevenue', 'true');
|
|
55
|
+
if (includeOrderStatus)
|
|
56
|
+
params.set('includeOrderStatus', 'true');
|
|
57
|
+
params.set('lowStockThreshold', lowStockThreshold.toString());
|
|
58
|
+
params.set('recentOrdersLimit', recentOrdersLimit.toString());
|
|
59
|
+
const res = await fetchAdminApi(`/api/admin/stats?${params.toString()}`);
|
|
60
|
+
setIsLoading(false);
|
|
61
|
+
if (!res.ok) {
|
|
62
|
+
setError(res.error);
|
|
63
|
+
return;
|
|
89
64
|
}
|
|
65
|
+
setStats(res.data.stats);
|
|
66
|
+
setLowStock(res.data.lowStock || []);
|
|
67
|
+
setRecentOrders((res.data.recentOrders || []).map((order) => ({
|
|
68
|
+
id: order.id,
|
|
69
|
+
email: order.email,
|
|
70
|
+
status: order.status,
|
|
71
|
+
total: order.total,
|
|
72
|
+
createdAt: order.createdAt,
|
|
73
|
+
})));
|
|
74
|
+
if (res.data.revenueByDay)
|
|
75
|
+
setRevenueByDay(res.data.revenueByDay);
|
|
76
|
+
if (res.data.ordersByStatus)
|
|
77
|
+
setOrdersByStatus(res.data.ordersByStatus);
|
|
90
78
|
}, [includeRevenue, includeOrderStatus, lowStockThreshold, recentOrdersLimit]);
|
|
91
79
|
// Auto-fetch on mount
|
|
92
80
|
useEffect(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAdminStats.js","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminStats.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"useAdminStats.js","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminStats.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAdminUsers.d.ts","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminUsers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useAdminUsers.d.ts","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminUsers.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAKV,mBAAmB,EACpB,MAAM,UAAU,CAAA;AAOjB,wBAAgB,aAAa,IAAI,mBAAmB,CA0NnD"}
|