@explita/cloud-auth-client 0.1.1 → 0.1.2

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 (34) 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/reset-password.d.ts +2 -1
  19. package/dist/components/reset-password.js +62 -60
  20. package/dist/components/settings.js +16 -8
  21. package/dist/components/signup-form.d.ts +4 -3
  22. package/dist/components/signup-form.js +72 -60
  23. package/dist/components/toggle-2fa.js +42 -26
  24. package/dist/components/toggle-account-status.js +55 -64
  25. package/dist/components/ui/input.js +1 -1
  26. package/dist/components/user-card.js +48 -23
  27. package/dist/contexts/auth-provider.js +1 -1
  28. package/dist/index.d.ts +1 -1
  29. package/dist/lib/utils.js +7 -1
  30. package/dist/server/user.d.ts +3 -1
  31. package/dist/server/user.js +33 -0
  32. package/dist/styles.css +901 -61
  33. package/dist/types.d.ts +21 -7
  34. package/package.json +1 -1
@@ -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") {