@explita/cloud-auth-client 0.1.1 → 0.1.3

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 (36) hide show
  1. package/dist/components/change-password.js +58 -75
  2. package/dist/components/icons/alert-circle.d.ts +5 -0
  3. package/dist/components/icons/alert-circle.js +13 -0
  4. package/dist/components/icons/chevron-down.d.ts +5 -0
  5. package/dist/components/icons/chevron-down.js +11 -0
  6. package/dist/components/icons/lock.d.ts +2 -1
  7. package/dist/components/icons/lock.js +2 -2
  8. package/dist/components/icons/logout.d.ts +2 -1
  9. package/dist/components/icons/logout.js +2 -2
  10. package/dist/components/icons/setting.d.ts +2 -1
  11. package/dist/components/icons/setting.js +2 -2
  12. package/dist/components/icons/shield.d.ts +5 -0
  13. package/dist/components/icons/shield.js +11 -0
  14. package/dist/components/icons/user.d.ts +5 -0
  15. package/dist/components/icons/user.js +12 -0
  16. package/dist/components/login-form.d.ts +3 -1
  17. package/dist/components/login-form.js +45 -34
  18. package/dist/components/message.js +2 -2
  19. package/dist/components/must-login.js +20 -8
  20. package/dist/components/reset-password.d.ts +2 -1
  21. package/dist/components/reset-password.js +62 -60
  22. package/dist/components/settings.js +16 -8
  23. package/dist/components/signup-form.d.ts +4 -3
  24. package/dist/components/signup-form.js +72 -60
  25. package/dist/components/toggle-2fa.js +42 -26
  26. package/dist/components/toggle-account-status.js +56 -64
  27. package/dist/components/ui/input.js +1 -1
  28. package/dist/components/user-card.js +48 -23
  29. package/dist/contexts/auth-provider.js +1 -1
  30. package/dist/index.d.ts +1 -1
  31. package/dist/lib/utils.js +7 -1
  32. package/dist/server/user.d.ts +3 -1
  33. package/dist/server/user.js +33 -0
  34. package/dist/styles.css +2645 -1805
  35. package/dist/types.d.ts +21 -7
  36. package/package.json +65 -65
@@ -1,49 +1,27 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
35
5
  Object.defineProperty(exports, "__esModule", { value: true });
36
6
  exports.ToggleAccountStatus = ToggleAccountStatus;
37
- const react_1 = __importStar(require("react"));
7
+ const react_1 = __importDefault(require("react"));
38
8
  const dialog_1 = require("./ui/dialog");
39
9
  const button_1 = require("./ui/button");
40
10
  const auth_provider_1 = require("../contexts/auth-provider");
41
11
  const message_1 = require("./message");
42
12
  const must_login_1 = require("./must-login");
43
13
  const utils_1 = require("../lib/utils");
