@rovela-ai/sdk 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/admin/api/accept-invite.d.ts +65 -0
  2. package/dist/admin/api/accept-invite.d.ts.map +1 -0
  3. package/dist/admin/api/accept-invite.js +115 -0
  4. package/dist/admin/api/accept-invite.js.map +1 -0
  5. package/dist/admin/api/categories.d.ts.map +1 -1
  6. package/dist/admin/api/categories.js +21 -28
  7. package/dist/admin/api/categories.js.map +1 -1
  8. package/dist/admin/api/customers.d.ts.map +1 -1
  9. package/dist/admin/api/customers.js +17 -25
  10. package/dist/admin/api/customers.js.map +1 -1
  11. package/dist/admin/api/forgot-password.d.ts +39 -0
  12. package/dist/admin/api/forgot-password.d.ts.map +1 -0
  13. package/dist/admin/api/forgot-password.js +66 -0
  14. package/dist/admin/api/forgot-password.js.map +1 -0
  15. package/dist/admin/api/index.d.ts +6 -0
  16. package/dist/admin/api/index.d.ts.map +1 -1
  17. package/dist/admin/api/index.js +9 -0
  18. package/dist/admin/api/index.js.map +1 -1
  19. package/dist/admin/api/me.d.ts +72 -0
  20. package/dist/admin/api/me.d.ts.map +1 -0
  21. package/dist/admin/api/me.js +177 -0
  22. package/dist/admin/api/me.js.map +1 -0
  23. package/dist/admin/api/orders.d.ts.map +1 -1
  24. package/dist/admin/api/orders.js +21 -28
  25. package/dist/admin/api/orders.js.map +1 -1
  26. package/dist/admin/api/products.d.ts.map +1 -1
  27. package/dist/admin/api/products.js +33 -37
  28. package/dist/admin/api/products.js.map +1 -1
  29. package/dist/admin/api/refund.d.ts.map +1 -1
  30. package/dist/admin/api/refund.js +5 -7
  31. package/dist/admin/api/refund.js.map +1 -1
  32. package/dist/admin/api/reset-password.d.ts +49 -0
  33. package/dist/admin/api/reset-password.d.ts.map +1 -0
  34. package/dist/admin/api/reset-password.js +99 -0
  35. package/dist/admin/api/reset-password.js.map +1 -0
  36. package/dist/admin/api/return.d.ts.map +1 -1
  37. package/dist/admin/api/return.js +9 -12
  38. package/dist/admin/api/return.js.map +1 -1
  39. package/dist/admin/api/settings.d.ts.map +1 -1
  40. package/dist/admin/api/settings.js +9 -12
  41. package/dist/admin/api/settings.js.map +1 -1
  42. package/dist/admin/api/shipping.d.ts.map +1 -1
  43. package/dist/admin/api/shipping.js +65 -61
  44. package/dist/admin/api/shipping.js.map +1 -1
  45. package/dist/admin/api/stats.d.ts.map +1 -1
  46. package/dist/admin/api/stats.js +5 -7
  47. package/dist/admin/api/stats.js.map +1 -1
  48. package/dist/admin/api/stripe-status.d.ts.map +1 -1
  49. package/dist/admin/api/stripe-status.js +5 -7
  50. package/dist/admin/api/stripe-status.js.map +1 -1
  51. package/dist/admin/api/tax-zones.d.ts.map +1 -1
  52. package/dist/admin/api/tax-zones.js +21 -28
  53. package/dist/admin/api/tax-zones.js.map +1 -1
  54. package/dist/admin/api/users.d.ts +142 -0
  55. package/dist/admin/api/users.d.ts.map +1 -0
  56. package/dist/admin/api/users.js +356 -0
  57. package/dist/admin/api/users.js.map +1 -0
  58. package/dist/admin/components/AdminAcceptInviteForm.d.ts +3 -0
  59. package/dist/admin/components/AdminAcceptInviteForm.d.ts.map +1 -0
  60. package/dist/admin/components/AdminAcceptInviteForm.js +137 -0
  61. package/dist/admin/components/AdminAcceptInviteForm.js.map +1 -0
  62. package/dist/admin/components/AdminAccountPage.d.ts +10 -0
  63. package/dist/admin/components/AdminAccountPage.d.ts.map +1 -0
  64. package/dist/admin/components/AdminAccountPage.js +123 -0
  65. package/dist/admin/components/AdminAccountPage.js.map +1 -0
  66. package/dist/admin/components/AdminForgotPasswordForm.d.ts +8 -0
  67. package/dist/admin/components/AdminForgotPasswordForm.d.ts.map +1 -0
  68. package/dist/admin/components/AdminForgotPasswordForm.js +59 -0
  69. package/dist/admin/components/AdminForgotPasswordForm.js.map +1 -0
  70. package/dist/admin/components/AdminNav.d.ts.map +1 -1
  71. package/dist/admin/components/AdminNav.js +32 -4
  72. package/dist/admin/components/AdminNav.js.map +1 -1
  73. package/dist/admin/components/AdminResetPasswordForm.d.ts +12 -0
  74. package/dist/admin/components/AdminResetPasswordForm.d.ts.map +1 -0
  75. package/dist/admin/components/AdminResetPasswordForm.js +134 -0
  76. package/dist/admin/components/AdminResetPasswordForm.js.map +1 -0
  77. package/dist/admin/components/AdminUserMenu.d.ts.map +1 -1
  78. package/dist/admin/components/AdminUserMenu.js +2 -2
  79. package/dist/admin/components/AdminUserMenu.js.map +1 -1
  80. package/dist/admin/components/InviteUserDialog.d.ts +3 -0
  81. package/dist/admin/components/InviteUserDialog.d.ts.map +1 -0
  82. package/dist/admin/components/InviteUserDialog.js +127 -0
  83. package/dist/admin/components/InviteUserDialog.js.map +1 -0
  84. package/dist/admin/components/UsersTable.d.ts +3 -0
  85. package/dist/admin/components/UsersTable.d.ts.map +1 -0
  86. package/dist/admin/components/UsersTable.js +399 -0
  87. package/dist/admin/components/UsersTable.js.map +1 -0
  88. package/dist/admin/components/index.d.ts +9 -0
  89. package/dist/admin/components/index.d.ts.map +1 -1
  90. package/dist/admin/components/index.js +9 -0
  91. package/dist/admin/components/index.js.map +1 -1
  92. package/dist/admin/config.d.ts.map +1 -1
  93. package/dist/admin/config.js +23 -1
  94. package/dist/admin/config.js.map +1 -1
  95. package/dist/admin/hooks/index.d.ts +4 -0
  96. package/dist/admin/hooks/index.d.ts.map +1 -1
  97. package/dist/admin/hooks/index.js +3 -0
  98. package/dist/admin/hooks/index.js.map +1 -1
  99. package/dist/admin/hooks/useAdminMe.d.ts +31 -0
  100. package/dist/admin/hooks/useAdminMe.d.ts.map +1 -0
  101. package/dist/admin/hooks/useAdminMe.js +103 -0
  102. package/dist/admin/hooks/useAdminMe.js.map +1 -0
  103. package/dist/admin/hooks/useAdminPermissions.d.ts +3 -0
  104. package/dist/admin/hooks/useAdminPermissions.d.ts.map +1 -0
  105. package/dist/admin/hooks/useAdminPermissions.js +51 -0
  106. package/dist/admin/hooks/useAdminPermissions.js.map +1 -0
  107. package/dist/admin/hooks/useAdminUsers.d.ts +3 -0
  108. package/dist/admin/hooks/useAdminUsers.d.ts.map +1 -0
  109. package/dist/admin/hooks/useAdminUsers.js +240 -0
  110. package/dist/admin/hooks/useAdminUsers.js.map +1 -0
  111. package/dist/admin/index.d.ts +4 -4
  112. package/dist/admin/index.d.ts.map +1 -1
  113. package/dist/admin/index.js +20 -2
  114. package/dist/admin/index.js.map +1 -1
  115. package/dist/admin/permissions.d.ts +92 -0
  116. package/dist/admin/permissions.d.ts.map +1 -0
  117. package/dist/admin/permissions.js +201 -0
  118. package/dist/admin/permissions.js.map +1 -0
  119. package/dist/admin/server/admin-invite.d.ts +122 -0
  120. package/dist/admin/server/admin-invite.d.ts.map +1 -0
  121. package/dist/admin/server/admin-invite.js +235 -0
  122. package/dist/admin/server/admin-invite.js.map +1 -0
  123. package/dist/admin/server/admin-password-reset.d.ts +87 -0
  124. package/dist/admin/server/admin-password-reset.d.ts.map +1 -0
  125. package/dist/admin/server/admin-password-reset.js +220 -0
  126. package/dist/admin/server/admin-password-reset.js.map +1 -0
  127. package/dist/admin/server/admin-self-service.d.ts +86 -0
  128. package/dist/admin/server/admin-self-service.d.ts.map +1 -0
  129. package/dist/admin/server/admin-self-service.js +188 -0
  130. package/dist/admin/server/admin-self-service.js.map +1 -0
  131. package/dist/admin/server/admin-service.d.ts.map +1 -1
  132. package/dist/admin/server/admin-service.js +21 -2
  133. package/dist/admin/server/admin-service.js.map +1 -1
  134. package/dist/admin/server/admin-session.d.ts +126 -0
  135. package/dist/admin/server/admin-session.d.ts.map +1 -0
  136. package/dist/admin/server/admin-session.js +215 -0
  137. package/dist/admin/server/admin-session.js.map +1 -0
  138. package/dist/admin/server/index.d.ts +7 -0
  139. package/dist/admin/server/index.d.ts.map +1 -1
  140. package/dist/admin/server/index.js +20 -0
  141. package/dist/admin/server/index.js.map +1 -1
  142. package/dist/admin/server/user-management.d.ts +223 -0
  143. package/dist/admin/server/user-management.d.ts.map +1 -0
  144. package/dist/admin/server/user-management.js +846 -0
  145. package/dist/admin/server/user-management.js.map +1 -0
  146. package/dist/admin/types.d.ts +153 -2
  147. package/dist/admin/types.d.ts.map +1 -1
  148. package/dist/core/db/queries.d.ts +19 -13
  149. package/dist/core/db/queries.d.ts.map +1 -1
  150. package/dist/core/db/schema.d.ts +327 -9
  151. package/dist/core/db/schema.d.ts.map +1 -1
  152. package/dist/core/db/schema.js +80 -3
  153. package/dist/core/db/schema.js.map +1 -1
  154. package/dist/core/types.d.ts +19 -3
  155. package/dist/core/types.d.ts.map +1 -1
  156. package/dist/emails/index.d.ts +2 -2
  157. package/dist/emails/index.d.ts.map +1 -1
  158. package/dist/emails/index.js +3 -1
  159. package/dist/emails/index.js.map +1 -1
  160. package/dist/emails/send/admin-auth.d.ts +94 -0
  161. package/dist/emails/send/admin-auth.d.ts.map +1 -0
  162. package/dist/emails/send/admin-auth.js +118 -0
  163. package/dist/emails/send/admin-auth.js.map +1 -0
  164. package/dist/emails/send/index.d.ts +2 -0
  165. package/dist/emails/send/index.d.ts.map +1 -1
  166. package/dist/emails/send/index.js +4 -0
  167. package/dist/emails/send/index.js.map +1 -1
  168. package/dist/emails/templates/admin-invite.d.ts +40 -0
  169. package/dist/emails/templates/admin-invite.d.ts.map +1 -0
  170. package/dist/emails/templates/admin-invite.js +62 -0
  171. package/dist/emails/templates/admin-invite.js.map +1 -0
  172. package/dist/emails/templates/index.d.ts +1 -0
  173. package/dist/emails/templates/index.d.ts.map +1 -1
  174. package/dist/emails/templates/index.js +4 -0
  175. package/dist/emails/templates/index.js.map +1 -1
  176. package/dist/emails/types.d.ts +22 -1
  177. package/dist/emails/types.d.ts.map +1 -1
  178. package/package.json +21 -1
