@rovela-ai/sdk 0.1.18 → 0.1.20
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.d.ts.map +1 -1
- package/dist/admin/components/AdminNav.js +16 -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/CategoryForm.d.ts +30 -0
- package/dist/admin/components/CategoryForm.d.ts.map +1 -0
- package/dist/admin/components/CategoryForm.js +153 -0
- package/dist/admin/components/CategoryForm.js.map +1 -0
- package/dist/admin/components/CategorySelect.d.ts +32 -0
- package/dist/admin/components/CategorySelect.d.ts.map +1 -0
- package/dist/admin/components/CategorySelect.js +148 -0
- package/dist/admin/components/CategorySelect.js.map +1 -0
- 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.d.ts +2 -2
- package/dist/admin/components/ProductForm.d.ts.map +1 -1
- package/dist/admin/components/ProductForm.js +140 -27
- 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/SEOPreview.d.ts +32 -0
- package/dist/admin/components/SEOPreview.d.ts.map +1 -0
- package/dist/admin/components/SEOPreview.js +30 -0
- package/dist/admin/components/SEOPreview.js.map +1 -0
- 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/TagInput.d.ts +29 -0
- package/dist/admin/components/TagInput.d.ts.map +1 -0
- package/dist/admin/components/TagInput.js +73 -0
- package/dist/admin/components/TagInput.js.map +1 -0
- package/dist/admin/components/VariantManager.d.ts +42 -0
- package/dist/admin/components/VariantManager.d.ts.map +1 -0
- package/dist/admin/components/VariantManager.js +175 -0
- package/dist/admin/components/VariantManager.js.map +1 -0
- package/dist/admin/components/index.d.ts +5 -0
- package/dist/admin/components/index.d.ts.map +1 -1
- package/dist/admin/components/index.js +27 -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.d.ts +2 -0
- package/dist/admin/hooks/index.d.ts.map +1 -1
- package/dist/admin/hooks/index.js +5 -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/useAdminCategories.d.ts +36 -0
- package/dist/admin/hooks/useAdminCategories.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminCategories.js +217 -0
- package/dist/admin/hooks/useAdminCategories.js.map +1 -0
- 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.d.ts +3 -2
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +17 -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/StoreSettingsProvider.d.ts +104 -0
- package/dist/core/StoreSettingsProvider.d.ts.map +1 -0
- package/dist/core/StoreSettingsProvider.js +195 -0
- package/dist/core/StoreSettingsProvider.js.map +1 -0
- package/dist/core/api/index.d.ts +7 -0
- package/dist/core/api/index.d.ts.map +1 -0
- package/dist/core/api/index.js +7 -0
- package/dist/core/api/index.js.map +1 -0
- package/dist/core/api/settings.d.ts +42 -0
- package/dist/core/api/settings.d.ts.map +1 -0
- package/dist/core/api/settings.js +74 -0
- package/dist/core/api/settings.js.map +1 -0
- 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.d.ts +6 -6
- 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.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +14 -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 -30
|
@@ -1,19 +1,10 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* @rovela/sdk/auth/server/password
|
|
4
3
|
*
|
|
5
4
|
* Password hashing and verification utilities.
|
|
6
5
|
* Uses bcryptjs with 12 salt rounds for security.
|
|
7
6
|
*/
|
|
8
|
-
|
|
9
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.MIN_PASSWORD_LENGTH = void 0;
|
|
13
|
-
exports.hashPassword = hashPassword;
|
|
14
|
-
exports.verifyPassword = verifyPassword;
|
|
15
|
-
exports.validatePassword = validatePassword;
|
|
16
|
-
const bcryptjs_1 = __importDefault(require("bcryptjs"));
|
|
7
|
+
import bcrypt from 'bcryptjs';
|
|
17
8
|
// =============================================================================
|
|
18
9
|
// Constants
|
|
19
10
|
// =============================================================================
|
|
@@ -25,7 +16,7 @@ const SALT_ROUNDS = 12;
|
|
|
25
16
|
/**
|
|
26
17
|
* Minimum password length required.
|
|
27
18
|
*/
|
|
28
|
-
|
|
19
|
+
export const MIN_PASSWORD_LENGTH = 8;
|
|
29
20
|
// =============================================================================
|
|
30
21
|
// Password Hashing
|
|
31
22
|
// =============================================================================
|
|
@@ -41,8 +32,8 @@ exports.MIN_PASSWORD_LENGTH = 8;
|
|
|
41
32
|
* // Store hash in database
|
|
42
33
|
* ```
|
|
43
34
|
*/
|
|
44
|
-
async function hashPassword(password) {
|
|
45
|
-
return
|
|
35
|
+
export async function hashPassword(password) {
|
|
36
|
+
return bcrypt.hash(password, SALT_ROUNDS);
|
|
46
37
|
}
|
|
47
38
|
/**
|
|
48
39
|
* Verify a password against a hash.
|
|
@@ -59,8 +50,8 @@ async function hashPassword(password) {
|
|
|
59
50
|
* }
|
|
60
51
|
* ```
|
|
61
52
|
*/
|
|
62
|
-
async function verifyPassword(password, hashedPassword) {
|
|
63
|
-
return
|
|
53
|
+
export async function verifyPassword(password, hashedPassword) {
|
|
54
|
+
return bcrypt.compare(password, hashedPassword);
|
|
64
55
|
}
|
|
65
56
|
// =============================================================================
|
|
66
57
|
// Password Validation
|
|
@@ -79,14 +70,14 @@ async function verifyPassword(password, hashedPassword) {
|
|
|
79
70
|
* }
|
|
80
71
|
* ```
|
|
81
72
|
*/
|
|
82
|
-
function validatePassword(password) {
|
|
73
|
+
export function validatePassword(password) {
|
|
83
74
|
if (!password) {
|
|
84
75
|
return { valid: false, error: 'Password is required' };
|
|
85
76
|
}
|
|
86
|
-
if (password.length <
|
|
77
|
+
if (password.length < MIN_PASSWORD_LENGTH) {
|
|
87
78
|
return {
|
|
88
79
|
valid: false,
|
|
89
|
-
error: `Password must be at least ${
|
|
80
|
+
error: `Password must be at least ${MIN_PASSWORD_LENGTH} characters`,
|
|
90
81
|
};
|
|
91
82
|
}
|
|
92
83
|
return { valid: true };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password.js","sourceRoot":"","sources":["../../../src/auth/server/password.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"password.js","sourceRoot":"","sources":["../../../src/auth/server/password.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,MAAM,MAAM,UAAU,CAAA;AAE7B,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,WAAW,GAAG,EAAE,CAAA;AAEtB;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AAEpC,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;AAC3C,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,cAAsB;IAEtB,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;AACjD,CAAC;AAED,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAI/C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAA;IACxD,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,mBAAmB,EAAE,CAAC;QAC1C,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,6BAA6B,mBAAmB,aAAa;SACrE,CAAA;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACxB,CAAC"}
|
|
@@ -1,56 +1,15 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* @rovela/sdk/auth/server/verification-service
|
|
4
3
|
*
|
|
5
4
|
* Email verification token management.
|
|
6
5
|
* Handles creating, validating, and cleaning up verification tokens.
|
|
7
6
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
Object.defineProperty(o, k2, desc);
|
|
15
|
-
}) : (function(o, m, k, k2) {
|
|
16
|
-
if (k2 === undefined) k2 = k;
|
|
17
|
-
o[k2] = m[k];
|
|
18
|
-
}));
|
|
19
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
-
}) : function(o, v) {
|
|
22
|
-
o["default"] = v;
|
|
23
|
-
});
|
|
24
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
-
var ownKeys = function(o) {
|
|
26
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
-
var ar = [];
|
|
28
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
-
return ar;
|
|
30
|
-
};
|
|
31
|
-
return ownKeys(o);
|
|
32
|
-
};
|
|
33
|
-
return function (mod) {
|
|
34
|
-
if (mod && mod.__esModule) return mod;
|
|
35
|
-
var result = {};
|
|
36
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
-
__setModuleDefault(result, mod);
|
|
38
|
-
return result;
|
|
39
|
-
};
|
|
40
|
-
})();
|
|
41
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
exports.createVerificationToken = createVerificationToken;
|
|
43
|
-
exports.verifyEmail = verifyEmail;
|
|
44
|
-
exports.deleteVerificationTokens = deleteVerificationTokens;
|
|
45
|
-
exports.resendVerificationEmail = resendVerificationEmail;
|
|
46
|
-
exports.isEmailVerified = isEmailVerified;
|
|
47
|
-
exports.cleanupExpiredTokens = cleanupExpiredTokens;
|
|
48
|
-
const drizzle_orm_1 = require("drizzle-orm");
|
|
49
|
-
const nanoid_1 = require("nanoid");
|
|
50
|
-
const client_1 = require("../../core/db/client");
|
|
51
|
-
const schema = __importStar(require("../../core/db/schema"));
|
|
52
|
-
const customer_service_1 = require("./customer-service");
|
|
53
|
-
const email_sender_1 = require("./email-sender");
|
|
7
|
+
import { eq, and, lt } from 'drizzle-orm';
|
|
8
|
+
import { nanoid } from 'nanoid';
|
|
9
|
+
import { getDb, getTenantId } from '../../core/db/client';
|
|
10
|
+
import * as schema from '../../core/db/schema';
|
|
11
|
+
import { findCustomerByEmail, markEmailVerified } from './customer-service';
|
|
12
|
+
import { sendVerificationEmail, sendWelcomeEmail, getStoreName } from './email-sender';
|
|
54
13
|
// =============================================================================
|
|
55
14
|
// Constants
|
|
56
15
|
// =============================================================================
|
|
@@ -78,13 +37,13 @@ const TOKEN_LENGTH = 32;
|
|
|
78
37
|
* // Use token in verification email link
|
|
79
38
|
* ```
|
|
80
39
|
*/
|
|
81
|
-
async function createVerificationToken(customerId) {
|
|
82
|
-
const db =
|
|
83
|
-
const tenantId =
|
|
40
|
+
export async function createVerificationToken(customerId) {
|
|
41
|
+
const db = getDb();
|
|
42
|
+
const tenantId = getTenantId();
|
|
84
43
|
// Delete any existing tokens for this customer
|
|
85
44
|
await deleteVerificationTokens(customerId);
|
|
86
45
|
// Generate new token
|
|
87
|
-
const token =
|
|
46
|
+
const token = nanoid(TOKEN_LENGTH);
|
|
88
47
|
const expires = new Date(Date.now() + TOKEN_EXPIRY_MS);
|
|
89
48
|
await db.insert(schema.customerVerificationTokens).values({
|
|
90
49
|
tenantId,
|
|
@@ -111,13 +70,13 @@ async function createVerificationToken(customerId) {
|
|
|
111
70
|
* }
|
|
112
71
|
* ```
|
|
113
72
|
*/
|
|
114
|
-
async function verifyEmail(token) {
|
|
115
|
-
const db =
|
|
73
|
+
export async function verifyEmail(token) {
|
|
74
|
+
const db = getDb();
|
|
116
75
|
// Find the token (not tenant-scoped since we only have the token)
|
|
117
76
|
const [tokenRecord] = await db
|
|
118
77
|
.select()
|
|
119
78
|
.from(schema.customerVerificationTokens)
|
|
120
|
-
.where(
|
|
79
|
+
.where(eq(schema.customerVerificationTokens.token, token))
|
|
121
80
|
.limit(1);
|
|
122
81
|
if (!tokenRecord) {
|
|
123
82
|
return {
|
|
@@ -130,18 +89,18 @@ async function verifyEmail(token) {
|
|
|
130
89
|
// Clean up expired token
|
|
131
90
|
await db
|
|
132
91
|
.delete(schema.customerVerificationTokens)
|
|
133
|
-
.where(
|
|
92
|
+
.where(eq(schema.customerVerificationTokens.id, tokenRecord.id));
|
|
134
93
|
return {
|
|
135
94
|
success: false,
|
|
136
95
|
error: 'Verification link has expired. Please request a new one.',
|
|
137
96
|
};
|
|
138
97
|
}
|
|
139
98
|
// Mark customer email as verified
|
|
140
|
-
await
|
|
99
|
+
await markEmailVerified(tokenRecord.customerId);
|
|
141
100
|
// Delete the used token and any other tokens for this customer
|
|
142
101
|
await db
|
|
143
102
|
.delete(schema.customerVerificationTokens)
|
|
144
|
-
.where(
|
|
103
|
+
.where(eq(schema.customerVerificationTokens.customerId, tokenRecord.customerId));
|
|
145
104
|
// Send welcome email (non-blocking)
|
|
146
105
|
sendWelcomeEmailAsync(tokenRecord.customerId);
|
|
147
106
|
return {
|
|
@@ -159,12 +118,12 @@ async function verifyEmail(token) {
|
|
|
159
118
|
* await deleteVerificationTokens(customerId)
|
|
160
119
|
* ```
|
|
161
120
|
*/
|
|
162
|
-
async function deleteVerificationTokens(customerId) {
|
|
163
|
-
const db =
|
|
164
|
-
const tenantId =
|
|
121
|
+
export async function deleteVerificationTokens(customerId) {
|
|
122
|
+
const db = getDb();
|
|
123
|
+
const tenantId = getTenantId();
|
|
165
124
|
await db
|
|
166
125
|
.delete(schema.customerVerificationTokens)
|
|
167
|
-
.where(
|
|
126
|
+
.where(and(eq(schema.customerVerificationTokens.tenantId, tenantId), eq(schema.customerVerificationTokens.customerId, customerId)));
|
|
168
127
|
}
|
|
169
128
|
/**
|
|
170
129
|
* Resend verification email to a customer.
|
|
@@ -181,9 +140,9 @@ async function deleteVerificationTokens(customerId) {
|
|
|
181
140
|
* }
|
|
182
141
|
* ```
|
|
183
142
|
*/
|
|
184
|
-
async function resendVerificationEmail(email) {
|
|
143
|
+
export async function resendVerificationEmail(email) {
|
|
185
144
|
// Find customer by email
|
|
186
|
-
const customer = await
|
|
145
|
+
const customer = await findCustomerByEmail(email);
|
|
187
146
|
if (!customer) {
|
|
188
147
|
// Don't reveal if email exists - return success anyway
|
|
189
148
|
return { success: true };
|
|
@@ -198,9 +157,9 @@ async function resendVerificationEmail(email) {
|
|
|
198
157
|
// Create new verification token
|
|
199
158
|
const token = await createVerificationToken(customer.id);
|
|
200
159
|
// Send verification email
|
|
201
|
-
const storeName = await
|
|
160
|
+
const storeName = await getStoreName();
|
|
202
161
|
try {
|
|
203
|
-
await
|
|
162
|
+
await sendVerificationEmail(email, token, storeName);
|
|
204
163
|
return { success: true };
|
|
205
164
|
}
|
|
206
165
|
catch {
|
|
@@ -216,13 +175,13 @@ async function resendVerificationEmail(email) {
|
|
|
216
175
|
* @param customerId - Customer UUID
|
|
217
176
|
* @returns True if email is verified
|
|
218
177
|
*/
|
|
219
|
-
async function isEmailVerified(customerId) {
|
|
220
|
-
const db =
|
|
221
|
-
const tenantId =
|
|
178
|
+
export async function isEmailVerified(customerId) {
|
|
179
|
+
const db = getDb();
|
|
180
|
+
const tenantId = getTenantId();
|
|
222
181
|
const [customer] = await db
|
|
223
182
|
.select({ emailVerified: schema.customers.emailVerified })
|
|
224
183
|
.from(schema.customers)
|
|
225
|
-
.where(
|
|
184
|
+
.where(and(eq(schema.customers.tenantId, tenantId), eq(schema.customers.id, customerId)))
|
|
226
185
|
.limit(1);
|
|
227
186
|
return !!customer?.emailVerified;
|
|
228
187
|
}
|
|
@@ -232,11 +191,11 @@ async function isEmailVerified(customerId) {
|
|
|
232
191
|
*
|
|
233
192
|
* @returns Number of tokens deleted
|
|
234
193
|
*/
|
|
235
|
-
async function cleanupExpiredTokens() {
|
|
236
|
-
const db =
|
|
194
|
+
export async function cleanupExpiredTokens() {
|
|
195
|
+
const db = getDb();
|
|
237
196
|
const result = await db
|
|
238
197
|
.delete(schema.customerVerificationTokens)
|
|
239
|
-
.where(
|
|
198
|
+
.where(lt(schema.customerVerificationTokens.expires, new Date()))
|
|
240
199
|
.returning({ id: schema.customerVerificationTokens.id });
|
|
241
200
|
return result.length;
|
|
242
201
|
}
|
|
@@ -249,15 +208,15 @@ async function cleanupExpiredTokens() {
|
|
|
249
208
|
*/
|
|
250
209
|
async function sendWelcomeEmailAsync(customerId) {
|
|
251
210
|
try {
|
|
252
|
-
const db =
|
|
211
|
+
const db = getDb();
|
|
253
212
|
const [customer] = await db
|
|
254
213
|
.select({ email: schema.customers.email, name: schema.customers.name })
|
|
255
214
|
.from(schema.customers)
|
|
256
|
-
.where(
|
|
215
|
+
.where(eq(schema.customers.id, customerId))
|
|
257
216
|
.limit(1);
|
|
258
217
|
if (customer) {
|
|
259
|
-
const storeName = await
|
|
260
|
-
await
|
|
218
|
+
const storeName = await getStoreName();
|
|
219
|
+
await sendWelcomeEmail(customer.email, customer.name, storeName);
|
|
261
220
|
}
|
|
262
221
|
}
|
|
263
222
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-service.js","sourceRoot":"","sources":["../../../src/auth/server/verification-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verification-service.js","sourceRoot":"","sources":["../../../src/auth/server/verification-service.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/types.js
CHANGED
package/dist/auth/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
'use client';
|
|
3
|
-
|
|
4
|
-
exports.CartProvider = CartProvider;
|
|
5
|
-
exports.useCartHydrated = useCartHydrated;
|
|
6
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
2
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
7
3
|
/**
|
|
8
4
|
* @rovela/sdk/cart/CartProvider
|
|
9
5
|
*
|
|
10
6
|
* Optional provider for SSR-safe cart hydration.
|
|
11
7
|
* Ensures cart state is properly hydrated from localStorage after mount.
|
|
12
8
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
import { useEffect, useState } from 'react';
|
|
10
|
+
import { hydrateCart, isCartHydrated } from './store';
|
|
15
11
|
// =============================================================================
|
|
16
12
|
// Component
|
|
17
13
|
// =============================================================================
|
|
@@ -40,23 +36,23 @@ const store_1 = require("./store");
|
|
|
40
36
|
* }
|
|
41
37
|
* ```
|
|
42
38
|
*/
|
|
43
|
-
function CartProvider({ children, onHydrated }) {
|
|
44
|
-
const [hydrated, setHydrated] =
|
|
45
|
-
|
|
39
|
+
export function CartProvider({ children, onHydrated }) {
|
|
40
|
+
const [hydrated, setHydrated] = useState(false);
|
|
41
|
+
useEffect(() => {
|
|
46
42
|
// Check if already hydrated (e.g., from a previous mount)
|
|
47
|
-
if (
|
|
43
|
+
if (isCartHydrated()) {
|
|
48
44
|
setHydrated(true);
|
|
49
45
|
onHydrated?.();
|
|
50
46
|
return;
|
|
51
47
|
}
|
|
52
48
|
// Hydrate from localStorage
|
|
53
|
-
|
|
49
|
+
hydrateCart();
|
|
54
50
|
setHydrated(true);
|
|
55
51
|
onHydrated?.();
|
|
56
52
|
}, [onHydrated]);
|
|
57
53
|
// Render children immediately - cart hooks will return empty state
|
|
58
54
|
// until hydration completes, preventing SSR mismatch
|
|
59
|
-
return (
|
|
55
|
+
return _jsx(_Fragment, { children: children });
|
|
60
56
|
}
|
|
61
57
|
// =============================================================================
|
|
62
58
|
// Hook
|
|
@@ -81,12 +77,12 @@ function CartProvider({ children, onHydrated }) {
|
|
|
81
77
|
* }
|
|
82
78
|
* ```
|
|
83
79
|
*/
|
|
84
|
-
function useCartHydrated() {
|
|
85
|
-
const [hydrated, setHydrated] =
|
|
86
|
-
|
|
80
|
+
export function useCartHydrated() {
|
|
81
|
+
const [hydrated, setHydrated] = useState(false);
|
|
82
|
+
useEffect(() => {
|
|
87
83
|
// Check hydration status on mount
|
|
88
84
|
const checkHydration = () => {
|
|
89
|
-
if (
|
|
85
|
+
if (isCartHydrated()) {
|
|
90
86
|
setHydrated(true);
|
|
91
87
|
}
|
|
92
88
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CartProvider.js","sourceRoot":"","sources":["../../src/cart/CartProvider.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CartProvider.js","sourceRoot":"","sources":["../../src/cart/CartProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAiBrD,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAqB;IACtE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE/C,SAAS,CAAC,GAAG,EAAE;QACb,0DAA0D;QAC1D,IAAI,cAAc,EAAE,EAAE,CAAC;YACrB,WAAW,CAAC,IAAI,CAAC,CAAA;YACjB,UAAU,EAAE,EAAE,CAAA;YACd,OAAM;QACR,CAAC;QAED,4BAA4B;QAC5B,WAAW,EAAE,CAAA;QACb,WAAW,CAAC,IAAI,CAAC,CAAA;QACjB,UAAU,EAAE,EAAE,CAAA;IAChB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IAEhB,mEAAmE;IACnE,qDAAqD;IACrD,OAAO,4BAAG,QAAQ,GAAI,CAAA;AACxB,CAAC;AAED,gFAAgF;AAChF,OAAO;AACP,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE/C,SAAS,CAAC,GAAG,EAAE;QACb,kCAAkC;QAClC,MAAM,cAAc,GAAG,GAAG,EAAE;YAC1B,IAAI,cAAc,EAAE,EAAE,CAAC;gBACrB,WAAW,CAAC,IAAI,CAAC,CAAA;YACnB,CAAC;QACH,CAAC,CAAA;QAED,gBAAgB;QAChB,cAAc,EAAE,CAAA;QAEhB,+CAA+C;QAC/C,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;QAE/C,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;IACpC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
'use client';
|
|
3
|
-
|
|
4
|
-
exports.AddToCartButton = AddToCartButton;
|
|
5
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
6
3
|
/**
|
|
7
4
|
* @rovela/sdk/cart/components/AddToCartButton
|
|
8
5
|
*
|
|
9
6
|
* Button component for adding products to the cart with feedback.
|
|
10
7
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
import { useState, useCallback } from 'react';
|
|
9
|
+
import { cn } from '../../core/utils';
|
|
10
|
+
import { useCart } from '../store';
|
|
14
11
|
// =============================================================================
|
|
15
12
|
// Component
|
|
16
13
|
// =============================================================================
|
|
@@ -52,12 +49,12 @@ const store_1 = require("../store");
|
|
|
52
49
|
* }
|
|
53
50
|
* ```
|
|
54
51
|
*/
|
|
55
|
-
function AddToCartButton({ product, selectedVariant, quantity = 1, disabled = false, className, children, onSuccess, onError, showFeedback = true, feedbackDuration = 1500, openCartAfterAdd = false, size = 'md', variant: buttonVariant = 'primary', fullWidth = false, }) {
|
|
56
|
-
const [isAdding, setIsAdding] =
|
|
57
|
-
const [showSuccess, setShowSuccess] =
|
|
58
|
-
const addItem =
|
|
59
|
-
const openCart =
|
|
60
|
-
const handleClick =
|
|
52
|
+
export function AddToCartButton({ product, selectedVariant, quantity = 1, disabled = false, className, children, onSuccess, onError, showFeedback = true, feedbackDuration = 1500, openCartAfterAdd = false, size = 'md', variant: buttonVariant = 'primary', fullWidth = false, }) {
|
|
53
|
+
const [isAdding, setIsAdding] = useState(false);
|
|
54
|
+
const [showSuccess, setShowSuccess] = useState(false);
|
|
55
|
+
const addItem = useCart((state) => state.addItem);
|
|
56
|
+
const openCart = useCart((state) => state.openCart);
|
|
57
|
+
const handleClick = useCallback(async () => {
|
|
61
58
|
if (disabled || isAdding)
|
|
62
59
|
return;
|
|
63
60
|
setIsAdding(true);
|
|
@@ -104,21 +101,21 @@ function AddToCartButton({ product, selectedVariant, quantity = 1, disabled = fa
|
|
|
104
101
|
lg: 'px-6 py-3 text-base',
|
|
105
102
|
};
|
|
106
103
|
const variantClasses = {
|
|
107
|
-
primary:
|
|
108
|
-
secondary:
|
|
109
|
-
outline:
|
|
104
|
+
primary: cn('bg-primary text-primary-foreground', 'hover:bg-primary/90', 'disabled:bg-muted disabled:text-muted-foreground'),
|
|
105
|
+
secondary: cn('bg-secondary text-secondary-foreground', 'hover:bg-secondary/80', 'disabled:bg-muted disabled:text-muted-foreground'),
|
|
106
|
+
outline: cn('border border-primary text-primary bg-transparent', 'hover:bg-primary hover:text-primary-foreground', 'disabled:border-muted disabled:text-muted-foreground'),
|
|
110
107
|
};
|
|
111
108
|
// Determine button content
|
|
112
109
|
let buttonContent;
|
|
113
110
|
if (showSuccess) {
|
|
114
|
-
buttonContent = ((
|
|
111
|
+
buttonContent = (_jsxs("span", { className: "flex items-center gap-2", children: [_jsx("svg", { className: "h-4 w-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }), "Added!"] }));
|
|
115
112
|
}
|
|
116
113
|
else if (isAdding) {
|
|
117
|
-
buttonContent = ((
|
|
114
|
+
buttonContent = (_jsxs("span", { className: "flex items-center gap-2", children: [_jsxs("svg", { className: "h-4 w-4 animate-spin", fill: "none", viewBox: "0 0 24 24", children: [_jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), _jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })] }), "Adding..."] }));
|
|
118
115
|
}
|
|
119
116
|
else {
|
|
120
117
|
buttonContent = children || 'Add to Cart';
|
|
121
118
|
}
|
|
122
|
-
return ((
|
|
119
|
+
return (_jsx("button", { type: "button", onClick: handleClick, disabled: disabled || isAdding, className: cn('inline-flex items-center justify-center rounded-md font-medium', 'transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-primary', 'disabled:cursor-not-allowed', sizeClasses[size], variantClasses[buttonVariant], fullWidth && 'w-full', className), "aria-label": `Add ${product.name} to cart`, children: buttonContent }));
|
|
123
120
|
}
|
|
124
121
|
//# sourceMappingURL=AddToCartButton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddToCartButton.js","sourceRoot":"","sources":["../../../src/cart/components/AddToCartButton.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AddToCartButton.js","sourceRoot":"","sources":["../../../src/cart/components/AddToCartButton.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAkB,MAAM,OAAO,CAAA;AAC7D,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAErC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAqClC,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,OAAO,EACP,eAAe,EACf,QAAQ,GAAG,CAAC,EACZ,QAAQ,GAAG,KAAK,EAChB,SAAS,EACT,QAAQ,EACR,SAAS,EACT,OAAO,EACP,YAAY,GAAG,IAAI,EACnB,gBAAgB,GAAG,IAAI,EACvB,gBAAgB,GAAG,KAAK,EACxB,IAAI,GAAG,IAAI,EACX,OAAO,EAAE,aAAa,GAAG,SAAS,EAClC,SAAS,GAAG,KAAK,GACI;IACrB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAErD,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAEnD,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,IAAI,QAAQ,IAAI,QAAQ;YAAE,OAAM;QAEhC,WAAW,CAAC,IAAI,CAAC,CAAA;QAEjB,IAAI,CAAC;YACH,mBAAmB;YACnB,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAA;YAE3C,wBAAwB;YACxB,IAAI,YAAY,EAAE,CAAC;gBACjB,cAAc,CAAC,IAAI,CAAC,CAAA;gBACpB,UAAU,CAAC,GAAG,EAAE;oBACd,cAAc,CAAC,KAAK,CAAC,CAAA;gBACvB,CAAC,EAAE,gBAAgB,CAAC,CAAA;YACtB,CAAC;YAED,yBAAyB;YACzB,IAAI,gBAAgB,EAAE,CAAC;gBACrB,QAAQ,EAAE,CAAA;YACZ,CAAC;YAED,wBAAwB;YACxB,SAAS,EAAE,EAAE,CAAA;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAA;QAChF,CAAC;gBAAS,CAAC;YACT,WAAW,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;IACH,CAAC,EAAE;QACD,QAAQ;QACR,QAAQ;QACR,OAAO;QACP,eAAe;QACf,QAAQ;QACR,OAAO;QACP,YAAY;QACZ,gBAAgB;QAChB,gBAAgB;QAChB,QAAQ;QACR,SAAS;QACT,OAAO;KACR,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG;QAClB,EAAE,EAAE,qBAAqB;QACzB,EAAE,EAAE,mBAAmB;QACvB,EAAE,EAAE,qBAAqB;KAC1B,CAAA;IAED,MAAM,cAAc,GAAG;QACrB,OAAO,EAAE,EAAE,CACT,oCAAoC,EACpC,qBAAqB,EACrB,kDAAkD,CACnD;QACD,SAAS,EAAE,EAAE,CACX,wCAAwC,EACxC,uBAAuB,EACvB,kDAAkD,CACnD;QACD,OAAO,EAAE,EAAE,CACT,mDAAmD,EACnD,gDAAgD,EAChD,sDAAsD,CACvD;KACF,CAAA;IAED,2BAA2B;IAC3B,IAAI,aAAwB,CAAA;IAC5B,IAAI,WAAW,EAAE,CAAC;QAChB,aAAa,GAAG,CACd,gBAAM,SAAS,EAAC,yBAAyB,aACvC,cACE,SAAS,EAAC,SAAS,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,OAAO,EAAC,WAAW,YAEnB,eACE,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,WAAW,EAAE,CAAC,EACd,CAAC,EAAC,gBAAgB,GAClB,GACE,cAED,CACR,CAAA;IACH,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACpB,aAAa,GAAG,CACd,gBAAM,SAAS,EAAC,yBAAyB,aACvC,eACE,SAAS,EAAC,sBAAsB,EAChC,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,WAAW,aAEnB,iBACE,SAAS,EAAC,YAAY,EACtB,EAAE,EAAC,IAAI,EACP,EAAE,EAAC,IAAI,EACP,CAAC,EAAC,IAAI,EACN,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,GACf,EACF,eACE,SAAS,EAAC,YAAY,EACtB,IAAI,EAAC,cAAc,EACnB,CAAC,EAAC,iHAAiH,GACnH,IACE,iBAED,CACR,CAAA;IACH,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,QAAQ,IAAI,aAAa,CAAA;IAC3C,CAAC;IAED,OAAO,CACL,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAC9B,SAAS,EAAE,EAAE,CACX,gEAAgE,EAChE,sFAAsF,EACtF,6BAA6B,EAC7B,WAAW,CAAC,IAAI,CAAC,EACjB,cAAc,CAAC,aAAa,CAAC,EAC7B,SAAS,IAAI,QAAQ,EACrB,SAAS,CACV,gBACW,OAAO,OAAO,CAAC,IAAI,UAAU,YAExC,aAAa,GACP,CACV,CAAA;AACH,CAAC"}
|
|
@@ -1,22 +1,16 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
'use client';
|
|
3
|
-
|
|
4
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
-
};
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.CartDrawer = CartDrawer;
|
|
8
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
9
3
|
/**
|
|
10
4
|
* @rovela/sdk/cart/components/CartDrawer
|
|
11
5
|
*
|
|
12
6
|
* Slide-out cart drawer component.
|
|
13
7
|
*/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
8
|
+
import { useEffect, useCallback } from 'react';
|
|
9
|
+
import Link from 'next/link';
|
|
10
|
+
import { cn } from '../../core/utils';
|
|
11
|
+
import { useCart } from '../store';
|
|
12
|
+
import { CartItem } from './CartItem';
|
|
13
|
+
import { CartSummary } from './CartSummary';
|
|
20
14
|
// =============================================================================
|
|
21
15
|
// Component
|
|
22
16
|
// =============================================================================
|
|
@@ -55,15 +49,15 @@ const CartSummary_1 = require("./CartSummary");
|
|
|
55
49
|
* }
|
|
56
50
|
* ```
|
|
57
51
|
*/
|
|
58
|
-
function CartDrawer({ open: controlledOpen, onOpenChange, position = 'right', className, overlayClassName, showContinueShopping = true, checkoutHref = '/checkout', emptyState, header, footer, currency = 'USD', locale = 'en-US', title = 'Shopping Cart', }) {
|
|
52
|
+
export function CartDrawer({ open: controlledOpen, onOpenChange, position = 'right', className, overlayClassName, showContinueShopping = true, checkoutHref = '/checkout', emptyState, header, footer, currency = 'USD', locale = 'en-US', title = 'Shopping Cart', }) {
|
|
59
53
|
// Use controlled state if provided, otherwise use store state
|
|
60
|
-
const storeIsOpen =
|
|
61
|
-
const closeCart =
|
|
62
|
-
const items =
|
|
63
|
-
const updateQuantity =
|
|
64
|
-
const removeItem =
|
|
54
|
+
const storeIsOpen = useCart((state) => state.isOpen);
|
|
55
|
+
const closeCart = useCart((state) => state.closeCart);
|
|
56
|
+
const items = useCart((state) => state.items);
|
|
57
|
+
const updateQuantity = useCart((state) => state.updateQuantity);
|
|
58
|
+
const removeItem = useCart((state) => state.removeItem);
|
|
65
59
|
const isOpen = controlledOpen !== undefined ? controlledOpen : storeIsOpen;
|
|
66
|
-
const handleClose =
|
|
60
|
+
const handleClose = useCallback(() => {
|
|
67
61
|
if (onOpenChange) {
|
|
68
62
|
onOpenChange(false);
|
|
69
63
|
}
|
|
@@ -72,7 +66,7 @@ function CartDrawer({ open: controlledOpen, onOpenChange, position = 'right', cl
|
|
|
72
66
|
}
|
|
73
67
|
}, [onOpenChange, closeCart]);
|
|
74
68
|
// Handle escape key
|
|
75
|
-
|
|
69
|
+
useEffect(() => {
|
|
76
70
|
const handleKeyDown = (e) => {
|
|
77
71
|
if (e.key === 'Escape' && isOpen) {
|
|
78
72
|
handleClose();
|
|
@@ -82,7 +76,7 @@ function CartDrawer({ open: controlledOpen, onOpenChange, position = 'right', cl
|
|
|
82
76
|
return () => document.removeEventListener('keydown', handleKeyDown);
|
|
83
77
|
}, [isOpen, handleClose]);
|
|
84
78
|
// Prevent body scroll when drawer is open
|
|
85
|
-
|
|
79
|
+
useEffect(() => {
|
|
86
80
|
if (isOpen) {
|
|
87
81
|
const originalOverflow = document.body.style.overflow;
|
|
88
82
|
document.body.style.overflow = 'hidden';
|
|
@@ -103,6 +97,6 @@ function CartDrawer({ open: controlledOpen, onOpenChange, position = 'right', cl
|
|
|
103
97
|
translate: isOpen ? 'translate-x-0' : 'translate-x-full',
|
|
104
98
|
},
|
|
105
99
|
};
|
|
106
|
-
return ((
|
|
100
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { className: cn('fixed inset-0 z-40 bg-black/50 transition-opacity duration-300', isOpen ? 'opacity-100' : 'opacity-0 pointer-events-none', overlayClassName), onClick: handleClose, "aria-hidden": "true" }), _jsx("div", { className: cn('fixed top-0 z-50 h-full w-full max-w-md', 'bg-background shadow-xl', 'transition-transform duration-300 ease-in-out', positionClasses[position].drawer, positionClasses[position].translate, className), role: "dialog", "aria-modal": "true", "aria-label": title, children: _jsxs("div", { className: "flex h-full flex-col", children: [header || (_jsxs("div", { className: "flex items-center justify-between border-b border-border px-4 py-4", children: [_jsxs("h2", { className: "text-lg font-semibold text-foreground", children: [title, itemCount > 0 && (_jsxs("span", { className: "ml-2 text-sm font-normal text-muted-foreground", children: ["(", itemCount, " ", itemCount === 1 ? 'item' : 'items', ")"] }))] }), _jsx("button", { type: "button", onClick: handleClose, className: "rounded-md p-2 text-muted-foreground hover:text-foreground hover:bg-muted transition-colors", "aria-label": "Close cart", children: _jsx("svg", { className: "h-5 w-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) })] })), _jsx("div", { className: "flex-1 overflow-y-auto px-4", children: isEmpty ? (emptyState || (_jsxs("div", { className: "flex h-full flex-col items-center justify-center text-center py-12", children: [_jsx("svg", { className: "h-16 w-16 text-muted-foreground mb-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1, d: "M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z" }) }), _jsx("h3", { className: "text-lg font-medium text-foreground", children: "Your cart is empty" }), _jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: "Add some items to get started!" }), showContinueShopping && (_jsx("button", { type: "button", onClick: handleClose, className: "mt-6 text-sm font-medium text-primary hover:text-primary/80 transition-colors", children: "Continue Shopping" }))] }))) : (_jsx("div", { className: "divide-y divide-border", children: items.map((item) => (_jsx(CartItem, { item: item, onUpdateQuantity: (qty) => updateQuantity(item.id, qty), onRemove: () => removeItem(item.id), currency: currency, locale: locale }, item.id))) })) }), !isEmpty && (footer || (_jsxs("div", { className: "border-t border-border px-4 py-4 space-y-4", children: [_jsx(CartSummary, { showShipping: true, showTotal: true, currency: currency, locale: locale }), _jsxs("div", { className: "space-y-2", children: [_jsx(Link, { href: checkoutHref, onClick: handleClose, className: cn('flex w-full items-center justify-center rounded-md', 'bg-primary px-4 py-3 text-sm font-medium text-primary-foreground', 'hover:bg-primary/90 transition-colors', 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary'), children: "Checkout" }), showContinueShopping && (_jsx("button", { type: "button", onClick: handleClose, className: cn('flex w-full items-center justify-center rounded-md', 'border border-border px-4 py-3 text-sm font-medium text-foreground', 'hover:bg-muted transition-colors', 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary'), children: "Continue Shopping" }))] })] })))] }) })] }));
|
|
107
101
|
}
|
|
108
102
|
//# sourceMappingURL=CartDrawer.js.map
|