@stack-spot/auth-react 2.9.2 → 2.10.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/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.10.0](https://github.com/stack-spot/portal-auth-js/compare/auth-react@v2.9.3...auth-react@v2.10.0) (2025-08-01)
4
+
5
+
6
+ ### Features
7
+
8
+ * logger ([#118](https://github.com/stack-spot/portal-auth-js/issues/118)) ([acd623b](https://github.com/stack-spot/portal-auth-js/commit/acd623be69266b45c73e4a80792cb0ffa718b372))
9
+ * releases react ([#122](https://github.com/stack-spot/portal-auth-js/issues/122)) ([f3cc242](https://github.com/stack-spot/portal-auth-js/commit/f3cc242722115c69d404e8a513695ce84ed5fc11))
10
+
11
+ ## [2.9.3](https://github.com/stack-spot/portal-auth-js/compare/auth-react@v2.9.2...auth-react@v2.9.3) (2025-06-18)
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * handle desktop view on login ([#116](https://github.com/stack-spot/portal-auth-js/issues/116)) ([dbd2b20](https://github.com/stack-spot/portal-auth-js/commit/dbd2b2081ed4401d28e1aa36b3e8cecb6e5fccc1))
17
+
3
18
  ## [2.9.2](https://github.com/stack-spot/portal-auth-js/compare/auth-react@v2.9.1...auth-react@v2.9.2) (2025-06-18)
4
19
 
5
20
 
package/out/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { Session, ThirdPartyLoginParams, AuthConfig, ThirdPartyAuthType } from '@stack-spot/auth';
3
3
 
4
- interface SessionManagerConfig extends Pick<AuthConfig, 'accountUrl' | 'authUrl' | 'clientId' | 'defaultTenant' | 'retry' | 'retryDelay'> {
4
+ interface SessionManagerConfig extends Pick<AuthConfig, 'accountUrl' | 'authUrl' | 'clientId' | 'defaultTenant' | 'retry' | 'retryDelay' | 'logger'> {
5
5
  /**
6
6
  * The URL to redirect to when the user logs out.
7
7
  * @default location.origin
@@ -34,6 +34,7 @@ declare class SessionManager {
34
34
  private readonly auth;
35
35
  private config;
36
36
  private changeListeners;
37
+ private logger;
37
38
  static instance: SessionManager | undefined;
38
39
  private constructor();
39
40
  static create(config: SessionManagerConfig): SessionManager;
package/out/index.js CHANGED
@@ -11,8 +11,8 @@ var ui = require('@citric/ui');
11
11
  var auth = require('@stack-spot/auth');
12
12
  var svg = require('@stack-spot/portal-components/svg');
13
13
  var styledComponents = require('styled-components');
14
+ var icons = require('@citric/icons');
14
15
  var lodash = require('lodash');
15
- require('@citric/icons');
16
16
 
17
17
  const dictionary = {
18
18
  en: {
@@ -32,7 +32,8 @@ const dictionary = {
32
32
  corporateLoginTitle: "Already have a StackSpot Enterprise account?",
33
33
  corporateLoginButton: "Enter Enterprise account",
34
34
  socialLoginTitle: "Do you want to access another way?",
35
- emailNotFoundError: "We couldn't find an account for this email."
35
+ emailNotFoundError: "We couldn't find an account for this email.",
36
+ errorMobileDesktop: "It looks like you are using a mobile device in desktop mode. We recommend adjusting this setting before continuing for a complete experience."
36
37
  },
37
38
  pt: {
38
39
  welcome: "Boas vindas \xE0 StackSpot AI",
@@ -51,7 +52,8 @@ const dictionary = {
51
52
  corporateLoginTitle: "J\xE1 possui uma conta StackSpot Enterprise?",
52
53
  corporateLoginButton: "Entrar na conta Enterprise",
53
54
  socialLoginTitle: "Voc\xEA quer entrar de outro jeito?",
54
- emailNotFoundError: "N\xE3o encontramos uma conta para este e-mail."
55
+ emailNotFoundError: "N\xE3o encontramos uma conta para este e-mail.",
56
+ errorMobileDesktop: "Parece que voc\xEA est\xE1 utilizando um dispositivo m\xF3vel na vers\xE3o desktop. Recomendamos ajustar essa configura\xE7\xE3o antes de continuar para uma experi\xEAncia completa."
55
57
  }
56
58
  };
57
59
  const useTranslation = () => portalTranslate.useTranslate(dictionary);
@@ -113,6 +115,7 @@ const _SessionManager = class _SessionManager {
113
115
  __publicField(this, "auth");
114
116
  __publicField(this, "config");
115
117
  __publicField(this, "changeListeners", []);
118
+ __publicField(this, "logger");
116
119
  config.loginUrl || (config.loginUrl = location.origin);
117
120
  const redirectUrl = (config.redirectUrl || config.loginUrl).replace(/([^/])$/, "$1/");
118
121
  this.config = config;
@@ -124,6 +127,7 @@ const _SessionManager = class _SessionManager {
124
127
  save: (session) => localStorage.setItem(sessionKey, session)
125
128
  }
126
129
  }));
130
+ this.logger = this.auth.config.logger;
127
131
  _SessionManager.instance = this;
128
132
  addEventListener("focus", () => this.validateSharedSession());
129
133
  }
@@ -139,23 +143,32 @@ const _SessionManager = class _SessionManager {
139
143
  }
140
144
  async restoreSession() {
141
145
  const session = await this.auth.restoreSession();
146
+ this.logger.log("Validating shared session.");
142
147
  const sessionValid = await this.validateSharedSession(session);
143
148
  this.setSession(sessionValid ? session : void 0);
144
149
  }
145
150
  async validateSharedSession(session = this.current) {
146
151
  var _a;
147
- if (this.urlHasThirdPartyLoginData())
152
+ if (this.urlHasThirdPartyLoginData()) {
153
+ this.logger.log("Session is invalid because there's another authentication in progress.");
148
154
  return false;
155
+ }
149
156
  const sharedSessionCookie = sessionCookie.get();
150
157
  if (!sharedSessionCookie) {
158
+ this.logger.log("Session is invalid because no shared session cookie was found, i.e, a logout was performed in another portal. Forcing log off.");
151
159
  session && await this.logout();
152
160
  return false;
153
161
  }
154
162
  const isDifferentSessionActive = sharedSessionCookie.sub != (session == null ? void 0 : session.getTokenData().sub);
155
163
  const isSharedSessionTypeBlocked = (_a = this.config.blockedAuthTypes) == null ? void 0 : _a.includes(sharedSessionCookie.type);
156
- if (isSharedSessionTypeBlocked)
164
+ if (isSharedSessionTypeBlocked) {
165
+ this.logger.log("Session is invalid because shared sessions have been blocked in the SessionManager's configuration (blockedAuthTypes).");
157
166
  return false;
158
- else if (isDifferentSessionActive || !session) {
167
+ } else if (isDifferentSessionActive || !session) {
168
+ this.logger.log(
169
+ isDifferentSessionActive ? "Session is invalid because a different session is already active." : "Session is invalid because it's undefined."
170
+ );
171
+ this.logger.log("Starting login with tenant from the session cookie.");
159
172
  await this.startThirdPartyLoginUsingTenant(sharedSessionCookie);
160
173
  return false;
161
174
  }
@@ -212,6 +225,7 @@ ${error}`);
212
225
  const params = new URLSearchParams(location.search);
213
226
  const cookie = sessionCookie.get();
214
227
  if (!cookie || !cookie.tenant) {
228
+ this.logger.log("Login out because no tenant information is available in the following data:", JSON.stringify(data));
215
229
  await this.logout();
216
230
  return;
217
231
  }
@@ -243,7 +257,14 @@ ${error}`);
243
257
  return (session == null ? void 0 : session.type) == "sso" ? session.email : void 0;
244
258
  }
245
259
  async switchAccount(accountId) {
246
- this.current && await this.auth.switchAccount(accountId, this.current);
260
+ var _a;
261
+ this.logger.log("Switching accounts", accountId, (_a = this.current) == null ? void 0 : _a.getTokenData().account_id_v2);
262
+ try {
263
+ this.current && await this.auth.switchAccount(accountId, this.current);
264
+ } catch (error) {
265
+ this.logger.error("Error while switching accounts", error);
266
+ throw error;
267
+ }
247
268
  this.setSession(this.current);
248
269
  }
249
270
  onChange(listener) {
@@ -459,9 +480,23 @@ const ButtonProvider = ({ provider, login, loading, disabled }) => {
459
480
  }
460
481
  ) });
461
482
  };
483
+ function hasTouchSupport() {
484
+ return "ontouchstart" in window || navigator.maxTouchPoints > 0;
485
+ }
486
+ function isMobileUserAgent() {
487
+ return /Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
488
+ }
489
+ function isMobileWithDesktopView() {
490
+ return !isMobileUserAgent() && hasTouchSupport();
491
+ }
462
492
  const IDPLogin = ({ trialProviders, loading, loginProvider, onSubmit, onChangeMode }) => {
463
493
  const t = useTranslation();
494
+ const showErrorMessage = isMobileWithDesktopView();
464
495
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
496
+ showErrorMessage && /* @__PURE__ */ jsxRuntime.jsxs(core.Flex, { bg: "warning", p: 4, role: "alert", flexWrap: "nowrap", children: [
497
+ /* @__PURE__ */ jsxRuntime.jsx(core.IconBox, { colorIcon: "warning.contrastText", children: /* @__PURE__ */ jsxRuntime.jsx(icons.ExclamationTriangle, {}) }),
498
+ /* @__PURE__ */ jsxRuntime.jsx(core.Text, { appearance: "body2", ml: 2, colorScheme: "warning.contrastText", children: t.errorMobileDesktop })
499
+ ] }),
465
500
  /* @__PURE__ */ jsxRuntime.jsx(core.Flex, { flexDirection: "column", gap: true, children: trialProviders == null ? void 0 : trialProviders.map((provider) => /* @__PURE__ */ jsxRuntime.jsx(
466
501
  ButtonProvider,
467
502
  {
package/out/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/dictionary.ts","../src/utils/cookies.ts","../src/utils/redirect.ts","../src/SessionManager.ts","../src/hooks.ts","../src/provider-icons/Github.tsx","../src/provider-icons/Google.tsx","../src/provider-icons/Microsoft.tsx","../src/IDPLogin.tsx","../src/last-login-type.ts","../src/SSOLogin.tsx","../src/Login.tsx","../src/Authenticated.tsx"],"sourcesContent":["import { Dictionary, useTranslate } from '@stack-spot/portal-translate'\n\nconst dictionary = {\n en: {\n welcome: 'Welcome to StackSpot AI',\n loginWithEmail: 'Log in with your email.',\n loginWithSocialAccount1: 'Sign up or access your ',\n loginWithSocialAccount2: ' freemium account ',\n loginWithSocialAccount3: ' with a social login',\n label: 'Corporate email',\n placeholder: 'email@company.com',\n continue: 'Continue',\n or: 'Or',\n loginWith: 'Continue with $0',\n emailNotAllowedTitle: 'Your email is linked to an Enterprise account.',\n emailNotAllowedSubtitle: \"Please log in with your corporate email.\",\n socialLogin: 'Login or register with a social account',\n corporateLoginTitle: 'Already have a StackSpot Enterprise account?',\n corporateLoginButton: 'Enter Enterprise account',\n socialLoginTitle: 'Do you want to access another way?',\n emailNotFoundError: 'We couldn\\'t find an account for this email.',\n },\n pt: {\n welcome: 'Boas vindas à StackSpot AI',\n loginWithEmail: 'Faça login com seu e-mail.',\n loginWithSocialAccount1: 'Cadastre-se ou acesse sua ',\n loginWithSocialAccount2: ' conta freemium ',\n loginWithSocialAccount3: ' com uma conta social',\n label: 'Email corporativo',\n placeholder: 'email@empresa.com',\n continue: 'Continuar',\n or: 'Ou',\n loginWith: 'Continuar com $0',\n emailNotAllowedTitle: '\"Este e-mail está vinculado a uma conta Enterprise.',\n emailNotAllowedSubtitle: \"Faça login com seu email corporativo.\",\n socialLogin: 'Entre ou cadastre-se com uma conta social',\n corporateLoginTitle: 'Já possui uma conta StackSpot Enterprise?',\n corporateLoginButton: 'Entrar na conta Enterprise',\n socialLoginTitle: 'Você quer entrar de outro jeito?',\n emailNotFoundError: 'Não encontramos uma conta para este e-mail.',\n },\n} satisfies Dictionary\n\nexport const useTranslation = () => useTranslate(dictionary)\n","import { ThirdPartyLoginParams } from '@stack-spot/auth'\nimport { getCookie, getCookieDomain, removeCookie, setCookie } from '@stack-spot/portal-components'\n\nconst sessionKey = `stk-session${getCookieDomain()}`\n\ntype SessionCookie = ThirdPartyLoginParams & { sub: string, tenant: string }\n\nexport const sessionCookie = Object.freeze({\n set: (data: SessionCookie) => setCookie(sessionKey, JSON.stringify(data)),\n get: (): SessionCookie | undefined => {\n try {\n const cookie = getCookie(sessionKey)\n return cookie ? JSON.parse(cookie) : undefined\n } catch (error) {\n console.error(error)\n }\n },\n delete: () => removeCookie(sessionKey)\n})\n","import { getCookieDomain } from '@stack-spot/portal-components'\n\nconst isValidDomain = (url: string) => {\n const portalDomainRegex = new RegExp(`^https?:\\/\\/[a-zA-Z0-9.-]*${getCookieDomain().replaceAll('.', '\\.')}(:[0-9]{2,4})*.*$`, 'g')\n const platformDomainRegex = new RegExp(/^https:\\/\\/[a-zA-Z0-9.-]+\\.stackspot\\.com.*$/, 'g')\n const result = portalDomainRegex.test(url) || platformDomainRegex.test(url)\n return result\n}\n\nexport const redirect = async (url: string) => {\n\n if (!isValidDomain(url)) throw new Error('Redirect URL invalid domain')\n\n window.location.href = url\n /**\n * This is intentional. The promise bellow will never be fulfilled.\n * Once the set href is not instantaneous, this will guarantee no further code is executed until the user is really redirected.\n * Particularly useful to prevent flickering page renders on scenarios with redirects.\n */\n await new Promise(() => '')\n}","import { AccessTokenPayload, AuthConfig, AuthManager, Session, ThirdPartyAuthType, ThirdPartyLoginParams } from '@stack-spot/auth'\nimport { sessionCookie } from './utils/cookies'\nimport { redirect } from './utils/redirect'\n\nconst sessionKey = 'session'\n\ninterface SessionManagerConfig extends Pick<AuthConfig, 'accountUrl' | 'authUrl' | 'clientId' | 'defaultTenant' | 'retry' | 'retryDelay'> {\n /**\n * The URL to redirect to when the user logs out.\n * @default location.origin\n */\n loginUrl?: string,\n /**\n * The URL to redirect to when the login completes in the authentication app. If not provided, will be the same as `loginUrl`.\n * @default loginUrl\n */\n redirectUrl?: string,\n /**\n * Forbidden authentication types to this Session Manager.\n */\n blockedAuthTypes?: ThirdPartyAuthType[]\n /**\n * A URL to send login events to (observability).\n */\n rdUrl?: string,\n}\n\ntype AuthExtraData = { from?: string | null, finalRedirect?: string | null }\n\ntype ChangeListener = (session: Session | undefined) => void\n\n/**\n * Controls the current session in a browser.\n * \n * This should not be used under a Node.JS environment.\n * \n * This is a singleton. To create the first instance or recover the current one, use `SessionManager.create`.\n */\nexport class SessionManager {\n private current: Session | undefined\n private readonly auth: AuthManager<AuthExtraData>\n private config: SessionManagerConfig\n private changeListeners: ChangeListener[] = []\n static instance: SessionManager | undefined\n\n private constructor(config: SessionManagerConfig) {\n config.loginUrl ||= location.origin\n const redirectUrl = (config.redirectUrl || config.loginUrl).replace(/([^/])$/, '$1/') // the trailing \"/\" is required by Stackspot IAM.\n this.config = config\n this.auth = new AuthManager<AuthExtraData>({\n ...config,\n redirectUrl,\n storage: localStorage,\n sessionPersistence: {\n load: () => localStorage.getItem(sessionKey),\n save: (session) => localStorage.setItem(sessionKey, session),\n },\n })\n SessionManager.instance = this\n\n // Keep session in sync with other app's session\n addEventListener('focus', () => this.validateSharedSession())\n }\n\n static create(config: SessionManagerConfig) {\n return SessionManager.instance ?? new SessionManager(config)\n }\n\n private setSession(session: Session | undefined) {\n this.current = session\n this.changeListeners.forEach(l => l(session))\n if (session) this.setSessionCookie(session)\n }\n\n async restoreSession() {\n const session = await this.auth.restoreSession()\n const sessionValid = await this.validateSharedSession(session)\n this.setSession(sessionValid ? session : undefined)\n }\n\n async validateSharedSession(session: Session | undefined = this.current): Promise<boolean> {\n\n // skipping because authentication is in progress\n if (this.urlHasThirdPartyLoginData()) return false\n\n const sharedSessionCookie = sessionCookie.get()\n\n // It has been logged out on another portal, so logout on this one too\n if (!sharedSessionCookie) {\n session && await this.logout()\n return false\n }\n\n const isDifferentSessionActive = sharedSessionCookie.sub != session?.getTokenData().sub\n const isSharedSessionTypeBlocked = this.config.blockedAuthTypes?.includes(sharedSessionCookie.type)\n if (isSharedSessionTypeBlocked) return false\n else if (isDifferentSessionActive || !session) {\n await this.startThirdPartyLoginUsingTenant(sharedSessionCookie)\n return false\n }\n return true\n }\n\n hasSession() {\n return !!this.current && !this.current.isExpired()\n }\n\n getSession() {\n if (!this.hasSession()) {\n this.endSession()\n throw new Error('Session is not available, redirecting to login.')\n }\n return this.current!\n }\n\n async endSession(redirectToLogin = true) {\n this.current = undefined\n localStorage.removeItem(sessionKey)\n sessionCookie.delete()\n if (redirectToLogin && this.config.loginUrl) await redirect(this.config.loginUrl)\n }\n\n async restartSession() {\n await this.logout({ endSession: false })\n this.current = undefined\n localStorage.removeItem(sessionKey)\n await this.restoreSession()\n }\n\n async logout({ endSession }: { endSession?: boolean } | undefined = { endSession: true }) {\n try {\n await this.current?.logout()\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Could not logout from IDM.\\n${error}`)\n }\n if (!endSession) return\n await this.endSession()\n }\n\n async startThirdPartyLogin(data: ThirdPartyLoginParams) {\n const params = new URLSearchParams(location.search)\n const authUrl = await this.auth.startThirdPartyLogin(data, {\n from: location.href,\n finalRedirect: params.get('finalRedirect'),\n })\n await redirect(authUrl)\n }\n\n urlHasThirdPartyLoginData() {\n const url = new URL(location.toString())\n return url.searchParams.has('state') && !url.searchParams.has('error')\n }\n\n async startThirdPartyLoginUsingTenant(data: ThirdPartyLoginParams) {\n const params = new URLSearchParams(location.search)\n const cookie = sessionCookie.get()\n if (!cookie || !cookie.tenant) {\n //If no tenant is available we should log out the user\n await this.logout()\n return\n }\n const authUrl = await this.auth.getThirdPartyLoginFromTenant(data, cookie.tenant, {\n from: location.href,\n finalRedirect: params.get('finalRedirect'),\n }\n )\n await redirect(authUrl)\n }\n\n async completeThirdPartyLogin() {\n const url = new URL(location.toString())\n if (url.searchParams.has('error')) {\n throw new Error(`Error while signing in: ${url.searchParams.get('error_description')}`)\n }\n const { session, data: { from, finalRedirect } } = await this.auth.completeThirdPartyLogin(location.search)\n this.setSession(session)\n history.replaceState(null, '', from || location.toString().replace(/\\?.*$/, ''))\n this.sendLoginEventRd(this.current?.getTokenData())\n if (finalRedirect) await redirect(finalRedirect)\n }\n\n getEmailForLogin() {\n const session = sessionCookie.get()\n return session?.type == 'sso' ? session.email : undefined\n }\n\n async switchAccount(accountId: string) {\n this.current && await this.auth.switchAccount(accountId, this.current)\n this.setSession(this.current)\n }\n\n onChange(listener: ChangeListener) {\n this.changeListeners.push(listener)\n return () => {\n const index = this.changeListeners.indexOf(listener)\n if (index != -1) this.changeListeners.splice(index, 1)\n }\n }\n\n private setSessionCookie(session: Session) {\n const { email, account_type, sub, tenant } = session.getTokenData()\n const { provider } = session.getSessionData()\n if (!email || !sub || !tenant) return\n const isFreemium = account_type == 'FREEMIUM'\n if (isFreemium) {\n sessionCookie.set({ type: 'idp', provider: provider!, sub, tenant })\n } else {\n sessionCookie.set({ email, type: 'sso', sub, tenant })\n }\n }\n\n private async sendLoginEventRd(tokenData?: AccessTokenPayload) {\n if (!this.config.rdUrl) return\n\n if (!tokenData) {\n // eslint-disable-next-line no-console\n console.error('Unable to trigger login hook. No sessionEmail or name identified.')\n return\n }\n\n const { email, name, account_type, client_id, account_name, trial_account_status } = tokenData\n const isLoginAI = client_id === \"stackspot-portal-ai\"\n const isLoginEDP = client_id === \"stackspot-portal\"\n\n if (!isLoginAI && !isLoginEDP && trial_account_status === 'PENDING') return\n\n const leadType = account_type === 'FREEMIUM' ? 'TRIAL' : 'ENTERPRISE'\n\n const rdObject = {\n event_type: 'CONVERSION',\n event_family: 'CDP',\n payload: {\n email,\n name,\n conversion_identifier: isLoginAI ? 'login_ai' : 'login_edp',\n cf_leadtype: leadType,\n cf_account_name: leadType === 'TRIAL' ? leadType : account_name,\n },\n }\n\n const response = await fetch(this.config.rdUrl, {\n method: 'POST',\n body: JSON.stringify(rdObject),\n headers: {\n 'content-type': 'application/json',\n },\n })\n const data = await response.json()\n\n if (!response.ok) {\n // eslint-disable-next-line no-console\n console.error('Error while sending event to RD Station', data)\n }\n }\n\n async getTrialEnabledProviders() {\n try {\n const response = await fetch(`${this.config.accountUrl}/v1/accounts/trial/sso`)\n const trialProviders = await response.json()\n\n if (!response.ok) {\n // eslint-disable-next-line no-console\n console.error('Error while fetching available login providers', trialProviders)\n }\n\n const providerKeys = Object.keys(trialProviders || {})\n return providerKeys.filter(key => trialProviders[key] === true)\n } catch (error) {\n console.error('Error while fetching available login providers', error)\n return []\n }\n }\n}\n","import { Session } from '@stack-spot/auth'\nimport { useEffect, useState } from 'react'\nimport { SessionManager } from './SessionManager'\n\nexport function useSession() {\n const manager = SessionManager.instance\n const [session, setSession] = useState<Session | undefined>(manager?.hasSession() ? manager.getSession() : undefined)\n useEffect(() => {\n return manager?.onChange(setSession)\n }, [])\n return session\n}\n\nexport type Provider = 'google' | 'github' | 'microsoft'\nexport const useTrialProviders = ({ enabled = true }): [Provider[], boolean] => {\n const [isLoadingTrialProviders, setIsLoadingTrialProviders] = useState<boolean>(enabled)\n const [trialProviders, setTrialProviders] = useState<Provider[]>([])\n\n useEffect(() => {\n (async () => {\n if (!SessionManager.instance || !enabled) return\n try {\n const providers = (await SessionManager.instance.getTrialEnabledProviders()) as Provider[]\n setTrialProviders(providers)\n setIsLoadingTrialProviders(false)\n } catch (error) {\n console.error(error)\n setIsLoadingTrialProviders(false)\n }\n })()\n }, [SessionManager.instance])\n\n return [trialProviders, isLoadingTrialProviders]\n}\n","import { forwardRef, Ref, SVGProps } from 'react'\n\nexport const Github = forwardRef((props: SVGProps<SVGSVGElement>, ref: Ref<SVGSVGElement>) => (\n <svg ref={ref} {...props} width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_1215_2072)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12.0011 4.38525C10.1019 4.38624 8.26498 5.05889 6.81881 6.28294C5.37263 7.50698 4.4115 9.20259 4.10726 11.0666C3.80302 12.9306 4.17551 14.8414 5.15814 16.4574C6.14077 18.0733 7.66946 19.2891 9.47085 19.8872C9.86827 19.961 10.018 19.7147 10.018 19.5053C10.018 19.2958 10.01 18.6886 10.0074 18.0247C7.78183 18.5055 7.31155 17.0856 7.31155 17.0856C6.94858 16.1635 6.42399 15.9212 6.42399 15.9212C5.69804 15.4286 6.4783 15.4378 6.4783 15.4378C7.28241 15.4944 7.705 16.2584 7.705 16.2584C8.4177 17.4741 9.57683 17.1225 10.0325 16.917C10.1041 16.402 10.312 16.0516 10.5412 15.8527C8.76345 15.6525 6.89559 14.9702 6.89559 11.9222C6.88457 11.1317 7.17958 10.3673 7.71957 9.78704C7.63744 9.58683 7.36321 8.77808 7.79772 7.67954C7.79772 7.67954 8.46936 7.46616 9.99809 8.49488C11.3093 8.13834 12.6928 8.13834 14.0041 8.49488C15.5315 7.46616 16.2018 7.67954 16.2018 7.67954C16.6376 8.77544 16.3634 9.58419 16.2813 9.78704C16.823 10.3674 17.1186 11.1332 17.1066 11.9248C17.1066 14.9794 15.2347 15.6525 13.4543 15.8487C13.7404 16.0964 13.9961 16.5798 13.9961 17.3227C13.9961 18.387 13.9868 19.2431 13.9868 19.5053C13.9868 19.7173 14.1312 19.9649 14.5366 19.8872C16.3382 19.289 17.867 18.0731 18.8496 16.4568C19.8323 14.8406 20.2046 12.9295 19.9 11.0653C19.5954 9.20112 18.6338 7.50549 17.1871 6.28166C15.7405 5.05782 13.9031 4.38561 12.0037 4.38525H12.0011Z\" fill=\"white\" />\n <path d=\"M9.35091 17.3684C9.35091 17.4329 9.27673 17.4882 9.18135 17.4896C9.08597 17.4909 9.00781 17.4382 9.00781 17.3736C9.00781 17.3091 9.08199 17.2538 9.17737 17.2525C9.27275 17.2511 9.35091 17.3025 9.35091 17.3684Z\" fill=\"white\" />\n <path d=\"M9.96094 17.2672C9.97286 17.3317 9.90662 17.3989 9.81124 17.4147C9.71586 17.4305 9.63241 17.3923 9.62048 17.3291C9.60856 17.2659 9.67745 17.1974 9.77018 17.1803C9.86291 17.1631 9.94902 17.2027 9.96094 17.2672Z\" fill=\"white\" />\n <path d=\"M8.6968 17.324C8.67693 17.3859 8.58685 17.4136 8.49676 17.3872C8.40668 17.3609 8.34707 17.2871 8.36429 17.2239C8.38151 17.1607 8.47292 17.1317 8.56433 17.1607C8.65573 17.1897 8.71402 17.2595 8.6968 17.324Z\" fill=\"white\" />\n <path d=\"M8.09774 17.0658C8.05402 17.1145 7.96527 17.1013 7.89241 17.0355C7.81955 16.9696 7.80232 16.88 7.84604 16.8326C7.88975 16.7852 7.97851 16.7984 8.05402 16.8629C8.12953 16.9274 8.1441 17.0183 8.09774 17.0658V17.0658Z\" fill=\"white\" />\n <path d=\"M7.6686 16.6231C7.61959 16.6574 7.53612 16.6231 7.48976 16.5546C7.47694 16.5423 7.46674 16.5276 7.45978 16.5113C7.45281 16.495 7.44922 16.4775 7.44922 16.4598C7.44922 16.4421 7.45281 16.4246 7.45978 16.4083C7.46674 16.392 7.47694 16.3772 7.48976 16.3649C7.53877 16.332 7.62224 16.3649 7.6686 16.4321C7.71497 16.4993 7.71629 16.5889 7.6686 16.6231V16.6231Z\" fill=\"white\" />\n <path d=\"M7.3535 16.1662C7.32607 16.1799 7.29468 16.1838 7.26472 16.177C7.23475 16.1703 7.20807 16.1534 7.18924 16.1293C7.13757 16.074 7.12697 15.9976 7.16671 15.9633C7.20645 15.9291 7.27799 15.9449 7.32966 16.0002C7.38132 16.0555 7.39324 16.1319 7.3535 16.1662Z\" fill=\"white\" />\n <path d=\"M7.02905 15.8062C7.01183 15.8457 6.94825 15.8576 6.89658 15.8299C6.84492 15.8022 6.8065 15.7509 6.82505 15.71C6.8436 15.6692 6.90586 15.6587 6.95752 15.6863C7.00919 15.714 7.04893 15.7667 7.02905 15.8062Z\" fill=\"white\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1215_2072\">\n <rect width=\"16\" height=\"16\" fill=\"white\" transform=\"translate(4 4.05176)\" />\n </clipPath>\n </defs>\n </svg>\n))\n","import { forwardRef, Ref, SVGProps } from 'react'\n\nexport const Google = forwardRef((props: SVGProps<SVGSVGElement>, ref: Ref<SVGSVGElement>) => (\n <svg ref={ref} {...props} width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_1215_2403)\">\n <path d=\"M20.3442 12.2359C20.3442 11.6921 20.3001 11.1454 20.206 10.6104H12.6602V13.691H16.9813C16.802 14.6846 16.2258 15.5635 15.3822 16.122V18.1209H17.9602C19.4741 16.7276 20.3442 14.6699 20.3442 12.2359Z\" fill=\"#4285F4\" />\n <path d=\"M12.6607 20.0525C14.8184 20.0525 16.6379 19.344 17.9637 18.1212L15.3857 16.1223C14.6684 16.6103 13.7425 16.8866 12.6637 16.8866C10.5766 16.8866 8.80696 15.4785 8.17202 13.5854H5.51172V15.6461C6.86979 18.3475 9.63592 20.0525 12.6607 20.0525V20.0525Z\" fill=\"#34A853\" />\n <path d=\"M8.16852 13.5856C7.83341 12.592 7.83341 11.5161 8.16852 10.5225V8.46191H5.51116C4.37649 10.7224 4.37649 13.3857 5.51116 15.6462L8.16852 13.5856V13.5856Z\" fill=\"#FBBC04\" />\n <path d=\"M12.6607 7.2182C13.8013 7.20056 14.9036 7.62974 15.7296 8.41754L18.0136 6.1335C16.5674 4.77543 14.6479 4.02878 12.6607 4.0523C9.63592 4.0523 6.86979 5.75724 5.51172 8.46163L8.16908 10.5223C8.80108 8.62625 10.5736 7.2182 12.6607 7.2182V7.2182Z\" fill=\"#EA4335\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1215_2403\">\n <rect width=\"16\" height=\"16\" fill=\"white\" transform=\"translate(4.5 4.05176)\" />\n </clipPath>\n </defs>\n </svg>\n))\n","import { forwardRef, Ref, SVGProps } from 'react'\n\nexport const Microsoft = forwardRef((props: SVGProps<SVGSVGElement>, ref: Ref<SVGSVGElement>) => (\n <svg ref={ref} {...props} width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.19531 4.74707H12.1518V11.7036H5.19531V4.74707Z\" fill=\"#F35325\" />\n <path d=\"M12.8477 4.74707H19.8042V11.7036H12.8477V4.74707Z\" fill=\"#81BC06\" />\n <path d=\"M5.19531 12.3994H12.1518V19.3559H5.19531V12.3994Z\" fill=\"#05A6F0\" />\n <path d=\"M12.8477 12.3994H19.8042V19.3559H12.8477V12.3994Z\" fill=\"#FFBA08\" />\n </svg>\n))\n","import { Box, Button, Flex, Text } from '@citric/core'\nimport { LoadingCircular } from '@citric/ui'\nimport { interpolate } from '@stack-spot/portal-translate'\nimport { capitalize } from 'lodash'\nimport { useTranslation } from './dictionary'\nimport { Provider } from './hooks'\nimport { Github } from './provider-icons/Github'\nimport { Google } from './provider-icons/Google'\nimport { Microsoft } from './provider-icons/Microsoft'\nimport { LoginType } from './types'\n\ninterface Props {\n trialProviders: Provider[],\n loading: boolean,\n loginProvider: Provider | undefined,\n onSubmit: (type: LoginType, provider?: Provider) => void,\n onChangeMode: (mode: LoginType) => void,\n}\n\ninterface ButtonProviderProps {\n provider: Provider,\n loading: boolean,\n disabled?: boolean,\n login: (type: LoginType, provider?: Provider) => void,\n}\n\nconst providerIcons: Record<Provider, React.ReactElement> = {\n github: <Github />,\n google: <Google />,\n microsoft: <Microsoft />,\n}\n\nconst ButtonProvider = ({ provider, login, loading, disabled }: ButtonProviderProps) => {\n const t = useTranslation()\n return (\n <Box>\n <Button\n colorScheme=\"light\"\n type=\"button\"\n size='md'\n sx={{ width: '100%' } as any}\n onClick={() => login('idp', provider)}\n disabled={loading || disabled}\n >\n {loading\n ? <LoadingCircular />\n : <Flex alignItems='center' style={{ gap: '4px' }}>\n {providerIcons[provider]}{interpolate(t.loginWith, capitalize(provider))}\n </Flex>\n }\n </Button>\n </Box>\n )\n}\n\nexport const IDPLogin = ({ trialProviders, loading, loginProvider, onSubmit, onChangeMode }: Props) => {\n const t = useTranslation()\n return (\n <>\n <Flex flexDirection='column' gap>\n {trialProviders?.map((provider) => <ButtonProvider\n provider={provider}\n login={onSubmit}\n loading={loading && loginProvider === provider}\n disabled={loading}\n key={provider}\n />)\n }\n </Flex>\n <p className=\"separator\">\n <Text appearance='microtext1' colorScheme='light.700'>{t.or}</Text>\n </p>\n <Text colorScheme=\"light.700\" align=\"center\">{t.corporateLoginTitle}</Text>\n <Button size='md' disabled={loading} colorScheme=\"light\" onClick={() => onChangeMode('sso')}>\n {t.corporateLoginButton}\n </Button>\n </>\n )\n}","import { getCookie } from '@stack-spot/portal-components'\nimport { LoginType } from './types'\n\nconst lastLoginTypeKey = 'lastLoginType'\nconst fallbackKeys = ['guided-tour', '@stack-spot/opa:user', 'CHAT_AGENTS', 'RATED_US_IN']\n\nexport function getLastLoginType(): LoginType {\n const type = localStorage.getItem(lastLoginTypeKey)\n if (type === 'idp' || type === 'sso') return type\n // for now, the user won't have the variable \"lastLoginType\" set. So, we check for tother variables that may indicate this is an enterprise user\n if (getCookie('stk-session.stackspot.com')) return 'sso'\n for (const key of fallbackKeys) {\n if (localStorage.getItem(key)) return 'sso'\n }\n return 'idp'\n}\n\nexport function setLastLoginType(type: LoginType) {\n localStorage.setItem(lastLoginTypeKey, type)\n}\n","import { Button, Flex, Input, Label, Text } from '@citric/core'\nimport { Github, Google } from '@citric/icons'\nimport { LoadingCircular } from '@citric/ui'\nimport { useTranslation } from './dictionary'\nimport { Provider } from './hooks'\nimport { Microsoft } from './provider-icons/Microsoft'\nimport { LoginType } from './types'\n\ninterface Props {\n value: string,\n onChange: (value: string) => void,\n disabled: boolean,\n loading: boolean,\n hasProvider: boolean,\n onChangeMode: (mode: LoginType) => void,\n}\n\ninterface ButtonProviderProps {\n provider: Provider,\n loading: boolean,\n login: (type: LoginType, provider?: Provider) => void\n}\n\nconst providerIcons: Record<Provider, React.ReactElement> = {\n github: <Github />,\n google: <Google />,\n microsoft: <Microsoft />,\n}\n\nexport const SSOLogin = ({ value, onChange, loading, disabled, hasProvider, onChangeMode }: Props) => {\n const t = useTranslation()\n return (\n <>\n <Flex flexDirection='column' style={{ gap: '4px', marginTop: '4px' }}>\n <Label htmlFor='email'>{t.label}</Label>\n <Input id=\"email\" type='email' name=\"email\" value={value} onChange={e => onChange(e.target.value)} placeholder={t.placeholder} />\n <Button colorScheme=\"primary\" size='md' style={{ marginTop: '12px' }} disabled={disabled || loading}>\n {loading && !hasProvider ? <LoadingCircular /> : <Text>{t.continue}</Text>}\n </Button>\n </Flex>\n <p className=\"separator\">\n <Text appearance='microtext1' colorScheme='light.700'>{t.or}</Text>\n </p>\n <Text colorScheme=\"light.700\" align=\"center\">{t.socialLoginTitle}</Text>\n <Button size='md' disabled={loading} colorScheme=\"light\" onClick={() => onChangeMode('idp')}>\n {t.socialLogin}\n </Button>\n </>\n )\n}","import { Flex, Text } from '@citric/core'\nimport { Card, LoadingCircular } from '@citric/ui'\nimport { AuthMethodUnavailable } from '@stack-spot/auth'\nimport { BannerWarning } from '@stack-spot/portal-components'\nimport { MiniLogo } from '@stack-spot/portal-components/svg'\nimport { theme } from '@stack-spot/portal-theme'\nimport { useEffect, useState } from 'react'\nimport { styled } from 'styled-components'\nimport { useTranslation } from './dictionary'\nimport { Provider, useTrialProviders } from './hooks'\nimport { IDPLogin } from './IDPLogin'\nimport { getLastLoginType, setLastLoginType } from './last-login-type'\nimport { SSOLogin } from './SSOLogin'\nimport { LoginData, LoginProps, LoginType } from './types'\n\nconst LoginBox = styled.form`\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 24px;\n\n header {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 24px;\n }\n\n .separator {\n padding: 0 8px;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n gap: 8px;\n margin: 0;\n\n &:before, &:after {\n content: '';\n height: 1px;\n flex: 1;\n background-color: ${theme.color.light['500']};\n }\n }\n\n .error {\n color: ${theme.color.danger['500']};\n line-height: 1.5rem;\n }\n`\n\nconst EmailNotAllowed = () => {\n const t = useTranslation()\n return <Card>\n <Flex justifyContent=\"center\">\n <Text appearance='body2'>\n {t.emailNotAllowedTitle}\n </Text>\n <Text appearance='body2' colorScheme='light.700'>\n {t.emailNotAllowedSubtitle}\n </Text>\n </Flex>\n </Card>\n}\n\nexport const Login = (\n { onSubmit, initialValue = '', welcomeText, removeLoadingOnSuccess, className, style, banner, loginTypes = ['idp', 'sso'] }: LoginProps,\n) => {\n const t = useTranslation()\n const [trialProviders, isLoadingTrialProviders] = useTrialProviders({ enabled: loginTypes.includes('idp') })\n const searchParams = new URLSearchParams(location.search)\n const [error, setError] = useState(searchParams.get('error_description') || searchParams.get('error') || '')\n const [errorCode] = useState(searchParams.get('error_code') || '')\n const [loading, setLoading] = useState(false)\n const providerQueryParam = searchParams.get('provider') as Provider & 'email'\n const [loginProvider, setLoginProvider] = useState<Provider | undefined>()\n const [email, setEmail] = useState(initialValue || searchParams.get('email') || '')\n const disabled = !email.match(/\\w+@\\w+/)\n const idpLoginEnabled = loginTypes.includes('idp') && !!trialProviders?.length\n const [mode, setMode] = useState<LoginType | undefined>()\n\n useEffect(() => {\n setMode(idpLoginEnabled ? getLastLoginType() : 'sso')\n }, [idpLoginEnabled])\n\n useEffect(() => {\n if (!providerQueryParam) return\n if (providerQueryParam === 'email') login('sso')\n else if (trialProviders?.includes(providerQueryParam)) login('idp', providerQueryParam)\n }, [trialProviders, isLoadingTrialProviders])\n\n async function login(type: LoginType, provider?: Provider) {\n setError('')\n setLoading(true)\n provider !== loginProvider && setLoginProvider(provider)\n try {\n const data: LoginData = type === 'idp' && !!provider ? { type: 'idp', provider: `external-idp:${provider}` } : { type: 'sso', email }\n setLastLoginType(data.type)\n await onSubmit(data)\n if (removeLoadingOnSuccess) setLoading(false)\n } catch (error: any) {\n setLoading(false)\n setLoginProvider(undefined)\n if (error instanceof AuthMethodUnavailable) {\n setError(t.emailNotFoundError)\n } else {\n setError(error.message || error.toString())\n }\n }\n }\n\n function submitForm(e: React.FormEvent<HTMLFormElement>) {\n e.preventDefault()\n if (disabled) return\n login('sso')\n }\n\n if (isLoadingTrialProviders || !mode) {\n return <Flex alignContent=\"center\" justifyContent=\"center\" my={5}><LoadingCircular /> </Flex>\n }\n\n const loginWithSocialAccount = (\n <>\n <span>{t.loginWithSocialAccount1}</span>\n <span style={{ fontWeight: 'bold' }}>{t.loginWithSocialAccount2}</span>\n <span>{t.loginWithSocialAccount3}</span>\n </>\n )\n\n return (\n <>\n <LoginBox onSubmit={submitForm} className={className} style={style}>\n <header>\n <MiniLogo />\n <Flex flexDirection='column' alignItems='center'>\n <Text appearance='body1' weight='medium'>{welcomeText || t.welcome}</Text>\n <Text appearance='body2' colorScheme='light.700' align='center'>\n {mode === 'idp' ? loginWithSocialAccount : t.loginWithEmail}\n </Text>\n </Flex>\n </header>\n {errorCode && errorCode === 'EMAIL_IS_NOT_ALLOWED' && <EmailNotAllowed />}\n\n {mode === 'sso' ? (\n <SSOLogin\n disabled={disabled}\n loading={loading}\n hasProvider={!loginProvider}\n value={email}\n onChange={setEmail}\n onChangeMode={setMode}\n />\n ) : (\n <IDPLogin\n loading={loading}\n loginProvider={loginProvider}\n onSubmit={login}\n trialProviders={trialProviders}\n onChangeMode={setMode}\n />\n )}\n\n {error && <Text className=\"error\" align=\"center\">{error}</Text>}\n </LoginBox>\n {banner ? <BannerWarning>\n {banner}\n </BannerWarning> : null}\n </>\n )\n}\n","/* eslint-disable max-len */\nimport { Flex } from '@citric/core'\nimport { useEffectOnce } from '@stack-spot/portal-components'\nimport { CSSToCitricAdapter } from '@stack-spot/portal-theme'\nimport '@stack-spot/portal-theme/dist/theme.css'\nimport { useLanguage } from '@stack-spot/portal-translate'\nimport { useState } from 'react'\nimport { Login } from './Login'\nimport { SessionManager } from './SessionManager'\nimport { LoginProps } from './types'\n\ntype AuthStatus = 'unknown' | 'authenticated' | 'unauthenticated'\n\ninterface Props {\n children: React.ReactElement,\n onLogin?: () => void,\n onSession?: () => void,\n onChangeStatus?: (status: AuthStatus) => void,\n customLoginProps?: Omit<LoginProps, 'onSubmit' | 'initialValue'>,\n sessionManager?: SessionManager,\n}\n\nexport const Authenticated = ({ children, onLogin, onSession, customLoginProps, sessionManager, onChangeStatus }: Props) => {\n const [authStatus, setAuthStatus] = useState<AuthStatus>('unknown')\n const language = useLanguage()\n sessionManager ??= SessionManager.instance\n if (!sessionManager) throw new Error('Please, provide a sessionManager')\n\n useEffectOnce(() => {\n async function checkAuth() {\n if (!sessionManager) throw new Error('Please, provide a sessionManager')\n await sessionManager.restoreSession()\n if (sessionManager.urlHasThirdPartyLoginData()) {\n await sessionManager.completeThirdPartyLogin()\n onLogin?.()\n }\n if (sessionManager.hasSession()) {\n setAuthStatus('authenticated')\n onSession?.()\n onChangeStatus?.('authenticated')\n } else {\n setAuthStatus('unauthenticated')\n onChangeStatus?.('unauthenticated')\n }\n }\n\n checkAuth()\n })\n\n if (authStatus === 'unknown') return null\n if (authStatus === 'authenticated') return children\n\n return (\n <CSSToCitricAdapter>\n <Flex justifyContent=\"center\" alignItems=\"center\" flex={1} style={{ height: '100%' }}>\n <Login\n style={{ width: '360px' }}\n onSubmit={data => sessionManager.startThirdPartyLogin({ ...data, locale: language })}\n initialValue={sessionManager.getEmailForLogin()}\n {...(customLoginProps || {})}\n />\n </Flex>\n </CSSToCitricAdapter>\n )\n}\n"],"names":["useTranslate","sessionKey","getCookieDomain","setCookie","getCookie","removeCookie","AuthManager","__spreadProps","__spreadValues","useState","useEffect","forwardRef","jsxs","jsx","Box","Button","LoadingCircular","Flex","interpolate","capitalize","Fragment","Text","Label","Input","styled","theme","Card","error","AuthMethodUnavailable","MiniLogo","BannerWarning","useLanguage","useEffectOnce","CSSToCitricAdapter"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/dictionary.ts","../src/utils/cookies.ts","../src/utils/redirect.ts","../src/SessionManager.ts","../src/hooks.ts","../src/provider-icons/Github.tsx","../src/provider-icons/Google.tsx","../src/provider-icons/Microsoft.tsx","../src/IDPLogin.tsx","../src/last-login-type.ts","../src/SSOLogin.tsx","../src/Login.tsx","../src/Authenticated.tsx"],"sourcesContent":["import { Dictionary, useTranslate } from '@stack-spot/portal-translate'\n\nconst dictionary = {\n en: {\n welcome: 'Welcome to StackSpot AI',\n loginWithEmail: 'Log in with your email.',\n loginWithSocialAccount1: 'Sign up or access your ',\n loginWithSocialAccount2: ' freemium account ',\n loginWithSocialAccount3: ' with a social login',\n label: 'Corporate email',\n placeholder: 'email@company.com',\n continue: 'Continue',\n or: 'Or',\n loginWith: 'Continue with $0',\n emailNotAllowedTitle: 'Your email is linked to an Enterprise account.',\n emailNotAllowedSubtitle: \"Please log in with your corporate email.\",\n socialLogin: 'Login or register with a social account',\n corporateLoginTitle: 'Already have a StackSpot Enterprise account?',\n corporateLoginButton: 'Enter Enterprise account',\n socialLoginTitle: 'Do you want to access another way?',\n emailNotFoundError: 'We couldn\\'t find an account for this email.',\n errorMobileDesktop: \"It looks like you are using a mobile device in desktop mode. We recommend adjusting this setting before continuing for a complete experience.\"\n },\n pt: {\n welcome: 'Boas vindas à StackSpot AI',\n loginWithEmail: 'Faça login com seu e-mail.',\n loginWithSocialAccount1: 'Cadastre-se ou acesse sua ',\n loginWithSocialAccount2: ' conta freemium ',\n loginWithSocialAccount3: ' com uma conta social',\n label: 'Email corporativo',\n placeholder: 'email@empresa.com',\n continue: 'Continuar',\n or: 'Ou',\n loginWith: 'Continuar com $0',\n emailNotAllowedTitle: '\"Este e-mail está vinculado a uma conta Enterprise.',\n emailNotAllowedSubtitle: \"Faça login com seu email corporativo.\",\n socialLogin: 'Entre ou cadastre-se com uma conta social',\n corporateLoginTitle: 'Já possui uma conta StackSpot Enterprise?',\n corporateLoginButton: 'Entrar na conta Enterprise',\n socialLoginTitle: 'Você quer entrar de outro jeito?',\n emailNotFoundError: 'Não encontramos uma conta para este e-mail.',\n errorMobileDesktop: \"Parece que você está utilizando um dispositivo móvel na versão desktop. Recomendamos ajustar essa configuração antes de continuar para uma experiência completa.\"\n },\n} satisfies Dictionary\n\nexport const useTranslation = () => useTranslate(dictionary)\n","import { ThirdPartyLoginParams } from '@stack-spot/auth'\nimport { getCookie, getCookieDomain, removeCookie, setCookie } from '@stack-spot/portal-components'\n\nconst sessionKey = `stk-session${getCookieDomain()}`\n\ntype SessionCookie = ThirdPartyLoginParams & { sub: string, tenant: string }\n\nexport const sessionCookie = Object.freeze({\n set: (data: SessionCookie) => setCookie(sessionKey, JSON.stringify(data)),\n get: (): SessionCookie | undefined => {\n try {\n const cookie = getCookie(sessionKey)\n return cookie ? JSON.parse(cookie) : undefined\n } catch (error) {\n console.error(error)\n }\n },\n delete: () => removeCookie(sessionKey)\n})\n","import { getCookieDomain } from '@stack-spot/portal-components'\n\nconst isValidDomain = (url: string) => {\n const portalDomainRegex = new RegExp(`^https?:\\/\\/[a-zA-Z0-9.-]*${getCookieDomain().replaceAll('.', '\\.')}(:[0-9]{2,4})*.*$`, 'g')\n const platformDomainRegex = new RegExp(/^https:\\/\\/[a-zA-Z0-9.-]+\\.stackspot\\.com.*$/, 'g')\n const result = portalDomainRegex.test(url) || platformDomainRegex.test(url)\n return result\n}\n\nexport const redirect = async (url: string) => {\n\n if (!isValidDomain(url)) throw new Error('Redirect URL invalid domain')\n\n window.location.href = url\n /**\n * This is intentional. The promise bellow will never be fulfilled.\n * Once the set href is not instantaneous, this will guarantee no further code is executed until the user is really redirected.\n * Particularly useful to prevent flickering page renders on scenarios with redirects.\n */\n await new Promise(() => '')\n}","import { AccessTokenPayload, AuthConfig, AuthManager, Logger, Session, ThirdPartyAuthType, ThirdPartyLoginParams } from '@stack-spot/auth'\nimport { sessionCookie } from './utils/cookies'\nimport { redirect } from './utils/redirect'\n\nconst sessionKey = 'session'\n\ninterface SessionManagerConfig extends Pick<AuthConfig, 'accountUrl' | 'authUrl' | 'clientId' | 'defaultTenant' | 'retry' | 'retryDelay' | 'logger'> {\n /**\n * The URL to redirect to when the user logs out.\n * @default location.origin\n */\n loginUrl?: string,\n /**\n * The URL to redirect to when the login completes in the authentication app. If not provided, will be the same as `loginUrl`.\n * @default loginUrl\n */\n redirectUrl?: string,\n /**\n * Forbidden authentication types to this Session Manager.\n */\n blockedAuthTypes?: ThirdPartyAuthType[]\n /**\n * A URL to send login events to (observability).\n */\n rdUrl?: string,\n}\n\ntype AuthExtraData = { from?: string | null, finalRedirect?: string | null }\n\ntype ChangeListener = (session: Session | undefined) => void\n\n/**\n * Controls the current session in a browser.\n * \n * This should not be used under a Node.JS environment.\n * \n * This is a singleton. To create the first instance or recover the current one, use `SessionManager.create`.\n */\nexport class SessionManager {\n private current: Session | undefined\n private readonly auth: AuthManager<AuthExtraData>\n private config: SessionManagerConfig\n private changeListeners: ChangeListener[] = []\n private logger: Logger\n static instance: SessionManager | undefined\n\n private constructor(config: SessionManagerConfig) {\n config.loginUrl ||= location.origin\n const redirectUrl = (config.redirectUrl || config.loginUrl).replace(/([^/])$/, '$1/') // the trailing \"/\" is required by Stackspot IAM.\n this.config = config\n this.auth = new AuthManager<AuthExtraData>({\n ...config,\n redirectUrl,\n storage: localStorage,\n sessionPersistence: {\n load: () => localStorage.getItem(sessionKey),\n save: (session) => localStorage.setItem(sessionKey, session),\n },\n })\n this.logger = this.auth.config.logger\n SessionManager.instance = this\n\n // Keep session in sync with other app's session\n addEventListener('focus', () => this.validateSharedSession())\n }\n\n static create(config: SessionManagerConfig) {\n return SessionManager.instance ?? new SessionManager(config)\n }\n\n private setSession(session: Session | undefined) {\n this.current = session\n this.changeListeners.forEach(l => l(session))\n if (session) this.setSessionCookie(session)\n }\n\n async restoreSession() {\n const session = await this.auth.restoreSession()\n this.logger.log('Validating shared session.')\n const sessionValid = await this.validateSharedSession(session)\n this.setSession(sessionValid ? session : undefined)\n }\n\n async validateSharedSession(session: Session | undefined = this.current): Promise<boolean> {\n\n // skipping because authentication is in progress\n if (this.urlHasThirdPartyLoginData()) {\n this.logger.log('Session is invalid because there\\'s another authentication in progress.')\n return false\n }\n\n const sharedSessionCookie = sessionCookie.get()\n\n // It has been logged out on another portal, so logout on this one too\n if (!sharedSessionCookie) {\n this.logger.log('Session is invalid because no shared session cookie was found, i.e, a logout was performed in another portal. Forcing log off.')\n session && await this.logout()\n return false\n }\n\n const isDifferentSessionActive = sharedSessionCookie.sub != session?.getTokenData().sub\n const isSharedSessionTypeBlocked = this.config.blockedAuthTypes?.includes(sharedSessionCookie.type)\n if (isSharedSessionTypeBlocked) {\n this.logger.log('Session is invalid because shared sessions have been blocked in the SessionManager\\'s configuration (blockedAuthTypes).')\n return false\n } else if (isDifferentSessionActive || !session) {\n this.logger.log(isDifferentSessionActive\n ? 'Session is invalid because a different session is already active.'\n : 'Session is invalid because it\\'s undefined.'\n )\n this.logger.log('Starting login with tenant from the session cookie.')\n await this.startThirdPartyLoginUsingTenant(sharedSessionCookie)\n return false\n }\n return true\n }\n\n hasSession() {\n return !!this.current && !this.current.isExpired()\n }\n\n getSession() {\n if (!this.hasSession()) {\n this.endSession()\n throw new Error('Session is not available, redirecting to login.')\n }\n return this.current!\n }\n\n async endSession(redirectToLogin = true) {\n this.current = undefined\n localStorage.removeItem(sessionKey)\n sessionCookie.delete()\n if (redirectToLogin && this.config.loginUrl) await redirect(this.config.loginUrl)\n }\n\n async restartSession() {\n await this.logout({ endSession: false })\n this.current = undefined\n localStorage.removeItem(sessionKey)\n await this.restoreSession()\n }\n\n async logout({ endSession }: { endSession?: boolean } | undefined = { endSession: true }) {\n try {\n await this.current?.logout()\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Could not logout from IDM.\\n${error}`)\n }\n if (!endSession) return\n await this.endSession()\n }\n\n async startThirdPartyLogin(data: ThirdPartyLoginParams) {\n const params = new URLSearchParams(location.search)\n const authUrl = await this.auth.startThirdPartyLogin(data, {\n from: location.href,\n finalRedirect: params.get('finalRedirect'),\n })\n await redirect(authUrl)\n }\n\n urlHasThirdPartyLoginData() {\n const url = new URL(location.toString())\n return url.searchParams.has('state') && !url.searchParams.has('error')\n }\n\n async startThirdPartyLoginUsingTenant(data: ThirdPartyLoginParams) {\n const params = new URLSearchParams(location.search)\n const cookie = sessionCookie.get()\n if (!cookie || !cookie.tenant) {\n this.logger.log('Login out because no tenant information is available in the following data:', JSON.stringify(data))\n //If no tenant is available we should log out the user\n await this.logout()\n return\n }\n const authUrl = await this.auth.getThirdPartyLoginFromTenant(data, cookie.tenant, {\n from: location.href,\n finalRedirect: params.get('finalRedirect'),\n }\n )\n await redirect(authUrl)\n }\n\n async completeThirdPartyLogin() {\n const url = new URL(location.toString())\n if (url.searchParams.has('error')) {\n throw new Error(`Error while signing in: ${url.searchParams.get('error_description')}`)\n }\n const { session, data: { from, finalRedirect } } = await this.auth.completeThirdPartyLogin(location.search)\n this.setSession(session)\n history.replaceState(null, '', from || location.toString().replace(/\\?.*$/, ''))\n this.sendLoginEventRd(this.current?.getTokenData())\n if (finalRedirect) await redirect(finalRedirect)\n }\n\n getEmailForLogin() {\n const session = sessionCookie.get()\n return session?.type == 'sso' ? session.email : undefined\n }\n\n async switchAccount(accountId: string) {\n this.logger.log('Switching accounts', accountId, this.current?.getTokenData().account_id_v2)\n try {\n this.current && await this.auth.switchAccount(accountId, this.current)\n } catch (error) {\n this.logger.error('Error while switching accounts', error)\n throw error\n }\n this.setSession(this.current)\n }\n\n onChange(listener: ChangeListener) {\n this.changeListeners.push(listener)\n return () => {\n const index = this.changeListeners.indexOf(listener)\n if (index != -1) this.changeListeners.splice(index, 1)\n }\n }\n\n private setSessionCookie(session: Session) {\n const { email, account_type, sub, tenant } = session.getTokenData()\n const { provider } = session.getSessionData()\n if (!email || !sub || !tenant) return\n const isFreemium = account_type == 'FREEMIUM'\n if (isFreemium) {\n sessionCookie.set({ type: 'idp', provider: provider!, sub, tenant })\n } else {\n sessionCookie.set({ email, type: 'sso', sub, tenant })\n }\n }\n\n private async sendLoginEventRd(tokenData?: AccessTokenPayload) {\n if (!this.config.rdUrl) return\n\n if (!tokenData) {\n // eslint-disable-next-line no-console\n console.error('Unable to trigger login hook. No sessionEmail or name identified.')\n return\n }\n\n const { email, name, account_type, client_id, account_name, trial_account_status } = tokenData\n const isLoginAI = client_id === \"stackspot-portal-ai\"\n const isLoginEDP = client_id === \"stackspot-portal\"\n\n if (!isLoginAI && !isLoginEDP && trial_account_status === 'PENDING') return\n\n const leadType = account_type === 'FREEMIUM' ? 'TRIAL' : 'ENTERPRISE'\n\n const rdObject = {\n event_type: 'CONVERSION',\n event_family: 'CDP',\n payload: {\n email,\n name,\n conversion_identifier: isLoginAI ? 'login_ai' : 'login_edp',\n cf_leadtype: leadType,\n cf_account_name: leadType === 'TRIAL' ? leadType : account_name,\n },\n }\n\n const response = await fetch(this.config.rdUrl, {\n method: 'POST',\n body: JSON.stringify(rdObject),\n headers: {\n 'content-type': 'application/json',\n },\n })\n const data = await response.json()\n\n if (!response.ok) {\n // eslint-disable-next-line no-console\n console.error('Error while sending event to RD Station', data)\n }\n }\n\n async getTrialEnabledProviders() {\n try {\n const response = await fetch(`${this.config.accountUrl}/v1/accounts/trial/sso`)\n const trialProviders = await response.json()\n\n if (!response.ok) {\n // eslint-disable-next-line no-console\n console.error('Error while fetching available login providers', trialProviders)\n }\n\n const providerKeys = Object.keys(trialProviders || {})\n return providerKeys.filter(key => trialProviders[key] === true)\n } catch (error) {\n console.error('Error while fetching available login providers', error)\n return []\n }\n }\n}\n","import { Session } from '@stack-spot/auth'\nimport { useEffect, useState } from 'react'\nimport { SessionManager } from './SessionManager'\n\nexport function useSession() {\n const manager = SessionManager.instance\n const [session, setSession] = useState<Session | undefined>(manager?.hasSession() ? manager.getSession() : undefined)\n useEffect(() => {\n return manager?.onChange(setSession)\n }, [])\n return session\n}\n\nexport type Provider = 'google' | 'github' | 'microsoft'\nexport const useTrialProviders = ({ enabled = true }): [Provider[], boolean] => {\n const [isLoadingTrialProviders, setIsLoadingTrialProviders] = useState<boolean>(enabled)\n const [trialProviders, setTrialProviders] = useState<Provider[]>([])\n\n useEffect(() => {\n (async () => {\n if (!SessionManager.instance || !enabled) return\n try {\n const providers = (await SessionManager.instance.getTrialEnabledProviders()) as Provider[]\n setTrialProviders(providers)\n setIsLoadingTrialProviders(false)\n } catch (error) {\n console.error(error)\n setIsLoadingTrialProviders(false)\n }\n })()\n }, [SessionManager.instance])\n\n return [trialProviders, isLoadingTrialProviders]\n}\n","import { forwardRef, Ref, SVGProps } from 'react'\n\nexport const Github = forwardRef((props: SVGProps<SVGSVGElement>, ref: Ref<SVGSVGElement>) => (\n <svg ref={ref} {...props} width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_1215_2072)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12.0011 4.38525C10.1019 4.38624 8.26498 5.05889 6.81881 6.28294C5.37263 7.50698 4.4115 9.20259 4.10726 11.0666C3.80302 12.9306 4.17551 14.8414 5.15814 16.4574C6.14077 18.0733 7.66946 19.2891 9.47085 19.8872C9.86827 19.961 10.018 19.7147 10.018 19.5053C10.018 19.2958 10.01 18.6886 10.0074 18.0247C7.78183 18.5055 7.31155 17.0856 7.31155 17.0856C6.94858 16.1635 6.42399 15.9212 6.42399 15.9212C5.69804 15.4286 6.4783 15.4378 6.4783 15.4378C7.28241 15.4944 7.705 16.2584 7.705 16.2584C8.4177 17.4741 9.57683 17.1225 10.0325 16.917C10.1041 16.402 10.312 16.0516 10.5412 15.8527C8.76345 15.6525 6.89559 14.9702 6.89559 11.9222C6.88457 11.1317 7.17958 10.3673 7.71957 9.78704C7.63744 9.58683 7.36321 8.77808 7.79772 7.67954C7.79772 7.67954 8.46936 7.46616 9.99809 8.49488C11.3093 8.13834 12.6928 8.13834 14.0041 8.49488C15.5315 7.46616 16.2018 7.67954 16.2018 7.67954C16.6376 8.77544 16.3634 9.58419 16.2813 9.78704C16.823 10.3674 17.1186 11.1332 17.1066 11.9248C17.1066 14.9794 15.2347 15.6525 13.4543 15.8487C13.7404 16.0964 13.9961 16.5798 13.9961 17.3227C13.9961 18.387 13.9868 19.2431 13.9868 19.5053C13.9868 19.7173 14.1312 19.9649 14.5366 19.8872C16.3382 19.289 17.867 18.0731 18.8496 16.4568C19.8323 14.8406 20.2046 12.9295 19.9 11.0653C19.5954 9.20112 18.6338 7.50549 17.1871 6.28166C15.7405 5.05782 13.9031 4.38561 12.0037 4.38525H12.0011Z\" fill=\"white\" />\n <path d=\"M9.35091 17.3684C9.35091 17.4329 9.27673 17.4882 9.18135 17.4896C9.08597 17.4909 9.00781 17.4382 9.00781 17.3736C9.00781 17.3091 9.08199 17.2538 9.17737 17.2525C9.27275 17.2511 9.35091 17.3025 9.35091 17.3684Z\" fill=\"white\" />\n <path d=\"M9.96094 17.2672C9.97286 17.3317 9.90662 17.3989 9.81124 17.4147C9.71586 17.4305 9.63241 17.3923 9.62048 17.3291C9.60856 17.2659 9.67745 17.1974 9.77018 17.1803C9.86291 17.1631 9.94902 17.2027 9.96094 17.2672Z\" fill=\"white\" />\n <path d=\"M8.6968 17.324C8.67693 17.3859 8.58685 17.4136 8.49676 17.3872C8.40668 17.3609 8.34707 17.2871 8.36429 17.2239C8.38151 17.1607 8.47292 17.1317 8.56433 17.1607C8.65573 17.1897 8.71402 17.2595 8.6968 17.324Z\" fill=\"white\" />\n <path d=\"M8.09774 17.0658C8.05402 17.1145 7.96527 17.1013 7.89241 17.0355C7.81955 16.9696 7.80232 16.88 7.84604 16.8326C7.88975 16.7852 7.97851 16.7984 8.05402 16.8629C8.12953 16.9274 8.1441 17.0183 8.09774 17.0658V17.0658Z\" fill=\"white\" />\n <path d=\"M7.6686 16.6231C7.61959 16.6574 7.53612 16.6231 7.48976 16.5546C7.47694 16.5423 7.46674 16.5276 7.45978 16.5113C7.45281 16.495 7.44922 16.4775 7.44922 16.4598C7.44922 16.4421 7.45281 16.4246 7.45978 16.4083C7.46674 16.392 7.47694 16.3772 7.48976 16.3649C7.53877 16.332 7.62224 16.3649 7.6686 16.4321C7.71497 16.4993 7.71629 16.5889 7.6686 16.6231V16.6231Z\" fill=\"white\" />\n <path d=\"M7.3535 16.1662C7.32607 16.1799 7.29468 16.1838 7.26472 16.177C7.23475 16.1703 7.20807 16.1534 7.18924 16.1293C7.13757 16.074 7.12697 15.9976 7.16671 15.9633C7.20645 15.9291 7.27799 15.9449 7.32966 16.0002C7.38132 16.0555 7.39324 16.1319 7.3535 16.1662Z\" fill=\"white\" />\n <path d=\"M7.02905 15.8062C7.01183 15.8457 6.94825 15.8576 6.89658 15.8299C6.84492 15.8022 6.8065 15.7509 6.82505 15.71C6.8436 15.6692 6.90586 15.6587 6.95752 15.6863C7.00919 15.714 7.04893 15.7667 7.02905 15.8062Z\" fill=\"white\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1215_2072\">\n <rect width=\"16\" height=\"16\" fill=\"white\" transform=\"translate(4 4.05176)\" />\n </clipPath>\n </defs>\n </svg>\n))\n","import { forwardRef, Ref, SVGProps } from 'react'\n\nexport const Google = forwardRef((props: SVGProps<SVGSVGElement>, ref: Ref<SVGSVGElement>) => (\n <svg ref={ref} {...props} width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_1215_2403)\">\n <path d=\"M20.3442 12.2359C20.3442 11.6921 20.3001 11.1454 20.206 10.6104H12.6602V13.691H16.9813C16.802 14.6846 16.2258 15.5635 15.3822 16.122V18.1209H17.9602C19.4741 16.7276 20.3442 14.6699 20.3442 12.2359Z\" fill=\"#4285F4\" />\n <path d=\"M12.6607 20.0525C14.8184 20.0525 16.6379 19.344 17.9637 18.1212L15.3857 16.1223C14.6684 16.6103 13.7425 16.8866 12.6637 16.8866C10.5766 16.8866 8.80696 15.4785 8.17202 13.5854H5.51172V15.6461C6.86979 18.3475 9.63592 20.0525 12.6607 20.0525V20.0525Z\" fill=\"#34A853\" />\n <path d=\"M8.16852 13.5856C7.83341 12.592 7.83341 11.5161 8.16852 10.5225V8.46191H5.51116C4.37649 10.7224 4.37649 13.3857 5.51116 15.6462L8.16852 13.5856V13.5856Z\" fill=\"#FBBC04\" />\n <path d=\"M12.6607 7.2182C13.8013 7.20056 14.9036 7.62974 15.7296 8.41754L18.0136 6.1335C16.5674 4.77543 14.6479 4.02878 12.6607 4.0523C9.63592 4.0523 6.86979 5.75724 5.51172 8.46163L8.16908 10.5223C8.80108 8.62625 10.5736 7.2182 12.6607 7.2182V7.2182Z\" fill=\"#EA4335\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1215_2403\">\n <rect width=\"16\" height=\"16\" fill=\"white\" transform=\"translate(4.5 4.05176)\" />\n </clipPath>\n </defs>\n </svg>\n))\n","import { forwardRef, Ref, SVGProps } from 'react'\n\nexport const Microsoft = forwardRef((props: SVGProps<SVGSVGElement>, ref: Ref<SVGSVGElement>) => (\n <svg ref={ref} {...props} width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.19531 4.74707H12.1518V11.7036H5.19531V4.74707Z\" fill=\"#F35325\" />\n <path d=\"M12.8477 4.74707H19.8042V11.7036H12.8477V4.74707Z\" fill=\"#81BC06\" />\n <path d=\"M5.19531 12.3994H12.1518V19.3559H5.19531V12.3994Z\" fill=\"#05A6F0\" />\n <path d=\"M12.8477 12.3994H19.8042V19.3559H12.8477V12.3994Z\" fill=\"#FFBA08\" />\n </svg>\n))\n","import { Box, Button, Flex, IconBox, Text } from '@citric/core'\nimport { ExclamationTriangle } from '@citric/icons'\nimport { LoadingCircular } from '@citric/ui'\nimport { interpolate } from '@stack-spot/portal-translate'\nimport { capitalize } from 'lodash'\nimport { useTranslation } from './dictionary'\nimport { Provider } from './hooks'\nimport { Github } from './provider-icons/Github'\nimport { Google } from './provider-icons/Google'\nimport { Microsoft } from './provider-icons/Microsoft'\nimport { LoginType } from './types'\n\ninterface Props {\n trialProviders: Provider[],\n loading: boolean,\n loginProvider: Provider | undefined,\n onSubmit: (type: LoginType, provider?: Provider) => void,\n onChangeMode: (mode: LoginType) => void,\n}\n\ninterface ButtonProviderProps {\n provider: Provider,\n loading: boolean,\n disabled?: boolean,\n login: (type: LoginType, provider?: Provider) => void,\n}\n\nconst providerIcons: Record<Provider, React.ReactElement> = {\n github: <Github />,\n google: <Google />,\n microsoft: <Microsoft />,\n}\n\nconst ButtonProvider = ({ provider, login, loading, disabled }: ButtonProviderProps) => {\n const t = useTranslation()\n return (\n <Box>\n <Button\n colorScheme=\"light\"\n type=\"button\"\n size='md'\n sx={{ width: '100%' } as any}\n onClick={() => login('idp', provider)}\n disabled={loading || disabled}\n >\n {loading\n ? <LoadingCircular />\n : <Flex alignItems='center' style={{ gap: '4px' }}>\n {providerIcons[provider]}{interpolate(t.loginWith, capitalize(provider))}\n </Flex>\n }\n </Button>\n </Box>\n )\n}\n\nfunction hasTouchSupport() {\n return 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n}\n\nfunction isMobileUserAgent() {\n return /Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\nfunction isMobileWithDesktopView() {\n return !isMobileUserAgent() && hasTouchSupport();\n}\n\nexport const IDPLogin = ({ trialProviders, loading, loginProvider, onSubmit, onChangeMode }: Props) => {\n const t = useTranslation()\n const showErrorMessage = isMobileWithDesktopView()\n\n return (\n <>\n {showErrorMessage && <Flex bg=\"warning\" p={4} role=\"alert\" flexWrap='nowrap'>\n <IconBox colorIcon=\"warning.contrastText\">\n <ExclamationTriangle /> \n </IconBox>\n <Text appearance='body2' ml={2} colorScheme=\"warning.contrastText\">\n {t.errorMobileDesktop}\n </Text>\n </Flex>}\n\n <Flex flexDirection='column' gap>\n {trialProviders?.map((provider) => <ButtonProvider\n provider={provider}\n login={onSubmit}\n loading={loading && loginProvider === provider}\n disabled={loading}\n key={provider}\n />)\n }\n </Flex>\n <p className=\"separator\">\n <Text appearance='microtext1' colorScheme='light.700'>{t.or}</Text>\n </p>\n <Text colorScheme=\"light.700\" align=\"center\">{t.corporateLoginTitle}</Text>\n <Button size='md' disabled={loading} colorScheme=\"light\" onClick={() => onChangeMode('sso')}>\n {t.corporateLoginButton}\n </Button>\n </>\n )\n}","import { getCookie } from '@stack-spot/portal-components'\nimport { LoginType } from './types'\n\nconst lastLoginTypeKey = 'lastLoginType'\nconst fallbackKeys = ['guided-tour', '@stack-spot/opa:user', 'CHAT_AGENTS', 'RATED_US_IN']\n\nexport function getLastLoginType(): LoginType {\n const type = localStorage.getItem(lastLoginTypeKey)\n if (type === 'idp' || type === 'sso') return type\n // for now, the user won't have the variable \"lastLoginType\" set. So, we check for tother variables that may indicate this is an enterprise user\n if (getCookie('stk-session.stackspot.com')) return 'sso'\n for (const key of fallbackKeys) {\n if (localStorage.getItem(key)) return 'sso'\n }\n return 'idp'\n}\n\nexport function setLastLoginType(type: LoginType) {\n localStorage.setItem(lastLoginTypeKey, type)\n}\n","import { Button, Flex, Input, Label, Text } from '@citric/core'\nimport { Github, Google } from '@citric/icons'\nimport { LoadingCircular } from '@citric/ui'\nimport { useTranslation } from './dictionary'\nimport { Provider } from './hooks'\nimport { Microsoft } from './provider-icons/Microsoft'\nimport { LoginType } from './types'\n\ninterface Props {\n value: string,\n onChange: (value: string) => void,\n disabled: boolean,\n loading: boolean,\n hasProvider: boolean,\n onChangeMode: (mode: LoginType) => void,\n}\n\ninterface ButtonProviderProps {\n provider: Provider,\n loading: boolean,\n login: (type: LoginType, provider?: Provider) => void\n}\n\nconst providerIcons: Record<Provider, React.ReactElement> = {\n github: <Github />,\n google: <Google />,\n microsoft: <Microsoft />,\n}\n\nexport const SSOLogin = ({ value, onChange, loading, disabled, hasProvider, onChangeMode }: Props) => {\n const t = useTranslation()\n return (\n <>\n <Flex flexDirection='column' style={{ gap: '4px', marginTop: '4px' }}>\n <Label htmlFor='email'>{t.label}</Label>\n <Input id=\"email\" type='email' name=\"email\" value={value} onChange={e => onChange(e.target.value)} placeholder={t.placeholder} />\n <Button colorScheme=\"primary\" size='md' style={{ marginTop: '12px' }} disabled={disabled || loading}>\n {loading && !hasProvider ? <LoadingCircular /> : <Text>{t.continue}</Text>}\n </Button>\n </Flex>\n <p className=\"separator\">\n <Text appearance='microtext1' colorScheme='light.700'>{t.or}</Text>\n </p>\n <Text colorScheme=\"light.700\" align=\"center\">{t.socialLoginTitle}</Text>\n <Button size='md' disabled={loading} colorScheme=\"light\" onClick={() => onChangeMode('idp')}>\n {t.socialLogin}\n </Button>\n </>\n )\n}","import { Flex, Text } from '@citric/core'\nimport { Card, LoadingCircular } from '@citric/ui'\nimport { AuthMethodUnavailable } from '@stack-spot/auth'\nimport { BannerWarning } from '@stack-spot/portal-components'\nimport { MiniLogo } from '@stack-spot/portal-components/svg'\nimport { theme } from '@stack-spot/portal-theme'\nimport { useEffect, useState } from 'react'\nimport { styled } from 'styled-components'\nimport { useTranslation } from './dictionary'\nimport { Provider, useTrialProviders } from './hooks'\nimport { IDPLogin } from './IDPLogin'\nimport { getLastLoginType, setLastLoginType } from './last-login-type'\nimport { SSOLogin } from './SSOLogin'\nimport { LoginData, LoginProps, LoginType } from './types'\n\nconst LoginBox = styled.form`\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 24px;\n\n header {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 24px;\n }\n\n .separator {\n padding: 0 8px;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n gap: 8px;\n margin: 0;\n\n &:before, &:after {\n content: '';\n height: 1px;\n flex: 1;\n background-color: ${theme.color.light['500']};\n }\n }\n\n .error {\n color: ${theme.color.danger['500']};\n line-height: 1.5rem;\n }\n`\n\nconst EmailNotAllowed = () => {\n const t = useTranslation()\n return <Card>\n <Flex justifyContent=\"center\">\n <Text appearance='body2'>\n {t.emailNotAllowedTitle}\n </Text>\n <Text appearance='body2' colorScheme='light.700'>\n {t.emailNotAllowedSubtitle}\n </Text>\n </Flex>\n </Card>\n}\n\nexport const Login = (\n { onSubmit, initialValue = '', welcomeText, removeLoadingOnSuccess, className, style, banner, loginTypes = ['idp', 'sso'] }: LoginProps,\n) => {\n const t = useTranslation()\n const [trialProviders, isLoadingTrialProviders] = useTrialProviders({ enabled: loginTypes.includes('idp') })\n const searchParams = new URLSearchParams(location.search)\n const [error, setError] = useState(searchParams.get('error_description') || searchParams.get('error') || '')\n const [errorCode] = useState(searchParams.get('error_code') || '')\n const [loading, setLoading] = useState(false)\n const providerQueryParam = searchParams.get('provider') as Provider & 'email'\n const [loginProvider, setLoginProvider] = useState<Provider | undefined>()\n const [email, setEmail] = useState(initialValue || searchParams.get('email') || '')\n const disabled = !email.match(/\\w+@\\w+/)\n const idpLoginEnabled = loginTypes.includes('idp') && !!trialProviders?.length\n const [mode, setMode] = useState<LoginType | undefined>()\n\n useEffect(() => {\n setMode(idpLoginEnabled ? getLastLoginType() : 'sso')\n }, [idpLoginEnabled])\n\n useEffect(() => {\n if (!providerQueryParam) return\n if (providerQueryParam === 'email') login('sso')\n else if (trialProviders?.includes(providerQueryParam)) login('idp', providerQueryParam)\n }, [trialProviders, isLoadingTrialProviders])\n\n async function login(type: LoginType, provider?: Provider) {\n setError('')\n setLoading(true)\n provider !== loginProvider && setLoginProvider(provider)\n try {\n const data: LoginData = type === 'idp' && !!provider ? { type: 'idp', provider: `external-idp:${provider}` } : { type: 'sso', email }\n setLastLoginType(data.type)\n await onSubmit(data)\n if (removeLoadingOnSuccess) setLoading(false)\n } catch (error: any) {\n setLoading(false)\n setLoginProvider(undefined)\n if (error instanceof AuthMethodUnavailable) {\n setError(t.emailNotFoundError)\n } else {\n setError(error.message || error.toString())\n }\n }\n }\n\n function submitForm(e: React.FormEvent<HTMLFormElement>) {\n e.preventDefault()\n if (disabled) return\n login('sso')\n }\n\n if (isLoadingTrialProviders || !mode) {\n return <Flex alignContent=\"center\" justifyContent=\"center\" my={5}><LoadingCircular /> </Flex>\n }\n\n const loginWithSocialAccount = (\n <>\n <span>{t.loginWithSocialAccount1}</span>\n <span style={{ fontWeight: 'bold' }}>{t.loginWithSocialAccount2}</span>\n <span>{t.loginWithSocialAccount3}</span>\n </>\n )\n\n return (\n <>\n <LoginBox onSubmit={submitForm} className={className} style={style}>\n <header>\n <MiniLogo />\n <Flex flexDirection='column' alignItems='center'>\n <Text appearance='body1' weight='medium'>{welcomeText || t.welcome}</Text>\n <Text appearance='body2' colorScheme='light.700' align='center'>\n {mode === 'idp' ? loginWithSocialAccount : t.loginWithEmail}\n </Text>\n </Flex>\n </header>\n {errorCode && errorCode === 'EMAIL_IS_NOT_ALLOWED' && <EmailNotAllowed />}\n\n {mode === 'sso' ? (\n <SSOLogin\n disabled={disabled}\n loading={loading}\n hasProvider={!loginProvider}\n value={email}\n onChange={setEmail}\n onChangeMode={setMode}\n />\n ) : (\n <IDPLogin\n loading={loading}\n loginProvider={loginProvider}\n onSubmit={login}\n trialProviders={trialProviders}\n onChangeMode={setMode}\n />\n )}\n\n {error && <Text className=\"error\" align=\"center\">{error}</Text>}\n </LoginBox>\n {banner ? <BannerWarning>\n {banner}\n </BannerWarning> : null}\n </>\n )\n}\n","/* eslint-disable max-len */\nimport { Flex } from '@citric/core'\nimport { useEffectOnce } from '@stack-spot/portal-components'\nimport { CSSToCitricAdapter } from '@stack-spot/portal-theme'\nimport '@stack-spot/portal-theme/dist/theme.css'\nimport { useLanguage } from '@stack-spot/portal-translate'\nimport { useState } from 'react'\nimport { Login } from './Login'\nimport { SessionManager } from './SessionManager'\nimport { LoginProps } from './types'\n\ntype AuthStatus = 'unknown' | 'authenticated' | 'unauthenticated'\n\ninterface Props {\n children: React.ReactElement,\n onLogin?: () => void,\n onSession?: () => void,\n onChangeStatus?: (status: AuthStatus) => void,\n customLoginProps?: Omit<LoginProps, 'onSubmit' | 'initialValue'>,\n sessionManager?: SessionManager,\n}\n\nexport const Authenticated = ({ children, onLogin, onSession, customLoginProps, sessionManager, onChangeStatus }: Props) => {\n const [authStatus, setAuthStatus] = useState<AuthStatus>('unknown')\n const language = useLanguage()\n sessionManager ??= SessionManager.instance\n if (!sessionManager) throw new Error('Please, provide a sessionManager')\n\n useEffectOnce(() => {\n async function checkAuth() {\n if (!sessionManager) throw new Error('Please, provide a sessionManager')\n await sessionManager.restoreSession()\n if (sessionManager.urlHasThirdPartyLoginData()) {\n await sessionManager.completeThirdPartyLogin()\n onLogin?.()\n }\n if (sessionManager.hasSession()) {\n setAuthStatus('authenticated')\n onSession?.()\n onChangeStatus?.('authenticated')\n } else {\n setAuthStatus('unauthenticated')\n onChangeStatus?.('unauthenticated')\n }\n }\n\n checkAuth()\n })\n\n if (authStatus === 'unknown') return null\n if (authStatus === 'authenticated') return children\n\n return (\n <CSSToCitricAdapter>\n <Flex justifyContent=\"center\" alignItems=\"center\" flex={1} style={{ height: '100%' }}>\n <Login\n style={{ width: '360px' }}\n onSubmit={data => sessionManager.startThirdPartyLogin({ ...data, locale: language })}\n initialValue={sessionManager.getEmailForLogin()}\n {...(customLoginProps || {})}\n />\n </Flex>\n </CSSToCitricAdapter>\n )\n}\n"],"names":["useTranslate","sessionKey","getCookieDomain","setCookie","getCookie","removeCookie","AuthManager","__spreadProps","__spreadValues","useState","useEffect","forwardRef","jsxs","jsx","Box","Button","LoadingCircular","Flex","interpolate","capitalize","Fragment","IconBox","ExclamationTriangle","Text","Label","Input","styled","theme","Card","error","AuthMethodUnavailable","MiniLogo","BannerWarning","useLanguage","useEffectOnce","CSSToCitricAdapter"],"mappings":"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"}
package/out/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { Flex, Text, Button, Box, Label, Input } from '@citric/core';
2
+ import { Flex, IconBox, Text, Button, Box, Label, Input } from '@citric/core';
3
3
  import { getCookieDomain, setCookie, getCookie, removeCookie, BannerWarning, useEffectOnce } from '@stack-spot/portal-components';
4
4
  import { theme, CSSToCitricAdapter } from '@stack-spot/portal-theme';
5
5
  import '@stack-spot/portal-theme/dist/theme.css';
@@ -9,8 +9,8 @@ import { LoadingCircular, Card } from '@citric/ui';
9
9
  import { AuthManager, AuthMethodUnavailable } from '@stack-spot/auth';
10
10
  import { MiniLogo } from '@stack-spot/portal-components/svg';
11
11
  import { styled } from 'styled-components';
12
+ import { ExclamationTriangle } from '@citric/icons';
12
13
  import { capitalize } from 'lodash';
13
- import '@citric/icons';
14
14
 
15
15
  const dictionary = {
16
16
  en: {
@@ -30,7 +30,8 @@ const dictionary = {
30
30
  corporateLoginTitle: "Already have a StackSpot Enterprise account?",
31
31
  corporateLoginButton: "Enter Enterprise account",
32
32
  socialLoginTitle: "Do you want to access another way?",
33
- emailNotFoundError: "We couldn't find an account for this email."
33
+ emailNotFoundError: "We couldn't find an account for this email.",
34
+ errorMobileDesktop: "It looks like you are using a mobile device in desktop mode. We recommend adjusting this setting before continuing for a complete experience."
34
35
  },
35
36
  pt: {
36
37
  welcome: "Boas vindas \xE0 StackSpot AI",
@@ -49,7 +50,8 @@ const dictionary = {
49
50
  corporateLoginTitle: "J\xE1 possui uma conta StackSpot Enterprise?",
50
51
  corporateLoginButton: "Entrar na conta Enterprise",
51
52
  socialLoginTitle: "Voc\xEA quer entrar de outro jeito?",
52
- emailNotFoundError: "N\xE3o encontramos uma conta para este e-mail."
53
+ emailNotFoundError: "N\xE3o encontramos uma conta para este e-mail.",
54
+ errorMobileDesktop: "Parece que voc\xEA est\xE1 utilizando um dispositivo m\xF3vel na vers\xE3o desktop. Recomendamos ajustar essa configura\xE7\xE3o antes de continuar para uma experi\xEAncia completa."
53
55
  }
54
56
  };
55
57
  const useTranslation = () => useTranslate(dictionary);
@@ -111,6 +113,7 @@ const _SessionManager = class _SessionManager {
111
113
  __publicField(this, "auth");
112
114
  __publicField(this, "config");
113
115
  __publicField(this, "changeListeners", []);
116
+ __publicField(this, "logger");
114
117
  config.loginUrl || (config.loginUrl = location.origin);
115
118
  const redirectUrl = (config.redirectUrl || config.loginUrl).replace(/([^/])$/, "$1/");
116
119
  this.config = config;
@@ -122,6 +125,7 @@ const _SessionManager = class _SessionManager {
122
125
  save: (session) => localStorage.setItem(sessionKey, session)
123
126
  }
124
127
  }));
128
+ this.logger = this.auth.config.logger;
125
129
  _SessionManager.instance = this;
126
130
  addEventListener("focus", () => this.validateSharedSession());
127
131
  }
@@ -137,23 +141,32 @@ const _SessionManager = class _SessionManager {
137
141
  }
138
142
  async restoreSession() {
139
143
  const session = await this.auth.restoreSession();
144
+ this.logger.log("Validating shared session.");
140
145
  const sessionValid = await this.validateSharedSession(session);
141
146
  this.setSession(sessionValid ? session : void 0);
142
147
  }
143
148
  async validateSharedSession(session = this.current) {
144
149
  var _a;
145
- if (this.urlHasThirdPartyLoginData())
150
+ if (this.urlHasThirdPartyLoginData()) {
151
+ this.logger.log("Session is invalid because there's another authentication in progress.");
146
152
  return false;
153
+ }
147
154
  const sharedSessionCookie = sessionCookie.get();
148
155
  if (!sharedSessionCookie) {
156
+ this.logger.log("Session is invalid because no shared session cookie was found, i.e, a logout was performed in another portal. Forcing log off.");
149
157
  session && await this.logout();
150
158
  return false;
151
159
  }
152
160
  const isDifferentSessionActive = sharedSessionCookie.sub != (session == null ? void 0 : session.getTokenData().sub);
153
161
  const isSharedSessionTypeBlocked = (_a = this.config.blockedAuthTypes) == null ? void 0 : _a.includes(sharedSessionCookie.type);
154
- if (isSharedSessionTypeBlocked)
162
+ if (isSharedSessionTypeBlocked) {
163
+ this.logger.log("Session is invalid because shared sessions have been blocked in the SessionManager's configuration (blockedAuthTypes).");
155
164
  return false;
156
- else if (isDifferentSessionActive || !session) {
165
+ } else if (isDifferentSessionActive || !session) {
166
+ this.logger.log(
167
+ isDifferentSessionActive ? "Session is invalid because a different session is already active." : "Session is invalid because it's undefined."
168
+ );
169
+ this.logger.log("Starting login with tenant from the session cookie.");
157
170
  await this.startThirdPartyLoginUsingTenant(sharedSessionCookie);
158
171
  return false;
159
172
  }
@@ -210,6 +223,7 @@ ${error}`);
210
223
  const params = new URLSearchParams(location.search);
211
224
  const cookie = sessionCookie.get();
212
225
  if (!cookie || !cookie.tenant) {
226
+ this.logger.log("Login out because no tenant information is available in the following data:", JSON.stringify(data));
213
227
  await this.logout();
214
228
  return;
215
229
  }
@@ -241,7 +255,14 @@ ${error}`);
241
255
  return (session == null ? void 0 : session.type) == "sso" ? session.email : void 0;
242
256
  }
243
257
  async switchAccount(accountId) {
244
- this.current && await this.auth.switchAccount(accountId, this.current);
258
+ var _a;
259
+ this.logger.log("Switching accounts", accountId, (_a = this.current) == null ? void 0 : _a.getTokenData().account_id_v2);
260
+ try {
261
+ this.current && await this.auth.switchAccount(accountId, this.current);
262
+ } catch (error) {
263
+ this.logger.error("Error while switching accounts", error);
264
+ throw error;
265
+ }
245
266
  this.setSession(this.current);
246
267
  }
247
268
  onChange(listener) {
@@ -457,9 +478,23 @@ const ButtonProvider = ({ provider, login, loading, disabled }) => {
457
478
  }
458
479
  ) });
459
480
  };
481
+ function hasTouchSupport() {
482
+ return "ontouchstart" in window || navigator.maxTouchPoints > 0;
483
+ }
484
+ function isMobileUserAgent() {
485
+ return /Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
486
+ }
487
+ function isMobileWithDesktopView() {
488
+ return !isMobileUserAgent() && hasTouchSupport();
489
+ }
460
490
  const IDPLogin = ({ trialProviders, loading, loginProvider, onSubmit, onChangeMode }) => {
461
491
  const t = useTranslation();
492
+ const showErrorMessage = isMobileWithDesktopView();
462
493
  return /* @__PURE__ */ jsxs(Fragment, { children: [
494
+ showErrorMessage && /* @__PURE__ */ jsxs(Flex, { bg: "warning", p: 4, role: "alert", flexWrap: "nowrap", children: [
495
+ /* @__PURE__ */ jsx(IconBox, { colorIcon: "warning.contrastText", children: /* @__PURE__ */ jsx(ExclamationTriangle, {}) }),
496
+ /* @__PURE__ */ jsx(Text, { appearance: "body2", ml: 2, colorScheme: "warning.contrastText", children: t.errorMobileDesktop })
497
+ ] }),
463
498
  /* @__PURE__ */ jsx(Flex, { flexDirection: "column", gap: true, children: trialProviders == null ? void 0 : trialProviders.map((provider) => /* @__PURE__ */ jsx(
464
499
  ButtonProvider,
465
500
  {
package/out/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/dictionary.ts","../src/utils/cookies.ts","../src/utils/redirect.ts","../src/SessionManager.ts","../src/hooks.ts","../src/provider-icons/Github.tsx","../src/provider-icons/Google.tsx","../src/provider-icons/Microsoft.tsx","../src/IDPLogin.tsx","../src/last-login-type.ts","../src/SSOLogin.tsx","../src/Login.tsx","../src/Authenticated.tsx"],"sourcesContent":["import { Dictionary, useTranslate } from '@stack-spot/portal-translate'\n\nconst dictionary = {\n en: {\n welcome: 'Welcome to StackSpot AI',\n loginWithEmail: 'Log in with your email.',\n loginWithSocialAccount1: 'Sign up or access your ',\n loginWithSocialAccount2: ' freemium account ',\n loginWithSocialAccount3: ' with a social login',\n label: 'Corporate email',\n placeholder: 'email@company.com',\n continue: 'Continue',\n or: 'Or',\n loginWith: 'Continue with $0',\n emailNotAllowedTitle: 'Your email is linked to an Enterprise account.',\n emailNotAllowedSubtitle: \"Please log in with your corporate email.\",\n socialLogin: 'Login or register with a social account',\n corporateLoginTitle: 'Already have a StackSpot Enterprise account?',\n corporateLoginButton: 'Enter Enterprise account',\n socialLoginTitle: 'Do you want to access another way?',\n emailNotFoundError: 'We couldn\\'t find an account for this email.',\n },\n pt: {\n welcome: 'Boas vindas à StackSpot AI',\n loginWithEmail: 'Faça login com seu e-mail.',\n loginWithSocialAccount1: 'Cadastre-se ou acesse sua ',\n loginWithSocialAccount2: ' conta freemium ',\n loginWithSocialAccount3: ' com uma conta social',\n label: 'Email corporativo',\n placeholder: 'email@empresa.com',\n continue: 'Continuar',\n or: 'Ou',\n loginWith: 'Continuar com $0',\n emailNotAllowedTitle: '\"Este e-mail está vinculado a uma conta Enterprise.',\n emailNotAllowedSubtitle: \"Faça login com seu email corporativo.\",\n socialLogin: 'Entre ou cadastre-se com uma conta social',\n corporateLoginTitle: 'Já possui uma conta StackSpot Enterprise?',\n corporateLoginButton: 'Entrar na conta Enterprise',\n socialLoginTitle: 'Você quer entrar de outro jeito?',\n emailNotFoundError: 'Não encontramos uma conta para este e-mail.',\n },\n} satisfies Dictionary\n\nexport const useTranslation = () => useTranslate(dictionary)\n","import { ThirdPartyLoginParams } from '@stack-spot/auth'\nimport { getCookie, getCookieDomain, removeCookie, setCookie } from '@stack-spot/portal-components'\n\nconst sessionKey = `stk-session${getCookieDomain()}`\n\ntype SessionCookie = ThirdPartyLoginParams & { sub: string, tenant: string }\n\nexport const sessionCookie = Object.freeze({\n set: (data: SessionCookie) => setCookie(sessionKey, JSON.stringify(data)),\n get: (): SessionCookie | undefined => {\n try {\n const cookie = getCookie(sessionKey)\n return cookie ? JSON.parse(cookie) : undefined\n } catch (error) {\n console.error(error)\n }\n },\n delete: () => removeCookie(sessionKey)\n})\n","import { getCookieDomain } from '@stack-spot/portal-components'\n\nconst isValidDomain = (url: string) => {\n const portalDomainRegex = new RegExp(`^https?:\\/\\/[a-zA-Z0-9.-]*${getCookieDomain().replaceAll('.', '\\.')}(:[0-9]{2,4})*.*$`, 'g')\n const platformDomainRegex = new RegExp(/^https:\\/\\/[a-zA-Z0-9.-]+\\.stackspot\\.com.*$/, 'g')\n const result = portalDomainRegex.test(url) || platformDomainRegex.test(url)\n return result\n}\n\nexport const redirect = async (url: string) => {\n\n if (!isValidDomain(url)) throw new Error('Redirect URL invalid domain')\n\n window.location.href = url\n /**\n * This is intentional. The promise bellow will never be fulfilled.\n * Once the set href is not instantaneous, this will guarantee no further code is executed until the user is really redirected.\n * Particularly useful to prevent flickering page renders on scenarios with redirects.\n */\n await new Promise(() => '')\n}","import { AccessTokenPayload, AuthConfig, AuthManager, Session, ThirdPartyAuthType, ThirdPartyLoginParams } from '@stack-spot/auth'\nimport { sessionCookie } from './utils/cookies'\nimport { redirect } from './utils/redirect'\n\nconst sessionKey = 'session'\n\ninterface SessionManagerConfig extends Pick<AuthConfig, 'accountUrl' | 'authUrl' | 'clientId' | 'defaultTenant' | 'retry' | 'retryDelay'> {\n /**\n * The URL to redirect to when the user logs out.\n * @default location.origin\n */\n loginUrl?: string,\n /**\n * The URL to redirect to when the login completes in the authentication app. If not provided, will be the same as `loginUrl`.\n * @default loginUrl\n */\n redirectUrl?: string,\n /**\n * Forbidden authentication types to this Session Manager.\n */\n blockedAuthTypes?: ThirdPartyAuthType[]\n /**\n * A URL to send login events to (observability).\n */\n rdUrl?: string,\n}\n\ntype AuthExtraData = { from?: string | null, finalRedirect?: string | null }\n\ntype ChangeListener = (session: Session | undefined) => void\n\n/**\n * Controls the current session in a browser.\n * \n * This should not be used under a Node.JS environment.\n * \n * This is a singleton. To create the first instance or recover the current one, use `SessionManager.create`.\n */\nexport class SessionManager {\n private current: Session | undefined\n private readonly auth: AuthManager<AuthExtraData>\n private config: SessionManagerConfig\n private changeListeners: ChangeListener[] = []\n static instance: SessionManager | undefined\n\n private constructor(config: SessionManagerConfig) {\n config.loginUrl ||= location.origin\n const redirectUrl = (config.redirectUrl || config.loginUrl).replace(/([^/])$/, '$1/') // the trailing \"/\" is required by Stackspot IAM.\n this.config = config\n this.auth = new AuthManager<AuthExtraData>({\n ...config,\n redirectUrl,\n storage: localStorage,\n sessionPersistence: {\n load: () => localStorage.getItem(sessionKey),\n save: (session) => localStorage.setItem(sessionKey, session),\n },\n })\n SessionManager.instance = this\n\n // Keep session in sync with other app's session\n addEventListener('focus', () => this.validateSharedSession())\n }\n\n static create(config: SessionManagerConfig) {\n return SessionManager.instance ?? new SessionManager(config)\n }\n\n private setSession(session: Session | undefined) {\n this.current = session\n this.changeListeners.forEach(l => l(session))\n if (session) this.setSessionCookie(session)\n }\n\n async restoreSession() {\n const session = await this.auth.restoreSession()\n const sessionValid = await this.validateSharedSession(session)\n this.setSession(sessionValid ? session : undefined)\n }\n\n async validateSharedSession(session: Session | undefined = this.current): Promise<boolean> {\n\n // skipping because authentication is in progress\n if (this.urlHasThirdPartyLoginData()) return false\n\n const sharedSessionCookie = sessionCookie.get()\n\n // It has been logged out on another portal, so logout on this one too\n if (!sharedSessionCookie) {\n session && await this.logout()\n return false\n }\n\n const isDifferentSessionActive = sharedSessionCookie.sub != session?.getTokenData().sub\n const isSharedSessionTypeBlocked = this.config.blockedAuthTypes?.includes(sharedSessionCookie.type)\n if (isSharedSessionTypeBlocked) return false\n else if (isDifferentSessionActive || !session) {\n await this.startThirdPartyLoginUsingTenant(sharedSessionCookie)\n return false\n }\n return true\n }\n\n hasSession() {\n return !!this.current && !this.current.isExpired()\n }\n\n getSession() {\n if (!this.hasSession()) {\n this.endSession()\n throw new Error('Session is not available, redirecting to login.')\n }\n return this.current!\n }\n\n async endSession(redirectToLogin = true) {\n this.current = undefined\n localStorage.removeItem(sessionKey)\n sessionCookie.delete()\n if (redirectToLogin && this.config.loginUrl) await redirect(this.config.loginUrl)\n }\n\n async restartSession() {\n await this.logout({ endSession: false })\n this.current = undefined\n localStorage.removeItem(sessionKey)\n await this.restoreSession()\n }\n\n async logout({ endSession }: { endSession?: boolean } | undefined = { endSession: true }) {\n try {\n await this.current?.logout()\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Could not logout from IDM.\\n${error}`)\n }\n if (!endSession) return\n await this.endSession()\n }\n\n async startThirdPartyLogin(data: ThirdPartyLoginParams) {\n const params = new URLSearchParams(location.search)\n const authUrl = await this.auth.startThirdPartyLogin(data, {\n from: location.href,\n finalRedirect: params.get('finalRedirect'),\n })\n await redirect(authUrl)\n }\n\n urlHasThirdPartyLoginData() {\n const url = new URL(location.toString())\n return url.searchParams.has('state') && !url.searchParams.has('error')\n }\n\n async startThirdPartyLoginUsingTenant(data: ThirdPartyLoginParams) {\n const params = new URLSearchParams(location.search)\n const cookie = sessionCookie.get()\n if (!cookie || !cookie.tenant) {\n //If no tenant is available we should log out the user\n await this.logout()\n return\n }\n const authUrl = await this.auth.getThirdPartyLoginFromTenant(data, cookie.tenant, {\n from: location.href,\n finalRedirect: params.get('finalRedirect'),\n }\n )\n await redirect(authUrl)\n }\n\n async completeThirdPartyLogin() {\n const url = new URL(location.toString())\n if (url.searchParams.has('error')) {\n throw new Error(`Error while signing in: ${url.searchParams.get('error_description')}`)\n }\n const { session, data: { from, finalRedirect } } = await this.auth.completeThirdPartyLogin(location.search)\n this.setSession(session)\n history.replaceState(null, '', from || location.toString().replace(/\\?.*$/, ''))\n this.sendLoginEventRd(this.current?.getTokenData())\n if (finalRedirect) await redirect(finalRedirect)\n }\n\n getEmailForLogin() {\n const session = sessionCookie.get()\n return session?.type == 'sso' ? session.email : undefined\n }\n\n async switchAccount(accountId: string) {\n this.current && await this.auth.switchAccount(accountId, this.current)\n this.setSession(this.current)\n }\n\n onChange(listener: ChangeListener) {\n this.changeListeners.push(listener)\n return () => {\n const index = this.changeListeners.indexOf(listener)\n if (index != -1) this.changeListeners.splice(index, 1)\n }\n }\n\n private setSessionCookie(session: Session) {\n const { email, account_type, sub, tenant } = session.getTokenData()\n const { provider } = session.getSessionData()\n if (!email || !sub || !tenant) return\n const isFreemium = account_type == 'FREEMIUM'\n if (isFreemium) {\n sessionCookie.set({ type: 'idp', provider: provider!, sub, tenant })\n } else {\n sessionCookie.set({ email, type: 'sso', sub, tenant })\n }\n }\n\n private async sendLoginEventRd(tokenData?: AccessTokenPayload) {\n if (!this.config.rdUrl) return\n\n if (!tokenData) {\n // eslint-disable-next-line no-console\n console.error('Unable to trigger login hook. No sessionEmail or name identified.')\n return\n }\n\n const { email, name, account_type, client_id, account_name, trial_account_status } = tokenData\n const isLoginAI = client_id === \"stackspot-portal-ai\"\n const isLoginEDP = client_id === \"stackspot-portal\"\n\n if (!isLoginAI && !isLoginEDP && trial_account_status === 'PENDING') return\n\n const leadType = account_type === 'FREEMIUM' ? 'TRIAL' : 'ENTERPRISE'\n\n const rdObject = {\n event_type: 'CONVERSION',\n event_family: 'CDP',\n payload: {\n email,\n name,\n conversion_identifier: isLoginAI ? 'login_ai' : 'login_edp',\n cf_leadtype: leadType,\n cf_account_name: leadType === 'TRIAL' ? leadType : account_name,\n },\n }\n\n const response = await fetch(this.config.rdUrl, {\n method: 'POST',\n body: JSON.stringify(rdObject),\n headers: {\n 'content-type': 'application/json',\n },\n })\n const data = await response.json()\n\n if (!response.ok) {\n // eslint-disable-next-line no-console\n console.error('Error while sending event to RD Station', data)\n }\n }\n\n async getTrialEnabledProviders() {\n try {\n const response = await fetch(`${this.config.accountUrl}/v1/accounts/trial/sso`)\n const trialProviders = await response.json()\n\n if (!response.ok) {\n // eslint-disable-next-line no-console\n console.error('Error while fetching available login providers', trialProviders)\n }\n\n const providerKeys = Object.keys(trialProviders || {})\n return providerKeys.filter(key => trialProviders[key] === true)\n } catch (error) {\n console.error('Error while fetching available login providers', error)\n return []\n }\n }\n}\n","import { Session } from '@stack-spot/auth'\nimport { useEffect, useState } from 'react'\nimport { SessionManager } from './SessionManager'\n\nexport function useSession() {\n const manager = SessionManager.instance\n const [session, setSession] = useState<Session | undefined>(manager?.hasSession() ? manager.getSession() : undefined)\n useEffect(() => {\n return manager?.onChange(setSession)\n }, [])\n return session\n}\n\nexport type Provider = 'google' | 'github' | 'microsoft'\nexport const useTrialProviders = ({ enabled = true }): [Provider[], boolean] => {\n const [isLoadingTrialProviders, setIsLoadingTrialProviders] = useState<boolean>(enabled)\n const [trialProviders, setTrialProviders] = useState<Provider[]>([])\n\n useEffect(() => {\n (async () => {\n if (!SessionManager.instance || !enabled) return\n try {\n const providers = (await SessionManager.instance.getTrialEnabledProviders()) as Provider[]\n setTrialProviders(providers)\n setIsLoadingTrialProviders(false)\n } catch (error) {\n console.error(error)\n setIsLoadingTrialProviders(false)\n }\n })()\n }, [SessionManager.instance])\n\n return [trialProviders, isLoadingTrialProviders]\n}\n","import { forwardRef, Ref, SVGProps } from 'react'\n\nexport const Github = forwardRef((props: SVGProps<SVGSVGElement>, ref: Ref<SVGSVGElement>) => (\n <svg ref={ref} {...props} width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_1215_2072)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12.0011 4.38525C10.1019 4.38624 8.26498 5.05889 6.81881 6.28294C5.37263 7.50698 4.4115 9.20259 4.10726 11.0666C3.80302 12.9306 4.17551 14.8414 5.15814 16.4574C6.14077 18.0733 7.66946 19.2891 9.47085 19.8872C9.86827 19.961 10.018 19.7147 10.018 19.5053C10.018 19.2958 10.01 18.6886 10.0074 18.0247C7.78183 18.5055 7.31155 17.0856 7.31155 17.0856C6.94858 16.1635 6.42399 15.9212 6.42399 15.9212C5.69804 15.4286 6.4783 15.4378 6.4783 15.4378C7.28241 15.4944 7.705 16.2584 7.705 16.2584C8.4177 17.4741 9.57683 17.1225 10.0325 16.917C10.1041 16.402 10.312 16.0516 10.5412 15.8527C8.76345 15.6525 6.89559 14.9702 6.89559 11.9222C6.88457 11.1317 7.17958 10.3673 7.71957 9.78704C7.63744 9.58683 7.36321 8.77808 7.79772 7.67954C7.79772 7.67954 8.46936 7.46616 9.99809 8.49488C11.3093 8.13834 12.6928 8.13834 14.0041 8.49488C15.5315 7.46616 16.2018 7.67954 16.2018 7.67954C16.6376 8.77544 16.3634 9.58419 16.2813 9.78704C16.823 10.3674 17.1186 11.1332 17.1066 11.9248C17.1066 14.9794 15.2347 15.6525 13.4543 15.8487C13.7404 16.0964 13.9961 16.5798 13.9961 17.3227C13.9961 18.387 13.9868 19.2431 13.9868 19.5053C13.9868 19.7173 14.1312 19.9649 14.5366 19.8872C16.3382 19.289 17.867 18.0731 18.8496 16.4568C19.8323 14.8406 20.2046 12.9295 19.9 11.0653C19.5954 9.20112 18.6338 7.50549 17.1871 6.28166C15.7405 5.05782 13.9031 4.38561 12.0037 4.38525H12.0011Z\" fill=\"white\" />\n <path d=\"M9.35091 17.3684C9.35091 17.4329 9.27673 17.4882 9.18135 17.4896C9.08597 17.4909 9.00781 17.4382 9.00781 17.3736C9.00781 17.3091 9.08199 17.2538 9.17737 17.2525C9.27275 17.2511 9.35091 17.3025 9.35091 17.3684Z\" fill=\"white\" />\n <path d=\"M9.96094 17.2672C9.97286 17.3317 9.90662 17.3989 9.81124 17.4147C9.71586 17.4305 9.63241 17.3923 9.62048 17.3291C9.60856 17.2659 9.67745 17.1974 9.77018 17.1803C9.86291 17.1631 9.94902 17.2027 9.96094 17.2672Z\" fill=\"white\" />\n <path d=\"M8.6968 17.324C8.67693 17.3859 8.58685 17.4136 8.49676 17.3872C8.40668 17.3609 8.34707 17.2871 8.36429 17.2239C8.38151 17.1607 8.47292 17.1317 8.56433 17.1607C8.65573 17.1897 8.71402 17.2595 8.6968 17.324Z\" fill=\"white\" />\n <path d=\"M8.09774 17.0658C8.05402 17.1145 7.96527 17.1013 7.89241 17.0355C7.81955 16.9696 7.80232 16.88 7.84604 16.8326C7.88975 16.7852 7.97851 16.7984 8.05402 16.8629C8.12953 16.9274 8.1441 17.0183 8.09774 17.0658V17.0658Z\" fill=\"white\" />\n <path d=\"M7.6686 16.6231C7.61959 16.6574 7.53612 16.6231 7.48976 16.5546C7.47694 16.5423 7.46674 16.5276 7.45978 16.5113C7.45281 16.495 7.44922 16.4775 7.44922 16.4598C7.44922 16.4421 7.45281 16.4246 7.45978 16.4083C7.46674 16.392 7.47694 16.3772 7.48976 16.3649C7.53877 16.332 7.62224 16.3649 7.6686 16.4321C7.71497 16.4993 7.71629 16.5889 7.6686 16.6231V16.6231Z\" fill=\"white\" />\n <path d=\"M7.3535 16.1662C7.32607 16.1799 7.29468 16.1838 7.26472 16.177C7.23475 16.1703 7.20807 16.1534 7.18924 16.1293C7.13757 16.074 7.12697 15.9976 7.16671 15.9633C7.20645 15.9291 7.27799 15.9449 7.32966 16.0002C7.38132 16.0555 7.39324 16.1319 7.3535 16.1662Z\" fill=\"white\" />\n <path d=\"M7.02905 15.8062C7.01183 15.8457 6.94825 15.8576 6.89658 15.8299C6.84492 15.8022 6.8065 15.7509 6.82505 15.71C6.8436 15.6692 6.90586 15.6587 6.95752 15.6863C7.00919 15.714 7.04893 15.7667 7.02905 15.8062Z\" fill=\"white\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1215_2072\">\n <rect width=\"16\" height=\"16\" fill=\"white\" transform=\"translate(4 4.05176)\" />\n </clipPath>\n </defs>\n </svg>\n))\n","import { forwardRef, Ref, SVGProps } from 'react'\n\nexport const Google = forwardRef((props: SVGProps<SVGSVGElement>, ref: Ref<SVGSVGElement>) => (\n <svg ref={ref} {...props} width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_1215_2403)\">\n <path d=\"M20.3442 12.2359C20.3442 11.6921 20.3001 11.1454 20.206 10.6104H12.6602V13.691H16.9813C16.802 14.6846 16.2258 15.5635 15.3822 16.122V18.1209H17.9602C19.4741 16.7276 20.3442 14.6699 20.3442 12.2359Z\" fill=\"#4285F4\" />\n <path d=\"M12.6607 20.0525C14.8184 20.0525 16.6379 19.344 17.9637 18.1212L15.3857 16.1223C14.6684 16.6103 13.7425 16.8866 12.6637 16.8866C10.5766 16.8866 8.80696 15.4785 8.17202 13.5854H5.51172V15.6461C6.86979 18.3475 9.63592 20.0525 12.6607 20.0525V20.0525Z\" fill=\"#34A853\" />\n <path d=\"M8.16852 13.5856C7.83341 12.592 7.83341 11.5161 8.16852 10.5225V8.46191H5.51116C4.37649 10.7224 4.37649 13.3857 5.51116 15.6462L8.16852 13.5856V13.5856Z\" fill=\"#FBBC04\" />\n <path d=\"M12.6607 7.2182C13.8013 7.20056 14.9036 7.62974 15.7296 8.41754L18.0136 6.1335C16.5674 4.77543 14.6479 4.02878 12.6607 4.0523C9.63592 4.0523 6.86979 5.75724 5.51172 8.46163L8.16908 10.5223C8.80108 8.62625 10.5736 7.2182 12.6607 7.2182V7.2182Z\" fill=\"#EA4335\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1215_2403\">\n <rect width=\"16\" height=\"16\" fill=\"white\" transform=\"translate(4.5 4.05176)\" />\n </clipPath>\n </defs>\n </svg>\n))\n","import { forwardRef, Ref, SVGProps } from 'react'\n\nexport const Microsoft = forwardRef((props: SVGProps<SVGSVGElement>, ref: Ref<SVGSVGElement>) => (\n <svg ref={ref} {...props} width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.19531 4.74707H12.1518V11.7036H5.19531V4.74707Z\" fill=\"#F35325\" />\n <path d=\"M12.8477 4.74707H19.8042V11.7036H12.8477V4.74707Z\" fill=\"#81BC06\" />\n <path d=\"M5.19531 12.3994H12.1518V19.3559H5.19531V12.3994Z\" fill=\"#05A6F0\" />\n <path d=\"M12.8477 12.3994H19.8042V19.3559H12.8477V12.3994Z\" fill=\"#FFBA08\" />\n </svg>\n))\n","import { Box, Button, Flex, Text } from '@citric/core'\nimport { LoadingCircular } from '@citric/ui'\nimport { interpolate } from '@stack-spot/portal-translate'\nimport { capitalize } from 'lodash'\nimport { useTranslation } from './dictionary'\nimport { Provider } from './hooks'\nimport { Github } from './provider-icons/Github'\nimport { Google } from './provider-icons/Google'\nimport { Microsoft } from './provider-icons/Microsoft'\nimport { LoginType } from './types'\n\ninterface Props {\n trialProviders: Provider[],\n loading: boolean,\n loginProvider: Provider | undefined,\n onSubmit: (type: LoginType, provider?: Provider) => void,\n onChangeMode: (mode: LoginType) => void,\n}\n\ninterface ButtonProviderProps {\n provider: Provider,\n loading: boolean,\n disabled?: boolean,\n login: (type: LoginType, provider?: Provider) => void,\n}\n\nconst providerIcons: Record<Provider, React.ReactElement> = {\n github: <Github />,\n google: <Google />,\n microsoft: <Microsoft />,\n}\n\nconst ButtonProvider = ({ provider, login, loading, disabled }: ButtonProviderProps) => {\n const t = useTranslation()\n return (\n <Box>\n <Button\n colorScheme=\"light\"\n type=\"button\"\n size='md'\n sx={{ width: '100%' } as any}\n onClick={() => login('idp', provider)}\n disabled={loading || disabled}\n >\n {loading\n ? <LoadingCircular />\n : <Flex alignItems='center' style={{ gap: '4px' }}>\n {providerIcons[provider]}{interpolate(t.loginWith, capitalize(provider))}\n </Flex>\n }\n </Button>\n </Box>\n )\n}\n\nexport const IDPLogin = ({ trialProviders, loading, loginProvider, onSubmit, onChangeMode }: Props) => {\n const t = useTranslation()\n return (\n <>\n <Flex flexDirection='column' gap>\n {trialProviders?.map((provider) => <ButtonProvider\n provider={provider}\n login={onSubmit}\n loading={loading && loginProvider === provider}\n disabled={loading}\n key={provider}\n />)\n }\n </Flex>\n <p className=\"separator\">\n <Text appearance='microtext1' colorScheme='light.700'>{t.or}</Text>\n </p>\n <Text colorScheme=\"light.700\" align=\"center\">{t.corporateLoginTitle}</Text>\n <Button size='md' disabled={loading} colorScheme=\"light\" onClick={() => onChangeMode('sso')}>\n {t.corporateLoginButton}\n </Button>\n </>\n )\n}","import { getCookie } from '@stack-spot/portal-components'\nimport { LoginType } from './types'\n\nconst lastLoginTypeKey = 'lastLoginType'\nconst fallbackKeys = ['guided-tour', '@stack-spot/opa:user', 'CHAT_AGENTS', 'RATED_US_IN']\n\nexport function getLastLoginType(): LoginType {\n const type = localStorage.getItem(lastLoginTypeKey)\n if (type === 'idp' || type === 'sso') return type\n // for now, the user won't have the variable \"lastLoginType\" set. So, we check for tother variables that may indicate this is an enterprise user\n if (getCookie('stk-session.stackspot.com')) return 'sso'\n for (const key of fallbackKeys) {\n if (localStorage.getItem(key)) return 'sso'\n }\n return 'idp'\n}\n\nexport function setLastLoginType(type: LoginType) {\n localStorage.setItem(lastLoginTypeKey, type)\n}\n","import { Button, Flex, Input, Label, Text } from '@citric/core'\nimport { Github, Google } from '@citric/icons'\nimport { LoadingCircular } from '@citric/ui'\nimport { useTranslation } from './dictionary'\nimport { Provider } from './hooks'\nimport { Microsoft } from './provider-icons/Microsoft'\nimport { LoginType } from './types'\n\ninterface Props {\n value: string,\n onChange: (value: string) => void,\n disabled: boolean,\n loading: boolean,\n hasProvider: boolean,\n onChangeMode: (mode: LoginType) => void,\n}\n\ninterface ButtonProviderProps {\n provider: Provider,\n loading: boolean,\n login: (type: LoginType, provider?: Provider) => void\n}\n\nconst providerIcons: Record<Provider, React.ReactElement> = {\n github: <Github />,\n google: <Google />,\n microsoft: <Microsoft />,\n}\n\nexport const SSOLogin = ({ value, onChange, loading, disabled, hasProvider, onChangeMode }: Props) => {\n const t = useTranslation()\n return (\n <>\n <Flex flexDirection='column' style={{ gap: '4px', marginTop: '4px' }}>\n <Label htmlFor='email'>{t.label}</Label>\n <Input id=\"email\" type='email' name=\"email\" value={value} onChange={e => onChange(e.target.value)} placeholder={t.placeholder} />\n <Button colorScheme=\"primary\" size='md' style={{ marginTop: '12px' }} disabled={disabled || loading}>\n {loading && !hasProvider ? <LoadingCircular /> : <Text>{t.continue}</Text>}\n </Button>\n </Flex>\n <p className=\"separator\">\n <Text appearance='microtext1' colorScheme='light.700'>{t.or}</Text>\n </p>\n <Text colorScheme=\"light.700\" align=\"center\">{t.socialLoginTitle}</Text>\n <Button size='md' disabled={loading} colorScheme=\"light\" onClick={() => onChangeMode('idp')}>\n {t.socialLogin}\n </Button>\n </>\n )\n}","import { Flex, Text } from '@citric/core'\nimport { Card, LoadingCircular } from '@citric/ui'\nimport { AuthMethodUnavailable } from '@stack-spot/auth'\nimport { BannerWarning } from '@stack-spot/portal-components'\nimport { MiniLogo } from '@stack-spot/portal-components/svg'\nimport { theme } from '@stack-spot/portal-theme'\nimport { useEffect, useState } from 'react'\nimport { styled } from 'styled-components'\nimport { useTranslation } from './dictionary'\nimport { Provider, useTrialProviders } from './hooks'\nimport { IDPLogin } from './IDPLogin'\nimport { getLastLoginType, setLastLoginType } from './last-login-type'\nimport { SSOLogin } from './SSOLogin'\nimport { LoginData, LoginProps, LoginType } from './types'\n\nconst LoginBox = styled.form`\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 24px;\n\n header {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 24px;\n }\n\n .separator {\n padding: 0 8px;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n gap: 8px;\n margin: 0;\n\n &:before, &:after {\n content: '';\n height: 1px;\n flex: 1;\n background-color: ${theme.color.light['500']};\n }\n }\n\n .error {\n color: ${theme.color.danger['500']};\n line-height: 1.5rem;\n }\n`\n\nconst EmailNotAllowed = () => {\n const t = useTranslation()\n return <Card>\n <Flex justifyContent=\"center\">\n <Text appearance='body2'>\n {t.emailNotAllowedTitle}\n </Text>\n <Text appearance='body2' colorScheme='light.700'>\n {t.emailNotAllowedSubtitle}\n </Text>\n </Flex>\n </Card>\n}\n\nexport const Login = (\n { onSubmit, initialValue = '', welcomeText, removeLoadingOnSuccess, className, style, banner, loginTypes = ['idp', 'sso'] }: LoginProps,\n) => {\n const t = useTranslation()\n const [trialProviders, isLoadingTrialProviders] = useTrialProviders({ enabled: loginTypes.includes('idp') })\n const searchParams = new URLSearchParams(location.search)\n const [error, setError] = useState(searchParams.get('error_description') || searchParams.get('error') || '')\n const [errorCode] = useState(searchParams.get('error_code') || '')\n const [loading, setLoading] = useState(false)\n const providerQueryParam = searchParams.get('provider') as Provider & 'email'\n const [loginProvider, setLoginProvider] = useState<Provider | undefined>()\n const [email, setEmail] = useState(initialValue || searchParams.get('email') || '')\n const disabled = !email.match(/\\w+@\\w+/)\n const idpLoginEnabled = loginTypes.includes('idp') && !!trialProviders?.length\n const [mode, setMode] = useState<LoginType | undefined>()\n\n useEffect(() => {\n setMode(idpLoginEnabled ? getLastLoginType() : 'sso')\n }, [idpLoginEnabled])\n\n useEffect(() => {\n if (!providerQueryParam) return\n if (providerQueryParam === 'email') login('sso')\n else if (trialProviders?.includes(providerQueryParam)) login('idp', providerQueryParam)\n }, [trialProviders, isLoadingTrialProviders])\n\n async function login(type: LoginType, provider?: Provider) {\n setError('')\n setLoading(true)\n provider !== loginProvider && setLoginProvider(provider)\n try {\n const data: LoginData = type === 'idp' && !!provider ? { type: 'idp', provider: `external-idp:${provider}` } : { type: 'sso', email }\n setLastLoginType(data.type)\n await onSubmit(data)\n if (removeLoadingOnSuccess) setLoading(false)\n } catch (error: any) {\n setLoading(false)\n setLoginProvider(undefined)\n if (error instanceof AuthMethodUnavailable) {\n setError(t.emailNotFoundError)\n } else {\n setError(error.message || error.toString())\n }\n }\n }\n\n function submitForm(e: React.FormEvent<HTMLFormElement>) {\n e.preventDefault()\n if (disabled) return\n login('sso')\n }\n\n if (isLoadingTrialProviders || !mode) {\n return <Flex alignContent=\"center\" justifyContent=\"center\" my={5}><LoadingCircular /> </Flex>\n }\n\n const loginWithSocialAccount = (\n <>\n <span>{t.loginWithSocialAccount1}</span>\n <span style={{ fontWeight: 'bold' }}>{t.loginWithSocialAccount2}</span>\n <span>{t.loginWithSocialAccount3}</span>\n </>\n )\n\n return (\n <>\n <LoginBox onSubmit={submitForm} className={className} style={style}>\n <header>\n <MiniLogo />\n <Flex flexDirection='column' alignItems='center'>\n <Text appearance='body1' weight='medium'>{welcomeText || t.welcome}</Text>\n <Text appearance='body2' colorScheme='light.700' align='center'>\n {mode === 'idp' ? loginWithSocialAccount : t.loginWithEmail}\n </Text>\n </Flex>\n </header>\n {errorCode && errorCode === 'EMAIL_IS_NOT_ALLOWED' && <EmailNotAllowed />}\n\n {mode === 'sso' ? (\n <SSOLogin\n disabled={disabled}\n loading={loading}\n hasProvider={!loginProvider}\n value={email}\n onChange={setEmail}\n onChangeMode={setMode}\n />\n ) : (\n <IDPLogin\n loading={loading}\n loginProvider={loginProvider}\n onSubmit={login}\n trialProviders={trialProviders}\n onChangeMode={setMode}\n />\n )}\n\n {error && <Text className=\"error\" align=\"center\">{error}</Text>}\n </LoginBox>\n {banner ? <BannerWarning>\n {banner}\n </BannerWarning> : null}\n </>\n )\n}\n","/* eslint-disable max-len */\nimport { Flex } from '@citric/core'\nimport { useEffectOnce } from '@stack-spot/portal-components'\nimport { CSSToCitricAdapter } from '@stack-spot/portal-theme'\nimport '@stack-spot/portal-theme/dist/theme.css'\nimport { useLanguage } from '@stack-spot/portal-translate'\nimport { useState } from 'react'\nimport { Login } from './Login'\nimport { SessionManager } from './SessionManager'\nimport { LoginProps } from './types'\n\ntype AuthStatus = 'unknown' | 'authenticated' | 'unauthenticated'\n\ninterface Props {\n children: React.ReactElement,\n onLogin?: () => void,\n onSession?: () => void,\n onChangeStatus?: (status: AuthStatus) => void,\n customLoginProps?: Omit<LoginProps, 'onSubmit' | 'initialValue'>,\n sessionManager?: SessionManager,\n}\n\nexport const Authenticated = ({ children, onLogin, onSession, customLoginProps, sessionManager, onChangeStatus }: Props) => {\n const [authStatus, setAuthStatus] = useState<AuthStatus>('unknown')\n const language = useLanguage()\n sessionManager ??= SessionManager.instance\n if (!sessionManager) throw new Error('Please, provide a sessionManager')\n\n useEffectOnce(() => {\n async function checkAuth() {\n if (!sessionManager) throw new Error('Please, provide a sessionManager')\n await sessionManager.restoreSession()\n if (sessionManager.urlHasThirdPartyLoginData()) {\n await sessionManager.completeThirdPartyLogin()\n onLogin?.()\n }\n if (sessionManager.hasSession()) {\n setAuthStatus('authenticated')\n onSession?.()\n onChangeStatus?.('authenticated')\n } else {\n setAuthStatus('unauthenticated')\n onChangeStatus?.('unauthenticated')\n }\n }\n\n checkAuth()\n })\n\n if (authStatus === 'unknown') return null\n if (authStatus === 'authenticated') return children\n\n return (\n <CSSToCitricAdapter>\n <Flex justifyContent=\"center\" alignItems=\"center\" flex={1} style={{ height: '100%' }}>\n <Login\n style={{ width: '360px' }}\n onSubmit={data => sessionManager.startThirdPartyLogin({ ...data, locale: language })}\n initialValue={sessionManager.getEmailForLogin()}\n {...(customLoginProps || {})}\n />\n </Flex>\n </CSSToCitricAdapter>\n )\n}\n"],"names":["sessionKey","__spreadProps","__spreadValues","error"],"mappings":";;;;;;;;;;;;;;AAEA,MAAM,UAAa,GAAA;AAAA,EACjB,EAAI,EAAA;AAAA,IACF,OAAS,EAAA,yBAAA;AAAA,IACT,cAAgB,EAAA,yBAAA;AAAA,IAChB,uBAAyB,EAAA,yBAAA;AAAA,IACzB,uBAAyB,EAAA,oBAAA;AAAA,IACzB,uBAAyB,EAAA,sBAAA;AAAA,IACzB,KAAO,EAAA,iBAAA;AAAA,IACP,WAAa,EAAA,mBAAA;AAAA,IACb,QAAU,EAAA,UAAA;AAAA,IACV,EAAI,EAAA,IAAA;AAAA,IACJ,SAAW,EAAA,kBAAA;AAAA,IACX,oBAAsB,EAAA,gDAAA;AAAA,IACtB,uBAAyB,EAAA,0CAAA;AAAA,IACzB,WAAa,EAAA,yCAAA;AAAA,IACb,mBAAqB,EAAA,8CAAA;AAAA,IACrB,oBAAsB,EAAA,0BAAA;AAAA,IACtB,gBAAkB,EAAA,oCAAA;AAAA,IAClB,kBAAoB,EAAA,6CAAA;AAAA,GACtB;AAAA,EACA,EAAI,EAAA;AAAA,IACF,OAAS,EAAA,+BAAA;AAAA,IACT,cAAgB,EAAA,+BAAA;AAAA,IAChB,uBAAyB,EAAA,4BAAA;AAAA,IACzB,uBAAyB,EAAA,kBAAA;AAAA,IACzB,uBAAyB,EAAA,uBAAA;AAAA,IACzB,KAAO,EAAA,mBAAA;AAAA,IACP,WAAa,EAAA,mBAAA;AAAA,IACb,QAAU,EAAA,WAAA;AAAA,IACV,EAAI,EAAA,IAAA;AAAA,IACJ,SAAW,EAAA,kBAAA;AAAA,IACX,oBAAsB,EAAA,wDAAA;AAAA,IACtB,uBAAyB,EAAA,0CAAA;AAAA,IACzB,WAAa,EAAA,2CAAA;AAAA,IACb,mBAAqB,EAAA,8CAAA;AAAA,IACrB,oBAAsB,EAAA,4BAAA;AAAA,IACtB,gBAAkB,EAAA,qCAAA;AAAA,IAClB,kBAAoB,EAAA,gDAAA;AAAA,GACtB;AACF,CAAA,CAAA;AAEa,MAAA,cAAA,GAAiB,MAAM,YAAA,CAAa,UAAU,CAAA;;ACxC3D,MAAMA,YAAA,GAAa,CAAc,WAAA,EAAA,eAAA,EAAiB,CAAA,CAAA,CAAA;AAIrC,MAAA,aAAA,GAAgB,OAAO,MAAO,CAAA;AAAA,EACzC,GAAA,EAAK,CAAC,IAAwB,KAAA,SAAA,CAAUA,cAAY,IAAK,CAAA,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,EACxE,KAAK,MAAiC;AACpC,IAAI,IAAA;AACF,MAAM,MAAA,MAAA,GAAS,UAAUA,YAAU,CAAA,CAAA;AACnC,MAAA,OAAO,MAAS,GAAA,IAAA,CAAK,KAAM,CAAA,MAAM,CAAI,GAAA,KAAA,CAAA,CAAA;AAAA,aAC9B,KAAO,EAAA;AACd,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA,CAAA;AAAA,KACrB;AAAA,GACF;AAAA,EACA,MAAA,EAAQ,MAAM,YAAA,CAAaA,YAAU,CAAA;AACvC,CAAC,CAAA;;AChBD,MAAM,aAAA,GAAgB,CAAC,GAAgB,KAAA;AACrC,EAAM,MAAA,iBAAA,GAAoB,IAAI,MAAA,CAAO,CAA6B,wBAAA,EAAA,eAAA,EAAkB,CAAA,UAAA,CAAW,GAAK,EAAA,GAAI,CAAC,CAAA,iBAAA,CAAA,EAAqB,GAAG,CAAA,CAAA;AACjI,EAAA,MAAM,mBAAsB,GAAA,IAAI,MAAO,CAAA,8CAAA,EAAgD,GAAG,CAAA,CAAA;AAC1F,EAAA,MAAM,SAAS,iBAAkB,CAAA,IAAA,CAAK,GAAG,CAAK,IAAA,mBAAA,CAAoB,KAAK,GAAG,CAAA,CAAA;AAC1E,EAAO,OAAA,MAAA,CAAA;AACT,CAAA,CAAA;AAEa,MAAA,QAAA,GAAW,OAAO,GAAgB,KAAA;AAE7C,EAAI,IAAA,CAAC,cAAc,GAAG,CAAA;AAAG,IAAM,MAAA,IAAI,MAAM,6BAA6B,CAAA,CAAA;AAEtE,EAAA,MAAA,CAAO,SAAS,IAAO,GAAA,GAAA,CAAA;AAMvB,EAAM,MAAA,IAAI,OAAQ,CAAA,MAAM,EAAE,CAAA,CAAA;AAC5B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;AChBA,MAAM,UAAa,GAAA,SAAA,CAAA;AAkCZ,MAAM,eAAA,GAAN,MAAM,eAAe,CAAA;AAAA,EAOlB,YAAY,MAA8B,EAAA;AANlD,IAAQ,aAAA,CAAA,IAAA,EAAA,SAAA,CAAA,CAAA;AACR,IAAiB,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AACjB,IAAQ,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,mBAAoC,EAAC,CAAA,CAAA;AAI3C,IAAO,MAAA,CAAA,QAAA,KAAP,MAAO,CAAA,QAAA,GAAa,QAAS,CAAA,MAAA,CAAA,CAAA;AAC7B,IAAA,MAAM,eAAe,MAAO,CAAA,WAAA,IAAe,OAAO,QAAU,EAAA,OAAA,CAAQ,WAAW,KAAK,CAAA,CAAA;AACpF,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AACd,IAAA,IAAA,CAAK,IAAO,GAAA,IAAI,WAA2B,CAAAC,eAAA,CAAAC,gBAAA,CAAA,EAAA,EACtC,MADsC,CAAA,EAAA;AAAA,MAEzC,WAAA;AAAA,MACA,OAAS,EAAA,YAAA;AAAA,MACT,kBAAoB,EAAA;AAAA,QAClB,IAAM,EAAA,MAAM,YAAa,CAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,QAC3C,MAAM,CAAC,OAAA,KAAY,YAAa,CAAA,OAAA,CAAQ,YAAY,OAAO,CAAA;AAAA,OAC7D;AAAA,KACD,CAAA,CAAA,CAAA;AACD,IAAA,eAAA,CAAe,QAAW,GAAA,IAAA,CAAA;AAG1B,IAAA,gBAAA,CAAiB,OAAS,EAAA,MAAM,IAAK,CAAA,qBAAA,EAAuB,CAAA,CAAA;AAAA,GAC9D;AAAA,EAEA,OAAO,OAAO,MAA8B,EAAA;AAhE9C,IAAA,IAAA,EAAA,CAAA;AAiEI,IAAA,OAAA,CAAO,EAAe,GAAA,eAAA,CAAA,QAAA,KAAf,IAA2B,GAAA,EAAA,GAAA,IAAI,gBAAe,MAAM,CAAA,CAAA;AAAA,GAC7D;AAAA,EAEQ,WAAW,OAA8B,EAAA;AAC/C,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA,CAAA;AACf,IAAA,IAAA,CAAK,eAAgB,CAAA,OAAA,CAAQ,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,CAAC,CAAA,CAAA;AAC5C,IAAI,IAAA,OAAA;AAAS,MAAA,IAAA,CAAK,iBAAiB,OAAO,CAAA,CAAA;AAAA,GAC5C;AAAA,EAEA,MAAM,cAAiB,GAAA;AACrB,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,IAAA,CAAK,cAAe,EAAA,CAAA;AAC/C,IAAA,MAAM,YAAe,GAAA,MAAM,IAAK,CAAA,qBAAA,CAAsB,OAAO,CAAA,CAAA;AAC7D,IAAK,IAAA,CAAA,UAAA,CAAW,YAAe,GAAA,OAAA,GAAU,KAAS,CAAA,CAAA,CAAA;AAAA,GACpD;AAAA,EAEA,MAAM,qBAAA,CAAsB,OAA+B,GAAA,IAAA,CAAK,OAA2B,EAAA;AAhF7F,IAAA,IAAA,EAAA,CAAA;AAmFI,IAAA,IAAI,KAAK,yBAA0B,EAAA;AAAG,MAAO,OAAA,KAAA,CAAA;AAE7C,IAAM,MAAA,mBAAA,GAAsB,cAAc,GAAI,EAAA,CAAA;AAG9C,IAAA,IAAI,CAAC,mBAAqB,EAAA;AACxB,MAAW,OAAA,IAAA,MAAM,KAAK,MAAO,EAAA,CAAA;AAC7B,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAEA,IAAA,MAAM,wBAA2B,GAAA,mBAAA,CAAoB,GAAO,KAAA,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAS,YAAe,EAAA,CAAA,GAAA,CAAA,CAAA;AACpF,IAAA,MAAM,8BAA6B,EAAK,GAAA,IAAA,CAAA,MAAA,CAAO,gBAAZ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA8B,SAAS,mBAAoB,CAAA,IAAA,CAAA,CAAA;AAC9F,IAAI,IAAA,0BAAA;AAA4B,MAAO,OAAA,KAAA,CAAA;AAAA,SAC9B,IAAA,wBAAA,IAA4B,CAAC,OAAS,EAAA;AAC7C,MAAM,MAAA,IAAA,CAAK,gCAAgC,mBAAmB,CAAA,CAAA;AAC9D,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AACA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,UAAa,GAAA;AACX,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,WAAW,CAAC,IAAA,CAAK,QAAQ,SAAU,EAAA,CAAA;AAAA,GACnD;AAAA,EAEA,UAAa,GAAA;AACX,IAAI,IAAA,CAAC,IAAK,CAAA,UAAA,EAAc,EAAA;AACtB,MAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAChB,MAAM,MAAA,IAAI,MAAM,iDAAiD,CAAA,CAAA;AAAA,KACnE;AACA,IAAA,OAAO,IAAK,CAAA,OAAA,CAAA;AAAA,GACd;AAAA,EAEA,MAAM,UAAW,CAAA,eAAA,GAAkB,IAAM,EAAA;AACvC,IAAA,IAAA,CAAK,OAAU,GAAA,KAAA,CAAA,CAAA;AACf,IAAA,YAAA,CAAa,WAAW,UAAU,CAAA,CAAA;AAClC,IAAA,aAAA,CAAc,MAAO,EAAA,CAAA;AACrB,IAAI,IAAA,eAAA,IAAmB,KAAK,MAAO,CAAA,QAAA;AAAU,MAAM,MAAA,QAAA,CAAS,IAAK,CAAA,MAAA,CAAO,QAAQ,CAAA,CAAA;AAAA,GAClF;AAAA,EAEA,MAAM,cAAiB,GAAA;AACrB,IAAA,MAAM,IAAK,CAAA,MAAA,CAAO,EAAE,UAAA,EAAY,OAAO,CAAA,CAAA;AACvC,IAAA,IAAA,CAAK,OAAU,GAAA,KAAA,CAAA,CAAA;AACf,IAAA,YAAA,CAAa,WAAW,UAAU,CAAA,CAAA;AAClC,IAAA,MAAM,KAAK,cAAe,EAAA,CAAA;AAAA,GAC5B;AAAA,EAEA,MAAM,OAAO,EAAE,UAAA,KAAqD,EAAE,UAAA,EAAY,MAAQ,EAAA;AAjI5F,IAAA,IAAA,EAAA,CAAA;AAkII,IAAI,IAAA;AACF,MAAM,OAAA,CAAA,EAAA,GAAA,IAAA,CAAK,YAAL,IAAc,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAA,EAAA,CAAA,CAAA;AAAA,aACb,KAAO,EAAA;AAEd,MAAA,OAAA,CAAQ,KAAM,CAAA,CAAA;AAAA,EAA+B,KAAK,CAAE,CAAA,CAAA,CAAA;AAAA,KACtD;AACA,IAAA,IAAI,CAAC,UAAA;AAAY,MAAA,OAAA;AACjB,IAAA,MAAM,KAAK,UAAW,EAAA,CAAA;AAAA,GACxB;AAAA,EAEA,MAAM,qBAAqB,IAA6B,EAAA;AACtD,IAAA,MAAM,MAAS,GAAA,IAAI,eAAgB,CAAA,QAAA,CAAS,MAAM,CAAA,CAAA;AAClD,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,IAAA,CAAK,qBAAqB,IAAM,EAAA;AAAA,MACzD,MAAM,QAAS,CAAA,IAAA;AAAA,MACf,aAAA,EAAe,MAAO,CAAA,GAAA,CAAI,eAAe,CAAA;AAAA,KAC1C,CAAA,CAAA;AACD,IAAA,MAAM,SAAS,OAAO,CAAA,CAAA;AAAA,GACxB;AAAA,EAEA,yBAA4B,GAAA;AAC1B,IAAA,MAAM,GAAM,GAAA,IAAI,GAAI,CAAA,QAAA,CAAS,UAAU,CAAA,CAAA;AACvC,IAAO,OAAA,GAAA,CAAI,aAAa,GAAI,CAAA,OAAO,KAAK,CAAC,GAAA,CAAI,YAAa,CAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AAAA,GACvE;AAAA,EAEA,MAAM,gCAAgC,IAA6B,EAAA;AACjE,IAAA,MAAM,MAAS,GAAA,IAAI,eAAgB,CAAA,QAAA,CAAS,MAAM,CAAA,CAAA;AAClD,IAAM,MAAA,MAAA,GAAS,cAAc,GAAI,EAAA,CAAA;AACjC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,MAAQ,EAAA;AAE7B,MAAA,MAAM,KAAK,MAAO,EAAA,CAAA;AAClB,MAAA,OAAA;AAAA,KACF;AACA,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,IAAK,CAAA,4BAAA;AAAA,MAA6B,IAAA;AAAA,MAAM,MAAO,CAAA,MAAA;AAAA,MAAQ;AAAA,QAChF,MAAM,QAAS,CAAA,IAAA;AAAA,QACf,aAAA,EAAe,MAAO,CAAA,GAAA,CAAI,eAAe,CAAA;AAAA,OAC3C;AAAA,KACA,CAAA;AACA,IAAA,MAAM,SAAS,OAAO,CAAA,CAAA;AAAA,GACxB;AAAA,EAEA,MAAM,uBAA0B,GAAA;AA1KlC,IAAA,IAAA,EAAA,CAAA;AA2KI,IAAA,MAAM,GAAM,GAAA,IAAI,GAAI,CAAA,QAAA,CAAS,UAAU,CAAA,CAAA;AACvC,IAAA,IAAI,GAAI,CAAA,YAAA,CAAa,GAAI,CAAA,OAAO,CAAG,EAAA;AACjC,MAAM,MAAA,IAAI,MAAM,CAA2B,wBAAA,EAAA,GAAA,CAAI,aAAa,GAAI,CAAA,mBAAmB,CAAC,CAAE,CAAA,CAAA,CAAA;AAAA,KACxF;AACA,IAAA,MAAM,EAAE,OAAA,EAAS,IAAM,EAAA,EAAE,IAAM,EAAA,aAAA,EAAgB,EAAA,GAAI,MAAM,IAAA,CAAK,IAAK,CAAA,uBAAA,CAAwB,SAAS,MAAM,CAAA,CAAA;AAC1G,IAAA,IAAA,CAAK,WAAW,OAAO,CAAA,CAAA;AACvB,IAAQ,OAAA,CAAA,YAAA,CAAa,IAAM,EAAA,EAAA,EAAI,IAAQ,IAAA,QAAA,CAAS,UAAW,CAAA,OAAA,CAAQ,OAAS,EAAA,EAAE,CAAC,CAAA,CAAA;AAC/E,IAAA,IAAA,CAAK,gBAAiB,CAAA,CAAA,EAAA,GAAA,IAAA,CAAK,OAAL,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,YAAc,EAAA,CAAA,CAAA;AAClD,IAAI,IAAA,aAAA;AAAe,MAAA,MAAM,SAAS,aAAa,CAAA,CAAA;AAAA,GACjD;AAAA,EAEA,gBAAmB,GAAA;AACjB,IAAM,MAAA,OAAA,GAAU,cAAc,GAAI,EAAA,CAAA;AAClC,IAAA,OAAA,CAAO,OAAS,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,IAAA,KAAQ,KAAQ,GAAA,OAAA,CAAQ,KAAQ,GAAA,KAAA,CAAA,CAAA;AAAA,GAClD;AAAA,EAEA,MAAM,cAAc,SAAmB,EAAA;AACrC,IAAA,IAAA,CAAK,WAAW,MAAM,IAAA,CAAK,KAAK,aAAc,CAAA,SAAA,EAAW,KAAK,OAAO,CAAA,CAAA;AACrE,IAAK,IAAA,CAAA,UAAA,CAAW,KAAK,OAAO,CAAA,CAAA;AAAA,GAC9B;AAAA,EAEA,SAAS,QAA0B,EAAA;AACjC,IAAK,IAAA,CAAA,eAAA,CAAgB,KAAK,QAAQ,CAAA,CAAA;AAClC,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,eAAgB,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA;AACnD,MAAA,IAAI,KAAS,IAAA,CAAA,CAAA;AAAI,QAAK,IAAA,CAAA,eAAA,CAAgB,MAAO,CAAA,KAAA,EAAO,CAAC,CAAA,CAAA;AAAA,KACvD,CAAA;AAAA,GACF;AAAA,EAEQ,iBAAiB,OAAkB,EAAA;AACzC,IAAA,MAAM,EAAE,KAAO,EAAA,YAAA,EAAc,KAAK,MAAO,EAAA,GAAI,QAAQ,YAAa,EAAA,CAAA;AAClE,IAAA,MAAM,EAAE,QAAA,EAAa,GAAA,OAAA,CAAQ,cAAe,EAAA,CAAA;AAC5C,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,GAAA,IAAO,CAAC,MAAA;AAAQ,MAAA,OAAA;AAC/B,IAAA,MAAM,aAAa,YAAgB,IAAA,UAAA,CAAA;AACnC,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,aAAA,CAAc,IAAI,EAAE,IAAA,EAAM,OAAO,QAAqB,EAAA,GAAA,EAAK,QAAQ,CAAA,CAAA;AAAA,KAC9D,MAAA;AACL,MAAA,aAAA,CAAc,IAAI,EAAE,KAAA,EAAO,MAAM,KAAO,EAAA,GAAA,EAAK,QAAQ,CAAA,CAAA;AAAA,KACvD;AAAA,GACF;AAAA,EAEA,MAAc,iBAAiB,SAAgC,EAAA;AAC7D,IAAI,IAAA,CAAC,KAAK,MAAO,CAAA,KAAA;AAAO,MAAA,OAAA;AAExB,IAAA,IAAI,CAAC,SAAW,EAAA;AAEd,MAAA,OAAA,CAAQ,MAAM,mEAAmE,CAAA,CAAA;AACjF,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,MAAM,EAAE,KAAO,EAAA,IAAA,EAAM,cAAc,SAAW,EAAA,YAAA,EAAc,sBAAyB,GAAA,SAAA,CAAA;AACrF,IAAA,MAAM,YAAY,SAAc,KAAA,qBAAA,CAAA;AAChC,IAAA,MAAM,aAAa,SAAc,KAAA,kBAAA,CAAA;AAEjC,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,UAAA,IAAc,oBAAyB,KAAA,SAAA;AAAW,MAAA,OAAA;AAErE,IAAM,MAAA,QAAA,GAAW,YAAiB,KAAA,UAAA,GAAa,OAAU,GAAA,YAAA,CAAA;AAEzD,IAAA,MAAM,QAAW,GAAA;AAAA,MACf,UAAY,EAAA,YAAA;AAAA,MACZ,YAAc,EAAA,KAAA;AAAA,MACd,OAAS,EAAA;AAAA,QACP,KAAA;AAAA,QACA,IAAA;AAAA,QACA,qBAAA,EAAuB,YAAY,UAAa,GAAA,WAAA;AAAA,QAChD,WAAa,EAAA,QAAA;AAAA,QACb,eAAA,EAAiB,QAAa,KAAA,OAAA,GAAU,QAAW,GAAA,YAAA;AAAA,OACrD;AAAA,KACF,CAAA;AAEA,IAAA,MAAM,QAAW,GAAA,MAAM,KAAM,CAAA,IAAA,CAAK,OAAO,KAAO,EAAA;AAAA,MAC9C,MAAQ,EAAA,MAAA;AAAA,MACR,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,QAAQ,CAAA;AAAA,MAC7B,OAAS,EAAA;AAAA,QACP,cAAgB,EAAA,kBAAA;AAAA,OAClB;AAAA,KACD,CAAA,CAAA;AACD,IAAM,MAAA,IAAA,GAAO,MAAM,QAAA,CAAS,IAAK,EAAA,CAAA;AAEjC,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAEhB,MAAQ,OAAA,CAAA,KAAA,CAAM,2CAA2C,IAAI,CAAA,CAAA;AAAA,KAC/D;AAAA,GACF;AAAA,EAEA,MAAM,wBAA2B,GAAA;AAC/B,IAAI,IAAA;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,IAAK,CAAA,MAAA,CAAO,UAAU,CAAwB,sBAAA,CAAA,CAAA,CAAA;AAC9E,MAAM,MAAA,cAAA,GAAiB,MAAM,QAAA,CAAS,IAAK,EAAA,CAAA;AAE3C,MAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAEhB,QAAQ,OAAA,CAAA,KAAA,CAAM,kDAAkD,cAAc,CAAA,CAAA;AAAA,OAChF;AAEA,MAAA,MAAM,YAAe,GAAA,MAAA,CAAO,IAAK,CAAA,cAAA,IAAkB,EAAE,CAAA,CAAA;AACrD,MAAA,OAAO,aAAa,MAAO,CAAA,CAAA,GAAA,KAAO,cAAe,CAAA,GAAG,MAAM,IAAI,CAAA,CAAA;AAAA,aACvD,KAAO,EAAA;AACd,MAAQ,OAAA,CAAA,KAAA,CAAM,kDAAkD,KAAK,CAAA,CAAA;AACrE,MAAA,OAAO,EAAC,CAAA;AAAA,KACV;AAAA,GACF;AACF,CAAA,CAAA;AAtOE,aAAA,CALW,eAKJ,EAAA,UAAA,CAAA,CAAA;AALF,IAAM,cAAN,GAAA;;AClCA,SAAS,UAAa,GAAA;AAC3B,EAAA,MAAM,UAAU,cAAe,CAAA,QAAA,CAAA;AAC/B,EAAM,MAAA,CAAC,OAAS,EAAA,UAAU,CAAI,GAAA,QAAA,CAAA,CAA8B,mCAAS,UAAe,EAAA,IAAA,OAAA,CAAQ,UAAW,EAAA,GAAI,KAAS,CAAA,CAAA,CAAA;AACpH,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,mCAAS,QAAS,CAAA,UAAA,CAAA,CAAA;AAAA,GAC3B,EAAG,EAAE,CAAA,CAAA;AACL,EAAO,OAAA,OAAA,CAAA;AACT,CAAA;AAGO,MAAM,iBAAoB,GAAA,CAAC,EAAE,OAAA,GAAU,MAAkC,KAAA;AAC9E,EAAA,MAAM,CAAC,uBAAA,EAAyB,0BAA0B,CAAA,GAAI,SAAkB,OAAO,CAAA,CAAA;AACvF,EAAA,MAAM,CAAC,cAAgB,EAAA,iBAAiB,CAAI,GAAA,QAAA,CAAqB,EAAE,CAAA,CAAA;AAEnE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,CAAC,YAAY;AACX,MAAI,IAAA,CAAC,cAAe,CAAA,QAAA,IAAY,CAAC,OAAA;AAAS,QAAA,OAAA;AAC1C,MAAI,IAAA;AACF,QAAA,MAAM,SAAa,GAAA,MAAM,cAAe,CAAA,QAAA,CAAS,wBAAyB,EAAA,CAAA;AAC1E,QAAA,iBAAA,CAAkB,SAAS,CAAA,CAAA;AAC3B,QAAA,0BAAA,CAA2B,KAAK,CAAA,CAAA;AAAA,eACzB,KAAO,EAAA;AACd,QAAA,OAAA,CAAQ,MAAM,KAAK,CAAA,CAAA;AACnB,QAAA,0BAAA,CAA2B,KAAK,CAAA,CAAA;AAAA,OAClC;AAAA,KACC,GAAA,CAAA;AAAA,GACF,EAAA,CAAC,cAAe,CAAA,QAAQ,CAAC,CAAA,CAAA;AAE5B,EAAO,OAAA,CAAC,gBAAgB,uBAAuB,CAAA,CAAA;AACjD,CAAA;;;;;;;;;;;;;;;;;;;;;AC/BO,MAAM,SAAS,UAAW,CAAA,CAAC,KAAgC,EAAA,GAAA,0BAC/D,KAAI,EAAAD,eAAA,CAAAC,gBAAA,CAAA,EAAA,GAAA,EAAA,EAAc,KAAlB,CAAA,EAAA,EAAyB,OAAM,IAAK,EAAA,MAAA,EAAO,MAAK,OAAQ,EAAA,WAAA,EAAY,OAAM,4BACzE,EAAA,QAAA,EAAA;AAAA,kBAAC,IAAA,CAAA,GAAA,EAAA,EAAE,aAAU,uBACX,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,MAAA,EAAA,EAAK,aAAU,SAAU,EAAA,WAAA,EAAU,WAAU,CAAE,EAAA,m0CAAA,EAAo0C,MAAK,OAAQ,EAAA,CAAA;AAAA,oBACh4C,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,mNAAA,EAAoN,MAAK,OAAQ,EAAA,CAAA;AAAA,oBACxO,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,mNAAA,EAAoN,MAAK,OAAQ,EAAA,CAAA;AAAA,oBACxO,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,+MAAA,EAAgN,MAAK,OAAQ,EAAA,CAAA;AAAA,oBACpO,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,wNAAA,EAAyN,MAAK,OAAQ,EAAA,CAAA;AAAA,oBAC7O,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,qWAAA,EAAsW,MAAK,OAAQ,EAAA,CAAA;AAAA,oBAC1X,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,+PAAA,EAAgQ,MAAK,OAAQ,EAAA,CAAA;AAAA,oBACpR,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,8MAAA,EAA+M,MAAK,OAAQ,EAAA,CAAA;AAAA,GACtO,EAAA,CAAA;AAAA,sBACC,MACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,UAAS,EAAA,EAAA,EAAA,EAAG,mBACX,QAAC,kBAAA,GAAA,CAAA,MAAA,EAAA,EAAK,KAAM,EAAA,IAAA,EAAK,QAAO,IAAK,EAAA,IAAA,EAAK,SAAQ,SAAU,EAAA,sBAAA,EAAuB,GAC7E,CACF,EAAA,CAAA;AAAA,CAAA,EAAA,CACF,CACD,CAAA;;;;;;;;;;;;;;;;;;;;;AClBM,MAAM,SAAS,UAAW,CAAA,CAAC,KAAgC,EAAA,GAAA,0BAC/D,KAAI,EAAAD,eAAA,CAAAC,gBAAA,CAAA,EAAA,GAAA,EAAA,EAAc,KAAlB,CAAA,EAAA,EAAyB,OAAM,IAAK,EAAA,MAAA,EAAO,MAAK,OAAQ,EAAA,WAAA,EAAY,OAAM,4BACzE,EAAA,QAAA,EAAA;AAAA,kBAAC,IAAA,CAAA,GAAA,EAAA,EAAE,aAAU,uBACX,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAK,EAAA,EAAA,CAAA,EAAE,uMAAwM,EAAA,IAAA,EAAK,SAAU,EAAA,CAAA;AAAA,oBAC9N,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,0PAAA,EAA2P,MAAK,SAAU,EAAA,CAAA;AAAA,oBACjR,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,0JAAA,EAA2J,MAAK,SAAU,EAAA,CAAA;AAAA,oBACjL,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,oPAAA,EAAqP,MAAK,SAAU,EAAA,CAAA;AAAA,GAC9Q,EAAA,CAAA;AAAA,sBACC,MACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,UAAS,EAAA,EAAA,EAAA,EAAG,mBACX,QAAC,kBAAA,GAAA,CAAA,MAAA,EAAA,EAAK,KAAM,EAAA,IAAA,EAAK,QAAO,IAAK,EAAA,IAAA,EAAK,SAAQ,SAAU,EAAA,wBAAA,EAAyB,GAC/E,CACF,EAAA,CAAA;AAAA,CAAA,EAAA,CACF,CACD,CAAA;;;;;;;;;;;;;;;;;;;;;ACdM,MAAM,YAAY,UAAW,CAAA,CAAC,KAAgC,EAAA,GAAA,0BAClE,KAAI,EAAAD,eAAA,CAAAC,gBAAA,CAAA,EAAA,GAAA,EAAA,EAAc,KAAlB,CAAA,EAAA,EAAyB,OAAM,IAAK,EAAA,MAAA,EAAO,MAAK,OAAQ,EAAA,WAAA,EAAY,OAAM,4BACzE,EAAA,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,MAAK,EAAA,EAAA,CAAA,EAAE,mDAAoD,EAAA,IAAA,EAAK,SAAU,EAAA,CAAA;AAAA,kBAC1E,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,mDAAA,EAAoD,MAAK,SAAU,EAAA,CAAA;AAAA,kBAC1E,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,mDAAA,EAAoD,MAAK,SAAU,EAAA,CAAA;AAAA,kBAC1E,GAAA,CAAA,MAAA,EAAA,EAAK,CAAE,EAAA,mDAAA,EAAoD,MAAK,SAAU,EAAA,CAAA;AAAA,CAAA,EAAA,CAC7E,CACD,CAAA;;ACiBD,MAAM,aAAsD,GAAA;AAAA,EAC1D,MAAA,sBAAS,MAAO,EAAA,EAAA,CAAA;AAAA,EAChB,MAAA,sBAAS,MAAO,EAAA,EAAA,CAAA;AAAA,EAChB,SAAA,sBAAY,SAAU,EAAA,EAAA,CAAA;AACxB,CAAA,CAAA;AAEA,MAAM,iBAAiB,CAAC,EAAE,UAAU,KAAO,EAAA,OAAA,EAAS,UAAoC,KAAA;AACtF,EAAA,MAAM,IAAI,cAAe,EAAA,CAAA;AACzB,EAAA,2BACG,GACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAY,EAAA,OAAA;AAAA,MACZ,IAAK,EAAA,QAAA;AAAA,MACL,IAAK,EAAA,IAAA;AAAA,MACL,EAAA,EAAI,EAAE,KAAA,EAAO,MAAO,EAAA;AAAA,MACpB,OAAS,EAAA,MAAM,KAAM,CAAA,KAAA,EAAO,QAAQ,CAAA;AAAA,MACpC,UAAU,OAAW,IAAA,QAAA;AAAA,MAEpB,QACG,EAAA,OAAA,mBAAA,GAAA,CAAC,eAAgB,EAAA,EAAA,CAAA,mBAChB,IAAA,CAAA,IAAA,EAAA,EAAK,UAAW,EAAA,QAAA,EAAS,KAAO,EAAA,EAAE,GAAK,EAAA,KAAA,EACvC,EAAA,QAAA,EAAA;AAAA,QAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,QAAG,WAAY,CAAA,CAAA,CAAE,SAAW,EAAA,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,OACzE,EAAA,CAAA;AAAA,KAAA;AAAA,GAGN,EAAA,CAAA,CAAA;AAEJ,CAAA,CAAA;AAEa,MAAA,QAAA,GAAW,CAAC,EAAE,cAAA,EAAgB,SAAS,aAAe,EAAA,QAAA,EAAU,cAA0B,KAAA;AACrG,EAAA,MAAM,IAAI,cAAe,EAAA,CAAA;AACzB,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,IAAA,EAAA,EAAK,eAAc,QAAS,EAAA,GAAA,EAAG,MAC7B,QAAgB,EAAA,cAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAA,GAAA,CAAI,CAAC,QAAa,qBAAA,GAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QAClC,QAAA;AAAA,QACA,KAAO,EAAA,QAAA;AAAA,QACP,OAAA,EAAS,WAAW,aAAkB,KAAA,QAAA;AAAA,QACtC,QAAU,EAAA,OAAA;AAAA,OAAA;AAAA,MACL,QAAA;AAAA,KAGT,CAAA,EAAA,CAAA;AAAA,oBACC,GAAA,CAAA,GAAA,EAAA,EAAE,SAAU,EAAA,WAAA,EACX,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,UAAW,EAAA,YAAA,EAAa,WAAY,EAAA,WAAA,EAAa,QAAE,EAAA,CAAA,CAAA,EAAA,EAAG,CAC9D,EAAA,CAAA;AAAA,wBACC,IAAK,EAAA,EAAA,WAAA,EAAY,aAAY,KAAM,EAAA,QAAA,EAAU,YAAE,mBAAoB,EAAA,CAAA;AAAA,oBACnE,GAAA,CAAA,MAAA,EAAA,EAAO,IAAK,EAAA,IAAA,EAAK,UAAU,OAAS,EAAA,WAAA,EAAY,OAAQ,EAAA,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA,EACvF,YAAE,oBACL,EAAA,CAAA;AAAA,GACF,EAAA,CAAA,CAAA;AAEJ,CAAA;;AC3EA,MAAM,gBAAmB,GAAA,eAAA,CAAA;AACzB,MAAM,YAAe,GAAA,CAAC,aAAe,EAAA,sBAAA,EAAwB,eAAe,aAAa,CAAA,CAAA;AAElF,SAAS,gBAA8B,GAAA;AAC5C,EAAM,MAAA,IAAA,GAAO,YAAa,CAAA,OAAA,CAAQ,gBAAgB,CAAA,CAAA;AAClD,EAAI,IAAA,IAAA,KAAS,SAAS,IAAS,KAAA,KAAA;AAAO,IAAO,OAAA,IAAA,CAAA;AAE7C,EAAA,IAAI,UAAU,2BAA2B,CAAA;AAAG,IAAO,OAAA,KAAA,CAAA;AACnD,EAAA,KAAA,MAAW,OAAO,YAAc,EAAA;AAC9B,IAAI,IAAA,YAAA,CAAa,QAAQ,GAAG,CAAA;AAAG,MAAO,OAAA,KAAA,CAAA;AAAA,GACxC;AACA,EAAO,OAAA,KAAA,CAAA;AACT,CAAA;AAEO,SAAS,iBAAiB,IAAiB,EAAA;AAChD,EAAa,YAAA,CAAA,OAAA,CAAQ,kBAAkB,IAAI,CAAA,CAAA;AAC7C;;ACUa,MAAA,QAAA,GAAW,CAAC,EAAE,KAAA,EAAO,UAAU,OAAS,EAAA,QAAA,EAAU,WAAa,EAAA,YAAA,EAA0B,KAAA;AACpG,EAAA,MAAM,IAAI,cAAe,EAAA,CAAA;AACzB,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAC,IAAA,CAAA,IAAA,EAAA,EAAK,eAAc,QAAS,EAAA,KAAA,EAAO,EAAE,GAAK,EAAA,KAAA,EAAO,SAAW,EAAA,KAAA,EAC3D,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAM,EAAA,EAAA,OAAA,EAAQ,OAAS,EAAA,QAAA,EAAA,CAAA,CAAE,KAAM,EAAA,CAAA;AAAA,0BAC/B,KAAM,EAAA,EAAA,EAAA,EAAG,SAAQ,IAAK,EAAA,OAAA,EAAQ,MAAK,OAAQ,EAAA,KAAA,EAAc,QAAU,EAAA,CAAA,CAAA,KAAK,SAAS,CAAE,CAAA,MAAA,CAAO,KAAK,CAAG,EAAA,WAAA,EAAa,EAAE,WAAa,EAAA,CAAA;AAAA,sBAC/H,GAAA,CAAC,MAAO,EAAA,EAAA,WAAA,EAAY,SAAU,EAAA,IAAA,EAAK,MAAK,KAAO,EAAA,EAAE,SAAW,EAAA,MAAA,EAAU,EAAA,QAAA,EAAU,YAAY,OACzF,EAAA,QAAA,EAAA,OAAA,IAAW,CAAC,WAAA,mBAAe,GAAA,CAAA,eAAA,EAAA,EAAgB,oBAAM,GAAA,CAAA,IAAA,EAAA,EAAM,QAAE,EAAA,CAAA,CAAA,QAAA,EAAS,CACrE,EAAA,CAAA;AAAA,KACF,EAAA,CAAA;AAAA,oBACC,GAAA,CAAA,GAAA,EAAA,EAAE,SAAU,EAAA,WAAA,EACX,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,UAAW,EAAA,YAAA,EAAa,WAAY,EAAA,WAAA,EAAa,QAAE,EAAA,CAAA,CAAA,EAAA,EAAG,CAC9D,EAAA,CAAA;AAAA,wBACC,IAAK,EAAA,EAAA,WAAA,EAAY,aAAY,KAAM,EAAA,QAAA,EAAU,YAAE,gBAAiB,EAAA,CAAA;AAAA,oBAChE,GAAA,CAAA,MAAA,EAAA,EAAO,IAAK,EAAA,IAAA,EAAK,UAAU,OAAS,EAAA,WAAA,EAAY,OAAQ,EAAA,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA,EACvF,YAAE,WACL,EAAA,CAAA;AAAA,GACF,EAAA,CAAA,CAAA;AAEJ,CAAA;;AClCA,MAAM,WAAW,MAAO,CAAA,IAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,EA0BE,KAAM,CAAA,KAAA,CAAM,KAAM,CAAA,KAAK,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAKrC,KAAM,CAAA,KAAA,CAAM,MAAO,CAAA,KAAK,CAAC,CAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAKtC,MAAM,kBAAkB,MAAM;AAC5B,EAAA,MAAM,IAAI,cAAe,EAAA,CAAA;AACzB,EAAA,uBAAQ,GAAA,CAAA,IAAA,EAAA,EACN,QAAC,kBAAA,IAAA,CAAA,IAAA,EAAA,EAAK,gBAAe,QACnB,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,UAAA,EAAW,OACd,EAAA,QAAA,EAAA,CAAA,CAAE,oBACL,EAAA,CAAA;AAAA,wBACC,IAAK,EAAA,EAAA,UAAA,EAAW,SAAQ,WAAY,EAAA,WAAA,EAClC,YAAE,uBACL,EAAA,CAAA;AAAA,GAAA,EACF,CACF,EAAA,CAAA,CAAA;AACF,CAAA,CAAA;AAEO,MAAM,QAAQ,CACnB,EAAE,QAAU,EAAA,YAAA,GAAe,IAAI,WAAa,EAAA,sBAAA,EAAwB,SAAW,EAAA,KAAA,EAAO,QAAQ,UAAa,GAAA,CAAC,KAAO,EAAA,KAAK,GACrH,KAAA;AACH,EAAA,MAAM,IAAI,cAAe,EAAA,CAAA;AACzB,EAAM,MAAA,CAAC,cAAgB,EAAA,uBAAuB,CAAI,GAAA,iBAAA,CAAkB,EAAE,OAAA,EAAS,UAAW,CAAA,QAAA,CAAS,KAAK,CAAA,EAAG,CAAA,CAAA;AAC3G,EAAA,MAAM,YAAe,GAAA,IAAI,eAAgB,CAAA,QAAA,CAAS,MAAM,CAAA,CAAA;AACxD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAS,CAAA,YAAA,CAAa,GAAI,CAAA,mBAAmB,CAAK,IAAA,YAAA,CAAa,GAAI,CAAA,OAAO,KAAK,EAAE,CAAA,CAAA;AAC3G,EAAM,MAAA,CAAC,SAAS,CAAI,GAAA,QAAA,CAAS,aAAa,GAAI,CAAA,YAAY,KAAK,EAAE,CAAA,CAAA;AACjE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAC5C,EAAM,MAAA,kBAAA,GAAqB,YAAa,CAAA,GAAA,CAAI,UAAU,CAAA,CAAA;AACtD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAA+B,EAAA,CAAA;AACzE,EAAM,MAAA,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAA,QAAA,CAAS,gBAAgB,YAAa,CAAA,GAAA,CAAI,OAAO,CAAA,IAAK,EAAE,CAAA,CAAA;AAClF,EAAA,MAAM,QAAW,GAAA,CAAC,KAAM,CAAA,KAAA,CAAM,SAAS,CAAA,CAAA;AACvC,EAAA,MAAM,kBAAkB,UAAW,CAAA,QAAA,CAAS,KAAK,CAAK,IAAA,CAAC,EAAC,cAAgB,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAA,MAAA,CAAA,CAAA;AACxE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAgC,EAAA,CAAA;AAExD,EAAA,SAAA,CAAU,MAAM;AACd,IAAQ,OAAA,CAAA,eAAA,GAAkB,gBAAiB,EAAA,GAAI,KAAK,CAAA,CAAA;AAAA,GACtD,EAAG,CAAC,eAAe,CAAC,CAAA,CAAA;AAEpB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,kBAAA;AAAoB,MAAA,OAAA;AACzB,IAAA,IAAI,kBAAuB,KAAA,OAAA;AAAS,MAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,SAAA,IACtC,iDAAgB,QAAS,CAAA,kBAAA,CAAA;AAAqB,MAAA,KAAA,CAAM,OAAO,kBAAkB,CAAA,CAAA;AAAA,GACrF,EAAA,CAAC,cAAgB,EAAA,uBAAuB,CAAC,CAAA,CAAA;AAE5C,EAAe,eAAA,KAAA,CAAM,MAAiB,QAAqB,EAAA;AACzD,IAAA,QAAA,CAAS,EAAE,CAAA,CAAA;AACX,IAAA,UAAA,CAAW,IAAI,CAAA,CAAA;AACf,IAAa,QAAA,KAAA,aAAA,IAAiB,iBAAiB,QAAQ,CAAA,CAAA;AACvD,IAAI,IAAA;AACF,MAAA,MAAM,OAAkB,IAAS,KAAA,KAAA,IAAS,CAAC,CAAC,WAAW,EAAE,IAAA,EAAM,KAAO,EAAA,QAAA,EAAU,gBAAgB,QAAQ,CAAA,CAAA,KAAO,EAAE,IAAA,EAAM,OAAO,KAAM,EAAA,CAAA;AACpI,MAAA,gBAAA,CAAiB,KAAK,IAAI,CAAA,CAAA;AAC1B,MAAA,MAAM,SAAS,IAAI,CAAA,CAAA;AACnB,MAAI,IAAA,sBAAA;AAAwB,QAAA,UAAA,CAAW,KAAK,CAAA,CAAA;AAAA,aACrCC,MAAY,EAAA;AACnB,MAAA,UAAA,CAAW,KAAK,CAAA,CAAA;AAChB,MAAA,gBAAA,CAAiB,KAAS,CAAA,CAAA,CAAA;AAC1B,MAAA,IAAIA,kBAAiB,qBAAuB,EAAA;AAC1C,QAAA,QAAA,CAAS,EAAE,kBAAkB,CAAA,CAAA;AAAA,OACxB,MAAA;AACL,QAAA,QAAA,CAASA,MAAM,CAAA,OAAA,IAAWA,MAAM,CAAA,QAAA,EAAU,CAAA,CAAA;AAAA,OAC5C;AAAA,KACF;AAAA,GACF;AAEA,EAAA,SAAS,WAAW,CAAqC,EAAA;AACvD,IAAA,CAAA,CAAE,cAAe,EAAA,CAAA;AACjB,IAAI,IAAA,QAAA;AAAU,MAAA,OAAA;AACd,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,GACb;AAEA,EAAI,IAAA,uBAAA,IAA2B,CAAC,IAAM,EAAA;AACpC,IAAA,4BAAQ,IAAK,EAAA,EAAA,YAAA,EAAa,UAAS,cAAe,EAAA,QAAA,EAAS,IAAI,CAAG,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,eAAgB,EAAA,EAAA,CAAA;AAAA,MAAE,GAAA;AAAA,KAAC,EAAA,CAAA,CAAA;AAAA,GACxF;AAEA,EAAA,MAAM,yCAEF,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,MAAA,EAAA,EAAM,YAAE,uBAAwB,EAAA,CAAA;AAAA,oBACjC,GAAA,CAAC,UAAK,KAAO,EAAA,EAAE,YAAY,MAAO,EAAA,EAAI,YAAE,uBAAwB,EAAA,CAAA;AAAA,oBAChE,GAAA,CAAC,MAAM,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,uBAAwB,EAAA,CAAA;AAAA,GACnC,EAAA,CAAA,CAAA;AAGF,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,QAAS,EAAA,EAAA,QAAA,EAAU,UAAY,EAAA,SAAA,EAAsB,KACpD,EAAA,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,QACC,EAAA,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAS,EAAA,EAAA,CAAA;AAAA,wBACT,IAAA,CAAA,IAAA,EAAA,EAAK,aAAc,EAAA,QAAA,EAAS,YAAW,QACtC,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAK,UAAW,EAAA,OAAA,EAAQ,QAAO,QAAU,EAAA,QAAA,EAAA,WAAA,IAAe,EAAE,OAAQ,EAAA,CAAA;AAAA,0BAClE,GAAA,CAAA,IAAA,EAAA,EAAK,UAAW,EAAA,OAAA,EAAQ,WAAY,EAAA,WAAA,EAAY,KAAM,EAAA,QAAA,EACpD,QAAS,EAAA,IAAA,KAAA,KAAA,GAAQ,sBAAyB,GAAA,CAAA,CAAE,cAC/C,EAAA,CAAA;AAAA,SACF,EAAA,CAAA;AAAA,OACF,EAAA,CAAA;AAAA,MACC,SAAa,IAAA,SAAA,KAAc,sBAA0B,oBAAA,GAAA,CAAC,eAAgB,EAAA,EAAA,CAAA;AAAA,MAEtE,SAAS,KACR,mBAAA,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,QAAA;AAAA,UACA,OAAA;AAAA,UACA,aAAa,CAAC,aAAA;AAAA,UACd,KAAO,EAAA,KAAA;AAAA,UACP,QAAU,EAAA,QAAA;AAAA,UACV,YAAc,EAAA,OAAA;AAAA,SAAA;AAAA,OAGhB,mBAAA,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA;AAAA,UACA,aAAA;AAAA,UACA,QAAU,EAAA,KAAA;AAAA,UACV,cAAA;AAAA,UACA,YAAc,EAAA,OAAA;AAAA,SAAA;AAAA,OAChB;AAAA,MAGD,yBAAU,GAAA,CAAA,IAAA,EAAA,EAAK,WAAU,OAAQ,EAAA,KAAA,EAAM,UAAU,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,KAC1D,EAAA,CAAA;AAAA,IACC,MAAS,mBAAA,GAAA,CAAC,aACR,EAAA,EAAA,QAAA,EAAA,MAAA,EACH,CAAmB,GAAA,IAAA;AAAA,GACrB,EAAA,CAAA,CAAA;AAEJ;;;;;;;;;;;;;;;;;;;;;ACnJa,MAAA,aAAA,GAAgB,CAAC,EAAE,QAAA,EAAU,SAAS,SAAW,EAAA,gBAAA,EAAkB,cAAgB,EAAA,cAAA,EAA4B,KAAA;AAC1H,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAqB,SAAS,CAAA,CAAA;AAClE,EAAA,MAAM,WAAW,WAAY,EAAA,CAAA;AAC7B,EAAA,cAAA,IAAA,IAAA,GAAA,cAAA,GAAA,cAAA,GAAmB,cAAe,CAAA,QAAA,CAAA;AAClC,EAAA,IAAI,CAAC,cAAA;AAAgB,IAAM,MAAA,IAAI,MAAM,kCAAkC,CAAA,CAAA;AAEvE,EAAA,aAAA,CAAc,MAAM;AAClB,IAAA,eAAe,SAAY,GAAA;AACzB,MAAA,IAAI,CAAC,cAAA;AAAgB,QAAM,MAAA,IAAI,MAAM,kCAAkC,CAAA,CAAA;AACvE,MAAA,MAAM,eAAe,cAAe,EAAA,CAAA;AACpC,MAAI,IAAA,cAAA,CAAe,2BAA6B,EAAA;AAC9C,QAAA,MAAM,eAAe,uBAAwB,EAAA,CAAA;AAC7C,QAAA,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,EAAA,CAAA;AAAA,OACF;AACA,MAAI,IAAA,cAAA,CAAe,YAAc,EAAA;AAC/B,QAAA,aAAA,CAAc,eAAe,CAAA,CAAA;AAC7B,QAAA,SAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,EAAA,CAAA;AACA,QAAiB,cAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAA,eAAA,CAAA,CAAA;AAAA,OACZ,MAAA;AACL,QAAA,aAAA,CAAc,iBAAiB,CAAA,CAAA;AAC/B,QAAiB,cAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAA,iBAAA,CAAA,CAAA;AAAA,OACnB;AAAA,KACF;AAEA,IAAU,SAAA,EAAA,CAAA;AAAA,GACX,CAAA,CAAA;AAED,EAAA,IAAI,UAAe,KAAA,SAAA;AAAW,IAAO,OAAA,IAAA,CAAA;AACrC,EAAA,IAAI,UAAe,KAAA,eAAA;AAAiB,IAAO,OAAA,QAAA,CAAA;AAE3C,EAAA,uBACG,GAAA,CAAA,kBAAA,EAAA,EACC,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,gBAAe,QAAS,EAAA,UAAA,EAAW,QAAS,EAAA,IAAA,EAAM,CAAG,EAAA,KAAA,EAAO,EAAE,MAAA,EAAQ,QAC1E,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA,cAAA,CAAA;AAAA,MACC,KAAA,EAAO,EAAE,KAAA,EAAO,OAAQ,EAAA;AAAA,MACxB,QAAA,EAAU,UAAQ,cAAe,CAAA,oBAAA,CAAqB,iCAAK,IAAL,CAAA,EAAA,EAAW,MAAQ,EAAA,QAAA,EAAU,CAAA,CAAA;AAAA,MACnF,YAAA,EAAc,eAAe,gBAAiB,EAAA;AAAA,KAAA,EACzC,oBAAoB,EAAC,CAAA;AAAA,KAE9B,CACF,EAAA,CAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/dictionary.ts","../src/utils/cookies.ts","../src/utils/redirect.ts","../src/SessionManager.ts","../src/hooks.ts","../src/provider-icons/Github.tsx","../src/provider-icons/Google.tsx","../src/provider-icons/Microsoft.tsx","../src/IDPLogin.tsx","../src/last-login-type.ts","../src/SSOLogin.tsx","../src/Login.tsx","../src/Authenticated.tsx"],"sourcesContent":["import { Dictionary, useTranslate } from '@stack-spot/portal-translate'\n\nconst dictionary = {\n en: {\n welcome: 'Welcome to StackSpot AI',\n loginWithEmail: 'Log in with your email.',\n loginWithSocialAccount1: 'Sign up or access your ',\n loginWithSocialAccount2: ' freemium account ',\n loginWithSocialAccount3: ' with a social login',\n label: 'Corporate email',\n placeholder: 'email@company.com',\n continue: 'Continue',\n or: 'Or',\n loginWith: 'Continue with $0',\n emailNotAllowedTitle: 'Your email is linked to an Enterprise account.',\n emailNotAllowedSubtitle: \"Please log in with your corporate email.\",\n socialLogin: 'Login or register with a social account',\n corporateLoginTitle: 'Already have a StackSpot Enterprise account?',\n corporateLoginButton: 'Enter Enterprise account',\n socialLoginTitle: 'Do you want to access another way?',\n emailNotFoundError: 'We couldn\\'t find an account for this email.',\n errorMobileDesktop: \"It looks like you are using a mobile device in desktop mode. We recommend adjusting this setting before continuing for a complete experience.\"\n },\n pt: {\n welcome: 'Boas vindas à StackSpot AI',\n loginWithEmail: 'Faça login com seu e-mail.',\n loginWithSocialAccount1: 'Cadastre-se ou acesse sua ',\n loginWithSocialAccount2: ' conta freemium ',\n loginWithSocialAccount3: ' com uma conta social',\n label: 'Email corporativo',\n placeholder: 'email@empresa.com',\n continue: 'Continuar',\n or: 'Ou',\n loginWith: 'Continuar com $0',\n emailNotAllowedTitle: '\"Este e-mail está vinculado a uma conta Enterprise.',\n emailNotAllowedSubtitle: \"Faça login com seu email corporativo.\",\n socialLogin: 'Entre ou cadastre-se com uma conta social',\n corporateLoginTitle: 'Já possui uma conta StackSpot Enterprise?',\n corporateLoginButton: 'Entrar na conta Enterprise',\n socialLoginTitle: 'Você quer entrar de outro jeito?',\n emailNotFoundError: 'Não encontramos uma conta para este e-mail.',\n errorMobileDesktop: \"Parece que você está utilizando um dispositivo móvel na versão desktop. Recomendamos ajustar essa configuração antes de continuar para uma experiência completa.\"\n },\n} satisfies Dictionary\n\nexport const useTranslation = () => useTranslate(dictionary)\n","import { ThirdPartyLoginParams } from '@stack-spot/auth'\nimport { getCookie, getCookieDomain, removeCookie, setCookie } from '@stack-spot/portal-components'\n\nconst sessionKey = `stk-session${getCookieDomain()}`\n\ntype SessionCookie = ThirdPartyLoginParams & { sub: string, tenant: string }\n\nexport const sessionCookie = Object.freeze({\n set: (data: SessionCookie) => setCookie(sessionKey, JSON.stringify(data)),\n get: (): SessionCookie | undefined => {\n try {\n const cookie = getCookie(sessionKey)\n return cookie ? JSON.parse(cookie) : undefined\n } catch (error) {\n console.error(error)\n }\n },\n delete: () => removeCookie(sessionKey)\n})\n","import { getCookieDomain } from '@stack-spot/portal-components'\n\nconst isValidDomain = (url: string) => {\n const portalDomainRegex = new RegExp(`^https?:\\/\\/[a-zA-Z0-9.-]*${getCookieDomain().replaceAll('.', '\\.')}(:[0-9]{2,4})*.*$`, 'g')\n const platformDomainRegex = new RegExp(/^https:\\/\\/[a-zA-Z0-9.-]+\\.stackspot\\.com.*$/, 'g')\n const result = portalDomainRegex.test(url) || platformDomainRegex.test(url)\n return result\n}\n\nexport const redirect = async (url: string) => {\n\n if (!isValidDomain(url)) throw new Error('Redirect URL invalid domain')\n\n window.location.href = url\n /**\n * This is intentional. The promise bellow will never be fulfilled.\n * Once the set href is not instantaneous, this will guarantee no further code is executed until the user is really redirected.\n * Particularly useful to prevent flickering page renders on scenarios with redirects.\n */\n await new Promise(() => '')\n}","import { AccessTokenPayload, AuthConfig, AuthManager, Logger, Session, ThirdPartyAuthType, ThirdPartyLoginParams } from '@stack-spot/auth'\nimport { sessionCookie } from './utils/cookies'\nimport { redirect } from './utils/redirect'\n\nconst sessionKey = 'session'\n\ninterface SessionManagerConfig extends Pick<AuthConfig, 'accountUrl' | 'authUrl' | 'clientId' | 'defaultTenant' | 'retry' | 'retryDelay' | 'logger'> {\n /**\n * The URL to redirect to when the user logs out.\n * @default location.origin\n */\n loginUrl?: string,\n /**\n * The URL to redirect to when the login completes in the authentication app. If not provided, will be the same as `loginUrl`.\n * @default loginUrl\n */\n redirectUrl?: string,\n /**\n * Forbidden authentication types to this Session Manager.\n */\n blockedAuthTypes?: ThirdPartyAuthType[]\n /**\n * A URL to send login events to (observability).\n */\n rdUrl?: string,\n}\n\ntype AuthExtraData = { from?: string | null, finalRedirect?: string | null }\n\ntype ChangeListener = (session: Session | undefined) => void\n\n/**\n * Controls the current session in a browser.\n * \n * This should not be used under a Node.JS environment.\n * \n * This is a singleton. To create the first instance or recover the current one, use `SessionManager.create`.\n */\nexport class SessionManager {\n private current: Session | undefined\n private readonly auth: AuthManager<AuthExtraData>\n private config: SessionManagerConfig\n private changeListeners: ChangeListener[] = []\n private logger: Logger\n static instance: SessionManager | undefined\n\n private constructor(config: SessionManagerConfig) {\n config.loginUrl ||= location.origin\n const redirectUrl = (config.redirectUrl || config.loginUrl).replace(/([^/])$/, '$1/') // the trailing \"/\" is required by Stackspot IAM.\n this.config = config\n this.auth = new AuthManager<AuthExtraData>({\n ...config,\n redirectUrl,\n storage: localStorage,\n sessionPersistence: {\n load: () => localStorage.getItem(sessionKey),\n save: (session) => localStorage.setItem(sessionKey, session),\n },\n })\n this.logger = this.auth.config.logger\n SessionManager.instance = this\n\n // Keep session in sync with other app's session\n addEventListener('focus', () => this.validateSharedSession())\n }\n\n static create(config: SessionManagerConfig) {\n return SessionManager.instance ?? new SessionManager(config)\n }\n\n private setSession(session: Session | undefined) {\n this.current = session\n this.changeListeners.forEach(l => l(session))\n if (session) this.setSessionCookie(session)\n }\n\n async restoreSession() {\n const session = await this.auth.restoreSession()\n this.logger.log('Validating shared session.')\n const sessionValid = await this.validateSharedSession(session)\n this.setSession(sessionValid ? session : undefined)\n }\n\n async validateSharedSession(session: Session | undefined = this.current): Promise<boolean> {\n\n // skipping because authentication is in progress\n if (this.urlHasThirdPartyLoginData()) {\n this.logger.log('Session is invalid because there\\'s another authentication in progress.')\n return false\n }\n\n const sharedSessionCookie = sessionCookie.get()\n\n // It has been logged out on another portal, so logout on this one too\n if (!sharedSessionCookie) {\n this.logger.log('Session is invalid because no shared session cookie was found, i.e, a logout was performed in another portal. Forcing log off.')\n session && await this.logout()\n return false\n }\n\n const isDifferentSessionActive = sharedSessionCookie.sub != session?.getTokenData().sub\n const isSharedSessionTypeBlocked = this.config.blockedAuthTypes?.includes(sharedSessionCookie.type)\n if (isSharedSessionTypeBlocked) {\n this.logger.log('Session is invalid because shared sessions have been blocked in the SessionManager\\'s configuration (blockedAuthTypes).')\n return false\n } else if (isDifferentSessionActive || !session) {\n this.logger.log(isDifferentSessionActive\n ? 'Session is invalid because a different session is already active.'\n : 'Session is invalid because it\\'s undefined.'\n )\n this.logger.log('Starting login with tenant from the session cookie.')\n await this.startThirdPartyLoginUsingTenant(sharedSessionCookie)\n return false\n }\n return true\n }\n\n hasSession() {\n return !!this.current && !this.current.isExpired()\n }\n\n getSession() {\n if (!this.hasSession()) {\n this.endSession()\n throw new Error('Session is not available, redirecting to login.')\n }\n return this.current!\n }\n\n async endSession(redirectToLogin = true) {\n this.current = undefined\n localStorage.removeItem(sessionKey)\n sessionCookie.delete()\n if (redirectToLogin && this.config.loginUrl) await redirect(this.config.loginUrl)\n }\n\n async restartSession() {\n await this.logout({ endSession: false })\n this.current = undefined\n localStorage.removeItem(sessionKey)\n await this.restoreSession()\n }\n\n async logout({ endSession }: { endSession?: boolean } | undefined = { endSession: true }) {\n try {\n await this.current?.logout()\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Could not logout from IDM.\\n${error}`)\n }\n if (!endSession) return\n await this.endSession()\n }\n\n async startThirdPartyLogin(data: ThirdPartyLoginParams) {\n const params = new URLSearchParams(location.search)\n const authUrl = await this.auth.startThirdPartyLogin(data, {\n from: location.href,\n finalRedirect: params.get('finalRedirect'),\n })\n await redirect(authUrl)\n }\n\n urlHasThirdPartyLoginData() {\n const url = new URL(location.toString())\n return url.searchParams.has('state') && !url.searchParams.has('error')\n }\n\n async startThirdPartyLoginUsingTenant(data: ThirdPartyLoginParams) {\n const params = new URLSearchParams(location.search)\n const cookie = sessionCookie.get()\n if (!cookie || !cookie.tenant) {\n this.logger.log('Login out because no tenant information is available in the following data:', JSON.stringify(data))\n //If no tenant is available we should log out the user\n await this.logout()\n return\n }\n const authUrl = await this.auth.getThirdPartyLoginFromTenant(data, cookie.tenant, {\n from: location.href,\n finalRedirect: params.get('finalRedirect'),\n }\n )\n await redirect(authUrl)\n }\n\n async completeThirdPartyLogin() {\n const url = new URL(location.toString())\n if (url.searchParams.has('error')) {\n throw new Error(`Error while signing in: ${url.searchParams.get('error_description')}`)\n }\n const { session, data: { from, finalRedirect } } = await this.auth.completeThirdPartyLogin(location.search)\n this.setSession(session)\n history.replaceState(null, '', from || location.toString().replace(/\\?.*$/, ''))\n this.sendLoginEventRd(this.current?.getTokenData())\n if (finalRedirect) await redirect(finalRedirect)\n }\n\n getEmailForLogin() {\n const session = sessionCookie.get()\n return session?.type == 'sso' ? session.email : undefined\n }\n\n async switchAccount(accountId: string) {\n this.logger.log('Switching accounts', accountId, this.current?.getTokenData().account_id_v2)\n try {\n this.current && await this.auth.switchAccount(accountId, this.current)\n } catch (error) {\n this.logger.error('Error while switching accounts', error)\n throw error\n }\n this.setSession(this.current)\n }\n\n onChange(listener: ChangeListener) {\n this.changeListeners.push(listener)\n return () => {\n const index = this.changeListeners.indexOf(listener)\n if (index != -1) this.changeListeners.splice(index, 1)\n }\n }\n\n private setSessionCookie(session: Session) {\n const { email, account_type, sub, tenant } = session.getTokenData()\n const { provider } = session.getSessionData()\n if (!email || !sub || !tenant) return\n const isFreemium = account_type == 'FREEMIUM'\n if (isFreemium) {\n sessionCookie.set({ type: 'idp', provider: provider!, sub, tenant })\n } else {\n sessionCookie.set({ email, type: 'sso', sub, tenant })\n }\n }\n\n private async sendLoginEventRd(tokenData?: AccessTokenPayload) {\n if (!this.config.rdUrl) return\n\n if (!tokenData) {\n // eslint-disable-next-line no-console\n console.error('Unable to trigger login hook. No sessionEmail or name identified.')\n return\n }\n\n const { email, name, account_type, client_id, account_name, trial_account_status } = tokenData\n const isLoginAI = client_id === \"stackspot-portal-ai\"\n const isLoginEDP = client_id === \"stackspot-portal\"\n\n if (!isLoginAI && !isLoginEDP && trial_account_status === 'PENDING') return\n\n const leadType = account_type === 'FREEMIUM' ? 'TRIAL' : 'ENTERPRISE'\n\n const rdObject = {\n event_type: 'CONVERSION',\n event_family: 'CDP',\n payload: {\n email,\n name,\n conversion_identifier: isLoginAI ? 'login_ai' : 'login_edp',\n cf_leadtype: leadType,\n cf_account_name: leadType === 'TRIAL' ? leadType : account_name,\n },\n }\n\n const response = await fetch(this.config.rdUrl, {\n method: 'POST',\n body: JSON.stringify(rdObject),\n headers: {\n 'content-type': 'application/json',\n },\n })\n const data = await response.json()\n\n if (!response.ok) {\n // eslint-disable-next-line no-console\n console.error('Error while sending event to RD Station', data)\n }\n }\n\n async getTrialEnabledProviders() {\n try {\n const response = await fetch(`${this.config.accountUrl}/v1/accounts/trial/sso`)\n const trialProviders = await response.json()\n\n if (!response.ok) {\n // eslint-disable-next-line no-console\n console.error('Error while fetching available login providers', trialProviders)\n }\n\n const providerKeys = Object.keys(trialProviders || {})\n return providerKeys.filter(key => trialProviders[key] === true)\n } catch (error) {\n console.error('Error while fetching available login providers', error)\n return []\n }\n }\n}\n","import { Session } from '@stack-spot/auth'\nimport { useEffect, useState } from 'react'\nimport { SessionManager } from './SessionManager'\n\nexport function useSession() {\n const manager = SessionManager.instance\n const [session, setSession] = useState<Session | undefined>(manager?.hasSession() ? manager.getSession() : undefined)\n useEffect(() => {\n return manager?.onChange(setSession)\n }, [])\n return session\n}\n\nexport type Provider = 'google' | 'github' | 'microsoft'\nexport const useTrialProviders = ({ enabled = true }): [Provider[], boolean] => {\n const [isLoadingTrialProviders, setIsLoadingTrialProviders] = useState<boolean>(enabled)\n const [trialProviders, setTrialProviders] = useState<Provider[]>([])\n\n useEffect(() => {\n (async () => {\n if (!SessionManager.instance || !enabled) return\n try {\n const providers = (await SessionManager.instance.getTrialEnabledProviders()) as Provider[]\n setTrialProviders(providers)\n setIsLoadingTrialProviders(false)\n } catch (error) {\n console.error(error)\n setIsLoadingTrialProviders(false)\n }\n })()\n }, [SessionManager.instance])\n\n return [trialProviders, isLoadingTrialProviders]\n}\n","import { forwardRef, Ref, SVGProps } from 'react'\n\nexport const Github = forwardRef((props: SVGProps<SVGSVGElement>, ref: Ref<SVGSVGElement>) => (\n <svg ref={ref} {...props} width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_1215_2072)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12.0011 4.38525C10.1019 4.38624 8.26498 5.05889 6.81881 6.28294C5.37263 7.50698 4.4115 9.20259 4.10726 11.0666C3.80302 12.9306 4.17551 14.8414 5.15814 16.4574C6.14077 18.0733 7.66946 19.2891 9.47085 19.8872C9.86827 19.961 10.018 19.7147 10.018 19.5053C10.018 19.2958 10.01 18.6886 10.0074 18.0247C7.78183 18.5055 7.31155 17.0856 7.31155 17.0856C6.94858 16.1635 6.42399 15.9212 6.42399 15.9212C5.69804 15.4286 6.4783 15.4378 6.4783 15.4378C7.28241 15.4944 7.705 16.2584 7.705 16.2584C8.4177 17.4741 9.57683 17.1225 10.0325 16.917C10.1041 16.402 10.312 16.0516 10.5412 15.8527C8.76345 15.6525 6.89559 14.9702 6.89559 11.9222C6.88457 11.1317 7.17958 10.3673 7.71957 9.78704C7.63744 9.58683 7.36321 8.77808 7.79772 7.67954C7.79772 7.67954 8.46936 7.46616 9.99809 8.49488C11.3093 8.13834 12.6928 8.13834 14.0041 8.49488C15.5315 7.46616 16.2018 7.67954 16.2018 7.67954C16.6376 8.77544 16.3634 9.58419 16.2813 9.78704C16.823 10.3674 17.1186 11.1332 17.1066 11.9248C17.1066 14.9794 15.2347 15.6525 13.4543 15.8487C13.7404 16.0964 13.9961 16.5798 13.9961 17.3227C13.9961 18.387 13.9868 19.2431 13.9868 19.5053C13.9868 19.7173 14.1312 19.9649 14.5366 19.8872C16.3382 19.289 17.867 18.0731 18.8496 16.4568C19.8323 14.8406 20.2046 12.9295 19.9 11.0653C19.5954 9.20112 18.6338 7.50549 17.1871 6.28166C15.7405 5.05782 13.9031 4.38561 12.0037 4.38525H12.0011Z\" fill=\"white\" />\n <path d=\"M9.35091 17.3684C9.35091 17.4329 9.27673 17.4882 9.18135 17.4896C9.08597 17.4909 9.00781 17.4382 9.00781 17.3736C9.00781 17.3091 9.08199 17.2538 9.17737 17.2525C9.27275 17.2511 9.35091 17.3025 9.35091 17.3684Z\" fill=\"white\" />\n <path d=\"M9.96094 17.2672C9.97286 17.3317 9.90662 17.3989 9.81124 17.4147C9.71586 17.4305 9.63241 17.3923 9.62048 17.3291C9.60856 17.2659 9.67745 17.1974 9.77018 17.1803C9.86291 17.1631 9.94902 17.2027 9.96094 17.2672Z\" fill=\"white\" />\n <path d=\"M8.6968 17.324C8.67693 17.3859 8.58685 17.4136 8.49676 17.3872C8.40668 17.3609 8.34707 17.2871 8.36429 17.2239C8.38151 17.1607 8.47292 17.1317 8.56433 17.1607C8.65573 17.1897 8.71402 17.2595 8.6968 17.324Z\" fill=\"white\" />\n <path d=\"M8.09774 17.0658C8.05402 17.1145 7.96527 17.1013 7.89241 17.0355C7.81955 16.9696 7.80232 16.88 7.84604 16.8326C7.88975 16.7852 7.97851 16.7984 8.05402 16.8629C8.12953 16.9274 8.1441 17.0183 8.09774 17.0658V17.0658Z\" fill=\"white\" />\n <path d=\"M7.6686 16.6231C7.61959 16.6574 7.53612 16.6231 7.48976 16.5546C7.47694 16.5423 7.46674 16.5276 7.45978 16.5113C7.45281 16.495 7.44922 16.4775 7.44922 16.4598C7.44922 16.4421 7.45281 16.4246 7.45978 16.4083C7.46674 16.392 7.47694 16.3772 7.48976 16.3649C7.53877 16.332 7.62224 16.3649 7.6686 16.4321C7.71497 16.4993 7.71629 16.5889 7.6686 16.6231V16.6231Z\" fill=\"white\" />\n <path d=\"M7.3535 16.1662C7.32607 16.1799 7.29468 16.1838 7.26472 16.177C7.23475 16.1703 7.20807 16.1534 7.18924 16.1293C7.13757 16.074 7.12697 15.9976 7.16671 15.9633C7.20645 15.9291 7.27799 15.9449 7.32966 16.0002C7.38132 16.0555 7.39324 16.1319 7.3535 16.1662Z\" fill=\"white\" />\n <path d=\"M7.02905 15.8062C7.01183 15.8457 6.94825 15.8576 6.89658 15.8299C6.84492 15.8022 6.8065 15.7509 6.82505 15.71C6.8436 15.6692 6.90586 15.6587 6.95752 15.6863C7.00919 15.714 7.04893 15.7667 7.02905 15.8062Z\" fill=\"white\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1215_2072\">\n <rect width=\"16\" height=\"16\" fill=\"white\" transform=\"translate(4 4.05176)\" />\n </clipPath>\n </defs>\n </svg>\n))\n","import { forwardRef, Ref, SVGProps } from 'react'\n\nexport const Google = forwardRef((props: SVGProps<SVGSVGElement>, ref: Ref<SVGSVGElement>) => (\n <svg ref={ref} {...props} width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_1215_2403)\">\n <path d=\"M20.3442 12.2359C20.3442 11.6921 20.3001 11.1454 20.206 10.6104H12.6602V13.691H16.9813C16.802 14.6846 16.2258 15.5635 15.3822 16.122V18.1209H17.9602C19.4741 16.7276 20.3442 14.6699 20.3442 12.2359Z\" fill=\"#4285F4\" />\n <path d=\"M12.6607 20.0525C14.8184 20.0525 16.6379 19.344 17.9637 18.1212L15.3857 16.1223C14.6684 16.6103 13.7425 16.8866 12.6637 16.8866C10.5766 16.8866 8.80696 15.4785 8.17202 13.5854H5.51172V15.6461C6.86979 18.3475 9.63592 20.0525 12.6607 20.0525V20.0525Z\" fill=\"#34A853\" />\n <path d=\"M8.16852 13.5856C7.83341 12.592 7.83341 11.5161 8.16852 10.5225V8.46191H5.51116C4.37649 10.7224 4.37649 13.3857 5.51116 15.6462L8.16852 13.5856V13.5856Z\" fill=\"#FBBC04\" />\n <path d=\"M12.6607 7.2182C13.8013 7.20056 14.9036 7.62974 15.7296 8.41754L18.0136 6.1335C16.5674 4.77543 14.6479 4.02878 12.6607 4.0523C9.63592 4.0523 6.86979 5.75724 5.51172 8.46163L8.16908 10.5223C8.80108 8.62625 10.5736 7.2182 12.6607 7.2182V7.2182Z\" fill=\"#EA4335\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1215_2403\">\n <rect width=\"16\" height=\"16\" fill=\"white\" transform=\"translate(4.5 4.05176)\" />\n </clipPath>\n </defs>\n </svg>\n))\n","import { forwardRef, Ref, SVGProps } from 'react'\n\nexport const Microsoft = forwardRef((props: SVGProps<SVGSVGElement>, ref: Ref<SVGSVGElement>) => (\n <svg ref={ref} {...props} width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.19531 4.74707H12.1518V11.7036H5.19531V4.74707Z\" fill=\"#F35325\" />\n <path d=\"M12.8477 4.74707H19.8042V11.7036H12.8477V4.74707Z\" fill=\"#81BC06\" />\n <path d=\"M5.19531 12.3994H12.1518V19.3559H5.19531V12.3994Z\" fill=\"#05A6F0\" />\n <path d=\"M12.8477 12.3994H19.8042V19.3559H12.8477V12.3994Z\" fill=\"#FFBA08\" />\n </svg>\n))\n","import { Box, Button, Flex, IconBox, Text } from '@citric/core'\nimport { ExclamationTriangle } from '@citric/icons'\nimport { LoadingCircular } from '@citric/ui'\nimport { interpolate } from '@stack-spot/portal-translate'\nimport { capitalize } from 'lodash'\nimport { useTranslation } from './dictionary'\nimport { Provider } from './hooks'\nimport { Github } from './provider-icons/Github'\nimport { Google } from './provider-icons/Google'\nimport { Microsoft } from './provider-icons/Microsoft'\nimport { LoginType } from './types'\n\ninterface Props {\n trialProviders: Provider[],\n loading: boolean,\n loginProvider: Provider | undefined,\n onSubmit: (type: LoginType, provider?: Provider) => void,\n onChangeMode: (mode: LoginType) => void,\n}\n\ninterface ButtonProviderProps {\n provider: Provider,\n loading: boolean,\n disabled?: boolean,\n login: (type: LoginType, provider?: Provider) => void,\n}\n\nconst providerIcons: Record<Provider, React.ReactElement> = {\n github: <Github />,\n google: <Google />,\n microsoft: <Microsoft />,\n}\n\nconst ButtonProvider = ({ provider, login, loading, disabled }: ButtonProviderProps) => {\n const t = useTranslation()\n return (\n <Box>\n <Button\n colorScheme=\"light\"\n type=\"button\"\n size='md'\n sx={{ width: '100%' } as any}\n onClick={() => login('idp', provider)}\n disabled={loading || disabled}\n >\n {loading\n ? <LoadingCircular />\n : <Flex alignItems='center' style={{ gap: '4px' }}>\n {providerIcons[provider]}{interpolate(t.loginWith, capitalize(provider))}\n </Flex>\n }\n </Button>\n </Box>\n )\n}\n\nfunction hasTouchSupport() {\n return 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n}\n\nfunction isMobileUserAgent() {\n return /Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\nfunction isMobileWithDesktopView() {\n return !isMobileUserAgent() && hasTouchSupport();\n}\n\nexport const IDPLogin = ({ trialProviders, loading, loginProvider, onSubmit, onChangeMode }: Props) => {\n const t = useTranslation()\n const showErrorMessage = isMobileWithDesktopView()\n\n return (\n <>\n {showErrorMessage && <Flex bg=\"warning\" p={4} role=\"alert\" flexWrap='nowrap'>\n <IconBox colorIcon=\"warning.contrastText\">\n <ExclamationTriangle /> \n </IconBox>\n <Text appearance='body2' ml={2} colorScheme=\"warning.contrastText\">\n {t.errorMobileDesktop}\n </Text>\n </Flex>}\n\n <Flex flexDirection='column' gap>\n {trialProviders?.map((provider) => <ButtonProvider\n provider={provider}\n login={onSubmit}\n loading={loading && loginProvider === provider}\n disabled={loading}\n key={provider}\n />)\n }\n </Flex>\n <p className=\"separator\">\n <Text appearance='microtext1' colorScheme='light.700'>{t.or}</Text>\n </p>\n <Text colorScheme=\"light.700\" align=\"center\">{t.corporateLoginTitle}</Text>\n <Button size='md' disabled={loading} colorScheme=\"light\" onClick={() => onChangeMode('sso')}>\n {t.corporateLoginButton}\n </Button>\n </>\n )\n}","import { getCookie } from '@stack-spot/portal-components'\nimport { LoginType } from './types'\n\nconst lastLoginTypeKey = 'lastLoginType'\nconst fallbackKeys = ['guided-tour', '@stack-spot/opa:user', 'CHAT_AGENTS', 'RATED_US_IN']\n\nexport function getLastLoginType(): LoginType {\n const type = localStorage.getItem(lastLoginTypeKey)\n if (type === 'idp' || type === 'sso') return type\n // for now, the user won't have the variable \"lastLoginType\" set. So, we check for tother variables that may indicate this is an enterprise user\n if (getCookie('stk-session.stackspot.com')) return 'sso'\n for (const key of fallbackKeys) {\n if (localStorage.getItem(key)) return 'sso'\n }\n return 'idp'\n}\n\nexport function setLastLoginType(type: LoginType) {\n localStorage.setItem(lastLoginTypeKey, type)\n}\n","import { Button, Flex, Input, Label, Text } from '@citric/core'\nimport { Github, Google } from '@citric/icons'\nimport { LoadingCircular } from '@citric/ui'\nimport { useTranslation } from './dictionary'\nimport { Provider } from './hooks'\nimport { Microsoft } from './provider-icons/Microsoft'\nimport { LoginType } from './types'\n\ninterface Props {\n value: string,\n onChange: (value: string) => void,\n disabled: boolean,\n loading: boolean,\n hasProvider: boolean,\n onChangeMode: (mode: LoginType) => void,\n}\n\ninterface ButtonProviderProps {\n provider: Provider,\n loading: boolean,\n login: (type: LoginType, provider?: Provider) => void\n}\n\nconst providerIcons: Record<Provider, React.ReactElement> = {\n github: <Github />,\n google: <Google />,\n microsoft: <Microsoft />,\n}\n\nexport const SSOLogin = ({ value, onChange, loading, disabled, hasProvider, onChangeMode }: Props) => {\n const t = useTranslation()\n return (\n <>\n <Flex flexDirection='column' style={{ gap: '4px', marginTop: '4px' }}>\n <Label htmlFor='email'>{t.label}</Label>\n <Input id=\"email\" type='email' name=\"email\" value={value} onChange={e => onChange(e.target.value)} placeholder={t.placeholder} />\n <Button colorScheme=\"primary\" size='md' style={{ marginTop: '12px' }} disabled={disabled || loading}>\n {loading && !hasProvider ? <LoadingCircular /> : <Text>{t.continue}</Text>}\n </Button>\n </Flex>\n <p className=\"separator\">\n <Text appearance='microtext1' colorScheme='light.700'>{t.or}</Text>\n </p>\n <Text colorScheme=\"light.700\" align=\"center\">{t.socialLoginTitle}</Text>\n <Button size='md' disabled={loading} colorScheme=\"light\" onClick={() => onChangeMode('idp')}>\n {t.socialLogin}\n </Button>\n </>\n )\n}","import { Flex, Text } from '@citric/core'\nimport { Card, LoadingCircular } from '@citric/ui'\nimport { AuthMethodUnavailable } from '@stack-spot/auth'\nimport { BannerWarning } from '@stack-spot/portal-components'\nimport { MiniLogo } from '@stack-spot/portal-components/svg'\nimport { theme } from '@stack-spot/portal-theme'\nimport { useEffect, useState } from 'react'\nimport { styled } from 'styled-components'\nimport { useTranslation } from './dictionary'\nimport { Provider, useTrialProviders } from './hooks'\nimport { IDPLogin } from './IDPLogin'\nimport { getLastLoginType, setLastLoginType } from './last-login-type'\nimport { SSOLogin } from './SSOLogin'\nimport { LoginData, LoginProps, LoginType } from './types'\n\nconst LoginBox = styled.form`\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 24px;\n\n header {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 24px;\n }\n\n .separator {\n padding: 0 8px;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n gap: 8px;\n margin: 0;\n\n &:before, &:after {\n content: '';\n height: 1px;\n flex: 1;\n background-color: ${theme.color.light['500']};\n }\n }\n\n .error {\n color: ${theme.color.danger['500']};\n line-height: 1.5rem;\n }\n`\n\nconst EmailNotAllowed = () => {\n const t = useTranslation()\n return <Card>\n <Flex justifyContent=\"center\">\n <Text appearance='body2'>\n {t.emailNotAllowedTitle}\n </Text>\n <Text appearance='body2' colorScheme='light.700'>\n {t.emailNotAllowedSubtitle}\n </Text>\n </Flex>\n </Card>\n}\n\nexport const Login = (\n { onSubmit, initialValue = '', welcomeText, removeLoadingOnSuccess, className, style, banner, loginTypes = ['idp', 'sso'] }: LoginProps,\n) => {\n const t = useTranslation()\n const [trialProviders, isLoadingTrialProviders] = useTrialProviders({ enabled: loginTypes.includes('idp') })\n const searchParams = new URLSearchParams(location.search)\n const [error, setError] = useState(searchParams.get('error_description') || searchParams.get('error') || '')\n const [errorCode] = useState(searchParams.get('error_code') || '')\n const [loading, setLoading] = useState(false)\n const providerQueryParam = searchParams.get('provider') as Provider & 'email'\n const [loginProvider, setLoginProvider] = useState<Provider | undefined>()\n const [email, setEmail] = useState(initialValue || searchParams.get('email') || '')\n const disabled = !email.match(/\\w+@\\w+/)\n const idpLoginEnabled = loginTypes.includes('idp') && !!trialProviders?.length\n const [mode, setMode] = useState<LoginType | undefined>()\n\n useEffect(() => {\n setMode(idpLoginEnabled ? getLastLoginType() : 'sso')\n }, [idpLoginEnabled])\n\n useEffect(() => {\n if (!providerQueryParam) return\n if (providerQueryParam === 'email') login('sso')\n else if (trialProviders?.includes(providerQueryParam)) login('idp', providerQueryParam)\n }, [trialProviders, isLoadingTrialProviders])\n\n async function login(type: LoginType, provider?: Provider) {\n setError('')\n setLoading(true)\n provider !== loginProvider && setLoginProvider(provider)\n try {\n const data: LoginData = type === 'idp' && !!provider ? { type: 'idp', provider: `external-idp:${provider}` } : { type: 'sso', email }\n setLastLoginType(data.type)\n await onSubmit(data)\n if (removeLoadingOnSuccess) setLoading(false)\n } catch (error: any) {\n setLoading(false)\n setLoginProvider(undefined)\n if (error instanceof AuthMethodUnavailable) {\n setError(t.emailNotFoundError)\n } else {\n setError(error.message || error.toString())\n }\n }\n }\n\n function submitForm(e: React.FormEvent<HTMLFormElement>) {\n e.preventDefault()\n if (disabled) return\n login('sso')\n }\n\n if (isLoadingTrialProviders || !mode) {\n return <Flex alignContent=\"center\" justifyContent=\"center\" my={5}><LoadingCircular /> </Flex>\n }\n\n const loginWithSocialAccount = (\n <>\n <span>{t.loginWithSocialAccount1}</span>\n <span style={{ fontWeight: 'bold' }}>{t.loginWithSocialAccount2}</span>\n <span>{t.loginWithSocialAccount3}</span>\n </>\n )\n\n return (\n <>\n <LoginBox onSubmit={submitForm} className={className} style={style}>\n <header>\n <MiniLogo />\n <Flex flexDirection='column' alignItems='center'>\n <Text appearance='body1' weight='medium'>{welcomeText || t.welcome}</Text>\n <Text appearance='body2' colorScheme='light.700' align='center'>\n {mode === 'idp' ? loginWithSocialAccount : t.loginWithEmail}\n </Text>\n </Flex>\n </header>\n {errorCode && errorCode === 'EMAIL_IS_NOT_ALLOWED' && <EmailNotAllowed />}\n\n {mode === 'sso' ? (\n <SSOLogin\n disabled={disabled}\n loading={loading}\n hasProvider={!loginProvider}\n value={email}\n onChange={setEmail}\n onChangeMode={setMode}\n />\n ) : (\n <IDPLogin\n loading={loading}\n loginProvider={loginProvider}\n onSubmit={login}\n trialProviders={trialProviders}\n onChangeMode={setMode}\n />\n )}\n\n {error && <Text className=\"error\" align=\"center\">{error}</Text>}\n </LoginBox>\n {banner ? <BannerWarning>\n {banner}\n </BannerWarning> : null}\n </>\n )\n}\n","/* eslint-disable max-len */\nimport { Flex } from '@citric/core'\nimport { useEffectOnce } from '@stack-spot/portal-components'\nimport { CSSToCitricAdapter } from '@stack-spot/portal-theme'\nimport '@stack-spot/portal-theme/dist/theme.css'\nimport { useLanguage } from '@stack-spot/portal-translate'\nimport { useState } from 'react'\nimport { Login } from './Login'\nimport { SessionManager } from './SessionManager'\nimport { LoginProps } from './types'\n\ntype AuthStatus = 'unknown' | 'authenticated' | 'unauthenticated'\n\ninterface Props {\n children: React.ReactElement,\n onLogin?: () => void,\n onSession?: () => void,\n onChangeStatus?: (status: AuthStatus) => void,\n customLoginProps?: Omit<LoginProps, 'onSubmit' | 'initialValue'>,\n sessionManager?: SessionManager,\n}\n\nexport const Authenticated = ({ children, onLogin, onSession, customLoginProps, sessionManager, onChangeStatus }: Props) => {\n const [authStatus, setAuthStatus] = useState<AuthStatus>('unknown')\n const language = useLanguage()\n sessionManager ??= SessionManager.instance\n if (!sessionManager) throw new Error('Please, provide a sessionManager')\n\n useEffectOnce(() => {\n async function checkAuth() {\n if (!sessionManager) throw new Error('Please, provide a sessionManager')\n await sessionManager.restoreSession()\n if (sessionManager.urlHasThirdPartyLoginData()) {\n await sessionManager.completeThirdPartyLogin()\n onLogin?.()\n }\n if (sessionManager.hasSession()) {\n setAuthStatus('authenticated')\n onSession?.()\n onChangeStatus?.('authenticated')\n } else {\n setAuthStatus('unauthenticated')\n onChangeStatus?.('unauthenticated')\n }\n }\n\n checkAuth()\n })\n\n if (authStatus === 'unknown') return null\n if (authStatus === 'authenticated') return children\n\n return (\n <CSSToCitricAdapter>\n <Flex justifyContent=\"center\" alignItems=\"center\" flex={1} style={{ height: '100%' }}>\n <Login\n style={{ width: '360px' }}\n onSubmit={data => sessionManager.startThirdPartyLogin({ ...data, locale: language })}\n initialValue={sessionManager.getEmailForLogin()}\n {...(customLoginProps || {})}\n />\n </Flex>\n </CSSToCitricAdapter>\n )\n}\n"],"names":["sessionKey","__spreadProps","__spreadValues","error"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stack-spot/auth-react",
3
- "version": "2.9.2",
3
+ "version": "2.10.0",
4
4
  "main": "out/index.js",
5
5
  "module": "out/index.mjs",
6
6
  "typings": "out/index.d.ts",
@@ -29,7 +29,7 @@
29
29
  "@citric/core": "^6.4.0",
30
30
  "@citric/icons": "^5.10.0",
31
31
  "@citric/ui": "^6.7.0",
32
- "@stack-spot/auth": "^5.6.2",
32
+ "@stack-spot/auth": "5.9.0",
33
33
  "@stack-spot/portal-theme": "^1.0.0",
34
34
  "@stack-spot/portal-components": "^2.10.2",
35
35
  "@stack-spot/portal-translate": "^1.1.0",
package/src/IDPLogin.tsx CHANGED
@@ -1,4 +1,5 @@
1
- import { Box, Button, Flex, Text } from '@citric/core'
1
+ import { Box, Button, Flex, IconBox, Text } from '@citric/core'
2
+ import { ExclamationTriangle } from '@citric/icons'
2
3
  import { LoadingCircular } from '@citric/ui'
3
4
  import { interpolate } from '@stack-spot/portal-translate'
4
5
  import { capitalize } from 'lodash'
@@ -53,10 +54,33 @@ const ButtonProvider = ({ provider, login, loading, disabled }: ButtonProviderPr
53
54
  )
54
55
  }
55
56
 
57
+ function hasTouchSupport() {
58
+ return 'ontouchstart' in window || navigator.maxTouchPoints > 0;
59
+ }
60
+
61
+ function isMobileUserAgent() {
62
+ return /Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
63
+ }
64
+
65
+ function isMobileWithDesktopView() {
66
+ return !isMobileUserAgent() && hasTouchSupport();
67
+ }
68
+
56
69
  export const IDPLogin = ({ trialProviders, loading, loginProvider, onSubmit, onChangeMode }: Props) => {
57
70
  const t = useTranslation()
71
+ const showErrorMessage = isMobileWithDesktopView()
72
+
58
73
  return (
59
74
  <>
75
+ {showErrorMessage && <Flex bg="warning" p={4} role="alert" flexWrap='nowrap'>
76
+ <IconBox colorIcon="warning.contrastText">
77
+ <ExclamationTriangle />
78
+ </IconBox>
79
+ <Text appearance='body2' ml={2} colorScheme="warning.contrastText">
80
+ {t.errorMobileDesktop}
81
+ </Text>
82
+ </Flex>}
83
+
60
84
  <Flex flexDirection='column' gap>
61
85
  {trialProviders?.map((provider) => <ButtonProvider
62
86
  provider={provider}
@@ -1,10 +1,10 @@
1
- import { AccessTokenPayload, AuthConfig, AuthManager, Session, ThirdPartyAuthType, ThirdPartyLoginParams } from '@stack-spot/auth'
1
+ import { AccessTokenPayload, AuthConfig, AuthManager, Logger, Session, ThirdPartyAuthType, ThirdPartyLoginParams } from '@stack-spot/auth'
2
2
  import { sessionCookie } from './utils/cookies'
3
3
  import { redirect } from './utils/redirect'
4
4
 
5
5
  const sessionKey = 'session'
6
6
 
7
- interface SessionManagerConfig extends Pick<AuthConfig, 'accountUrl' | 'authUrl' | 'clientId' | 'defaultTenant' | 'retry' | 'retryDelay'> {
7
+ interface SessionManagerConfig extends Pick<AuthConfig, 'accountUrl' | 'authUrl' | 'clientId' | 'defaultTenant' | 'retry' | 'retryDelay' | 'logger'> {
8
8
  /**
9
9
  * The URL to redirect to when the user logs out.
10
10
  * @default location.origin
@@ -41,6 +41,7 @@ export class SessionManager {
41
41
  private readonly auth: AuthManager<AuthExtraData>
42
42
  private config: SessionManagerConfig
43
43
  private changeListeners: ChangeListener[] = []
44
+ private logger: Logger
44
45
  static instance: SessionManager | undefined
45
46
 
46
47
  private constructor(config: SessionManagerConfig) {
@@ -56,6 +57,7 @@ export class SessionManager {
56
57
  save: (session) => localStorage.setItem(sessionKey, session),
57
58
  },
58
59
  })
60
+ this.logger = this.auth.config.logger
59
61
  SessionManager.instance = this
60
62
 
61
63
  // Keep session in sync with other app's session
@@ -74,6 +76,7 @@ export class SessionManager {
74
76
 
75
77
  async restoreSession() {
76
78
  const session = await this.auth.restoreSession()
79
+ this.logger.log('Validating shared session.')
77
80
  const sessionValid = await this.validateSharedSession(session)
78
81
  this.setSession(sessionValid ? session : undefined)
79
82
  }
@@ -81,20 +84,31 @@ export class SessionManager {
81
84
  async validateSharedSession(session: Session | undefined = this.current): Promise<boolean> {
82
85
 
83
86
  // skipping because authentication is in progress
84
- if (this.urlHasThirdPartyLoginData()) return false
87
+ if (this.urlHasThirdPartyLoginData()) {
88
+ this.logger.log('Session is invalid because there\'s another authentication in progress.')
89
+ return false
90
+ }
85
91
 
86
92
  const sharedSessionCookie = sessionCookie.get()
87
93
 
88
94
  // It has been logged out on another portal, so logout on this one too
89
95
  if (!sharedSessionCookie) {
96
+ this.logger.log('Session is invalid because no shared session cookie was found, i.e, a logout was performed in another portal. Forcing log off.')
90
97
  session && await this.logout()
91
98
  return false
92
99
  }
93
100
 
94
101
  const isDifferentSessionActive = sharedSessionCookie.sub != session?.getTokenData().sub
95
102
  const isSharedSessionTypeBlocked = this.config.blockedAuthTypes?.includes(sharedSessionCookie.type)
96
- if (isSharedSessionTypeBlocked) return false
97
- else if (isDifferentSessionActive || !session) {
103
+ if (isSharedSessionTypeBlocked) {
104
+ this.logger.log('Session is invalid because shared sessions have been blocked in the SessionManager\'s configuration (blockedAuthTypes).')
105
+ return false
106
+ } else if (isDifferentSessionActive || !session) {
107
+ this.logger.log(isDifferentSessionActive
108
+ ? 'Session is invalid because a different session is already active.'
109
+ : 'Session is invalid because it\'s undefined.'
110
+ )
111
+ this.logger.log('Starting login with tenant from the session cookie.')
98
112
  await this.startThirdPartyLoginUsingTenant(sharedSessionCookie)
99
113
  return false
100
114
  }
@@ -156,6 +170,7 @@ export class SessionManager {
156
170
  const params = new URLSearchParams(location.search)
157
171
  const cookie = sessionCookie.get()
158
172
  if (!cookie || !cookie.tenant) {
173
+ this.logger.log('Login out because no tenant information is available in the following data:', JSON.stringify(data))
159
174
  //If no tenant is available we should log out the user
160
175
  await this.logout()
161
176
  return
@@ -186,7 +201,13 @@ export class SessionManager {
186
201
  }
187
202
 
188
203
  async switchAccount(accountId: string) {
189
- this.current && await this.auth.switchAccount(accountId, this.current)
204
+ this.logger.log('Switching accounts', accountId, this.current?.getTokenData().account_id_v2)
205
+ try {
206
+ this.current && await this.auth.switchAccount(accountId, this.current)
207
+ } catch (error) {
208
+ this.logger.error('Error while switching accounts', error)
209
+ throw error
210
+ }
190
211
  this.setSession(this.current)
191
212
  }
192
213
 
package/src/dictionary.ts CHANGED
@@ -19,6 +19,7 @@ const dictionary = {
19
19
  corporateLoginButton: 'Enter Enterprise account',
20
20
  socialLoginTitle: 'Do you want to access another way?',
21
21
  emailNotFoundError: 'We couldn\'t find an account for this email.',
22
+ errorMobileDesktop: "It looks like you are using a mobile device in desktop mode. We recommend adjusting this setting before continuing for a complete experience."
22
23
  },
23
24
  pt: {
24
25
  welcome: 'Boas vindas à StackSpot AI',
@@ -38,6 +39,7 @@ const dictionary = {
38
39
  corporateLoginButton: 'Entrar na conta Enterprise',
39
40
  socialLoginTitle: 'Você quer entrar de outro jeito?',
40
41
  emailNotFoundError: 'Não encontramos uma conta para este e-mail.',
42
+ errorMobileDesktop: "Parece que você está utilizando um dispositivo móvel na versão desktop. Recomendamos ajustar essa configuração antes de continuar para uma experiência completa."
41
43
  },
42
44
  } satisfies Dictionary
43
45
 
package/src/index.ts CHANGED
@@ -2,3 +2,4 @@ export { Authenticated } from './Authenticated'
2
2
  export { useSession } from './hooks'
3
3
  export { Login } from './Login'
4
4
  export { SessionManager } from './SessionManager'
5
+