@rovela-ai/sdk 0.1.21 → 0.1.23

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.
Files changed (109) hide show
  1. package/dist/admin/api/customers.d.ts +38 -2
  2. package/dist/admin/api/customers.d.ts.map +1 -1
  3. package/dist/admin/api/customers.js +98 -3
  4. package/dist/admin/api/customers.js.map +1 -1
  5. package/dist/admin/api/index.d.ts +2 -2
  6. package/dist/admin/api/index.d.ts.map +1 -1
  7. package/dist/admin/api/index.js +2 -2
  8. package/dist/admin/api/index.js.map +1 -1
  9. package/dist/admin/api/products.d.ts +1 -0
  10. package/dist/admin/api/products.d.ts.map +1 -1
  11. package/dist/admin/api/products.js +78 -1
  12. package/dist/admin/api/products.js.map +1 -1
  13. package/dist/admin/components/CategoryForm.js +2 -2
  14. package/dist/admin/components/CategoryForm.js.map +1 -1
  15. package/dist/admin/components/CategorySelect.d.ts.map +1 -1
  16. package/dist/admin/components/CategorySelect.js +7 -2
  17. package/dist/admin/components/CategorySelect.js.map +1 -1
  18. package/dist/admin/components/CustomerDetails.d.ts +15 -0
  19. package/dist/admin/components/CustomerDetails.d.ts.map +1 -0
  20. package/dist/admin/components/CustomerDetails.js +173 -0
  21. package/dist/admin/components/CustomerDetails.js.map +1 -0
  22. package/dist/admin/components/CustomerTable.d.ts +13 -0
  23. package/dist/admin/components/CustomerTable.d.ts.map +1 -0
  24. package/dist/admin/components/CustomerTable.js +109 -0
  25. package/dist/admin/components/CustomerTable.js.map +1 -0
  26. package/dist/admin/components/DeleteConfirmDialog.d.ts +47 -0
  27. package/dist/admin/components/DeleteConfirmDialog.d.ts.map +1 -0
  28. package/dist/admin/components/DeleteConfirmDialog.js +28 -0
  29. package/dist/admin/components/DeleteConfirmDialog.js.map +1 -0
  30. package/dist/admin/components/InventoryEditor.d.ts.map +1 -1
  31. package/dist/admin/components/InventoryEditor.js +12 -7
  32. package/dist/admin/components/InventoryEditor.js.map +1 -1
  33. package/dist/admin/components/OrderDetails.d.ts.map +1 -1
  34. package/dist/admin/components/OrderDetails.js +8 -3
  35. package/dist/admin/components/OrderDetails.js.map +1 -1
  36. package/dist/admin/components/OrderTable.d.ts.map +1 -1
  37. package/dist/admin/components/OrderTable.js +8 -3
  38. package/dist/admin/components/OrderTable.js.map +1 -1
  39. package/dist/admin/components/ProductForm.d.ts.map +1 -1
  40. package/dist/admin/components/ProductForm.js +50 -12
  41. package/dist/admin/components/ProductForm.js.map +1 -1
  42. package/dist/admin/components/ProductTable.d.ts.map +1 -1
  43. package/dist/admin/components/ProductTable.js +35 -8
  44. package/dist/admin/components/ProductTable.js.map +1 -1
  45. package/dist/admin/components/RecentOrders.d.ts.map +1 -1
  46. package/dist/admin/components/RecentOrders.js +8 -3
  47. package/dist/admin/components/RecentOrders.js.map +1 -1
  48. package/dist/admin/components/RefundDialog.d.ts.map +1 -1
  49. package/dist/admin/components/RefundDialog.js +7 -2
  50. package/dist/admin/components/RefundDialog.js.map +1 -1
  51. package/dist/admin/components/StoreSettings.d.ts.map +1 -1
  52. package/dist/admin/components/StoreSettings.js +8 -2
  53. package/dist/admin/components/StoreSettings.js.map +1 -1
  54. package/dist/admin/components/VariantManager.d.ts +1 -0
  55. package/dist/admin/components/VariantManager.d.ts.map +1 -1
  56. package/dist/admin/components/VariantManager.js +48 -8
  57. package/dist/admin/components/VariantManager.js.map +1 -1
  58. package/dist/admin/components/index.d.ts +3 -0
  59. package/dist/admin/components/index.d.ts.map +1 -1
  60. package/dist/admin/components/index.js +6 -0
  61. package/dist/admin/components/index.js.map +1 -1
  62. package/dist/admin/hooks/index.d.ts +1 -0
  63. package/dist/admin/hooks/index.d.ts.map +1 -1
  64. package/dist/admin/hooks/index.js +1 -0
  65. package/dist/admin/hooks/index.js.map +1 -1
  66. package/dist/admin/hooks/useAdminCustomers.d.ts +41 -0
  67. package/dist/admin/hooks/useAdminCustomers.d.ts.map +1 -0
  68. package/dist/admin/hooks/useAdminCustomers.js +216 -0
  69. package/dist/admin/hooks/useAdminCustomers.js.map +1 -0
  70. package/dist/admin/index.d.ts +3 -3
  71. package/dist/admin/index.d.ts.map +1 -1
  72. package/dist/admin/index.js +4 -2
  73. package/dist/admin/index.js.map +1 -1
  74. package/dist/admin/types.d.ts +45 -0
  75. package/dist/admin/types.d.ts.map +1 -1
  76. package/dist/cart/components/CartDrawer.d.ts.map +1 -1
  77. package/dist/cart/components/CartDrawer.js +7 -2
  78. package/dist/cart/components/CartDrawer.js.map +1 -1
  79. package/dist/cart/components/CartItem.d.ts.map +1 -1
  80. package/dist/cart/components/CartItem.js +7 -2
  81. package/dist/cart/components/CartItem.js.map +1 -1
  82. package/dist/cart/components/CartSummary.d.ts.map +1 -1
  83. package/dist/cart/components/CartSummary.js +7 -2
  84. package/dist/cart/components/CartSummary.js.map +1 -1
  85. package/dist/core/db/queries.d.ts +46 -0
  86. package/dist/core/db/queries.d.ts.map +1 -1
  87. package/dist/core/db/queries.js +37 -5
  88. package/dist/core/db/queries.js.map +1 -1
  89. package/dist/core/db/schema.d.ts +146 -0
  90. package/dist/core/db/schema.d.ts.map +1 -1
  91. package/dist/core/db/schema.js +10 -0
  92. package/dist/core/db/schema.js.map +1 -1
  93. package/dist/core/index.d.ts +1 -1
  94. package/dist/core/index.d.ts.map +1 -1
  95. package/dist/core/index.js +1 -1
  96. package/dist/core/index.js.map +1 -1
  97. package/dist/core/types.d.ts +7 -0
  98. package/dist/core/types.d.ts.map +1 -1
  99. package/dist/core/utils.d.ts +14 -0
  100. package/dist/core/utils.d.ts.map +1 -1
  101. package/dist/core/utils.js +24 -0
  102. package/dist/core/utils.js.map +1 -1
  103. package/dist/products/components/ProductCard.d.ts.map +1 -1
  104. package/dist/products/components/ProductCard.js +7 -2
  105. package/dist/products/components/ProductCard.js.map +1 -1
  106. package/dist/products/components/ProductDetails.d.ts.map +1 -1
  107. package/dist/products/components/ProductDetails.js +12 -2
  108. package/dist/products/components/ProductDetails.js.map +1 -1
  109. package/package.json +1 -1
