@ciscode/ui-authentication-kit 1.0.0
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/LICENSE +20 -0
- package/README.md +44 -0
- package/dist/components/InlineError.d.ts +8 -0
- package/dist/components/InlineError.d.ts.map +1 -0
- package/dist/components/InlineError.js +31 -0
- package/dist/components/InlineError.js.map +1 -0
- package/dist/components/ProfilePage.d.ts +3 -0
- package/dist/components/ProfilePage.d.ts.map +1 -0
- package/dist/components/ProfilePage.js +151 -0
- package/dist/components/ProfilePage.js.map +1 -0
- package/dist/components/RequirePermissions.d.ts +15 -0
- package/dist/components/RequirePermissions.d.ts.map +1 -0
- package/dist/components/RequirePermissions.js +20 -0
- package/dist/components/RequirePermissions.js.map +1 -0
- package/dist/components/SessionExpiredModal.d.ts +7 -0
- package/dist/components/SessionExpiredModal.d.ts.map +1 -0
- package/dist/components/SessionExpiredModal.js +26 -0
- package/dist/components/SessionExpiredModal.js.map +1 -0
- package/dist/components/actions/InputField.d.ts +10 -0
- package/dist/components/actions/InputField.d.ts.map +1 -0
- package/dist/components/actions/InputField.js +22 -0
- package/dist/components/actions/InputField.js.map +1 -0
- package/dist/components/actions/SocialButton.d.ts +4 -0
- package/dist/components/actions/SocialButton.d.ts.map +1 -0
- package/dist/components/actions/SocialButton.js +10 -0
- package/dist/components/actions/SocialButton.js.map +1 -0
- package/dist/context/AuthConfigContext.d.ts +12 -0
- package/dist/context/AuthConfigContext.d.ts.map +1 -0
- package/dist/context/AuthConfigContext.js +18 -0
- package/dist/context/AuthConfigContext.js.map +1 -0
- package/dist/context/AuthStateContext.d.ts +17 -0
- package/dist/context/AuthStateContext.d.ts.map +1 -0
- package/dist/context/AuthStateContext.js +9 -0
- package/dist/context/AuthStateContext.js.map +1 -0
- package/dist/context/RbacContext.d.ts +12 -0
- package/dist/context/RbacContext.d.ts.map +1 -0
- package/dist/context/RbacContext.js +21 -0
- package/dist/context/RbacContext.js.map +1 -0
- package/dist/hooks/useAbility.d.ts +8 -0
- package/dist/hooks/useAbility.d.ts.map +1 -0
- package/dist/hooks/useAbility.js +24 -0
- package/dist/hooks/useAbility.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2596 -0
- package/dist/index.umd.js +49 -0
- package/dist/main/app.d.ts +6 -0
- package/dist/main/app.d.ts.map +1 -0
- package/dist/main/app.js +7 -0
- package/dist/main/app.js.map +1 -0
- package/dist/models/AuthConfig.d.ts +17 -0
- package/dist/models/AuthConfig.d.ts.map +1 -0
- package/dist/models/AuthConfig.js +2 -0
- package/dist/models/AuthConfig.js.map +1 -0
- package/dist/models/ColorTheme.d.ts +8 -0
- package/dist/models/ColorTheme.d.ts.map +1 -0
- package/dist/models/ColorTheme.js +2 -0
- package/dist/models/ColorTheme.js.map +1 -0
- package/dist/models/Type.d.ts +13 -0
- package/dist/models/Type.d.ts.map +1 -0
- package/dist/models/Type.js +2 -0
- package/dist/models/Type.js.map +1 -0
- package/dist/models/User.d.ts +15 -0
- package/dist/models/User.d.ts.map +1 -0
- package/dist/models/User.js +2 -0
- package/dist/models/User.js.map +1 -0
- package/dist/pages/auth/GoogleCallbackPage.d.ts +3 -0
- package/dist/pages/auth/GoogleCallbackPage.d.ts.map +1 -0
- package/dist/pages/auth/GoogleCallbackPage.js +20 -0
- package/dist/pages/auth/GoogleCallbackPage.js.map +1 -0
- package/dist/pages/auth/SignInPage.d.ts +4 -0
- package/dist/pages/auth/SignInPage.d.ts.map +1 -0
- package/dist/pages/auth/SignInPage.js +152 -0
- package/dist/pages/auth/SignInPage.js.map +1 -0
- package/dist/pages/auth/SignUpPage.d.ts +3 -0
- package/dist/pages/auth/SignUpPage.d.ts.map +1 -0
- package/dist/pages/auth/SignUpPage.js +177 -0
- package/dist/pages/auth/SignUpPage.js.map +1 -0
- package/dist/providers/AuthProvider.d.ts +9 -0
- package/dist/providers/AuthProvider.d.ts.map +1 -0
- package/dist/providers/AuthProvider.js +160 -0
- package/dist/providers/AuthProvider.js.map +1 -0
- package/dist/utils/attachAuthInterceptor.d.ts +12 -0
- package/dist/utils/attachAuthInterceptor.d.ts.map +1 -0
- package/dist/utils/attachAuthInterceptor.js +73 -0
- package/dist/utils/attachAuthInterceptor.js.map +1 -0
- package/dist/utils/colorHelpers.d.ts +32 -0
- package/dist/utils/colorHelpers.d.ts.map +1 -0
- package/dist/utils/colorHelpers.js +44 -0
- package/dist/utils/colorHelpers.js.map +1 -0
- package/dist/utils/jwtHelpers.d.ts +3 -0
- package/dist/utils/jwtHelpers.d.ts.map +1 -0
- package/dist/utils/jwtHelpers.js +14 -0
- package/dist/utils/jwtHelpers.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignInPage.js","sourceRoot":"","sources":["../../../src/pages/auth/SignInPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignUpPage.d.ts","sourceRoot":"","sources":["../../../src/pages/auth/SignUpPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAYxC,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAmT9B,CAAC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import React, { useState } from "react";
|
|
11
|
+
import { InputField } from "../../components/actions/InputField";
|
|
12
|
+
import { SocialButton } from "../../components/actions/SocialButton";
|
|
13
|
+
import googleIcon from "../../assets/icons/google-icon-svgrepo-com.svg";
|
|
14
|
+
import microsoftIcon from "../../assets/icons/microsoft-svgrepo-com.svg";
|
|
15
|
+
import { toTailwindColorClasses } from "../../utils/colorHelpers";
|
|
16
|
+
import { useAuthConfig } from "../../context/AuthConfigContext";
|
|
17
|
+
import { useAuthState } from "../../context/AuthStateContext";
|
|
18
|
+
import { InlineError } from "../../components/InlineError";
|
|
19
|
+
import { useT } from "@ciscode/ui-translate-core";
|
|
20
|
+
import { useNavigate, useLocation } from "react-router";
|
|
21
|
+
export const SignUpPage = () => {
|
|
22
|
+
const t = useT("authLib");
|
|
23
|
+
const navigate = useNavigate();
|
|
24
|
+
const location = useLocation();
|
|
25
|
+
const { brandName = t("brandName", { defaultValue: "MyBrand" }), colors = { bg: "bg-sky-500", text: "text-white", border: "border-sky-500" }, logoUrl, oauthProviders = [], illustrationUrl = t("community.illustrationUrl", {
|
|
26
|
+
defaultValue: "https://cdn.builder.io/api/v1/image/assets/TEMP/35ba84b8335fda2819c3a14ea3d00321a0fd0e79e571caa31108468010868ca5?placeholderIfAbsent=true&apiKey=a460e9a46e514356ac1106eada03046c",
|
|
27
|
+
}), communityContent = {
|
|
28
|
+
title: t("community.title"),
|
|
29
|
+
description: t("community.description"),
|
|
30
|
+
}, baseUrl, // IMPORTANT: used for OAuth redirect (same as SignIn)
|
|
31
|
+
} = useAuthConfig();
|
|
32
|
+
const { login, api } = useAuthState();
|
|
33
|
+
const [name, setName] = useState("");
|
|
34
|
+
const [email, setEmail] = useState("");
|
|
35
|
+
const [password, setPassword] = useState("");
|
|
36
|
+
const [pending, setPending] = useState(false);
|
|
37
|
+
const [error, setError] = useState(null);
|
|
38
|
+
const allProvidersData = {
|
|
39
|
+
google: { icon: googleIcon, label: "social.google" },
|
|
40
|
+
microsoft: { icon: microsoftIcon, label: "social.microsoft" },
|
|
41
|
+
};
|
|
42
|
+
const providerButtons = oauthProviders
|
|
43
|
+
.filter((p) => p in allProvidersData)
|
|
44
|
+
.map((p) => ({
|
|
45
|
+
id: p,
|
|
46
|
+
icon: allProvidersData[p].icon,
|
|
47
|
+
label: allProvidersData[p].label,
|
|
48
|
+
}));
|
|
49
|
+
const { bgClass, textClass, borderClass } = toTailwindColorClasses(colors);
|
|
50
|
+
const gradientClass = `${bgClass} bg-gradient-to-r from-white/10 via-white/0 to-white/0`;
|
|
51
|
+
function handleSubmit(e) {
|
|
52
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
+
var _a, _b, _c;
|
|
54
|
+
e.preventDefault();
|
|
55
|
+
if (pending)
|
|
56
|
+
return;
|
|
57
|
+
setError(null);
|
|
58
|
+
setPending(true);
|
|
59
|
+
try {
|
|
60
|
+
// 1) Register the client
|
|
61
|
+
yield api.post("/auth/clients/register", {
|
|
62
|
+
email,
|
|
63
|
+
password,
|
|
64
|
+
name: name || undefined,
|
|
65
|
+
});
|
|
66
|
+
// 2) Auto-login after successful registration
|
|
67
|
+
yield login({ email, password });
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
const status = (_a = err === null || err === void 0 ? void 0 : err.response) === null || _a === void 0 ? void 0 : _a.status;
|
|
71
|
+
if (status === 400) {
|
|
72
|
+
setError(((_c = (_b = err === null || err === void 0 ? void 0 : err.response) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.message) ||
|
|
73
|
+
t("errors.invalidData", {
|
|
74
|
+
defaultValue: "Please check the fields and try again.",
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
else if (status === 409) {
|
|
78
|
+
setError(t("errors.emailInUse", {
|
|
79
|
+
defaultValue: "This email is already in use.",
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
setError(t("errors.generic", {
|
|
84
|
+
defaultValue: "Something went wrong. Please try again.",
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
setPending(false);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function handleProviderClick(providerId) {
|
|
94
|
+
var _a, _b, _c;
|
|
95
|
+
if (!baseUrl) {
|
|
96
|
+
console.error("Auth baseUrl is not configured.");
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Where to go AFTER successful OAuth login.
|
|
100
|
+
const from = ((_b = (_a = location.state) === null || _a === void 0 ? void 0 : _a.from) === null || _b === void 0 ? void 0 : _b.pathname) ||
|
|
101
|
+
((_c = location.state) === null || _c === void 0 ? void 0 : _c.from) ||
|
|
102
|
+
"/";
|
|
103
|
+
// Save post-login redirect so callback route can restore it.
|
|
104
|
+
sessionStorage.setItem("postLoginRedirect", from);
|
|
105
|
+
if (providerId === "google") {
|
|
106
|
+
const callbackPath = "/oauth/google/callback";
|
|
107
|
+
const callbackUrl = `${window.location.origin}${callbackPath}`;
|
|
108
|
+
const url = new URL(`${baseUrl}/auth/google`);
|
|
109
|
+
url.searchParams.set("redirect", callbackUrl);
|
|
110
|
+
window.location.href = url.toString();
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (providerId === "microsoft") {
|
|
114
|
+
const callbackPath = "/oauth/microsoft/callback";
|
|
115
|
+
const callbackUrl = `${window.location.origin}${callbackPath}`;
|
|
116
|
+
const url = new URL(`${baseUrl}/auth/microsoft`);
|
|
117
|
+
url.searchParams.set("redirect", callbackUrl);
|
|
118
|
+
window.location.href = url.toString();
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const spinner = (React.createElement("svg", { className: "h-4 w-4 animate-spin stroke-current", viewBox: "0 0 24 24", fill: "none" },
|
|
123
|
+
React.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", strokeWidth: "4" }),
|
|
124
|
+
React.createElement("path", { className: "opacity-75", d: "M4 12a8 8 0 018-8", strokeWidth: "4", strokeLinecap: "round" })));
|
|
125
|
+
return (React.createElement("div", { className: `flex items-center justify-center min-h-screen p-4 ${gradientClass}` },
|
|
126
|
+
React.createElement("div", { className: "flex w-full max-w-5xl bg-white rounded-2xl shadow-2xl overflow-hidden" },
|
|
127
|
+
React.createElement("div", { className: `hidden md:flex md:w-1/2 p-12 flex-col justify-between text-white ${bgClass}` },
|
|
128
|
+
React.createElement("div", null, logoUrl ? (React.createElement("div", { className: "flex items-center gap-4" },
|
|
129
|
+
React.createElement("img", { loading: "lazy", src: logoUrl, alt: "Brand Logo", className: "bg-white h-8 md:h-22 rounded-lg" }),
|
|
130
|
+
React.createElement("h2", { className: "text-sm md:text-2xl font-bold uppercase" }, brandName))) : (React.createElement("h2", { className: "text-sm md:text-2xl font-bold" }, brandName))),
|
|
131
|
+
React.createElement("div", { className: "flex-1 space-y-4 mt-6 py-4" },
|
|
132
|
+
React.createElement("h3", { className: "text-2xl font-semibold leading-tight" }, communityContent.title),
|
|
133
|
+
React.createElement("p", { className: "text-base leading-relaxed opacity-90 ltr:text-left rtl:text-right" }, communityContent.description),
|
|
134
|
+
React.createElement("div", { className: "relative" },
|
|
135
|
+
React.createElement("div", { className: "absolute -left-4 -top-4 w-20 h-20 bg-white/20 rounded-full blur-xl" }),
|
|
136
|
+
React.createElement("div", { className: "absolute -right-4 -bottom-4 w-20 h-20 bg-white/20 rounded-full blur-xl" }),
|
|
137
|
+
React.createElement("img", { loading: "lazy", src: illustrationUrl, alt: "Sign up illustration", className: "max-w-sm w-full mx-auto rounded-lg shadow-lg transform hover:scale-105 transition-transform duration-300 p-6" })))),
|
|
138
|
+
React.createElement("div", { className: "w-full md:w-1/2 p-4 md:p-8 m-auto" },
|
|
139
|
+
React.createElement("div", { className: "flex flex-col md:flex-row justify-between items-center mb-8" },
|
|
140
|
+
React.createElement("div", { className: "flex items-center justify-center md:hidden mb-5" }, logoUrl ? (React.createElement("img", { loading: "lazy", src: logoUrl, alt: "Brand Logo", className: `h-22 rounded-full border ${borderClass}` })) : (React.createElement("h2", { className: "text-2xl font-bold" }, brandName))),
|
|
141
|
+
React.createElement("div", { className: "w-full md:w-auto mb-4 md:mb-0 text-center md:text-left ltr:text-center rtl:text-center md:ltr:text-left md:rtl:text-right" },
|
|
142
|
+
React.createElement("p", { className: "text-sm md:text-lg" },
|
|
143
|
+
t("SignUpPage.welcome", { defaultValue: "Join" }),
|
|
144
|
+
" ",
|
|
145
|
+
React.createElement("span", { className: `font-semibold ${textClass} uppercase` }, brandName)),
|
|
146
|
+
React.createElement("h1", { className: "text-2xl md:text-4xl font-bold text-gray-800" }, t("SignUpPage.signUp", { defaultValue: "Sign up" }))),
|
|
147
|
+
React.createElement("div", { className: "text-sm text-gray-500 text-center md:text-right" },
|
|
148
|
+
t("SignUpPage.alreadyHaveAccount", {
|
|
149
|
+
defaultValue: "Already have an account?",
|
|
150
|
+
}),
|
|
151
|
+
React.createElement("br", null),
|
|
152
|
+
React.createElement("button", { type: "button", onClick: () => navigate("/login"), className: textClass }, t("SignUpPage.signIn", { defaultValue: "Sign in" })))),
|
|
153
|
+
error && React.createElement(InlineError, { message: error }),
|
|
154
|
+
React.createElement("form", { className: "space-y-6", onSubmit: handleSubmit },
|
|
155
|
+
React.createElement(InputField, { label: t("form.nameLabel", { defaultValue: "Name" }), type: "text", placeholder: t("form.namePlaceholder", {
|
|
156
|
+
defaultValue: "Enter your name",
|
|
157
|
+
}), color: borderClass, value: name, onChange: setName }),
|
|
158
|
+
React.createElement(InputField, { label: t("form.emailLabel"), type: "email", placeholder: t("form.emailPlaceholder"), color: borderClass, value: email, onChange: setEmail }),
|
|
159
|
+
React.createElement(InputField, { label: t("form.passwordLabel"), type: "password", placeholder: t("form.passwordPlaceholder"), color: borderClass, value: password, onChange: setPassword }),
|
|
160
|
+
React.createElement("button", { type: "submit", disabled: pending, className: `relative flex w-full items-center justify-center gap-2 py-3 rounded-lg font-medium transition-colors ${pending ? "opacity-60 cursor-not-allowed" : ""} ${bgClass} text-white` },
|
|
161
|
+
pending && spinner,
|
|
162
|
+
pending
|
|
163
|
+
? t("SignUpPage.signUpSubmitting", {
|
|
164
|
+
defaultValue: "Creating account...",
|
|
165
|
+
})
|
|
166
|
+
: t("SignUpPage.signUp", { defaultValue: "Sign up" })),
|
|
167
|
+
providerButtons.length > 0 && (React.createElement(React.Fragment, null,
|
|
168
|
+
React.createElement("div", { className: "flex items-center pt-2" },
|
|
169
|
+
React.createElement("div", { className: `flex-grow h-px ${bgClass}` }),
|
|
170
|
+
React.createElement("span", { className: `${textClass} mx-3 text-sm` }, t("SignUpPage.orContinueWith", {
|
|
171
|
+
defaultValue: "Or continue with",
|
|
172
|
+
})),
|
|
173
|
+
React.createElement("div", { className: `flex-grow h-px ${bgClass}` })),
|
|
174
|
+
React.createElement("div", { className: "flex gap-3 mb-6 justify-center md:justify-start" }, providerButtons.map((btn) => (React.createElement("button", { key: btn.id, type: "button", onClick: () => handleProviderClick(btn.id), className: "flex-1" },
|
|
175
|
+
React.createElement(SocialButton, { icon: btn.icon, label: btn.label }))))))))))));
|
|
176
|
+
};
|
|
177
|
+
//# sourceMappingURL=SignUpPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignUpPage.js","sourceRoot":"","sources":["../../../src/pages/auth/SignUpPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { AuthConfigProps } from '../models/AuthConfig';
|
|
3
|
+
interface Props {
|
|
4
|
+
config: AuthConfigProps;
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
}
|
|
7
|
+
export declare const AuthProvider: React.FC<Props>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=AuthProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../../src/providers/AuthProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAM5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAW5D,UAAU,KAAK;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAYD,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAwLxC,CAAC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import React, { useEffect, useMemo, useState } from 'react';
|
|
11
|
+
import axios from 'axios';
|
|
12
|
+
import { AuthConfigContext } from '../context/AuthConfigContext';
|
|
13
|
+
import { AuthStateCtx, useAuthState } from '../context/AuthStateContext';
|
|
14
|
+
import { decodeToken } from '../utils/jwtHelpers';
|
|
15
|
+
import { attachAuthInterceptor, resetSessionFlag } from '../utils/attachAuthInterceptor';
|
|
16
|
+
import { SessionExpiredModal } from '../components/SessionExpiredModal';
|
|
17
|
+
import { SignInPage } from '../pages/auth/SignInPage';
|
|
18
|
+
import { SignUpPage } from '../pages/auth/SignUpPage';
|
|
19
|
+
import { Routes, Route, Navigate, useLocation, useNavigate } from "react-router";
|
|
20
|
+
import { GoogleCallbackPage } from "../pages/auth/GoogleCallbackPage";
|
|
21
|
+
/* ---------- tiny in-file route guard ----------------------- */
|
|
22
|
+
const RequireAuth = ({ children }) => {
|
|
23
|
+
const { isAuthenticated } = useAuthState();
|
|
24
|
+
const location = useLocation();
|
|
25
|
+
return isAuthenticated
|
|
26
|
+
? children
|
|
27
|
+
: React.createElement(Navigate, { to: "/login", state: { from: location }, replace: true });
|
|
28
|
+
};
|
|
29
|
+
/* ----------------------------------------------------------- */
|
|
30
|
+
export const AuthProvider = ({ config, children }) => {
|
|
31
|
+
const navigate = useNavigate();
|
|
32
|
+
/* ── state ─────────────────────────────────────────────── */
|
|
33
|
+
const [accessToken, setAccessToken] = useState(() => localStorage.getItem('authToken'));
|
|
34
|
+
const [user, setUser] = useState(null);
|
|
35
|
+
const [booting, setBooting] = useState(true);
|
|
36
|
+
const [expired, setExpired] = useState(false);
|
|
37
|
+
/* ── Google OAuth callback component (inside AuthProvider so it can touch state) ── */
|
|
38
|
+
const GoogleOAuthCallback = () => {
|
|
39
|
+
const location = useLocation();
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
const params = new URLSearchParams(location.search);
|
|
42
|
+
const tokenFromQuery = params.get('accessToken');
|
|
43
|
+
if (tokenFromQuery) {
|
|
44
|
+
try {
|
|
45
|
+
setAccessToken(tokenFromQuery);
|
|
46
|
+
setUser(decodeToken(tokenFromQuery));
|
|
47
|
+
localStorage.setItem('authToken', tokenFromQuery);
|
|
48
|
+
resetSessionFlag();
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
console.error("Failed to decode or store Google access token:", e);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.error("No accessToken found in Google OAuth callback URL.");
|
|
56
|
+
}
|
|
57
|
+
const redirectPath = sessionStorage.getItem('postLoginRedirect') || '/';
|
|
58
|
+
sessionStorage.removeItem('postLoginRedirect');
|
|
59
|
+
navigate(redirectPath, { replace: true });
|
|
60
|
+
}, [location.search, navigate]);
|
|
61
|
+
// No UI needed; this route just processes the tokens then redirects.
|
|
62
|
+
return null;
|
|
63
|
+
};
|
|
64
|
+
/* ── hard logout ───────────────────────────────────────── */
|
|
65
|
+
function hardLogout() {
|
|
66
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
67
|
+
try {
|
|
68
|
+
// Ask backend to clear the HttpOnly refreshToken cookie
|
|
69
|
+
yield api.post('/auth/logout');
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
// Even if backend call fails, still clear local session
|
|
73
|
+
console.warn('Logout endpoint failed, proceeding with local logout:', e);
|
|
74
|
+
}
|
|
75
|
+
setAccessToken(null);
|
|
76
|
+
setUser(null);
|
|
77
|
+
localStorage.removeItem('authToken');
|
|
78
|
+
sessionStorage.clear();
|
|
79
|
+
setExpired(false);
|
|
80
|
+
navigate('/login', { replace: true });
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/* ── axios + interceptor ───────────────────────────────── */
|
|
84
|
+
const api = useMemo(() => {
|
|
85
|
+
const client = axios.create({
|
|
86
|
+
baseURL: config.baseUrl,
|
|
87
|
+
withCredentials: true,
|
|
88
|
+
});
|
|
89
|
+
attachAuthInterceptor(client, {
|
|
90
|
+
baseUrl: config.baseUrl,
|
|
91
|
+
getAccessToken: () => accessToken,
|
|
92
|
+
setAccessToken: t => setAccessToken(t),
|
|
93
|
+
logout: () => setExpired(true),
|
|
94
|
+
});
|
|
95
|
+
return client;
|
|
96
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
97
|
+
}, [config.baseUrl, accessToken]);
|
|
98
|
+
/* ── bootstrap (localStorage → refresh) ────────────────── */
|
|
99
|
+
useEffect(() => {
|
|
100
|
+
const init = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
101
|
+
if (accessToken) {
|
|
102
|
+
setUser(decodeToken(accessToken));
|
|
103
|
+
setBooting(false);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
const { data } = yield axios.post(`${config.baseUrl}/auth/refresh-token`, {}, { withCredentials: true });
|
|
108
|
+
setAccessToken(data.accessToken);
|
|
109
|
+
setUser(decodeToken(data.accessToken));
|
|
110
|
+
localStorage.setItem('authToken', data.accessToken);
|
|
111
|
+
}
|
|
112
|
+
catch (_a) {
|
|
113
|
+
/* no valid refresh cookie – remain logged-out */
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
setBooting(false);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
init();
|
|
120
|
+
}, [accessToken, config.baseUrl]);
|
|
121
|
+
/* ── manual login (email/password client login) ────────── */
|
|
122
|
+
function login(credentials) {
|
|
123
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
124
|
+
const { data } = yield api.post('/auth/clients/login', credentials);
|
|
125
|
+
setAccessToken(data.accessToken);
|
|
126
|
+
setUser(decodeToken(data.accessToken));
|
|
127
|
+
localStorage.setItem('authToken', data.accessToken);
|
|
128
|
+
resetSessionFlag();
|
|
129
|
+
// NOTE: this previously tried to use `location.state.from`
|
|
130
|
+
// but `location` here is the global, not React Router's.
|
|
131
|
+
// For simplicity we send the user to "/" after manual login.
|
|
132
|
+
navigate('/', { replace: true });
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
const ctx = useMemo(() => ({
|
|
136
|
+
isAuthenticated: !!accessToken,
|
|
137
|
+
accessToken,
|
|
138
|
+
user,
|
|
139
|
+
login,
|
|
140
|
+
logout: hardLogout,
|
|
141
|
+
api,
|
|
142
|
+
setUser,
|
|
143
|
+
}), [accessToken, user, api]);
|
|
144
|
+
// Optional boot screen
|
|
145
|
+
// if (booting) {
|
|
146
|
+
// return <div className="fixed inset-0 bg-white" />;
|
|
147
|
+
// }
|
|
148
|
+
return (React.createElement(AuthConfigContext.Provider, { value: config },
|
|
149
|
+
React.createElement(AuthStateCtx.Provider, { value: ctx },
|
|
150
|
+
React.createElement(Routes, null,
|
|
151
|
+
React.createElement(Route, { path: "login", element: accessToken
|
|
152
|
+
? React.createElement(Navigate, { to: "/", replace: true })
|
|
153
|
+
: React.createElement(SignInPage, { baseUrl: config.baseUrl, colors: config.colors }) }),
|
|
154
|
+
React.createElement(Route, { path: "signup", element: accessToken ? React.createElement(Navigate, { to: "/", replace: true }) : React.createElement(SignUpPage, null) }),
|
|
155
|
+
React.createElement(Route, { path: "oauth/google/callback", element: React.createElement(GoogleCallbackPage, null) }),
|
|
156
|
+
React.createElement(Route, { path: "/oauth/microsoft/callback", element: React.createElement(GoogleCallbackPage, null) }),
|
|
157
|
+
React.createElement(Route, { path: "*", element: React.createElement(RequireAuth, null, children) })),
|
|
158
|
+
expired && React.createElement(SessionExpiredModal, { onConfirm: hardLogout }))));
|
|
159
|
+
};
|
|
160
|
+
//# sourceMappingURL=AuthProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthProvider.js","sourceRoot":"","sources":["../../src/providers/AuthProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AxiosInstance } from 'axios';
|
|
2
|
+
interface Options {
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
refreshEndpoint?: string;
|
|
5
|
+
getAccessToken(): string | null;
|
|
6
|
+
setAccessToken(token: string | null): void;
|
|
7
|
+
logout(): void;
|
|
8
|
+
}
|
|
9
|
+
export declare function resetSessionFlag(): void;
|
|
10
|
+
export declare function attachAuthInterceptor(api: AxiosInstance, opts: Options): AxiosInstance;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=attachAuthInterceptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachAuthInterceptor.d.ts","sourceRoot":"","sources":["../../src/utils/attachAuthInterceptor.ts"],"names":[],"mappings":"AAAA,OAAc,EACV,aAAa,EAIhB,MAAM,OAAO,CAAC;AAEf,UAAU,OAAO;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,IAAI,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC3C,MAAM,IAAI,IAAI,CAAC;CAClB;AAID,wBAAgB,gBAAgB,SAE/B;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,iBA6DtE"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import axios from 'axios';
|
|
11
|
+
let sessionExpiredFlag = false; // guards multiple modals
|
|
12
|
+
export function resetSessionFlag() {
|
|
13
|
+
sessionExpiredFlag = false; // called after hard logout
|
|
14
|
+
}
|
|
15
|
+
export function attachAuthInterceptor(api, opts) {
|
|
16
|
+
var _a;
|
|
17
|
+
api.defaults.withCredentials = true;
|
|
18
|
+
const refreshUrl = `${opts.baseUrl}${(_a = opts.refreshEndpoint) !== null && _a !== void 0 ? _a : '/auth/refresh-token'}`;
|
|
19
|
+
/* ── request ─────────────────────────────────────────────── */
|
|
20
|
+
api.interceptors.request.use((cfg) => {
|
|
21
|
+
const t = opts.getAccessToken();
|
|
22
|
+
if (t)
|
|
23
|
+
cfg.headers.Authorization = `Bearer ${t}`;
|
|
24
|
+
return cfg;
|
|
25
|
+
});
|
|
26
|
+
/* ── response ────────────────────────────────────────────── */
|
|
27
|
+
let refreshing = false;
|
|
28
|
+
let queue = [];
|
|
29
|
+
api.interceptors.response.use(res => res, (err) => __awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
var _a;
|
|
31
|
+
const original = err.config;
|
|
32
|
+
if (((_a = err.response) === null || _a === void 0 ? void 0 : _a.status) !== 401 || !original || original._retry) {
|
|
33
|
+
return Promise.reject(err);
|
|
34
|
+
}
|
|
35
|
+
original._retry = true;
|
|
36
|
+
/* first request to notice the 401 */
|
|
37
|
+
if (!refreshing) {
|
|
38
|
+
refreshing = true;
|
|
39
|
+
try {
|
|
40
|
+
const { data } = yield axios.post(refreshUrl, {}, { withCredentials: true });
|
|
41
|
+
opts.setAccessToken(data.accessToken);
|
|
42
|
+
queue.forEach(cb => cb(data.accessToken));
|
|
43
|
+
queue = [];
|
|
44
|
+
return api.request(original);
|
|
45
|
+
}
|
|
46
|
+
catch (refreshErr) {
|
|
47
|
+
const hadToken = !!opts.getAccessToken();
|
|
48
|
+
if (hadToken && !sessionExpiredFlag) {
|
|
49
|
+
sessionExpiredFlag = true;
|
|
50
|
+
opts.logout(); // 🔔 open modal, keep token for now
|
|
51
|
+
}
|
|
52
|
+
queue.forEach(cb => cb(null));
|
|
53
|
+
queue = [];
|
|
54
|
+
return Promise.reject(refreshErr);
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
refreshing = false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/* queue other 401s until refresh completes */
|
|
61
|
+
return new Promise((resolve, reject) => {
|
|
62
|
+
queue.push(token => {
|
|
63
|
+
var _a;
|
|
64
|
+
if (!token)
|
|
65
|
+
return reject(err);
|
|
66
|
+
((_a = original.headers) !== null && _a !== void 0 ? _a : (original.headers = {})).Authorization = `Bearer ${token}`;
|
|
67
|
+
resolve(api.request(original));
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
}));
|
|
71
|
+
return api;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=attachAuthInterceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachAuthInterceptor.js","sourceRoot":"","sources":["../../src/utils/attachAuthInterceptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
declare const TAILWIND_PREFIXES: readonly ["bg", "text", "border", "fill", "stroke"];
|
|
2
|
+
export type TailwindPrefix = typeof TAILWIND_PREFIXES[number];
|
|
3
|
+
/**
|
|
4
|
+
* Build a set of Tailwind classes for each color prop in a ColorTheme object.
|
|
5
|
+
*
|
|
6
|
+
* e.g. { bg: "#FF9900", text: "white", border: "border-green-300" }
|
|
7
|
+
* => returns an object like { bgClass: "bg-[#FF9900]", textClass: "text-white", borderClass: "border-green-300" }
|
|
8
|
+
*
|
|
9
|
+
* You can specify fallback classes for each property if needed,
|
|
10
|
+
* or define a single fallback for all.
|
|
11
|
+
*/
|
|
12
|
+
export declare function toTailwindColorClasses(theme: {
|
|
13
|
+
bg?: string;
|
|
14
|
+
text?: string;
|
|
15
|
+
border?: string;
|
|
16
|
+
fill?: string;
|
|
17
|
+
stroke?: string;
|
|
18
|
+
}, fallback?: {
|
|
19
|
+
bg?: string;
|
|
20
|
+
text?: string;
|
|
21
|
+
border?: string;
|
|
22
|
+
fill?: string;
|
|
23
|
+
stroke?: string;
|
|
24
|
+
}): {
|
|
25
|
+
bgClass: string;
|
|
26
|
+
textClass: string;
|
|
27
|
+
borderClass: string;
|
|
28
|
+
fillClass: string;
|
|
29
|
+
strokeClass: string;
|
|
30
|
+
};
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=colorHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colorHelpers.d.ts","sourceRoot":"","sources":["../../src/utils/colorHelpers.ts"],"names":[],"mappings":"AACA,QAAA,MAAM,iBAAiB,qDAAsD,CAAC;AAC9E,MAAM,MAAM,cAAc,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAwB9D;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE;IACL,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,EACD,QAAQ,CAAC,EAAE;IACT,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;;;;;;EAgBF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// src/utils/colorHelpers.ts
|
|
2
|
+
const TAILWIND_PREFIXES = ["bg", "text", "border", "fill", "stroke"];
|
|
3
|
+
/**
|
|
4
|
+
* Convert a single color string into a valid Tailwind color class,
|
|
5
|
+
* or return a fallback if invalid.
|
|
6
|
+
*/
|
|
7
|
+
function toTailwindColorAuto(color, prefix, fallbackClass) {
|
|
8
|
+
if (!color)
|
|
9
|
+
return fallbackClass;
|
|
10
|
+
if (color.startsWith(`${prefix}-`)) {
|
|
11
|
+
return color; // e.g. "bg-red-500"
|
|
12
|
+
}
|
|
13
|
+
if (color.startsWith("#")) {
|
|
14
|
+
return `${color}`; // e.g. "bg-[#FF9900]"
|
|
15
|
+
}
|
|
16
|
+
// fallback
|
|
17
|
+
return fallbackClass;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Build a set of Tailwind classes for each color prop in a ColorTheme object.
|
|
21
|
+
*
|
|
22
|
+
* e.g. { bg: "#FF9900", text: "white", border: "border-green-300" }
|
|
23
|
+
* => returns an object like { bgClass: "bg-[#FF9900]", textClass: "text-white", borderClass: "border-green-300" }
|
|
24
|
+
*
|
|
25
|
+
* You can specify fallback classes for each property if needed,
|
|
26
|
+
* or define a single fallback for all.
|
|
27
|
+
*/
|
|
28
|
+
export function toTailwindColorClasses(theme, fallback) {
|
|
29
|
+
var _a, _b, _c, _d, _e;
|
|
30
|
+
// Provide defaults if fallback is missing
|
|
31
|
+
const fallbackBg = (fallback === null || fallback === void 0 ? void 0 : fallback.bg) || "bg-sky-500";
|
|
32
|
+
const fallbackText = (fallback === null || fallback === void 0 ? void 0 : fallback.text) || "text-gray-800";
|
|
33
|
+
const fallbackBorder = (fallback === null || fallback === void 0 ? void 0 : fallback.border) || "border-gray-300";
|
|
34
|
+
const fallbackFill = (fallback === null || fallback === void 0 ? void 0 : fallback.fill) || "fill-current";
|
|
35
|
+
const fallbackStroke = (fallback === null || fallback === void 0 ? void 0 : fallback.stroke) || "stroke-current";
|
|
36
|
+
return {
|
|
37
|
+
bgClass: toTailwindColorAuto((_a = theme.bg) !== null && _a !== void 0 ? _a : "", "bg", fallbackBg),
|
|
38
|
+
textClass: toTailwindColorAuto((_b = theme.text) !== null && _b !== void 0 ? _b : "", "text", fallbackText),
|
|
39
|
+
borderClass: toTailwindColorAuto((_c = theme.border) !== null && _c !== void 0 ? _c : "", "border", fallbackBorder),
|
|
40
|
+
fillClass: toTailwindColorAuto((_d = theme.fill) !== null && _d !== void 0 ? _d : "", "fill", fallbackFill),
|
|
41
|
+
strokeClass: toTailwindColorAuto((_e = theme.stroke) !== null && _e !== void 0 ? _e : "", "stroke", fallbackStroke),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=colorHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colorHelpers.js","sourceRoot":"","sources":["../../src/utils/colorHelpers.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAU,CAAC;AAG9E;;;GAGG;AACH,SAAS,mBAAmB,CAC1B,KAAa,EACb,MAAsB,EACtB,aAAqB;IAErB,IAAI,CAAC,KAAK;QAAE,OAAO,aAAa,CAAC;IAEjC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC,CAAC,oBAAoB;IACpC,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC,sBAAsB;IAC3C,CAAC;IAED,WAAW;IACX,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAMC,EACD,QAMC;;IAED,0CAA0C;IAC1C,MAAM,UAAU,GAAG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,EAAE,KAAI,YAAY,CAAC;IAChD,MAAM,YAAY,GAAG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,KAAI,eAAe,CAAC;IACvD,MAAM,cAAc,GAAG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,KAAI,iBAAiB,CAAC;IAC7D,MAAM,YAAY,GAAG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,KAAI,cAAc,CAAC;IACtD,MAAM,cAAc,GAAG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,KAAI,gBAAgB,CAAC;IAE5D,OAAO;QACL,OAAO,EAAE,mBAAmB,CAAC,MAAA,KAAK,CAAC,EAAE,mCAAI,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC;QAC9D,SAAS,EAAE,mBAAmB,CAAC,MAAA,KAAK,CAAC,IAAI,mCAAI,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC;QACtE,WAAW,EAAE,mBAAmB,CAAC,MAAA,KAAK,CAAC,MAAM,mCAAI,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC;QAC9E,SAAS,EAAE,mBAAmB,CAAC,MAAA,KAAK,CAAC,IAAI,mCAAI,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC;QACtE,WAAW,EAAE,mBAAmB,CAAC,MAAA,KAAK,CAAC,MAAM,mCAAI,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC;KAC/E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwtHelpers.d.ts","sourceRoot":"","sources":["../../src/utils/jwtHelpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAalD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAUtD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jwtDecode } from 'jwt-decode';
|
|
2
|
+
export function decodeToken(token) {
|
|
3
|
+
var _a, _b, _c, _d, _e;
|
|
4
|
+
const d = jwtDecode(token);
|
|
5
|
+
return {
|
|
6
|
+
id: d.sub,
|
|
7
|
+
email: (_a = d.email) !== null && _a !== void 0 ? _a : '',
|
|
8
|
+
roles: (_b = d.roles) !== null && _b !== void 0 ? _b : [],
|
|
9
|
+
permissions: (_c = d.permissions) !== null && _c !== void 0 ? _c : [],
|
|
10
|
+
modules: (_d = d.modules) !== null && _d !== void 0 ? _d : [],
|
|
11
|
+
tenantId: (_e = d.tenantId) !== null && _e !== void 0 ? _e : '',
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=jwtHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwtHelpers.js","sourceRoot":"","sources":["../../src/utils/jwtHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAcvC,MAAM,UAAU,WAAW,CAAC,KAAa;;IACvC,MAAM,CAAC,GAAG,SAAS,CAAS,KAAK,CAAC,CAAC;IACnC,OAAO;QACL,EAAE,EAAW,CAAC,CAAC,GAAG;QAClB,KAAK,EAAQ,MAAA,CAAC,CAAC,KAAK,mCAAI,EAAE;QAC1B,KAAK,EAAQ,MAAA,CAAC,CAAC,KAAK,mCAAI,EAAE;QAC1B,WAAW,EAAE,MAAA,CAAC,CAAC,WAAW,mCAAI,EAAE;QAChC,OAAO,EAAM,MAAA,CAAC,CAAC,OAAO,mCAAI,EAAE;QAC5B,QAAQ,EAAK,MAAA,CAAC,CAAC,QAAQ,mCAAI,EAAE;KAC9B,CAAC;AACJ,CAAC"}
|