dauth-context-react 4.0.4 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +101 -228
- package/dist/index.d.mts +15 -8
- package/dist/index.d.ts +15 -8
- package/dist/index.js +914 -393
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +920 -395
- package/dist/index.mjs.map +1 -1
- package/package.json +16 -1
- package/src/DauthProfileModal.tsx +875 -0
- package/src/api/dauth.api.ts +66 -97
- package/src/api/interfaces/dauth.api.responses.ts +9 -18
- package/src/api/utils/config.ts +9 -14
- package/src/api/utils/routes.ts +0 -1
- package/src/constants.ts +0 -2
- package/src/index.tsx +37 -134
- package/src/initialDauthState.ts +0 -2
- package/src/interfaces.ts +14 -12
- package/src/reducer/dauth.actions.ts +60 -187
package/dist/index.js.map
CHANGED
|
@@ -1 +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, setDauthUrl } from './api/utils/config';\nimport { TOKEN_LS, REFRESH_TOKEN_LS, AUTH_CODE_PARAM } from './constants';\nimport { routes } from './api/utils/routes';\nimport type {\n IDauthProviderProps,\n IDauthStorageKeys,\n IDauthUser,\n IDauthAuthMethods,\n} from './interfaces';\nimport { SET_IS_LOADING } from './reducer/dauth.types';\n\nexport type { IDauthProviderProps, IDauthAuthMethods };\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, dauthUrl } = props;\n const [dauthState, dispatch] = useReducer(userReducer, initialDauthState);\n const refreshTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Configure custom dauth URL before any API calls\n useEffect(() => {\n setDauthUrl(dauthUrl);\n }, [dauthUrl]);\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(\n async () => {\n await action.refreshSessionAction(ctx);\n scheduleRefresh();\n },\n 5 * 60 * 1000\n );\n }\n }, [ctx, storageKeys.accessToken]);\n\n // Catch login redirect — exchange authorization code for tokens\n useEffect(() => {\n (async () => {\n const queryString = window.location.search;\n if (!queryString) return;\n const urlParams = new URLSearchParams(queryString);\n const code = urlParams.get(AUTH_CODE_PARAM);\n if (code && !dauthState.isAuthenticated) {\n return action.exchangeCodeAction({ ...ctx, code });\n }\n })();\n }, []);\n\n // Auto Login\n useEffect(() => {\n (async () => {\n // Skip if code exchange is in progress — that effect handles isLoading\n const urlParams = new URLSearchParams(window.location.search);\n if (urlParams.get(AUTH_CODE_PARAM)) return;\n\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 ? `${base}?env=${encodeURIComponent(env)}` : 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 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 deleteAccount,\n }),\n [\n dauthState,\n loginWithRedirect,\n logout,\n getAccessToken,\n updateUser,\n updateUserWithRedirect,\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 { IDauthDomainState, IDauthState, IDauthUser } 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 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';\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 default:\n return state;\n }\n}\n","export const apiVersion = 'v1';\nexport const serverDomain = 'dauth.ovh';\n\nlet _dauthUrl: string | undefined;\n\nexport function setDauthUrl(url: string | undefined) {\n _dauthUrl = url?.replace(/\\/+$/, '');\n}\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 if (_dauthUrl) return `${_dauthUrl}/api/${apiVersion}`;\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 if (_dauthUrl) return _dauthUrl;\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 IExchangeCodeAPIResponse,\n IgetUserAPIResponse,\n IrefreshTokenAPIResponse,\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 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 exchangeCodeAPI = async (\n domainName: string,\n code: string\n): Promise<IExchangeCodeAPIResponse> => {\n const params = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code }),\n };\n const response = await fetch(\n `${getServerBasePath()}/app/${domainName}/exchange-code`,\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 exchangeCodeAPI,\n getUserAPI,\n logoutAPI,\n refreshTokenAPI,\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 TExchangeCodeAction = ActionContext & { code: string };\nexport async function exchangeCodeAction({\n dispatch,\n code,\n domainName,\n storageKeys,\n onError,\n}: TExchangeCodeAction) {\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: true },\n });\n try {\n // Clean URL immediately (before any fetch)\n window.history.replaceState({}, document.title, window.location.pathname);\n const exchangeResult = await exchangeCodeAPI(domainName, code);\n if (exchangeResult.response.status !== 200) {\n return resetUser(dispatch, storageKeys);\n }\n const { accessToken, refreshToken } = exchangeResult.data;\n localStorage.setItem(storageKeys.accessToken, accessToken);\n localStorage.setItem(storageKeys.refreshToken, refreshToken);\n const getUserFetch = await getUserAPI(domainName, accessToken);\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 return resetUser(dispatch, storageKeys);\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(error instanceof Error ? error : new Error('Update user error'));\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(error instanceof Error ? error : new Error('Delete account error'));\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';\nexport const AUTH_CODE_PARAM = 'code';\n","export const routes = {\n signin: 'signin',\n updateUser: 'update-user',\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/initialDauthState.ts","../src/reducer/dauth.types.ts","../src/reducer/dauth.reducer.ts","../src/api/dauth.api.ts","../src/reducer/dauth.actions.ts","../src/api/utils/config.ts","../src/constants.ts","../src/api/utils/routes.ts","../src/DauthProfileModal.tsx"],"sourcesContent":["import React, {\n useReducer,\n useMemo,\n useEffect,\n useCallback,\n createContext,\n useContext,\n} from 'react';\nimport initialDauthState from './initialDauthState';\nimport userReducer from './reducer/dauth.reducer';\nimport * as action from './reducer/dauth.actions';\nimport { getClientBasePath, setDauthUrl } from './api/utils/config';\nimport { AUTH_CODE_PARAM } from './constants';\nimport { routes } from './api/utils/routes';\nimport type {\n IDauthProviderProps,\n IDauthAuthMethods,\n IDauthUser,\n IFormField,\n DauthProfileModalProps,\n} from './interfaces';\n\nexport { DauthProfileModal } from './DauthProfileModal';\nexport type {\n IDauthProviderProps,\n IDauthAuthMethods,\n IFormField,\n DauthProfileModalProps,\n};\n\nconst defaultOnError = (error: Error) => console.error(error);\n\nexport const DauthProvider: React.FC<IDauthProviderProps> = (\n props: IDauthProviderProps\n) => {\n const {\n domainName,\n children,\n authProxyPath = '/api/auth',\n onError,\n env,\n dauthUrl,\n } = props;\n const [dauthState, dispatch] = useReducer(userReducer, initialDauthState);\n\n // Configure custom dauth URL before any API calls\n useEffect(() => {\n setDauthUrl(dauthUrl);\n }, [dauthUrl]);\n\n const handleError = useCallback(\n (error: Error) => (onError ?? defaultOnError)(error),\n [onError]\n );\n\n const ctx = useMemo(\n () => ({ dispatch, authProxyPath, onError: handleError }),\n [authProxyPath, handleError]\n );\n\n // On mount: exchange code or auto-login via session cookie\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const code = params.get(AUTH_CODE_PARAM);\n if (code) {\n action.exchangeCodeAction(ctx, code);\n } else {\n action.autoLoginAction(ctx);\n }\n }, []);\n\n const loginWithRedirect = useCallback(() => {\n const base = `${getClientBasePath()}/${domainName}/${routes.signin}`;\n const url = env ? `${base}?env=${encodeURIComponent(env)}` : base;\n return window.location.replace(url);\n }, [domainName, env]);\n\n const logout = useCallback(() => action.logoutAction(ctx), [ctx]);\n\n const updateUser = useCallback(\n async (fields: Partial<IDauthUser>) => {\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 action.updateUserAction(ctx, user);\n },\n [ctx]\n );\n\n const deleteAccount = useCallback(\n () => action.deleteAccountAction(ctx),\n [ctx]\n );\n\n const memoProvider = useMemo(\n () => ({\n ...dauthState,\n loginWithRedirect,\n logout,\n updateUser,\n deleteAccount,\n }),\n [dauthState, loginWithRedirect, logout, updateUser, deleteAccount]\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 { IDauthDomainState, IDauthState, IDauthUser } 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 updateUser: () => 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';\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 default:\n return state;\n }\n}\n","import { IDauthUser } from '../interfaces';\nimport {\n IExchangeCodeResponse,\n ISessionResponse,\n IUpdateUserResponse,\n IDeleteAccountResponse,\n} from './interfaces/dauth.api.responses';\n\nfunction getCsrfToken(): string {\n const match = document.cookie.match(\n /(?:^|;\\s*)(?:__Host-csrf|csrf-token)=([^;]*)/\n );\n if (!match?.[1]) return '';\n try {\n return decodeURIComponent(match[1]);\n } catch {\n return match[1];\n }\n}\n\nexport async function exchangeCodeAPI(\n basePath: string,\n code: string\n): Promise<IExchangeCodeResponse> {\n const response = await fetch(`${basePath}/exchange-code`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n body: JSON.stringify({ code }),\n });\n const data = await response.json();\n return { response, data };\n}\n\nexport async function getSessionAPI(\n basePath: string\n): Promise<ISessionResponse> {\n const response = await fetch(`${basePath}/session`, {\n method: 'GET',\n credentials: 'include',\n });\n const data = await response.json();\n return { response, data };\n}\n\nexport async function logoutAPI(\n basePath: string\n): Promise<{ response: Response }> {\n const response = await fetch(`${basePath}/logout`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-Token': getCsrfToken(),\n },\n credentials: 'include',\n });\n return { response };\n}\n\nexport async function updateUserAPI(\n basePath: string,\n user: Partial<IDauthUser>\n): Promise<IUpdateUserResponse> {\n const response = await fetch(`${basePath}/user`, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-Token': getCsrfToken(),\n },\n credentials: 'include',\n body: JSON.stringify(user),\n });\n const data = await response.json();\n return { response, data };\n}\n\nexport async function deleteAccountAPI(\n basePath: string\n): Promise<IDeleteAccountResponse> {\n const response = await fetch(`${basePath}/user`, {\n method: 'DELETE',\n headers: { 'X-CSRF-Token': getCsrfToken() },\n credentials: 'include',\n });\n const data = await response.json();\n return { response, data };\n}\n","import {\n exchangeCodeAPI,\n getSessionAPI,\n logoutAPI,\n updateUserAPI,\n deleteAccountAPI,\n} from '../api/dauth.api';\nimport { IDauthDomainState, IDauthUser } from '../interfaces';\nimport * as DauthTypes from './dauth.types';\n\nexport interface ActionContext {\n dispatch: React.Dispatch<any>;\n authProxyPath: string;\n onError: (error: Error) => void;\n}\n\nexport async function exchangeCodeAction(ctx: ActionContext, code: string) {\n const { dispatch, authProxyPath, onError } = ctx;\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: true },\n });\n try {\n // Clean URL immediately (before any fetch)\n window.history.replaceState({}, document.title, window.location.pathname);\n const result = await exchangeCodeAPI(authProxyPath, code);\n if (result.response.status === 200) {\n dispatch({\n type: DauthTypes.LOGIN,\n payload: {\n user: result.data.user,\n domain: result.data.domain,\n isAuthenticated: true,\n },\n });\n return;\n }\n resetUser(dispatch);\n } catch (error) {\n onError(error instanceof Error ? error : new Error(String(error)));\n resetUser(dispatch);\n } finally {\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: false },\n });\n }\n}\n\nexport async function autoLoginAction(ctx: ActionContext) {\n const { dispatch, authProxyPath, onError } = ctx;\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: true },\n });\n try {\n const result = await getSessionAPI(authProxyPath);\n if (result.response.status === 200) {\n dispatch({\n type: DauthTypes.LOGIN,\n payload: {\n user: result.data.user,\n domain: result.data.domain,\n isAuthenticated: true,\n },\n });\n return;\n }\n // No session — not authenticated (not an error)\n resetUser(dispatch);\n } catch (error) {\n onError(error instanceof Error ? error : new Error(String(error)));\n resetUser(dispatch);\n } finally {\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: false },\n });\n }\n}\n\nexport async function logoutAction(ctx: ActionContext) {\n const { dispatch, authProxyPath } = ctx;\n try {\n await logoutAPI(authProxyPath);\n } catch {\n // Best-effort server-side logout\n }\n dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: true },\n });\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 dispatch({\n type: DauthTypes.SET_IS_LOADING,\n payload: { isLoading: false },\n });\n}\n\nexport async function updateUserAction(\n ctx: ActionContext,\n user: Partial<IDauthUser>\n): Promise<boolean> {\n const { dispatch, authProxyPath, onError } = ctx;\n if (user.language) {\n window.document.documentElement.setAttribute('lang', user.language);\n }\n try {\n const result = await updateUserAPI(authProxyPath, user);\n if (result.response.status === 200) {\n dispatch({\n type: DauthTypes.UPDATE_USER,\n payload: result.data.user,\n });\n return true;\n }\n onError(new Error('Update user error: ' + result.data.message));\n return false;\n } catch (error) {\n onError(error instanceof Error ? error : new Error('Update user error'));\n return false;\n }\n}\n\nexport async function deleteAccountAction(\n ctx: ActionContext\n): Promise<boolean> {\n const { dispatch, authProxyPath, onError } = ctx;\n try {\n const result = await deleteAccountAPI(authProxyPath);\n if (result.response.status === 200) {\n resetUser(dispatch);\n return true;\n }\n return false;\n } catch (error) {\n onError(error instanceof Error ? error : new Error('Delete account error'));\n return false;\n }\n}\n\nexport const resetUser = (dispatch: React.Dispatch<any>) => {\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 serverDomain = 'dauth.ovh';\n\nlet _dauthUrl: string | undefined;\n\nexport function setDauthUrl(url: string | undefined) {\n _dauthUrl = url?.replace(/\\/+$/, '');\n}\n\nfunction checkIsLocalhost(): boolean {\n if (typeof window === 'undefined') return false;\n const hostname = window.location.hostname;\n return (\n hostname === 'localhost' ||\n hostname === '[::1]' ||\n /^127(?:\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3}$/.test(\n hostname\n ) ||\n /^192\\.168(?:\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){2}$/.test(\n hostname\n ) ||\n /^10(?:\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3}$/.test(\n hostname\n )\n );\n}\n\nexport function getClientBasePath() {\n if (_dauthUrl) return _dauthUrl;\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","export const AUTH_CODE_PARAM = 'code';\n","export const routes = {\n signin: 'signin',\n};\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useDauth } from './index';\nimport type { DauthProfileModalProps } from './interfaces';\n\nexport { type DauthProfileModalProps };\n\ntype Phase = 'exited' | 'entering' | 'entered' | 'exiting';\n\nconst TRANSITION_MS = 200;\nconst MOBILE_TRANSITION_MS = 300;\nconst SUCCESS_TIMEOUT_MS = 4000;\nconst CONFIRM_WORD = 'DELETE';\n\n// --- Inline SVG icons ---\n\nfunction IconClose() {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction IconBack() {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"19\" y1=\"12\" x2=\"5\" y2=\"12\" />\n <polyline points=\"12 19 5 12 12 5\" />\n </svg>\n );\n}\n\nfunction Spinner() {\n return <span style={spinnerStyle} aria-hidden=\"true\" />;\n}\n\n// --- Hooks ---\n\nfunction useMediaQuery(query: string): boolean {\n const [matches, setMatches] = useState(\n () => typeof window !== 'undefined' && window.matchMedia(query).matches\n );\n useEffect(() => {\n const mq = window.matchMedia(query);\n const handler = (e: MediaQueryListEvent) => setMatches(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, [query]);\n return matches;\n}\n\nfunction useModalAnimation(open: boolean): Phase {\n const [phase, setPhase] = useState<Phase>('exited');\n\n useEffect(() => {\n if (open) {\n setPhase('entering');\n const raf = requestAnimationFrame(() => {\n requestAnimationFrame(() => setPhase('entered'));\n });\n return () => cancelAnimationFrame(raf);\n }\n if (phase === 'entered' || phase === 'entering') {\n setPhase('exiting');\n const timer = setTimeout(() => setPhase('exited'), MOBILE_TRANSITION_MS);\n return () => clearTimeout(timer);\n }\n return undefined;\n }, [open]);\n\n return phase;\n}\n\nfunction useFocusTrap(\n containerRef: React.RefObject<HTMLDivElement | null>,\n active: boolean,\n onEscape: () => void\n) {\n const previousFocus = useRef<Element | null>(null);\n\n useEffect(() => {\n if (!active) return;\n previousFocus.current = document.activeElement;\n\n const container = containerRef.current;\n if (!container) return;\n\n const focusFirst = () => {\n const firstInput = container.querySelector<HTMLElement>(\n 'input:not([disabled])'\n );\n (firstInput ?? container).focus();\n };\n // Small delay to let the portal render\n const raf = requestAnimationFrame(focusFirst);\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onEscape();\n return;\n }\n if (e.key !== 'Tab') return;\n const focusable = container.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n cancelAnimationFrame(raf);\n document.removeEventListener('keydown', handleKeyDown);\n if (previousFocus.current instanceof HTMLElement) {\n previousFocus.current.focus();\n }\n };\n }, [active, containerRef, onEscape]);\n}\n\nfunction useScrollLock(active: boolean) {\n useEffect(() => {\n if (!active) return;\n const scrollbarWidth =\n window.innerWidth - document.documentElement.clientWidth;\n const prevOverflow = document.body.style.overflow;\n const prevPaddingRight = document.body.style.paddingRight;\n document.body.style.overflow = 'hidden';\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n return () => {\n document.body.style.overflow = prevOverflow;\n document.body.style.paddingRight = prevPaddingRight;\n };\n }, [active]);\n}\n\n// --- Component ---\n\nexport function DauthProfileModal({ open, onClose }: DauthProfileModalProps) {\n const { user, domain, updateUser, deleteAccount } = useDauth();\n const isDesktop = useMediaQuery('(min-width: 641px)');\n const phase = useModalAnimation(open);\n const modalRef = useRef<HTMLDivElement>(null);\n\n // Form state\n const [name, setName] = useState('');\n const [lastname, setLastname] = useState('');\n const [nickname, setNickname] = useState('');\n const [country, setCountry] = useState('');\n const [populated, setPopulated] = useState(false);\n\n // Status\n const [saving, setSaving] = useState(false);\n const [status, setStatus] = useState<{\n type: 'success' | 'error';\n message: string;\n } | null>(null);\n\n // Delete\n const [showDelete, setShowDelete] = useState(false);\n const [deleteText, setDeleteText] = useState('');\n const [deleting, setDeleting] = useState(false);\n\n // Populate form when modal opens\n useEffect(() => {\n if (open && user?._id && !populated) {\n setName(user.name || '');\n setLastname(user.lastname || '');\n setNickname(user.nickname || '');\n setCountry(user.country || '');\n setPopulated(true);\n }\n if (!open) {\n setPopulated(false);\n setStatus(null);\n setShowDelete(false);\n setDeleteText('');\n }\n }, [open, user, populated]);\n\n // Auto-clear success message\n useEffect(() => {\n if (status?.type !== 'success') return;\n const timer = setTimeout(() => setStatus(null), SUCCESS_TIMEOUT_MS);\n return () => clearTimeout(timer);\n }, [status]);\n\n useFocusTrap(modalRef, phase === 'entered', onClose);\n useScrollLock(phase !== 'exited');\n\n const hasField = useCallback(\n (field: string) =>\n domain.formFields?.some((f) => f.field === field) ?? false,\n [domain.formFields]\n );\n\n const isRequired = useCallback(\n (field: string) =>\n domain.formFields?.find((f) => f.field === field)?.required ?? false,\n [domain.formFields]\n );\n\n const hasChanges = useMemo(() => {\n if (!user?._id) return false;\n return (\n name !== (user.name || '') ||\n lastname !== (user.lastname || '') ||\n nickname !== (user.nickname || '') ||\n country !== (user.country || '')\n );\n }, [name, lastname, nickname, country, user]);\n\n const canSave = name.trim().length > 0 && hasChanges && !saving;\n\n const handleSave = useCallback(async () => {\n setSaving(true);\n setStatus(null);\n const fields: Record<string, string> = { name };\n if (hasField('lastname')) fields.lastname = lastname;\n if (hasField('nickname')) fields.nickname = nickname;\n if (hasField('country')) fields.country = country;\n const ok = await updateUser(fields);\n setSaving(false);\n if (ok) {\n setStatus({\n type: 'success',\n message: 'Profile updated successfully',\n });\n } else {\n setStatus({\n type: 'error',\n message: 'Something went wrong. Please try again.',\n });\n }\n }, [name, lastname, nickname, country, hasField, updateUser]);\n\n const handleDelete = useCallback(async () => {\n setDeleting(true);\n const ok = await deleteAccount();\n setDeleting(false);\n if (ok) {\n onClose();\n } else {\n setStatus({\n type: 'error',\n message: 'Could not delete account. Please try again.',\n });\n setShowDelete(false);\n setDeleteText('');\n }\n }, [deleteAccount, onClose]);\n\n if (phase === 'exited') return null;\n\n const dur = isDesktop ? TRANSITION_MS : MOBILE_TRANSITION_MS;\n const easing = 'cubic-bezier(0.16, 1, 0.3, 1)';\n\n const backdrop: React.CSSProperties = {\n position: 'fixed',\n inset: 0,\n zIndex: 2147483647,\n backgroundColor: 'var(--dauth-backdrop, rgba(0, 0, 0, 0.6))',\n backdropFilter: 'blur(4px)',\n WebkitBackdropFilter: 'blur(4px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n opacity: phase === 'entered' ? 1 : 0,\n transition: `opacity ${dur}ms ease-out`,\n };\n\n const modalDesktop: React.CSSProperties = {\n position: 'relative',\n width: '100%',\n maxWidth: 480,\n maxHeight: '90vh',\n margin: 16,\n backgroundColor: 'var(--dauth-surface, #1a1a2e)',\n borderRadius: 'var(--dauth-radius, 12px)',\n boxShadow: 'var(--dauth-shadow, 0 25px 50px -12px rgba(0, 0, 0, 0.5))',\n border: '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n fontFamily:\n 'var(--dauth-font-family, system-ui, -apple-system, sans-serif)',\n color: 'var(--dauth-text-primary, #e4e4e7)',\n opacity: phase === 'entered' ? 1 : 0,\n transform: phase === 'entered' ? 'translateY(0)' : 'translateY(16px)',\n transition: `opacity ${dur}ms ${easing}, transform ${dur}ms ${easing}`,\n };\n\n const modalMobile: React.CSSProperties = {\n position: 'fixed',\n inset: 0,\n backgroundColor: 'var(--dauth-surface, #1a1a2e)',\n display: 'flex',\n flexDirection: 'column',\n fontFamily:\n 'var(--dauth-font-family, system-ui, -apple-system, sans-serif)',\n color: 'var(--dauth-text-primary, #e4e4e7)',\n transform: phase === 'entered' ? 'translateY(0)' : 'translateY(100%)',\n transition: `transform ${dur}ms ${easing}`,\n };\n\n const avatarInitial = (user.name || user.email || '?')\n .charAt(0)\n .toUpperCase();\n\n return createPortal(\n <>\n <style\n dangerouslySetInnerHTML={{\n __html: '@keyframes dauth-spin{to{transform:rotate(360deg)}}',\n }}\n />\n <div\n style={backdrop}\n onClick={isDesktop ? onClose : undefined}\n data-testid=\"dauth-profile-backdrop\"\n >\n <div\n ref={modalRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dauth-profile-title\"\n style={isDesktop ? modalDesktop : modalMobile}\n onClick={(e) => e.stopPropagation()}\n tabIndex={-1}\n >\n {/* Header */}\n <div style={headerStyle(isDesktop)}>\n <button\n type=\"button\"\n onClick={onClose}\n style={closeBtn}\n aria-label=\"Close\"\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'var(--dauth-surface-hover, #232340)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor = 'transparent')\n }\n >\n {isDesktop ? <IconClose /> : <IconBack />}\n </button>\n <h2 id=\"dauth-profile-title\" style={titleStyle}>\n Your Profile\n </h2>\n <div style={{ width: 36 }} />\n </div>\n\n {/* Scrollable body */}\n <div style={bodyStyle}>\n {/* Avatar */}\n <div style={avatarSection}>\n <div style={avatarCircle}>\n {user.avatar?.url ? (\n <img\n src={user.avatar.url}\n alt=\"\"\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n }}\n />\n ) : (\n avatarInitial\n )}\n </div>\n <div style={emailText}>{user.email}</div>\n </div>\n\n {/* Status */}\n {status && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n style={statusMsg(status.type)}\n >\n {status.message}\n </div>\n )}\n\n {/* Form */}\n <div>\n <div style={fieldGroup}>\n <label htmlFor=\"dauth-name\" style={label}>\n Name *\n </label>\n <input\n id=\"dauth-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Your name\"\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n\n {hasField('lastname') && (\n <div style={fieldGroup}>\n <label htmlFor=\"dauth-lastname\" style={label}>\n Last name\n {isRequired('lastname') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-lastname\"\n type=\"text\"\n value={lastname}\n onChange={(e) => setLastname(e.target.value)}\n placeholder=\"Your last name\"\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n )}\n\n {hasField('nickname') && (\n <div style={fieldGroup}>\n <label htmlFor=\"dauth-nickname\" style={label}>\n Nickname\n {isRequired('nickname') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-nickname\"\n type=\"text\"\n value={nickname}\n onChange={(e) => setNickname(e.target.value)}\n placeholder=\"Choose a nickname\"\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n )}\n\n {hasField('country') && (\n <div style={fieldGroup}>\n <label htmlFor=\"dauth-country\" style={label}>\n Country\n {isRequired('country') ? ' *' : ''}\n </label>\n <input\n id=\"dauth-country\"\n type=\"text\"\n value={country}\n onChange={(e) => setCountry(e.target.value)}\n placeholder=\"Your country\"\n disabled={saving}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n />\n </div>\n )}\n </div>\n\n {/* Danger zone */}\n <hr style={separator} />\n <div>\n <div style={dangerTitle}>Delete account</div>\n <div style={dangerDesc}>\n Permanently delete your account and all associated data.\n </div>\n {!showDelete ? (\n <button\n type=\"button\"\n style={deleteBtn}\n onClick={() => setShowDelete(true)}\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'rgba(239, 68, 68, 0.2)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'var(--dauth-error-bg, rgba(239, 68, 68, 0.1))')\n }\n >\n Delete account\n </button>\n ) : (\n <div style={deletePanel}>\n <div style={deletePanelText}>\n This action is permanent and cannot be undone. Type{' '}\n <strong>{CONFIRM_WORD}</strong> to confirm.\n </div>\n <input\n type=\"text\"\n value={deleteText}\n onChange={(e) => setDeleteText(e.target.value)}\n placeholder={`Type ${CONFIRM_WORD}`}\n style={input}\n onFocus={inputFocusHandler}\n onBlur={inputBlurHandler}\n disabled={deleting}\n />\n <div\n style={{\n display: 'flex',\n gap: 8,\n marginTop: 12,\n }}\n >\n <button\n type=\"button\"\n style={cancelBtn}\n onClick={() => {\n setShowDelete(false);\n setDeleteText('');\n }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.backgroundColor =\n 'var(--dauth-surface-hover, #232340)')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.backgroundColor = 'transparent')\n }\n >\n Cancel\n </button>\n <button\n type=\"button\"\n style={{\n ...deleteConfirmBtn,\n opacity:\n deleteText !== CONFIRM_WORD || deleting ? 0.5 : 1,\n cursor:\n deleteText !== CONFIRM_WORD || deleting\n ? 'not-allowed'\n : 'pointer',\n }}\n disabled={deleteText !== CONFIRM_WORD || deleting}\n onClick={handleDelete}\n >\n {deleting && <Spinner />}\n Delete my account\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\n <div style={footerStyle(isDesktop)}>\n <button\n type=\"button\"\n style={{\n ...saveBtn,\n opacity: canSave ? 1 : 0.5,\n cursor: canSave ? 'pointer' : 'not-allowed',\n }}\n disabled={!canSave}\n onClick={handleSave}\n aria-busy={saving}\n onMouseEnter={(e) => {\n if (canSave)\n e.currentTarget.style.backgroundColor =\n 'var(--dauth-accent-hover, #818cf8)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor =\n 'var(--dauth-accent, #6366f1)';\n }}\n >\n {saving && <Spinner />}\n {saving ? 'Saving...' : 'Save changes'}\n </button>\n </div>\n </div>\n </div>\n </>,\n document.body\n );\n}\n\n// --- Style constants ---\n\nconst headerStyle = (isDesktop: boolean): React.CSSProperties => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '16px 24px',\n borderBottom: '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n flexShrink: 0,\n ...(!isDesktop\n ? {\n position: 'sticky' as const,\n top: 0,\n zIndex: 1,\n backgroundColor: 'var(--dauth-surface, #1a1a2e)',\n }\n : {}),\n});\n\nconst titleStyle: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-lg, 1.25rem)',\n fontWeight: 600,\n margin: 0,\n lineHeight: 1.4,\n textAlign: 'center',\n flex: 1,\n};\n\nconst closeBtn: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 36,\n height: 36,\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n border: 'none',\n backgroundColor: 'transparent',\n color: 'var(--dauth-text-secondary, #a1a1aa)',\n cursor: 'pointer',\n transition: 'background-color 150ms, color 150ms',\n padding: 0,\n};\n\nconst bodyStyle: React.CSSProperties = {\n flex: 1,\n overflowY: 'auto',\n padding: 24,\n WebkitOverflowScrolling: 'touch',\n};\n\nconst avatarSection: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n marginBottom: 24,\n gap: 8,\n};\n\nconst avatarCircle: React.CSSProperties = {\n width: 64,\n height: 64,\n borderRadius: '50%',\n backgroundColor: 'var(--dauth-accent, #6366f1)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n color: '#ffffff',\n fontSize: '1.5rem',\n fontWeight: 600,\n};\n\nconst emailText: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n color: 'var(--dauth-text-secondary, #a1a1aa)',\n};\n\nconst statusMsg = (type: 'success' | 'error'): React.CSSProperties => ({\n padding: '10px 14px',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n marginBottom: 16,\n backgroundColor:\n type === 'success'\n ? 'var(--dauth-success-bg, rgba(34, 197, 94, 0.1))'\n : 'var(--dauth-error-bg, rgba(239, 68, 68, 0.1))',\n color:\n type === 'success'\n ? 'var(--dauth-success, #22c55e)'\n : 'var(--dauth-error, #ef4444)',\n textAlign: 'center',\n lineHeight: 1.5,\n});\n\nconst fieldGroup: React.CSSProperties = { marginBottom: 16 };\n\nconst label: React.CSSProperties = {\n display: 'block',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color: 'var(--dauth-text-primary, #e4e4e7)',\n marginBottom: 6,\n};\n\nconst input: React.CSSProperties = {\n width: '100%',\n padding: '10px 14px',\n fontSize: 'var(--dauth-font-size-base, 1rem)',\n lineHeight: 1.5,\n color: 'var(--dauth-text-primary, #e4e4e7)',\n backgroundColor: 'var(--dauth-surface-secondary, rgba(255, 255, 255, 0.04))',\n border: '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n borderRadius: 'var(--dauth-radius-input, 8px)',\n outline: 'none',\n transition: 'border-color 150ms, box-shadow 150ms',\n boxSizing: 'border-box' as const,\n fontFamily: 'inherit',\n};\n\nconst inputFocusHandler = (e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.style.borderColor =\n 'var(--dauth-border-focus, rgba(99, 102, 241, 0.5))';\n e.currentTarget.style.boxShadow = '0 0 0 3px rgba(99, 102, 241, 0.15)';\n};\n\nconst inputBlurHandler = (e: React.FocusEvent<HTMLInputElement>) => {\n e.currentTarget.style.borderColor =\n 'var(--dauth-border, rgba(255, 255, 255, 0.08))';\n e.currentTarget.style.boxShadow = 'none';\n};\n\nconst separator: React.CSSProperties = {\n height: 1,\n backgroundColor: 'var(--dauth-border, rgba(255, 255, 255, 0.08))',\n margin: '24px 0',\n border: 'none',\n};\n\nconst dangerTitle: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 600,\n color: 'var(--dauth-error, #ef4444)',\n marginBottom: 4,\n};\n\nconst dangerDesc: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-xs, 0.75rem)',\n color: 'var(--dauth-text-muted, #71717a)',\n marginBottom: 12,\n lineHeight: 1.5,\n};\n\nconst deleteBtn: React.CSSProperties = {\n padding: '8px 16px',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color: 'var(--dauth-error, #ef4444)',\n backgroundColor: 'var(--dauth-error-bg, rgba(239, 68, 68, 0.1))',\n border: '1px solid rgba(239, 68, 68, 0.2)',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'background-color 150ms, border-color 150ms',\n fontFamily: 'inherit',\n};\n\nconst deletePanel: React.CSSProperties = {\n marginTop: 12,\n padding: 16,\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n border: '1px solid rgba(239, 68, 68, 0.3)',\n backgroundColor: 'var(--dauth-error-bg, rgba(239, 68, 68, 0.1))',\n};\n\nconst deletePanelText: React.CSSProperties = {\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n color: 'var(--dauth-text-primary, #e4e4e7)',\n marginBottom: 12,\n lineHeight: 1.5,\n};\n\nconst cancelBtn: React.CSSProperties = {\n flex: 1,\n padding: '8px 16px',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color: 'var(--dauth-text-secondary, #a1a1aa)',\n backgroundColor: 'transparent',\n border: '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'background-color 150ms',\n fontFamily: 'inherit',\n};\n\nconst deleteConfirmBtn: React.CSSProperties = {\n flex: 1,\n padding: '8px 16px',\n fontSize: 'var(--dauth-font-size-sm, 0.875rem)',\n fontWeight: 500,\n color: '#ffffff',\n backgroundColor: 'var(--dauth-error, #ef4444)',\n border: 'none',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n cursor: 'pointer',\n transition: 'opacity 150ms',\n fontFamily: 'inherit',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n};\n\nconst footerStyle = (isDesktop: boolean): React.CSSProperties => ({\n padding: '16px 24px',\n borderTop: '1px solid var(--dauth-border, rgba(255, 255, 255, 0.08))',\n flexShrink: 0,\n ...(!isDesktop\n ? {\n position: 'sticky' as const,\n bottom: 0,\n zIndex: 1,\n backgroundColor: 'var(--dauth-surface, #1a1a2e)',\n paddingBottom: 'max(16px, env(safe-area-inset-bottom))',\n }\n : {}),\n});\n\nconst saveBtn: React.CSSProperties = {\n width: '100%',\n padding: '12px 24px',\n fontSize: 'var(--dauth-font-size-base, 1rem)',\n fontWeight: 600,\n color: '#ffffff',\n backgroundColor: 'var(--dauth-accent, #6366f1)',\n border: 'none',\n borderRadius: 'var(--dauth-radius-sm, 8px)',\n transition: 'opacity 150ms, background-color 150ms',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n fontFamily: 'inherit',\n};\n\nconst spinnerStyle: React.CSSProperties = {\n display: 'inline-block',\n width: 16,\n height: 16,\n border: '2px solid rgba(255, 255, 255, 0.3)',\n borderTopColor: '#ffffff',\n borderRadius: '50%',\n animation: 'dauth-spin 0.6s linear infinite',\n};\n"],"mappings":"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","names":["import_react","import_jsx_runtime"]}
|