14
+ const alert_circle_1 = require("./icons/alert-circle");
44
15
  function ToggleAccountStatus({ user, open, onOpenChange, onSuccess, onSubmit, }) {
45
16
  const { user: loggedInUser } = (0, auth_provider_1.useAuth)();
46
- const [state, handleSubmit, isPending] = (0, react_1.useActionState)(async function () {
17
+ const [isPending, setIsPending] = react_1.default.useState(false);
18
+ const [state, setState] = react_1.default.useState({
19
+ message: "",
20
+ //@ts-ignore
21
+ status: "",
22
+ });
23
+ async function handleSubmit(e) {
24
+ e.preventDefault();
47
25
  if (!user) {
48
26
  return {
49
27
  message: "Please provide a user to toggle account status.",
@@ -56,43 +34,57 @@ function ToggleAccountStatus({ user, open, onOpenChange, onSuccess, onSubmit, })
56
34
  status: "failure",
57
35
  };
58
36
  }
59
- try {
60
- const result = await onSubmit(user.id);
37
+ setIsPending(true);
38
+ const result = await onSubmit(user.subId);
39
+ setIsPending(false);
40
+ if (result.status !== "failure") {
61
41
  onSuccess?.();
62
- return result;
63
- }
64
- catch (error) {
65
- console.log(error);
66
42
  }
67
- }, undefined);
43
+ setState(result);
44
+ }
45
+ const isSuspending = user?.isActive;
68
46
  return (react_1.default.createElement(dialog_1.Dialog, { open: open, onOpenChange: (state) => {
69
47
  onOpenChange(state);
70
48
  (0, utils_1.unstuckPointerEvents)();
71
49
  } },
72
- react_1.default.createElement(dialog_1.DialogContent, null, !loggedInUser ? (react_1.default.createElement(must_login_1.MustLogin, { onOpenChange: (state) => {
50
+ react_1.default.createElement(dialog_1.DialogContent, { className: "ecpauth:p-0 ecpauth:overflow-hidden ecpauth:border-gray-200 ecpauth:dark:border-gray-800 ecpauth:shadow-2xl ecpauth:rounded-2xl ecpauth:max-w-md" }, !loggedInUser ? (react_1.default.createElement(must_login_1.MustLogin, { onOpenChange: (state) => {
73
51
  onOpenChange(state);
74
52
  (0, utils_1.unstuckPointerEvents)();
75
- } })) : (react_1.default.createElement("form", { action: handleSubmit },
76
- react_1.default.createElement(dialog_1.DialogHeader, null,
77
- react_1.default.createElement(dialog_1.DialogTitle, null,
78
- "Toggle account status (",
79
- user?.firstName,
80
- " ",
81
- user?.lastName,
82
- ")"),
83
- state?.status === "success" ? (react_1.default.createElement(message_1.Message, { message: state?.message, className: "ecpauth:my-2 ecpauth:font-semibold ecpauth:text-base", variant: "success" })) : (react_1.default.createElement(message_1.Message, { message: state?.message, className: "ecpauth:my-2" }))),
84
- react_1.default.createElement(dialog_1.DialogDescription, { className: "ecpauth:flex ecpauth:flex-col ecpauth:gap-2 ecpauth:text-gray-700 ecpauth:dark:text-gray-50 ecpauth:mt-4" },
85
- react_1.default.createElement("span", null,
86
- "This action will",
53
+ } })) : (react_1.default.createElement("form", { onSubmit: handleSubmit, className: "ecpauth:flex ecpauth:flex-col" },
54
+ react_1.default.createElement("div", { className: "ecpauth:relative ecpauth:px-6 ecpauth:pt-8 ecpauth:pb-6 ecpauth:text-center" },
55
+ react_1.default.createElement("div", { className: "ecpauth:relative ecpauth:z-10 ecpauth:flex ecpauth:flex-col ecpauth:items-center ecpauth:justify-center" },
56
+ react_1.default.createElement("div", { className: (0, utils_1.cn)("ecpauth:size-12 ecpauth:rounded-xl ecpauth:flex ecpauth:items-center ecpauth:justify-center ecpauth:mb-4 ecpauth:shadow-sm ecpauth:border", isSuspending
57
+ ? "ecpauth:bg-amber-50 ecpauth:dark:bg-amber-900/20 ecpauth:text-amber-600 ecpauth:dark:text-amber-400 ecpauth:border-amber-100 ecpauth:dark:border-amber-800/50"
58
+ : "ecpauth:bg-blue-50 ecpauth:dark:bg-blue-900/20 ecpauth:text-blue-600 ecpauth:dark:text-blue-400 ecpauth:border-blue-100 ecpauth:dark:border-blue-800/50") },
59
+ react_1.default.createElement(alert_circle_1.AlertCircleIcon, { size: 24 })),
60
+ react_1.default.createElement(dialog_1.DialogHeader, { className: "ecpauth:space-y-1" },
61
+ react_1.default.createElement(dialog_1.DialogTitle, { className: "ecpauth:text-xl ecpauth:font-bold ecpauth:text-gray-900 ecpauth:dark:text-white ecpauth:text-center" }, isSuspending ? "Suspend Account" : "Unsuspend Account"),
62
+ react_1.default.createElement(dialog_1.DialogDescription, { className: "ecpauth:text-gray-500 ecpauth:dark:text-gray-400 ecpauth:text-center" },
63
+ "Manage status for ",
64
+ user?.firstName,
65
+ " ",
66
+ user?.lastName)))),
67
+ react_1.default.createElement("div", { className: "ecpauth:px-8 ecpauth:pb-6" }, state?.status === "success" ? (react_1.default.createElement("div", { className: "ecpauth:mb-6" },
68
+ react_1.default.createElement(message_1.Message, { message: state?.message, variant: "success" }))) : state?.message ? (react_1.default.createElement("div", { className: "ecpauth:mb-6" },
69
+ react_1.default.createElement(message_1.Message, { message: state?.message }))) : (react_1.default.createElement("div", { className: "ecpauth:p-4 ecpauth:rounded-xl ecpauth:bg-gray-50 ecpauth:dark:bg-white/5 ecpauth:border ecpauth:border-gray-100 ecpauth:dark:border-white/10" },
70
+ react_1.default.createElement("p", { className: "ecpauth:text-sm ecpauth:leading-relaxed ecpauth:text-gray-600 ecpauth:dark:text-gray-300 ecpauth:text-center" },
71
+ "Are you sure you want to",
87
72
  " ",
88
- react_1.default.createElement("strong", null, user?.isActive ? "suspend" : "unsuspend"),
89
- " the user."),
90
- react_1.default.createElement("span", null,
91
- "You can always",
73
+ react_1.default.createElement("strong", null, isSuspending ? "suspend" : "unsuspend"),
92
74
  " ",
93
- react_1.default.createElement("strong", null, user?.isActive ? "unsuspend" : "suspend"),
94
- " the user if you change your mind.")),
95
- react_1.default.createElement(dialog_1.DialogFooter, { className: "ecpauth:flex ecpauth:justify-center ecpauth:gap-2 ecpauth:mt-4" },
96
- react_1.default.createElement(button_1.Button, { type: "button", variant: "outline", onClick: () => onOpenChange(false) }, "Cancel"),
97
- react_1.default.createElement(button_1.Button, { disabled: isPending, type: "submit" }, user?.isActive ? "Suspend" : "Unsuspend")))))));
75
+ "this account?",
76
+ isSuspending
77
+ ? " The user will temporarily lose access to all platform features."
78
+ : " The user will regain access to their account features.")))),
79
+ react_1.default.createElement(dialog_1.DialogFooter, { className: "ecpauth:p-6 ecpauth:pt-0 ecpauth:flex ecpauth:flex-row ecpauth:justify-center ecpauth:gap-3" },
80
+ react_1.default.createElement(button_1.Button, { type: "button", variant: "outline", onClick: () => onOpenChange(false), className: "ecpauth:flex-1 ecpauth:h-11 ecpauth:rounded-xl ecpauth:font-semibold ecpauth:border-gray-200 ecpauth:dark:border-gray-800 ecpauth:hover:bg-gray-50 ecpauth:dark:hover:bg-white/5 ecpauth:transition-all" }, "Cancel"),
81
+ react_1.default.createElement(button_1.Button, { disabled: isPending, type: "submit", className: (0, utils_1.cn)("ecpauth:flex-1 ecpauth:h-11 ecpauth:rounded-xl ecpauth:font-bold ecpauth:text-white! ecpauth:shadow-lg ecpauth:transition-all ecpauth:active:scale-[0.98]", isSuspending
82
+ ? "ecpauth:bg-amber-600! ecpauth:hover:bg-amber-700! ecpauth:shadow-amber-600/20"
83
+ : "ecpauth:bg-blue-600! ecpauth:hover:bg-blue-700! ecpauth:shadow-blue-600/20") }, isPending
84
+ ? isSuspending
85
+ ? "Suspending..."
86
+ : "Unsuspending..."
87
+ : isSuspending
88
+ ? "Confirm Suspension"
89
+ : "Confirm Unsuspension")))))));
98
90
  }
