@rovela-ai/sdk 0.2.1 → 0.3.1
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/accept-invite.d.ts +65 -0
- package/dist/admin/api/accept-invite.d.ts.map +1 -0
- package/dist/admin/api/accept-invite.js +115 -0
- package/dist/admin/api/accept-invite.js.map +1 -0
- package/dist/admin/api/categories.d.ts.map +1 -1
- package/dist/admin/api/categories.js +21 -28
- package/dist/admin/api/categories.js.map +1 -1
- package/dist/admin/api/customers.d.ts.map +1 -1
- package/dist/admin/api/customers.js +17 -25
- package/dist/admin/api/customers.js.map +1 -1
- package/dist/admin/api/forgot-password.d.ts +39 -0
- package/dist/admin/api/forgot-password.d.ts.map +1 -0
- package/dist/admin/api/forgot-password.js +66 -0
- package/dist/admin/api/forgot-password.js.map +1 -0
- package/dist/admin/api/index.d.ts +6 -0
- package/dist/admin/api/index.d.ts.map +1 -1
- package/dist/admin/api/index.js +9 -0
- package/dist/admin/api/index.js.map +1 -1
- package/dist/admin/api/me.d.ts +72 -0
- package/dist/admin/api/me.d.ts.map +1 -0
- package/dist/admin/api/me.js +177 -0
- package/dist/admin/api/me.js.map +1 -0
- package/dist/admin/api/orders.d.ts.map +1 -1
- package/dist/admin/api/orders.js +21 -28
- package/dist/admin/api/orders.js.map +1 -1
- package/dist/admin/api/products.d.ts.map +1 -1
- package/dist/admin/api/products.js +33 -37
- package/dist/admin/api/products.js.map +1 -1
- package/dist/admin/api/refund.d.ts.map +1 -1
- package/dist/admin/api/refund.js +5 -7
- package/dist/admin/api/refund.js.map +1 -1
- package/dist/admin/api/reset-password.d.ts +49 -0
- package/dist/admin/api/reset-password.d.ts.map +1 -0
- package/dist/admin/api/reset-password.js +99 -0
- package/dist/admin/api/reset-password.js.map +1 -0
- package/dist/admin/api/return.d.ts.map +1 -1
- package/dist/admin/api/return.js +9 -12
- package/dist/admin/api/return.js.map +1 -1
- package/dist/admin/api/settings.d.ts.map +1 -1
- package/dist/admin/api/settings.js +9 -12
- package/dist/admin/api/settings.js.map +1 -1
- package/dist/admin/api/shipping.d.ts.map +1 -1
- package/dist/admin/api/shipping.js +65 -61
- package/dist/admin/api/shipping.js.map +1 -1
- package/dist/admin/api/stats.d.ts.map +1 -1
- package/dist/admin/api/stats.js +5 -7
- package/dist/admin/api/stats.js.map +1 -1
- package/dist/admin/api/stripe-status.d.ts.map +1 -1
- package/dist/admin/api/stripe-status.js +5 -7
- package/dist/admin/api/stripe-status.js.map +1 -1
- package/dist/admin/api/tax-zones.d.ts.map +1 -1
- package/dist/admin/api/tax-zones.js +21 -28
- package/dist/admin/api/tax-zones.js.map +1 -1
- package/dist/admin/api/users.d.ts +142 -0
- package/dist/admin/api/users.d.ts.map +1 -0
- package/dist/admin/api/users.js +356 -0
- package/dist/admin/api/users.js.map +1 -0
- package/dist/admin/components/AdminAcceptInviteForm.d.ts +3 -0
- package/dist/admin/components/AdminAcceptInviteForm.d.ts.map +1 -0
- package/dist/admin/components/AdminAcceptInviteForm.js +137 -0
- package/dist/admin/components/AdminAcceptInviteForm.js.map +1 -0
- package/dist/admin/components/AdminAccountPage.d.ts +10 -0
- package/dist/admin/components/AdminAccountPage.d.ts.map +1 -0
- package/dist/admin/components/AdminAccountPage.js +123 -0
- package/dist/admin/components/AdminAccountPage.js.map +1 -0
- package/dist/admin/components/AdminForgotPasswordForm.d.ts +8 -0
- package/dist/admin/components/AdminForgotPasswordForm.d.ts.map +1 -0
- package/dist/admin/components/AdminForgotPasswordForm.js +59 -0
- package/dist/admin/components/AdminForgotPasswordForm.js.map +1 -0
- package/dist/admin/components/AdminNav.d.ts.map +1 -1
- package/dist/admin/components/AdminNav.js +32 -4
- package/dist/admin/components/AdminNav.js.map +1 -1
- package/dist/admin/components/AdminResetPasswordForm.d.ts +12 -0
- package/dist/admin/components/AdminResetPasswordForm.d.ts.map +1 -0
- package/dist/admin/components/AdminResetPasswordForm.js +134 -0
- package/dist/admin/components/AdminResetPasswordForm.js.map +1 -0
- package/dist/admin/components/AdminUserMenu.d.ts.map +1 -1
- package/dist/admin/components/AdminUserMenu.js +2 -2
- package/dist/admin/components/AdminUserMenu.js.map +1 -1
- package/dist/admin/components/InviteUserDialog.d.ts +3 -0
- package/dist/admin/components/InviteUserDialog.d.ts.map +1 -0
- package/dist/admin/components/InviteUserDialog.js +127 -0
- package/dist/admin/components/InviteUserDialog.js.map +1 -0
- package/dist/admin/components/UsersTable.d.ts +3 -0
- package/dist/admin/components/UsersTable.d.ts.map +1 -0
- package/dist/admin/components/UsersTable.js +399 -0
- package/dist/admin/components/UsersTable.js.map +1 -0
- package/dist/admin/components/index.d.ts +9 -0
- package/dist/admin/components/index.d.ts.map +1 -1
- package/dist/admin/components/index.js +9 -0
- package/dist/admin/components/index.js.map +1 -1
- package/dist/admin/config.d.ts +15 -10
- package/dist/admin/config.d.ts.map +1 -1
- package/dist/admin/config.js +38 -11
- package/dist/admin/config.js.map +1 -1
- package/dist/admin/hooks/index.d.ts +4 -0
- package/dist/admin/hooks/index.d.ts.map +1 -1
- package/dist/admin/hooks/index.js +3 -0
- package/dist/admin/hooks/index.js.map +1 -1
- package/dist/admin/hooks/useAdminMe.d.ts +31 -0
- package/dist/admin/hooks/useAdminMe.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminMe.js +103 -0
- package/dist/admin/hooks/useAdminMe.js.map +1 -0
- package/dist/admin/hooks/useAdminPermissions.d.ts +3 -0
- package/dist/admin/hooks/useAdminPermissions.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminPermissions.js +51 -0
- package/dist/admin/hooks/useAdminPermissions.js.map +1 -0
- package/dist/admin/hooks/useAdminUsers.d.ts +3 -0
- package/dist/admin/hooks/useAdminUsers.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminUsers.js +240 -0
- package/dist/admin/hooks/useAdminUsers.js.map +1 -0
- package/dist/admin/index.d.ts +4 -4
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +20 -2
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/permissions.d.ts +92 -0
- package/dist/admin/permissions.d.ts.map +1 -0
- package/dist/admin/permissions.js +201 -0
- package/dist/admin/permissions.js.map +1 -0
- package/dist/admin/server/admin-invite.d.ts +122 -0
- package/dist/admin/server/admin-invite.d.ts.map +1 -0
- package/dist/admin/server/admin-invite.js +235 -0
- package/dist/admin/server/admin-invite.js.map +1 -0
- package/dist/admin/server/admin-password-reset.d.ts +87 -0
- package/dist/admin/server/admin-password-reset.d.ts.map +1 -0
- package/dist/admin/server/admin-password-reset.js +220 -0
- package/dist/admin/server/admin-password-reset.js.map +1 -0
- package/dist/admin/server/admin-self-service.d.ts +86 -0
- package/dist/admin/server/admin-self-service.d.ts.map +1 -0
- package/dist/admin/server/admin-self-service.js +188 -0
- package/dist/admin/server/admin-self-service.js.map +1 -0
- package/dist/admin/server/admin-service.d.ts.map +1 -1
- package/dist/admin/server/admin-service.js +21 -2
- package/dist/admin/server/admin-service.js.map +1 -1
- package/dist/admin/server/admin-session.d.ts +137 -0
- package/dist/admin/server/admin-session.d.ts.map +1 -0
- package/dist/admin/server/admin-session.js +229 -0
- package/dist/admin/server/admin-session.js.map +1 -0
- package/dist/admin/server/index.d.ts +7 -0
- package/dist/admin/server/index.d.ts.map +1 -1
- package/dist/admin/server/index.js +20 -0
- package/dist/admin/server/index.js.map +1 -1
- package/dist/admin/server/user-management.d.ts +223 -0
- package/dist/admin/server/user-management.d.ts.map +1 -0
- package/dist/admin/server/user-management.js +846 -0
- package/dist/admin/server/user-management.js.map +1 -0
- package/dist/admin/types.d.ts +153 -2
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/auth/config.d.ts.map +1 -1
- package/dist/auth/config.js +11 -2
- package/dist/auth/config.js.map +1 -1
- package/dist/core/db/queries.d.ts +19 -13
- package/dist/core/db/queries.d.ts.map +1 -1
- package/dist/core/db/schema.d.ts +327 -9
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +80 -3
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/types.d.ts +19 -3
- package/dist/core/types.d.ts.map +1 -1
- package/dist/emails/index.d.ts +2 -2
- package/dist/emails/index.d.ts.map +1 -1
- package/dist/emails/index.js +3 -1
- package/dist/emails/index.js.map +1 -1
- package/dist/emails/send/admin-auth.d.ts +94 -0
- package/dist/emails/send/admin-auth.d.ts.map +1 -0
- package/dist/emails/send/admin-auth.js +118 -0
- package/dist/emails/send/admin-auth.js.map +1 -0
- package/dist/emails/send/index.d.ts +2 -0
- package/dist/emails/send/index.d.ts.map +1 -1
- package/dist/emails/send/index.js +4 -0
- package/dist/emails/send/index.js.map +1 -1
- package/dist/emails/templates/admin-invite.d.ts +40 -0
- package/dist/emails/templates/admin-invite.d.ts.map +1 -0
- package/dist/emails/templates/admin-invite.js +62 -0
- package/dist/emails/templates/admin-invite.js.map +1 -0
- package/dist/emails/templates/index.d.ts +1 -0
- package/dist/emails/templates/index.d.ts.map +1 -1
- package/dist/emails/templates/index.js +4 -0
- package/dist/emails/templates/index.js.map +1 -1
- package/dist/emails/types.d.ts +22 -1
- package/dist/emails/types.d.ts.map +1 -1
- 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;
|
|
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
|
-
//
|
|
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
|
-
? [...
|
|
127
|
-
:
|
|
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":"AAAA,YAAY,CAAA;;AAEZ;;;;;;;;GAQG;AAEH,OAAO,KAAyB,MAAM,OAAO,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;
|
|
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"}
|