From 11e79aa4f92c41cc6f3402c504f4909a15b0692c Mon Sep 17 00:00:00 2001 From: saravanakumardb1 Date: Thu, 12 Feb 2026 22:21:25 -0800 Subject: [PATCH] feat(react-auth): add onLoginFallback to createAuthProvider config Allows dashboards to provide fallback login logic (e.g. mock credentials) when the API is unavailable. Used by admin-dashboard-web. --- packages/react-auth/src/auth-context.tsx | 14 +++++++++++++- packages/react-auth/src/index.ts | 2 +- packages/react-auth/src/types.ts | 17 ++++++++++++----- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/packages/react-auth/src/auth-context.tsx b/packages/react-auth/src/auth-context.tsx index 4b2f93c6..8e017566 100644 --- a/packages/react-auth/src/auth-context.tsx +++ b/packages/react-auth/src/auth-context.tsx @@ -21,7 +21,7 @@ import type { AuthConfig, AuthContextValue, BaseUser } from './types.js'; * ``` */ export function createAuthProvider(config: AuthConfig) { - const { storagePrefix, loginEndpoint, mapLoginResponse, onLogout } = config; + const { storagePrefix, loginEndpoint, mapLoginResponse, onLoginFallback, onLogout } = config; const USER_KEY = `${storagePrefix}_auth_user`; const TOKEN_KEY = `${storagePrefix}_access_token`; @@ -64,6 +64,18 @@ export function createAuthProvider(config: Au return true; } + // Try fallback (e.g. mock credentials) when API is unavailable + if (error && onLoginFallback) { + const fallback = await onLoginFallback(email, password, error); + if (fallback) { + setUser(fallback.user); + localStorage.setItem(USER_KEY, JSON.stringify(fallback.user)); + localStorage.setItem(TOKEN_KEY, fallback.accessToken); + localStorage.setItem(REFRESH_KEY, fallback.refreshToken); + return true; + } + } + return false; }, [api] diff --git a/packages/react-auth/src/index.ts b/packages/react-auth/src/index.ts index 98b38bab..549ad3de 100644 --- a/packages/react-auth/src/index.ts +++ b/packages/react-auth/src/index.ts @@ -1,2 +1,2 @@ export { createAuthProvider } from './auth-context.js'; -export type { BaseUser, AuthContextValue, AuthConfig } from './types.js'; +export type { BaseUser, AuthContextValue, AuthConfig, LoginResult } from './types.js'; diff --git a/packages/react-auth/src/types.ts b/packages/react-auth/src/types.ts index 464965d2..0aff152f 100644 --- a/packages/react-auth/src/types.ts +++ b/packages/react-auth/src/types.ts @@ -13,13 +13,20 @@ export interface AuthContextValue { logout: () => void; } +export interface LoginResult { + user: TUser; + accessToken: string; + refreshToken: string; +} + export interface AuthConfig { storagePrefix: string; loginEndpoint: string; - mapLoginResponse: (data: unknown) => { - user: TUser; - accessToken: string; - refreshToken: string; - }; + mapLoginResponse: (data: unknown) => LoginResult; + onLoginFallback?: ( + email: string, + password: string, + error: string + ) => Promise | null>; onLogout?: () => void; }