@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,134 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* @rovela/sdk/admin/components/AdminResetPasswordForm
|
|
5
|
+
*
|
|
6
|
+
* Admin reset-password completion form.
|
|
7
|
+
*
|
|
8
|
+
* Lifecycle:
|
|
9
|
+
* 1. Reads `?token=X` from the URL via `useSearchParams`.
|
|
10
|
+
* 2. On mount, calls `GET /api/admin/reset-password?token=X` to check
|
|
11
|
+
* validity without consuming the token. Shows a spinner while waiting.
|
|
12
|
+
* 3. If the token is invalid/expired, shows an error view with a "request
|
|
13
|
+
* a new link" CTA.
|
|
14
|
+
* 4. If valid, shows a password + confirm-password form.
|
|
15
|
+
* 5. On submit, calls `POST /api/admin/reset-password`. On success, shows
|
|
16
|
+
* a confirmation screen and redirects to `/admin/login` after 2s.
|
|
17
|
+
*
|
|
18
|
+
* Matches the styling of AdminLoginForm.
|
|
19
|
+
*
|
|
20
|
+
* NOTE: because this component uses `useSearchParams`, the consuming page
|
|
21
|
+
* MUST wrap it in a `<Suspense>` boundary (Next.js App Router requirement).
|
|
22
|
+
*/
|
|
23
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
24
|
+
import { useSearchParams } from 'next/navigation';
|
|
25
|
+
import { KeyRound, CheckCircle2, AlertCircle } from 'lucide-react';
|
|
26
|
+
// =============================================================================
|
|
27
|
+
// Component
|
|
28
|
+
// =============================================================================
|
|
29
|
+
export function AdminResetPasswordForm({ className = '', loginUrl = '/admin/login', forgotPasswordUrl = '/admin/forgot-password', redirectDelayMs = 2000, }) {
|
|
30
|
+
const searchParams = useSearchParams();
|
|
31
|
+
const token = searchParams?.get('token') ?? '';
|
|
32
|
+
const [validation, setValidation] = useState({
|
|
33
|
+
status: 'validating',
|
|
34
|
+
});
|
|
35
|
+
const [password, setPassword] = useState('');
|
|
36
|
+
const [confirmPassword, setConfirmPassword] = useState('');
|
|
37
|
+
const [formError, setFormError] = useState(null);
|
|
38
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
39
|
+
const [success, setSuccess] = useState(false);
|
|
40
|
+
// --- 1. Validate the token on mount -------------------------------------
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
if (!token) {
|
|
43
|
+
setValidation({
|
|
44
|
+
status: 'invalid',
|
|
45
|
+
error: 'Reset link is missing a token. Please request a new one.',
|
|
46
|
+
});
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
let cancelled = false;
|
|
50
|
+
(async () => {
|
|
51
|
+
try {
|
|
52
|
+
const res = await fetch(`/api/admin/reset-password?token=${encodeURIComponent(token)}`);
|
|
53
|
+
const data = (await res.json().catch(() => ({})));
|
|
54
|
+
if (cancelled)
|
|
55
|
+
return;
|
|
56
|
+
if (res.ok && data.valid) {
|
|
57
|
+
setValidation({ status: 'valid' });
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
setValidation({
|
|
61
|
+
status: 'invalid',
|
|
62
|
+
error: data.error ||
|
|
63
|
+
'This reset link is invalid or has expired. Please request a new one.',
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
if (cancelled)
|
|
69
|
+
return;
|
|
70
|
+
setValidation({
|
|
71
|
+
status: 'invalid',
|
|
72
|
+
error: 'Could not validate the reset link. Please try again.',
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
})();
|
|
76
|
+
return () => {
|
|
77
|
+
cancelled = true;
|
|
78
|
+
};
|
|
79
|
+
}, [token]);
|
|
80
|
+
// --- 2. Handle form submission ------------------------------------------
|
|
81
|
+
const handleSubmit = useCallback(async (e) => {
|
|
82
|
+
e.preventDefault();
|
|
83
|
+
setFormError(null);
|
|
84
|
+
if (password.length < 8) {
|
|
85
|
+
setFormError('Password must be at least 8 characters.');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (password !== confirmPassword) {
|
|
89
|
+
setFormError('Passwords do not match.');
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
setIsSubmitting(true);
|
|
93
|
+
try {
|
|
94
|
+
const res = await fetch('/api/admin/reset-password', {
|
|
95
|
+
method: 'POST',
|
|
96
|
+
headers: { 'Content-Type': 'application/json' },
|
|
97
|
+
body: JSON.stringify({ token, password }),
|
|
98
|
+
});
|
|
99
|
+
const data = (await res.json().catch(() => ({})));
|
|
100
|
+
if (!res.ok || !data.success) {
|
|
101
|
+
setFormError(data.error || 'Failed to reset password. Please try again.');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
setSuccess(true);
|
|
105
|
+
// Redirect to login after a short delay so the user can read the
|
|
106
|
+
// confirmation message.
|
|
107
|
+
setTimeout(() => {
|
|
108
|
+
window.location.href = loginUrl;
|
|
109
|
+
}, redirectDelayMs);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
setFormError('Something went wrong. Please try again.');
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
setIsSubmitting(false);
|
|
116
|
+
}
|
|
117
|
+
}, [token, password, confirmPassword, loginUrl, redirectDelayMs]);
|
|
118
|
+
// --- 3. Render states ---------------------------------------------------
|
|
119
|
+
// Loading state — waiting on GET validation
|
|
120
|
+
if (validation.status === 'validating') {
|
|
121
|
+
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" }) }) }));
|
|
122
|
+
}
|
|
123
|
+
// Invalid token — offer a new reset link
|
|
124
|
+
if (validation.status === 'invalid') {
|
|
125
|
+
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 reset link" }), _jsx("p", { className: "mt-2 text-sm admin-text-muted", children: validation.error })] }), _jsx("a", { href: forgotPasswordUrl, className: "admin-btn admin-btn-primary w-full inline-flex items-center justify-center", children: "Request a new 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" }) })] }));
|
|
126
|
+
}
|
|
127
|
+
// Success — password updated, redirecting
|
|
128
|
+
if (success) {
|
|
129
|
+
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: "Password reset" }), _jsx("p", { className: "mt-2 text-sm admin-text-muted", children: "Your password has been updated. Redirecting to sign in..." })] }) }));
|
|
130
|
+
}
|
|
131
|
+
// Form — token validated, let the user set a new password
|
|
132
|
+
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(KeyRound, { className: "h-6 w-6 admin-icon-primary" }) }), _jsx("h1", { className: "admin-heading-2", children: "Set a new password" }), _jsx("p", { className: "mt-2 text-sm admin-text-muted", children: "Choose a strong password you don't use anywhere else." })] }), _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", { htmlFor: "new-password", className: "admin-label", children: "New password" }), _jsx("input", { id: "new-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: "confirm-password", className: "admin-label", children: "Confirm password" }), _jsx("input", { id: "confirm-password", 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 new 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" }), "Resetting..."] })) : ('Reset password') })] }), _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" }) })] }));
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=AdminResetPasswordForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminResetPasswordForm.js","sourceRoot":"","sources":["../../../src/admin/components/AdminResetPasswordForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminUserMenu.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminUserMenu.tsx"],"names":[],"mappings":"AAiBA,MAAM,WAAW,kBAAkB;IACjC,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAC5B,SAAc,GACf,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"AdminUserMenu.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminUserMenu.tsx"],"names":[],"mappings":"AAiBA,MAAM,WAAW,kBAAkB;IACjC,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAC5B,SAAc,GACf,EAAE,kBAAkB,2CAoEpB"}
|
|
@@ -7,7 +7,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
7
7
|
* Positioned in top-right corner, provides user info and actions.
|
|
8
8
|
*/
|
|
9
9
|
import { useState, useCallback } from 'react';
|
|
10
|
-
import { ChevronDown, LogOut } from 'lucide-react';
|
|
10
|
+
import { ChevronDown, LogOut, User } from 'lucide-react';
|
|
11
11
|
import { useAdminAuth } from '../hooks/useAdminAuth';
|
|
12
12
|
// =============================================================================
|
|
13
13
|
// Component
|
|
@@ -27,6 +27,6 @@ export function AdminUserMenu({ className = '', }) {
|
|
|
27
27
|
await signOut();
|
|
28
28
|
window.location.href = '/admin/login';
|
|
29
29
|
}, [signOut]);
|
|
30
|
-
return (_jsx("div", { className: `admin-user-menu ${className}`, children: _jsxs("div", { className: "admin-dropdown", children: [_jsxs("button", { onClick: () => setIsMenuOpen(!isMenuOpen), className: "admin-user-menu-btn", children: [_jsx("div", { className: "admin-avatar admin-avatar-sm", children: admin?.name?.charAt(0).toUpperCase() || 'A' }), _jsx("span", { className: "admin-user-menu-name", children: admin?.name || 'Admin' }), _jsx(ChevronDown, { className: `h-4 w-4 admin-text-muted transition-transform ${isMenuOpen ? 'rotate-180' : ''}` })] }), isMenuOpen && (_jsxs(_Fragment, { children: [_jsx("div", { className: "admin-dropdown-backdrop", onClick: () => setIsMenuOpen(false) }), _jsxs("div", { className: "admin-dropdown-content", children: [_jsxs("div", { className: "admin-dropdown-header", children: [_jsx("p", { className: "admin-dropdown-header-name", children: admin?.name }), _jsx("p", { className: "admin-dropdown-header-email", children: admin?.email }), admin?.role === 'owner' && (_jsx("span", { className: "admin-badge admin-badge-primary mt-2", children: "Owner" }))] }),
|
|
30
|
+
return (_jsx("div", { className: `admin-user-menu ${className}`, children: _jsxs("div", { className: "admin-dropdown", children: [_jsxs("button", { onClick: () => setIsMenuOpen(!isMenuOpen), className: "admin-user-menu-btn", children: [_jsx("div", { className: "admin-avatar admin-avatar-sm", children: admin?.name?.charAt(0).toUpperCase() || 'A' }), _jsx("span", { className: "admin-user-menu-name", children: admin?.name || 'Admin' }), _jsx(ChevronDown, { className: `h-4 w-4 admin-text-muted transition-transform ${isMenuOpen ? 'rotate-180' : ''}` })] }), isMenuOpen && (_jsxs(_Fragment, { children: [_jsx("div", { className: "admin-dropdown-backdrop", onClick: () => setIsMenuOpen(false) }), _jsxs("div", { className: "admin-dropdown-content", children: [_jsxs("div", { className: "admin-dropdown-header", children: [_jsx("p", { className: "admin-dropdown-header-name", children: admin?.name }), _jsx("p", { className: "admin-dropdown-header-email", children: admin?.email }), admin?.role === 'owner' && (_jsx("span", { className: "admin-badge admin-badge-primary mt-2", children: "Owner" }))] }), _jsxs("div", { className: "py-1", children: [_jsxs("a", { href: "/admin/account", className: "admin-dropdown-item w-full", children: [_jsx(User, { className: "h-4 w-4", strokeWidth: 1.5 }), "My account"] }), _jsxs("button", { onClick: handleSignOut, className: "admin-dropdown-item admin-dropdown-item-destructive w-full", children: [_jsx(LogOut, { className: "h-4 w-4", strokeWidth: 1.5 }), "Sign Out"] })] })] })] }))] }) }));
|
|
31
31
|
}
|
|
32
32
|
//# sourceMappingURL=AdminUserMenu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminUserMenu.js","sourceRoot":"","sources":["../../../src/admin/components/AdminUserMenu.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"AdminUserMenu.js","sourceRoot":"","sources":["../../../src/admin/components/AdminUserMenu.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAWpD,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,SAAS,GAAG,EAAE,GACK;IACnB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,CAAA;IACzC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEnD,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC3C,MAAM,OAAO,EAAE,CAAA;QACf,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,cAAc,CAAA;IACvC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAEb,OAAO,CACL,cAAK,SAAS,EAAE,mBAAmB,SAAS,EAAE,YAC5C,eAAK,SAAS,EAAC,gBAAgB,aAC7B,kBACE,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,EACzC,SAAS,EAAC,qBAAqB,aAE/B,cAAK,SAAS,EAAC,8BAA8B,YAC1C,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,GAAG,GACxC,EACN,eAAM,SAAS,EAAC,sBAAsB,YAAE,KAAK,EAAE,IAAI,IAAI,OAAO,GAAQ,EACtE,KAAC,WAAW,IACV,SAAS,EAAE,iDAAiD,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,GAC5F,IACK,EAGR,UAAU,IAAI,CACb,8BAEE,cACE,SAAS,EAAC,yBAAyB,EACnC,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,GACnC,EAGF,eAAK,SAAS,EAAC,wBAAwB,aACrC,eAAK,SAAS,EAAC,uBAAuB,aACpC,YAAG,SAAS,EAAC,4BAA4B,YAAE,KAAK,EAAE,IAAI,GAAK,EAC3D,YAAG,SAAS,EAAC,6BAA6B,YAAE,KAAK,EAAE,KAAK,GAAK,EAC5D,KAAK,EAAE,IAAI,KAAK,OAAO,IAAI,CAC1B,eAAM,SAAS,EAAC,sCAAsC,sBAE/C,CACR,IACG,EAEN,eAAK,SAAS,EAAC,MAAM,aACnB,aACE,IAAI,EAAC,gBAAgB,EACrB,SAAS,EAAC,4BAA4B,aAEtC,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAE,GAAG,GAAI,kBAE5C,EACJ,kBACE,OAAO,EAAE,aAAa,EACtB,SAAS,EAAC,4DAA4D,aAEtE,KAAC,MAAM,IAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAE,GAAG,GAAI,gBAEzC,IACL,IACF,IACL,CACJ,IACG,GACF,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InviteUserDialog.d.ts","sourceRoot":"","sources":["../../../src/admin/components/InviteUserDialog.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AA6BrD,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,OAAO,EACP,SAAS,EACT,SAAc,GACf,EAAE,qBAAqB,kDA4SvB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* @rovela/sdk/admin/components/InviteUserDialog
|
|
5
|
+
*
|
|
6
|
+
* Admin invite dialog. Opens from the "Invite user" button in UsersTable.
|
|
7
|
+
*
|
|
8
|
+
* Role dropdown is filtered by `useAdminPermissions` — owners see all
|
|
9
|
+
* roles, administrators see only manager/user. Server-side `canManageUser`
|
|
10
|
+
* re-enforces the same rule; the client filter is purely for UX.
|
|
11
|
+
*
|
|
12
|
+
* After a successful invite, the dialog transitions to a "success" state
|
|
13
|
+
* that shows the invite URL with a copy button. This gives the owner a
|
|
14
|
+
* manual-share fallback if the email broker fails or is delayed — the
|
|
15
|
+
* invite is always actionable from the UI regardless of email delivery.
|
|
16
|
+
*/
|
|
17
|
+
import { useState, useCallback, useMemo } from 'react';
|
|
18
|
+
import { UserPlus, Copy, CheckCircle2, Mail, AlertCircle, X } from 'lucide-react';
|
|
19
|
+
import { useAdminUsers } from '../hooks/useAdminUsers';
|
|
20
|
+
import { useAdminPermissions } from '../hooks/useAdminPermissions';
|
|
21
|
+
import { roleLabel } from '../permissions';
|
|
22
|
+
// =============================================================================
|
|
23
|
+
// Role dropdown options (filtered by actor's permissions)
|
|
24
|
+
// =============================================================================
|
|
25
|
+
/**
|
|
26
|
+
* Build the list of roles the current actor can grant. The legacy 'admin'
|
|
27
|
+
* value is intentionally omitted — new invites always use canonical names.
|
|
28
|
+
*/
|
|
29
|
+
function useGrantableRoles() {
|
|
30
|
+
const { canManageUser, isOwner } = useAdminPermissions();
|
|
31
|
+
return useMemo(() => {
|
|
32
|
+
const allRoles = ['owner', 'administrator', 'manager', 'user'];
|
|
33
|
+
return allRoles.filter((role) => {
|
|
34
|
+
// Only owners can invite other owners.
|
|
35
|
+
if (role === 'owner' && !isOwner)
|
|
36
|
+
return false;
|
|
37
|
+
// `canManageUser` rejects same-rank peers for administrators.
|
|
38
|
+
return canManageUser({ id: '__new_invitee__', role });
|
|
39
|
+
});
|
|
40
|
+
}, [canManageUser, isOwner]);
|
|
41
|
+
}
|
|
42
|
+
// =============================================================================
|
|
43
|
+
// Component
|
|
44
|
+
// =============================================================================
|
|
45
|
+
export function InviteUserDialog({ isOpen, onClose, onInvited, className = '', }) {
|
|
46
|
+
const { invite } = useAdminUsers();
|
|
47
|
+
const grantableRoles = useGrantableRoles();
|
|
48
|
+
// Form state
|
|
49
|
+
const [email, setEmail] = useState('');
|
|
50
|
+
const [name, setName] = useState('');
|
|
51
|
+
const [role, setRole] = useState(grantableRoles[grantableRoles.length - 1] || 'user' // default to lowest grantable role
|
|
52
|
+
);
|
|
53
|
+
// Async + result state
|
|
54
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
55
|
+
const [error, setError] = useState(null);
|
|
56
|
+
const [successInviteUrl, setSuccessInviteUrl] = useState(null);
|
|
57
|
+
const [copied, setCopied] = useState(false);
|
|
58
|
+
const resetAndClose = useCallback(() => {
|
|
59
|
+
setEmail('');
|
|
60
|
+
setName('');
|
|
61
|
+
setError(null);
|
|
62
|
+
setSuccessInviteUrl(null);
|
|
63
|
+
setCopied(false);
|
|
64
|
+
setIsSubmitting(false);
|
|
65
|
+
onClose();
|
|
66
|
+
}, [onClose]);
|
|
67
|
+
const handleSubmit = useCallback(async (e) => {
|
|
68
|
+
e.preventDefault();
|
|
69
|
+
setError(null);
|
|
70
|
+
setIsSubmitting(true);
|
|
71
|
+
try {
|
|
72
|
+
const result = await invite({
|
|
73
|
+
email: email.trim(),
|
|
74
|
+
name: name.trim(),
|
|
75
|
+
role,
|
|
76
|
+
});
|
|
77
|
+
if (!result.success) {
|
|
78
|
+
setError(result.error || 'Failed to send invite. Please try again.');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
setSuccessInviteUrl(result.inviteUrl || null);
|
|
82
|
+
if (result.adminId && result.inviteUrl) {
|
|
83
|
+
onInvited?.({ adminId: result.adminId, inviteUrl: result.inviteUrl });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
setError('Something went wrong. Please try again.');
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
setIsSubmitting(false);
|
|
91
|
+
}
|
|
92
|
+
}, [invite, email, name, role, onInvited]);
|
|
93
|
+
const handleCopy = useCallback(() => {
|
|
94
|
+
if (!successInviteUrl)
|
|
95
|
+
return;
|
|
96
|
+
navigator.clipboard
|
|
97
|
+
.writeText(successInviteUrl)
|
|
98
|
+
.then(() => {
|
|
99
|
+
setCopied(true);
|
|
100
|
+
setTimeout(() => setCopied(false), 2000);
|
|
101
|
+
})
|
|
102
|
+
.catch(() => {
|
|
103
|
+
// Fallback if clipboard API blocked (iframe, etc.)
|
|
104
|
+
});
|
|
105
|
+
}, [successInviteUrl]);
|
|
106
|
+
if (!isOpen)
|
|
107
|
+
return null;
|
|
108
|
+
// --- Success view ---------------------------------------------------------
|
|
109
|
+
if (successInviteUrl) {
|
|
110
|
+
return (_jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center p-4", style: { background: 'rgba(0,0,0,0.5)' }, onClick: resetAndClose, children: _jsxs("div", { className: `w-full max-w-md rounded-lg p-6 ${className}`, style: {
|
|
111
|
+
background: 'hsl(var(--admin-card))',
|
|
112
|
+
border: '1px solid hsl(var(--admin-border))',
|
|
113
|
+
}, 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-primary) / 0.1)' }, children: _jsx(CheckCircle2, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }) }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-1", children: "Invite sent" }), _jsxs("p", { className: "text-sm admin-text-muted", children: ["We've emailed an invite to ", _jsx("strong", { children: email }), ". It expires in 72 hours."] })] })] }), _jsxs("div", { className: "mb-4", children: [_jsx("p", { className: "text-xs admin-text-muted mb-2", children: "If the email doesn't arrive, you can also share this link directly:" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { type: "text", readOnly: true, value: successInviteUrl, className: "admin-input flex-1 text-xs font-mono", onClick: (e) => e.target.select() }), _jsx("button", { type: "button", onClick: handleCopy, className: "admin-btn admin-btn-secondary inline-flex items-center gap-1", children: copied ? (_jsxs(_Fragment, { children: [_jsx(CheckCircle2, { className: "h-4 w-4" }), "Copied"] })) : (_jsxs(_Fragment, { children: [_jsx(Copy, { className: "h-4 w-4" }), "Copy"] })) })] })] }), _jsx("div", { className: "flex justify-end", children: _jsx("button", { type: "button", onClick: resetAndClose, className: "admin-btn admin-btn-primary", children: "Done" }) })] }) }));
|
|
114
|
+
}
|
|
115
|
+
// --- Form view ------------------------------------------------------------
|
|
116
|
+
return (_jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center p-4", style: { background: 'rgba(0,0,0,0.5)' }, onClick: () => {
|
|
117
|
+
if (!isSubmitting)
|
|
118
|
+
resetAndClose();
|
|
119
|
+
}, children: _jsxs("div", { className: `w-full max-w-md rounded-lg p-6 ${className}`, style: {
|
|
120
|
+
background: 'hsl(var(--admin-card))',
|
|
121
|
+
border: '1px solid hsl(var(--admin-border))',
|
|
122
|
+
}, onClick: (e) => e.stopPropagation(), children: [_jsxs("div", { className: "flex items-start justify-between mb-4", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "flex-shrink-0 h-10 w-10 rounded-full flex items-center justify-center", style: { background: 'hsl(var(--admin-primary) / 0.1)' }, children: _jsx(UserPlus, { className: "h-5 w-5 text-[hsl(var(--admin-primary))]" }) }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-1", children: "Invite user" }), _jsx("p", { className: "text-sm admin-text-muted", children: "They'll receive an email with a link to set their password and access the admin." })] })] }), _jsx("button", { type: "button", onClick: resetAndClose, disabled: isSubmitting, className: "rounded-md p-1 text-[hsl(var(--admin-foreground-muted))] hover:bg-[hsl(var(--admin-background-hover))]", "aria-label": "Close", children: _jsx(X, { className: "h-4 w-4" }) })] }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [error && (_jsxs("div", { className: "admin-alert admin-alert-error flex items-start gap-2", children: [_jsx(AlertCircle, { className: "h-4 w-4 mt-0.5 flex-shrink-0" }), _jsx("div", { className: "admin-alert-description", children: error })] })), _jsxs("div", { children: [_jsx("label", { htmlFor: "invite-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: "invite-email", type: "email", value: email, onChange: (e) => setEmail(e.target.value), required: true, autoComplete: "email", disabled: isSubmitting, className: "admin-input w-full", placeholder: "jane@example.com" })] })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "invite-name", className: "admin-label", children: "Name" }), _jsx("input", { id: "invite-name", type: "text", value: name, onChange: (e) => setName(e.target.value), required: true, minLength: 2, disabled: isSubmitting, className: "admin-input w-full", placeholder: "Jane Doe" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "invite-role", className: "admin-label", children: "Role" }), _jsx("select", { id: "invite-role", value: role, onChange: (e) => setRole(e.target.value), disabled: isSubmitting || grantableRoles.length === 0, className: "admin-input w-full", children: grantableRoles.map((r) => (_jsx("option", { value: r, children: roleLabel(r) }, r))) }), grantableRoles.length === 0 && (_jsx("p", { className: "text-xs admin-text-muted mt-1", children: "You don't have permission to invite any role." }))] }), _jsxs("div", { className: "flex items-center justify-end gap-2 pt-2", children: [_jsx("button", { type: "button", onClick: resetAndClose, disabled: isSubmitting, className: "admin-btn admin-btn-secondary", children: "Cancel" }), _jsx("button", { type: "submit", disabled: isSubmitting ||
|
|
123
|
+
grantableRoles.length === 0 ||
|
|
124
|
+
!email.trim() ||
|
|
125
|
+
!name.trim(), className: "admin-btn admin-btn-primary", children: isSubmitting ? (_jsxs("span", { className: "flex items-center gap-2", children: [_jsx("span", { className: "admin-spinner admin-spinner-sm" }), "Sending..."] })) : ('Send invite') })] })] })] }) }));
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=InviteUserDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InviteUserDialog.js","sourceRoot":"","sources":["../../../src/admin/components/InviteUserDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UsersTable.d.ts","sourceRoot":"","sources":["../../../src/admin/components/UsersTable.tsx"],"names":[],"mappings":"AAgDA,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,UAAU,CAAA;AAifjB,wBAAgB,UAAU,CAAC,EAAE,QAAa,EAAE,SAAc,EAAE,EAAE,eAAe,2CA4jB5E"}
|