@@ -0,0 +1,137 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * @rovela/sdk/admin/components/AdminAcceptInviteForm
5
+ *
6
+ * Public page component for accepting an admin invite. Lives outside the
7
+ * dashboard layout — the invitee hasn't logged in yet.
8
+ *
9
+ * Lifecycle mirrors `AdminResetPasswordForm` (Phase 1) exactly:
10
+ * 1. Read `?token=X` from the URL via `useSearchParams`.
11
+ * 2. Mount effect calls `GET /api/admin/accept-invite?token=X` to check
12
+ * validity AND fetch the invitee snippet (email, name, role).
13
+ * 3. Render one of four states:
14
+ * - `validating` — spinner while GET is in flight
15
+ * - `invalid` — "this invite link is invalid/expired" + CTA to
16
+ * contact the store admin
17
+ * - `form` — password + confirm fields with personalized
18
+ * greeting showing the role
19
+ * - `success` — "Welcome!" + 2-second delay → /admin/login
20
+ *
21
+ * Because this uses `useSearchParams`, the consuming page MUST wrap this
22
+ * component in a `<Suspense>` boundary (Next.js App Router requirement).
23
+ */
24
+ import { useState, useEffect, useCallback } from 'react';
25
+ import { useSearchParams } from 'next/navigation';
26
+ import { UserPlus, CheckCircle2, AlertCircle } from 'lucide-react';
27
+ import { roleLabel } from '../permissions';
28
+ // =============================================================================
29
+ // Component
30
+ // =============================================================================
31
+ export function AdminAcceptInviteForm({ className = '', loginUrl = '/admin/login', redirectDelayMs = 2000, }) {
32
+ const searchParams = useSearchParams();
33
+ const token = searchParams?.get('token') ?? '';
34
+ const [validation, setValidation] = useState({
35
+ status: 'validating',
36
+ });
37
+ const [password, setPassword] = useState('');
38
+ const [confirmPassword, setConfirmPassword] = useState('');
39
+ const [formError, setFormError] = useState(null);
40
+ const [isSubmitting, setIsSubmitting] = useState(false);
41
+ const [success, setSuccess] = useState(false);
42
+ // --- Validate token on mount --------------------------------------------
43
+ useEffect(() => {
44
+ if (!token) {
45
+ setValidation({
46
+ status: 'invalid',
47
+ error: 'This invite link is missing a token. Please request a new invite.',
48
+ });
49
+ return;
50
+ }
51
+ let cancelled = false;
52
+ (async () => {
53
+ try {
54
+ const res = await fetch(`/api/admin/accept-invite?token=${encodeURIComponent(token)}`);
55
+ const data = (await res.json().catch(() => ({})));
56
+ if (cancelled)
57
+ return;
58
+ if (res.ok && data.valid && data.admin) {
59
+ setValidation({ status: 'valid', admin: data.admin });
60
+ }
61
+ else {
62
+ setValidation({
63
+ status: 'invalid',
64
+ error: data.error ||
65
+ 'This invite link is invalid or has expired. Please request a new one.',
66
+ });
67
+ }
68
+ }
69
+ catch {
70
+ if (cancelled)
71
+ return;
72
+ setValidation({
73
+ status: 'invalid',
74
+ error: 'Could not validate the invite link. Please try again.',
75
+ });
76
+ }
77
+ })();
78
+ return () => {
79
+ cancelled = true;
80
+ };
81
+ }, [token]);
82
+ // --- Handle form submission ---------------------------------------------
83
+ const handleSubmit = useCallback(async (e) => {
84
+ e.preventDefault();
85
+ setFormError(null);
86
+ if (password.length < 8) {
87
+ setFormError('Password must be at least 8 characters.');
88
+ return;
89
+ }
90
+ if (password !== confirmPassword) {
91
+ setFormError('Passwords do not match.');
92
+ return;
93
+ }
94
+ setIsSubmitting(true);
95
+ try {
96
+ const res = await fetch('/api/admin/accept-invite', {
97
+ method: 'POST',
98
+ headers: { 'Content-Type': 'application/json' },
99
+ body: JSON.stringify({ token, password }),
100
+ });
101
+ const data = (await res.json().catch(() => ({})));
102
+ if (!res.ok || !data.success) {
103
+ setFormError(data.error || 'Failed to accept invite. Please try again.');
104
+ return;
105
+ }
106
+ setSuccess(true);
107
+ // Redirect to login after a short delay so the user can read the
108
+ // confirmation message.
109
+ setTimeout(() => {
110
+ window.location.href = loginUrl;
111
+ }, redirectDelayMs);
112
+ }
113
+ catch {
114
+ setFormError('Something went wrong. Please try again.');
115
+ }
116
+ finally {
117
+ setIsSubmitting(false);
118
+ }
119
+ }, [token, password, confirmPassword, loginUrl, redirectDelayMs]);
120
+ // --- Render states ------------------------------------------------------
121
+ // Loading state — waiting on GET validation
122
+ if (validation.status === 'validating') {
123
+ return (_jsx("div", { className: `w-full max-w-sm admin-animate-in ${className}`, children: _jsx("div", { className: "flex items-center justify-center py-8", children: _jsx("span", { className: "admin-spinner admin-spinner-lg" }) }) }));
124
+ }
125
+ // Invalid invite — no recovery path here (invitee must contact admin)
126
+ if (validation.status === 'invalid') {
127
+ return (_jsxs("div", { className: `w-full max-w-sm admin-animate-in ${className}`, children: [_jsxs("div", { className: "mb-6 text-center", children: [_jsx("div", { className: "admin-icon-container-sm mx-auto mb-4", children: _jsx(AlertCircle, { className: "h-6 w-6 admin-icon-primary" }) }), _jsx("h1", { className: "admin-heading-2", children: "Invalid invite link" }), _jsx("p", { className: "mt-2 text-sm admin-text-muted", children: validation.error })] }), _jsx("p", { className: "text-sm admin-text-muted text-center", children: "Please contact the admin who invited you and ask them to send a new invite." }), _jsx("div", { className: "mt-6 text-center", children: _jsx("a", { href: loginUrl, className: "text-sm admin-text-muted hover:underline", children: "Already have an account? Sign in \u2192" }) })] }));
128
+ }
129
+ // Success — invite accepted, redirecting to login
130
+ if (success) {
131
+ return (_jsx("div", { className: `w-full max-w-sm admin-animate-in ${className}`, children: _jsxs("div", { className: "mb-6 text-center", children: [_jsx("div", { className: "admin-icon-container-sm mx-auto mb-4", children: _jsx(CheckCircle2, { className: "h-6 w-6 admin-icon-primary" }) }), _jsx("h1", { className: "admin-heading-2", children: "Welcome aboard" }), _jsx("p", { className: "mt-2 text-sm admin-text-muted", children: "Your account is ready. Redirecting to sign in..." })] }) }));
132
+ }
133
+ // Form — token validated, let the invitee set their password
134
+ const { admin } = validation;
135
+ return (_jsxs("div", { className: `w-full max-w-sm admin-animate-in ${className}`, children: [_jsxs("div", { className: "mb-8 text-center", children: [_jsx("div", { className: "admin-icon-container-sm mx-auto mb-4", children: _jsx(UserPlus, { className: "h-6 w-6 admin-icon-primary" }) }), _jsx("h1", { className: "admin-heading-2", children: "You're invited" }), _jsxs("p", { className: "mt-2 text-sm admin-text-muted", children: ["Hi ", _jsx("strong", { children: admin.name }), ", you've been invited as", ' ', _jsx("strong", { children: roleLabel(admin.role) }), ". Choose a strong password to activate your account."] })] }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [formError && (_jsx("div", { className: "admin-alert admin-alert-error", children: _jsx("div", { className: "admin-alert-description", children: formError }) })), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Email" }), _jsx("input", { type: "email", value: admin.email, readOnly: true, disabled: true, className: "admin-input w-full", style: { opacity: 0.7 } })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "accept-password", className: "admin-label", children: "Set a password" }), _jsx("input", { id: "accept-password", type: "password", value: password, onChange: (e) => setPassword(e.target.value), required: true, minLength: 8, autoComplete: "new-password", disabled: isSubmitting, className: "admin-input w-full", placeholder: "At least 8 characters" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "accept-confirm", className: "admin-label", children: "Confirm password" }), _jsx("input", { id: "accept-confirm", type: "password", value: confirmPassword, onChange: (e) => setConfirmPassword(e.target.value), required: true, minLength: 8, autoComplete: "new-password", disabled: isSubmitting, className: "admin-input w-full", placeholder: "Re-enter your password" })] }), _jsx("button", { type: "submit", disabled: isSubmitting || !password || !confirmPassword, className: "admin-btn admin-btn-primary w-full", children: isSubmitting ? (_jsxs("span", { className: "flex items-center justify-center gap-2", children: [_jsx("span", { className: "admin-spinner admin-spinner-sm" }), "Accepting..."] })) : ('Accept invite and sign in') })] })] }));
136
+ }
137
+ //# sourceMappingURL=AdminAcceptInviteForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminAcceptInviteForm.js","sourceRoot":"","sources":["../../../src/admin/components/AdminAcceptInviteForm.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface AdminAccountPageProps {
2
+ /** Optional className for the root element. */
3
+ className?: string;
4
+ /** URL to redirect to after password change (default: /admin/login). */
5
+ loginUrl?: string;
6
+ /** Delay in ms before redirecting after password change (default: 2500). */
7
+ redirectDelayMs?: number;
8
+ }
9
+ export declare function AdminAccountPage({ className, loginUrl, redirectDelayMs, }: AdminAccountPageProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=AdminAccountPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminAccountPage.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminAccountPage.tsx"],"names":[],"mappings":"AA2BA,MAAM,WAAW,qBAAqB;IACpC,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,4EAA4E;IAC5E,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAMD,wBAAgB,gBAAgB,CAAC,EAC/B,SAAc,EACd,QAAyB,EACzB,eAAsB,GACvB,EAAE,qBAAqB,2CA4YvB"}
@@ -0,0 +1,123 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * @rovela/sdk/admin/components/AdminAccountPage
5
+ *
6
+ * Self-service account page for logged-in admins. Two cards:
7
+ *
8
+ * 1. **Profile** — edit name + email. Email change warns the user that
9
+ * forgot-password flows will use the new email.
10
+ *
11
+ * 2. **Password** — change password. Requires current password. On
12
+ * success, the admin's own session is invalidated (sessionVersion
13
+ * bumped) and they'll be signed out on their next request. We surface
14
+ * this clearly in the success state so it doesn't feel like a bug.
15
+ *
16
+ * Styled with the shared admin-theme classes, matching AdminLoginForm and
17
+ * the rest of the admin panel.
18
+ */
19
+ import { useState, useEffect, useCallback } from 'react';
20
+ import { User, KeyRound, Mail, CheckCircle2, AlertCircle } from 'lucide-react';
21
+ import { useAdminMe } from '../hooks/useAdminMe';
22
+ // =============================================================================
23
+ // Component
24
+ // =============================================================================
25
+ export function AdminAccountPage({ className = '', loginUrl = '/admin/login', redirectDelayMs = 2500, }) {
26
+ const { me, isLoading, error, updateProfile, changePassword } = useAdminMe();
27
+ // --- Profile form state ------------------------------------------------
28
+ const [name, setName] = useState('');
29
+ const [email, setEmail] = useState('');
30
+ const [originalEmail, setOriginalEmail] = useState('');
31
+ const [profileSaving, setProfileSaving] = useState(false);
32
+ const [profileError, setProfileError] = useState(null);
33
+ const [profileSuccess, setProfileSuccess] = useState(false);
34
+ const [showEmailWarning, setShowEmailWarning] = useState(false);
35
+ // Seed form fields once `me` loads
36
+ useEffect(() => {
37
+ if (me) {
38
+ setName(me.name);
39
+ setEmail(me.email);
40
+ setOriginalEmail(me.email);
41
+ }
42
+ }, [me]);
43
+ const emailChanged = email.trim().toLowerCase() !== originalEmail.toLowerCase();
44
+ const profileDirty = me ? (name.trim() !== me.name || emailChanged) : false;
45
+ const handleProfileSubmit = useCallback(async (e) => {
46
+ e.preventDefault();
47
+ setProfileError(null);
48
+ setProfileSuccess(false);
49
+ // If email changed and user hasn't confirmed, show warning dialog
50
+ if (emailChanged && !showEmailWarning) {
51
+ setShowEmailWarning(true);
52
+ return;
53
+ }
54
+ setProfileSaving(true);
55
+ const result = await updateProfile({
56
+ name: name.trim() !== me?.name ? name.trim() : undefined,
57
+ email: emailChanged ? email.trim() : undefined,
58
+ });
59
+ setProfileSaving(false);
60
+ setShowEmailWarning(false);
61
+ if (!result.success) {
62
+ setProfileError(result.error || 'Failed to update profile.');
63
+ return;
64
+ }
65
+ setProfileSuccess(true);
66
+ // Auto-clear the success toast after 3 seconds
67
+ setTimeout(() => setProfileSuccess(false), 3000);
68
+ }, [emailChanged, showEmailWarning, me, name, email, updateProfile]);
69
+ // --- Password form state -----------------------------------------------
70
+ const [currentPassword, setCurrentPassword] = useState('');
71
+ const [newPassword, setNewPassword] = useState('');
72
+ const [confirmPassword, setConfirmPassword] = useState('');
73
+ const [passwordSaving, setPasswordSaving] = useState(false);
74
+ const [passwordError, setPasswordError] = useState(null);
75
+ const [passwordSuccess, setPasswordSuccess] = useState(false);
76
+ const handlePasswordSubmit = useCallback(async (e) => {
77
+ e.preventDefault();
78
+ setPasswordError(null);
79
+ setPasswordSuccess(false);
80
+ if (newPassword.length < 8) {
81
+ setPasswordError('New password must be at least 8 characters.');
82
+ return;
83
+ }
84
+ if (newPassword !== confirmPassword) {
85
+ setPasswordError('New passwords do not match.');
86
+ return;
87
+ }
88
+ if (newPassword === currentPassword) {
89
+ setPasswordError('New password must be different from current password.');
90
+ return;
91
+ }
92
+ setPasswordSaving(true);
93
+ const result = await changePassword({
94
+ currentPassword,
95
+ newPassword,
96
+ });
97
+ setPasswordSaving(false);
98
+ if (!result.success) {
99
+ setPasswordError(result.error || 'Failed to change password.');
100
+ return;
101
+ }
102
+ setPasswordSuccess(true);
103
+ // Redirect to login — the session is now invalidated server-side.
104
+ setTimeout(() => {
105
+ window.location.href = loginUrl;
106
+ }, redirectDelayMs);
107
+ }, [currentPassword, newPassword, confirmPassword, changePassword, loginUrl, redirectDelayMs]);
108
+ // --- Render states -----------------------------------------------------
109
+ if (isLoading) {
110
+ return (_jsx("div", { className: `space-y-4 ${className}`, children: _jsx("div", { className: "flex items-center justify-center py-12", children: _jsx("span", { className: "admin-spinner admin-spinner-lg" }) }) }));
111
+ }
112
+ if (error || !me) {
113
+ return (_jsx("div", { className: `space-y-4 ${className}`, children: _jsx("div", { className: "admin-alert admin-alert-error", children: _jsx("div", { className: "admin-alert-description", children: error || 'Unable to load your account.' }) }) }));
114
+ }
115
+ return (_jsxs("div", { className: `space-y-8 ${className}`, children: [_jsxs("div", { children: [_jsx("h1", { className: "text-3xl font-bold font-heading", children: "My account" }), _jsx("p", { className: "text-muted-foreground mt-1", children: "Manage your profile and password." })] }), _jsxs("div", { className: "admin-card p-6", children: [_jsxs("div", { className: "flex items-center gap-2 mb-4", children: [_jsx(User, { className: "h-5 w-5 admin-icon-primary" }), _jsx("h2", { className: "text-lg font-semibold", children: "Profile" })] }), _jsxs("form", { onSubmit: handleProfileSubmit, className: "space-y-4", children: [profileError && (_jsx("div", { className: "admin-alert admin-alert-error", children: _jsx("div", { className: "admin-alert-description", children: profileError }) })), profileSuccess && (_jsx("div", { className: "admin-alert admin-alert-verified", children: _jsxs("div", { className: "admin-alert-description flex items-center gap-2", children: [_jsx(CheckCircle2, { className: "h-4 w-4" }), "Profile updated."] }) })), _jsxs("div", { children: [_jsx("label", { htmlFor: "account-name", className: "admin-label", children: "Name" }), _jsx("input", { id: "account-name", type: "text", value: name, onChange: (e) => setName(e.target.value), required: true, minLength: 2, disabled: profileSaving, className: "admin-input w-full" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "account-email", className: "admin-label", children: "Email" }), _jsxs("div", { className: "admin-input-with-icon", children: [_jsx(Mail, { className: "admin-input-with-icon-left h-4 w-4" }), _jsx("input", { id: "account-email", type: "email", value: email, onChange: (e) => setEmail(e.target.value), required: true, disabled: profileSaving, className: "admin-input w-full" })] }), _jsx("p", { className: "text-xs admin-text-muted mt-1", children: "Used for sign-in and forgot-password emails." })] }), _jsxs("div", { children: [_jsx("label", { className: "admin-label", children: "Role" }), _jsxs("div", { className: "text-sm admin-text-muted", children: [me.role, " (managed by the store owner)"] })] }), _jsx("div", { className: "flex items-center justify-end pt-2", children: _jsx("button", { type: "submit", disabled: !profileDirty || profileSaving, className: "admin-btn admin-btn-primary", children: profileSaving ? (_jsxs("span", { className: "flex items-center gap-2", children: [_jsx("span", { className: "admin-spinner admin-spinner-sm" }), "Saving..."] })) : ('Save profile') }) })] }), showEmailWarning && (_jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center p-4", style: { background: 'rgba(0,0,0,0.5)' }, onClick: () => setShowEmailWarning(false), children: _jsxs("div", { className: "w-full max-w-md rounded-lg p-6", style: {
116
+ background: 'hsl(var(--admin-card))',
117
+ border: '1px solid hsl(var(--admin-border))',
118
+ }, onClick: (e) => e.stopPropagation(), children: [_jsxs("div", { className: "flex items-start gap-3 mb-4", children: [_jsx("div", { className: "flex-shrink-0 h-10 w-10 rounded-full flex items-center justify-center", style: { background: 'hsl(var(--admin-warning) / 0.1)' }, children: _jsx(AlertCircle, { className: "h-5 w-5 text-[hsl(var(--admin-warning,0_95%_55%))]" }) }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-1", children: "Change email?" }), _jsxs("p", { className: "text-sm admin-text-muted", children: ["Your sign-in email will change from", ' ', _jsx("strong", { children: originalEmail }), " to", ' ', _jsx("strong", { children: email }), ". Future forgot-password emails will go to the new address. Make sure you can receive email there."] })] })] }), _jsxs("div", { className: "flex items-center justify-end gap-2", children: [_jsx("button", { type: "button", onClick: () => setShowEmailWarning(false), disabled: profileSaving, className: "admin-btn admin-btn-secondary", children: "Cancel" }), _jsx("button", { type: "button", onClick: (e) => handleProfileSubmit(e), disabled: profileSaving, className: "admin-btn admin-btn-primary", children: profileSaving ? 'Saving...' : 'Yes, change email' })] })] }) }))] }), _jsxs("div", { className: "admin-card p-6", children: [_jsxs("div", { className: "flex items-center gap-2 mb-4", children: [_jsx(KeyRound, { className: "h-5 w-5 admin-icon-primary" }), _jsx("h2", { className: "text-lg font-semibold", children: "Password" })] }), passwordSuccess ? (_jsxs("div", { className: "text-center py-6", children: [_jsx("div", { className: "admin-icon-container-sm mx-auto mb-4", children: _jsx(CheckCircle2, { className: "h-6 w-6 admin-icon-primary" }) }), _jsx("h3", { className: "admin-heading-2 mb-2", children: "Password changed" }), _jsx("p", { className: "text-sm admin-text-muted", children: "For your security, all sessions have been signed out. Redirecting to sign in..." })] })) : (_jsxs("form", { onSubmit: handlePasswordSubmit, className: "space-y-4", children: [passwordError && (_jsx("div", { className: "admin-alert admin-alert-error", children: _jsx("div", { className: "admin-alert-description", children: passwordError }) })), _jsxs("div", { children: [_jsx("label", { htmlFor: "current-password", className: "admin-label", children: "Current password" }), _jsx("input", { id: "current-password", type: "password", value: currentPassword, onChange: (e) => setCurrentPassword(e.target.value), required: true, autoComplete: "current-password", disabled: passwordSaving, className: "admin-input w-full" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "new-password", className: "admin-label", children: "New password" }), _jsx("input", { id: "new-password", type: "password", value: newPassword, onChange: (e) => setNewPassword(e.target.value), required: true, minLength: 8, autoComplete: "new-password", disabled: passwordSaving, className: "admin-input w-full", placeholder: "At least 8 characters" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "confirm-new-password", className: "admin-label", children: "Confirm new password" }), _jsx("input", { id: "confirm-new-password", type: "password", value: confirmPassword, onChange: (e) => setConfirmPassword(e.target.value), required: true, minLength: 8, autoComplete: "new-password", disabled: passwordSaving, className: "admin-input w-full" })] }), _jsx("p", { className: "text-xs admin-text-muted", children: "After changing your password, you'll be signed out and need to sign back in." }), _jsx("div", { className: "flex items-center justify-end pt-2", children: _jsx("button", { type: "submit", disabled: passwordSaving ||
119
+ !currentPassword ||
120
+ !newPassword ||
121
+ !confirmPassword, className: "admin-btn admin-btn-primary", children: passwordSaving ? (_jsxs("span", { className: "flex items-center gap-2", children: [_jsx("span", { className: "admin-spinner admin-spinner-sm" }), "Updating..."] })) : ('Change password') }) })] }))] })] }));
122
+ }
123
+ //# sourceMappingURL=AdminAccountPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminAccountPage.js","sourceRoot":"","sources":["../../../src/admin/components/AdminAccountPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface AdminForgotPasswordFormProps {
2
+ /** Optional className for the root element */
3
+ className?: string;
4
+ /** URL to navigate back to (default: /admin/login) */
5
+ loginUrl?: string;
6
+ }
7
+ export declare function AdminForgotPasswordForm({ className, loginUrl, }: AdminForgotPasswordFormProps): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=AdminForgotPasswordForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminForgotPasswordForm.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminForgotPasswordForm.tsx"],"names":[],"mappings":"AAuBA,MAAM,WAAW,4BAA4B;IAC3C,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAMD,wBAAgB,uBAAuB,CAAC,EACtC,SAAc,EACd,QAAyB,GAC1B,EAAE,4BAA4B,2CAqI9B"}
@@ -0,0 +1,59 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * @rovela/sdk/admin/components/AdminForgotPasswordForm
5
+ *
6
+ * Admin forgot-password request form.
7
+ *
8
+ * Matches the styling of AdminLoginForm — uses the `admin-*` classes from
9
+ * `@rovela-ai/sdk/admin/styles/admin-theme.css`. Meant to be mounted at
10
+ * `/admin/forgot-password`.
11
+ *
12
+ * The success state is intentionally enumeration-safe: we always show the
13
+ * same "check your email" message whether or not the entered email belongs
14
+ * to a real admin. Backend enforces this behavior too.
15
+ */
16
+ import { useState, useCallback } from 'react';
17
+ import { Mail } from 'lucide-react';
18
+ // =============================================================================
19
+ // Component
20
+ // =============================================================================
21
+ export function AdminForgotPasswordForm({ className = '', loginUrl = '/admin/login', }) {
22
+ const [email, setEmail] = useState('');
23
+ const [error, setError] = useState(null);
24
+ const [isSubmitting, setIsSubmitting] = useState(false);
25
+ const [submitted, setSubmitted] = useState(false);
26
+ const handleSubmit = useCallback(async (e) => {
27
+ e.preventDefault();
28
+ setError(null);
29
+ setIsSubmitting(true);
30
+ try {
31
+ const response = await fetch('/api/admin/forgot-password', {
32
+ method: 'POST',
33
+ headers: { 'Content-Type': 'application/json' },
34
+ body: JSON.stringify({ email: email.trim() }),
35
+ });
36
+ const data = (await response.json().catch(() => ({})));
37
+ if (!response.ok) {
38
+ setError(data.error || 'Something went wrong. Please try again.');
39
+ return;
40
+ }
41
+ // Always show the neutral success state — the backend is
42
+ // enumeration-safe and so are we.
43
+ setSubmitted(true);
44
+ }
45
+ catch {
46
+ setError('Something went wrong. Please try again.');
47
+ }
48
+ finally {
49
+ setIsSubmitting(false);
50
+ }
51
+ }, [email]);
52
+ // --- Success view (after the request was accepted) ----------------------
53
+ if (submitted) {
54
+ return (_jsxs("div", { className: `w-full max-w-sm admin-animate-in ${className}`, children: [_jsxs("div", { className: "mb-8 text-center", children: [_jsx("div", { className: "admin-icon-container-sm mx-auto mb-4", children: _jsx(Mail, { className: "h-6 w-6 admin-icon-primary" }) }), _jsx("h1", { className: "admin-heading-2", children: "Check your email" }), _jsxs("p", { className: "mt-2 text-sm admin-text-muted", children: ["If an account exists for ", _jsx("strong", { children: email }), ", we've sent a link to reset your password. The link expires in 1 hour."] })] }), _jsx("div", { className: "mt-6 text-center", children: _jsx("a", { href: loginUrl, className: "text-sm admin-text-muted hover:underline", children: "\u2190 Back to sign in" }) })] }));
55
+ }
56
+ // --- Form view -----------------------------------------------------------
57
+ return (_jsxs("div", { className: `w-full max-w-sm admin-animate-in ${className}`, children: [_jsxs("div", { className: "mb-8 text-center", children: [_jsx("div", { className: "admin-icon-container-sm mx-auto mb-4", children: _jsx(Mail, { className: "h-6 w-6 admin-icon-primary" }) }), _jsx("h1", { className: "admin-heading-2", children: "Forgot your password?" }), _jsx("p", { className: "mt-2 text-sm admin-text-muted", children: "Enter your admin email and we'll send you a link to reset it." })] }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [error && (_jsx("div", { className: "admin-alert admin-alert-error", children: _jsx("div", { className: "admin-alert-description", children: error }) })), _jsxs("div", { children: [_jsx("label", { htmlFor: "forgot-email", className: "admin-label", children: "Email" }), _jsx("input", { id: "forgot-email", type: "email", value: email, onChange: (e) => setEmail(e.target.value), required: true, autoComplete: "email", disabled: isSubmitting, className: "admin-input w-full", placeholder: "admin@example.com" })] }), _jsx("button", { type: "submit", disabled: isSubmitting || !email.trim(), className: "admin-btn admin-btn-primary w-full", children: isSubmitting ? (_jsxs("span", { className: "flex items-center justify-center gap-2", children: [_jsx("span", { className: "admin-spinner admin-spinner-sm" }), "Sending link..."] })) : ('Send reset link') })] }), _jsx("div", { className: "mt-6 text-center", children: _jsx("a", { href: loginUrl, className: "text-sm admin-text-muted hover:underline", children: "\u2190 Back to sign in" }) })] }));
58
+ }
59
+ //# sourceMappingURL=AdminForgotPasswordForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminForgotPasswordForm.js","sourceRoot":"","sources":["../../../src/admin/components/AdminForgotPasswordForm.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AdminNav.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAU7C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,EAAE,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wDAAwD;IACxD,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;IACjB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mBAAmB;IACnB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAuGD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,KAAK,EACL,SAAS,EAAE,aAAuB,EAClC,IAAI,EACJ,QAAc,EACd,SAAc,GACf,EAAE,aAAa,2CA8If"}
1
+ {"version":3,"file":"AdminNav.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAW7C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,EAAE,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wDAAwD;IACxD,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;IACjB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mBAAmB;IACnB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA+HD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,KAAK,EACL,SAAS,EAAE,aAAuB,EAClC,IAAI,EACJ,QAAc,EACd,SAAc,GACf,EAAE,aAAa,2CAwJf"}
@@ -11,8 +11,9 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
11
11
  */
