@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.
Files changed (97) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +44 -0
  3. package/dist/components/InlineError.d.ts +8 -0
  4. package/dist/components/InlineError.d.ts.map +1 -0
  5. package/dist/components/InlineError.js +31 -0
  6. package/dist/components/InlineError.js.map +1 -0
  7. package/dist/components/ProfilePage.d.ts +3 -0
  8. package/dist/components/ProfilePage.d.ts.map +1 -0
  9. package/dist/components/ProfilePage.js +151 -0
  10. package/dist/components/ProfilePage.js.map +1 -0
  11. package/dist/components/RequirePermissions.d.ts +15 -0
  12. package/dist/components/RequirePermissions.d.ts.map +1 -0
  13. package/dist/components/RequirePermissions.js +20 -0
  14. package/dist/components/RequirePermissions.js.map +1 -0
  15. package/dist/components/SessionExpiredModal.d.ts +7 -0
  16. package/dist/components/SessionExpiredModal.d.ts.map +1 -0
  17. package/dist/components/SessionExpiredModal.js +26 -0
  18. package/dist/components/SessionExpiredModal.js.map +1 -0
  19. package/dist/components/actions/InputField.d.ts +10 -0
  20. package/dist/components/actions/InputField.d.ts.map +1 -0
  21. package/dist/components/actions/InputField.js +22 -0
  22. package/dist/components/actions/InputField.js.map +1 -0
  23. package/dist/components/actions/SocialButton.d.ts +4 -0
  24. package/dist/components/actions/SocialButton.d.ts.map +1 -0
  25. package/dist/components/actions/SocialButton.js +10 -0
  26. package/dist/components/actions/SocialButton.js.map +1 -0
  27. package/dist/context/AuthConfigContext.d.ts +12 -0
  28. package/dist/context/AuthConfigContext.d.ts.map +1 -0
  29. package/dist/context/AuthConfigContext.js +18 -0
  30. package/dist/context/AuthConfigContext.js.map +1 -0
  31. package/dist/context/AuthStateContext.d.ts +17 -0
  32. package/dist/context/AuthStateContext.d.ts.map +1 -0
  33. package/dist/context/AuthStateContext.js +9 -0
  34. package/dist/context/AuthStateContext.js.map +1 -0
  35. package/dist/context/RbacContext.d.ts +12 -0
  36. package/dist/context/RbacContext.d.ts.map +1 -0
  37. package/dist/context/RbacContext.js +21 -0
  38. package/dist/context/RbacContext.js.map +1 -0
  39. package/dist/hooks/useAbility.d.ts +8 -0
  40. package/dist/hooks/useAbility.d.ts.map +1 -0
  41. package/dist/hooks/useAbility.js +24 -0
  42. package/dist/hooks/useAbility.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +3 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/index.mjs +2596 -0
  48. package/dist/index.umd.js +49 -0
  49. package/dist/main/app.d.ts +6 -0
  50. package/dist/main/app.d.ts.map +1 -0
  51. package/dist/main/app.js +7 -0
  52. package/dist/main/app.js.map +1 -0
  53. package/dist/models/AuthConfig.d.ts +17 -0
  54. package/dist/models/AuthConfig.d.ts.map +1 -0
  55. package/dist/models/AuthConfig.js +2 -0
  56. package/dist/models/AuthConfig.js.map +1 -0
  57. package/dist/models/ColorTheme.d.ts +8 -0
  58. package/dist/models/ColorTheme.d.ts.map +1 -0
  59. package/dist/models/ColorTheme.js +2 -0
  60. package/dist/models/ColorTheme.js.map +1 -0
  61. package/dist/models/Type.d.ts +13 -0
  62. package/dist/models/Type.d.ts.map +1 -0
  63. package/dist/models/Type.js +2 -0
  64. package/dist/models/Type.js.map +1 -0
  65. package/dist/models/User.d.ts +15 -0
  66. package/dist/models/User.d.ts.map +1 -0
  67. package/dist/models/User.js +2 -0
  68. package/dist/models/User.js.map +1 -0
  69. package/dist/pages/auth/GoogleCallbackPage.d.ts +3 -0
  70. package/dist/pages/auth/GoogleCallbackPage.d.ts.map +1 -0
  71. package/dist/pages/auth/GoogleCallbackPage.js +20 -0
  72. package/dist/pages/auth/GoogleCallbackPage.js.map +1 -0
  73. package/dist/pages/auth/SignInPage.d.ts +4 -0
  74. package/dist/pages/auth/SignInPage.d.ts.map +1 -0
  75. package/dist/pages/auth/SignInPage.js +152 -0
  76. package/dist/pages/auth/SignInPage.js.map +1 -0
  77. package/dist/pages/auth/SignUpPage.d.ts +3 -0
  78. package/dist/pages/auth/SignUpPage.d.ts.map +1 -0
  79. package/dist/pages/auth/SignUpPage.js +177 -0
  80. package/dist/pages/auth/SignUpPage.js.map +1 -0
  81. package/dist/providers/AuthProvider.d.ts +9 -0
  82. package/dist/providers/AuthProvider.d.ts.map +1 -0
  83. package/dist/providers/AuthProvider.js +160 -0
  84. package/dist/providers/AuthProvider.js.map +1 -0
  85. package/dist/utils/attachAuthInterceptor.d.ts +12 -0
  86. package/dist/utils/attachAuthInterceptor.d.ts.map +1 -0
  87. package/dist/utils/attachAuthInterceptor.js +73 -0
  88. package/dist/utils/attachAuthInterceptor.js.map +1 -0
  89. package/dist/utils/colorHelpers.d.ts +32 -0
  90. package/dist/utils/colorHelpers.d.ts.map +1 -0
  91. package/dist/utils/colorHelpers.js +44 -0
  92. package/dist/utils/colorHelpers.js.map +1 -0
  93. package/dist/utils/jwtHelpers.d.ts +3 -0
  94. package/dist/utils/jwtHelpers.d.ts.map +1 -0
  95. package/dist/utils/jwtHelpers.js +14 -0
  96. package/dist/utils/jwtHelpers.js.map +1 -0
  97. 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,3 @@
1
+ import React from "react";
2
+ export declare const SignUpPage: React.FC;
3
+ //# sourceMappingURL=SignUpPage.d.ts.map
@@ -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,3 @@
1
+ import type { UserProfile } from '../models/User';
2
+ export declare function decodeToken(token: string): UserProfile;
3
+ //# sourceMappingURL=jwtHelpers.d.ts.map
@@ -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"}