@@ -0,0 +1,15 @@
1
+ import type { CustomerDetailsProps } from '../types';
2
+ /**
3
+ * Customer details view with order history and actions.
4
+ *
5
+ * @example
6
+ * ```tsx
7
+ * <CustomerDetails
8
+ * customerId="123"
9
+ * onBack={() => router.push('/admin/customers')}
10
+ * onDelete={() => router.push('/admin/customers')}
11
+ * />
12
+ * ```
13
+ */
14
+ export declare function CustomerDetails({ customerId, onBack, onDelete, className, }: CustomerDetailsProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=CustomerDetails.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomerDetails.d.ts","sourceRoot":"","sources":["../../../src/admin/components/CustomerDetails.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,oBAAoB,EAAuB,MAAM,UAAU,CAAA;AA+DzE;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,EAC9B,UAAU,EACV,MAAM,EACN,QAAQ,EACR,SAAc,GACf,EAAE,oBAAoB,2CA+ZtB"}
@@ -0,0 +1,173 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * @rovela/sdk/admin/components/CustomerDetails
5
+ *
6
+ * Full customer details view with order history and actions.
7
+ */
8
+ import { useState, useEffect, useCallback } from 'react';
9
+ import { useAdminCustomers } from '../hooks/useAdminCustomers';
10
+ import { useStoreSettingsOptional } from '../../core/StoreSettingsProvider';
11
+ import { DeleteConfirmDialog } from './DeleteConfirmDialog';
12
+ import { ArrowLeft, Mail, User, Calendar, CheckCircle, Clock, CreditCard, ShoppingBag, DollarSign, Pencil, Trash2, X, Check, } from 'lucide-react';
13
+ // =============================================================================
14
+ // Status Badge
15
+ // =============================================================================
16
+ function VerificationBadge({ verified }) {
17
+ if (verified) {
18
+ return (_jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-green-100 px-2 py-1 text-xs font-medium text-green-800", children: [_jsx(CheckCircle, { className: "h-3 w-3" }), "Verified"] }));
19
+ }
20
+ return (_jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-yellow-100 px-2 py-1 text-xs font-medium text-yellow-800", children: [_jsx(Clock, { className: "h-3 w-3" }), "Pending"] }));
21
+ }
22
+ function OrderStatusBadge({ status }) {
23
+ const statusStyles = {
24
+ pending: 'bg-yellow-100 text-yellow-800',
25
+ paid: 'bg-green-100 text-green-800',
26
+ shipped: 'bg-blue-100 text-blue-800',
27
+ delivered: 'bg-green-100 text-green-800',
28
+ cancelled: 'bg-red-100 text-red-800',
29
+ refunded: 'bg-gray-100 text-gray-800',
30
+ };
31
+ return (_jsx("span", { className: `inline-flex rounded-full px-2 py-1 text-xs font-medium ${statusStyles[status] || 'bg-gray-100 text-gray-800'}`, children: status.charAt(0).toUpperCase() + status.slice(1) }));
32
+ }
33
+ // =============================================================================
34
+ // Component
35
+ // =============================================================================
36
+ /**
37
+ * Customer details view with order history and actions.
38
+ *
39
+ * @example
40
+ * ```tsx
41
+ * <CustomerDetails
42
+ * customerId="123"
43
+ * onBack={() => router.push('/admin/customers')}
44
+ * onDelete={() => router.push('/admin/customers')}
45
+ * />
46
+ * ```
47
+ */
48
+ export function CustomerDetails({ customerId, onBack, onDelete, className = '', }) {
49
+ const { getCustomer, updateCustomer, deleteCustomer } = useAdminCustomers();
50
+ const [customer, setCustomer] = useState(null);
51
+ const [isLoading, setIsLoading] = useState(true);
52
+ // Edit state
53
+ const [isEditing, setIsEditing] = useState(false);
54
+ const [editName, setEditName] = useState('');
55
+ const [editEmail, setEditEmail] = useState('');
56
+ const [isSaving, setIsSaving] = useState(false);
57
+ const [editError, setEditError] = useState(null);
58
+ // Delete state
59
+ const [showDeleteDialog, setShowDeleteDialog] = useState(false);
60
+ const [isDeleting, setIsDeleting] = useState(false);
61
+ const [deleteError, setDeleteError] = useState(null);
62
+ // Get locale/currency from context
63
+ const storeSettings = useStoreSettingsOptional();
64
+ const resolvedCurrency = storeSettings?.currency ?? 'USD';
65
+ const resolvedLocale = storeSettings?.locale ?? 'en-US';
66
+ // Fetch customer data
67
+ useEffect(() => {
68
+ if (customerId) {
69
+ setIsLoading(true);
70
+ getCustomer(customerId).then((data) => {
71
+ setCustomer(data);
72
+ setIsLoading(false);
73
+ });
74
+ }
75
+ }, [customerId, getCustomer]);
76
+ // Format helpers
77
+ const formatDate = (dateString) => {
78
+ return new Date(dateString).toLocaleDateString(resolvedLocale, {
79
+ year: 'numeric',
80
+ month: 'long',
81
+ day: 'numeric',
82
+ });
83
+ };
84
+ const formatDateTime = (dateString) => {
85
+ return new Date(dateString).toLocaleDateString(resolvedLocale, {
86
+ year: 'numeric',
87
+ month: 'short',
88
+ day: 'numeric',
89
+ hour: '2-digit',
90
+ minute: '2-digit',
91
+ });
92
+ };
93
+ const formatCurrency = (value) => {
94
+ const numValue = typeof value === 'string' ? parseFloat(value) : value;
95
+ return new Intl.NumberFormat(resolvedLocale, {
96
+ style: 'currency',
97
+ currency: resolvedCurrency,
98
+ }).format(numValue);
99
+ };
100
+ // Edit handlers
101
+ const handleEditStart = useCallback(() => {
102
+ if (customer) {
103
+ setEditName(customer.name || '');
104
+ setEditEmail(customer.email);
105
+ setEditError(null);
106
+ setIsEditing(true);
107
+ }
108
+ }, [customer]);
109
+ const handleEditCancel = useCallback(() => {
110
+ setIsEditing(false);
111
+ setEditError(null);
112
+ }, []);
113
+ const handleEditSave = useCallback(async () => {
114
+ if (!customer)
115
+ return;
116
+ setIsSaving(true);
117
+ setEditError(null);
118
+ const result = await updateCustomer(customer.id, {
119
+ name: editName || undefined,
120
+ email: editEmail,
121
+ });
122
+ setIsSaving(false);
123
+ if (result.success && result.data) {
124
+ setCustomer((prev) => prev
125
+ ? {
126
+ ...prev,
127
+ name: result.data.name,
128
+ email: result.data.email,
129
+ }
130
+ : null);
131
+ setIsEditing(false);
132
+ }
133
+ else {
134
+ setEditError(result.error || 'Failed to update customer');
135
+ }
136
+ }, [customer, editName, editEmail, updateCustomer]);
137
+ // Delete handlers
138
+ const handleDeleteClick = useCallback(() => {
139
+ setDeleteError(null);
140
+ setShowDeleteDialog(true);
141
+ }, []);
142
+ const handleDeleteConfirm = useCallback(async () => {
143
+ if (!customer)
144
+ return;
145
+ setIsDeleting(true);
146
+ setDeleteError(null);
147
+ const success = await deleteCustomer(customer.id);
148
+ setIsDeleting(false);
149
+ if (success) {
150
+ setShowDeleteDialog(false);
151
+ onDelete?.();
152
+ }
153
+ else {
154
+ setDeleteError('Failed to delete customer. Please try again.');
155
+ }
156
+ }, [customer, deleteCustomer, onDelete]);
157
+ const handleDeleteCancel = useCallback(() => {
158
+ if (!isDeleting) {
159
+ setShowDeleteDialog(false);
160
+ setDeleteError(null);
161
+ }
162
+ }, [isDeleting]);
163
+ // Loading state
164
+ if (isLoading) {
165
+ return (_jsxs("div", { className: `space-y-6 ${className}`, children: [_jsx("div", { className: "h-8 w-48 animate-pulse rounded bg-muted" }), _jsxs("div", { className: "grid gap-6 lg:grid-cols-3", children: [_jsx("div", { className: "lg:col-span-2 space-y-6", children: _jsx("div", { className: "rounded-lg border border-border bg-card p-6", children: _jsx("div", { className: "space-y-4", children: [...Array(4)].map((_, i) => (_jsx("div", { className: "h-6 w-full animate-pulse rounded bg-muted" }, i))) }) }) }), _jsx("div", { className: "space-y-6", children: _jsx("div", { className: "rounded-lg border border-border bg-card p-6", children: _jsx("div", { className: "space-y-3", children: [...Array(3)].map((_, i) => (_jsx("div", { className: "h-5 w-full animate-pulse rounded bg-muted" }, i))) }) }) })] })] }));
166
+ }
167
+ // Not found state
168
+ if (!customer) {
169
+ return (_jsxs("div", { className: `rounded-lg border border-border bg-card p-12 text-center ${className}`, children: [_jsx(User, { className: "mx-auto h-12 w-12 text-muted-foreground/50" }), _jsx("p", { className: "mt-4 text-muted-foreground", children: "Customer not found" }), onBack && (_jsx("button", { onClick: onBack, className: "mt-4 text-sm text-primary hover:underline", children: "Go back" }))] }));
170
+ }
171
+ return (_jsxs("div", { className: `space-y-6 ${className}`, children: [_jsx("div", { className: "flex items-center justify-between", children: _jsxs("div", { className: "flex items-center gap-4", children: [onBack && (_jsx("button", { onClick: onBack, className: "rounded-md border border-border p-2 hover:bg-accent transition-colors", children: _jsx(ArrowLeft, { className: "h-4 w-4" }) })), _jsxs("div", { children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("h1", { className: "text-2xl font-semibold text-foreground", children: customer.name || 'Unnamed Customer' }), _jsx(VerificationBadge, { verified: !!customer.emailVerified })] }), _jsx("p", { className: "text-sm text-muted-foreground", children: customer.email })] })] }) }), _jsxs("div", { className: "grid gap-6 lg:grid-cols-3", children: [_jsxs("div", { className: "lg:col-span-2 space-y-6", children: [_jsxs("div", { className: "rounded-lg border border-border bg-card", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-border px-6 py-4", children: [_jsx("h2", { className: "font-medium text-foreground", children: "Customer Information" }), !isEditing && (_jsxs("button", { onClick: handleEditStart, className: "inline-flex items-center gap-1 text-sm text-primary hover:underline", children: [_jsx(Pencil, { className: "h-3 w-3" }), "Edit"] }))] }), _jsx("div", { className: "p-6", children: isEditing ? (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium text-foreground mb-1", children: "Name" }), _jsx("input", { type: "text", value: editName, onChange: (e) => setEditName(e.target.value), placeholder: "Customer name", className: "w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary" })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium text-foreground mb-1", children: "Email" }), _jsx("input", { type: "email", value: editEmail, onChange: (e) => setEditEmail(e.target.value), placeholder: "customer@example.com", className: "w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary" })] }), editError && (_jsx("p", { className: "text-sm text-destructive", children: editError })), _jsxs("div", { className: "flex gap-2", children: [_jsxs("button", { onClick: handleEditSave, disabled: isSaving, className: "inline-flex items-center gap-1 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50", children: [_jsx(Check, { className: "h-3 w-3" }), isSaving ? 'Saving...' : 'Save'] }), _jsxs("button", { onClick: handleEditCancel, disabled: isSaving, className: "inline-flex items-center gap-1 rounded-md border border-border px-3 py-1.5 text-sm font-medium hover:bg-accent disabled:opacity-50", children: [_jsx(X, { className: "h-3 w-3" }), "Cancel"] })] })] })) : (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Mail, { className: "h-4 w-4 text-muted-foreground" }), _jsxs("div", { children: [_jsx("p", { className: "text-sm text-muted-foreground", children: "Email" }), _jsx("p", { className: "text-foreground", children: customer.email })] })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx(User, { className: "h-4 w-4 text-muted-foreground" }), _jsxs("div", { children: [_jsx("p", { className: "text-sm text-muted-foreground", children: "Name" }), _jsx("p", { className: "text-foreground", children: customer.name || 'Not provided' })] })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Calendar, { className: "h-4 w-4 text-muted-foreground" }), _jsxs("div", { children: [_jsx("p", { className: "text-sm text-muted-foreground", children: "Joined" }), _jsx("p", { className: "text-foreground", children: formatDate(customer.createdAt) })] })] }), customer.stripeCustomerId && (_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(CreditCard, { className: "h-4 w-4 text-muted-foreground" }), _jsxs("div", { children: [_jsx("p", { className: "text-sm text-muted-foreground", children: "Stripe Customer ID" }), _jsx("p", { className: "text-foreground font-mono text-sm", children: customer.stripeCustomerId })] })] }))] })) })] }), _jsxs("div", { className: "rounded-lg border border-border bg-card", children: [_jsx("div", { className: "border-b border-border px-6 py-4", children: _jsx("h2", { className: "font-medium text-foreground", children: "Order History" }) }), customer.orders && customer.orders.length > 0 ? (_jsx("div", { className: "divide-y divide-border", children: customer.orders.map((order) => (_jsxs("a", { href: `/admin/orders/${order.id}`, className: "flex items-center justify-between px-6 py-4 hover:bg-muted/30 transition-colors", children: [_jsxs("div", { className: "flex items-center gap-4", children: [_jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded bg-muted text-muted-foreground", children: _jsx(ShoppingBag, { className: "h-5 w-5" }) }), _jsxs("div", { children: [_jsxs("p", { className: "font-medium text-foreground", children: ["Order #", order.id.slice(-8).toUpperCase()] }), _jsx("p", { className: "text-sm text-muted-foreground", children: formatDateTime(order.createdAt) })] })] }), _jsxs("div", { className: "flex items-center gap-4", children: [_jsx(OrderStatusBadge, { status: order.status }), _jsx("span", { className: "font-medium text-foreground", children: formatCurrency(order.total) })] })] }, order.id))) })) : (_jsxs("div", { className: "px-6 py-12 text-center", children: [_jsx(ShoppingBag, { className: "mx-auto h-8 w-8 text-muted-foreground/50" }), _jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: "No orders yet" })] }))] })] }), _jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "rounded-lg border border-border bg-card p-6", children: [_jsx("h2", { className: "mb-4 font-medium text-foreground", children: "Customer Stats" }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [_jsx(ShoppingBag, { className: "h-4 w-4" }), _jsx("span", { className: "text-sm", children: "Total Orders" })] }), _jsx("span", { className: "font-medium text-foreground", children: customer.stats?.totalOrders ?? 0 })] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [_jsx(DollarSign, { className: "h-4 w-4" }), _jsx("span", { className: "text-sm", children: "Total Spent" })] }), _jsx("span", { className: "font-medium text-foreground", children: formatCurrency(customer.stats?.totalSpent ?? 0) })] })] })] }), _jsxs("div", { className: "rounded-lg border border-border bg-card p-6", children: [_jsx("h2", { className: "mb-4 font-medium text-foreground", children: "Actions" }), _jsxs("div", { className: "space-y-3", children: [_jsxs("button", { onClick: handleDeleteClick, className: "w-full inline-flex items-center justify-center gap-2 rounded-md border border-destructive px-4 py-2 text-sm font-medium text-destructive hover:bg-destructive/10 transition-colors", children: [_jsx(Trash2, { className: "h-4 w-4" }), "Delete Customer"] }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Deleting a customer anonymizes their data while preserving order history." })] })] })] })] }), _jsx(DeleteConfirmDialog, { isOpen: showDeleteDialog, title: "Delete Customer", itemName: customer.name || customer.email, itemType: "customer", isDeleting: isDeleting, error: deleteError, onConfirm: handleDeleteConfirm, onCancel: handleDeleteCancel })] }));
172
+ }
173
+ //# sourceMappingURL=CustomerDetails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomerDetails.js","sourceRoot":"","sources":["../../../src/admin/components/CustomerDetails.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { CustomerTableProps } from '../types';
2
+ /**
3
+ * Customers data table with search and pagination.
4
+ *
5
+ * @example
6
+ * ```tsx
7
+ * <CustomerTable
8
+ * onCustomerClick={(id) => router.push(`/admin/customers/${id}`)}
9
+ * />
10
+ * ```
11
+ */
12
+ export declare function CustomerTable({ pageSize, onCustomerClick, className, }: CustomerTableProps): import("react/jsx-runtime").JSX.Element;
13
+ //# sourceMappingURL=CustomerTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomerTable.d.ts","sourceRoot":"","sources":["../../../src/admin/components/CustomerTable.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,kBAAkB,EAAyB,MAAM,UAAU,CAAA;AA4BzE;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAa,EACb,eAAe,EACf,SAAc,GACf,EAAE,kBAAkB,2CAmQpB"}
@@ -0,0 +1,109 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * @rovela/sdk/admin/components/CustomerTable
5
+ *
6
+ * Customers data table with search and pagination.
7
+ * Displays all registered customers (not just those who ordered).
8
+ */
9
+ import { useState, useEffect, useCallback } from 'react';
10
+ import { useAdminCustomers } from '../hooks/useAdminCustomers';
11
+ import { useStoreSettingsOptional } from '../../core/StoreSettingsProvider';
12
+ import { DeleteConfirmDialog } from './DeleteConfirmDialog';
13
+ import { Search, Users, Mail, Calendar, CheckCircle, Clock, Trash2 } from 'lucide-react';
14
+ // =============================================================================
15
+ // Status Badge
16
+ // =============================================================================
17
+ function VerificationBadge({ verified }) {
18
+ if (verified) {
19
+ return (_jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-green-100 px-2 py-1 text-xs font-medium text-green-800", children: [_jsx(CheckCircle, { className: "h-3 w-3" }), "Verified"] }));
20
+ }
21
+ return (_jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-yellow-100 px-2 py-1 text-xs font-medium text-yellow-800", children: [_jsx(Clock, { className: "h-3 w-3" }), "Pending"] }));
22
+ }
23
+ // =============================================================================
24
+ // Component
25
+ // =============================================================================
26
+ /**
27
+ * Customers data table with search and pagination.
28
+ *
29
+ * @example
30
+ * ```tsx
31
+ * <CustomerTable
32
+ * onCustomerClick={(id) => router.push(`/admin/customers/${id}`)}
33
+ * />
34
+ * ```
35
+ */
36
+ export function CustomerTable({ pageSize = 20, onCustomerClick, className = '', }) {
37
+ const { customers, total, page, isLoading, error, fetchCustomers, deleteCustomer } = useAdminCustomers();
38
+ // Get locale from context
39
+ const storeSettings = useStoreSettingsOptional();
40
+ const resolvedLocale = storeSettings?.locale ?? 'en-US';
41
+ const [search, setSearch] = useState('');
42
+ const [debouncedSearch, setDebouncedSearch] = useState('');
43
+ // Delete confirmation state
44
+ const [deleteTarget, setDeleteTarget] = useState(null);
45
+ const [isDeleting, setIsDeleting] = useState(false);
46
+ const [deleteError, setDeleteError] = useState(null);
47
+ // Debounce search input
48
+ useEffect(() => {
49
+ const timer = setTimeout(() => {
50
+ setDebouncedSearch(search);
51
+ }, 300);
52
+ return () => clearTimeout(timer);
53
+ }, [search]);
54
+ // Fetch customers on filter change
55
+ useEffect(() => {
56
+ fetchCustomers({
57
+ search: debouncedSearch || undefined,
58
+ page: 1,
59
+ limit: pageSize,
60
+ });
61
+ }, [debouncedSearch, pageSize, fetchCustomers]);
62
+ const handlePageChange = useCallback((newPage) => {
63
+ fetchCustomers({
64
+ search: debouncedSearch || undefined,
65
+ page: newPage,
66
+ limit: pageSize,
67
+ });
68
+ }, [debouncedSearch, pageSize, fetchCustomers]);
69
+ // Delete handlers
70
+ const handleDeleteClick = useCallback((id, name, e) => {
71
+ e.stopPropagation(); // Prevent row click navigation
72
+ setDeleteTarget({ id, name });
73
+ setDeleteError(null);
74
+ }, []);
75
+ const handleDeleteConfirm = useCallback(async () => {
76
+ if (!deleteTarget)
77
+ return;
78
+ setIsDeleting(true);
79
+ setDeleteError(null);
80
+ const success = await deleteCustomer(deleteTarget.id);
81
+ setIsDeleting(false);
82
+ if (success) {
83
+ setDeleteTarget(null);
84
+ fetchCustomers({ search: debouncedSearch || undefined, page, limit: pageSize });
85
+ }
86
+ else {
87
+ setDeleteError('Failed to delete customer. Please try again.');
88
+ }
89
+ }, [deleteTarget, deleteCustomer, fetchCustomers, debouncedSearch, page, pageSize]);
90
+ const handleDeleteCancel = useCallback(() => {
91
+ if (!isDeleting) {
92
+ setDeleteTarget(null);
93
+ setDeleteError(null);
94
+ }
95
+ }, [isDeleting]);
96
+ const formatDate = (dateString) => {
97
+ const date = new Date(dateString);
98
+ return date.toLocaleDateString(resolvedLocale, {
99
+ month: 'short',
100
+ day: 'numeric',
101
+ year: 'numeric',
102
+ });
103
+ };
104
+ const totalPages = Math.ceil(total / pageSize);
105
+ return (_jsxs("div", { className: `space-y-4 ${className}`, children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [_jsxs("div", { className: "relative flex-1 max-w-sm", children: [_jsx(Search, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), _jsx("input", { type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search by email or name...", className: "w-full rounded-md border border-input bg-background pl-9 pr-3 py-2 text-sm placeholder:text-muted-foreground focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary" })] }), _jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [_jsx(Users, { className: "h-4 w-4" }), _jsxs("span", { children: [total, " customer", total !== 1 ? 's' : ''] })] })] }), error && (_jsx("div", { className: "rounded-md bg-destructive/10 px-4 py-3 text-sm text-destructive", children: error })), _jsx("div", { className: "rounded-lg border border-border overflow-hidden", children: _jsxs("table", { className: "w-full", children: [_jsx("thead", { className: "bg-muted/50", children: _jsxs("tr", { children: [_jsx("th", { className: "px-4 py-3 text-left text-sm font-medium text-foreground", children: "Customer" }), _jsx("th", { className: "px-4 py-3 text-left text-sm font-medium text-foreground", children: "Email" }), _jsx("th", { className: "px-4 py-3 text-left text-sm font-medium text-foreground", children: "Status" }), _jsx("th", { className: "px-4 py-3 text-left text-sm font-medium text-foreground", children: "Joined" }), _jsx("th", { className: "px-4 py-3 text-right text-sm font-medium text-foreground", children: "Actions" })] }) }), _jsx("tbody", { className: "divide-y divide-border", children: isLoading ? (
106
+ // Loading skeleton
107
+ Array.from({ length: 5 }).map((_, i) => (_jsxs("tr", { children: [_jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "h-4 w-32 animate-pulse rounded bg-muted" }) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "h-4 w-48 animate-pulse rounded bg-muted" }) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "h-6 w-20 animate-pulse rounded bg-muted" }) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "h-4 w-24 animate-pulse rounded bg-muted" }) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "h-4 w-16 animate-pulse rounded bg-muted ml-auto" }) })] }, i)))) : customers.length === 0 ? (_jsx("tr", { children: _jsxs("td", { colSpan: 5, className: "px-4 py-12 text-center", children: [_jsx(Users, { className: "mx-auto h-12 w-12 text-muted-foreground/50" }), _jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: debouncedSearch ? 'No customers found matching your search' : 'No customers yet' })] }) })) : (customers.map((customer) => (_jsxs("tr", { onClick: () => onCustomerClick?.(customer.id), className: `hover:bg-muted/30 transition-colors ${onCustomerClick ? 'cursor-pointer' : ''}`, children: [_jsx("td", { className: "px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "flex h-9 w-9 items-center justify-center rounded-full bg-primary/10 text-primary", children: _jsx("span", { className: "text-sm font-medium", children: (customer.name || customer.email).charAt(0).toUpperCase() }) }), _jsx("span", { className: "font-medium text-foreground", children: customer.name || 'Unnamed' })] }) }), _jsx("td", { className: "px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [_jsx(Mail, { className: "h-4 w-4" }), customer.email] }) }), _jsx("td", { className: "px-4 py-3", children: _jsx(VerificationBadge, { verified: !!customer.emailVerified }) }), _jsx("td", { className: "px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [_jsx(Calendar, { className: "h-4 w-4" }), formatDate(customer.createdAt)] }) }), _jsx("td", { className: "px-4 py-3 text-right", children: _jsxs("button", { onClick: (e) => handleDeleteClick(customer.id, customer.name || customer.email, e), className: "inline-flex items-center gap-1 text-sm text-destructive hover:text-destructive/80 transition-colors", title: "Delete customer", children: [_jsx(Trash2, { className: "h-4 w-4" }), _jsx("span", { className: "sr-only", children: "Delete" })] }) })] }, customer.id)))) })] }) }), _jsx(DeleteConfirmDialog, { isOpen: !!deleteTarget, title: "Delete Customer", itemName: deleteTarget?.name || '', itemType: "customer", isDeleting: isDeleting, error: deleteError, onConfirm: handleDeleteConfirm, onCancel: handleDeleteCancel }), totalPages > 1 && (_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("p", { className: "text-sm text-muted-foreground", children: ["Showing ", (page - 1) * pageSize + 1, " to", ' ', Math.min(page * pageSize, total), " of ", total, " customers"] }), _jsxs("div", { className: "flex gap-2", children: [_jsx("button", { onClick: () => handlePageChange(page - 1), disabled: page <= 1, className: "rounded-md border border-border px-3 py-1.5 text-sm font-medium hover:bg-accent disabled:opacity-50 disabled:cursor-not-allowed", children: "Previous" }), _jsx("button", { onClick: () => handlePageChange(page + 1), disabled: page >= totalPages, className: "rounded-md border border-border px-3 py-1.5 text-sm font-medium hover:bg-accent disabled:opacity-50 disabled:cursor-not-allowed", children: "Next" })] })] }))] }));
108
+ }
109
+ //# sourceMappingURL=CustomerTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomerTable.js","sourceRoot":"","sources":["../../../src/admin/components/CustomerTable.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @rovela/sdk/admin/components/DeleteConfirmDialog
3
+ *
4
+ * Reusable confirmation dialog for delete operations.
5
+ * Replaces native browser confirm() which is blocked in iframes.
6
+ */
7
+ interface DeleteConfirmDialogProps {
8
+ /** Whether the dialog is visible */
9
+ isOpen: boolean;
10
+ /** Dialog title (default: "Delete Item") */
11
+ title?: string;
12
+ /** Name of the item being deleted (shown in message) */
13
+ itemName: string;
14
+ /** Type of item for context (default: "item") */
15
+ itemType?: string;
16
+ /** Whether delete is in progress */
17
+ isDeleting?: boolean;
18
+ /** Error message to display */
19
+ error?: string | null;
20
+ /** Called when user confirms deletion */
21
+ onConfirm: () => void;
22
+ /** Called when user cancels or clicks backdrop */
23
+ onCancel: () => void;
24
+ }
25
+ /**
26
+ * Confirmation dialog for delete operations.
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * const [deleteTarget, setDeleteTarget] = useState<{ id: string; name: string } | null>(null)
31
+ * const [isDeleting, setIsDeleting] = useState(false)
32
+ * const [deleteError, setDeleteError] = useState<string | null>(null)
33
+ *
34
+ * <DeleteConfirmDialog
35
+ * isOpen={!!deleteTarget}
36
+ * title="Delete Product"
37
+ * itemName={deleteTarget?.name || ''}
38
+ * isDeleting={isDeleting}
39
+ * error={deleteError}
40
+ * onConfirm={handleDeleteConfirm}
41
+ * onCancel={() => setDeleteTarget(null)}
42
+ * />
43
+ * ```
44
+ */
45
+ export declare function DeleteConfirmDialog({ isOpen, title, itemName, itemType, isDeleting, error, onConfirm, onCancel, }: DeleteConfirmDialogProps): import("react/jsx-runtime").JSX.Element | null;
46
+ export {};
47
+ //# sourceMappingURL=DeleteConfirmDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteConfirmDialog.d.ts","sourceRoot":"","sources":["../../../src/admin/components/DeleteConfirmDialog.tsx"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,UAAU,wBAAwB;IAChC,oCAAoC;IACpC,MAAM,EAAE,OAAO,CAAA;IACf,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAA;IAChB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,oCAAoC;IACpC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,yCAAyC;IACzC,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,IAAI,CAAA;CACrB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,KAAqB,EACrB,QAAQ,EACR,QAAiB,EACjB,UAAkB,EAClB,KAAY,EACZ,SAAS,EACT,QAAQ,GACT,EAAE,wBAAwB,kDA2C1B"}
@@ -0,0 +1,28 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * Confirmation dialog for delete operations.
5
+ *
6
+ * @example
7
+ * ```tsx
8
+ * const [deleteTarget, setDeleteTarget] = useState<{ id: string; name: string } | null>(null)
9
+ * const [isDeleting, setIsDeleting] = useState(false)
10
+ * const [deleteError, setDeleteError] = useState<string | null>(null)
11
+ *
12
+ * <DeleteConfirmDialog
13
+ * isOpen={!!deleteTarget}
14
+ * title="Delete Product"
15
+ * itemName={deleteTarget?.name || ''}
16
+ * isDeleting={isDeleting}
17
+ * error={deleteError}
18
+ * onConfirm={handleDeleteConfirm}
19
+ * onCancel={() => setDeleteTarget(null)}
20
+ * />
21
+ * ```
22
+ */
23
+ export function DeleteConfirmDialog({ isOpen, title = 'Delete Item', itemName, itemType = 'item', isDeleting = false, error = null, onConfirm, onCancel, }) {
24
+ if (!isOpen)
25
+ return null;
26
+ return (_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center", children: [_jsx("div", { className: "absolute inset-0 bg-black/50", onClick: () => !isDeleting && onCancel() }), _jsxs("div", { className: "relative rounded-lg border border-border bg-card p-6 shadow-lg max-w-md w-full mx-4", children: [_jsx("h3", { className: "text-lg font-medium text-foreground", children: title }), _jsxs("p", { className: "mt-2 text-sm text-muted-foreground", children: ["Are you sure you want to delete \"", itemName, "\"? This action cannot be undone."] }), error && (_jsx("p", { className: "mt-3 text-sm text-destructive", children: error })), _jsxs("div", { className: "mt-6 flex gap-3 justify-end", children: [_jsx("button", { type: "button", onClick: onCancel, disabled: isDeleting, className: "rounded-md border border-border px-4 py-2 text-sm font-medium text-foreground hover:bg-accent disabled:opacity-50", children: "Cancel" }), _jsx("button", { type: "button", onClick: onConfirm, disabled: isDeleting, className: "rounded-md bg-destructive px-4 py-2 text-sm font-medium text-destructive-foreground hover:bg-destructive/90 disabled:opacity-50", children: isDeleting ? 'Deleting...' : 'Delete' })] })] })] }));
27
+ }
28
+ //# sourceMappingURL=DeleteConfirmDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteConfirmDialog.js","sourceRoot":"","sources":["../../../src/admin/components/DeleteConfirmDialog.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AA4BZ;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAClC,MAAM,EACN,KAAK,GAAG,aAAa,EACrB,QAAQ,EACR,QAAQ,GAAG,MAAM,EACjB,UAAU,GAAG,KAAK,EAClB,KAAK,GAAG,IAAI,EACZ,SAAS,EACT,QAAQ,GACiB;IACzB,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAExB,OAAO,CACL,eAAK,SAAS,EAAC,qDAAqD,aAElE,cACE,SAAS,EAAC,8BAA8B,EACxC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,IAAI,QAAQ,EAAE,GACxC,EAGF,eAAK,SAAS,EAAC,qFAAqF,aAClG,aAAI,SAAS,EAAC,qCAAqC,YAAE,KAAK,GAAM,EAChE,aAAG,SAAS,EAAC,oCAAoC,mDACR,QAAQ,yCAC7C,EAEH,KAAK,IAAI,CACR,YAAG,SAAS,EAAC,+BAA+B,YAAE,KAAK,GAAK,CACzD,EAED,eAAK,SAAS,EAAC,6BAA6B,aAC1C,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAC,mHAAmH,uBAGtH,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAC,iIAAiI,YAE1I,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,GAC/B,IACL,IACF,IACF,CACP,CAAA;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"InventoryEditor.d.ts","sourceRoot":"","sources":["../../../src/admin/components/InventoryEditor.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AAMrE;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAc,GACf,EAAE,oBAAoB,2CAkKtB"}
1
+ {"version":3,"file":"InventoryEditor.d.ts","sourceRoot":"","sources":["../../../src/admin/components/InventoryEditor.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AAMrE;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAc,GACf,EAAE,oBAAoB,2CAwKtB"}
@@ -7,6 +7,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
7
  */
8
8
  import { useState, useCallback } from 'react';
9
9
  import { useAdminProducts } from '../hooks/useAdminProducts';
10
+ import { useStoreSettingsOptional } from '../../core/StoreSettingsProvider';
10
11
  // =============================================================================
11
12
  // Component
12
13
  // =============================================================================
@@ -24,22 +25,26 @@ import { useAdminProducts } from '../hooks/useAdminProducts';
24
25
  */
25
26
  export function InventoryEditor({ productId, variants, onUpdate, className = '', }) {
26
27
  const { updateVariant } = useAdminProducts();
28
+ // Get currency from context
29
+ const storeSettings = useStoreSettingsOptional();
30
+ const resolvedCurrency = storeSettings?.currency ?? 'USD';
31
+ const resolvedLocale = storeSettings?.locale ?? 'en-US';
27
32
  const [editingId, setEditingId] = useState(null);
28
- const [editValue, setEditValue] = useState(0);
33
+ const [editValue, setEditValue] = useState('0');
29
34
  const [isUpdating, setIsUpdating] = useState(false);
30
35
  const handleStartEdit = useCallback((variantId, currentValue) => {
31
36
  setEditingId(variantId);
32
- setEditValue(currentValue);
37
+ setEditValue(String(currentValue));
33
38
  }, []);
34
39
  const handleCancelEdit = useCallback(() => {
35
40
  setEditingId(null);
36
- setEditValue(0);
41
+ setEditValue('0');
37
42
  }, []);
38
43
  const handleSave = useCallback(async (variantId) => {
39
44
  setIsUpdating(true);
40
45
  try {
41
46
  const result = await updateVariant(productId, variantId, {
42
- inventory: editValue,
47
+ inventory: parseInt(editValue, 10) || 0,
43
48
  });
44
49
  if (result.success) {
45
50
  setEditingId(null);
@@ -66,11 +71,11 @@ export function InventoryEditor({ productId, variants, onUpdate, className = '',
66
71
  const isLowStock = variant.inventory !== undefined && variant.inventory <= 10;
67
72
  const isOutOfStock = variant.inventory === 0;
68
73
  return (_jsxs("tr", { className: "hover:bg-muted/50", children: [_jsxs("td", { className: "px-6 py-4", children: [_jsx("div", { className: "font-medium text-foreground", children: variant.name }), variant.attributes && Object.keys(variant.attributes).length > 0 && (_jsx("div", { className: "mt-1 flex flex-wrap gap-1", children: Object.entries(variant.attributes).map(([key, value]) => (_jsxs("span", { className: "rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground", children: [key, ": ", value] }, key))) }))] }), _jsx("td", { className: "px-6 py-4 text-sm text-muted-foreground", children: variant.sku || '—' }), _jsx("td", { className: "px-6 py-4 text-sm text-foreground", children: variant.price
69
- ? new Intl.NumberFormat('en-US', {
74
+ ? new Intl.NumberFormat(resolvedLocale, {
70
75
  style: 'currency',
71
- currency: 'USD',
76
+ currency: resolvedCurrency,
72
77
  }).format(parseFloat(variant.price))
73
- : '—' }), _jsx("td", { className: "px-6 py-4", children: isEditing ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { type: "number", min: "0", value: editValue, onChange: (e) => setEditValue(parseInt(e.target.value) || 0), onKeyDown: (e) => handleKeyDown(e, variant.id), autoFocus: true, disabled: isUpdating, className: "w-20 rounded-md border border-input bg-background px-2 py-1 text-sm focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary disabled:opacity-50" }), _jsx("button", { onClick: () => handleSave(variant.id), disabled: isUpdating, className: "rounded-md bg-primary px-2 py-1 text-xs font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50", children: isUpdating ? '...' : 'Save' }), _jsx("button", { onClick: handleCancelEdit, disabled: isUpdating, className: "rounded-md border border-border px-2 py-1 text-xs text-foreground hover:bg-accent disabled:opacity-50", children: "Cancel" })] })) : (_jsx("button", { onClick: () => handleStartEdit(variant.id, variant.inventory ?? 0), className: "rounded-md border border-transparent px-2 py-1 text-sm font-medium text-foreground hover:border-border hover:bg-muted", children: variant.inventory ?? 0 })) }), _jsx("td", { className: "px-6 py-4", children: _jsx("span", { className: `inline-flex rounded-full px-2 py-1 text-xs font-medium ${isOutOfStock
78
+ : '—' }), _jsx("td", { className: "px-6 py-4", children: isEditing ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { type: "number", min: "0", value: editValue, onChange: (e) => setEditValue(e.target.value), onKeyDown: (e) => handleKeyDown(e, variant.id), autoFocus: true, disabled: isUpdating, className: "w-20 rounded-md border border-input bg-background px-2 py-1 text-sm focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary disabled:opacity-50" }), _jsx("button", { onClick: () => handleSave(variant.id), disabled: isUpdating, className: "rounded-md bg-primary px-2 py-1 text-xs font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50", children: isUpdating ? '...' : 'Save' }), _jsx("button", { onClick: handleCancelEdit, disabled: isUpdating, className: "rounded-md border border-border px-2 py-1 text-xs text-foreground hover:bg-accent disabled:opacity-50", children: "Cancel" })] })) : (_jsx("button", { onClick: () => handleStartEdit(variant.id, variant.inventory ?? 0), className: "rounded-md border border-transparent px-2 py-1 text-sm font-medium text-foreground hover:border-border hover:bg-muted", children: variant.inventory ?? 0 })) }), _jsx("td", { className: "px-6 py-4", children: _jsx("span", { className: `inline-flex rounded-full px-2 py-1 text-xs font-medium ${isOutOfStock
74
79
  ? 'bg-red-100 text-red-800'
75
80
  : isLowStock
76
81
  ? 'bg-amber-100 text-amber-800'
@@ -1 +1 @@
1
- {"version":3,"file":"InventoryEditor.js","sourceRoot":"","sources":["../../../src/admin/components/InventoryEditor.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"InventoryEditor.js","sourceRoot":"","sources":["../../../src/admin/components/InventoryEditor.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"OrderDetails.d.ts","sourceRoot":"","sources":["../../../src/admin/components/OrderDetails.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,UAAU,CAAA;AAiCnE;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAc,GACf,EAAE,iBAAiB,2CA0PnB"}
1
+ {"version":3,"file":"OrderDetails.d.ts","sourceRoot":"","sources":["../../../src/admin/components/OrderDetails.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,UAAU,CAAA;AAiCnE;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAc,GACf,EAAE,iBAAiB,2CA+PnB"}
@@ -7,6 +7,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
7
  */
8
8
  import { useState, useEffect, useCallback } from 'react';
9
9
  import { useAdminOrders } from '../hooks/useAdminOrders';
10
+ import { useStoreSettingsOptional } from '../../core/StoreSettingsProvider';
10
11
  // =============================================================================
11
12
  // Status Badge
12
13
  // =============================================================================
@@ -40,6 +41,10 @@ export function OrderDetails({ orderId, onRefund, onBack, className = '', }) {
40
41
  const [order, setOrder] = useState(null);
41
42
  const [isLoading, setIsLoading] = useState(true);
42
43
  const [isUpdating, setIsUpdating] = useState(false);
44
+ // Get currency from context
45
+ const storeSettings = useStoreSettingsOptional();
46
+ const resolvedCurrency = storeSettings?.currency ?? 'USD';
47
+ const resolvedLocale = storeSettings?.locale ?? 'en-US';
43
48
  useEffect(() => {
44
49
  if (orderId) {
45
50
  setIsLoading(true);
@@ -60,7 +65,7 @@ export function OrderDetails({ orderId, onRefund, onBack, className = '', }) {
60
65
  setIsUpdating(false);
61
66
  }, [order, updateStatus]);
62
67
  const formatDate = (dateString) => {
63
- return new Date(dateString).toLocaleDateString('en-US', {
68
+ return new Date(dateString).toLocaleDateString(resolvedLocale, {
64
69
  weekday: 'long',
65
70
  year: 'numeric',
66
71
  month: 'long',
@@ -71,9 +76,9 @@ export function OrderDetails({ orderId, onRefund, onBack, className = '', }) {
71
76
  };
72
77
  const formatCurrency = (value) => {
73
78
  const numValue = typeof value === 'string' ? parseFloat(value) : value;
74
- return new Intl.NumberFormat('en-US', {
79
+ return new Intl.NumberFormat(resolvedLocale, {
75
80
  style: 'currency',
76
- currency: 'USD',
81
+ currency: resolvedCurrency,
77
82
  }).format(numValue);
78
83
  };
79
84
  if (isLoading) {