12
12
  import React from 'react';
13
13
  import { usePathname } from 'next/navigation';
14
- import { LayoutDashboard, Package, FolderOpen, ClipboardList, Users, Settings, ExternalLink, Truck, CreditCard, Tag, Receipt } from 'lucide-react';
14
+ import { LayoutDashboard, Package, FolderOpen, ClipboardList, Users, UserCog, Settings, ExternalLink, Truck, CreditCard, Tag, Receipt } from 'lucide-react';
15
15
  import { useStoreSettingsOptional } from '../../core';
16
+ import { useAdminAuth } from '../hooks/useAdminAuth';
16
17
  import { AdminUserMenu } from './AdminUserMenu';
17
18
  // =============================================================================
18
19
  // Default Navigation Groups
@@ -22,6 +23,9 @@ const defaultNavGroups = [
22
23
  label: 'Main',
23
24
  items: [
24
25
  { id: 'dashboard', label: 'Dashboard', href: '/admin' },
26
+ // 'users' is injected conditionally at render time — only owners and
27
+ // administrators see it. See `filterNavGroupsByRole` below.
28
+ { id: 'users', label: 'Users', href: '/admin/users' },
25
29
  ],
26
30
  },
27
31
  {
@@ -43,6 +47,20 @@ const defaultNavGroups = [
43
47
  ],
44
48
  },
