dauth-context-react 2.2.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/{interfaces.d.ts → index.d.mts} +71 -49
- package/dist/index.d.ts +71 -8
- package/dist/index.js +730 -5
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +715 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +24 -20
- package/src/index.tsx +64 -40
- package/src/interfaces.ts +22 -0
- package/src/reducer/dauth.actions.ts +82 -65
- package/dist/api/dauth.api.d.ts +0 -11
- package/dist/api/interfaces/dauth.api.responses.d.ts +0 -45
- package/dist/api/utils/config.d.ts +0 -4
- package/dist/api/utils/routes.d.ts +0 -4
- package/dist/constants.d.ts +0 -2
- package/dist/dauth-context-react.cjs.development.js +0 -1211
- package/dist/dauth-context-react.cjs.development.js.map +0 -1
- package/dist/dauth-context-react.cjs.production.min.js +0 -2
- package/dist/dauth-context-react.cjs.production.min.js.map +0 -1
- package/dist/dauth-context-react.esm.js +0 -1203
- package/dist/dauth-context-react.esm.js.map +0 -1
- package/dist/initialDauthState.d.ts +0 -3
- package/dist/reducer/dauth.actions.d.ts +0 -46
- package/dist/reducer/dauth.reducer.d.ts +0 -2
- package/dist/reducer/dauth.types.d.ts +0 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/initialDauthState.ts","../src/reducer/dauth.types.ts","../src/reducer/dauth.reducer.ts","../src/api/utils/config.ts","../src/api/dauth.api.ts","../src/reducer/dauth.actions.ts","../src/constants.ts","../src/api/utils/routes.ts"],"sourcesContent":["import React, {\n useReducer,\n useMemo,\n useEffect,\n useCallback,\n createContext,\n useContext,\n useRef,\n} from 'react';\nimport initialDauthState from './initialDauthState';\nimport userReducer from './reducer/dauth.reducer';\nimport * as action from './reducer/dauth.actions';\nimport { getClientBasePath } from './api/utils/config';\nimport { TOKEN_LS, REFRESH_TOKEN_LS } from './constants';\nimport { routes } from './api/utils/routes';\nimport type {\n IDauthProviderProps,\n IDauthStorageKeys,\n IDauthUser,\n} from './interfaces';\nimport { SET_IS_LOADING } from './reducer/dauth.types';\n\nexport type { IDauthProviderProps };\n\nconst defaultOnError = (error: Error) => console.error(error);\n\nexport const DauthProvider: React.FC<IDauthProviderProps> = (\n props: IDauthProviderProps\n) => {\n const { domainName, children, storageKey, onError, env } = props;\n const [dauthState, dispatch] = useReducer(userReducer, initialDauthState);\n const refreshTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const storageKeys: IDauthStorageKeys = useMemo(\n () => ({\n accessToken: storageKey?.accessToken ?? TOKEN_LS,\n refreshToken: storageKey?.refreshToken ?? REFRESH_TOKEN_LS,\n }),\n [storageKey?.accessToken, storageKey?.refreshToken]\n );\n\n const handleError = useCallback(\n (error: Error) => (onError ?? defaultOnError)(error),\n [onError]\n );\n\n // Build action context\n const ctx = useMemo(\n () => ({ dispatch, domainName, storageKeys, onError: handleError }),\n [domainName, storageKeys, handleError]\n );\n\n // Schedule next proactive refresh based on access token expiry\n const scheduleRefresh = useCallback(() => {\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n const token = localStorage.getItem(storageKeys.accessToken);\n if (!token) return;\n try {\n const payloadB64 = token.split('.')[1];\n if (!payloadB64) return;\n const payload = JSON.parse(atob(payloadB64));\n const expiresIn = (payload.exp || 0) * 1000 - Date.now();\n // Refresh 5 minutes before expiry, minimum 10 seconds\n const refreshIn = Math.max(expiresIn - 5 * 60 * 1000, 10_000);\n refreshTimerRef.current = setTimeout(async () => {\n await action.refreshSessionAction(ctx);\n scheduleRefresh();\n }, refreshIn);\n } catch (_) {\n // If decode fails, retry in 5 minutes\n refreshTimerRef.current = setTimeout(async () => {\n await action.refreshSessionAction(ctx);\n scheduleRefresh();\n }, 5 * 60 * 1000);\n }\n }, [ctx, storageKeys.accessToken]);\n\n // Catch login redirect\n useEffect(() => {\n (async () => {\n const queryString = window.location.search;\n if (!queryString) return;\n const urlParams = new URLSearchParams(queryString);\n const token_url = urlParams.get(storageKeys.accessToken);\n const refresh_url = urlParams.get(storageKeys.refreshToken);\n if (token_url && refresh_url && !dauthState.isAuthenticated) {\n return action.setDauthStateAction({\n ...ctx,\n token: token_url,\n refreshToken: refresh_url,\n });\n }\n })();\n }, []);\n\n // Auto Login\n useEffect(() => {\n (async () => {\n const refreshToken = localStorage.getItem(storageKeys.refreshToken);\n if (refreshToken && !dauthState.isAuthenticated) {\n return action.setAutoLoginAction(ctx);\n } else {\n return dispatch({\n type: SET_IS_LOADING,\n payload: { isLoading: false },\n });\n }\n })();\n }, []);\n\n // Schedule proactive refresh when authenticated\n useEffect(() => {\n if (dauthState.isAuthenticated) {\n scheduleRefresh();\n }\n return () => {\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n };\n }, [dauthState.isAuthenticated, scheduleRefresh]);\n\n const loginWithRedirect = useCallback(() => {\n const base = `${getClientBasePath()}/${domainName}/${routes.signin}`;\n const url = env\n ? `${base}?env=${encodeURIComponent(env)}`\n : base;\n return window.location.replace(url);\n }, [domainName, env]);\n\n const logout = useCallback(() => {\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n return action.setLogoutAction({\n dispatch,\n domainName,\n storageKeys,\n });\n }, [domainName, storageKeys]);\n\n const getAccessToken = useCallback(async () => {\n const token = await action.getAccessTokenAction(ctx);\n return token as string;\n }, [ctx]);\n\n const updateUser = useCallback(\n async (fields: Partial<IDauthUser>) => {\n const token_ls = localStorage.getItem(storageKeys.accessToken);\n const {\n name,\n lastname,\n nickname,\n telPrefix,\n telSuffix,\n language,\n avatar,\n birthDate,\n country,\n metadata,\n } = fields;\n const user = {\n name,\n lastname,\n nickname,\n telPrefix,\n telSuffix,\n language,\n avatar,\n birthDate,\n country,\n metadata,\n } as Partial<IDauthUser>;\n return (await action.setUpdateUserAction({\n ...ctx,\n user,\n token: token_ls,\n })) as boolean;\n },\n [ctx, storageKeys.accessToken]\n );\n\n const updateUserWithRedirect = useCallback(() => {\n const token_ls = localStorage.getItem(storageKeys.accessToken);\n if (!token_ls) return;\n return window.location.replace(\n `${getClientBasePath()}/${domainName}/${routes.updateUser}/${token_ls}`\n );\n }, [domainName, storageKeys.accessToken]);\n\n const sendEmailVerification = useCallback(async () => {\n const token_ls = localStorage.getItem(storageKeys.accessToken);\n if (!token_ls) return false;\n return (await action.sendEmailVerificationAction({\n ...ctx,\n token: token_ls,\n })) as boolean;\n }, [ctx, storageKeys.accessToken]);\n\n const deleteAccount = useCallback(async () => {\n const token_ls = localStorage.getItem(storageKeys.accessToken);\n if (!token_ls) return false;\n if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);\n return (await action.deleteAccountAction({\n ...ctx,\n token: token_ls,\n })) as boolean;\n }, [ctx, storageKeys.accessToken]);\n\n const memoProvider = useMemo(\n () => ({\n ...dauthState,\n loginWithRedirect,\n logout,\n getAccessToken,\n updateUser,\n updateUserWithRedirect,\n sendEmailVerification,\n deleteAccount,\n }),\n [\n dauthState,\n loginWithRedirect,\n logout,\n getAccessToken,\n updateUser,\n updateUserWithRedirect,\n sendEmailVerification,\n deleteAccount,\n ]\n );\n\n return (\n <DauthContext.Provider value={memoProvider}>\n {children}\n </DauthContext.Provider>\n );\n};\n\nconst DauthContext = createContext(initialDauthState);\n\nexport const useDauth = () => {\n const context = useContext(DauthContext);\n if (!context) {\n throw new Error('useDauth must be used inside DauthProvider');\n }\n return context;\n};\n","import {\n IActionStatus,\n IDauthDomainState,\n IDauthState,\n IDauthUser,\n} from './interfaces';\n\nconst initialDauthState: IDauthState = {\n user: {\n language:\n (typeof window !== 'undefined'\n ? window.document.documentElement.getAttribute('lang')\n : null) || 'es',\n } as IDauthUser,\n domain: {} as IDauthDomainState,\n isLoading: true,\n isAuthenticated: false,\n loginWithRedirect: () => {},\n logout: () => {},\n getAccessToken: () => Promise.resolve(''),\n updateUser: () => Promise.resolve(false),\n updateUserWithRedirect: () => {},\n // Send email verification\n sendEmailVerificationStatus: {\n status: {\n type: 'info',\n message: 'Sending email verification...',\n } as IActionStatus,\n isLoading: false,\n },\n sendEmailVerification: () => Promise.resolve(false),\n deleteAccount: () => Promise.resolve(false),\n};\n\nexport default initialDauthState;\n","export const LOGIN = 'LOGIN';\nexport const SET_IS_LOADING = 'SET_IS_LOADING';\nexport const UPDATE_USER = 'UPDATE_USER';\nexport const SET_SEND_EMAIL_VERIFICATION_IS_LOADING =\n 'SET_SEND_EMAIL_VERIFICATION_IS_LOADING';\nexport const SET_SEND_EMAIL_VERIFICATION_STATUS =\n 'SET_SEND_EMAIL_VERIFICATION_STATUS';\n","import { IDauthState } from '../interfaces';\nimport * as DauthTypes from './dauth.types';\n\nexport default function userReducer(state: IDauthState, action: any) {\n const { type, payload } = action;\n\n switch (type) {\n case DauthTypes.LOGIN: {\n const login: IDauthState = {\n ...state,\n user: payload.user,\n domain: payload.domain,\n isAuthenticated: payload.isAuthenticated,\n };\n return login;\n }\n\n case DauthTypes.SET_IS_LOADING: {\n const isLoading: IDauthState = {\n ...state,\n isLoading: payload.isLoading,\n };\n return isLoading;\n }\n\n case DauthTypes.UPDATE_USER: {\n const updateUser: IDauthState = {\n ...state,\n user: {\n ...state.user,\n ...payload,\n },\n };\n return updateUser;\n }\n\n case DauthTypes.SET_SEND_EMAIL_VERIFICATION_STATUS: {\n const setSendEmailVerificationStatus: IDauthState = {\n ...state,\n sendEmailVerificationStatus: {\n ...state.sendEmailVerificationStatus,\n status: {\n type: payload.type,\n message: payload.message,\n },\n },\n };\n return setSendEmailVerificationStatus;\n }\n\n case DauthTypes.SET_SEND_EMAIL_VERIFICATION_IS_LOADING: {\n const setSendEmailVerificationIsLoading: IDauthState = {\n ...state,\n sendEmailVerificationStatus: {\n ...state.sendEmailVerificationStatus,\n isLoading: payload,\n },\n };\n return setSendEmailVerificationIsLoading;\n }\n\n default:\n return state;\n }\n}\n","export const apiVersion = 'v1';\nexport const serverDomain = 'dauth.ovh';\n\nfunction checkIsLocalhost(): boolean {\n if (typeof window === 'undefined') return false;\n const hostname = window.location.hostname;\n return Boolean(\n hostname === 'localhost' ||\n hostname === '[::1]' ||\n hostname.match(\n /(192)\\.(168)\\.(1)\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/gm\n ) ||\n hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n );\n}\n\nexport function getServerBasePath() {\n const isLocalhost = checkIsLocalhost();\n const serverPort = 4012;\n const serverLocalUrl = `${window.location.protocol}//${window.location.hostname}:${serverPort}/api/${apiVersion}`;\n const serverProdUrl = `https://${serverDomain}/api/${apiVersion}`;\n return isLocalhost ? serverLocalUrl : serverProdUrl;\n}\n\nexport function getClientBasePath() {\n const isLocalhost = checkIsLocalhost();\n const clientPort = 5185;\n const clientLocalUrl = `${window.location.protocol}//${window.location.hostname}:${clientPort}`;\n const clientProdUrl = `https://${serverDomain}`;\n return isLocalhost ? clientLocalUrl : clientProdUrl;\n}\n","import { getServerBasePath } from './utils/config';\nimport { IDauthUser } from '../interfaces';\nimport {\n IdeleteAccountAPIResponse,\n IgetUserAPIResponse,\n IrefreshAccessTokenAPIResponse,\n IrefreshTokenAPIResponse,\n IsendEmailVerificationAPIResponse,\n IupdateUserAPIResponse,\n} from './interfaces/dauth.api.responses';\n\nexport const getUserAPI = async (\n domainName: string,\n token: string\n): Promise<IgetUserAPIResponse> => {\n const params = {\n method: 'GET',\n headers: {\n Authorization: token,\n 'Content-Type': 'application/json',\n },\n };\n const response = await fetch(\n `${getServerBasePath()}/app/${domainName}/user`,\n params\n );\n const data = await response.json();\n return { response, data };\n};\n\nexport const updateUserAPI = async (\n domainName: string,\n user: Partial<IDauthUser>,\n token: string\n): Promise<IupdateUserAPIResponse> => {\n const params = {\n method: 'PATCH',\n headers: {\n Authorization: token,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(user),\n };\n const response = await fetch(\n `${getServerBasePath()}/app/${domainName}/user`,\n params\n );\n const data = await response.json();\n return { response, data };\n};\n\nexport const sendEmailVerificationAPI = async (\n domainName: string,\n token: string\n): Promise<IsendEmailVerificationAPIResponse> => {\n const params = {\n method: 'GET',\n headers: {\n Authorization: token,\n 'Content-Type': 'application/json',\n },\n };\n const response = await fetch(\n `${getServerBasePath()}/app/${domainName}/resend-email-verification`,\n params\n );\n const data = await response.json();\n return { response, data };\n};\n\nexport const refreshAccessTokenAPI = async (\n domainName: string,\n token: string\n): Promise<IrefreshAccessTokenAPIResponse> => {\n const params = {\n method: 'GET',\n headers: {\n Authorization: token,\n 'Content-Type': 'application/json',\n },\n };\n const response = await fetch(\n `${getServerBasePath()}/app/${domainName}/refresh-access-token`,\n params\n );\n const data = await response.json();\n return { response, data };\n};\n\nexport const refreshTokenAPI = async (\n domainName: string,\n refreshToken: string\n): Promise<IrefreshTokenAPIResponse> => {\n const params = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refreshToken }),\n };\n const response = await fetch(\n `${getServerBasePath()}/app/${domainName}/refresh-token`,\n params\n );\n const data = await response.json();\n return { response, data };\n};\n\nexport const deleteAccountAPI = async (\n domainName: string,\n token: string\n): Promise<IdeleteAccountAPIResponse> => {\n const params = {\n method: 'DELETE',\n headers: {\n Authorization: token,\n 'Content-Type': 'application/json',\n },\n };\n const response = await fetch(\n `${getServerBasePath()}/app/${domainName}/user`,\n params\n );\n const data = await response.json();\n return { response, data };\n};\n\nexport const logoutAPI = async (\n domainName: string,\n refreshToken: string\n): Promise<{ response: Response }> => {\n const params = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refreshToken }),\n };\n const response = await fetch(\n `${getServerBasePath()}/app/${domainName}/logout`,\n params\n );\n return { response };\n};\n","import {\n deleteAccountAPI,\n getUserAPI,\n logoutAPI,\n refreshTokenAPI,\n sendEmailVerificationAPI,\n updateUserAPI,\n} from '../api/dauth.api';\nimport {\n IDauthDomainState,\n IDauthStorageKeys,\n IDauthUser,\n} from '../interfaces';\nimport * as DauthTypes from './dauth.types';\n\nexport interface ActionContext {\n dispatch: React.Dispatch<any>;\n domainName: string;\n storageKeys: IDauthStorageKeys;\n onError: (error: Error) => void;\n}\n\ntype TSetDauthStateAction = ActionContext & {\n token: string;\n refreshToken: string;\n};\nexport async function setDauthStateAction({\n dispatch,\n token,\n refreshToken,\n domainName,\n storageKeys,\n onError,\n}: TSetDauthStateAction) {\n dispatch({ type: DauthTypes.SET_IS_LOADING, payload: { isLoading: true } });\n try {\n const getUserFetch = await getUserAPI(domainName, token);\n if (getUserFetch.response.status === 200) {\n dispatch({\n type: DauthTypes.LOGIN,\n payload: {\n user: getUserFetch.data.user,\n domain: getUserFetch.data.domain,\n isAuthenticated: true,\n },\n });\n window.history.replaceState({}, document.title, window.location.pathname);\n localStorage.setItem(storageKeys.accessToken, token);\n localStorage.setItem(storageKeys.refreshToken, refreshToken);\n return;\n } else {\n return resetUser(dispatch, storageKeys);\n }\n } catch (error) {\n onError(error instanceof Error ? error : new Error(String(error)));\n return resetUser(dispatch, storageKeys);\n } finally {\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: false },\n });\n }\n}\n\nexport async function setAutoLoginAction({\n dispatch,\n domainName,\n storageKeys,\n onError,\n}: ActionContext) {\n dispatch({ type: DauthTypes.SET_IS_LOADING, payload: { isLoading: true } });\n const storedRefreshToken = localStorage.getItem(storageKeys.refreshToken);\n if (!storedRefreshToken) {\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: false },\n });\n return resetUser(dispatch, storageKeys);\n }\n try {\n const refreshResult = await refreshTokenAPI(domainName, storedRefreshToken);\n if (refreshResult.response.status === 200) {\n const newAccessToken = refreshResult.data.accessToken;\n const newRefreshToken = refreshResult.data.refreshToken;\n localStorage.setItem(storageKeys.accessToken, newAccessToken);\n localStorage.setItem(storageKeys.refreshToken, newRefreshToken);\n const getUserFetch = await getUserAPI(domainName, newAccessToken);\n if (getUserFetch.response.status === 200) {\n dispatch({\n type: DauthTypes.LOGIN,\n payload: {\n user: getUserFetch.data.user,\n domain: getUserFetch.data.domain,\n isAuthenticated: true,\n },\n });\n return;\n }\n }\n // Refresh failed — session expired\n resetUser(dispatch, storageKeys);\n } catch (error) {\n onError(error instanceof Error ? error : new Error(String(error)));\n resetUser(dispatch, storageKeys);\n } finally {\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: false },\n });\n }\n}\n\nexport async function setLogoutAction({\n dispatch,\n domainName,\n storageKeys,\n}: Omit<ActionContext, 'onError'>) {\n const storedRefreshToken = localStorage.getItem(storageKeys.refreshToken);\n if (storedRefreshToken && domainName) {\n try {\n await logoutAPI(domainName, storedRefreshToken);\n } catch (_) {\n // Best-effort server-side logout\n }\n }\n dispatch({ type: DauthTypes.SET_IS_LOADING, payload: { isLoading: true } });\n dispatch({\n type: DauthTypes.LOGIN,\n payload: {\n user: {\n language: window.document.documentElement.getAttribute('lang') || 'es',\n },\n domain: {},\n isAuthenticated: false,\n },\n });\n localStorage.removeItem(storageKeys.accessToken);\n localStorage.removeItem(storageKeys.refreshToken);\n return dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: false },\n });\n}\n\nexport async function refreshSessionAction({\n dispatch,\n domainName,\n storageKeys,\n onError,\n}: ActionContext) {\n const storedRefreshToken = localStorage.getItem(storageKeys.refreshToken);\n if (!storedRefreshToken) {\n return resetUser(dispatch, storageKeys);\n }\n try {\n const refreshResult = await refreshTokenAPI(domainName, storedRefreshToken);\n if (refreshResult.response.status === 200) {\n localStorage.setItem(\n storageKeys.accessToken,\n refreshResult.data.accessToken\n );\n localStorage.setItem(\n storageKeys.refreshToken,\n refreshResult.data.refreshToken\n );\n return;\n }\n // Refresh failed — revoked or expired\n resetUser(dispatch, storageKeys);\n } catch (error) {\n onError(error instanceof Error ? error : new Error(String(error)));\n resetUser(dispatch, storageKeys);\n }\n}\n\ntype TSetUpdateAction = ActionContext & {\n user: Partial<IDauthUser>;\n token: string | null;\n};\nexport async function setUpdateUserAction({\n dispatch,\n domainName,\n user,\n token,\n onError,\n}: TSetUpdateAction) {\n if (user.language) {\n window.document.documentElement.setAttribute('lang', user.language);\n }\n if (!token) {\n dispatch({\n type: DauthTypes.UPDATE_USER,\n payload: user,\n });\n return false;\n }\n try {\n const getUserFetch = await updateUserAPI(domainName, user, token);\n if (getUserFetch.response.status === 200) {\n dispatch({\n type: DauthTypes.UPDATE_USER,\n payload: getUserFetch.data.user,\n });\n return true;\n } else {\n onError(new Error('Update user error: ' + getUserFetch.data.message));\n return false;\n }\n } catch (error) {\n onError(\n error instanceof Error ? error : new Error('Update user error')\n );\n return false;\n }\n}\n\ntype TSetSendEmailVerificationAction = ActionContext & {\n token: string;\n};\nexport async function sendEmailVerificationAction({\n dispatch,\n domainName,\n token,\n}: TSetSendEmailVerificationAction) {\n dispatch({\n type: DauthTypes.SET_SEND_EMAIL_VERIFICATION_IS_LOADING,\n payload: true,\n });\n dispatch({\n type: DauthTypes.SET_SEND_EMAIL_VERIFICATION_STATUS,\n payload: { type: 'info', message: 'Sending email verification...' },\n });\n try {\n const sendEmailFetch = await sendEmailVerificationAPI(domainName, token);\n if (sendEmailFetch.response.status === 200) {\n dispatch({\n type: DauthTypes.SET_SEND_EMAIL_VERIFICATION_STATUS,\n payload: { type: 'success', message: sendEmailFetch.data.message },\n });\n dispatch({\n type: DauthTypes.SET_SEND_EMAIL_VERIFICATION_IS_LOADING,\n payload: false,\n });\n return true;\n } else {\n dispatch({\n type: DauthTypes.SET_SEND_EMAIL_VERIFICATION_STATUS,\n payload: { type: 'error', message: sendEmailFetch.data.message },\n });\n dispatch({\n type: DauthTypes.SET_SEND_EMAIL_VERIFICATION_IS_LOADING,\n payload: false,\n });\n return false;\n }\n } catch (_) {\n dispatch({\n type: DauthTypes.SET_SEND_EMAIL_VERIFICATION_STATUS,\n payload: {\n type: 'error',\n message: 'Send email verification fetch error',\n },\n });\n dispatch({\n type: DauthTypes.SET_SEND_EMAIL_VERIFICATION_IS_LOADING,\n payload: false,\n });\n return false;\n }\n}\n\nexport async function getAccessTokenAction({\n dispatch,\n domainName,\n storageKeys,\n onError,\n}: ActionContext) {\n const token_ls = localStorage.getItem(storageKeys.accessToken);\n if (!token_ls) return 'token-not-found';\n // Decode JWT to check expiry (without verification — that's the server's job)\n try {\n const payloadB64 = token_ls.split('.')[1];\n if (payloadB64) {\n const payload = JSON.parse(atob(payloadB64));\n const expiresIn = (payload.exp || 0) * 1000 - Date.now();\n // If token expires in less than 5 minutes, refresh proactively\n if (expiresIn < 5 * 60 * 1000) {\n await refreshSessionAction({\n dispatch,\n domainName,\n storageKeys,\n onError,\n });\n const refreshedToken = localStorage.getItem(storageKeys.accessToken);\n return refreshedToken || 'token-not-found';\n }\n }\n } catch (_) {\n // If decode fails, return stored token and let server validate\n }\n return token_ls;\n}\n\nexport async function deleteAccountAction({\n dispatch,\n domainName,\n storageKeys,\n onError,\n token,\n}: ActionContext & { token: string }) {\n try {\n const result = await deleteAccountAPI(domainName, token);\n if (result.response.status === 200) {\n resetUser(dispatch, storageKeys);\n return true;\n }\n return false;\n } catch (error) {\n onError(\n error instanceof Error ? error : new Error('Delete account error')\n );\n return false;\n }\n}\n\n///////////////////////////////////////////\n//////////////////////////////////////////\nexport const resetUser = (\n dispatch: React.Dispatch<any>,\n storageKeys: IDauthStorageKeys\n) => {\n localStorage.removeItem(storageKeys.accessToken);\n localStorage.removeItem(storageKeys.refreshToken);\n return dispatch({\n type: DauthTypes.LOGIN,\n payload: {\n user: {} as IDauthUser,\n domain: {} as IDauthDomainState,\n isAuthenticated: false,\n },\n });\n};\n","export const TOKEN_LS = 'dauth_state';\nexport const REFRESH_TOKEN_LS = 'dauth_refresh_token';\n","export const routes = {\n signin: 'signin',\n updateUser: 'update-user',\n};\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
2
|
+
"name": "dauth-context-react",
|
|
3
|
+
"version": "2.4.0",
|
|
3
4
|
"license": "MIT",
|
|
5
|
+
"author": "David T. Pizarro Frick",
|
|
4
6
|
"main": "dist/index.js",
|
|
7
|
+
"module": "dist/index.mjs",
|
|
5
8
|
"typings": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.mjs",
|
|
13
|
+
"require": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
6
16
|
"files": [
|
|
7
17
|
"dist",
|
|
8
18
|
"src"
|
|
@@ -11,23 +21,18 @@
|
|
|
11
21
|
"node": ">=18"
|
|
12
22
|
},
|
|
13
23
|
"scripts": {
|
|
14
|
-
"start": "
|
|
15
|
-
"build": "
|
|
16
|
-
"test": "
|
|
17
|
-
"
|
|
24
|
+
"start": "tsup --watch",
|
|
25
|
+
"build": "tsup",
|
|
26
|
+
"test": "vitest run",
|
|
27
|
+
"typecheck": "tsc --noEmit",
|
|
18
28
|
"format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,json,md}\"",
|
|
19
|
-
"prepare": "
|
|
29
|
+
"prepare": "tsup",
|
|
20
30
|
"size": "size-limit",
|
|
21
31
|
"analyze": "size-limit --why"
|
|
22
32
|
},
|
|
23
33
|
"peerDependencies": {
|
|
24
34
|
"react": ">=16"
|
|
25
35
|
},
|
|
26
|
-
"husky": {
|
|
27
|
-
"hooks": {
|
|
28
|
-
"pre-commit": "tsdx lint"
|
|
29
|
-
}
|
|
30
|
-
},
|
|
31
36
|
"prettier": {
|
|
32
37
|
"printWidth": 80,
|
|
33
38
|
"semi": true,
|
|
@@ -35,31 +40,30 @@
|
|
|
35
40
|
"trailingComma": "es5"
|
|
36
41
|
},
|
|
37
42
|
"packageManager": "pnpm@10.30.3",
|
|
38
|
-
"name": "dauth-context-react",
|
|
39
|
-
"author": "David T. Pizarro Frick",
|
|
40
|
-
"module": "dist/dauth-context-react.esm.js",
|
|
41
43
|
"size-limit": [
|
|
42
44
|
{
|
|
43
|
-
"path": "dist/
|
|
45
|
+
"path": "dist/index.js",
|
|
44
46
|
"limit": "10 KB"
|
|
45
47
|
},
|
|
46
48
|
{
|
|
47
|
-
"path": "dist/
|
|
49
|
+
"path": "dist/index.mjs",
|
|
48
50
|
"limit": "10 KB"
|
|
49
51
|
}
|
|
50
52
|
],
|
|
51
53
|
"devDependencies": {
|
|
52
54
|
"@size-limit/preset-small-lib": "^11.0.2",
|
|
53
|
-
"@
|
|
55
|
+
"@testing-library/jest-dom": "~6.0.0",
|
|
56
|
+
"@testing-library/react": "~16.0.0",
|
|
54
57
|
"@types/react": "^18.2.55",
|
|
55
58
|
"@types/react-dom": "^18.2.19",
|
|
56
59
|
"husky": "^9.0.10",
|
|
60
|
+
"jsdom": "~25.0.0",
|
|
57
61
|
"react": "^18.2.0",
|
|
58
62
|
"react-dom": "^18.2.0",
|
|
59
63
|
"size-limit": "^11.0.2",
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
64
|
+
"tsup": "~8.5.0",
|
|
65
|
+
"typescript": "~5.9.3",
|
|
66
|
+
"vitest": "~3.1.0"
|
|
63
67
|
},
|
|
64
68
|
"keywords": [
|
|
65
69
|
"react",
|
package/src/index.tsx
CHANGED
|
@@ -13,25 +13,47 @@ import * as action from './reducer/dauth.actions';
|
|
|
13
13
|
import { getClientBasePath } from './api/utils/config';
|
|
14
14
|
import { TOKEN_LS, REFRESH_TOKEN_LS } from './constants';
|
|
15
15
|
import { routes } from './api/utils/routes';
|
|
16
|
-
import {
|
|
16
|
+
import type {
|
|
17
|
+
IDauthProviderProps,
|
|
18
|
+
IDauthStorageKeys,
|
|
19
|
+
IDauthUser,
|
|
20
|
+
} from './interfaces';
|
|
17
21
|
import { SET_IS_LOADING } from './reducer/dauth.types';
|
|
18
22
|
|
|
19
|
-
|
|
20
|
-
domainName: string;
|
|
21
|
-
children: React.ReactNode;
|
|
22
|
-
}
|
|
23
|
+
export type { IDauthProviderProps };
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
const defaultOnError = (error: Error) => console.error(error);
|
|
26
|
+
|
|
27
|
+
export const DauthProvider: React.FC<IDauthProviderProps> = (
|
|
28
|
+
props: IDauthProviderProps
|
|
26
29
|
) => {
|
|
27
|
-
const { domainName, children } = props;
|
|
30
|
+
const { domainName, children, storageKey, onError, env } = props;
|
|
28
31
|
const [dauthState, dispatch] = useReducer(userReducer, initialDauthState);
|
|
29
32
|
const refreshTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
30
33
|
|
|
34
|
+
const storageKeys: IDauthStorageKeys = useMemo(
|
|
35
|
+
() => ({
|
|
36
|
+
accessToken: storageKey?.accessToken ?? TOKEN_LS,
|
|
37
|
+
refreshToken: storageKey?.refreshToken ?? REFRESH_TOKEN_LS,
|
|
38
|
+
}),
|
|
39
|
+
[storageKey?.accessToken, storageKey?.refreshToken]
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
const handleError = useCallback(
|
|
43
|
+
(error: Error) => (onError ?? defaultOnError)(error),
|
|
44
|
+
[onError]
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
// Build action context
|
|
48
|
+
const ctx = useMemo(
|
|
49
|
+
() => ({ dispatch, domainName, storageKeys, onError: handleError }),
|
|
50
|
+
[domainName, storageKeys, handleError]
|
|
51
|
+
);
|
|
52
|
+
|
|
31
53
|
// Schedule next proactive refresh based on access token expiry
|
|
32
54
|
const scheduleRefresh = useCallback(() => {
|
|
33
55
|
if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);
|
|
34
|
-
const token = localStorage.getItem(
|
|
56
|
+
const token = localStorage.getItem(storageKeys.accessToken);
|
|
35
57
|
if (!token) return;
|
|
36
58
|
try {
|
|
37
59
|
const payloadB64 = token.split('.')[1];
|
|
@@ -41,17 +63,17 @@ export const DauthProvider: React.FC<DauthProviderProps> = (
|
|
|
41
63
|
// Refresh 5 minutes before expiry, minimum 10 seconds
|
|
42
64
|
const refreshIn = Math.max(expiresIn - 5 * 60 * 1000, 10_000);
|
|
43
65
|
refreshTimerRef.current = setTimeout(async () => {
|
|
44
|
-
await action.refreshSessionAction(
|
|
66
|
+
await action.refreshSessionAction(ctx);
|
|
45
67
|
scheduleRefresh();
|
|
46
68
|
}, refreshIn);
|
|
47
69
|
} catch (_) {
|
|
48
70
|
// If decode fails, retry in 5 minutes
|
|
49
71
|
refreshTimerRef.current = setTimeout(async () => {
|
|
50
|
-
await action.refreshSessionAction(
|
|
72
|
+
await action.refreshSessionAction(ctx);
|
|
51
73
|
scheduleRefresh();
|
|
52
74
|
}, 5 * 60 * 1000);
|
|
53
75
|
}
|
|
54
|
-
}, [
|
|
76
|
+
}, [ctx, storageKeys.accessToken]);
|
|
55
77
|
|
|
56
78
|
// Catch login redirect
|
|
57
79
|
useEffect(() => {
|
|
@@ -59,14 +81,13 @@ export const DauthProvider: React.FC<DauthProviderProps> = (
|
|
|
59
81
|
const queryString = window.location.search;
|
|
60
82
|
if (!queryString) return;
|
|
61
83
|
const urlParams = new URLSearchParams(queryString);
|
|
62
|
-
const token_url = urlParams.get(
|
|
63
|
-
const refresh_url = urlParams.get(
|
|
84
|
+
const token_url = urlParams.get(storageKeys.accessToken);
|
|
85
|
+
const refresh_url = urlParams.get(storageKeys.refreshToken);
|
|
64
86
|
if (token_url && refresh_url && !dauthState.isAuthenticated) {
|
|
65
87
|
return action.setDauthStateAction({
|
|
66
|
-
|
|
88
|
+
...ctx,
|
|
67
89
|
token: token_url,
|
|
68
90
|
refreshToken: refresh_url,
|
|
69
|
-
domainName,
|
|
70
91
|
});
|
|
71
92
|
}
|
|
72
93
|
})();
|
|
@@ -75,9 +96,9 @@ export const DauthProvider: React.FC<DauthProviderProps> = (
|
|
|
75
96
|
// Auto Login
|
|
76
97
|
useEffect(() => {
|
|
77
98
|
(async () => {
|
|
78
|
-
const refreshToken = localStorage.getItem(
|
|
99
|
+
const refreshToken = localStorage.getItem(storageKeys.refreshToken);
|
|
79
100
|
if (refreshToken && !dauthState.isAuthenticated) {
|
|
80
|
-
return action.setAutoLoginAction(
|
|
101
|
+
return action.setAutoLoginAction(ctx);
|
|
81
102
|
} else {
|
|
82
103
|
return dispatch({
|
|
83
104
|
type: SET_IS_LOADING,
|
|
@@ -98,24 +119,30 @@ export const DauthProvider: React.FC<DauthProviderProps> = (
|
|
|
98
119
|
}, [dauthState.isAuthenticated, scheduleRefresh]);
|
|
99
120
|
|
|
100
121
|
const loginWithRedirect = useCallback(() => {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
122
|
+
const base = `${getClientBasePath()}/${domainName}/${routes.signin}`;
|
|
123
|
+
const url = env
|
|
124
|
+
? `${base}?env=${encodeURIComponent(env)}`
|
|
125
|
+
: base;
|
|
126
|
+
return window.location.replace(url);
|
|
127
|
+
}, [domainName, env]);
|
|
105
128
|
|
|
106
129
|
const logout = useCallback(() => {
|
|
107
130
|
if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);
|
|
108
|
-
return action.setLogoutAction({
|
|
109
|
-
|
|
131
|
+
return action.setLogoutAction({
|
|
132
|
+
dispatch,
|
|
133
|
+
domainName,
|
|
134
|
+
storageKeys,
|
|
135
|
+
});
|
|
136
|
+
}, [domainName, storageKeys]);
|
|
110
137
|
|
|
111
138
|
const getAccessToken = useCallback(async () => {
|
|
112
|
-
const token = await action.getAccessTokenAction(
|
|
139
|
+
const token = await action.getAccessTokenAction(ctx);
|
|
113
140
|
return token as string;
|
|
114
|
-
}, [
|
|
141
|
+
}, [ctx]);
|
|
115
142
|
|
|
116
143
|
const updateUser = useCallback(
|
|
117
144
|
async (fields: Partial<IDauthUser>) => {
|
|
118
|
-
const token_ls = localStorage.getItem(
|
|
145
|
+
const token_ls = localStorage.getItem(storageKeys.accessToken);
|
|
119
146
|
const {
|
|
120
147
|
name,
|
|
121
148
|
lastname,
|
|
@@ -141,43 +168,40 @@ export const DauthProvider: React.FC<DauthProviderProps> = (
|
|
|
141
168
|
metadata,
|
|
142
169
|
} as Partial<IDauthUser>;
|
|
143
170
|
return (await action.setUpdateUserAction({
|
|
144
|
-
|
|
145
|
-
domainName,
|
|
171
|
+
...ctx,
|
|
146
172
|
user,
|
|
147
173
|
token: token_ls,
|
|
148
174
|
})) as boolean;
|
|
149
175
|
},
|
|
150
|
-
[
|
|
176
|
+
[ctx, storageKeys.accessToken]
|
|
151
177
|
);
|
|
152
178
|
|
|
153
179
|
const updateUserWithRedirect = useCallback(() => {
|
|
154
|
-
const token_ls = localStorage.getItem(
|
|
180
|
+
const token_ls = localStorage.getItem(storageKeys.accessToken);
|
|
155
181
|
if (!token_ls) return;
|
|
156
182
|
return window.location.replace(
|
|
157
183
|
`${getClientBasePath()}/${domainName}/${routes.updateUser}/${token_ls}`
|
|
158
184
|
);
|
|
159
|
-
}, [domainName]);
|
|
185
|
+
}, [domainName, storageKeys.accessToken]);
|
|
160
186
|
|
|
161
187
|
const sendEmailVerification = useCallback(async () => {
|
|
162
|
-
const token_ls = localStorage.getItem(
|
|
188
|
+
const token_ls = localStorage.getItem(storageKeys.accessToken);
|
|
163
189
|
if (!token_ls) return false;
|
|
164
190
|
return (await action.sendEmailVerificationAction({
|
|
165
|
-
|
|
166
|
-
domainName,
|
|
191
|
+
...ctx,
|
|
167
192
|
token: token_ls,
|
|
168
193
|
})) as boolean;
|
|
169
|
-
}, [
|
|
194
|
+
}, [ctx, storageKeys.accessToken]);
|
|
170
195
|
|
|
171
196
|
const deleteAccount = useCallback(async () => {
|
|
172
|
-
const token_ls = localStorage.getItem(
|
|
197
|
+
const token_ls = localStorage.getItem(storageKeys.accessToken);
|
|
173
198
|
if (!token_ls) return false;
|
|
174
199
|
if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);
|
|
175
200
|
return (await action.deleteAccountAction({
|
|
176
|
-
|
|
177
|
-
domainName,
|
|
201
|
+
...ctx,
|
|
178
202
|
token: token_ls,
|
|
179
203
|
})) as boolean;
|
|
180
|
-
}, [
|
|
204
|
+
}, [ctx, storageKeys.accessToken]);
|
|
181
205
|
|
|
182
206
|
const memoProvider = useMemo(
|
|
183
207
|
() => ({
|
package/src/interfaces.ts
CHANGED
|
@@ -21,8 +21,14 @@ export interface IDauthUser {
|
|
|
21
21
|
lastLogin: Date;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
export interface IDauthDomainEnvironment {
|
|
25
|
+
name: string;
|
|
26
|
+
loginRedirect: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
24
29
|
export interface IDauthDomainState {
|
|
25
30
|
name: string;
|
|
31
|
+
environments?: IDauthDomainEnvironment[];
|
|
26
32
|
loginRedirect: string;
|
|
27
33
|
allowedOrigins: string[];
|
|
28
34
|
}
|
|
@@ -51,3 +57,19 @@ export interface IActionStatus {
|
|
|
51
57
|
message: string;
|
|
52
58
|
}
|
|
53
59
|
export type TStatusTypes = 'success' | 'error' | 'info' | 'warning';
|
|
60
|
+
|
|
61
|
+
export interface IDauthStorageKeys {
|
|
62
|
+
accessToken: string;
|
|
63
|
+
refreshToken: string;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface IDauthProviderProps {
|
|
67
|
+
domainName: string;
|
|
68
|
+
children: React.ReactNode;
|
|
69
|
+
storageKey?: {
|
|
70
|
+
accessToken?: string;
|
|
71
|
+
refreshToken?: string;
|
|
72
|
+
};
|
|
73
|
+
onError?: (error: Error) => void;
|
|
74
|
+
env?: string;
|
|
75
|
+
}
|