Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/light-days-sin.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@asgardeo/javascript': minor
'@asgardeo/react': minor
---

Add support to pass `instanceId` externally through `AsgardeoProvider` props to allow multi-organization setups
5 changes: 5 additions & 0 deletions packages/javascript/src/models/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,11 @@ export interface BaseConfig<T = unknown> extends WithPreferences {
* The values should be defined at the framework layer.
*/
storage?: T;
/**
* Optional instance ID for multi-auth context support.
* Use this when you need multiple authentication contexts in the same application.
*/
instanceId?: number;
}

export interface WithPreferences {
Expand Down
18 changes: 16 additions & 2 deletions packages/react/src/AsgardeoReactClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,26 @@ import getAllOrganizations from './api/getAllOrganizations';
class AsgardeoReactClient<T extends AsgardeoReactConfig = AsgardeoReactConfig> extends AsgardeoBrowserClient<T> {
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;
}

/**
Expand Down
14 changes: 12 additions & 2 deletions packages/react/src/__temp__/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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;
}
Expand Down
3 changes: 2 additions & 1 deletion packages/react/src/contexts/Asgardeo/AsgardeoProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,11 @@ const AsgardeoProvider: FC<PropsWithChildren<AsgardeoProviderProps>> = ({
applicationId,
signInOptions,
syncSession,
instanceId = 0,
...rest
}: PropsWithChildren<AsgardeoProviderProps>): ReactElement => {
const reRenderCheckRef: RefObject<boolean> = useRef(false);
const asgardeo: AsgardeoReactClient = useMemo(() => new AsgardeoReactClient(), []);
const asgardeo: AsgardeoReactClient = useMemo(() => new AsgardeoReactClient(instanceId), [instanceId]);
const {hasAuthParams} = useBrowserUrl();
const [user, setUser] = useState<any | null>(null);
const [currentOrganization, setCurrentOrganization] = useState<Organization | null>(null);
Expand Down
Loading