45
49
  ];
50
+ /**
51
+ * Remove nav items the current role cannot access. For Phase 2, this only
52
+ * hides `users` from managers and regular users — owners and administrators
53
+ * keep full visibility.
54
+ */
55
+ function filterNavGroupsByRole(groups, role) {
56
+ const canManageUsers = role === 'owner' || role === 'administrator' || role === 'admin';
57
+ if (canManageUsers)
58
+ return groups;
59
+ return groups.map((group) => ({
60
+ ...group,
61
+ items: group.items.filter((item) => item.id !== 'users'),
62
+ }));
63
+ }
46
64
  const settingsItem = { id: 'settings', label: 'Settings', href: '/admin/settings' };
47
65
  // Rovela Logo Image - Uses Rovela CDN URL (works in all environments)
48
66
  function RovelaLogo({ className = 'admin-rovela-logo', variant = 'color' }) {
@@ -52,6 +70,7 @@ function RovelaLogo({ className = 'admin-rovela-logo', variant = 'color' }) {
52
70
  }
53
71
  const iconMap = {
54
72
  dashboard: LayoutDashboard,
73
+ users: UserCog,
55
74
  products: Package,
56
75
  categories: FolderOpen,
57
76
  orders: ClipboardList,
@@ -85,6 +104,10 @@ function NavItemButton({ item, isActive, }) {
85
104
  export function AdminNav({ activeNav, items, storeName: storeNameProp = 'Admin', logo, storeUrl = '/', className = '', }) {
86
105
  // Get store settings from context (optional - works even outside provider)
87
106
  const storeSettings = useStoreSettingsOptional();
107
+ // Get the current admin's role for nav filtering. Safe to call even when
108
+ // AdminNav is mounted outside a SessionProvider — useAdminAuth defends
109
+ // against that and returns `{ admin: null }`.
110
+ const { admin } = useAdminAuth();
88
111
  // Auto-detect active nav from pathname when not explicitly provided
89
112
  const pathname = usePathname();
90
113
  const resolvedActiveNav = activeNav ?? (() => {
@@ -92,6 +115,8 @@ export function AdminNav({ activeNav, items, storeName: storeNameProp = 'Admin',
92
115
  return undefined;
93
116
  if (pathname === '/admin' || pathname === '/admin/')
94
117
  return 'dashboard';
118
+ if (pathname.startsWith('/admin/users'))
119
+ return 'users';
95
120
  if (pathname.startsWith('/admin/products'))
96
121
  return 'products';
97
122
  if (pathname.startsWith('/admin/categories'))
@@ -121,10 +146,13 @@ export function AdminNav({ activeNav, items, storeName: storeNameProp = 'Admin',
121
146
  const storeName = storeNameProp !== 'Admin' ? storeNameProp : (storeSettings?.storeName || storeNameProp);
122
147
  // Get logo URL from context (database) first, fall back to env var for instant updates
123
148
  const logoUrl = storeSettings?.logoUrl || process.env.NEXT_PUBLIC_STORE_LOGO_URL || null;
124
- // If custom items provided, append as "Features" group; otherwise use defaults
149
+ // Filter role-gated items (currently just `users`) before appending any
150
+ // custom "Features" group.
151
+ const baseGroups = filterNavGroupsByRole(defaultNavGroups, admin?.role ?? null);
152
+ // If custom items provided, append as "Features" group; otherwise use filtered defaults
125
153
  const navGroups = items
126
- ? [...defaultNavGroups, { label: 'Features', items }]
127
- : defaultNavGroups;
154
+ ? [...baseGroups, { label: 'Features', items }]
155
+ : baseGroups;
128
156
  return (_jsxs("nav", { className: `admin-sidebar ${className}`, children: [_jsx("div", { className: "admin-sidebar-header", children: logo || (logoUrl ? (
129
157
  // Logo image from environment variable
130
158
  _jsxs("a", { href: "/admin", className: "admin-sidebar-header-link", children: [_jsx("img", { src: logoUrl, alt: storeName, className: "admin-sidebar-logo" }), _jsxs("div", { className: "admin-sidebar-header-text", children: [_jsx("span", { className: "admin-sidebar-store-name", children: storeName }), _jsx("span", { className: "admin-sidebar-subtitle", children: "Admin Panel" })] })] })) : (
@@ -1 +1 @@
1
- {"version":3,"file":"AdminNav.js","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AdminNav.js","sourceRoot":"","sources":["../../../src/admin/components/AdminNav.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface AdminResetPasswordFormProps {
2
+ /** Optional className for the root element */
3
+ className?: string;
4
+ /** URL to redirect to after a successful reset (default: /admin/login) */
5
+ loginUrl?: string;
6
+ /** URL to request a new reset link (default: /admin/forgot-password) */
7
+ forgotPasswordUrl?: string;
8
+ /** Delay in ms before redirecting after success (default: 2000) */
9
+ redirectDelayMs?: number;
10
+ }
11
+ export declare function AdminResetPasswordForm({ className, loginUrl, forgotPasswordUrl, redirectDelayMs, }: AdminResetPasswordFormProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=AdminResetPasswordForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminResetPasswordForm.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminResetPasswordForm.tsx"],"names":[],"mappings":"AA+BA,MAAM,WAAW,2BAA2B;IAC1C,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wEAAwE;IACxE,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAWD,wBAAgB,sBAAsB,CAAC,EACrC,SAAc,EACd,QAAyB,EACzB,iBAA4C,EAC5C,eAAsB,GACvB,EAAE,2BAA2B,2CA8P7B"}