@@ -37,5 +37,5 @@ exports.Input = Input;
37
37
  const React = __importStar(require("react"));
38
38
  const utils_1 = require("../../lib/utils");
39
39
  function Input({ className, type, ...props }) {
40
- return (React.createElement("input", { type: type, "data-slot": "input", className: (0, utils_1.cn)("ecpauth:file:text-stone-950 ecpauth:placeholder:text-stone-500 ecpauth:selection:bg-stone-900 ecpauth:selection:text-stone-50 ecpauth:border-stone-200 ecpauth:flex ecpauth:h-9 ecpauth:w-full ecpauth:min-w-0 ecpauth:rounded-md ecpauth:border ecpauth:bg-transparent ecpauth:px-3 ecpauth:py-1 ecpauth:text-base ecpauth:shadow-xs ecpauth:transition-[color,box-shadow] ecpauth:outline-none ecpauth:file:inline-flex ecpauth:file:h-7 ecpauth:file:border-0 ecpauth:file:bg-transparent ecpauth:file:text-sm ecpauth:file:font-medium ecpauth:disabled:pointer-events-none ecpauth:disabled:cursor-not-allowed ecpauth:disabled:opacity-50 ecpauth:md:text-sm ecpauth:dark:file:text-stone-50 ecpauth:dark:placeholder:text-stone-400 ecpauth:dark:selection:bg-stone-50 ecpauth:dark:selection:text-stone-900 ecpauth:dark:bg-gray-700/50 ecpauth:dark:border-gray-600", "ecpauth:focus-visible:border-stone-950 ecpauth:focus-visible:ring-stone-950/50 ecpauth:focus-visible:ring-[3px] ecpauth:dark:focus-visible:border-stone-300 ecpauth:dark:focus-visible:ring-stone-300/50", "ecpauth:aria-invalid:ring-red-500/20 ecpauth:dark:aria-invalid:ring-red-500/40 ecpauth:aria-invalid:border-red-500 ecpauth:dark:dark:aria-invalid:ring-red-900/40 ecpauth:dark:aria-invalid:border-red-900 ecpauth:focus-visible:ring-2 ecpauth:focus-visible:ring-gray-500", className), ...props }));
40
+ return (React.createElement("input", { type: type, "data-slot": "input", className: (0, utils_1.cn)("ecpauth:file:text-stone-950 ecpauth:placeholder:text-stone-500 ecpauth:selection:bg-stone-900 ecpauth:selection:text-stone-50 ecpauth:border-stone-200 ecpauth:flex ecpauth:h-9 ecpauth:w-full ecpauth:min-w-0 ecpauth:rounded-md ecpauth:border ecpauth:bg-transparent ecpauth:px-3 ecpauth:py-1 ecpauth:text-base ecpauth:shadow-xs ecpauth:transition-[color,box-shadow] ecpauth:outline-none ecpauth:file:inline-flex ecpauth:file:h-7 ecpauth:file:border-0 ecpauth:file:bg-transparent ecpauth:file:text-sm ecpauth:file:font-medium ecpauth:disabled:pointer-events-none ecpauth:disabled:cursor-not-allowed ecpauth:disabled:opacity-50 ecpauth:md:text-sm ecpauth:dark:file:text-stone-50 ecpauth:dark:placeholder:text-stone-400 ecpauth:dark:selection:bg-stone-50 ecpauth:dark:selection:text-stone-900 ecpauth:dark:bg-gray-700/50 ecpauth:dark:border-gray-600", "ecpauth:focus-visible:border-stone-950 ecpauth:focus-visible:ring-stone-950/50 ecpauth:focus-visible:ring-[3px] ecpauth:dark:focus-visible:border-stone-300 ecpauth:dark:focus-visible:ring-stone-300/50", "ecpauth:aria-invalid:ring-red-500/20 ecpauth:dark:aria-invalid:ring-red-500/40 ecpauth:aria-invalid:border-red-500 ecpauth:dark:dark:aria-invalid:ring-red-900/40 ecpauth:dark:aria-invalid:border-red-900 ecpauth:focus-visible:ring-2 ecpauth:focus-visible:ring-gray-500", "ecpauth:h-11 ecpauth:border-blue-200! ecpauth:focus-visible:ring-blue-500! ecpauth:focus-visible:border-blue-500! ecpauth:placeholder:text-gray-400! ecpauth:rounded-2xl!", className), ...props }));
41
41
  }
