@@ -7,13 +7,14 @@ import Button from '@/widgets/button';
77import logger from '@/utils/logger' ;
88import { CommandToXRPMgr } from '@/managers/commandstoxrpmgr' ;
99import { Constants } from '@/utils/constants' ;
10- import AppMgr , { EventType , LoginStatus } from '@/managers/appmgr' ;
10+ import AppMgr , { EventType , LoginStatus , Themes } from '@/managers/appmgr' ;
1111import Login from '@/widgets/login' ;
1212import { UserProfile } from '@/services/google-auth' ;
1313import { fireGoogleUserTree , getUsernameFromEmail } from '@/utils/google-utils' ;
1414import { useTranslation } from 'react-i18next' ;
1515import TabList from '../tab-list' ;
1616import TabItem from '../tab-item' ;
17+ import AnimatedThemeToggle from '@/widgets/animated-theme-toggle' ;
1718
1819type SettingsProps = {
1920 /**
@@ -40,6 +41,8 @@ function SettingsDlg({ isXrpConnected, toggleDialog }: SettingsProps) {
4041 const [ adminData , setAdminData ] = useState < AdminData | undefined > ( undefined ) ;
4142 const [ isValidUsername , setIsValidUsername ] = useState < boolean | null > ( null ) ;
4243 const [ LSXrpUser , setLSXrpUser ] = useLocalStorage ( StorageKeys . XRPUSER , '' ) ;
44+ const [ , setTheme ] = useLocalStorage ( StorageKeys . THEME , Themes . LIGHT ) ;
45+
4346 const modeLogger = logger . child ( { module : 'modes' } ) ;
4447
4548 const authService = AppMgr . getInstance ( ) . authService ;
@@ -325,6 +328,30 @@ function SettingsDlg({ isXrpConnected, toggleDialog }: SettingsProps) {
325328 }
326329 } ;
327330
331+
332+ /**
333+ * onThemeToggle - toggle theme callback
334+ * @param state
335+ */
336+ const onThemeToggle = ( state : Themes ) => {
337+ // 1. Update the class for Tailwind CSS theming
338+ if ( state === Themes . DARK ) {
339+ document . documentElement . classList . add ( Themes . DARK ) ;
340+ document . documentElement . classList . remove ( Themes . LIGHT ) ;
341+ } else if ( state === Themes . LIGHT ) {
342+ document . documentElement . classList . add ( Themes . LIGHT ) ;
343+ document . documentElement . classList . remove ( Themes . DARK ) ;
344+ }
345+ setTheme ( state ) ;
346+
347+ // 2. Emit a global event to notify other components (like flexlayout)
348+ AppMgr . getInstance ( ) . setTheme ( state ) ;
349+ } ;
350+
351+ /**
352+ * onLoginSuccess - Google authentication callback
353+ * @param data
354+ */
328355 const onLoginSuccess = async ( data : UserProfile ) => {
329356 AppMgr . getInstance ( ) . emit ( EventType . EVENT_LOGIN_STATUS , LoginStatus . LOGGED_IN ) ;
330357 const username = getUsernameFromEmail ( data . email ) ;
@@ -366,8 +393,8 @@ function SettingsDlg({ isXrpConnected, toggleDialog }: SettingsProps) {
366393 return (
367394 < div className = "flex flex-col items-center gap-4 rounded-md border border-mountain-mist-700 p-8 shadow-md transition-all dark:border-shark-500 dark:bg-shark-950" >
368395 < div className = "flex w-[80%] flex-col items-center" >
369- < h1 className = "text-lg font-bold text-mountain-mist-700" > { t ( 'settings' ) } </ h1 >
370- < p className = "text-sm text-mountain-mist-700" > { t ( 'settingDescription' ) } </ p >
396+ < h1 className = "text-lg font-bold text-mountain-mist-700 dark:text-mountain-mist-300 " > { t ( 'settings' ) } </ h1 >
397+ < p className = "text-sm text-mountain-mist-700 dark:text-mountain-mist-300 " > { t ( 'settingDescription' ) } </ p >
371398 </ div >
372399 < hr className = "w-full border-mountain-mist-600" />
373400 < TabList activeTabIndex = { 0 } >
@@ -463,6 +490,16 @@ function SettingsDlg({ isXrpConnected, toggleDialog }: SettingsProps) {
463490 </ select >
464491 </ div >
465492 </ TabItem >
493+ < TabItem label = { t ( 'theme.label' ) } isActive = { false } >
494+ < div className = "flex w-full flex-col gap-2 mt-2" >
495+ < AnimatedThemeToggle
496+ labelLeft = { t ( 'theme.light' ) }
497+ labelRight = { t ( 'theme.dark' ) }
498+ initial = { document . documentElement . classList . contains ( 'dark' ) }
499+ onToggle = { onThemeToggle }
500+ />
501+ </ div >
502+ </ TabItem >
466503 </ TabList >
467504 < hr className = "w-full border-mountain-mist-600" />
468505 < DialogFooter
0 commit comments