Skip to content

Commit dc2a632

Browse files
committed
feat(react): integrate getActiveTheme function for dynamic theme handling across components
1 parent 89119e3 commit dc2a632

File tree

8 files changed

+78
-16
lines changed

8 files changed

+78
-16
lines changed

packages/browser/src/__legacy__/client.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,9 @@ export class AsgardeoSPAClient {
411411
}
412412

413413
return response;
414+
})
415+
.catch(error => {
416+
return Promise.reject(error)
414417
});
415418
}
416419

packages/browser/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,5 +58,6 @@ export {
5858
createMediaQueryListener,
5959
BrowserThemeDetection,
6060
} from './theme/themeDetection';
61+
export {default as getActiveTheme} from './theme/getActiveTheme';
6162

6263
export {default as http} from './utils/http';
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/**
2+
* Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).
3+
*
4+
* WSO2 LLC. licenses this file to you under the Apache License,
5+
* Version 2.0 (the "License"); you may not use this file except
6+
* in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing,
12+
* software distributed under the License is distributed on an
13+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
* KIND, either express or implied. See the License for the
15+
* specific language governing permissions and limitations
16+
* under the License.
17+
*/
18+
19+
import {DEFAULT_THEME, ThemeMode} from '@asgardeo/javascript';
20+
import {BrowserThemeDetection, detectThemeMode} from './themeDetection';
21+
22+
/**
23+
* Gets the active theme based on the theme mode preference
24+
* @param mode - The theme mode preference ('light', 'dark', 'system', or 'class')
25+
* @param config - Additional configuration for theme detection
26+
* @returns 'light' or 'dark' based on the resolved theme
27+
*/
28+
const getActiveTheme = (mode: ThemeMode, config: BrowserThemeDetection = {}): ThemeMode => {
29+
if (mode === 'dark') {
30+
return 'dark';
31+
}
32+
33+
if (mode === 'light') {
34+
return 'light';
35+
}
36+
37+
if (mode === 'system') {
38+
if (typeof window !== 'undefined' && window.matchMedia) {
39+
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
40+
}
41+
42+
// Default to light mode if system detection is not available
43+
return DEFAULT_THEME;
44+
}
45+
46+
if (mode === 'class') {
47+
return detectThemeMode(mode, config);
48+
}
49+
50+
// Default to light mode for any unknown mode
51+
return DEFAULT_THEME;
52+
};
53+
54+
export default getActiveTheme;

packages/javascript/src/index.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,17 @@
1616
* under the License.
1717
*/
1818

19-
export * from './__legacy__/client';
20-
export * from './__legacy__/models';
19+
export {AsgardeoAuthClient} from './__legacy__/client';
20+
export {
21+
DefaultAuthClientConfig,
22+
WellKnownAuthClientConfig,
23+
BaseURLAuthClientConfig,
24+
ExplicitAuthClientConfig,
25+
StrictAuthClientConfig,
26+
AuthClientConfig,
27+
} from './__legacy__/models';
2128

22-
export * from './IsomorphicCrypto';
29+
export {IsomorphicCrypto} from './IsomorphicCrypto';
2330

2431
export {default as initializeEmbeddedSignInFlow} from './api/initializeEmbeddedSignInFlow';
2532
export {default as executeEmbeddedSignInFlow} from './api/executeEmbeddedSignInFlow';

packages/nextjs/src/client/contexts/Asgardeo/AsgardeoProvider.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import {
4040
AsgardeoProviderProps,
4141
OrganizationProvider,
4242
BrandingProvider,
43+
getActiveTheme,
4344
} from '@asgardeo/react';
4445
import {useRouter, useSearchParams} from 'next/navigation';
4546
import {FC, PropsWithChildren, RefObject, useEffect, useMemo, useRef, useState} from 'react';
@@ -308,7 +309,11 @@ const AsgardeoClientProvider: FC<PropsWithChildren<AsgardeoClientProviderProps>>
308309
<AsgardeoContext.Provider value={contextValue}>
309310
<I18nProvider preferences={preferences?.i18n}>
310311
<BrandingProvider brandingPreference={brandingPreference}>
311-
<ThemeProvider theme={preferences?.theme?.overrides} mode={isDarkMode ? 'dark' : 'light'}>
312+
<ThemeProvider
313+
theme={preferences?.theme?.overrides}
314+
mode={getActiveTheme(preferences?.theme?.mode as any)}
315+
inheritFromBranding
316+
>
312317
<FlowProvider>
313318
<UserProvider profile={userProfile} onUpdateProfile={handleProfileUpdate} updateProfile={updateProfile}>
314319
<OrganizationProvider

packages/react/src/components/actions/SignInButton/SignInButton.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ const SignInButton: ForwardRefExoticComponent<SignInButtonProps & RefAttributes<
9999
}
100100
} catch (error) {
101101
throw new AsgardeoRuntimeError(
102-
`Sign in failed: ${error instanceof Error ? error.message : String(error)}`,
102+
`Sign in failed: ${error instanceof Error ? error.message : String(JSON.stringify(error))}`,
103103
'SignInButton-handleSignIn-RuntimeError-001',
104104
'react',
105105
'Something went wrong while trying to sign in. Please try again later.',

packages/react/src/contexts/Asgardeo/AsgardeoProvider.tsx

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import {
2727
GetBrandingPreferenceConfig,
2828
BrandingPreference,
2929
IdToken,
30-
DEFAULT_THEME,
30+
getActiveTheme,
3131
} from '@asgardeo/browser';
3232
import {FC, RefObject, PropsWithChildren, ReactElement, useEffect, useMemo, useRef, useState, useCallback} from 'react';
3333
import AsgardeoContext from './AsgardeoContext';
@@ -399,14 +399,6 @@ const AsgardeoProvider: FC<PropsWithChildren<AsgardeoProviderProps>> = ({
399399
}
400400
};
401401

402-
const isDarkMode: boolean = useMemo(() => {
403-
if (preferences.theme.mode === 'system') {
404-
return window.matchMedia('(prefers-color-scheme: dark)').matches;
405-
}
406-
407-
return preferences.theme.mode === DEFAULT_THEME;
408-
}, [preferences?.theme?.mode]);
409-
410402
const handleProfileUpdate = (payload: User): void => {
411403
setUser(payload);
412404
setUserProfile(prev => ({
@@ -476,7 +468,7 @@ const AsgardeoProvider: FC<PropsWithChildren<AsgardeoProviderProps>> = ({
476468
<ThemeProvider
477469
inheritFromBranding={preferences?.theme?.inheritFromBranding}
478470
theme={preferences?.theme?.overrides}
479-
mode={isDarkMode ? 'dark' : 'light'}
471+
mode={getActiveTheme(preferences.theme.mode)}
480472
>
481473
<FlowProvider>
482474
<UserProvider profile={userProfile} onUpdateProfile={handleProfileUpdate}>

packages/react/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,4 +273,4 @@ export {default as updateMeProfile, UpdateMeProfileConfig} from './api/updateMeP
273273
export {default as getMeProfile} from './api/getScim2Me';
274274
export * from './api/getScim2Me';
275275

276-
export {AsgardeoRuntimeError, http} from '@asgardeo/browser';
276+
export {AsgardeoRuntimeError, http, getActiveTheme} from '@asgardeo/browser';

0 commit comments

Comments
 (0)