@cirrobio/react-auth 0.0.1 → 0.0.3

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/README.md CHANGED
@@ -1,44 +1,44 @@
1
- # @cirrobio/react-auth
2
- [![React-Auth](https://img.shields.io/npm/v/@cirrobio/react-auth?color=blue&label=@cirrobio/react-auth)](https://www.npmjs.com/package/@cirrobio/react-auth)
3
-
4
- React-based authentication components and context providers for Cirro-based applications.
5
-
6
-
7
- ## Exports
8
-
9
- ### Providers
10
-
11
- - `AuthenticationContextProvider`
12
-
13
- Provides authentication state and user info to the React component tree.
14
-
15
- ### Hooks
16
-
17
- - `useAuthenticator`
18
-
19
- Custom React hook to access authentication state, user info, and sign-out functionality.
20
-
21
- ### Components
22
-
23
- - `LoginModal`
24
-
25
- Modal dialog for user login (wraps the `LoginOptions` component).
26
-
27
- - `LoginOptions`
28
-
29
- UI for selecting login methods.
30
-
31
- - `LoginWrapper`
32
-
33
- Wrapper component to check authentication state and render children accordingly.
34
- If not authenticated, it displays the `LoginModal`.
35
-
36
- ## Auth Providers
37
-
38
- - `AmplifyAuthProvider`
39
-
40
- Handles user authentication using the AWS Amplify library.
41
-
42
- - `StaticInteractiveAuthTokenProvider`
43
-
44
- Static token-based authentication provider for testing or service accounts.
1
+ # @cirrobio/react-auth
2
+ [![React-Auth](https://img.shields.io/npm/v/@cirrobio/react-auth?color=blue&label=@cirrobio/react-auth)](https://www.npmjs.com/package/@cirrobio/react-auth)
3
+
4
+ React-based authentication components and context providers for Cirro-based applications.
5
+
6
+
7
+ ## Exports
8
+
9
+ ### Providers
10
+
11
+ - `AuthenticationContextProvider`
12
+
13
+ Provides authentication state and user info to the React component tree.
14
+
15
+ ### Hooks
16
+
17
+ - `useAuthenticator`
18
+
19
+ Custom React hook to access authentication state, user info, and sign-out functionality.
20
+
21
+ ### Components
22
+
23
+ - `LoginModal`
24
+
25
+ Modal dialog for user login (wraps the `LoginOptions` component).
26
+
27
+ - `LoginOptions`
28
+
29
+ UI for selecting login methods.
30
+
31
+ - `LoginWrapper`
32
+
33
+ Wrapper component to check authentication state and render children accordingly.
34
+ If not authenticated, it displays the `LoginModal`.
35
+
36
+ ## Auth Providers
37
+
38
+ - `AmplifyAuthProvider`
39
+
40
+ Handles user authentication using the AWS Amplify library.
41
+
42
+ - `StaticInteractiveAuthTokenProvider`
43
+
44
+ Static token-based authentication provider for testing or service accounts.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/amplify/configure-amplify.ts","../src/amplify/magic-link.ts","../src/amplify/auth-listener.ts","../src/amplify/amplify-auth-provider.tsx","../src/components/LoginOptions.tsx","../src/components/LoginModal.tsx","../src/auth-context/authentication-context.tsx","../src/auth-context/useAuthenticator.tsx","../src/components/LoginWrapper.tsx","../src/auth-context/authentication-context-provider.tsx","../src/static/static-token-provider.ts"],"sourcesContent":["import { Amplify } from \"aws-amplify\";\nimport { AppConfig } from \"@cirrobio/react-core\";\n\nexport function configureAmplify(config: AppConfig, clientIdOverride?: string): void {\n Amplify.configure({\n Auth: {\n Cognito: {\n userPoolId: config.auth.userPoolId,\n userPoolClientId: clientIdOverride ?? config.auth.uiAppId,\n loginWith: {\n oauth: {\n domain: config.auth.endpoint,\n scopes: [\n 'phone',\n 'email',\n 'profile',\n 'openid',\n 'aws.cognito.signin.user.admin'\n ],\n redirectSignIn: [window.location.origin],\n redirectSignOut: [window.location.origin],\n responseType: 'code',\n },\n },\n },\n },\n API: {\n GraphQL: {\n endpoint: config.liveEndpoint,\n region: config.region,\n defaultAuthMode: 'userPool',\n },\n },\n });\n}\n","import { confirmSignIn, signIn } from 'aws-amplify/auth';\nimport { IRedeemSignInLink, ISignInLinkRequest } from \"@cirrobio/react-core\";\n\nexport const COGNITO_PROVIDER_ID = 'COGNITO';\nexport const LOGIN_SENT_SUCCESS_MSG = 'Check your email for the login link. If you don’t have an account, the link won’t be sent.';\n\nexport async function requestSignInLink({ username, redirectUri }: ISignInLinkRequest): Promise<void> {\n const redirectUriToUse = redirectUri || window.location.origin + \"/magic-link\";\n try {\n const { nextStep } = await signIn({\n username,\n password: null,\n options: {\n authFlowType: \"CUSTOM_WITHOUT_SRP\",\n },\n });\n if (nextStep.signInStep !== 'CONFIRM_SIGN_IN_WITH_CUSTOM_CHALLENGE') {\n return;\n }\n\n const clientMetadata = {\n signInMethod: \"MAGIC_LINK\",\n redirectUri: redirectUriToUse,\n hasMagicLink: \"no\",\n }\n await confirmSignIn({\n challengeResponse: \"cirro-is-awesome\",\n options: {\n clientMetadata,\n },\n });\n } catch (e) {\n // Cleanup the error message\n const errorMessage = e.toString();\n if (errorMessage.includes('UserLambdaValidationException')) {\n throw Error(errorMessage.split('failed with error')[1]);\n } else if (errorMessage.includes('Incorrect username or password')) {\n throw Error('Incorrect username or password.');\n }\n throw Error(errorMessage);\n }\n}\n\nexport async function redeemSignInLink({ username, challenge }: IRedeemSignInLink): Promise<void> {\n await signIn({\n username: username,\n password: null,\n options: {\n authFlowType: \"CUSTOM_WITHOUT_SRP\",\n },\n });\n const clientMetadata = {\n signInMethod: \"MAGIC_LINK\",\n hasMagicLink: \"yes\",\n }\n await confirmSignIn({\n challengeResponse: challenge,\n options: {\n clientMetadata,\n },\n });\n}\n","import { AuthHubEventData } from \"@aws-amplify/core/src/Hub/types/AuthTypes\";\nimport { AuthEventHandlerOptions } from \"@cirrobio/react-core\";\n\nexport const amplifyAuthEventHandler = ({ payload }, options: AuthEventHandlerOptions): void => {\n const { event }: AuthHubEventData = payload;\n const { onSignIn, onSignOut } = options ?? {};\n switch (event) {\n case 'signedIn': {\n console.log('user has signed in successfully');\n onSignIn();\n break;\n }\n case 'signedOut':\n case 'tokenRefresh_failure': {\n onSignOut();\n break;\n }\n default: {\n console.info(event);\n break;\n }\n }\n};\n","import { LoginProvider } from \"@cirrobio/api-client\";\nimport { configureAmplify } from \"./configure-amplify\";\nimport { fetchAuthSession } from \"@aws-amplify/auth\";\nimport {\n AppConfig,\n InteractiveAuthenticationProvider,\n IRedeemSignInLink,\n ISignInLinkRequest,\n AuthEventHandlerOptions\n} from \"@cirrobio/react-core\";\nimport { signInWithRedirect } from \"aws-amplify/auth\";\nimport { redeemSignInLink, requestSignInLink } from \"./magic-link\";\nimport { Hub } from \"aws-amplify/utils\";\nimport { amplifyAuthEventHandler } from \"./auth-listener\";\nimport { CurrentUser } from \"@cirrobio/sdk\";\nimport { signOut as amplifySignOut } from 'aws-amplify/auth';\n\nexport class AmplifyAuthProvider implements InteractiveAuthenticationProvider {\n private loginProviders: LoginProvider[];\n\n constructor(\n readonly clientId?: string\n ) {\n }\n\n public getLoginProviders() {\n return this.loginProviders;\n }\n\n public configure(config: AppConfig): void {\n configureAmplify(config, this.clientId);\n this.loginProviders = config.tenantInfo.loginProviders;\n console.log('AmplifyAuthProvider loaded with config');\n }\n\n public async getAccessToken(): Promise<string> {\n const session = await fetchAuthSession();\n return session.tokens.accessToken.toString();\n }\n\n public async getCurrentUser(): Promise<CurrentUser> {\n const session = await fetchAuthSession();\n const idToken = session.tokens.idToken.payload;\n return CurrentUser.fromCognitoUser(idToken);\n }\n\n public async forceRefresh(): Promise<void> {\n await fetchAuthSession({ forceRefresh: true });\n }\n\n public async loginSSO(loginProvider: string): Promise<void> {\n await signInWithRedirect({ provider: { custom: loginProvider } })\n }\n\n public async loginEmail(request: ISignInLinkRequest): Promise<void> {\n await requestSignInLink(request);\n }\n\n public async finishLoginEmail(request: IRedeemSignInLink): Promise<void> {\n await redeemSignInLink(request);\n }\n\n public async signOut(): Promise<void> {\n await amplifySignOut();\n }\n\n public registerAuthEventHandler(options: AuthEventHandlerOptions): () => void {\n return Hub.listen('auth', (data) => amplifyAuthEventHandler(data, options), 'authentication-provider');\n }\n}\n","import React, { Children, ReactElement, useMemo, useState } from 'react';\nimport { Button, Divider, Stack, TextField } from '@mui/material';\nimport { LoginProvider } from '@cirrobio/api-client';\nimport { LoadingButton } from '@mui/lab';\nimport { COGNITO_PROVIDER_ID } from \"../amplify/magic-link\";\n\ninterface IProps {\n loginProviders: LoginProvider[];\n onSelect: (providerId: string, email?: string) => void;\n busy: boolean;\n success: boolean;\n}\n\n\nexport function LoginOptions({ loginProviders, onSelect, busy, success }: Readonly<IProps>): ReactElement {\n const [email, setEmail] = useState('');\n\n const ssoProviders = useMemo(() =>\n loginProviders.filter(p => p.id !== COGNITO_PROVIDER_ID), [loginProviders]);\n const cognitoEnabled = useMemo(() =>\n loginProviders.some(p => p.id === COGNITO_PROVIDER_ID), [loginProviders]);\n\n return (\n <Stack alignItems=\"center\" gap={3} direction=\"column\" sx={{ pt: 2 }}>\n {Children.toArray(ssoProviders.map(provider => {\n return (<Button\n sx={{ p: 2, width: '100%' }}\n variant=\"contained\"\n color=\"secondary\"\n fullWidth={true}\n startIcon={<img style={{ maxHeight: '17px' }} alt={provider.name} src={provider.logoUrl} />}\n onClick={() => onSelect(provider.id)}\n >{provider.name}</Button>)\n }))}\n {cognitoEnabled && (\n <form style={{ width: '100%' }}>\n <Stack alignItems=\"center\" gap={3} direction=\"column\">\n {ssoProviders.length > 0 && (<Divider textAlign=\"center\" color=\"secondary\" flexItem>OR</Divider>)}\n <TextField\n label=\"Email\"\n size=\"medium\"\n value={email}\n variant=\"outlined\"\n autoComplete=\"off\"\n type=\"email\"\n fullWidth={true}\n required\n onChange={(e) => setEmail(e.target.value)}\n />\n <LoadingButton\n type=\"submit\"\n sx={{ p: 2, width: '100%' }}\n loading={busy}\n disabled={!email?.trim() || success}\n variant=\"contained\"\n color=\"secondary\"\n fullWidth={true}\n onClick={() => onSelect(COGNITO_PROVIDER_ID, email)}\n >\n Sign in with email\n </LoadingButton>\n </Stack>\n </form>\n )}\n </Stack>\n )\n}\n","import { Alert, Dialog, IconButton, Stack, Typography } from '@mui/material';\nimport React, { ReactElement, useCallback, useEffect, useMemo, useState } from 'react';\nimport { LoginOptions } from './LoginOptions';\nimport { LoginProvider } from '@cirrobio/api-client';\nimport { handlePromiseError } from \"@cirrobio/sdk\";\nimport { useAppConfig } from \"@cirrobio/react-core\";\nimport { CloseOutlined } from '@mui/icons-material';\nimport { COGNITO_PROVIDER_ID, LOGIN_SENT_SUCCESS_MSG } from \"../amplify/magic-link\";\n\ninterface IProps {\n onClose: () => void;\n open: boolean;\n}\n\nfunction getLoginMessage(loginProviders: LoginProvider[]): string {\n const loginMessage = 'Sign in using one of the options below.';\n const cognitoEnabled = loginProviders.some(p => p.id === COGNITO_PROVIDER_ID);\n const onlyCognito = loginProviders.length === 1 && cognitoEnabled;\n // Only email sign in is enabled.\n if (onlyCognito) {\n return `Sign in with your email below.`;\n }\n // Both SSO and email sign in is enabled\n if (!onlyCognito && cognitoEnabled) {\n return `${loginMessage} If your sign in method isn't listed, please enter your email.`;\n }\n // Only SSO sign in is enabled\n return loginMessage;\n}\n\nexport function LoginModal({ onClose, open }: Readonly<IProps>): ReactElement {\n const { authProvider } = useAppConfig();\n const loginProviders = authProvider.getLoginProviders();\n const loginDescription = useMemo(() => getLoginMessage(loginProviders), [loginProviders]);\n\n const [error, setError] = useState('');\n const [message, setMessage] = useState('');\n const [busy, setBusy] = useState(false);\n\n const handleLogin = useCallback(async (providerId: string, email?: string): Promise<void> => {\n setError('');\n setMessage('');\n setBusy(true);\n if (providerId === COGNITO_PROVIDER_ID) {\n try {\n await authProvider.loginEmail({ username: email });\n setBusy(false);\n setMessage(LOGIN_SENT_SUCCESS_MSG);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'An error occurred');\n setBusy(false);\n }\n } else {\n authProvider.loginSSO(providerId).catch(handlePromiseError);\n if (onClose) onClose();\n }\n }, [onClose]);\n\n useEffect(() => {\n // Log in automatically if there is only one provider (and it's not Cognito)\n const firstProviderId = loginProviders.at(0)?.id;\n if (loginProviders.length === 1 && firstProviderId !== COGNITO_PROVIDER_ID) {\n void handleLogin(firstProviderId);\n }\n }, [loginProviders, handleLogin]);\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n PaperProps={{ sx: { p: 3, background: \"#FFF\", width: '480px' } }}\n \n aria-label=\"login dialog\"\n >\n <Stack alignItems=\"left\" justifyContent=\"space-between\" gap={1} direction={{ xs: 'row' }}>\n <Stack direction=\"column\">\n <Typography id=\"dialog-title\" variant=\"h4\" color=\"secondary\">\n Login\n </Typography>\n <Typography variant=\"body2\">\n {loginDescription}\n </Typography>\n </Stack>\n {!!onClose &&\n <Stack alignItems=\"right\" direction=\"row\" gap={0}>\n <IconButton\n aria-label=\"Close\"\n onClick={() => onClose()}\n size=\"small\"\n color=\"secondary\"\n sx={{ transform: 'translate(10px, 0px)' }}>\n <CloseOutlined sx={{ fontSize: '22px' }} />\n </IconButton>\n </Stack>\n }\n </Stack>\n <Stack sx={{ pt: 0 }}>\n <LoginOptions loginProviders={loginProviders} onSelect={handleLogin} busy={busy} success={!!message} />\n {error && (\n <Alert severity=\"error\" sx={{ mt: 4 }}>{error}</Alert>\n )}\n {message && (\n <Alert severity=\"success\" sx={{ mt: 4 }}>{message}</Alert>\n )}\n </Stack>\n </Dialog>\n );\n}\n\n","import { createContext } from 'react';\nimport { AuthStatus } from \"../models/auth-status\";\nimport { UserDetail } from \"@cirrobio/api-client\";\nimport { CurrentUser } from \"@cirrobio/sdk\";\n\n\n\nexport type AuthenticatorContextType = {\n authStatus: AuthStatus;\n authInfo: CurrentUser | null;\n userInfo: UserDetail;\n refresh: () => void;\n}\n\nexport const AuthenticatorContext = createContext<AuthenticatorContextType>(null);\n","import { useCallback, useContext } from 'react';\nimport { AuthenticatorContext, AuthenticatorContextType } from './authentication-context';\nimport { useAppConfig } from \"@cirrobio/react-core\";\n\ntype UseAuthenticator = AuthenticatorContextType & {\n isLoggedIn: boolean;\n signOut: () => void;\n};\n\n/**\n * Custom hook to access authentication context\n */\nexport function useAuthenticator(): UseAuthenticator {\n const context = useContext(AuthenticatorContext);\n const { authProvider } = useAppConfig();\n\n const signOut = useCallback(() => {\n sessionStorage.clear();\n authProvider.signOut().then(() => {\n // Location reload clears any in-memory state\n // Amplify does a hard reload automatically, but only if you are signing in from oauth / SSO\n location.reload();\n });\n }, [authProvider]);\n\n return {\n ...context,\n isLoggedIn: context?.authStatus === 'authenticated',\n signOut,\n }\n}\n","import React from \"react\";\nimport { useAuthenticator } from \"../auth-context/useAuthenticator\";\nimport { LoginModal } from \"./LoginModal\";\n\ninterface IProps {\n children?: React.ReactNode;\n}\n\n/**\n * LoginWrapper component is used to conditionally render children based on the authentication status\n * or display a login modal if the user is unauthenticated.\n */\nexport function LoginWrapper({ children }: IProps) {\n const { authStatus } = useAuthenticator();\n\n if (!authStatus || authStatus === 'configuring') {\n return null;\n }\n\n if (authStatus === 'unauthenticated') {\n return <LoginModal onClose={null} open={true} />\n }\n\n return children;\n}\n","import * as React from \"react\";\nimport { ReactElement, useCallback, useEffect, useMemo, useState } from \"react\";\nimport { AuthenticatorContext, AuthenticatorContextType } from './authentication-context';\nimport { AuthStatus } from \"../models/auth-status\";\nimport { UserDetail } from \"@cirrobio/api-client\";\nimport { useAppConfig } from \"@cirrobio/react-core\";\nimport { CurrentUser } from \"@cirrobio/sdk\";\n\nexport type AuthenticationProviderProps = {\n children: React.ReactNode;\n fetchUserInfo?: boolean;\n}\n\n/**\n * Manages the authentication state of the application.\n * @param children - The child components to render within the provider.\n * @param fetchUserInfo - If true, fetches detailed user information after authentication.\n */\nexport function AuthenticationContextProvider({ children, fetchUserInfo }: AuthenticationProviderProps): ReactElement {\n const [authStatus, setAuthStatus] = useState<AuthStatus>('configuring');\n const [authInfo, setAuthInfo] = useState<CurrentUser>(null);\n const [userInfo, setUserInfo] = useState<UserDetail>(null);\n const { dataService, authProvider } = useAppConfig();\n\n const refresh = useCallback((): void => {\n authProvider.getCurrentUser()\n .then((currentUser) => {\n setAuthStatus('authenticated');\n setAuthInfo(currentUser);\n if (fetchUserInfo) {\n dataService.users.getUser({ username: currentUser.username })\n .then((data) => setUserInfo(data))\n .catch((error) => {\n console.error('Failed to fetch user info:', error);\n setUserInfo(null);\n });\n }\n })\n .catch(() => {\n setAuthStatus('unauthenticated');\n });\n }, []);\n\n const value: AuthenticatorContextType = useMemo(\n () => ({ authStatus, authInfo, refresh, userInfo }),\n [authStatus, authInfo, userInfo, refresh]\n );\n\n // Refresh auth state on page load\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n // Refresh auth state in response to auth events\n useEffect(() => {\n const options = { onSignIn: refresh, onSignOut: refresh };\n return authProvider.registerAuthEventHandler(options);\n }, [refresh]);\n\n return (\n <AuthenticatorContext.Provider value={value}>\n {children}\n </AuthenticatorContext.Provider>\n );\n}\n","import { StaticTokenAuthProvider } from \"@cirrobio/sdk\";\nimport { InteractiveAuthenticationProvider } from \"@cirrobio/react-core\";\n\n\n/**\n * StaticInteractiveAuthTokenProvider is a simple implementation of the InteractiveAuthenticationProvider\n * that uses a static token for authentication. This is useful for testing or when you have a known token.\n */\nexport class StaticInteractiveAuthTokenProvider\n extends StaticTokenAuthProvider\n implements InteractiveAuthenticationProvider {\n\n constructor(token: string) {\n super(token);\n }\n\n async getAccessToken(): Promise<string> {\n return this.token;\n }\n\n loginSSO(): Promise<void> {\n return Promise.resolve();\n }\n\n loginEmail(_): Promise<void> {\n return Promise.resolve();\n }\n\n finishLoginEmail(_): Promise<void> {\n return Promise.resolve();\n }\n\n signOut(): Promise<void> {\n return Promise.resolve();\n }\n\n getLoginProviders() {\n return [];\n }\n\n registerAuthEventHandler(_): void {\n // No-op for static token provider\n }\n}\n"],"names":["amplifySignOut","React"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/amplify/configure-amplify.ts","../src/amplify/magic-link.ts","../src/amplify/auth-listener.ts","../src/amplify/amplify-auth-provider.tsx","../src/components/LoginOptions.tsx","../src/components/LoginModal.tsx","../src/auth-context/authentication-context.tsx","../src/auth-context/useAuthenticator.tsx","../src/components/LoginWrapper.tsx","../src/auth-context/authentication-context-provider.tsx","../src/static/static-token-provider.ts"],"sourcesContent":["import { Amplify } from \"aws-amplify\";\r\nimport { AppConfig } from \"@cirrobio/react-core\";\r\n\r\nexport function configureAmplify(config: AppConfig, clientIdOverride?: string): void {\r\n Amplify.configure({\r\n Auth: {\r\n Cognito: {\r\n userPoolId: config.auth.userPoolId,\r\n userPoolClientId: clientIdOverride ?? config.auth.uiAppId,\r\n loginWith: {\r\n oauth: {\r\n domain: config.auth.endpoint,\r\n scopes: [\r\n 'phone',\r\n 'email',\r\n 'profile',\r\n 'openid',\r\n 'aws.cognito.signin.user.admin'\r\n ],\r\n redirectSignIn: [window.location.origin],\r\n redirectSignOut: [window.location.origin],\r\n responseType: 'code',\r\n },\r\n },\r\n },\r\n },\r\n API: {\r\n GraphQL: {\r\n endpoint: config.liveEndpoint,\r\n region: config.region,\r\n defaultAuthMode: 'userPool',\r\n },\r\n },\r\n });\r\n}\r\n","import { confirmSignIn, signIn } from 'aws-amplify/auth';\r\nimport { IRedeemSignInLink, ISignInLinkRequest } from \"@cirrobio/react-core\";\r\n\r\nexport const COGNITO_PROVIDER_ID = 'COGNITO';\r\nexport const LOGIN_SENT_SUCCESS_MSG = 'Check your email for the login link. If you don’t have an account, the link won’t be sent.';\r\n\r\nexport async function requestSignInLink({ username, redirectUri }: ISignInLinkRequest): Promise<void> {\r\n const redirectUriToUse = redirectUri || window.location.origin + \"/magic-link\";\r\n try {\r\n const { nextStep } = await signIn({\r\n username,\r\n password: null,\r\n options: {\r\n authFlowType: \"CUSTOM_WITHOUT_SRP\",\r\n },\r\n });\r\n if (nextStep.signInStep !== 'CONFIRM_SIGN_IN_WITH_CUSTOM_CHALLENGE') {\r\n return;\r\n }\r\n\r\n const clientMetadata = {\r\n signInMethod: \"MAGIC_LINK\",\r\n redirectUri: redirectUriToUse,\r\n hasMagicLink: \"no\",\r\n }\r\n await confirmSignIn({\r\n challengeResponse: \"cirro-is-awesome\",\r\n options: {\r\n clientMetadata,\r\n },\r\n });\r\n } catch (e) {\r\n // Cleanup the error message\r\n const errorMessage = e.toString();\r\n if (errorMessage.includes('UserLambdaValidationException')) {\r\n throw Error(errorMessage.split('failed with error')[1]);\r\n } else if (errorMessage.includes('Incorrect username or password')) {\r\n throw Error('Incorrect username or password.');\r\n }\r\n throw Error(errorMessage);\r\n }\r\n}\r\n\r\nexport async function redeemSignInLink({ username, challenge }: IRedeemSignInLink): Promise<void> {\r\n await signIn({\r\n username: username,\r\n password: null,\r\n options: {\r\n authFlowType: \"CUSTOM_WITHOUT_SRP\",\r\n },\r\n });\r\n const clientMetadata = {\r\n signInMethod: \"MAGIC_LINK\",\r\n hasMagicLink: \"yes\",\r\n }\r\n await confirmSignIn({\r\n challengeResponse: challenge,\r\n options: {\r\n clientMetadata,\r\n },\r\n });\r\n}\r\n","import { AuthHubEventData } from \"@aws-amplify/core/src/Hub/types/AuthTypes\";\r\nimport { AuthEventHandlerOptions } from \"@cirrobio/react-core\";\r\n\r\nexport const amplifyAuthEventHandler = ({ payload }, options: AuthEventHandlerOptions): void => {\r\n const { event }: AuthHubEventData = payload;\r\n const { onSignIn, onSignOut } = options ?? {};\r\n switch (event) {\r\n case 'signedIn': {\r\n console.log('user has signed in successfully');\r\n onSignIn();\r\n break;\r\n }\r\n case 'signedOut':\r\n case 'tokenRefresh_failure': {\r\n onSignOut();\r\n break;\r\n }\r\n default: {\r\n console.info(event);\r\n break;\r\n }\r\n }\r\n};\r\n","import { LoginProvider } from \"@cirrobio/api-client\";\r\nimport { configureAmplify } from \"./configure-amplify\";\r\nimport { fetchAuthSession } from \"@aws-amplify/auth\";\r\nimport {\r\n AppConfig,\r\n InteractiveAuthenticationProvider,\r\n IRedeemSignInLink,\r\n ISignInLinkRequest,\r\n AuthEventHandlerOptions\r\n} from \"@cirrobio/react-core\";\r\nimport { signInWithRedirect } from \"aws-amplify/auth\";\r\nimport { redeemSignInLink, requestSignInLink } from \"./magic-link\";\r\nimport { Hub } from \"aws-amplify/utils\";\r\nimport { amplifyAuthEventHandler } from \"./auth-listener\";\r\nimport { CurrentUser } from \"@cirrobio/sdk\";\r\nimport { signOut as amplifySignOut } from 'aws-amplify/auth';\r\n\r\nexport class AmplifyAuthProvider implements InteractiveAuthenticationProvider {\r\n private loginProviders: LoginProvider[];\r\n\r\n constructor(\r\n readonly clientId?: string\r\n ) {\r\n }\r\n\r\n public getLoginProviders() {\r\n return this.loginProviders;\r\n }\r\n\r\n public configure(config: AppConfig): void {\r\n configureAmplify(config, this.clientId);\r\n this.loginProviders = config.tenantInfo.loginProviders;\r\n console.log('AmplifyAuthProvider loaded with config');\r\n }\r\n\r\n public async getAccessToken(): Promise<string> {\r\n const session = await fetchAuthSession();\r\n return session.tokens.accessToken.toString();\r\n }\r\n\r\n public async getCurrentUser(): Promise<CurrentUser> {\r\n const session = await fetchAuthSession();\r\n const idToken = session.tokens.idToken.payload;\r\n return CurrentUser.fromCognitoUser(idToken);\r\n }\r\n\r\n public async forceRefresh(): Promise<void> {\r\n await fetchAuthSession({ forceRefresh: true });\r\n }\r\n\r\n public async loginSSO(loginProvider: string): Promise<void> {\r\n await signInWithRedirect({ provider: { custom: loginProvider } })\r\n }\r\n\r\n public async loginEmail(request: ISignInLinkRequest): Promise<void> {\r\n await requestSignInLink(request);\r\n }\r\n\r\n public async finishLoginEmail(request: IRedeemSignInLink): Promise<void> {\r\n await redeemSignInLink(request);\r\n }\r\n\r\n public async signOut(): Promise<void> {\r\n await amplifySignOut();\r\n }\r\n\r\n public registerAuthEventHandler(options: AuthEventHandlerOptions): () => void {\r\n return Hub.listen('auth', (data) => amplifyAuthEventHandler(data, options), 'authentication-provider');\r\n }\r\n}\r\n","import React, { Children, ReactElement, useMemo, useState } from 'react';\r\nimport { Button, Divider, Stack, TextField } from '@mui/material';\r\nimport { LoginProvider } from '@cirrobio/api-client';\r\nimport { LoadingButton } from '@mui/lab';\r\nimport { COGNITO_PROVIDER_ID } from \"../amplify/magic-link\";\r\n\r\ninterface IProps {\r\n loginProviders: LoginProvider[];\r\n onSelect: (providerId: string, email?: string) => void;\r\n busy: boolean;\r\n success: boolean;\r\n}\r\n\r\n\r\nexport function LoginOptions({ loginProviders, onSelect, busy, success }: Readonly<IProps>): ReactElement {\r\n const [email, setEmail] = useState('');\r\n\r\n const ssoProviders = useMemo(() =>\r\n loginProviders.filter(p => p.id !== COGNITO_PROVIDER_ID), [loginProviders]);\r\n const cognitoEnabled = useMemo(() =>\r\n loginProviders.some(p => p.id === COGNITO_PROVIDER_ID), [loginProviders]);\r\n\r\n return (\r\n <Stack alignItems=\"center\" gap={3} direction=\"column\" sx={{ pt: 2 }}>\r\n {Children.toArray(ssoProviders.map(provider => {\r\n return (<Button\r\n sx={{ p: 2, width: '100%' }}\r\n variant=\"contained\"\r\n color=\"secondary\"\r\n fullWidth={true}\r\n startIcon={<img style={{ maxHeight: '17px' }} alt={provider.name} src={provider.logoUrl} />}\r\n onClick={() => onSelect(provider.id)}\r\n >{provider.name}</Button>)\r\n }))}\r\n {cognitoEnabled && (\r\n <form style={{ width: '100%' }}>\r\n <Stack alignItems=\"center\" gap={3} direction=\"column\">\r\n {ssoProviders.length > 0 && (<Divider textAlign=\"center\" color=\"secondary\" flexItem>OR</Divider>)}\r\n <TextField\r\n label=\"Email\"\r\n size=\"medium\"\r\n value={email}\r\n variant=\"outlined\"\r\n autoComplete=\"off\"\r\n type=\"email\"\r\n fullWidth={true}\r\n required\r\n onChange={(e) => setEmail(e.target.value)}\r\n />\r\n <LoadingButton\r\n type=\"submit\"\r\n sx={{ p: 2, width: '100%' }}\r\n loading={busy}\r\n disabled={!email?.trim() || success}\r\n variant=\"contained\"\r\n color=\"secondary\"\r\n fullWidth={true}\r\n onClick={() => onSelect(COGNITO_PROVIDER_ID, email)}\r\n >\r\n Sign in with email\r\n </LoadingButton>\r\n </Stack>\r\n </form>\r\n )}\r\n </Stack>\r\n )\r\n}\r\n","import { Alert, Dialog, IconButton, Stack, Typography } from '@mui/material';\r\nimport React, { ReactElement, useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { LoginOptions } from './LoginOptions';\r\nimport { LoginProvider } from '@cirrobio/api-client';\r\nimport { handlePromiseError } from \"@cirrobio/sdk\";\r\nimport { useAppConfig } from \"@cirrobio/react-core\";\r\nimport { CloseOutlined } from '@mui/icons-material';\r\nimport { COGNITO_PROVIDER_ID, LOGIN_SENT_SUCCESS_MSG } from \"../amplify/magic-link\";\r\n\r\ninterface IProps {\r\n onClose: () => void;\r\n open: boolean;\r\n}\r\n\r\nfunction getLoginMessage(loginProviders: LoginProvider[]): string {\r\n const loginMessage = 'Sign in using one of the options below.';\r\n const cognitoEnabled = loginProviders.some(p => p.id === COGNITO_PROVIDER_ID);\r\n const onlyCognito = loginProviders.length === 1 && cognitoEnabled;\r\n // Only email sign in is enabled.\r\n if (onlyCognito) {\r\n return `Sign in with your email below.`;\r\n }\r\n // Both SSO and email sign in is enabled\r\n if (!onlyCognito && cognitoEnabled) {\r\n return `${loginMessage} If your sign in method isn't listed, please enter your email.`;\r\n }\r\n // Only SSO sign in is enabled\r\n return loginMessage;\r\n}\r\n\r\nexport function LoginModal({ onClose, open }: Readonly<IProps>): ReactElement {\r\n const { authProvider } = useAppConfig();\r\n const loginProviders = authProvider.getLoginProviders();\r\n const loginDescription = useMemo(() => getLoginMessage(loginProviders), [loginProviders]);\r\n\r\n const [error, setError] = useState('');\r\n const [message, setMessage] = useState('');\r\n const [busy, setBusy] = useState(false);\r\n\r\n const handleLogin = useCallback(async (providerId: string, email?: string): Promise<void> => {\r\n setError('');\r\n setMessage('');\r\n setBusy(true);\r\n if (providerId === COGNITO_PROVIDER_ID) {\r\n try {\r\n await authProvider.loginEmail({ username: email });\r\n setBusy(false);\r\n setMessage(LOGIN_SENT_SUCCESS_MSG);\r\n } catch (e) {\r\n setError(e instanceof Error ? e.message : 'An error occurred');\r\n setBusy(false);\r\n }\r\n } else {\r\n authProvider.loginSSO(providerId).catch(handlePromiseError);\r\n if (onClose) onClose();\r\n }\r\n }, [onClose]);\r\n\r\n useEffect(() => {\r\n // Log in automatically if there is only one provider (and it's not Cognito)\r\n const firstProviderId = loginProviders.at(0)?.id;\r\n if (loginProviders.length === 1 && firstProviderId !== COGNITO_PROVIDER_ID) {\r\n void handleLogin(firstProviderId);\r\n }\r\n }, [loginProviders, handleLogin]);\r\n\r\n return (\r\n <Dialog\r\n open={open}\r\n onClose={onClose}\r\n PaperProps={{ sx: { p: 3, background: \"#FFF\", width: '480px' } }}\r\n \r\n aria-label=\"login dialog\"\r\n >\r\n <Stack alignItems=\"left\" justifyContent=\"space-between\" gap={1} direction={{ xs: 'row' }}>\r\n <Stack direction=\"column\">\r\n <Typography id=\"dialog-title\" variant=\"h4\" color=\"secondary\">\r\n Login\r\n </Typography>\r\n <Typography variant=\"body2\">\r\n {loginDescription}\r\n </Typography>\r\n </Stack>\r\n {!!onClose &&\r\n <Stack alignItems=\"right\" direction=\"row\" gap={0}>\r\n <IconButton\r\n aria-label=\"Close\"\r\n onClick={() => onClose()}\r\n size=\"small\"\r\n color=\"secondary\"\r\n sx={{ transform: 'translate(10px, 0px)' }}>\r\n <CloseOutlined sx={{ fontSize: '22px' }} />\r\n </IconButton>\r\n </Stack>\r\n }\r\n </Stack>\r\n <Stack sx={{ pt: 0 }}>\r\n <LoginOptions loginProviders={loginProviders} onSelect={handleLogin} busy={busy} success={!!message} />\r\n {error && (\r\n <Alert severity=\"error\" sx={{ mt: 4 }}>{error}</Alert>\r\n )}\r\n {message && (\r\n <Alert severity=\"success\" sx={{ mt: 4 }}>{message}</Alert>\r\n )}\r\n </Stack>\r\n </Dialog>\r\n );\r\n}\r\n\r\n","import { createContext } from 'react';\r\nimport { AuthStatus } from \"../models/auth-status\";\r\nimport { UserDetail } from \"@cirrobio/api-client\";\r\nimport { CurrentUser } from \"@cirrobio/sdk\";\r\n\r\n\r\n\r\nexport type AuthenticatorContextType = {\r\n authStatus: AuthStatus;\r\n authInfo: CurrentUser | null;\r\n userInfo: UserDetail;\r\n refresh: () => void;\r\n}\r\n\r\nexport const AuthenticatorContext = createContext<AuthenticatorContextType>(null);\r\n","import { useCallback, useContext } from 'react';\r\nimport { AuthenticatorContext, AuthenticatorContextType } from './authentication-context';\r\nimport { useAppConfig } from \"@cirrobio/react-core\";\r\n\r\ntype UseAuthenticator = AuthenticatorContextType & {\r\n isLoggedIn: boolean;\r\n signOut: () => void;\r\n};\r\n\r\n/**\r\n * Custom hook to access authentication context\r\n */\r\nexport function useAuthenticator(): UseAuthenticator {\r\n const context = useContext(AuthenticatorContext);\r\n const { authProvider } = useAppConfig();\r\n\r\n const signOut = useCallback(() => {\r\n sessionStorage.clear();\r\n authProvider.signOut().then(() => {\r\n // Location reload clears any in-memory state\r\n // Amplify does a hard reload automatically, but only if you are signing in from oauth / SSO\r\n location.reload();\r\n });\r\n }, [authProvider]);\r\n\r\n return {\r\n ...context,\r\n isLoggedIn: context?.authStatus === 'authenticated',\r\n signOut,\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { useAuthenticator } from \"../auth-context/useAuthenticator\";\r\nimport { LoginModal } from \"./LoginModal\";\r\n\r\ninterface IProps {\r\n children?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * LoginWrapper component is used to conditionally render children based on the authentication status\r\n * or display a login modal if the user is unauthenticated.\r\n */\r\nexport function LoginWrapper({ children }: IProps) {\r\n const { authStatus } = useAuthenticator();\r\n\r\n if (!authStatus || authStatus === 'configuring') {\r\n return null;\r\n }\r\n\r\n if (authStatus === 'unauthenticated') {\r\n return <LoginModal onClose={null} open={true} />\r\n }\r\n\r\n return children;\r\n}\r\n","import * as React from \"react\";\r\nimport { ReactElement, useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport { AuthenticatorContext, AuthenticatorContextType } from './authentication-context';\r\nimport { AuthStatus } from \"../models/auth-status\";\r\nimport { UserDetail } from \"@cirrobio/api-client\";\r\nimport { useAppConfig } from \"@cirrobio/react-core\";\r\nimport { CurrentUser } from \"@cirrobio/sdk\";\r\n\r\nexport type AuthenticationProviderProps = {\r\n children: React.ReactNode;\r\n fetchUserInfo?: boolean;\r\n}\r\n\r\n/**\r\n * Manages the authentication state of the application.\r\n * @param children - The child components to render within the provider.\r\n * @param fetchUserInfo - If true, fetches detailed user information after authentication.\r\n */\r\nexport function AuthenticationContextProvider({ children, fetchUserInfo }: AuthenticationProviderProps): ReactElement {\r\n const [authStatus, setAuthStatus] = useState<AuthStatus>('configuring');\r\n const [authInfo, setAuthInfo] = useState<CurrentUser>(null);\r\n const [userInfo, setUserInfo] = useState<UserDetail>(null);\r\n const { dataService, authProvider } = useAppConfig();\r\n\r\n const refresh = useCallback((): void => {\r\n authProvider.getCurrentUser()\r\n .then((currentUser) => {\r\n setAuthStatus('authenticated');\r\n setAuthInfo(currentUser);\r\n if (fetchUserInfo) {\r\n dataService.users.getUser({ username: currentUser.username })\r\n .then((data) => setUserInfo(data))\r\n .catch((error) => {\r\n console.error('Failed to fetch user info:', error);\r\n setUserInfo(null);\r\n });\r\n }\r\n })\r\n .catch(() => {\r\n setAuthStatus('unauthenticated');\r\n });\r\n }, []);\r\n\r\n const value: AuthenticatorContextType = useMemo(\r\n () => ({ authStatus, authInfo, refresh, userInfo }),\r\n [authStatus, authInfo, userInfo, refresh]\r\n );\r\n\r\n // Refresh auth state on page load\r\n useEffect(() => {\r\n refresh();\r\n }, [refresh]);\r\n\r\n // Refresh auth state in response to auth events\r\n useEffect(() => {\r\n const options = { onSignIn: refresh, onSignOut: refresh };\r\n return authProvider.registerAuthEventHandler(options);\r\n }, [refresh]);\r\n\r\n return (\r\n <AuthenticatorContext.Provider value={value}>\r\n {children}\r\n </AuthenticatorContext.Provider>\r\n );\r\n}\r\n","import { StaticTokenAuthProvider } from \"@cirrobio/sdk\";\r\nimport { InteractiveAuthenticationProvider } from \"@cirrobio/react-core\";\r\n\r\n\r\n/**\r\n * StaticInteractiveAuthTokenProvider is a simple implementation of the InteractiveAuthenticationProvider\r\n * that uses a static token for authentication. This is useful for testing or when you have a known token.\r\n */\r\nexport class StaticInteractiveAuthTokenProvider\r\n extends StaticTokenAuthProvider\r\n implements InteractiveAuthenticationProvider {\r\n\r\n constructor(token: string) {\r\n super(token);\r\n }\r\n\r\n async getAccessToken(): Promise<string> {\r\n return this.token;\r\n }\r\n\r\n loginSSO(): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n loginEmail(_): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n finishLoginEmail(_): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n signOut(): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n getLoginProviders() {\r\n return [];\r\n }\r\n\r\n registerAuthEventHandler(_): void {\r\n // No-op for static token provider\r\n }\r\n}\r\n"],"names":["amplifySignOut","React"],"mappings":"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"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/amplify/configure-amplify.ts","../src/amplify/magic-link.ts","../src/amplify/auth-listener.ts","../src/amplify/amplify-auth-provider.tsx","../src/components/LoginOptions.tsx","../src/components/LoginModal.tsx","../src/auth-context/authentication-context.tsx","../src/auth-context/useAuthenticator.tsx","../src/components/LoginWrapper.tsx","../src/auth-context/authentication-context-provider.tsx","../src/static/static-token-provider.ts"],"sourcesContent":["import { Amplify } from \"aws-amplify\";\nimport { AppConfig } from \"@cirrobio/react-core\";\n\nexport function configureAmplify(config: AppConfig, clientIdOverride?: string): void {\n Amplify.configure({\n Auth: {\n Cognito: {\n userPoolId: config.auth.userPoolId,\n userPoolClientId: clientIdOverride ?? config.auth.uiAppId,\n loginWith: {\n oauth: {\n domain: config.auth.endpoint,\n scopes: [\n 'phone',\n 'email',\n 'profile',\n 'openid',\n 'aws.cognito.signin.user.admin'\n ],\n redirectSignIn: [window.location.origin],\n redirectSignOut: [window.location.origin],\n responseType: 'code',\n },\n },\n },\n },\n API: {\n GraphQL: {\n endpoint: config.liveEndpoint,\n region: config.region,\n defaultAuthMode: 'userPool',\n },\n },\n });\n}\n","import { confirmSignIn, signIn } from 'aws-amplify/auth';\nimport { IRedeemSignInLink, ISignInLinkRequest } from \"@cirrobio/react-core\";\n\nexport const COGNITO_PROVIDER_ID = 'COGNITO';\nexport const LOGIN_SENT_SUCCESS_MSG = 'Check your email for the login link. If you don’t have an account, the link won’t be sent.';\n\nexport async function requestSignInLink({ username, redirectUri }: ISignInLinkRequest): Promise<void> {\n const redirectUriToUse = redirectUri || window.location.origin + \"/magic-link\";\n try {\n const { nextStep } = await signIn({\n username,\n password: null,\n options: {\n authFlowType: \"CUSTOM_WITHOUT_SRP\",\n },\n });\n if (nextStep.signInStep !== 'CONFIRM_SIGN_IN_WITH_CUSTOM_CHALLENGE') {\n return;\n }\n\n const clientMetadata = {\n signInMethod: \"MAGIC_LINK\",\n redirectUri: redirectUriToUse,\n hasMagicLink: \"no\",\n }\n await confirmSignIn({\n challengeResponse: \"cirro-is-awesome\",\n options: {\n clientMetadata,\n },\n });\n } catch (e) {\n // Cleanup the error message\n const errorMessage = e.toString();\n if (errorMessage.includes('UserLambdaValidationException')) {\n throw Error(errorMessage.split('failed with error')[1]);\n } else if (errorMessage.includes('Incorrect username or password')) {\n throw Error('Incorrect username or password.');\n }\n throw Error(errorMessage);\n }\n}\n\nexport async function redeemSignInLink({ username, challenge }: IRedeemSignInLink): Promise<void> {\n await signIn({\n username: username,\n password: null,\n options: {\n authFlowType: \"CUSTOM_WITHOUT_SRP\",\n },\n });\n const clientMetadata = {\n signInMethod: \"MAGIC_LINK\",\n hasMagicLink: \"yes\",\n }\n await confirmSignIn({\n challengeResponse: challenge,\n options: {\n clientMetadata,\n },\n });\n}\n","import { AuthHubEventData } from \"@aws-amplify/core/src/Hub/types/AuthTypes\";\nimport { AuthEventHandlerOptions } from \"@cirrobio/react-core\";\n\nexport const amplifyAuthEventHandler = ({ payload }, options: AuthEventHandlerOptions): void => {\n const { event }: AuthHubEventData = payload;\n const { onSignIn, onSignOut } = options ?? {};\n switch (event) {\n case 'signedIn': {\n console.log('user has signed in successfully');\n onSignIn();\n break;\n }\n case 'signedOut':\n case 'tokenRefresh_failure': {\n onSignOut();\n break;\n }\n default: {\n console.info(event);\n break;\n }\n }\n};\n","import { LoginProvider } from \"@cirrobio/api-client\";\nimport { configureAmplify } from \"./configure-amplify\";\nimport { fetchAuthSession } from \"@aws-amplify/auth\";\nimport {\n AppConfig,\n InteractiveAuthenticationProvider,\n IRedeemSignInLink,\n ISignInLinkRequest,\n AuthEventHandlerOptions\n} from \"@cirrobio/react-core\";\nimport { signInWithRedirect } from \"aws-amplify/auth\";\nimport { redeemSignInLink, requestSignInLink } from \"./magic-link\";\nimport { Hub } from \"aws-amplify/utils\";\nimport { amplifyAuthEventHandler } from \"./auth-listener\";\nimport { CurrentUser } from \"@cirrobio/sdk\";\nimport { signOut as amplifySignOut } from 'aws-amplify/auth';\n\nexport class AmplifyAuthProvider implements InteractiveAuthenticationProvider {\n private loginProviders: LoginProvider[];\n\n constructor(\n readonly clientId?: string\n ) {\n }\n\n public getLoginProviders() {\n return this.loginProviders;\n }\n\n public configure(config: AppConfig): void {\n configureAmplify(config, this.clientId);\n this.loginProviders = config.tenantInfo.loginProviders;\n console.log('AmplifyAuthProvider loaded with config');\n }\n\n public async getAccessToken(): Promise<string> {\n const session = await fetchAuthSession();\n return session.tokens.accessToken.toString();\n }\n\n public async getCurrentUser(): Promise<CurrentUser> {\n const session = await fetchAuthSession();\n const idToken = session.tokens.idToken.payload;\n return CurrentUser.fromCognitoUser(idToken);\n }\n\n public async forceRefresh(): Promise<void> {\n await fetchAuthSession({ forceRefresh: true });\n }\n\n public async loginSSO(loginProvider: string): Promise<void> {\n await signInWithRedirect({ provider: { custom: loginProvider } })\n }\n\n public async loginEmail(request: ISignInLinkRequest): Promise<void> {\n await requestSignInLink(request);\n }\n\n public async finishLoginEmail(request: IRedeemSignInLink): Promise<void> {\n await redeemSignInLink(request);\n }\n\n public async signOut(): Promise<void> {\n await amplifySignOut();\n }\n\n public registerAuthEventHandler(options: AuthEventHandlerOptions): () => void {\n return Hub.listen('auth', (data) => amplifyAuthEventHandler(data, options), 'authentication-provider');\n }\n}\n","import React, { Children, ReactElement, useMemo, useState } from 'react';\nimport { Button, Divider, Stack, TextField } from '@mui/material';\nimport { LoginProvider } from '@cirrobio/api-client';\nimport { LoadingButton } from '@mui/lab';\nimport { COGNITO_PROVIDER_ID } from \"../amplify/magic-link\";\n\ninterface IProps {\n loginProviders: LoginProvider[];\n onSelect: (providerId: string, email?: string) => void;\n busy: boolean;\n success: boolean;\n}\n\n\nexport function LoginOptions({ loginProviders, onSelect, busy, success }: Readonly<IProps>): ReactElement {\n const [email, setEmail] = useState('');\n\n const ssoProviders = useMemo(() =>\n loginProviders.filter(p => p.id !== COGNITO_PROVIDER_ID), [loginProviders]);\n const cognitoEnabled = useMemo(() =>\n loginProviders.some(p => p.id === COGNITO_PROVIDER_ID), [loginProviders]);\n\n return (\n <Stack alignItems=\"center\" gap={3} direction=\"column\" sx={{ pt: 2 }}>\n {Children.toArray(ssoProviders.map(provider => {\n return (<Button\n sx={{ p: 2, width: '100%' }}\n variant=\"contained\"\n color=\"secondary\"\n fullWidth={true}\n startIcon={<img style={{ maxHeight: '17px' }} alt={provider.name} src={provider.logoUrl} />}\n onClick={() => onSelect(provider.id)}\n >{provider.name}</Button>)\n }))}\n {cognitoEnabled && (\n <form style={{ width: '100%' }}>\n <Stack alignItems=\"center\" gap={3} direction=\"column\">\n {ssoProviders.length > 0 && (<Divider textAlign=\"center\" color=\"secondary\" flexItem>OR</Divider>)}\n <TextField\n label=\"Email\"\n size=\"medium\"\n value={email}\n variant=\"outlined\"\n autoComplete=\"off\"\n type=\"email\"\n fullWidth={true}\n required\n onChange={(e) => setEmail(e.target.value)}\n />\n <LoadingButton\n type=\"submit\"\n sx={{ p: 2, width: '100%' }}\n loading={busy}\n disabled={!email?.trim() || success}\n variant=\"contained\"\n color=\"secondary\"\n fullWidth={true}\n onClick={() => onSelect(COGNITO_PROVIDER_ID, email)}\n >\n Sign in with email\n </LoadingButton>\n </Stack>\n </form>\n )}\n </Stack>\n )\n}\n","import { Alert, Dialog, IconButton, Stack, Typography } from '@mui/material';\nimport React, { ReactElement, useCallback, useEffect, useMemo, useState } from 'react';\nimport { LoginOptions } from './LoginOptions';\nimport { LoginProvider } from '@cirrobio/api-client';\nimport { handlePromiseError } from \"@cirrobio/sdk\";\nimport { useAppConfig } from \"@cirrobio/react-core\";\nimport { CloseOutlined } from '@mui/icons-material';\nimport { COGNITO_PROVIDER_ID, LOGIN_SENT_SUCCESS_MSG } from \"../amplify/magic-link\";\n\ninterface IProps {\n onClose: () => void;\n open: boolean;\n}\n\nfunction getLoginMessage(loginProviders: LoginProvider[]): string {\n const loginMessage = 'Sign in using one of the options below.';\n const cognitoEnabled = loginProviders.some(p => p.id === COGNITO_PROVIDER_ID);\n const onlyCognito = loginProviders.length === 1 && cognitoEnabled;\n // Only email sign in is enabled.\n if (onlyCognito) {\n return `Sign in with your email below.`;\n }\n // Both SSO and email sign in is enabled\n if (!onlyCognito && cognitoEnabled) {\n return `${loginMessage} If your sign in method isn't listed, please enter your email.`;\n }\n // Only SSO sign in is enabled\n return loginMessage;\n}\n\nexport function LoginModal({ onClose, open }: Readonly<IProps>): ReactElement {\n const { authProvider } = useAppConfig();\n const loginProviders = authProvider.getLoginProviders();\n const loginDescription = useMemo(() => getLoginMessage(loginProviders), [loginProviders]);\n\n const [error, setError] = useState('');\n const [message, setMessage] = useState('');\n const [busy, setBusy] = useState(false);\n\n const handleLogin = useCallback(async (providerId: string, email?: string): Promise<void> => {\n setError('');\n setMessage('');\n setBusy(true);\n if (providerId === COGNITO_PROVIDER_ID) {\n try {\n await authProvider.loginEmail({ username: email });\n setBusy(false);\n setMessage(LOGIN_SENT_SUCCESS_MSG);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'An error occurred');\n setBusy(false);\n }\n } else {\n authProvider.loginSSO(providerId).catch(handlePromiseError);\n if (onClose) onClose();\n }\n }, [onClose]);\n\n useEffect(() => {\n // Log in automatically if there is only one provider (and it's not Cognito)\n const firstProviderId = loginProviders.at(0)?.id;\n if (loginProviders.length === 1 && firstProviderId !== COGNITO_PROVIDER_ID) {\n void handleLogin(firstProviderId);\n }\n }, [loginProviders, handleLogin]);\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n PaperProps={{ sx: { p: 3, background: \"#FFF\", width: '480px' } }}\n \n aria-label=\"login dialog\"\n >\n <Stack alignItems=\"left\" justifyContent=\"space-between\" gap={1} direction={{ xs: 'row' }}>\n <Stack direction=\"column\">\n <Typography id=\"dialog-title\" variant=\"h4\" color=\"secondary\">\n Login\n </Typography>\n <Typography variant=\"body2\">\n {loginDescription}\n </Typography>\n </Stack>\n {!!onClose &&\n <Stack alignItems=\"right\" direction=\"row\" gap={0}>\n <IconButton\n aria-label=\"Close\"\n onClick={() => onClose()}\n size=\"small\"\n color=\"secondary\"\n sx={{ transform: 'translate(10px, 0px)' }}>\n <CloseOutlined sx={{ fontSize: '22px' }} />\n </IconButton>\n </Stack>\n }\n </Stack>\n <Stack sx={{ pt: 0 }}>\n <LoginOptions loginProviders={loginProviders} onSelect={handleLogin} busy={busy} success={!!message} />\n {error && (\n <Alert severity=\"error\" sx={{ mt: 4 }}>{error}</Alert>\n )}\n {message && (\n <Alert severity=\"success\" sx={{ mt: 4 }}>{message}</Alert>\n )}\n </Stack>\n </Dialog>\n );\n}\n\n","import { createContext } from 'react';\nimport { AuthStatus } from \"../models/auth-status\";\nimport { UserDetail } from \"@cirrobio/api-client\";\nimport { CurrentUser } from \"@cirrobio/sdk\";\n\n\n\nexport type AuthenticatorContextType = {\n authStatus: AuthStatus;\n authInfo: CurrentUser | null;\n userInfo: UserDetail;\n refresh: () => void;\n}\n\nexport const AuthenticatorContext = createContext<AuthenticatorContextType>(null);\n","import { useCallback, useContext } from 'react';\nimport { AuthenticatorContext, AuthenticatorContextType } from './authentication-context';\nimport { useAppConfig } from \"@cirrobio/react-core\";\n\ntype UseAuthenticator = AuthenticatorContextType & {\n isLoggedIn: boolean;\n signOut: () => void;\n};\n\n/**\n * Custom hook to access authentication context\n */\nexport function useAuthenticator(): UseAuthenticator {\n const context = useContext(AuthenticatorContext);\n const { authProvider } = useAppConfig();\n\n const signOut = useCallback(() => {\n sessionStorage.clear();\n authProvider.signOut().then(() => {\n // Location reload clears any in-memory state\n // Amplify does a hard reload automatically, but only if you are signing in from oauth / SSO\n location.reload();\n });\n }, [authProvider]);\n\n return {\n ...context,\n isLoggedIn: context?.authStatus === 'authenticated',\n signOut,\n }\n}\n","import React from \"react\";\nimport { useAuthenticator } from \"../auth-context/useAuthenticator\";\nimport { LoginModal } from \"./LoginModal\";\n\ninterface IProps {\n children?: React.ReactNode;\n}\n\n/**\n * LoginWrapper component is used to conditionally render children based on the authentication status\n * or display a login modal if the user is unauthenticated.\n */\nexport function LoginWrapper({ children }: IProps) {\n const { authStatus } = useAuthenticator();\n\n if (!authStatus || authStatus === 'configuring') {\n return null;\n }\n\n if (authStatus === 'unauthenticated') {\n return <LoginModal onClose={null} open={true} />\n }\n\n return children;\n}\n","import * as React from \"react\";\nimport { ReactElement, useCallback, useEffect, useMemo, useState } from \"react\";\nimport { AuthenticatorContext, AuthenticatorContextType } from './authentication-context';\nimport { AuthStatus } from \"../models/auth-status\";\nimport { UserDetail } from \"@cirrobio/api-client\";\nimport { useAppConfig } from \"@cirrobio/react-core\";\nimport { CurrentUser } from \"@cirrobio/sdk\";\n\nexport type AuthenticationProviderProps = {\n children: React.ReactNode;\n fetchUserInfo?: boolean;\n}\n\n/**\n * Manages the authentication state of the application.\n * @param children - The child components to render within the provider.\n * @param fetchUserInfo - If true, fetches detailed user information after authentication.\n */\nexport function AuthenticationContextProvider({ children, fetchUserInfo }: AuthenticationProviderProps): ReactElement {\n const [authStatus, setAuthStatus] = useState<AuthStatus>('configuring');\n const [authInfo, setAuthInfo] = useState<CurrentUser>(null);\n const [userInfo, setUserInfo] = useState<UserDetail>(null);\n const { dataService, authProvider } = useAppConfig();\n\n const refresh = useCallback((): void => {\n authProvider.getCurrentUser()\n .then((currentUser) => {\n setAuthStatus('authenticated');\n setAuthInfo(currentUser);\n if (fetchUserInfo) {\n dataService.users.getUser({ username: currentUser.username })\n .then((data) => setUserInfo(data))\n .catch((error) => {\n console.error('Failed to fetch user info:', error);\n setUserInfo(null);\n });\n }\n })\n .catch(() => {\n setAuthStatus('unauthenticated');\n });\n }, []);\n\n const value: AuthenticatorContextType = useMemo(\n () => ({ authStatus, authInfo, refresh, userInfo }),\n [authStatus, authInfo, userInfo, refresh]\n );\n\n // Refresh auth state on page load\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n // Refresh auth state in response to auth events\n useEffect(() => {\n const options = { onSignIn: refresh, onSignOut: refresh };\n return authProvider.registerAuthEventHandler(options);\n }, [refresh]);\n\n return (\n <AuthenticatorContext.Provider value={value}>\n {children}\n </AuthenticatorContext.Provider>\n );\n}\n","import { StaticTokenAuthProvider } from \"@cirrobio/sdk\";\nimport { InteractiveAuthenticationProvider } from \"@cirrobio/react-core\";\n\n\n/**\n * StaticInteractiveAuthTokenProvider is a simple implementation of the InteractiveAuthenticationProvider\n * that uses a static token for authentication. This is useful for testing or when you have a known token.\n */\nexport class StaticInteractiveAuthTokenProvider\n extends StaticTokenAuthProvider\n implements InteractiveAuthenticationProvider {\n\n constructor(token: string) {\n super(token);\n }\n\n async getAccessToken(): Promise<string> {\n return this.token;\n }\n\n loginSSO(): Promise<void> {\n return Promise.resolve();\n }\n\n loginEmail(_): Promise<void> {\n return Promise.resolve();\n }\n\n finishLoginEmail(_): Promise<void> {\n return Promise.resolve();\n }\n\n signOut(): Promise<void> {\n return Promise.resolve();\n }\n\n getLoginProviders() {\n return [];\n }\n\n registerAuthEventHandler(_): void {\n // No-op for static token provider\n }\n}\n"],"names":["Amplify","signIn","confirmSignIn","fetchAuthSession","CurrentUser","signInWithRedirect","amplifySignOut","Hub","useState","useMemo","Stack","Children","Button","Divider","TextField","LoadingButton","useAppConfig","useCallback","handlePromiseError","useEffect","Dialog","Typography","IconButton","CloseOutlined","Alert","createContext","useContext","React","StaticTokenAuthProvider"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/amplify/configure-amplify.ts","../src/amplify/magic-link.ts","../src/amplify/auth-listener.ts","../src/amplify/amplify-auth-provider.tsx","../src/components/LoginOptions.tsx","../src/components/LoginModal.tsx","../src/auth-context/authentication-context.tsx","../src/auth-context/useAuthenticator.tsx","../src/components/LoginWrapper.tsx","../src/auth-context/authentication-context-provider.tsx","../src/static/static-token-provider.ts"],"sourcesContent":["import { Amplify } from \"aws-amplify\";\r\nimport { AppConfig } from \"@cirrobio/react-core\";\r\n\r\nexport function configureAmplify(config: AppConfig, clientIdOverride?: string): void {\r\n Amplify.configure({\r\n Auth: {\r\n Cognito: {\r\n userPoolId: config.auth.userPoolId,\r\n userPoolClientId: clientIdOverride ?? config.auth.uiAppId,\r\n loginWith: {\r\n oauth: {\r\n domain: config.auth.endpoint,\r\n scopes: [\r\n 'phone',\r\n 'email',\r\n 'profile',\r\n 'openid',\r\n 'aws.cognito.signin.user.admin'\r\n ],\r\n redirectSignIn: [window.location.origin],\r\n redirectSignOut: [window.location.origin],\r\n responseType: 'code',\r\n },\r\n },\r\n },\r\n },\r\n API: {\r\n GraphQL: {\r\n endpoint: config.liveEndpoint,\r\n region: config.region,\r\n defaultAuthMode: 'userPool',\r\n },\r\n },\r\n });\r\n}\r\n","import { confirmSignIn, signIn } from 'aws-amplify/auth';\r\nimport { IRedeemSignInLink, ISignInLinkRequest } from \"@cirrobio/react-core\";\r\n\r\nexport const COGNITO_PROVIDER_ID = 'COGNITO';\r\nexport const LOGIN_SENT_SUCCESS_MSG = 'Check your email for the login link. If you don’t have an account, the link won’t be sent.';\r\n\r\nexport async function requestSignInLink({ username, redirectUri }: ISignInLinkRequest): Promise<void> {\r\n const redirectUriToUse = redirectUri || window.location.origin + \"/magic-link\";\r\n try {\r\n const { nextStep } = await signIn({\r\n username,\r\n password: null,\r\n options: {\r\n authFlowType: \"CUSTOM_WITHOUT_SRP\",\r\n },\r\n });\r\n if (nextStep.signInStep !== 'CONFIRM_SIGN_IN_WITH_CUSTOM_CHALLENGE') {\r\n return;\r\n }\r\n\r\n const clientMetadata = {\r\n signInMethod: \"MAGIC_LINK\",\r\n redirectUri: redirectUriToUse,\r\n hasMagicLink: \"no\",\r\n }\r\n await confirmSignIn({\r\n challengeResponse: \"cirro-is-awesome\",\r\n options: {\r\n clientMetadata,\r\n },\r\n });\r\n } catch (e) {\r\n // Cleanup the error message\r\n const errorMessage = e.toString();\r\n if (errorMessage.includes('UserLambdaValidationException')) {\r\n throw Error(errorMessage.split('failed with error')[1]);\r\n } else if (errorMessage.includes('Incorrect username or password')) {\r\n throw Error('Incorrect username or password.');\r\n }\r\n throw Error(errorMessage);\r\n }\r\n}\r\n\r\nexport async function redeemSignInLink({ username, challenge }: IRedeemSignInLink): Promise<void> {\r\n await signIn({\r\n username: username,\r\n password: null,\r\n options: {\r\n authFlowType: \"CUSTOM_WITHOUT_SRP\",\r\n },\r\n });\r\n const clientMetadata = {\r\n signInMethod: \"MAGIC_LINK\",\r\n hasMagicLink: \"yes\",\r\n }\r\n await confirmSignIn({\r\n challengeResponse: challenge,\r\n options: {\r\n clientMetadata,\r\n },\r\n });\r\n}\r\n","import { AuthHubEventData } from \"@aws-amplify/core/src/Hub/types/AuthTypes\";\r\nimport { AuthEventHandlerOptions } from \"@cirrobio/react-core\";\r\n\r\nexport const amplifyAuthEventHandler = ({ payload }, options: AuthEventHandlerOptions): void => {\r\n const { event }: AuthHubEventData = payload;\r\n const { onSignIn, onSignOut } = options ?? {};\r\n switch (event) {\r\n case 'signedIn': {\r\n console.log('user has signed in successfully');\r\n onSignIn();\r\n break;\r\n }\r\n case 'signedOut':\r\n case 'tokenRefresh_failure': {\r\n onSignOut();\r\n break;\r\n }\r\n default: {\r\n console.info(event);\r\n break;\r\n }\r\n }\r\n};\r\n","import { LoginProvider } from \"@cirrobio/api-client\";\r\nimport { configureAmplify } from \"./configure-amplify\";\r\nimport { fetchAuthSession } from \"@aws-amplify/auth\";\r\nimport {\r\n AppConfig,\r\n InteractiveAuthenticationProvider,\r\n IRedeemSignInLink,\r\n ISignInLinkRequest,\r\n AuthEventHandlerOptions\r\n} from \"@cirrobio/react-core\";\r\nimport { signInWithRedirect } from \"aws-amplify/auth\";\r\nimport { redeemSignInLink, requestSignInLink } from \"./magic-link\";\r\nimport { Hub } from \"aws-amplify/utils\";\r\nimport { amplifyAuthEventHandler } from \"./auth-listener\";\r\nimport { CurrentUser } from \"@cirrobio/sdk\";\r\nimport { signOut as amplifySignOut } from 'aws-amplify/auth';\r\n\r\nexport class AmplifyAuthProvider implements InteractiveAuthenticationProvider {\r\n private loginProviders: LoginProvider[];\r\n\r\n constructor(\r\n readonly clientId?: string\r\n ) {\r\n }\r\n\r\n public getLoginProviders() {\r\n return this.loginProviders;\r\n }\r\n\r\n public configure(config: AppConfig): void {\r\n configureAmplify(config, this.clientId);\r\n this.loginProviders = config.tenantInfo.loginProviders;\r\n console.log('AmplifyAuthProvider loaded with config');\r\n }\r\n\r\n public async getAccessToken(): Promise<string> {\r\n const session = await fetchAuthSession();\r\n return session.tokens.accessToken.toString();\r\n }\r\n\r\n public async getCurrentUser(): Promise<CurrentUser> {\r\n const session = await fetchAuthSession();\r\n const idToken = session.tokens.idToken.payload;\r\n return CurrentUser.fromCognitoUser(idToken);\r\n }\r\n\r\n public async forceRefresh(): Promise<void> {\r\n await fetchAuthSession({ forceRefresh: true });\r\n }\r\n\r\n public async loginSSO(loginProvider: string): Promise<void> {\r\n await signInWithRedirect({ provider: { custom: loginProvider } })\r\n }\r\n\r\n public async loginEmail(request: ISignInLinkRequest): Promise<void> {\r\n await requestSignInLink(request);\r\n }\r\n\r\n public async finishLoginEmail(request: IRedeemSignInLink): Promise<void> {\r\n await redeemSignInLink(request);\r\n }\r\n\r\n public async signOut(): Promise<void> {\r\n await amplifySignOut();\r\n }\r\n\r\n public registerAuthEventHandler(options: AuthEventHandlerOptions): () => void {\r\n return Hub.listen('auth', (data) => amplifyAuthEventHandler(data, options), 'authentication-provider');\r\n }\r\n}\r\n","import React, { Children, ReactElement, useMemo, useState } from 'react';\r\nimport { Button, Divider, Stack, TextField } from '@mui/material';\r\nimport { LoginProvider } from '@cirrobio/api-client';\r\nimport { LoadingButton } from '@mui/lab';\r\nimport { COGNITO_PROVIDER_ID } from \"../amplify/magic-link\";\r\n\r\ninterface IProps {\r\n loginProviders: LoginProvider[];\r\n onSelect: (providerId: string, email?: string) => void;\r\n busy: boolean;\r\n success: boolean;\r\n}\r\n\r\n\r\nexport function LoginOptions({ loginProviders, onSelect, busy, success }: Readonly<IProps>): ReactElement {\r\n const [email, setEmail] = useState('');\r\n\r\n const ssoProviders = useMemo(() =>\r\n loginProviders.filter(p => p.id !== COGNITO_PROVIDER_ID), [loginProviders]);\r\n const cognitoEnabled = useMemo(() =>\r\n loginProviders.some(p => p.id === COGNITO_PROVIDER_ID), [loginProviders]);\r\n\r\n return (\r\n <Stack alignItems=\"center\" gap={3} direction=\"column\" sx={{ pt: 2 }}>\r\n {Children.toArray(ssoProviders.map(provider => {\r\n return (<Button\r\n sx={{ p: 2, width: '100%' }}\r\n variant=\"contained\"\r\n color=\"secondary\"\r\n fullWidth={true}\r\n startIcon={<img style={{ maxHeight: '17px' }} alt={provider.name} src={provider.logoUrl} />}\r\n onClick={() => onSelect(provider.id)}\r\n >{provider.name}</Button>)\r\n }))}\r\n {cognitoEnabled && (\r\n <form style={{ width: '100%' }}>\r\n <Stack alignItems=\"center\" gap={3} direction=\"column\">\r\n {ssoProviders.length > 0 && (<Divider textAlign=\"center\" color=\"secondary\" flexItem>OR</Divider>)}\r\n <TextField\r\n label=\"Email\"\r\n size=\"medium\"\r\n value={email}\r\n variant=\"outlined\"\r\n autoComplete=\"off\"\r\n type=\"email\"\r\n fullWidth={true}\r\n required\r\n onChange={(e) => setEmail(e.target.value)}\r\n />\r\n <LoadingButton\r\n type=\"submit\"\r\n sx={{ p: 2, width: '100%' }}\r\n loading={busy}\r\n disabled={!email?.trim() || success}\r\n variant=\"contained\"\r\n color=\"secondary\"\r\n fullWidth={true}\r\n onClick={() => onSelect(COGNITO_PROVIDER_ID, email)}\r\n >\r\n Sign in with email\r\n </LoadingButton>\r\n </Stack>\r\n </form>\r\n )}\r\n </Stack>\r\n )\r\n}\r\n","import { Alert, Dialog, IconButton, Stack, Typography } from '@mui/material';\r\nimport React, { ReactElement, useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { LoginOptions } from './LoginOptions';\r\nimport { LoginProvider } from '@cirrobio/api-client';\r\nimport { handlePromiseError } from \"@cirrobio/sdk\";\r\nimport { useAppConfig } from \"@cirrobio/react-core\";\r\nimport { CloseOutlined } from '@mui/icons-material';\r\nimport { COGNITO_PROVIDER_ID, LOGIN_SENT_SUCCESS_MSG } from \"../amplify/magic-link\";\r\n\r\ninterface IProps {\r\n onClose: () => void;\r\n open: boolean;\r\n}\r\n\r\nfunction getLoginMessage(loginProviders: LoginProvider[]): string {\r\n const loginMessage = 'Sign in using one of the options below.';\r\n const cognitoEnabled = loginProviders.some(p => p.id === COGNITO_PROVIDER_ID);\r\n const onlyCognito = loginProviders.length === 1 && cognitoEnabled;\r\n // Only email sign in is enabled.\r\n if (onlyCognito) {\r\n return `Sign in with your email below.`;\r\n }\r\n // Both SSO and email sign in is enabled\r\n if (!onlyCognito && cognitoEnabled) {\r\n return `${loginMessage} If your sign in method isn't listed, please enter your email.`;\r\n }\r\n // Only SSO sign in is enabled\r\n return loginMessage;\r\n}\r\n\r\nexport function LoginModal({ onClose, open }: Readonly<IProps>): ReactElement {\r\n const { authProvider } = useAppConfig();\r\n const loginProviders = authProvider.getLoginProviders();\r\n const loginDescription = useMemo(() => getLoginMessage(loginProviders), [loginProviders]);\r\n\r\n const [error, setError] = useState('');\r\n const [message, setMessage] = useState('');\r\n const [busy, setBusy] = useState(false);\r\n\r\n const handleLogin = useCallback(async (providerId: string, email?: string): Promise<void> => {\r\n setError('');\r\n setMessage('');\r\n setBusy(true);\r\n if (providerId === COGNITO_PROVIDER_ID) {\r\n try {\r\n await authProvider.loginEmail({ username: email });\r\n setBusy(false);\r\n setMessage(LOGIN_SENT_SUCCESS_MSG);\r\n } catch (e) {\r\n setError(e instanceof Error ? e.message : 'An error occurred');\r\n setBusy(false);\r\n }\r\n } else {\r\n authProvider.loginSSO(providerId).catch(handlePromiseError);\r\n if (onClose) onClose();\r\n }\r\n }, [onClose]);\r\n\r\n useEffect(() => {\r\n // Log in automatically if there is only one provider (and it's not Cognito)\r\n const firstProviderId = loginProviders.at(0)?.id;\r\n if (loginProviders.length === 1 && firstProviderId !== COGNITO_PROVIDER_ID) {\r\n void handleLogin(firstProviderId);\r\n }\r\n }, [loginProviders, handleLogin]);\r\n\r\n return (\r\n <Dialog\r\n open={open}\r\n onClose={onClose}\r\n PaperProps={{ sx: { p: 3, background: \"#FFF\", width: '480px' } }}\r\n \r\n aria-label=\"login dialog\"\r\n >\r\n <Stack alignItems=\"left\" justifyContent=\"space-between\" gap={1} direction={{ xs: 'row' }}>\r\n <Stack direction=\"column\">\r\n <Typography id=\"dialog-title\" variant=\"h4\" color=\"secondary\">\r\n Login\r\n </Typography>\r\n <Typography variant=\"body2\">\r\n {loginDescription}\r\n </Typography>\r\n </Stack>\r\n {!!onClose &&\r\n <Stack alignItems=\"right\" direction=\"row\" gap={0}>\r\n <IconButton\r\n aria-label=\"Close\"\r\n onClick={() => onClose()}\r\n size=\"small\"\r\n color=\"secondary\"\r\n sx={{ transform: 'translate(10px, 0px)' }}>\r\n <CloseOutlined sx={{ fontSize: '22px' }} />\r\n </IconButton>\r\n </Stack>\r\n }\r\n </Stack>\r\n <Stack sx={{ pt: 0 }}>\r\n <LoginOptions loginProviders={loginProviders} onSelect={handleLogin} busy={busy} success={!!message} />\r\n {error && (\r\n <Alert severity=\"error\" sx={{ mt: 4 }}>{error}</Alert>\r\n )}\r\n {message && (\r\n <Alert severity=\"success\" sx={{ mt: 4 }}>{message}</Alert>\r\n )}\r\n </Stack>\r\n </Dialog>\r\n );\r\n}\r\n\r\n","import { createContext } from 'react';\r\nimport { AuthStatus } from \"../models/auth-status\";\r\nimport { UserDetail } from \"@cirrobio/api-client\";\r\nimport { CurrentUser } from \"@cirrobio/sdk\";\r\n\r\n\r\n\r\nexport type AuthenticatorContextType = {\r\n authStatus: AuthStatus;\r\n authInfo: CurrentUser | null;\r\n userInfo: UserDetail;\r\n refresh: () => void;\r\n}\r\n\r\nexport const AuthenticatorContext = createContext<AuthenticatorContextType>(null);\r\n","import { useCallback, useContext } from 'react';\r\nimport { AuthenticatorContext, AuthenticatorContextType } from './authentication-context';\r\nimport { useAppConfig } from \"@cirrobio/react-core\";\r\n\r\ntype UseAuthenticator = AuthenticatorContextType & {\r\n isLoggedIn: boolean;\r\n signOut: () => void;\r\n};\r\n\r\n/**\r\n * Custom hook to access authentication context\r\n */\r\nexport function useAuthenticator(): UseAuthenticator {\r\n const context = useContext(AuthenticatorContext);\r\n const { authProvider } = useAppConfig();\r\n\r\n const signOut = useCallback(() => {\r\n sessionStorage.clear();\r\n authProvider.signOut().then(() => {\r\n // Location reload clears any in-memory state\r\n // Amplify does a hard reload automatically, but only if you are signing in from oauth / SSO\r\n location.reload();\r\n });\r\n }, [authProvider]);\r\n\r\n return {\r\n ...context,\r\n isLoggedIn: context?.authStatus === 'authenticated',\r\n signOut,\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { useAuthenticator } from \"../auth-context/useAuthenticator\";\r\nimport { LoginModal } from \"./LoginModal\";\r\n\r\ninterface IProps {\r\n children?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * LoginWrapper component is used to conditionally render children based on the authentication status\r\n * or display a login modal if the user is unauthenticated.\r\n */\r\nexport function LoginWrapper({ children }: IProps) {\r\n const { authStatus } = useAuthenticator();\r\n\r\n if (!authStatus || authStatus === 'configuring') {\r\n return null;\r\n }\r\n\r\n if (authStatus === 'unauthenticated') {\r\n return <LoginModal onClose={null} open={true} />\r\n }\r\n\r\n return children;\r\n}\r\n","import * as React from \"react\";\r\nimport { ReactElement, useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport { AuthenticatorContext, AuthenticatorContextType } from './authentication-context';\r\nimport { AuthStatus } from \"../models/auth-status\";\r\nimport { UserDetail } from \"@cirrobio/api-client\";\r\nimport { useAppConfig } from \"@cirrobio/react-core\";\r\nimport { CurrentUser } from \"@cirrobio/sdk\";\r\n\r\nexport type AuthenticationProviderProps = {\r\n children: React.ReactNode;\r\n fetchUserInfo?: boolean;\r\n}\r\n\r\n/**\r\n * Manages the authentication state of the application.\r\n * @param children - The child components to render within the provider.\r\n * @param fetchUserInfo - If true, fetches detailed user information after authentication.\r\n */\r\nexport function AuthenticationContextProvider({ children, fetchUserInfo }: AuthenticationProviderProps): ReactElement {\r\n const [authStatus, setAuthStatus] = useState<AuthStatus>('configuring');\r\n const [authInfo, setAuthInfo] = useState<CurrentUser>(null);\r\n const [userInfo, setUserInfo] = useState<UserDetail>(null);\r\n const { dataService, authProvider } = useAppConfig();\r\n\r\n const refresh = useCallback((): void => {\r\n authProvider.getCurrentUser()\r\n .then((currentUser) => {\r\n setAuthStatus('authenticated');\r\n setAuthInfo(currentUser);\r\n if (fetchUserInfo) {\r\n dataService.users.getUser({ username: currentUser.username })\r\n .then((data) => setUserInfo(data))\r\n .catch((error) => {\r\n console.error('Failed to fetch user info:', error);\r\n setUserInfo(null);\r\n });\r\n }\r\n })\r\n .catch(() => {\r\n setAuthStatus('unauthenticated');\r\n });\r\n }, []);\r\n\r\n const value: AuthenticatorContextType = useMemo(\r\n () => ({ authStatus, authInfo, refresh, userInfo }),\r\n [authStatus, authInfo, userInfo, refresh]\r\n );\r\n\r\n // Refresh auth state on page load\r\n useEffect(() => {\r\n refresh();\r\n }, [refresh]);\r\n\r\n // Refresh auth state in response to auth events\r\n useEffect(() => {\r\n const options = { onSignIn: refresh, onSignOut: refresh };\r\n return authProvider.registerAuthEventHandler(options);\r\n }, [refresh]);\r\n\r\n return (\r\n <AuthenticatorContext.Provider value={value}>\r\n {children}\r\n </AuthenticatorContext.Provider>\r\n );\r\n}\r\n","import { StaticTokenAuthProvider } from \"@cirrobio/sdk\";\r\nimport { InteractiveAuthenticationProvider } from \"@cirrobio/react-core\";\r\n\r\n\r\n/**\r\n * StaticInteractiveAuthTokenProvider is a simple implementation of the InteractiveAuthenticationProvider\r\n * that uses a static token for authentication. This is useful for testing or when you have a known token.\r\n */\r\nexport class StaticInteractiveAuthTokenProvider\r\n extends StaticTokenAuthProvider\r\n implements InteractiveAuthenticationProvider {\r\n\r\n constructor(token: string) {\r\n super(token);\r\n }\r\n\r\n async getAccessToken(): Promise<string> {\r\n return this.token;\r\n }\r\n\r\n loginSSO(): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n loginEmail(_): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n finishLoginEmail(_): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n signOut(): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n getLoginProviders() {\r\n return [];\r\n }\r\n\r\n registerAuthEventHandler(_): void {\r\n // No-op for static token provider\r\n }\r\n}\r\n"],"names":["Amplify","signIn","confirmSignIn","fetchAuthSession","CurrentUser","signInWithRedirect","amplifySignOut","Hub","useState","useMemo","Stack","Children","Button","Divider","TextField","LoadingButton","useAppConfig","useCallback","handlePromiseError","useEffect","Dialog","Typography","IconButton","CloseOutlined","Alert","createContext","useContext","React","StaticTokenAuthProvider"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGgB,SAAA,gBAAgB,CAAC,MAAiB,EAAE,gBAAyB,EAAA;IAC3EA,kBAAO,CAAC,SAAS,CAAC;AAChB,QAAA,IAAI,EAAE;AACJ,YAAA,OAAO,EAAE;AACP,gBAAA,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU;AAClC,gBAAA,gBAAgB,EAAE,gBAAgB,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO;AACzD,gBAAA,SAAS,EAAE;AACT,oBAAA,KAAK,EAAE;AACL,wBAAA,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;AAC5B,wBAAA,MAAM,EAAE;4BACN,OAAO;4BACP,OAAO;4BACP,SAAS;4BACT,QAAQ;4BACR;AACD,yBAAA;AACD,wBAAA,cAAc,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;AACxC,wBAAA,eAAe,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;AACzC,wBAAA,YAAY,EAAE,MAAM;AACrB,qBAAA;AACF,iBAAA;AACF,aAAA;AACF,SAAA;AACD,QAAA,GAAG,EAAE;AACH,YAAA,OAAO,EAAE;gBACP,QAAQ,EAAE,MAAM,CAAC,YAAY;gBAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;AACrB,gBAAA,eAAe,EAAE,UAAU;AAC5B,aAAA;AACF,SAAA;AACF,KAAA,CAAC;AACJ;;AC/BO,MAAM,mBAAmB,GAAG,SAAS;AACrC,MAAM,sBAAsB,GAAG,4FAA4F;AAE3H,eAAe,iBAAiB,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAsB,EAAA;IACnF,MAAM,gBAAgB,GAAG,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,aAAa;AAC9E,IAAA,IAAI;AACF,QAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAMC,WAAM,CAAC;YAChC,QAAQ;AACR,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,YAAY,EAAE,oBAAoB;AACnC,aAAA;AACF,SAAA,CAAC;AACF,QAAA,IAAI,QAAQ,CAAC,UAAU,KAAK,uCAAuC,EAAE;YACnE;;AAGF,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,YAAY,EAAE,YAAY;AAC1B,YAAA,WAAW,EAAE,gBAAgB;AAC7B,YAAA,YAAY,EAAE,IAAI;SACnB;AACD,QAAA,MAAMC,kBAAa,CAAC;AAClB,YAAA,iBAAiB,EAAE,kBAAkB;AACrC,YAAA,OAAO,EAAE;gBACP,cAAc;AACf,aAAA;AACF,SAAA,CAAC;;IACF,OAAO,CAAC,EAAE;;AAEV,QAAA,MAAM,YAAY,GAAG,CAAC,CAAC,QAAQ,EAAE;AACjC,QAAA,IAAI,YAAY,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE;AAC1D,YAAA,MAAM,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;;AAClD,aAAA,IAAI,YAAY,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE;AAClE,YAAA,MAAM,KAAK,CAAC,iCAAiC,CAAC;;AAEhD,QAAA,MAAM,KAAK,CAAC,YAAY,CAAC;;AAE7B;AAEO,eAAe,gBAAgB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAqB,EAAA;AAC/E,IAAA,MAAMD,WAAM,CAAC;AACX,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,QAAQ,EAAE,IAAI;AACd,QAAA,OAAO,EAAE;AACP,YAAA,YAAY,EAAE,oBAAoB;AACnC,SAAA;AACF,KAAA,CAAC;AACF,IAAA,MAAM,cAAc,GAAG;AACrB,QAAA,YAAY,EAAE,YAAY;AAC1B,QAAA,YAAY,EAAE,KAAK;KACpB;AACD,IAAA,MAAMC,kBAAa,CAAC;AAClB,QAAA,iBAAiB,EAAE,SAAS;AAC5B,QAAA,OAAO,EAAE;YACP,cAAc;AACf,SAAA;AACF,KAAA,CAAC;AACJ;;AC1DO,MAAM,uBAAuB,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,OAAgC,KAAU;AAC7F,IAAA,MAAM,EAAE,KAAK,EAAE,GAAqB,OAAO;IAC3C,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,OAAO,IAAI,EAAE;IAC7C,QAAQ,KAAK;QACX,KAAK,UAAU,EAAE;AACf,YAAA,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC;AAC9C,YAAA,QAAQ,EAAE;YACV;;AAEF,QAAA,KAAK,WAAW;QAChB,KAAK,sBAAsB,EAAE;AAC3B,YAAA,SAAS,EAAE;YACX;;QAEF,SAAS;AACP,YAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YACnB;;;AAGN,CAAC;;MCLY,mBAAmB,CAAA;AAG9B,IAAA,WAAA,CACW,QAAiB,EAAA;QAAjB,IAAQ,CAAA,QAAA,GAAR,QAAQ;;IAIZ,iBAAiB,GAAA;QACtB,OAAO,IAAI,CAAC,cAAc;;AAGrB,IAAA,SAAS,CAAC,MAAiB,EAAA;AAChC,QAAA,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC;QACvC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,cAAc;AACtD,QAAA,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC;;AAGhD,IAAA,MAAM,cAAc,GAAA;AACzB,QAAA,MAAM,OAAO,GAAG,MAAMC,uBAAgB,EAAE;QACxC,OAAO,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE;;AAGvC,IAAA,MAAM,cAAc,GAAA;AACzB,QAAA,MAAM,OAAO,GAAG,MAAMA,uBAAgB,EAAE;QACxC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO;AAC9C,QAAA,OAAOC,eAAW,CAAC,eAAe,CAAC,OAAO,CAAC;;AAGtC,IAAA,MAAM,YAAY,GAAA;QACvB,MAAMD,uBAAgB,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;;IAGzC,MAAM,QAAQ,CAAC,aAAqB,EAAA;AACzC,QAAA,MAAME,uBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC;;IAG5D,MAAM,UAAU,CAAC,OAA2B,EAAA;AACjD,QAAA,MAAM,iBAAiB,CAAC,OAAO,CAAC;;IAG3B,MAAM,gBAAgB,CAAC,OAA0B,EAAA;AACtD,QAAA,MAAM,gBAAgB,CAAC,OAAO,CAAC;;AAG1B,IAAA,MAAM,OAAO,GAAA;QAClB,MAAMC,YAAc,EAAE;;AAGjB,IAAA,wBAAwB,CAAC,OAAgC,EAAA;QAC9D,OAAOC,SAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,yBAAyB,CAAC;;AAEzG;;ACvDK,SAAU,YAAY,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAoB,EAAA;IACxF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGC,cAAQ,CAAC,EAAE,CAAC;IAEtC,MAAM,YAAY,GAAGC,aAAO,CAAC,MAC3B,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,mBAAmB,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;IAC7E,MAAM,cAAc,GAAGA,aAAO,CAAC,MAC7B,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,mBAAmB,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;IAE3E,QACE,oBAACC,cAAK,EAAA,EAAC,UAAU,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC,EAAE,SAAS,EAAC,QAAQ,EAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAA;QAChEC,cAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,IAAG;AAC5C,YAAA,QAAQ,KAAA,CAAA,aAAA,CAACC,eAAM,EAAA,EACb,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAC3B,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,WAAW,EACjB,SAAS,EAAE,IAAI,EACf,SAAS,EAAE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,OAAO,EAAI,CAAA,EAC3F,OAAO,EAAE,MAAM,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IACpC,QAAQ,CAAC,IAAI,CAAU;AAC3B,SAAC,CAAC,CAAC;QACF,cAAc,KACb,KAAM,CAAA,aAAA,CAAA,MAAA,EAAA,EAAA,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAA;AAC5B,YAAA,KAAA,CAAA,aAAA,CAACF,cAAK,EAAA,EAAC,UAAU,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC,EAAE,SAAS,EAAC,QAAQ,EAAA;AAClD,gBAAA,YAAY,CAAC,MAAM,GAAG,CAAC,KAAK,oBAACG,gBAAO,EAAA,EAAC,SAAS,EAAC,QAAQ,EAAC,KAAK,EAAC,WAAW,EAAC,QAAQ,eAAa,CAAC;gBACjG,KAAC,CAAA,aAAA,CAAAC,kBAAS,IACR,KAAK,EAAC,OAAO,EACb,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,KAAK,EACZ,OAAO,EAAC,UAAU,EAClB,YAAY,EAAC,KAAK,EAClB,IAAI,EAAC,OAAO,EACZ,SAAS,EAAE,IAAI,EACf,QAAQ,EAAA,IAAA,EACR,QAAQ,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,CAAA;AACF,gBAAA,KAAA,CAAA,aAAA,CAACC,iBAAa,EAAA,EACZ,IAAI,EAAC,QAAQ,EACb,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAC3B,OAAO,EAAE,IAAI,EACb,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO,EACnC,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,WAAW,EACjB,SAAS,EAAE,IAAI,EACf,OAAO,EAAE,MAAM,QAAQ,CAAC,mBAAmB,EAAE,KAAK,CAAC,EAAA,EAAA,oBAAA,CAGrC,CACV,CACH,CACR,CACK;AAEZ;;ACpDA,SAAS,eAAe,CAAC,cAA+B,EAAA;IACtD,MAAM,YAAY,GAAG,yCAAyC;AAC9D,IAAA,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,mBAAmB,CAAC;IAC7E,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc;;IAEjE,IAAI,WAAW,EAAE;AACf,QAAA,OAAO,gCAAgC;;;AAGzC,IAAA,IAAI,CAAC,WAAW,IAAI,cAAc,EAAE;QAClC,OAAO,CAAA,EAAG,YAAY,CAAA,8DAAA,CAAgE;;;AAGxF,IAAA,OAAO,YAAY;AACrB;SAEgB,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAoB,EAAA;AAC5D,IAAA,MAAM,EAAE,YAAY,EAAE,GAAGC,sBAAY,EAAE;AACvC,IAAA,MAAM,cAAc,GAAG,YAAY,CAAC,iBAAiB,EAAE;AACvD,IAAA,MAAM,gBAAgB,GAAGP,aAAO,CAAC,MAAM,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;IAEzF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGD,cAAQ,CAAC,EAAE,CAAC;IACtC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAGA,cAAQ,CAAC,EAAE,CAAC;IAC1C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;IAEvC,MAAM,WAAW,GAAGS,iBAAW,CAAC,OAAO,UAAkB,EAAE,KAAc,KAAmB;QAC1F,QAAQ,CAAC,EAAE,CAAC;QACZ,UAAU,CAAC,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC;AACb,QAAA,IAAI,UAAU,KAAK,mBAAmB,EAAE;AACtC,YAAA,IAAI;gBACF,MAAM,YAAY,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;gBAClD,OAAO,CAAC,KAAK,CAAC;gBACd,UAAU,CAAC,sBAAsB,CAAC;;YAClC,OAAO,CAAC,EAAE;AACV,gBAAA,QAAQ,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC,OAAO,GAAG,mBAAmB,CAAC;gBAC9D,OAAO,CAAC,KAAK,CAAC;;;aAEX;YACL,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,KAAK,CAACC,sBAAkB,CAAC;AAC3D,YAAA,IAAI,OAAO;AAAE,gBAAA,OAAO,EAAE;;AAE1B,KAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAEbC,eAAS,CAAC,MAAK;;QAEb,MAAM,eAAe,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QAChD,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,eAAe,KAAK,mBAAmB,EAAE;AAC1E,YAAA,KAAK,WAAW,CAAC,eAAe,CAAC;;AAErC,KAAC,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;AAEjC,IAAA,QACE,KAAA,CAAA,aAAA,CAACC,eAAM,EAAA,EACL,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,gBAErD,cAAc,EAAA;QAEzB,KAAC,CAAA,aAAA,CAAAV,cAAK,IAAC,UAAU,EAAC,MAAM,EAAC,cAAc,EAAC,eAAe,EAAC,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAA;AACtF,YAAA,KAAA,CAAA,aAAA,CAACA,cAAK,EAAA,EAAC,SAAS,EAAC,QAAQ,EAAA;AACvB,gBAAA,KAAA,CAAA,aAAA,CAACW,mBAAU,EAAA,EAAC,EAAE,EAAC,cAAc,EAAC,OAAO,EAAC,IAAI,EAAC,KAAK,EAAC,WAAW,EAE/C,EAAA,OAAA,CAAA;gBACb,KAAC,CAAA,aAAA,CAAAA,mBAAU,IAAC,OAAO,EAAC,OAAO,EACxB,EAAA,gBAAgB,CACN,CACP;AACP,YAAA,CAAC,CAAC,OAAO;AACR,gBAAA,KAAA,CAAA,aAAA,CAACX,cAAK,EAAA,EAAC,UAAU,EAAC,OAAO,EAAC,SAAS,EAAC,KAAK,EAAC,GAAG,EAAE,CAAC,EAAA;oBAC9C,KAAC,CAAA,aAAA,CAAAY,mBAAU,EACE,EAAA,YAAA,EAAA,OAAO,EAClB,OAAO,EAAE,MAAM,OAAO,EAAE,EACxB,IAAI,EAAC,OAAO,EACZ,KAAK,EAAC,WAAW,EACjB,EAAE,EAAE,EAAE,SAAS,EAAE,sBAAsB,EAAE,EAAA;AACzC,wBAAA,KAAA,CAAA,aAAA,CAACC,2BAAa,EAAA,EAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAA,CAAI,CAChC,CACP,CAEJ;QACR,KAAC,CAAA,aAAA,CAAAb,cAAK,IAAC,EAAE,EAAE,EAAG,EAAE,EAAE,CAAC,EAAE,EAAA;AACnB,YAAA,KAAA,CAAA,aAAA,CAAC,YAAY,EAAC,EAAA,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAI,CAAA;AACtG,YAAA,KAAK,KACJ,KAAA,CAAA,aAAA,CAACc,cAAK,EAAC,EAAA,QAAQ,EAAC,OAAO,EAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAG,EAAA,KAAK,CAAS,CACvD;YACA,OAAO,KACN,KAAC,CAAA,aAAA,CAAAA,cAAK,IAAC,QAAQ,EAAC,SAAS,EAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAG,EAAA,OAAO,CAAS,CAC3D,CACK,CACD;AAEb;;AC7FO,MAAM,oBAAoB,GAAGC,mBAAa,CAA2B,IAAI,CAAC;;ACLjF;;AAEG;SACa,gBAAgB,GAAA;AAC9B,IAAA,MAAM,OAAO,GAAGC,gBAAU,CAAC,oBAAoB,CAAC;AAChD,IAAA,MAAM,EAAE,YAAY,EAAE,GAAGV,sBAAY,EAAE;AAEvC,IAAA,MAAM,OAAO,GAAGC,iBAAW,CAAC,MAAK;QAC/B,cAAc,CAAC,KAAK,EAAE;AACtB,QAAA,YAAY,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAK;;;YAG/B,QAAQ,CAAC,MAAM,EAAE;AACnB,SAAC,CAAC;AACJ,KAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAElB,OAAO;AACL,QAAA,GAAG,OAAO;AACV,QAAA,UAAU,EAAE,OAAO,EAAE,UAAU,KAAK,eAAe;QACnD,OAAO;KACR;AACH;;ACtBA;;;AAGG;AACa,SAAA,YAAY,CAAC,EAAE,QAAQ,EAAU,EAAA;AAC/C,IAAA,MAAM,EAAE,UAAU,EAAE,GAAG,gBAAgB,EAAE;AAEzC,IAAA,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,aAAa,EAAE;AAC/C,QAAA,OAAO,IAAI;;AAGb,IAAA,IAAI,UAAU,KAAK,iBAAiB,EAAE;QACpC,OAAO,KAAA,CAAA,aAAA,CAAC,UAAU,EAAA,EAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAA,CAAI;;AAGlD,IAAA,OAAO,QAAQ;AACjB;;ACXA;;;;AAIG;SACa,6BAA6B,CAAC,EAAE,QAAQ,EAAE,aAAa,EAA+B,EAAA;IACpG,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGT,cAAQ,CAAa,aAAa,CAAC;IACvE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAGA,cAAQ,CAAc,IAAI,CAAC;IAC3D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAGA,cAAQ,CAAa,IAAI,CAAC;IAC1D,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAGQ,sBAAY,EAAE;AAEpD,IAAA,MAAM,OAAO,GAAGC,iBAAW,CAAC,MAAW;QACrC,YAAY,CAAC,cAAc;AACxB,aAAA,IAAI,CAAC,CAAC,WAAW,KAAI;YACpB,aAAa,CAAC,eAAe,CAAC;YAC9B,WAAW,CAAC,WAAW,CAAC;YACxB,IAAI,aAAa,EAAE;AACjB,gBAAA,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE;qBACzD,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC;AAChC,qBAAA,KAAK,CAAC,CAAC,KAAK,KAAI;AACf,oBAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC;oBAClD,WAAW,CAAC,IAAI,CAAC;AACnB,iBAAC,CAAC;;AAER,SAAC;aACA,KAAK,CAAC,MAAK;YACV,aAAa,CAAC,iBAAiB,CAAC;AAClC,SAAC,CAAC;KACL,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,KAAK,GAA6BR,aAAO,CAC7C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EACnD,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAC1C;;IAGDU,eAAS,CAAC,MAAK;AACb,QAAA,OAAO,EAAE;AACX,KAAC,EAAE,CAAC,OAAO,CAAC,CAAC;;IAGbA,eAAS,CAAC,MAAK;QACb,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE;AACzD,QAAA,OAAO,YAAY,CAAC,wBAAwB,CAAC,OAAO,CAAC;AACvD,KAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAEb,IAAA,QACEQ,gBAAA,CAAA,aAAA,CAAC,oBAAoB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,KAAK,EAAA,EACxC,QAAQ,CACqB;AAEpC;;AC5DA;;;AAGG;AACG,MAAO,kCACX,SAAQC,2BAAuB,CAAA;AAG/B,IAAA,WAAA,CAAY,KAAa,EAAA;QACvB,KAAK,CAAC,KAAK,CAAC;;AAGd,IAAA,MAAM,cAAc,GAAA;QAClB,OAAO,IAAI,CAAC,KAAK;;IAGnB,QAAQ,GAAA;AACN,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;;AAG1B,IAAA,UAAU,CAAC,CAAC,EAAA;AACV,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;;AAG1B,IAAA,gBAAgB,CAAC,CAAC,EAAA;AAChB,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;;IAG1B,OAAO,GAAA;AACL,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;;IAG1B,iBAAiB,GAAA;AACf,QAAA,OAAO,EAAE;;AAGX,IAAA,wBAAwB,CAAC,CAAC,EAAA;;;AAG3B;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,42 +1,46 @@
1
- {
2
- "name": "@cirrobio/react-auth",
3
- "version": "0.0.1",
4
- "description": "Provides authentication configuration and components for React applications using Cirro.",
5
- "author": "CirroBio",
6
- "repository": {
7
- "type": "git",
8
- "url": "https://github.com/CirroBio/Cirro-client-ts.git",
9
- "directory": "packages/react-auth"
10
- },
11
- "license": "MIT",
12
- "homepage": "https://cirro.bio",
13
- "main": "dist/index.js",
14
- "module": "dist/index.esm.js",
15
- "types": "dist/types/index.d.ts",
16
- "files": [
17
- "dist"
18
- ],
19
- "scripts": {
20
- "build": "npx rollup --config",
21
- "build:clean": "rm -rf dist && npm run build",
22
- "type-check": "tsc --noEmit",
23
- "prepare": "npm run build",
24
- "test": "jest --coverage --silent --passWithNoTests"
25
- },
26
- "dependencies": {
27
- "@cirrobio/api-client": "^0.9.0",
28
- "@cirrobio/react-core": "^0.0.1",
29
- "@cirrobio/sdk": "^0.9.0",
30
- "@mui/icons-material": "^5.17.1",
31
- "@mui/lab": "^5.0.0-alpha.176",
32
- "@mui/material": "^5.15.10",
33
- "aws-amplify": "^6.15.0"
34
- },
35
- "peerDependencies": {
36
- "@emotion/react": "^11.11.3",
37
- "@emotion/styled": "^11.11.0",
38
- "@mui/material": "^5.15.10",
39
- "react": "^16.14 || ^17 || ^18 || ^19",
40
- "react-dom": "^16.14 || ^17 || ^18 || ^19"
41
- }
42
- }
1
+ {
2
+ "name": "@cirrobio/react-auth",
3
+ "version": "0.0.3",
4
+ "description": "Provides authentication configuration and components for React applications using Cirro.",
5
+ "author": "CirroBio",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/CirroBio/Cirro-client-ts.git",
9
+ "directory": "packages/react-auth"
10
+ },
11
+ "license": "MIT",
12
+ "homepage": "https://cirro.bio",
13
+ "main": "dist/index.js",
14
+ "module": "dist/index.esm.js",
15
+ "types": "dist/types/index.d.ts",
16
+ "files": [
17
+ "dist",
18
+ "src"
19
+ ],
20
+ "scripts": {
21
+ "build": "npx rollup --config",
22
+ "build:clean": "rm -rf dist && npm run build",
23
+ "type-check": "tsc --noEmit",
24
+ "prepare": "npm run build",
25
+ "test": "jest --coverage --silent --passWithNoTests"
26
+ },
27
+ "dependencies": {
28
+ "@cirrobio/api-client": "^0.12.0",
29
+ "@cirrobio/react-core": "^0.0.2",
30
+ "@cirrobio/sdk": "^0.12.0",
31
+ "@mui/icons-material": "^5.17.1",
32
+ "@mui/lab": "^5.0.0-alpha.176",
33
+ "@mui/material": "^5.15.10"
34
+ },
35
+ "peerDependencies": {
36
+ "@emotion/react": "^11.11.3",
37
+ "@emotion/styled": "^11.11.0",
38
+ "@mui/material": "^5.15.10",
39
+ "aws-amplify": "^6.0.0",
40
+ "react": "^16.14 || ^17 || ^18 || ^19",
41
+ "react-dom": "^16.14 || ^17 || ^18 || ^19"
42
+ },
43
+ "devDependencies": {
44
+ "aws-amplify": "^6.15.0"
45
+ }
46
+ }
@@ -0,0 +1,70 @@
1
+ import { LoginProvider } from "@cirrobio/api-client";
2
+ import { configureAmplify } from "./configure-amplify";
3
+ import { fetchAuthSession } from "@aws-amplify/auth";
4
+ import {
5
+ AppConfig,
6
+ InteractiveAuthenticationProvider,
7
+ IRedeemSignInLink,
8
+ ISignInLinkRequest,
9
+ AuthEventHandlerOptions
10
+ } from "@cirrobio/react-core";
11
+ import { signInWithRedirect } from "aws-amplify/auth";
12
+ import { redeemSignInLink, requestSignInLink } from "./magic-link";
13
+ import { Hub } from "aws-amplify/utils";
14
+ import { amplifyAuthEventHandler } from "./auth-listener";
15
+ import { CurrentUser } from "@cirrobio/sdk";
16
+ import { signOut as amplifySignOut } from 'aws-amplify/auth';
17
+
18
+ export class AmplifyAuthProvider implements InteractiveAuthenticationProvider {
19
+ private loginProviders: LoginProvider[];
20
+
21
+ constructor(
22
+ readonly clientId?: string
23
+ ) {
24
+ }
25
+
26
+ public getLoginProviders() {
27
+ return this.loginProviders;
28
+ }
29
+
30
+ public configure(config: AppConfig): void {
31
+ configureAmplify(config, this.clientId);
32
+ this.loginProviders = config.tenantInfo.loginProviders;
33
+ console.log('AmplifyAuthProvider loaded with config');
34
+ }
35
+
36
+ public async getAccessToken(): Promise<string> {
37
+ const session = await fetchAuthSession();
38
+ return session.tokens.accessToken.toString();
39
+ }
40
+
41
+ public async getCurrentUser(): Promise<CurrentUser> {
42
+ const session = await fetchAuthSession();
43
+ const idToken = session.tokens.idToken.payload;
44
+ return CurrentUser.fromCognitoUser(idToken);
45
+ }
46
+
47
+ public async forceRefresh(): Promise<void> {
48
+ await fetchAuthSession({ forceRefresh: true });
49
+ }
50
+
51
+ public async loginSSO(loginProvider: string): Promise<void> {
52
+ await signInWithRedirect({ provider: { custom: loginProvider } })
53
+ }
54
+
55
+ public async loginEmail(request: ISignInLinkRequest): Promise<void> {
56
+ await requestSignInLink(request);
57
+ }
58
+
59
+ public async finishLoginEmail(request: IRedeemSignInLink): Promise<void> {
60
+ await redeemSignInLink(request);
61
+ }
62
+
63
+ public async signOut(): Promise<void> {
64
+ await amplifySignOut();
65
+ }
66
+
67
+ public registerAuthEventHandler(options: AuthEventHandlerOptions): () => void {
68
+ return Hub.listen('auth', (data) => amplifyAuthEventHandler(data, options), 'authentication-provider');
69
+ }
70
+ }
@@ -0,0 +1,23 @@
1
+ import { AuthHubEventData } from "@aws-amplify/core/src/Hub/types/AuthTypes";
2
+ import { AuthEventHandlerOptions } from "@cirrobio/react-core";
3
+
4
+ export const amplifyAuthEventHandler = ({ payload }, options: AuthEventHandlerOptions): void => {
5
+ const { event }: AuthHubEventData = payload;
6
+ const { onSignIn, onSignOut } = options ?? {};
7
+ switch (event) {
8
+ case 'signedIn': {
9
+ console.log('user has signed in successfully');
10
+ onSignIn();
11
+ break;
12
+ }
13
+ case 'signedOut':
14
+ case 'tokenRefresh_failure': {
15
+ onSignOut();
16
+ break;
17
+ }
18
+ default: {
19
+ console.info(event);
20
+ break;
21
+ }
22
+ }
23
+ };
@@ -0,0 +1,35 @@
1
+ import { Amplify } from "aws-amplify";
2
+ import { AppConfig } from "@cirrobio/react-core";
3
+
4
+ export function configureAmplify(config: AppConfig, clientIdOverride?: string): void {
5
+ Amplify.configure({
6
+ Auth: {
7
+ Cognito: {
8
+ userPoolId: config.auth.userPoolId,
9
+ userPoolClientId: clientIdOverride ?? config.auth.uiAppId,
10
+ loginWith: {
11
+ oauth: {
12
+ domain: config.auth.endpoint,
13
+ scopes: [
14
+ 'phone',
15
+ 'email',
16
+ 'profile',
17
+ 'openid',
18
+ 'aws.cognito.signin.user.admin'
19
+ ],
20
+ redirectSignIn: [window.location.origin],
21
+ redirectSignOut: [window.location.origin],
22
+ responseType: 'code',
23
+ },
24
+ },
25
+ },
26
+ },
27
+ API: {
28
+ GraphQL: {
29
+ endpoint: config.liveEndpoint,
30
+ region: config.region,
31
+ defaultAuthMode: 'userPool',
32
+ },
33
+ },
34
+ });
35
+ }
@@ -0,0 +1,62 @@
1
+ import { confirmSignIn, signIn } from 'aws-amplify/auth';
2
+ import { IRedeemSignInLink, ISignInLinkRequest } from "@cirrobio/react-core";
3
+
4
+ export const COGNITO_PROVIDER_ID = 'COGNITO';
5
+ export const LOGIN_SENT_SUCCESS_MSG = 'Check your email for the login link. If you don’t have an account, the link won’t be sent.';
6
+
7
+ export async function requestSignInLink({ username, redirectUri }: ISignInLinkRequest): Promise<void> {
8
+ const redirectUriToUse = redirectUri || window.location.origin + "/magic-link";
9
+ try {
10
+ const { nextStep } = await signIn({
11
+ username,
12
+ password: null,
13
+ options: {
14
+ authFlowType: "CUSTOM_WITHOUT_SRP",
15
+ },
16
+ });
17
+ if (nextStep.signInStep !== 'CONFIRM_SIGN_IN_WITH_CUSTOM_CHALLENGE') {
18
+ return;
19
+ }
20
+
21
+ const clientMetadata = {
22
+ signInMethod: "MAGIC_LINK",
23
+ redirectUri: redirectUriToUse,
24
+ hasMagicLink: "no",
25
+ }
26
+ await confirmSignIn({
27
+ challengeResponse: "cirro-is-awesome",
28
+ options: {
29
+ clientMetadata,
30
+ },
31
+ });
32
+ } catch (e) {
33
+ // Cleanup the error message
34
+ const errorMessage = e.toString();
35
+ if (errorMessage.includes('UserLambdaValidationException')) {
36
+ throw Error(errorMessage.split('failed with error')[1]);
37
+ } else if (errorMessage.includes('Incorrect username or password')) {
38
+ throw Error('Incorrect username or password.');
39
+ }
40
+ throw Error(errorMessage);
41
+ }
42
+ }
43
+
44
+ export async function redeemSignInLink({ username, challenge }: IRedeemSignInLink): Promise<void> {
45
+ await signIn({
46
+ username: username,
47
+ password: null,
48
+ options: {
49
+ authFlowType: "CUSTOM_WITHOUT_SRP",
50
+ },
51
+ });
52
+ const clientMetadata = {
53
+ signInMethod: "MAGIC_LINK",
54
+ hasMagicLink: "yes",
55
+ }
56
+ await confirmSignIn({
57
+ challengeResponse: challenge,
58
+ options: {
59
+ clientMetadata,
60
+ },
61
+ });
62
+ }
@@ -0,0 +1,65 @@
1
+ import * as React from "react";
2
+ import { ReactElement, useCallback, useEffect, useMemo, useState } from "react";
3
+ import { AuthenticatorContext, AuthenticatorContextType } from './authentication-context';
4
+ import { AuthStatus } from "../models/auth-status";
5
+ import { UserDetail } from "@cirrobio/api-client";
6
+ import { useAppConfig } from "@cirrobio/react-core";
7
+ import { CurrentUser } from "@cirrobio/sdk";
8
+
9
+ export type AuthenticationProviderProps = {
10
+ children: React.ReactNode;
11
+ fetchUserInfo?: boolean;
12
+ }
13
+
14
+ /**
15
+ * Manages the authentication state of the application.
16
+ * @param children - The child components to render within the provider.
17
+ * @param fetchUserInfo - If true, fetches detailed user information after authentication.
18
+ */
19
+ export function AuthenticationContextProvider({ children, fetchUserInfo }: AuthenticationProviderProps): ReactElement {
20
+ const [authStatus, setAuthStatus] = useState<AuthStatus>('configuring');
21
+ const [authInfo, setAuthInfo] = useState<CurrentUser>(null);
22
+ const [userInfo, setUserInfo] = useState<UserDetail>(null);
23
+ const { dataService, authProvider } = useAppConfig();
24
+
25
+ const refresh = useCallback((): void => {
26
+ authProvider.getCurrentUser()
27
+ .then((currentUser) => {
28
+ setAuthStatus('authenticated');
29
+ setAuthInfo(currentUser);
30
+ if (fetchUserInfo) {
31
+ dataService.users.getUser({ username: currentUser.username })
32
+ .then((data) => setUserInfo(data))
33
+ .catch((error) => {
34
+ console.error('Failed to fetch user info:', error);
35
+ setUserInfo(null);
36
+ });
37
+ }
38
+ })
39
+ .catch(() => {
40
+ setAuthStatus('unauthenticated');
41
+ });
42
+ }, []);
43
+
44
+ const value: AuthenticatorContextType = useMemo(
45
+ () => ({ authStatus, authInfo, refresh, userInfo }),
46
+ [authStatus, authInfo, userInfo, refresh]
47
+ );
48
+
49
+ // Refresh auth state on page load
50
+ useEffect(() => {
51
+ refresh();
52
+ }, [refresh]);
53
+
54
+ // Refresh auth state in response to auth events
55
+ useEffect(() => {
56
+ const options = { onSignIn: refresh, onSignOut: refresh };
57
+ return authProvider.registerAuthEventHandler(options);
58
+ }, [refresh]);
59
+
60
+ return (
61
+ <AuthenticatorContext.Provider value={value}>
62
+ {children}
63
+ </AuthenticatorContext.Provider>
64
+ );
65
+ }
@@ -0,0 +1,15 @@
1
+ import { createContext } from 'react';
2
+ import { AuthStatus } from "../models/auth-status";
3
+ import { UserDetail } from "@cirrobio/api-client";
4
+ import { CurrentUser } from "@cirrobio/sdk";
5
+
6
+
7
+
8
+ export type AuthenticatorContextType = {
9
+ authStatus: AuthStatus;
10
+ authInfo: CurrentUser | null;
11
+ userInfo: UserDetail;
12
+ refresh: () => void;
13
+ }
14
+
15
+ export const AuthenticatorContext = createContext<AuthenticatorContextType>(null);
@@ -0,0 +1,31 @@
1
+ import { useCallback, useContext } from 'react';
2
+ import { AuthenticatorContext, AuthenticatorContextType } from './authentication-context';
3
+ import { useAppConfig } from "@cirrobio/react-core";
4
+
5
+ type UseAuthenticator = AuthenticatorContextType & {
6
+ isLoggedIn: boolean;
7
+ signOut: () => void;
8
+ };
9
+
10
+ /**
11
+ * Custom hook to access authentication context
12
+ */
13
+ export function useAuthenticator(): UseAuthenticator {
14
+ const context = useContext(AuthenticatorContext);
15
+ const { authProvider } = useAppConfig();
16
+
17
+ const signOut = useCallback(() => {
18
+ sessionStorage.clear();
19
+ authProvider.signOut().then(() => {
20
+ // Location reload clears any in-memory state
21
+ // Amplify does a hard reload automatically, but only if you are signing in from oauth / SSO
22
+ location.reload();
23
+ });
24
+ }, [authProvider]);
25
+
26
+ return {
27
+ ...context,
28
+ isLoggedIn: context?.authStatus === 'authenticated',
29
+ signOut,
30
+ }
31
+ }
@@ -0,0 +1,109 @@
1
+ import { Alert, Dialog, IconButton, Stack, Typography } from '@mui/material';
2
+ import React, { ReactElement, useCallback, useEffect, useMemo, useState } from 'react';
3
+ import { LoginOptions } from './LoginOptions';
4
+ import { LoginProvider } from '@cirrobio/api-client';
5
+ import { handlePromiseError } from "@cirrobio/sdk";
6
+ import { useAppConfig } from "@cirrobio/react-core";
7
+ import { CloseOutlined } from '@mui/icons-material';
8
+ import { COGNITO_PROVIDER_ID, LOGIN_SENT_SUCCESS_MSG } from "../amplify/magic-link";
9
+
10
+ interface IProps {
11
+ onClose: () => void;
12
+ open: boolean;
13
+ }
14
+
15
+ function getLoginMessage(loginProviders: LoginProvider[]): string {
16
+ const loginMessage = 'Sign in using one of the options below.';
17
+ const cognitoEnabled = loginProviders.some(p => p.id === COGNITO_PROVIDER_ID);
18
+ const onlyCognito = loginProviders.length === 1 && cognitoEnabled;
19
+ // Only email sign in is enabled.
20
+ if (onlyCognito) {
21
+ return `Sign in with your email below.`;
22
+ }
23
+ // Both SSO and email sign in is enabled
24
+ if (!onlyCognito && cognitoEnabled) {
25
+ return `${loginMessage} If your sign in method isn't listed, please enter your email.`;
26
+ }
27
+ // Only SSO sign in is enabled
28
+ return loginMessage;
29
+ }
30
+
31
+ export function LoginModal({ onClose, open }: Readonly<IProps>): ReactElement {
32
+ const { authProvider } = useAppConfig();
33
+ const loginProviders = authProvider.getLoginProviders();
34
+ const loginDescription = useMemo(() => getLoginMessage(loginProviders), [loginProviders]);
35
+
36
+ const [error, setError] = useState('');
37
+ const [message, setMessage] = useState('');
38
+ const [busy, setBusy] = useState(false);
39
+
40
+ const handleLogin = useCallback(async (providerId: string, email?: string): Promise<void> => {
41
+ setError('');
42
+ setMessage('');
43
+ setBusy(true);
44
+ if (providerId === COGNITO_PROVIDER_ID) {
45
+ try {
46
+ await authProvider.loginEmail({ username: email });
47
+ setBusy(false);
48
+ setMessage(LOGIN_SENT_SUCCESS_MSG);
49
+ } catch (e) {
50
+ setError(e instanceof Error ? e.message : 'An error occurred');
51
+ setBusy(false);
52
+ }
53
+ } else {
54
+ authProvider.loginSSO(providerId).catch(handlePromiseError);
55
+ if (onClose) onClose();
56
+ }
57
+ }, [onClose]);
58
+
59
+ useEffect(() => {
60
+ // Log in automatically if there is only one provider (and it's not Cognito)
61
+ const firstProviderId = loginProviders.at(0)?.id;
62
+ if (loginProviders.length === 1 && firstProviderId !== COGNITO_PROVIDER_ID) {
63
+ void handleLogin(firstProviderId);
64
+ }
65
+ }, [loginProviders, handleLogin]);
66
+
67
+ return (
68
+ <Dialog
69
+ open={open}
70
+ onClose={onClose}
71
+ PaperProps={{ sx: { p: 3, background: "#FFF", width: '480px' } }}
72
+
73
+ aria-label="login dialog"
74
+ >
75
+ <Stack alignItems="left" justifyContent="space-between" gap={1} direction={{ xs: 'row' }}>
76
+ <Stack direction="column">
77
+ <Typography id="dialog-title" variant="h4" color="secondary">
78
+ Login
79
+ </Typography>
80
+ <Typography variant="body2">
81
+ {loginDescription}
82
+ </Typography>
83
+ </Stack>
84
+ {!!onClose &&
85
+ <Stack alignItems="right" direction="row" gap={0}>
86
+ <IconButton
87
+ aria-label="Close"
88
+ onClick={() => onClose()}
89
+ size="small"
90
+ color="secondary"
91
+ sx={{ transform: 'translate(10px, 0px)' }}>
92
+ <CloseOutlined sx={{ fontSize: '22px' }} />
93
+ </IconButton>
94
+ </Stack>
95
+ }
96
+ </Stack>
97
+ <Stack sx={{ pt: 0 }}>
98
+ <LoginOptions loginProviders={loginProviders} onSelect={handleLogin} busy={busy} success={!!message} />
99
+ {error && (
100
+ <Alert severity="error" sx={{ mt: 4 }}>{error}</Alert>
101
+ )}
102
+ {message && (
103
+ <Alert severity="success" sx={{ mt: 4 }}>{message}</Alert>
104
+ )}
105
+ </Stack>
106
+ </Dialog>
107
+ );
108
+ }
109
+
@@ -0,0 +1,67 @@
1
+ import React, { Children, ReactElement, useMemo, useState } from 'react';
2
+ import { Button, Divider, Stack, TextField } from '@mui/material';
3
+ import { LoginProvider } from '@cirrobio/api-client';
4
+ import { LoadingButton } from '@mui/lab';
5
+ import { COGNITO_PROVIDER_ID } from "../amplify/magic-link";
6
+
7
+ interface IProps {
8
+ loginProviders: LoginProvider[];
9
+ onSelect: (providerId: string, email?: string) => void;
10
+ busy: boolean;
11
+ success: boolean;
12
+ }
13
+
14
+
15
+ export function LoginOptions({ loginProviders, onSelect, busy, success }: Readonly<IProps>): ReactElement {
16
+ const [email, setEmail] = useState('');
17
+
18
+ const ssoProviders = useMemo(() =>
19
+ loginProviders.filter(p => p.id !== COGNITO_PROVIDER_ID), [loginProviders]);
20
+ const cognitoEnabled = useMemo(() =>
21
+ loginProviders.some(p => p.id === COGNITO_PROVIDER_ID), [loginProviders]);
22
+
23
+ return (
24
+ <Stack alignItems="center" gap={3} direction="column" sx={{ pt: 2 }}>
25
+ {Children.toArray(ssoProviders.map(provider => {
26
+ return (<Button
27
+ sx={{ p: 2, width: '100%' }}
28
+ variant="contained"
29
+ color="secondary"
30
+ fullWidth={true}
31
+ startIcon={<img style={{ maxHeight: '17px' }} alt={provider.name} src={provider.logoUrl} />}
32
+ onClick={() => onSelect(provider.id)}
33
+ >{provider.name}</Button>)
34
+ }))}
35
+ {cognitoEnabled && (
36
+ <form style={{ width: '100%' }}>
37
+ <Stack alignItems="center" gap={3} direction="column">
38
+ {ssoProviders.length > 0 && (<Divider textAlign="center" color="secondary" flexItem>OR</Divider>)}
39
+ <TextField
40
+ label="Email"
41
+ size="medium"
42
+ value={email}
43
+ variant="outlined"
44
+ autoComplete="off"
45
+ type="email"
46
+ fullWidth={true}
47
+ required
48
+ onChange={(e) => setEmail(e.target.value)}
49
+ />
50
+ <LoadingButton
51
+ type="submit"
52
+ sx={{ p: 2, width: '100%' }}
53
+ loading={busy}
54
+ disabled={!email?.trim() || success}
55
+ variant="contained"
56
+ color="secondary"
57
+ fullWidth={true}
58
+ onClick={() => onSelect(COGNITO_PROVIDER_ID, email)}
59
+ >
60
+ Sign in with email
61
+ </LoadingButton>
62
+ </Stack>
63
+ </form>
64
+ )}
65
+ </Stack>
66
+ )
67
+ }
@@ -0,0 +1,25 @@
1
+ import React from "react";
2
+ import { useAuthenticator } from "../auth-context/useAuthenticator";
3
+ import { LoginModal } from "./LoginModal";
4
+
5
+ interface IProps {
6
+ children?: React.ReactNode;
7
+ }
8
+
9
+ /**
10
+ * LoginWrapper component is used to conditionally render children based on the authentication status
11
+ * or display a login modal if the user is unauthenticated.
12
+ */
13
+ export function LoginWrapper({ children }: IProps) {
14
+ const { authStatus } = useAuthenticator();
15
+
16
+ if (!authStatus || authStatus === 'configuring') {
17
+ return null;
18
+ }
19
+
20
+ if (authStatus === 'unauthenticated') {
21
+ return <LoginModal onClose={null} open={true} />
22
+ }
23
+
24
+ return children;
25
+ }
package/src/index.ts ADDED
@@ -0,0 +1,12 @@
1
+ export { AmplifyAuthProvider } from './amplify/amplify-auth-provider';
2
+ export type { AuthStatus } from './models/auth-status';
3
+
4
+ // Components
5
+ export { LoginModal } from './components/LoginModal';
6
+ export { LoginOptions } from './components/LoginOptions';
7
+ export { LoginWrapper } from './components/LoginWrapper';
8
+
9
+ export { AuthenticationContextProvider } from './auth-context/authentication-context-provider';
10
+ export { useAuthenticator } from './auth-context/useAuthenticator';
11
+
12
+ export { StaticInteractiveAuthTokenProvider } from './static/static-token-provider';
@@ -0,0 +1 @@
1
+ export type AuthStatus = 'configuring' | 'authenticated' | 'unauthenticated';
@@ -0,0 +1,44 @@
1
+ import { StaticTokenAuthProvider } from "@cirrobio/sdk";
2
+ import { InteractiveAuthenticationProvider } from "@cirrobio/react-core";
3
+
4
+
5
+ /**
6
+ * StaticInteractiveAuthTokenProvider is a simple implementation of the InteractiveAuthenticationProvider
7
+ * that uses a static token for authentication. This is useful for testing or when you have a known token.
8
+ */
9
+ export class StaticInteractiveAuthTokenProvider
10
+ extends StaticTokenAuthProvider
11
+ implements InteractiveAuthenticationProvider {
12
+
13
+ constructor(token: string) {
14
+ super(token);
15
+ }
16
+
17
+ async getAccessToken(): Promise<string> {
18
+ return this.token;
19
+ }
20
+
21
+ loginSSO(): Promise<void> {
22
+ return Promise.resolve();
23
+ }
24
+
25
+ loginEmail(_): Promise<void> {
26
+ return Promise.resolve();
27
+ }
28
+
29
+ finishLoginEmail(_): Promise<void> {
30
+ return Promise.resolve();
31
+ }
32
+
33
+ signOut(): Promise<void> {
34
+ return Promise.resolve();
35
+ }
36
+
37
+ getLoginProviders() {
38
+ return [];
39
+ }
40
+
41
+ registerAuthEventHandler(_): void {
42
+ // No-op for static token provider
43
+ }
44
+ }