UNPKG

react-sanctum

Version:

Easily hook up your React app to Laravel Sanctum

1 lines 13.8 kB
{"version":3,"file":"index.cjs.ts","sources":["../src/SanctumContext.tsx","../src/Sanctum.tsx","../src/withSanctum.tsx","../src/useSanctum.ts"],"sourcesContent":["import * as React from \"react\";\n\nexport interface ContextProps {\n user: null | any;\n authenticated: null | boolean;\n signIn: (\n username: string,\n password: string,\n remember?: boolean\n ) => Promise<{ twoFactor: boolean; signedIn: boolean }>;\n signOut: () => Promise<void>;\n twoFactorChallenge: (code: string, recovery?: boolean) => Promise<{}>;\n setUser: (user: object, authenticated?: boolean) => void;\n checkAuthentication: () => Promise<boolean>;\n}\n\nconst SanctumContext = React.createContext<ContextProps | undefined>(undefined);\n\nexport default SanctumContext;\n","import React, { useEffect, useState, useMemo } from \"react\";\nimport axios, { AxiosInstance } from \"axios\";\nimport SanctumContext from \"./SanctumContext\";\n\naxios.defaults.withCredentials = true;\n\nexport interface ConfigProps {\n apiUrl: string;\n csrfCookieRoute: string;\n signInRoute: string;\n signOutRoute: string;\n userObjectRoute: string;\n twoFactorChallengeRoute?: string;\n axiosInstance?: AxiosInstance;\n usernameKey?: string;\n}\n\ninterface Props {\n config: ConfigProps;\n checkOnInit?: boolean;\n children: React.ReactNode;\n}\n\nconst Sanctum: React.FC<Props> = ({ checkOnInit = true, config, children }) => {\n const localAxiosInstance = useMemo(\n () => config.axiosInstance || axios.create(),\n [config.axiosInstance]\n );\n\n const [sanctumState, setSanctumState] = useState<{\n user: null | {};\n authenticated: null | boolean;\n }>({ user: null, authenticated: null });\n const user = sanctumState.user;\n const authenticated = sanctumState.authenticated;\n\n useEffect(() => {\n if (checkOnInit) {\n checkAuthentication();\n }\n }, [checkOnInit]);\n\n const csrf = () => {\n const { apiUrl, csrfCookieRoute } = config;\n return localAxiosInstance.get(`${apiUrl}/${csrfCookieRoute}`);\n };\n\n const signIn = (\n username: string,\n password: string,\n remember: boolean = false\n ): Promise<{ twoFactor: boolean; signedIn: boolean; user?: {} }> => {\n const { apiUrl, signInRoute, usernameKey } = config;\n\n return new Promise(async (resolve, reject) => {\n try {\n // Get CSRF cookie.\n await csrf();\n\n // Sign in.\n const { data: signInData } = await localAxiosInstance.post(\n `${apiUrl}/${signInRoute}`,\n {\n [usernameKey || \"email\"]: username,\n password,\n remember: remember ? true : null,\n },\n {\n maxRedirects: 0,\n withCredentials: true,\n }\n );\n\n // Handle two factor.\n if (typeof signInData === \"object\" && signInData.two_factor === true) {\n return resolve({ twoFactor: true, signedIn: false });\n }\n\n // Fetch user.\n const user = await revalidate();\n\n return resolve({ twoFactor: false, signedIn: true, user });\n } catch (error) {\n return reject(error);\n }\n });\n };\n\n const twoFactorChallenge = (\n code: string,\n recovery: boolean = false\n ): Promise<{}> => {\n const { apiUrl, twoFactorChallengeRoute } = config;\n\n return new Promise(async (resolve, reject) => {\n try {\n // The user can either use their OTP token or use a recovery code.\n const formData = recovery ? { recovery_code: code } : { code };\n\n await localAxiosInstance.post(\n `${apiUrl}/${twoFactorChallengeRoute}`,\n formData,\n {\n withCredentials: true,\n }\n );\n\n // Fetch user.\n const user = await revalidate();\n\n return resolve(user);\n } catch (error) {\n return reject(error);\n }\n });\n };\n\n const signOut = () => {\n const { apiUrl, signOutRoute } = config;\n\n return new Promise<void>(async (resolve, reject) => {\n try {\n await localAxiosInstance.post(`${apiUrl}/${signOutRoute}`, null, {\n withCredentials: true,\n });\n // Only sign out after the server has successfully responded.\n setSanctumState({ user: null, authenticated: false });\n resolve();\n } catch (error) {\n return reject(error);\n }\n });\n };\n\n const setUser = (user: object, authenticated: boolean = true) => {\n setSanctumState({ user, authenticated });\n };\n\n const revalidate = (): Promise<boolean | { user: {} }> => {\n const { apiUrl, userObjectRoute } = config;\n\n return new Promise(async (resolve, reject) => {\n try {\n const { data } = await localAxiosInstance.get(\n `${apiUrl}/${userObjectRoute}`,\n {\n maxRedirects: 0,\n }\n );\n\n setUser(data);\n\n resolve(data);\n } catch (error) {\n if (axios.isAxiosError(error)) {\n if (error.response && error.response.status === 401) {\n // If there's a 401 error the user is not signed in.\n setSanctumState({ user: null, authenticated: false });\n return resolve(false);\n } else {\n // If there's any other error, something has gone wrong.\n return reject(error);\n }\n } else {\n return reject(error);\n }\n }\n });\n };\n\n const checkAuthentication = (): Promise<boolean> => {\n return new Promise(async (resolve, reject) => {\n if (authenticated === null) {\n // The status is null if we haven't checked it, so we have to make a request.\n try {\n await revalidate();\n return resolve(true);\n } catch (error) {\n if (axios.isAxiosError(error)) {\n if (error.response && error.response.status === 401) {\n // If there's a 401 error the user is not signed in.\n setSanctumState({ user: null, authenticated: false });\n return resolve(false);\n } else {\n // If there's any other error, something has gone wrong.\n return reject(error);\n }\n } else {\n return reject(error);\n }\n }\n } else {\n // If it has been checked with the server before, we can just return the state.\n return resolve(authenticated);\n }\n });\n };\n\n return (\n <SanctumContext.Provider\n children={children || null}\n value={{\n user,\n authenticated,\n signIn,\n twoFactorChallenge,\n signOut,\n setUser,\n checkAuthentication,\n }}\n />\n );\n};\n\nexport default Sanctum;\n","import * as React from \"react\";\n\nimport SanctumContext from \"./SanctumContext\";\n\nconst withSanctum = (Component: React.ComponentType<any>) => {\n const displayName = `withSanctum(${Component.displayName || Component.name})`;\n\n const C = (props: any) => {\n return (\n <SanctumContext.Consumer>\n {(context) => {\n if (!context)\n throw new Error(\n `<${displayName} /> should only be used inside <Sanctum />`\n );\n return <Component {...props} {...context} />;\n }}\n </SanctumContext.Consumer>\n );\n };\n\n C.displayName = displayName;\n\n return C;\n};\n\nexport default withSanctum;\n","import * as React from \"react\";\n\nimport SanctumContext, { ContextProps } from \"./SanctumContext\";\n\ninterface useSanctumReturn<T> extends ContextProps {\n user: T;\n}\n\nexport default function useSanctum<T = null | any>(): useSanctumReturn<T> {\n const context = React.useContext(SanctumContext);\n if (!context)\n throw new Error(\"useSanctum should only be used inside <Sanctum />\");\n return context;\n};\n\n"],"names":["React","axios","useMemo","useState","useEffect"],"mappings":"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"}