@@ -42,7 +42,10 @@ const settings_1 = require("./settings");
42
42
  const setting_1 = require("./icons/setting");
43
43
  const lock_1 = require("./icons/lock");
44
44
  const logout_1 = require("./icons/logout");
45
- function UserCard({ align = "start", onChangePassword, onToggle2FA, trigger, }) {
45
+ // import type { SetupTOTPProps, SetupTOTPResponse } from "@explita/cloud-otp";
46
+ const chevron_down_1 = require("./icons/chevron-down");
47
+ const user_1 = require("./icons/user");
48
+ function UserCard({ align = "end", onChangePassword, onToggle2FA, trigger, }) {
46
49
  const { logout, user } = (0, auth_provider_1.useAuth)();
47
50
  const [passwordOpen, setPasswordOpen] = (0, react_1.useState)(false);
48
51
  const [settingsOpen, setSettingsOpen] = (0, react_1.useState)(false);
@@ -50,31 +53,53 @@ function UserCard({ align = "start", onChangePassword, onToggle2FA, trigger, })
50
53
  react_1.default.createElement(change_password_1.ChangePassword, { open: passwordOpen, onOpenChange: setPasswordOpen, onSubmit: onChangePassword }),
51
54
  react_1.default.createElement(settings_1.Settings, { open: settingsOpen, onOpenChange: setSettingsOpen, onToggle2FA: onToggle2FA }),
52
55
  react_1.default.createElement(dropdown_menu_1.DropdownMenu, null,
53
- trigger ? (react_1.default.createElement(dropdown_menu_1.DropdownMenuTrigger, null, trigger)) : (react_1.default.createElement(Trigger, null)),
54
- react_1.default.createElement(dropdown_menu_1.DropdownMenuContent, { className: "ecpauth:w-56 ecpauth:border-gray-200 ecpauth:dark:border-gray-800", align: align },
55
- react_1.default.createElement("div", { className: "ecpauth:flex ecpauth:flex-col ecpauth:items-center ecpauth:justify-center ecpauth:py-4" },
56
- react_1.default.createElement("h2", { className: "ecpauth:text-lg ecpauth:font-semibold" }, `${user?.fullName}`),
57
- react_1.default.createElement("p", { className: "ecpauth:text-sm ecpauth:text-muted-foreground" }, user?.role?.label ?? "-Global-")),
58
- react_1.default.createElement(dropdown_menu_1.DropdownMenuSeparator, null),
59
- react_1.default.createElement(dropdown_menu_1.DropdownMenuItem, { onClick: () => setSettingsOpen(true) },
60
- react_1.default.createElement(setting_1.SettingIcon, null),
61
- "Settings"),
62
- react_1.default.createElement(dropdown_menu_1.DropdownMenuItem, { onClick: () => setPasswordOpen(true) },
63
- react_1.default.createElement(lock_1.LockIcon, null),
64
- "Change Password"),
65
- react_1.default.createElement(dropdown_menu_1.DropdownMenuSeparator, null),
66
- react_1.default.createElement(dropdown_menu_1.DropdownMenuItem, { onClick: () => logout() },
67
- react_1.default.createElement(logout_1.LogoutIcon, null),
68
- "Logout")))));
56
+ trigger ? (react_1.default.createElement(dropdown_menu_1.DropdownMenuTrigger, { asChild: true }, trigger)) : (react_1.default.createElement(Trigger, null)),
57
+ react_1.default.createElement(dropdown_menu_1.DropdownMenuContent, { className: "ecpauth:w-64 ecpauth:p-0! ecpauth:overflow-hidden ecpauth:border-gray-200 ecpauth:dark:border-gray-800 ecpauth:shadow-xl ecpauth:rounded-xl", align: align },
58
+ react_1.default.createElement("div", { className: "ecpauth:relative ecpauth:flex ecpauth:flex-col ecpauth:items-center ecpauth:pt-10 ecpauth:pb-6 ecpauth:px-4" },
59
+ react_1.default.createElement("div", { className: "ecpauth:absolute ecpauth:top-0 ecpauth:left-0 ecpauth:right-0 ecpauth:h-20 ecpauth:bg-gradient-to-br ecpauth:from-blue-600 ecpauth:to-blue-400 ecpauth:opacity-10" }),
60
+ react_1.default.createElement("div", { className: "ecpauth:relative ecpauth:z-10" },
61
+ react_1.default.createElement(UserAvatar, { user: user, size: "lg" }),
62
+ react_1.default.createElement("div", { className: "ecpauth:absolute ecpauth:bottom-0 ecpauth:right-0 ecpauth:size-4 ecpauth:bg-green-500 ecpauth:border-2 ecpauth:border-white ecpauth:dark:border-gray-900 ecpauth:rounded-full" })),
63
+ react_1.default.createElement("div", { className: "ecpauth:mt-3 ecpauth:text-center ecpauth:z-10" },
64
+ react_1.default.createElement("h2", { className: "ecpauth:text-base ecpauth:font-bold ecpauth:text-gray-900 ecpauth:dark:text-white ecpauth:leading-tight" }, user?.fullName),
65
+ react_1.default.createElement("p", { className: "ecpauth:text-xs ecpauth:text-gray-500 ecpauth:dark:text-gray-400 ecpauth:mt-0.5" }, user?.email)),
66
+ react_1.default.createElement("div", { className: "ecpauth:mt-3 ecpauth:px-2.5 ecpauth:py-0.5 ecpauth:bg-blue-100 ecpauth:dark:bg-blue-900/30 ecpauth:text-blue-600 ecpauth:dark:text-blue-400 ecpauth:rounded-full ecpauth:text-[10px] ecpauth:font-bold ecpauth:uppercase ecpauth:tracking-wider ecpauth:z-10" }, user?.role?.label ?? "-Global-")),
67
+ react_1.default.createElement(dropdown_menu_1.DropdownMenuSeparator, { className: "ecpauth:m-0" }),
68
+ react_1.default.createElement("div", { className: "ecpauth:p-1.5" },
69
+ react_1.default.createElement(dropdown_menu_1.DropdownMenuItem, { onClick: () => setSettingsOpen(true), className: "ecpauth:flex ecpauth:items-center ecpauth:gap-2.5 ecpauth:px-3 ecpauth:py-2 ecpauth:rounded-lg ecpauth:transition-colors ecpauth:cursor-pointer ecpauth:text-sm ecpauth:font-medium ecpauth:text-gray-700 ecpauth:dark:text-gray-200 ecpauth:hover:bg-gray-100 ecpauth:dark:hover:bg-white/10" },
70
+ react_1.default.createElement("div", { className: "ecpauth:size-8 ecpauth:rounded-md ecpauth:bg-gray-100 ecpauth:dark:bg-white/5 ecpauth:flex ecpauth:items-center ecpauth:justify-center" },
71
+ react_1.default.createElement(setting_1.SettingIcon, { size: 18 })),
72
+ "Settings"),
73
+ react_1.default.createElement(dropdown_menu_1.DropdownMenuItem, { onClick: () => setPasswordOpen(true), className: "ecpauth:flex ecpauth:items-center ecpauth:gap-2.5 ecpauth:px-3 ecpauth:py-2 ecpauth:rounded-lg ecpauth:transition-colors ecpauth:cursor-pointer ecpauth:text-sm ecpauth:font-medium ecpauth:text-gray-700 ecpauth:dark:text-gray-200 ecpauth:hover:bg-gray-100 ecpauth:dark:hover:bg-white/10" },
74
+ react_1.default.createElement("div", { className: "ecpauth:size-8 ecpauth:rounded-md ecpauth:bg-gray-100 ecpauth:dark:bg-white/5 ecpauth:flex ecpauth:items-center ecpauth:justify-center" },
75
+ react_1.default.createElement(lock_1.LockIcon, { size: 18 })),
76
+ "Change Password")),
77
+ react_1.default.createElement(dropdown_menu_1.DropdownMenuSeparator, { className: "ecpauth:mx-1.5" }),
78
+ react_1.default.createElement("div", { className: "ecpauth:p-1.5" },
79
+ react_1.default.createElement(dropdown_menu_1.DropdownMenuItem, { onClick: () => logout(), className: "ecpauth:flex ecpauth:items-center ecpauth:gap-2.5 ecpauth:px-3 ecpauth:py-2 ecpauth:rounded-lg ecpauth:transition-colors ecpauth:cursor-pointer ecpauth:text-sm ecpauth:font-medium ecpauth:text-red-600 ecpauth:dark:text-red-400 ecpauth:hover:bg-red-50 ecpauth:dark:hover:bg-red-900/10" },
80
+ react_1.default.createElement("div", { className: "ecpauth:size-8 ecpauth:rounded-md ecpauth:bg-red-50 ecpauth:dark:bg-red-900/10 ecpauth:flex ecpauth:items-center ecpauth:justify-center" },
81
+ react_1.default.createElement(logout_1.LogoutIcon, { size: 18 })),
82
+ "Logout"))))));
69
83
  }
