From e68a2eff78650288ba9e966566e9d0778010c95e Mon Sep 17 00:00:00 2001 From: kavindadewmith Date: Thu, 22 Jan 2026 14:17:26 +0530 Subject: [PATCH] Add support for multi-auth context with instance ID in AsgardeoReactClient and AuthAPI --- packages/react/src/AsgardeoReactClient.ts | 18 ++++++++++++++++-- packages/react/src/__temp__/api.ts | 14 ++++++++++++-- .../src/contexts/Asgardeo/AsgardeoProvider.tsx | 3 ++- packages/react/src/models/config.ts | 9 ++++++++- 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/packages/react/src/AsgardeoReactClient.ts b/packages/react/src/AsgardeoReactClient.ts index 85d494f4..e581602d 100644 --- a/packages/react/src/AsgardeoReactClient.ts +++ b/packages/react/src/AsgardeoReactClient.ts @@ -68,12 +68,26 @@ import getAllOrganizations from './api/getAllOrganizations'; class AsgardeoReactClient extends AsgardeoBrowserClient { private asgardeo: AuthAPI; private _isLoading: boolean = false; + private _instanceId: number; - constructor() { + /** + * Creates a new AsgardeoReactClient instance. + * @param instanceId - Optional instance ID for multi-auth context support. Defaults to 0 for backward compatibility. + */ + constructor(instanceId: number = 0) { super(); + this._instanceId = instanceId; // FIXME: This has to be the browser client from `@asgardeo/browser` package. - this.asgardeo = new AuthAPI(); + this.asgardeo = new AuthAPI(undefined, instanceId); + } + + /** + * Get the instance ID for this client. + * @returns The instance ID used for multi-auth context support. + */ + public getInstanceId(): number { + return this._instanceId; } /** diff --git a/packages/react/src/__temp__/api.ts b/packages/react/src/__temp__/api.ts index 35a21908..ca6064ee 100644 --- a/packages/react/src/__temp__/api.ts +++ b/packages/react/src/__temp__/api.ts @@ -37,11 +37,13 @@ class AuthAPI { private _authState = AuthAPI.DEFAULT_STATE; private _client: AsgardeoSPAClient; + private _instanceId: number; private _isLoading: boolean; - constructor(spaClient?: AsgardeoSPAClient) { - this._client = spaClient ?? AsgardeoSPAClient.getInstance(); + constructor(spaClient?: AsgardeoSPAClient, instanceId: number = 0) { + this._instanceId = instanceId; + this._client = spaClient ?? AsgardeoSPAClient.getInstance(instanceId); this.getState = this.getState.bind(this); this.init = this.init.bind(this); @@ -50,6 +52,14 @@ class AuthAPI { this.updateState = this.updateState.bind(this); } + /** + * Get the instance ID for this AuthAPI instance. + * @returns The instance ID used for multi-auth context support. + */ + public getInstanceId(): number { + return this._instanceId; + } + public _setIsLoading(isLoading: boolean): void { this._isLoading = isLoading; } diff --git a/packages/react/src/contexts/Asgardeo/AsgardeoProvider.tsx b/packages/react/src/contexts/Asgardeo/AsgardeoProvider.tsx index 797ea191..10f683ef 100644 --- a/packages/react/src/contexts/Asgardeo/AsgardeoProvider.tsx +++ b/packages/react/src/contexts/Asgardeo/AsgardeoProvider.tsx @@ -64,10 +64,11 @@ const AsgardeoProvider: FC> = ({ applicationId, signInOptions, syncSession, + instanceId = 0, ...rest }: PropsWithChildren): ReactElement => { const reRenderCheckRef: RefObject = useRef(false); - const asgardeo: AsgardeoReactClient = useMemo(() => new AsgardeoReactClient(), []); + const asgardeo: AsgardeoReactClient = useMemo(() => new AsgardeoReactClient(instanceId), [instanceId]); const {hasAuthParams} = useBrowserUrl(); const [user, setUser] = useState(null); const [currentOrganization, setCurrentOrganization] = useState(null); diff --git a/packages/react/src/models/config.ts b/packages/react/src/models/config.ts index f53fdd48..af4a37de 100644 --- a/packages/react/src/models/config.ts +++ b/packages/react/src/models/config.ts @@ -18,4 +18,11 @@ import {AsgardeoBrowserConfig} from '@asgardeo/browser'; -export type AsgardeoReactConfig = AsgardeoBrowserConfig; +export interface AsgardeoReactConfig extends AsgardeoBrowserConfig { + /** + * Optional instance ID for multi-auth context support. + * Use this when you need multiple authentication contexts in the same application. + * Defaults to 0 for backward compatibility. + */ + instanceId?: number; +} \ No newline at end of file