@explita/cloud-auth-client 0.1.0 → 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.
- package/dist/components/change-password.js +58 -75
- package/dist/components/icons/alert-circle.d.ts +5 -0
- package/dist/components/icons/alert-circle.js +13 -0
- package/dist/components/icons/chevron-down.d.ts +5 -0
- package/dist/components/icons/chevron-down.js +11 -0
- package/dist/components/icons/lock.d.ts +2 -1
- package/dist/components/icons/lock.js +2 -2
- package/dist/components/icons/logout.d.ts +2 -1
- package/dist/components/icons/logout.js +2 -2
- package/dist/components/icons/setting.d.ts +2 -1
- package/dist/components/icons/setting.js +2 -2
- package/dist/components/icons/shield.d.ts +5 -0
- package/dist/components/icons/shield.js +11 -0
- package/dist/components/icons/user.d.ts +5 -0
- package/dist/components/icons/user.js +12 -0
- package/dist/components/login-form.d.ts +3 -1
- package/dist/components/login-form.js +45 -34
- package/dist/components/reset-password.d.ts +2 -1
- package/dist/components/reset-password.js +62 -60
- package/dist/components/settings.js +16 -8
- package/dist/components/signup-form.d.ts +4 -3
- package/dist/components/signup-form.js +72 -60
- package/dist/components/toggle-2fa.js +42 -26
- package/dist/components/toggle-account-status.js +55 -64
- package/dist/components/ui/input.js +1 -1
- package/dist/components/user-card.js +48 -23
- package/dist/contexts/auth-provider.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/lib/utils.js +7 -1
- package/dist/server/user.d.ts +3 -1
- package/dist/server/user.js +33 -0
- package/dist/styles.css +901 -61
- package/dist/types.d.ts +21 -7
- package/package.json +2 -2
|
@@ -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
|
-
|
|
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,
|
|
54
|
-
react_1.default.createElement(dropdown_menu_1.DropdownMenuContent, { className: "ecpauth:w-
|
|
55
|
-
react_1.default.createElement("div", { className: "ecpauth:flex ecpauth:flex-col ecpauth:items-center ecpauth:
|
|
56
|
-
react_1.default.createElement("
|
|
57
|
-
react_1.default.createElement("
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
react_1.default.createElement(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
react_1.default.createElement(
|
|
64
|
-
|
|
65
|
-
react_1.default.createElement(
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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,
|
|
72
|
-
return (react_1.default.createElement(dropdown_menu_1.DropdownMenuTrigger, { className: "ecpauth:flex ecpauth:items-center ecpauth:gap-
|
|
73
|
-
react_1.default.createElement(
|
|
74
|
-
react_1.default.createElement("div", { className: "ecpauth:flex ecpauth:flex-col ecpauth:text-left" },
|
|
75
|
-
react_1.default.createElement("span", { className: "ecpauth:font-
|
|
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-
|
|
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
|
-
|
|
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;
|
package/dist/server/user.d.ts
CHANGED
|
@@ -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>;
|
package/dist/server/user.js
CHANGED
|
@@ -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") {
|