70
84
  function Trigger() {
71
- const { user, authLoading } = (0, auth_provider_1.useAuth)();
72
- return (react_1.default.createElement(dropdown_menu_1.DropdownMenuTrigger, { className: "ecpauth:flex ecpauth:items-center ecpauth:gap-2 ecpauth:p-1 ecpauth:pe-4 ecpauth:rounded-lg ecpauth:border ecpauth:border-gray-200 ecpauth:dark:border-gray-800 ecpauth:cursor-pointer ecpauth:bg-white ecpauth:hover:bg-gray-100 ecpauth:dark:bg-gray-800 ecpauth:dark:hover:bg-gray-800/80 ecpauth:dark:hover:text-white ecpauth:outline-none ecpauth:focus:outline-none" }, authLoading ? ("Please wait...") : (react_1.default.createElement(react_1.default.Fragment, null,
73
- react_1.default.createElement("div", { className: "ecpauth:size-12 ecpauth:rounded-full ecpauth:bg-gray-200" }),
74
- react_1.default.createElement("div", { className: "ecpauth:flex ecpauth:flex-col ecpauth:text-left" },
75
- react_1.default.createElement("span", { className: "ecpauth:font-semibold ecpauth:text-stone-800 ecpauth:dark:text-stone-50" },
85
+ const { user, isLoading } = (0, auth_provider_1.useAuth)();
86
+ return (react_1.default.createElement(dropdown_menu_1.DropdownMenuTrigger, { className: "ecpauth:group ecpauth:flex ecpauth:items-center ecpauth:gap-3 ecpauth:p-1.5 ecpauth:pe-4 ecpauth:rounded-xl ecpauth:border ecpauth:border-gray-200 ecpauth:dark:border-gray-800 ecpauth:cursor-pointer ecpauth:bg-white ecpauth:hover:bg-gray-50 ecpauth:dark:bg-gray-900 ecpauth:dark:hover:bg-gray-800/50 ecpauth:transition-all ecpauth:duration-200 ecpauth:shadow-sm ecpauth:hover:shadow-md ecpauth:outline-none ecpauth:focus:ring-2 ecpauth:focus:ring-blue-500/20" }, isLoading ? (react_1.default.createElement("div", { className: "ecpauth:px-4 ecpauth:py-2 ecpauth:text-sm ecpauth:text-gray-500" }, "Loading profile...")) : (react_1.default.createElement(react_1.default.Fragment, null,
87
+ react_1.default.createElement(UserAvatar, { user: user, size: "md" }),
88
+ react_1.default.createElement("div", { className: "ecpauth:flex ecpauth:flex-col ecpauth:text-left ecpauth:min-w-0" },
89
+ react_1.default.createElement("span", { className: "ecpauth:font-bold ecpauth:text-gray-900 ecpauth:dark:text-white ecpauth:text-sm ecpauth:truncate" },
76
90
  user?.firstName,
77
91
  " ",
78
92
  user?.lastName),
79
- react_1.default.createElement("span", { className: "ecpauth:text-sm ecpauth:text-gray-500" }, user?.email))))));
93
+ react_1.default.createElement("span", { className: "ecpauth:text-xs ecpauth:text-gray-500 ecpauth:truncate" }, user?.email)),
94
+ react_1.default.createElement("div", { className: "ecpauth:ml-1 ecpauth:text-gray-400 ecpauth:group-hover:text-gray-600 ecpauth:dark:group-hover:text-gray-300 ecpauth:transition-colors" },
95
+ react_1.default.createElement(chevron_down_1.ChevronDownIcon, { size: 16 }))))));
96
+ }
97
+ function UserAvatar({ user, size = "md", }) {
98
+ const initials = `${user?.firstName?.[0] ?? ""}${user?.lastName?.[0] ?? ""}`.toUpperCase();
99
+ const sizeClasses = {
100
+ sm: "ecpauth:size-8 ecpauth:text-xs",
101
+ md: "ecpauth:size-10 ecpauth:text-sm",
102
+ lg: "ecpauth:size-16 ecpauth:text-xl",
103
+ };
104
+ return (react_1.default.createElement("div", { className: `ecpauth:relative ecpauth:flex ecpauth:items-center ecpauth:justify-center ecpauth:rounded-full ecpauth:bg-gradient-to-tr ecpauth:from-blue-600 ecpauth:to-blue-400 ecpauth:text-white ecpauth:font-bold ecpauth:shadow-inner ecpauth:border ecpauth:border-blue-700/10 ${sizeClasses[size]}` }, initials ? initials : react_1.default.createElement(user_1.UserIcon, { size: size === "lg" ? 32 : 20 })));
80
105
  }
@@ -193,7 +193,7 @@ function AuthProvider({ children, config }) {
193
193
  !disableLoading && loading && react_1.default.createElement(loader_1.Loader, null),
194
194
  react_1.default.createElement(AuthContext.Provider, { value: {
195
195
  user,
196
- authLoading: loading,
196
+ isLoading: loading,
197
197
  isAuthenticated,
198
198
  error,
199
199
  computedRouteContext,
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export * from "./contexts/auth-provider";
2
2
  export * from "./components/message";
3
3
  export { buildRouteContext, getClientToken as getToken, hasPermission, } from "./lib/utils";
4
- export type { AuthConfig, User, Role, Status, NewRole, UpdateUser, GeneralResponse, FormResponse, VerifyUser, VerifyUserResponse, ResetPasswordWithToken, ResetPasswordWithUserId, CreateUser, Login, } from "./types";
4
+ export type { AuthConfig, User, Role, Status, NewRole, UpdateUser, GeneralResponse, FormResponse, VerifyUser, VerifyUserResponse, ResetPasswordWithToken, ResetPasswordWithUserId, CreateUser, CreateServiceSub, Login, } from "./types";
package/dist/lib/utils.js CHANGED
@@ -62,7 +62,13 @@ function buildRouteContext(config, currentPath = "") {
62
62
  console.warn("Invalid resetPasswordUrl:", e.message);
63
63
  }
64
64
  const normalizedCurrentPath = normalize(currentPath);
65
- const isExcluded = excludedPaths.includes(normalizedCurrentPath);
65
+ // const isExcluded = excludedPaths.includes(normalizedCurrentPath);
66
+ const isExcluded = excludedPaths.some((item) => {
67
+ if (item.endsWith("*")) {
68
+ return normalizedCurrentPath.startsWith(item.slice(0, -1));
69
+ }
70
+ return item === normalizedCurrentPath;
71
+ });
66
72
  const returnPathRaw = typeof window !== "undefined"
67
73
  ? `${window.location.pathname}${window.location.search}`
68
74
  : currentPath;
@@ -1,8 +1,10 @@
1
- import { VerifyUser, VerifyUserResponse, CreateUser, UpdateUser, User, GeneralResponse, FormResponse, QueryOpts } from "../types";
1
+ import { VerifyUser, VerifyUserResponse, CreateUser, UpdateUser, User, GeneralResponse, FormResponse, QueryOpts, CreateServiceSub } from "../types";
2
2
  export declare function verifyUser(data: VerifyUser): Promise<VerifyUserResponse>;
3
+ export declare function validateUserData(data: Omit<CreateUser, "groupId">): Promise<FormResponse<Omit<CreateUser, "groupId">>>;
3
4
  export declare function createUser(data: CreateUser, options?: {
4
5
  isSuperAdmin?: boolean;
5
6
  }): Promise<FormResponse<User>>;
7
+ export declare function createServiceSub(data: CreateServiceSub): Promise<FormResponse<User>>;
6
8
  export declare function updateUser(userId: string, data: UpdateUser): Promise<FormResponse<User>>;
7
9
  export declare function getUsers(options?: QueryOpts): Promise<User[]>;
8
10
  export declare function getUserById(userId: string): Promise<User | null>;
@@ -2,7 +2,9 @@
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.verifyUser = verifyUser;
5
+ exports.validateUserData = validateUserData;
5
6
  exports.createUser = createUser;
7
+ exports.createServiceSub = createServiceSub;
6
8
  exports.updateUser = updateUser;
7
9
  exports.getUsers = getUsers;
8
10
  exports.getUserById = getUserById;
@@ -23,6 +25,20 @@ async function verifyUser(data) {
23
25
  return error;
24
26
  }
25
27
  }
28
+ async function validateUserData(data) {
29
+ try {
30
+ const res = await (0, api_1.apiFactory)("/users/validate", {
31
+ body: { ...data },
32
+ });
33
+ return res;
34
+ }
35
+ catch (error) {
36
+ if ((0, error_1.isAPIError)(error)) {
37
+ return error.data;
38
+ }
39
+ return { message: (0, utils_1.parseMessage)(error.message), status: "failure" };
40
+ }
41
+ }
26
42
  async function createUser(data, options) {
27
43
  try {
28
44
  if (typeof window !== "undefined") {
@@ -43,6 +59,23 @@ async function createUser(data, options) {
43
59
  };
44
60
  }
45
61
  }
62
+ async function createServiceSub(data) {
63
+ try {
64
+ const res = await (0, api_1.apiFactory)(`/service-sub/${data.userId}`, {
65
+ body: { ...data },
66
+ });
67
+ return res;
68
+ }
69
+ catch (error) {
70
+ if ((0, error_1.isAPIError)(error)) {
71
+ return error.data;
72
+ }
73
+ return {
74
+ message: (0, utils_1.parseMessage)(error.message),
75
+ status: "failure",
76
+ };
77
+ }
78
+ }
46
79
  async function updateUser(userId, data) {
47
80
  try {
48
81
  if (typeof window !== "undefined") {