@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.
Files changed (182) 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 +15 -10
  93. package/dist/admin/config.d.ts.map +1 -1
  94. package/dist/admin/config.js +38 -11
  95. package/dist/admin/config.js.map +1 -1
  96. package/dist/admin/hooks/index.d.ts +4 -0
  97. package/dist/admin/hooks/index.d.ts.map +1 -1
  98. package/dist/admin/hooks/index.js +3 -0
  99. package/dist/admin/hooks/index.js.map +1 -1
  100. package/dist/admin/hooks/useAdminMe.d.ts +31 -0
  101. package/dist/admin/hooks/useAdminMe.d.ts.map +1 -0
  102. package/dist/admin/hooks/useAdminMe.js +103 -0
  103. package/dist/admin/hooks/useAdminMe.js.map +1 -0
  104. package/dist/admin/hooks/useAdminPermissions.d.ts +3 -0
  105. package/dist/admin/hooks/useAdminPermissions.d.ts.map +1 -0
  106. package/dist/admin/hooks/useAdminPermissions.js +51 -0
  107. package/dist/admin/hooks/useAdminPermissions.js.map +1 -0
  108. package/dist/admin/hooks/useAdminUsers.d.ts +3 -0
  109. package/dist/admin/hooks/useAdminUsers.d.ts.map +1 -0
  110. package/dist/admin/hooks/useAdminUsers.js +240 -0
  111. package/dist/admin/hooks/useAdminUsers.js.map +1 -0
  112. package/dist/admin/index.d.ts +4 -4
  113. package/dist/admin/index.d.ts.map +1 -1
  114. package/dist/admin/index.js +20 -2
  115. package/dist/admin/index.js.map +1 -1
  116. package/dist/admin/permissions.d.ts +92 -0
  117. package/dist/admin/permissions.d.ts.map +1 -0
  118. package/dist/admin/permissions.js +201 -0
  119. package/dist/admin/permissions.js.map +1 -0
  120. package/dist/admin/server/admin-invite.d.ts +122 -0
  121. package/dist/admin/server/admin-invite.d.ts.map +1 -0
  122. package/dist/admin/server/admin-invite.js +235 -0
  123. package/dist/admin/server/admin-invite.js.map +1 -0
  124. package/dist/admin/server/admin-password-reset.d.ts +87 -0
  125. package/dist/admin/server/admin-password-reset.d.ts.map +1 -0
  126. package/dist/admin/server/admin-password-reset.js +220 -0
  127. package/dist/admin/server/admin-password-reset.js.map +1 -0
  128. package/dist/admin/server/admin-self-service.d.ts +86 -0
  129. package/dist/admin/server/admin-self-service.d.ts.map +1 -0
  130. package/dist/admin/server/admin-self-service.js +188 -0
  131. package/dist/admin/server/admin-self-service.js.map +1 -0
  132. package/dist/admin/server/admin-service.d.ts.map +1 -1
  133. package/dist/admin/server/admin-service.js +21 -2
  134. package/dist/admin/server/admin-service.js.map +1 -1
  135. package/dist/admin/server/admin-session.d.ts +137 -0
  136. package/dist/admin/server/admin-session.d.ts.map +1 -0
  137. package/dist/admin/server/admin-session.js +229 -0
  138. package/dist/admin/server/admin-session.js.map +1 -0
  139. package/dist/admin/server/index.d.ts +7 -0
  140. package/dist/admin/server/index.d.ts.map +1 -1
  141. package/dist/admin/server/index.js +20 -0
  142. package/dist/admin/server/index.js.map +1 -1
  143. package/dist/admin/server/user-management.d.ts +223 -0
  144. package/dist/admin/server/user-management.d.ts.map +1 -0
  145. package/dist/admin/server/user-management.js +846 -0
  146. package/dist/admin/server/user-management.js.map +1 -0
  147. package/dist/admin/types.d.ts +153 -2
  148. package/dist/admin/types.d.ts.map +1 -1
  149. package/dist/auth/config.d.ts.map +1 -1
  150. package/dist/auth/config.js +11 -2
  151. package/dist/auth/config.js.map +1 -1
  152. package/dist/core/db/queries.d.ts +19 -13
  153. package/dist/core/db/queries.d.ts.map +1 -1
  154. package/dist/core/db/schema.d.ts +327 -9
  155. package/dist/core/db/schema.d.ts.map +1 -1
  156. package/dist/core/db/schema.js +80 -3
  157. package/dist/core/db/schema.js.map +1 -1
  158. package/dist/core/types.d.ts +19 -3
  159. package/dist/core/types.d.ts.map +1 -1
  160. package/dist/emails/index.d.ts +2 -2
  161. package/dist/emails/index.d.ts.map +1 -1
  162. package/dist/emails/index.js +3 -1
  163. package/dist/emails/index.js.map +1 -1
  164. package/dist/emails/send/admin-auth.d.ts +94 -0
  165. package/dist/emails/send/admin-auth.d.ts.map +1 -0
  166. package/dist/emails/send/admin-auth.js +118 -0
  167. package/dist/emails/send/admin-auth.js.map +1 -0
  168. package/dist/emails/send/index.d.ts +2 -0
  169. package/dist/emails/send/index.d.ts.map +1 -1
  170. package/dist/emails/send/index.js +4 -0
  171. package/dist/emails/send/index.js.map +1 -1
  172. package/dist/emails/templates/admin-invite.d.ts +40 -0
  173. package/dist/emails/templates/admin-invite.d.ts.map +1 -0
  174. package/dist/emails/templates/admin-invite.js +62 -0
  175. package/dist/emails/templates/admin-invite.js.map +1 -0
  176. package/dist/emails/templates/index.d.ts +1 -0
  177. package/dist/emails/templates/index.d.ts.map +1 -1
  178. package/dist/emails/templates/index.js +4 -0
  179. package/dist/emails/templates/index.js.map +1 -1
  180. package/dist/emails/types.d.ts +22 -1
  181. package/dist/emails/types.d.ts.map +1 -1
  182. 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,2CA6DpB"}
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" }))] }), _jsx("div", { className: "py-1", children: _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"] }) })] })] }))] }) }));
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;AAClD,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,cAAK,SAAS,EAAC,MAAM,YACnB,kBACE,OAAO,EAAE,aAAa,EACtB,SAAS,EAAC,4DAA4D,aAEtE,KAAC,MAAM,IAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAE,GAAG,GAAI,gBAEzC,GACL,IACF,IACL,CACJ,IACG,GACF,CACP,CAAA;AACH,CAAC"}
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,3 @@
1
+ import type { InviteUserDialogProps } from '../types';
2
+ export declare function InviteUserDialog({ isOpen, onClose, onInvited, className, }: InviteUserDialogProps): import("react/jsx-runtime").JSX.Element | null;
3
+ //# sourceMappingURL=InviteUserDialog.d.ts.map
@@ -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,3 @@
1
+ import type { UsersTableProps } from '../types';
2
+ export declare function UsersTable({ pageSize, className }: UsersTableProps): import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=UsersTable.d.ts.map
@@ -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"}