@rovela-ai/sdk 0.1.17 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/api/auth.js +5 -11
- package/dist/admin/api/auth.js.map +1 -1
- package/dist/admin/api/categories.js +43 -50
- package/dist/admin/api/categories.js.map +1 -1
- package/dist/admin/api/check.js +6 -9
- package/dist/admin/api/check.js.map +1 -1
- package/dist/admin/api/customers.js +17 -21
- package/dist/admin/api/customers.js.map +1 -1
- package/dist/admin/api/index.js +10 -38
- package/dist/admin/api/index.js.map +1 -1
- package/dist/admin/api/orders.js +30 -35
- package/dist/admin/api/orders.js.map +1 -1
- package/dist/admin/api/products.js +56 -66
- package/dist/admin/api/products.js.map +1 -1
- package/dist/admin/api/refund.js +26 -29
- package/dist/admin/api/refund.js.map +1 -1
- package/dist/admin/api/settings.js +17 -21
- package/dist/admin/api/settings.js.map +1 -1
- package/dist/admin/api/setup.js +17 -20
- package/dist/admin/api/setup.js.map +1 -1
- package/dist/admin/api/stats.js +14 -17
- package/dist/admin/api/stats.js.map +1 -1
- package/dist/admin/components/AdminGuard.js +13 -17
- package/dist/admin/components/AdminGuard.js.map +1 -1
- package/dist/admin/components/AdminHeader.js +8 -11
- package/dist/admin/components/AdminHeader.js.map +1 -1
- package/dist/admin/components/AdminLayout.js +5 -8
- package/dist/admin/components/AdminLayout.js.map +1 -1
- package/dist/admin/components/AdminLoginForm.js +11 -14
- package/dist/admin/components/AdminLoginForm.js.map +1 -1
- package/dist/admin/components/AdminNav.js +11 -14
- package/dist/admin/components/AdminNav.js.map +1 -1
- package/dist/admin/components/AdminSetupForm.js +11 -14
- package/dist/admin/components/AdminSetupForm.js.map +1 -1
- package/dist/admin/components/InventoryEditor.js +16 -19
- package/dist/admin/components/InventoryEditor.js.map +1 -1
- package/dist/admin/components/LowStockAlert.js +6 -9
- package/dist/admin/components/LowStockAlert.js.map +1 -1
- package/dist/admin/components/OrderDetails.js +15 -18
- package/dist/admin/components/OrderDetails.js.map +1 -1
- package/dist/admin/components/OrderTable.js +13 -16
- package/dist/admin/components/OrderTable.js.map +1 -1
- package/dist/admin/components/ProductForm.js +17 -20
- package/dist/admin/components/ProductForm.js.map +1 -1
- package/dist/admin/components/ProductTable.js +15 -18
- package/dist/admin/components/ProductTable.js.map +1 -1
- package/dist/admin/components/RecentOrders.js +6 -9
- package/dist/admin/components/RecentOrders.js.map +1 -1
- package/dist/admin/components/RefundDialog.js +12 -15
- package/dist/admin/components/RefundDialog.js.map +1 -1
- package/dist/admin/components/StatsCards.js +7 -10
- package/dist/admin/components/StatsCards.js.map +1 -1
- package/dist/admin/components/StoreSettings.js +10 -13
- package/dist/admin/components/StoreSettings.js.map +1 -1
- package/dist/admin/components/index.js +16 -35
- package/dist/admin/components/index.js.map +1 -1
- package/dist/admin/config.js +12 -54
- package/dist/admin/config.js.map +1 -1
- package/dist/admin/hooks/index.js +4 -11
- package/dist/admin/hooks/index.js.map +1 -1
- package/dist/admin/hooks/useAdminAuth.js +9 -12
- package/dist/admin/hooks/useAdminAuth.js.map +1 -1
- package/dist/admin/hooks/useAdminOrders.js +11 -14
- package/dist/admin/hooks/useAdminOrders.js.map +1 -1
- package/dist/admin/hooks/useAdminProducts.js +13 -16
- package/dist/admin/hooks/useAdminProducts.js.map +1 -1
- package/dist/admin/hooks/useAdminStats.js +11 -14
- package/dist/admin/hooks/useAdminStats.js.map +1 -1
- package/dist/admin/index.js +13 -66
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/server/admin-service.js +39 -83
- package/dist/admin/server/admin-service.js.map +1 -1
- package/dist/admin/server/index.js +3 -13
- package/dist/admin/server/index.js.map +1 -1
- package/dist/admin/types.js +1 -2
- package/dist/admin/types.js.map +1 -1
- package/dist/auth/api/auth.js +6 -14
- package/dist/auth/api/auth.js.map +1 -1
- package/dist/auth/api/forgot-password.js +8 -11
- package/dist/auth/api/forgot-password.js.map +1 -1
- package/dist/auth/api/index.js +6 -18
- package/dist/auth/api/index.js.map +1 -1
- package/dist/auth/api/register.js +17 -20
- package/dist/auth/api/register.js.map +1 -1
- package/dist/auth/api/resend-verification.js +9 -12
- package/dist/auth/api/resend-verification.js.map +1 -1
- package/dist/auth/api/reset-password.js +18 -22
- package/dist/auth/api/reset-password.js.map +1 -1
- package/dist/auth/api/verify-email.js +14 -18
- package/dist/auth/api/verify-email.js.map +1 -1
- package/dist/auth/components/AuthGuard.js +13 -17
- package/dist/auth/components/AuthGuard.js.map +1 -1
- package/dist/auth/components/ForgotPasswordForm.js +11 -14
- package/dist/auth/components/ForgotPasswordForm.js.map +1 -1
- package/dist/auth/components/ResetPasswordForm.js +18 -21
- package/dist/auth/components/ResetPasswordForm.js.map +1 -1
- package/dist/auth/components/SignInForm.js +13 -16
- package/dist/auth/components/SignInForm.js.map +1 -1
- package/dist/auth/components/SignUpForm.js +15 -18
- package/dist/auth/components/SignUpForm.js.map +1 -1
- package/dist/auth/components/UserMenu.js +13 -16
- package/dist/auth/components/UserMenu.js.map +1 -1
- package/dist/auth/components/VerifyEmailNotice.js +10 -13
- package/dist/auth/components/VerifyEmailNotice.js.map +1 -1
- package/dist/auth/components/index.js +7 -18
- package/dist/auth/components/index.js.map +1 -1
- package/dist/auth/config.js +9 -49
- package/dist/auth/config.js.map +1 -1
- package/dist/auth/hooks/index.js +1 -5
- package/dist/auth/hooks/index.js.map +1 -1
- package/dist/auth/hooks/useAuth.js +14 -17
- package/dist/auth/hooks/useAuth.js.map +1 -1
- package/dist/auth/index.js +15 -37
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/server/customer-service.js +39 -83
- package/dist/auth/server/customer-service.js.map +1 -1
- package/dist/auth/server/email-sender.js +11 -17
- package/dist/auth/server/email-sender.js.map +1 -1
- package/dist/auth/server/index.js +5 -36
- package/dist/auth/server/index.js.map +1 -1
- package/dist/auth/server/password-reset-service.js +30 -70
- package/dist/auth/server/password-reset-service.js.map +1 -1
- package/dist/auth/server/password.js +9 -18
- package/dist/auth/server/password.js.map +1 -1
- package/dist/auth/server/verification-service.js +35 -76
- package/dist/auth/server/verification-service.js.map +1 -1
- package/dist/auth/types.js +1 -2
- package/dist/auth/types.js.map +1 -1
- package/dist/cart/CartProvider.js +13 -17
- package/dist/cart/CartProvider.js.map +1 -1
- package/dist/cart/components/AddToCartButton.js +16 -19
- package/dist/cart/components/AddToCartButton.js.map +1 -1
- package/dist/cart/components/CartDrawer.js +17 -23
- package/dist/cart/components/CartDrawer.js.map +1 -1
- package/dist/cart/components/CartIcon.js +9 -12
- package/dist/cart/components/CartIcon.js.map +1 -1
- package/dist/cart/components/CartItem.js +7 -13
- package/dist/cart/components/CartItem.js.map +1 -1
- package/dist/cart/components/CartSummary.js +12 -15
- package/dist/cart/components/CartSummary.js.map +1 -1
- package/dist/cart/components/QuantitySelector.js +9 -12
- package/dist/cart/components/QuantitySelector.js.map +1 -1
- package/dist/cart/components/index.js +6 -15
- package/dist/cart/components/index.js.map +1 -1
- package/dist/cart/index.js +3 -17
- package/dist/cart/index.js.map +1 -1
- package/dist/cart/store.js +8 -13
- package/dist/cart/store.js.map +1 -1
- package/dist/checkout/api/checkout.js +12 -15
- package/dist/checkout/api/checkout.js.map +1 -1
- package/dist/checkout/api/index.js +2 -7
- package/dist/checkout/api/index.js.map +1 -1
- package/dist/checkout/api/webhook.js +8 -11
- package/dist/checkout/api/webhook.js.map +1 -1
- package/dist/checkout/components/CheckoutButton.js +8 -11
- package/dist/checkout/components/CheckoutButton.js.map +1 -1
- package/dist/checkout/components/CheckoutSuccess.js +11 -14
- package/dist/checkout/components/CheckoutSuccess.js.map +1 -1
- package/dist/checkout/components/OrderSummary.js +8 -11
- package/dist/checkout/components/OrderSummary.js.map +1 -1
- package/dist/checkout/components/ShippingForm.js +14 -17
- package/dist/checkout/components/ShippingForm.js.map +1 -1
- package/dist/checkout/components/index.js +4 -11
- package/dist/checkout/components/index.js.map +1 -1
- package/dist/checkout/hooks/index.js +1 -6
- package/dist/checkout/hooks/index.js.map +1 -1
- package/dist/checkout/hooks/useCheckout.js +10 -19
- package/dist/checkout/hooks/useCheckout.js.map +1 -1
- package/dist/checkout/index.js +7 -28
- package/dist/checkout/index.js.map +1 -1
- package/dist/checkout/server/create-checkout-session.js +11 -16
- package/dist/checkout/server/create-checkout-session.js.map +1 -1
- package/dist/checkout/server/handle-webhook.js +21 -24
- package/dist/checkout/server/handle-webhook.js.map +1 -1
- package/dist/checkout/server/index.js +3 -13
- package/dist/checkout/server/index.js.map +1 -1
- package/dist/checkout/server/order-service.js +11 -16
- package/dist/checkout/server/order-service.js.map +1 -1
- package/dist/checkout/stripe/client.js +13 -29
- package/dist/checkout/stripe/client.js.map +1 -1
- package/dist/checkout/stripe/index.js +1 -15
- package/dist/checkout/stripe/index.js.map +1 -1
- package/dist/checkout/types.js +1 -2
- package/dist/checkout/types.js.map +1 -1
- package/dist/core/config.js +12 -57
- package/dist/core/config.js.map +1 -1
- package/dist/core/db/client.js +16 -62
- package/dist/core/db/client.js.map +1 -1
- package/dist/core/db/index.js +14 -93
- package/dist/core/db/index.js.map +1 -1
- package/dist/core/db/queries.js +207 -284
- package/dist/core/db/queries.js.map +1 -1
- package/dist/core/db/schema.js +179 -182
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/index.js +12 -42
- package/dist/core/index.js.map +1 -1
- package/dist/core/server/index.js +16 -68
- package/dist/core/server/index.js.map +1 -1
- package/dist/core/types.js +1 -2
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils.js +26 -51
- package/dist/core/utils.js.map +1 -1
- package/dist/emails/config.js +13 -21
- package/dist/emails/config.js.map +1 -1
- package/dist/emails/index.js +10 -72
- package/dist/emails/index.js.map +1 -1
- package/dist/emails/send/auth.js +26 -34
- package/dist/emails/send/auth.js.map +1 -1
- package/dist/emails/send/index.js +2 -21
- package/dist/emails/send/index.js.map +1 -1
- package/dist/emails/send/orders.js +38 -50
- package/dist/emails/send/orders.js.map +1 -1
- package/dist/emails/sender.js +7 -12
- package/dist/emails/sender.js.map +1 -1
- package/dist/emails/templates/base.js +37 -53
- package/dist/emails/templates/base.js.map +1 -1
- package/dist/emails/templates/email-verification.js +12 -16
- package/dist/emails/templates/email-verification.js.map +1 -1
- package/dist/emails/templates/index.js +9 -43
- package/dist/emails/templates/index.js.map +1 -1
- package/dist/emails/templates/order-cancelled.js +18 -22
- package/dist/emails/templates/order-cancelled.js.map +1 -1
- package/dist/emails/templates/order-confirmation.js +30 -34
- package/dist/emails/templates/order-confirmation.js.map +1 -1
- package/dist/emails/templates/order-delivered.js +20 -24
- package/dist/emails/templates/order-delivered.js.map +1 -1
- package/dist/emails/templates/order-shipped.js +19 -23
- package/dist/emails/templates/order-shipped.js.map +1 -1
- package/dist/emails/templates/password-reset.js +12 -16
- package/dist/emails/templates/password-reset.js.map +1 -1
- package/dist/emails/templates/refund-processed.js +17 -21
- package/dist/emails/templates/refund-processed.js.map +1 -1
- package/dist/emails/templates/welcome.js +11 -15
- package/dist/emails/templates/welcome.js.map +1 -1
- package/dist/emails/types.js +1 -2
- package/dist/emails/types.js.map +1 -1
- package/dist/emails/utils.js +9 -20
- package/dist/emails/utils.js.map +1 -1
- package/dist/index.js +24 -176
- package/dist/index.js.map +1 -1
- package/dist/products/api/categories.js +7 -10
- package/dist/products/api/categories.js.map +1 -1
- package/dist/products/api/index.js +3 -9
- package/dist/products/api/index.js.map +1 -1
- package/dist/products/api/product.js +10 -13
- package/dist/products/api/product.js.map +1 -1
- package/dist/products/api/products.js +8 -11
- package/dist/products/api/products.js.map +1 -1
- package/dist/products/components/CategoryNav.js +20 -26
- package/dist/products/components/CategoryNav.js.map +1 -1
- package/dist/products/components/ProductBreadcrumb.js +7 -13
- package/dist/products/components/ProductBreadcrumb.js.map +1 -1
- package/dist/products/components/ProductCard.js +6 -12
- package/dist/products/components/ProductCard.js.map +1 -1
- package/dist/products/components/ProductDetails.js +14 -17
- package/dist/products/components/ProductDetails.js.map +1 -1
- package/dist/products/components/ProductFilters.js +15 -18
- package/dist/products/components/ProductFilters.js.map +1 -1
- package/dist/products/components/ProductGallery.js +17 -23
- package/dist/products/components/ProductGallery.js.map +1 -1
- package/dist/products/components/ProductGrid.js +10 -13
- package/dist/products/components/ProductGrid.js.map +1 -1
- package/dist/products/components/ProductSearch.js +14 -17
- package/dist/products/components/ProductSearch.js.map +1 -1
- package/dist/products/components/ProductSort.js +8 -11
- package/dist/products/components/ProductSort.js.map +1 -1
- package/dist/products/components/VariantSelector.js +16 -19
- package/dist/products/components/VariantSelector.js.map +1 -1
- package/dist/products/components/index.js +10 -23
- package/dist/products/components/index.js.map +1 -1
- package/dist/products/hooks/index.js +4 -11
- package/dist/products/hooks/index.js.map +1 -1
- package/dist/products/hooks/useCategories.js +12 -15
- package/dist/products/hooks/useCategories.js.map +1 -1
- package/dist/products/hooks/useProduct.js +9 -12
- package/dist/products/hooks/useProduct.js.map +1 -1
- package/dist/products/hooks/useProductAttributes.js +10 -13
- package/dist/products/hooks/useProductAttributes.js.map +1 -1
- package/dist/products/hooks/useProducts.js +15 -18
- package/dist/products/hooks/useProducts.js.map +1 -1
- package/dist/products/index.js +6 -23
- package/dist/products/index.js.map +1 -1
- package/dist/theme/ThemeProvider.js +12 -14
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/colors.js +3 -8
- package/dist/theme/colors.js.map +1 -1
- package/dist/theme/defaults.js +27 -30
- package/dist/theme/defaults.js.map +1 -1
- package/dist/theme/fonts.js +12 -18
- package/dist/theme/fonts.js.map +1 -1
- package/dist/theme/generator.js +63 -69
- package/dist/theme/generator.js.map +1 -1
- package/dist/theme/hooks.js +11 -16
- package/dist/theme/hooks.js.map +1 -1
- package/dist/theme/index.js +6 -42
- package/dist/theme/index.js.map +1 -1
- package/package.json +35 -34
package/dist/admin/api/refund.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* @rovela/sdk/admin/api/refund
|
|
4
3
|
*
|
|
@@ -10,14 +9,12 @@
|
|
|
10
9
|
* export { POST } from '@rovela/sdk/admin/api/refund'
|
|
11
10
|
* ```
|
|
12
11
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const client_1 = require("../../checkout/stripe/client");
|
|
20
|
-
const emails_1 = require("../../emails");
|
|
12
|
+
import { NextResponse } from 'next/server';
|
|
13
|
+
import { getServerSession } from 'next-auth';
|
|
14
|
+
import { createAuthOptions } from '../../auth/config';
|
|
15
|
+
import { findOrderById, updateOrderStatus } from '../../core/db/queries';
|
|
16
|
+
import { getStripe, getConnectedAccountId, hasConnectedAccount } from '../../checkout/stripe/client';
|
|
17
|
+
import { sendRefundProcessedAsync, formatPrice, formatOrderNumber } from '../../emails';
|
|
21
18
|
// =============================================================================
|
|
22
19
|
// Handler
|
|
23
20
|
// =============================================================================
|
|
@@ -31,35 +28,35 @@ const emails_1 = require("../../emails");
|
|
|
31
28
|
* - reason: string - Reason for refund (optional)
|
|
32
29
|
* - notifyCustomer: boolean - Send notification email (default true)
|
|
33
30
|
*/
|
|
34
|
-
async function POST(request, { params }) {
|
|
31
|
+
export async function POST(request, { params }) {
|
|
35
32
|
// Auth check - require admin role
|
|
36
|
-
const session = await
|
|
33
|
+
const session = await getServerSession(createAuthOptions());
|
|
37
34
|
const user = session?.user;
|
|
38
35
|
if (!user?.role || !['owner', 'admin'].includes(user.role)) {
|
|
39
|
-
return
|
|
36
|
+
return NextResponse.json({ error: 'Unauthorized', code: 'UNAUTHORIZED' }, { status: 401 });
|
|
40
37
|
}
|
|
41
38
|
try {
|
|
42
39
|
const { id } = await params;
|
|
43
40
|
// Check Stripe is configured
|
|
44
|
-
if (!
|
|
45
|
-
return
|
|
41
|
+
if (!hasConnectedAccount()) {
|
|
42
|
+
return NextResponse.json({ error: 'Stripe is not configured for this store', code: 'INTERNAL_ERROR' }, { status: 500 });
|
|
46
43
|
}
|
|
47
44
|
const body = await request.json();
|
|
48
45
|
// Get order
|
|
49
|
-
const order = await
|
|
46
|
+
const order = await findOrderById(id);
|
|
50
47
|
if (!order) {
|
|
51
|
-
return
|
|
48
|
+
return NextResponse.json({ error: 'Order not found', code: 'NOT_FOUND' }, { status: 404 });
|
|
52
49
|
}
|
|
53
50
|
// Check order has payment intent
|
|
54
51
|
if (!order.stripePaymentIntentId) {
|
|
55
|
-
return
|
|
52
|
+
return NextResponse.json({ error: 'Order has no payment to refund', code: 'VALIDATION_ERROR' }, { status: 400 });
|
|
56
53
|
}
|
|
57
54
|
// Check order is refundable
|
|
58
55
|
if (order.status === 'refunded') {
|
|
59
|
-
return
|
|
56
|
+
return NextResponse.json({ error: 'Order has already been refunded', code: 'VALIDATION_ERROR' }, { status: 400 });
|
|
60
57
|
}
|
|
61
58
|
if (order.status === 'cancelled') {
|
|
62
|
-
return
|
|
59
|
+
return NextResponse.json({ error: 'Cannot refund a cancelled order', code: 'VALIDATION_ERROR' }, { status: 400 });
|
|
63
60
|
}
|
|
64
61
|
// Calculate refund amount
|
|
65
62
|
const orderTotalCents = Math.round(parseFloat(order.total) * 100);
|
|
@@ -67,11 +64,11 @@ async function POST(request, { params }) {
|
|
|
67
64
|
? Math.min(body.amount, orderTotalCents)
|
|
68
65
|
: orderTotalCents;
|
|
69
66
|
if (refundAmount <= 0) {
|
|
70
|
-
return
|
|
67
|
+
return NextResponse.json({ error: 'Invalid refund amount', code: 'VALIDATION_ERROR' }, { status: 400 });
|
|
71
68
|
}
|
|
72
69
|
// Process refund via Stripe
|
|
73
|
-
const stripe =
|
|
74
|
-
const connectedAccountId =
|
|
70
|
+
const stripe = getStripe();
|
|
71
|
+
const connectedAccountId = getConnectedAccountId();
|
|
75
72
|
const refund = await stripe.refunds.create({
|
|
76
73
|
payment_intent: order.stripePaymentIntentId,
|
|
77
74
|
amount: refundAmount,
|
|
@@ -82,17 +79,17 @@ async function POST(request, { params }) {
|
|
|
82
79
|
// Update order status if full refund
|
|
83
80
|
const isFullRefund = refundAmount >= orderTotalCents;
|
|
84
81
|
if (isFullRefund) {
|
|
85
|
-
await
|
|
82
|
+
await updateOrderStatus(id, 'refunded');
|
|
86
83
|
}
|
|
87
84
|
// Send notification email
|
|
88
85
|
const notifyCustomer = body.notifyCustomer !== false;
|
|
89
86
|
if (notifyCustomer && order.email) {
|
|
90
87
|
const customerName = order.email.split('@')[0];
|
|
91
|
-
|
|
88
|
+
sendRefundProcessedAsync({
|
|
92
89
|
to: order.email,
|
|
93
90
|
customerName,
|
|
94
|
-
orderNumber:
|
|
95
|
-
refundAmount:
|
|
91
|
+
orderNumber: formatOrderNumber(order.id),
|
|
92
|
+
refundAmount: formatPrice(refundAmount / 100),
|
|
96
93
|
refundDate: new Date().toLocaleDateString(),
|
|
97
94
|
paymentMethod: 'Original payment method',
|
|
98
95
|
estimatedArrival: '5-10 business days',
|
|
@@ -100,7 +97,7 @@ async function POST(request, { params }) {
|
|
|
100
97
|
});
|
|
101
98
|
console.log('[Admin Refund] Refund email queued for:', order.email);
|
|
102
99
|
}
|
|
103
|
-
return
|
|
100
|
+
return NextResponse.json({
|
|
104
101
|
success: true,
|
|
105
102
|
refundId: refund.id,
|
|
106
103
|
});
|
|
@@ -109,9 +106,9 @@ async function POST(request, { params }) {
|
|
|
109
106
|
console.error('[Admin Refund API] POST error:', error);
|
|
110
107
|
// Handle Stripe errors
|
|
111
108
|
if (isStripeError(error)) {
|
|
112
|
-
return
|
|
109
|
+
return NextResponse.json({ error: error.message, code: 'INTERNAL_ERROR' }, { status: 400 });
|
|
113
110
|
}
|
|
114
|
-
return
|
|
111
|
+
return NextResponse.json({ error: 'Failed to process refund', code: 'INTERNAL_ERROR' }, { status: 500 });
|
|
115
112
|
}
|
|
116
113
|
}
|
|
117
114
|
// =============================================================================
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refund.js","sourceRoot":"","sources":["../../../src/admin/api/refund.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"refund.js","sourceRoot":"","sources":["../../../src/admin/api/refund.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* @rovela/sdk/admin/api/settings
|
|
4
3
|
*
|
|
@@ -11,13 +10,10 @@
|
|
|
11
10
|
* export { GET, PUT } from '@rovela/sdk/admin/api/settings'
|
|
12
11
|
* ```
|
|
13
12
|
*/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const next_auth_1 = require("next-auth");
|
|
19
|
-
const config_1 = require("../../auth/config");
|
|
20
|
-
const queries_1 = require("../../core/db/queries");
|
|
13
|
+
import { NextResponse } from 'next/server';
|
|
14
|
+
import { getServerSession } from 'next-auth';
|
|
15
|
+
import { createAuthOptions } from '../../auth/config';
|
|
16
|
+
import { findSettings, upsertSettings } from '../../core/db/queries';
|
|
21
17
|
// =============================================================================
|
|
22
18
|
// Default Values
|
|
23
19
|
// =============================================================================
|
|
@@ -51,26 +47,26 @@ function getDefaultSettings() {
|
|
|
51
47
|
* Get store settings. If no settings exist in database, seeds from
|
|
52
48
|
* blueprint and environment variables (lazy initialization).
|
|
53
49
|
*/
|
|
54
|
-
async function GET() {
|
|
50
|
+
export async function GET() {
|
|
55
51
|
try {
|
|
56
52
|
// Auth check - require admin role
|
|
57
|
-
const session = await
|
|
53
|
+
const session = await getServerSession(createAuthOptions());
|
|
58
54
|
const user = session?.user;
|
|
59
55
|
if (!user?.role || !['owner', 'admin'].includes(user.role)) {
|
|
60
|
-
return
|
|
56
|
+
return NextResponse.json({ error: 'Unauthorized', code: 'UNAUTHORIZED' }, { status: 401 });
|
|
61
57
|
}
|
|
62
58
|
// Try to find existing settings
|
|
63
|
-
let settings = await
|
|
59
|
+
let settings = await findSettings();
|
|
64
60
|
// If no settings exist, seed from defaults (lazy initialization)
|
|
65
61
|
if (!settings) {
|
|
66
62
|
const defaults = getDefaultSettings();
|
|
67
|
-
settings = await
|
|
63
|
+
settings = await upsertSettings(defaults);
|
|
68
64
|
}
|
|
69
|
-
return
|
|
65
|
+
return NextResponse.json({ settings });
|
|
70
66
|
}
|
|
71
67
|
catch (error) {
|
|
72
68
|
console.error('[Admin Settings API] GET error:', error);
|
|
73
|
-
return
|
|
69
|
+
return NextResponse.json({ error: 'Failed to fetch settings', code: 'INTERNAL_ERROR' }, { status: 500 });
|
|
74
70
|
}
|
|
75
71
|
}
|
|
76
72
|
/**
|
|
@@ -92,13 +88,13 @@ async function GET() {
|
|
|
92
88
|
* }
|
|
93
89
|
* ```
|
|
94
90
|
*/
|
|
95
|
-
async function PUT(request) {
|
|
91
|
+
export async function PUT(request) {
|
|
96
92
|
try {
|
|
97
93
|
// Auth check - require admin role
|
|
98
|
-
const session = await
|
|
94
|
+
const session = await getServerSession(createAuthOptions());
|
|
99
95
|
const user = session?.user;
|
|
100
96
|
if (!user?.role || !['owner', 'admin'].includes(user.role)) {
|
|
101
|
-
return
|
|
97
|
+
return NextResponse.json({ error: 'Unauthorized', code: 'UNAUTHORIZED' }, { status: 401 });
|
|
102
98
|
}
|
|
103
99
|
// Parse request body
|
|
104
100
|
const body = await request.json();
|
|
@@ -129,12 +125,12 @@ async function PUT(request) {
|
|
|
129
125
|
data.freeShippingThreshold = Math.max(0, body.freeShippingThreshold);
|
|
130
126
|
}
|
|
131
127
|
// Upsert settings
|
|
132
|
-
const settings = await
|
|
133
|
-
return
|
|
128
|
+
const settings = await upsertSettings(data);
|
|
129
|
+
return NextResponse.json({ settings });
|
|
134
130
|
}
|
|
135
131
|
catch (error) {
|
|
136
132
|
console.error('[Admin Settings API] PUT error:', error);
|
|
137
|
-
return
|
|
133
|
+
return NextResponse.json({ error: 'Failed to update settings', code: 'INTERNAL_ERROR' }, { status: 500 });
|
|
138
134
|
}
|
|
139
135
|
}
|
|
140
136
|
//# sourceMappingURL=settings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/admin/api/settings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/admin/api/settings.ts"],"names":[],"mappings":"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"}
|
package/dist/admin/api/setup.js
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* @rovela/sdk/admin/api/setup
|
|
4
3
|
*
|
|
5
4
|
* Admin setup API route handler for first-time admin account creation.
|
|
6
5
|
* This endpoint is only accessible when no admins exist for the tenant.
|
|
7
6
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const admin_service_1 = require("../server/admin-service");
|
|
12
|
-
const password_1 = require("../../auth/server/password");
|
|
7
|
+
import { NextResponse } from 'next/server';
|
|
8
|
+
import { createAdmin, countAdmins, adminEmailExists } from '../server/admin-service';
|
|
9
|
+
import { validatePassword } from '../../auth/server/password';
|
|
13
10
|
/**
|
|
14
11
|
* Validate email format
|
|
15
12
|
*/
|
|
@@ -52,13 +49,13 @@ function isValidEmail(email) {
|
|
|
52
49
|
* }
|
|
53
50
|
* ```
|
|
54
51
|
*/
|
|
55
|
-
async function POST(request) {
|
|
52
|
+
export async function POST(request) {
|
|
56
53
|
try {
|
|
57
54
|
// CRITICAL: Check if any admins exist
|
|
58
55
|
// If admins exist, setup is disabled
|
|
59
|
-
const adminCount = await
|
|
56
|
+
const adminCount = await countAdmins();
|
|
60
57
|
if (adminCount > 0) {
|
|
61
|
-
return
|
|
58
|
+
return NextResponse.json({
|
|
62
59
|
error: 'Admin setup has already been completed.',
|
|
63
60
|
code: 'SETUP_DISABLED',
|
|
64
61
|
}, { status: 403 });
|
|
@@ -67,45 +64,45 @@ async function POST(request) {
|
|
|
67
64
|
const body = (await request.json());
|
|
68
65
|
// Validate required fields
|
|
69
66
|
if (!body.email || !body.password || !body.name) {
|
|
70
|
-
return
|
|
67
|
+
return NextResponse.json({
|
|
71
68
|
error: 'Email, password, and name are required.',
|
|
72
69
|
code: 'VALIDATION_ERROR',
|
|
73
70
|
}, { status: 400 });
|
|
74
71
|
}
|
|
75
72
|
// Validate email format
|
|
76
73
|
if (!isValidEmail(body.email)) {
|
|
77
|
-
return
|
|
74
|
+
return NextResponse.json({
|
|
78
75
|
error: 'Please enter a valid email address.',
|
|
79
76
|
code: 'VALIDATION_ERROR',
|
|
80
77
|
}, { status: 400 });
|
|
81
78
|
}
|
|
82
79
|
// Validate name
|
|
83
80
|
if (body.name.trim().length < 2) {
|
|
84
|
-
return
|
|
81
|
+
return NextResponse.json({
|
|
85
82
|
error: 'Name must be at least 2 characters.',
|
|
86
83
|
code: 'VALIDATION_ERROR',
|
|
87
84
|
}, { status: 400 });
|
|
88
85
|
}
|
|
89
86
|
// Validate password
|
|
90
|
-
const passwordValidation =
|
|
87
|
+
const passwordValidation = validatePassword(body.password);
|
|
91
88
|
if (!passwordValidation.valid) {
|
|
92
|
-
return
|
|
89
|
+
return NextResponse.json({
|
|
93
90
|
error: passwordValidation.error,
|
|
94
91
|
code: 'VALIDATION_ERROR',
|
|
95
92
|
}, { status: 400 });
|
|
96
93
|
}
|
|
97
94
|
// Check if email already exists (edge case: race condition)
|
|
98
|
-
const emailExists = await
|
|
95
|
+
const emailExists = await adminEmailExists(body.email);
|
|
99
96
|
if (emailExists) {
|
|
100
|
-
return
|
|
97
|
+
return NextResponse.json({
|
|
101
98
|
error: 'An admin with this email already exists.',
|
|
102
99
|
code: 'EMAIL_EXISTS',
|
|
103
100
|
}, { status: 409 });
|
|
104
101
|
}
|
|
105
102
|
// Create the admin as 'owner' (first admin is always owner)
|
|
106
|
-
const { admin } = await
|
|
103
|
+
const { admin } = await createAdmin(body.email, body.password, body.name.trim(), 'owner');
|
|
107
104
|
console.log(`[Admin Setup] First admin created: ${admin.email} (owner)`);
|
|
108
|
-
return
|
|
105
|
+
return NextResponse.json({
|
|
109
106
|
success: true,
|
|
110
107
|
message: 'Admin account created successfully.',
|
|
111
108
|
adminId: admin.id,
|
|
@@ -115,12 +112,12 @@ async function POST(request) {
|
|
|
115
112
|
console.error('[Admin Setup] Error:', error);
|
|
116
113
|
// Handle duplicate email (database constraint)
|
|
117
114
|
if (error instanceof Error && error.message.includes('already exists')) {
|
|
118
|
-
return
|
|
115
|
+
return NextResponse.json({
|
|
119
116
|
error: 'An admin with this email already exists.',
|
|
120
117
|
code: 'EMAIL_EXISTS',
|
|
121
118
|
}, { status: 409 });
|
|
122
119
|
}
|
|
123
|
-
return
|
|
120
|
+
return NextResponse.json({
|
|
124
121
|
error: 'Failed to create admin account. Please try again.',
|
|
125
122
|
code: 'SERVER_ERROR',
|
|
126
123
|
}, { status: 500 });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/admin/api/setup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/admin/api/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/admin/api/stats.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* @rovela/sdk/admin/api/stats
|
|
4
3
|
*
|
|
@@ -10,12 +9,10 @@
|
|
|
10
9
|
* export { GET } from '@rovela/sdk/admin/api/stats'
|
|
11
10
|
* ```
|
|
12
11
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const config_1 = require("../../auth/config");
|
|
18
|
-
const queries_1 = require("../../core/db/queries");
|
|
12
|
+
import { NextResponse } from 'next/server';
|
|
13
|
+
import { getServerSession } from 'next-auth';
|
|
14
|
+
import { createAuthOptions } from '../../auth/config';
|
|
15
|
+
import { getStoreStats, getLowStockProducts, getRecentOrders, getRevenueByPeriod, getOrdersByStatus, } from '../../core/db/queries';
|
|
19
16
|
// =============================================================================
|
|
20
17
|
// Handler
|
|
21
18
|
// =============================================================================
|
|
@@ -30,13 +27,13 @@ const queries_1 = require("../../core/db/queries");
|
|
|
30
27
|
* - lowStockThreshold: number - Threshold for low stock (default 10)
|
|
31
28
|
* - recentOrdersLimit: number - Number of recent orders (default 5)
|
|
32
29
|
*/
|
|
33
|
-
async function GET(request) {
|
|
30
|
+
export async function GET(request) {
|
|
34
31
|
try {
|
|
35
32
|
// Auth check - require admin role
|
|
36
|
-
const session = await
|
|
33
|
+
const session = await getServerSession(createAuthOptions());
|
|
37
34
|
const user = session?.user;
|
|
38
35
|
if (!user?.role || !['owner', 'admin'].includes(user.role)) {
|
|
39
|
-
return
|
|
36
|
+
return NextResponse.json({ error: 'Unauthorized', code: 'UNAUTHORIZED' }, { status: 401 });
|
|
40
37
|
}
|
|
41
38
|
const searchParams = request.nextUrl.searchParams;
|
|
42
39
|
// Parse options
|
|
@@ -46,9 +43,9 @@ async function GET(request) {
|
|
|
46
43
|
const recentOrdersLimit = parseInt(searchParams.get('recentOrdersLimit') || '5', 10);
|
|
47
44
|
// Fetch core stats in parallel
|
|
48
45
|
const [stats, lowStockData, recentOrders] = await Promise.all([
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
46
|
+
getStoreStats(),
|
|
47
|
+
getLowStockProducts(lowStockThreshold),
|
|
48
|
+
getRecentOrders(recentOrdersLimit),
|
|
52
49
|
]);
|
|
53
50
|
// Transform low stock data
|
|
54
51
|
const lowStock = lowStockData.map((item) => ({
|
|
@@ -66,17 +63,17 @@ async function GET(request) {
|
|
|
66
63
|
};
|
|
67
64
|
// Optionally include revenue data
|
|
68
65
|
if (includeRevenue) {
|
|
69
|
-
response.revenueByDay = await
|
|
66
|
+
response.revenueByDay = await getRevenueByPeriod(30);
|
|
70
67
|
}
|
|
71
68
|
// Optionally include order status breakdown
|
|
72
69
|
if (includeOrderStatus) {
|
|
73
|
-
response.ordersByStatus = await
|
|
70
|
+
response.ordersByStatus = await getOrdersByStatus();
|
|
74
71
|
}
|
|
75
|
-
return
|
|
72
|
+
return NextResponse.json(response);
|
|
76
73
|
}
|
|
77
74
|
catch (error) {
|
|
78
75
|
console.error('[Admin Stats API] GET error:', error);
|
|
79
|
-
return
|
|
76
|
+
return NextResponse.json({ error: 'Failed to fetch dashboard stats', code: 'INTERNAL_ERROR' }, { status: 500 });
|
|
80
77
|
}
|
|
81
78
|
}
|
|
82
79
|
//# sourceMappingURL=stats.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/admin/api/stats.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/admin/api/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
'use client';
|
|
3
|
-
|
|
4
|
-
exports.AdminGuard = AdminGuard;
|
|
5
|
-
exports.withAdminAuth = withAdminAuth;
|
|
6
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
2
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
7
3
|
/**
|
|
8
4
|
* @rovela/sdk/admin/components/AdminGuard
|
|
9
5
|
*
|
|
10
6
|
* Route protection component for admin routes.
|
|
11
7
|
*/
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
import { useEffect } from 'react';
|
|
9
|
+
import { useAdminAuth } from '../hooks/useAdminAuth';
|
|
14
10
|
/**
|
|
15
11
|
* Guard component that protects routes requiring admin authentication.
|
|
16
12
|
*
|
|
@@ -32,10 +28,10 @@ const useAdminAuth_1 = require("../hooks/useAdminAuth");
|
|
|
32
28
|
* </AdminGuard>
|
|
33
29
|
* ```
|
|
34
30
|
*/
|
|
35
|
-
function AdminGuard({ children, fallback, redirectTo = '/admin/login', requireOwner = false, loadingComponent, }) {
|
|
36
|
-
const { isAuthenticated, isLoading, isOwner } =
|
|
31
|
+
export function AdminGuard({ children, fallback, redirectTo = '/admin/login', requireOwner = false, loadingComponent, }) {
|
|
32
|
+
const { isAuthenticated, isLoading, isOwner } = useAdminAuth();
|
|
37
33
|
// Handle redirect when not authenticated
|
|
38
|
-
|
|
34
|
+
useEffect(() => {
|
|
39
35
|
if (isLoading)
|
|
40
36
|
return;
|
|
41
37
|
// Not authenticated - redirect to login
|
|
@@ -53,26 +49,26 @@ function AdminGuard({ children, fallback, redirectTo = '/admin/login', requireOw
|
|
|
53
49
|
// Loading state
|
|
54
50
|
if (isLoading) {
|
|
55
51
|
if (loadingComponent) {
|
|
56
|
-
return (
|
|
52
|
+
return _jsx(_Fragment, { children: loadingComponent });
|
|
57
53
|
}
|
|
58
|
-
return ((
|
|
54
|
+
return (_jsx("div", { className: "flex min-h-screen items-center justify-center bg-background", children: _jsxs("div", { className: "text-center", children: [_jsx("div", { className: "mx-auto h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent" }), _jsx("p", { className: "mt-4 text-sm text-muted-foreground", children: "Loading..." })] }) }));
|
|
59
55
|
}
|
|
60
56
|
// Not authenticated
|
|
61
57
|
if (!isAuthenticated) {
|
|
62
58
|
if (fallback) {
|
|
63
|
-
return (
|
|
59
|
+
return _jsx(_Fragment, { children: fallback });
|
|
64
60
|
}
|
|
65
61
|
return null;
|
|
66
62
|
}
|
|
67
63
|
// Owner required but not owner
|
|
68
64
|
if (requireOwner && !isOwner) {
|
|
69
65
|
if (fallback) {
|
|
70
|
-
return (
|
|
66
|
+
return _jsx(_Fragment, { children: fallback });
|
|
71
67
|
}
|
|
72
68
|
return null;
|
|
73
69
|
}
|
|
74
70
|
// Authenticated (and owner if required) - render children
|
|
75
|
-
return (
|
|
71
|
+
return _jsx(_Fragment, { children: children });
|
|
76
72
|
}
|
|
77
73
|
/**
|
|
78
74
|
* HOC version of AdminGuard.
|
|
@@ -86,9 +82,9 @@ function AdminGuard({ children, fallback, redirectTo = '/admin/login', requireOw
|
|
|
86
82
|
* export default withAdminAuth(SettingsPage, { requireOwner: true })
|
|
87
83
|
* ```
|
|
88
84
|
*/
|
|
89
|
-
function withAdminAuth(Component, options = {}) {
|
|
85
|
+
export function withAdminAuth(Component, options = {}) {
|
|
90
86
|
function WrappedComponent(props) {
|
|
91
|
-
return ((
|
|
87
|
+
return (_jsx(AdminGuard, { ...options, children: _jsx(Component, { ...props }) }));
|
|
92
88
|
}
|
|
93
89
|
const displayName = Component.displayName || Component.name || 'Component';
|
|
94
90
|
WrappedComponent.displayName = `withAdminAuth(${displayName})`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminGuard.js","sourceRoot":"","sources":["../../../src/admin/components/AdminGuard.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AdminGuard.js","sourceRoot":"","sources":["../../../src/admin/components/AdminGuard.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAGpD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,QAAQ,EACR,QAAQ,EACR,UAAU,GAAG,cAAc,EAC3B,YAAY,GAAG,KAAK,EACpB,gBAAgB,GACA;IAChB,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,CAAA;IAE9D,yCAAyC;IACzC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS;YAAE,OAAM;QAErB,wCAAwC;QACxC,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAA;YACrE,MAAM,WAAW,GAAG,GAAG,UAAU,gBAAgB,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAA;YAClF,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAA;YAClC,OAAM;QACR,CAAC;QAED,+BAA+B;QAC/B,IAAI,YAAY,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,wBAAwB,CAAA;QACjD,CAAC;IACH,CAAC,EAAE,CAAC,eAAe,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,CAAA;IAEnE,gBAAgB;IAChB,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,4BAAG,gBAAgB,GAAI,CAAA;QAChC,CAAC;QAED,OAAO,CACL,cAAK,SAAS,EAAC,6DAA6D,YAC1E,eAAK,SAAS,EAAC,aAAa,aAC1B,cAAK,SAAS,EAAC,wFAAwF,GAAG,EAC1G,YAAG,SAAS,EAAC,oCAAoC,2BAAe,IAC5D,GACF,CACP,CAAA;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,4BAAG,QAAQ,GAAI,CAAA;QACxB,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,+BAA+B;IAC/B,IAAI,YAAY,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,4BAAG,QAAQ,GAAI,CAAA;QACxB,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,0DAA0D;IAC1D,OAAO,4BAAG,QAAQ,GAAI,CAAA;AACxB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAC3B,SAAiC,EACjC,UAA6C,EAAE;IAE/C,SAAS,gBAAgB,CAAC,KAAQ;QAChC,OAAO,CACL,KAAC,UAAU,OAAK,OAAO,YACrB,KAAC,SAAS,OAAK,KAAK,GAAI,GACb,CACd,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,IAAI,IAAI,WAAW,CAAA;IAC1E,gBAAgB,CAAC,WAAW,GAAG,iBAAiB,WAAW,GAAG,CAAA;IAE9D,OAAO,gBAAgB,CAAA;AACzB,CAAC"}
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
'use client';
|
|
3
|
-
|
|
4
|
-
exports.AdminHeader = AdminHeader;
|
|
5
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
6
3
|
/**
|
|
7
4
|
* @rovela/sdk/admin/components/AdminHeader
|
|
8
5
|
*
|
|
9
6
|
* Admin top header with user menu.
|
|
10
7
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
import { useState, useCallback } from 'react';
|
|
9
|
+
import { useAdminAuth } from '../hooks/useAdminAuth';
|
|
13
10
|
// =============================================================================
|
|
14
11
|
// Component
|
|
15
12
|
// =============================================================================
|
|
@@ -21,13 +18,13 @@ const useAdminAuth_1 = require("../hooks/useAdminAuth");
|
|
|
21
18
|
* <AdminHeader title="Dashboard" storeUrl="https://mystore.com" />
|
|
22
19
|
* ```
|
|
23
20
|
*/
|
|
24
|
-
function AdminHeader({ title, storeUrl = '/', className = '', }) {
|
|
25
|
-
const { admin, signOut } =
|
|
26
|
-
const [isMenuOpen, setIsMenuOpen] =
|
|
27
|
-
const handleSignOut =
|
|
21
|
+
export function AdminHeader({ title, storeUrl = '/', className = '', }) {
|
|
22
|
+
const { admin, signOut } = useAdminAuth();
|
|
23
|
+
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
|
24
|
+
const handleSignOut = useCallback(async () => {
|
|
28
25
|
await signOut();
|
|
29
26
|
window.location.href = '/admin/login';
|
|
30
27
|
}, [signOut]);
|
|
31
|
-
return ((
|
|
28
|
+
return (_jsxs("header", { className: `flex h-16 items-center justify-between border-b border-border bg-card px-6 ${className}`, children: [_jsx("div", { children: title && (_jsx("h1", { className: "text-xl font-semibold text-foreground", children: title })) }), _jsxs("div", { className: "flex items-center gap-4", children: [_jsxs("a", { href: storeUrl, target: "_blank", rel: "noopener noreferrer", className: "flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground", children: [_jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" }) }), "View Store"] }), _jsxs("div", { className: "relative", children: [_jsxs("button", { onClick: () => setIsMenuOpen(!isMenuOpen), className: "flex items-center gap-2 rounded-md px-3 py-2 text-sm hover:bg-accent", children: [_jsx("div", { className: "flex h-8 w-8 items-center justify-center rounded-full bg-primary text-primary-foreground", children: admin?.name?.charAt(0).toUpperCase() || 'A' }), _jsx("span", { className: "hidden text-foreground md:block", children: admin?.name || 'Admin' }), _jsx("svg", { className: `h-4 w-4 text-muted-foreground transition-transform ${isMenuOpen ? 'rotate-180' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }) })] }), isMenuOpen && (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-10", onClick: () => setIsMenuOpen(false) }), _jsxs("div", { className: "absolute right-0 z-20 mt-2 w-48 rounded-md border border-border bg-card py-1 shadow-lg", children: [_jsxs("div", { className: "border-b border-border px-4 py-2", children: [_jsx("p", { className: "text-sm font-medium text-foreground", children: admin?.name }), _jsx("p", { className: "text-xs text-muted-foreground", children: admin?.email }), admin?.role === 'owner' && (_jsx("span", { className: "mt-1 inline-block rounded-full bg-primary/10 px-2 py-0.5 text-xs text-primary", children: "Owner" }))] }), _jsx("a", { href: "/admin/settings", className: "block px-4 py-2 text-sm text-foreground hover:bg-accent", onClick: () => setIsMenuOpen(false), children: "Settings" }), _jsx("button", { onClick: handleSignOut, className: "block w-full px-4 py-2 text-left text-sm text-destructive hover:bg-accent", children: "Sign Out" })] })] }))] })] })] }));
|
|
32
29
|
}
|
|
33
30
|
//# sourceMappingURL=AdminHeader.js.map
|