@@ -28,11 +28,11 @@ export const HeaderUserThemeMenu = () => {
2828 const {
2929 services : { uiSettings } ,
3030 } = useOpenSearchDashboards < CoreStart > ( ) ;
31- const themeOptions = Object . keys ( themeVersionLabelMap ) . map ( ( v ) => ( {
31+ const themeVersionOptions = Object . keys ( themeVersionLabelMap ) . map ( ( v ) => ( {
3232 value : v ,
3333 text : themeVersionLabelMap [ v ] ,
3434 } ) ) ;
35- const screenModeOptions = [
35+ const colorModeOptions = [
3636 {
3737 value : 'light' ,
3838 text : 'Light mode' ,
@@ -46,63 +46,66 @@ export const HeaderUserThemeMenu = () => {
4646 text : 'Use browser settings' ,
4747 } ,
4848 ] ;
49- const defaultTheme = uiSettings . getDefault ( 'theme:version' ) ;
50- const defaultScreenMode = uiSettings . getDefault ( 'theme:darkMode' ) ;
51- const prefersAutomatic =
49+ const defaultThemeVersion = uiSettings . getDefault ( 'theme:version' ) ;
50+ const defaultIsDarkMode = uiSettings . getDefault ( 'theme:darkMode' ) ;
51+ const isUsingBrowserColorScheme =
5252 ( window . localStorage . getItem ( 'useBrowserColorScheme' ) && window . matchMedia ) || false ;
53- const [ darkMode , setDarkMode ] = useUiSetting$ < boolean > ( 'theme:darkMode' ) ;
53+ const [ isDarkMode , setIsDarkMode ] = useUiSetting$ < boolean > ( 'theme:darkMode' ) ;
5454 const [ themeVersion , setThemeVersion ] = useUiSetting$ < string > ( 'theme:version' ) ;
55- const [ isPopoverOpen , setPopover ] = useState ( false ) ;
56- // TODO: improve naming?
57- const [ theme , setTheme ] = useState (
58- themeOptions . find ( ( t ) => t . value === themeVersionValueMap [ themeVersion ] ) ?. value ||
59- themeVersionValueMap [ defaultTheme ]
55+ const [ isPopoverOpen , setIsPopoverOpen ] = useState ( false ) ;
56+
57+ const [ selectedThemeVersion , setSelectedThemeVersion ] = useState (
58+ themeVersionOptions . find ( ( t ) => t . value === themeVersionValueMap [ themeVersion ] ) ?. value ||
59+ themeVersionValueMap [ defaultThemeVersion ]
6060 ) ;
61- const [ screenMode , setScreenMode ] = useState (
62- prefersAutomatic
63- ? screenModeOptions [ 2 ] . value
64- : darkMode
65- ? screenModeOptions [ 1 ] . value
66- : screenModeOptions [ 0 ] . value
61+ const [ selectedColorMode , setSelectedColorMode ] = useState (
62+ isUsingBrowserColorScheme
63+ ? colorModeOptions [ 2 ] . value
64+ : isDarkMode
65+ ? colorModeOptions [ 1 ] . value
66+ : colorModeOptions [ 0 ] . value
6767 ) ;
68-
6968 const useLegacyAppearance = ! uiSettings . get ( 'home:useNewHomePage' ) ;
7069
71- const onButtonClick = ( ) => {
72- setPopover ( ! isPopoverOpen ) ;
70+ const togglePopover = ( ) => {
71+ setIsPopoverOpen ( ! isPopoverOpen ) ;
7372 } ;
7473
75- const onThemeChange = ( e : ChangeEvent < HTMLSelectElement > ) => {
76- setTheme ( e . target . value ) ;
74+ const handleThemeVersionChange = ( e : ChangeEvent < HTMLSelectElement > ) => {
75+ setSelectedThemeVersion ( e . target . value ) ;
7776 } ;
7877
79- const onScreenModeChange = ( e : ChangeEvent < HTMLSelectElement > ) => {
80- setScreenMode ( e . target . value ) ;
78+ const handleColorModeChange = ( e : ChangeEvent < HTMLSelectElement > ) => {
79+ setSelectedColorMode ( e . target . value ) ;
8180 } ;
8281
83- const onAppearanceSubmit = async ( e : SyntheticEvent ) => {
84- const actions = [ setThemeVersion ( themeOptions . find ( ( t ) => theme === t . value ) ?. value ?? '' ) ] ;
82+ const applyAppearanceSettings = async ( e : SyntheticEvent ) => {
83+ const pendingActions = [
84+ setThemeVersion (
85+ themeVersionOptions . find ( ( t ) => selectedThemeVersion === t . value ) ?. value ?? ''
86+ ) ,
87+ ] ;
8588
86- if ( screenMode === 'automatic' ) {
87- const browserMode = window . matchMedia ( '(prefers-color-scheme: dark)' ) . matches ;
89+ if ( selectedColorMode === 'automatic' ) {
90+ const systemPrefersDarkMode = window . matchMedia ( '(prefers-color-scheme: dark)' ) . matches ;
8891 window . localStorage . setItem ( 'useBrowserColorScheme' , 'true' ) ;
8992
90- if ( browserMode !== darkMode ) {
91- actions . push ( setDarkMode ( browserMode ) ) ;
93+ if ( systemPrefersDarkMode !== isDarkMode ) {
94+ pendingActions . push ( setIsDarkMode ( systemPrefersDarkMode ) ) ;
9295 }
93- } else if ( ( screenMode === 'dark' ) !== darkMode ) {
94- actions . push ( setDarkMode ( screenMode === 'dark' ) ) ;
96+ } else if ( ( selectedColorMode === 'dark' ) !== isDarkMode ) {
97+ pendingActions . push ( setIsDarkMode ( selectedColorMode === 'dark' ) ) ;
9598 window . localStorage . removeItem ( 'useBrowserColorScheme' ) ;
9699 } else {
97100 window . localStorage . removeItem ( 'useBrowserColorScheme' ) ;
98101 }
99102 // TODO: only set changed
100- await await Promise . all ( [ actions ] ) ;
103+ await Promise . all ( pendingActions ) ;
101104 window . location . reload ( ) ;
102105 } ;
103106
104107 const closePopover = ( ) => {
105- setPopover ( false ) ;
108+ setIsPopoverOpen ( false ) ;
106109 } ;
107110
108111 const innerButton = useLegacyAppearance ? (
@@ -112,7 +115,7 @@ export const HeaderUserThemeMenu = () => {
112115 aria-label = { i18n . translate ( 'advancedSettings.headerGlobalNav.themeMenuButtonAriaLabel' , {
113116 defaultMessage : 'Appearance menu' ,
114117 } ) }
115- onClick = { onButtonClick }
118+ onClick = { togglePopover }
116119 >
117120 < EuiIcon type = "color" size = "m" />
118121 </ EuiHeaderSectionItemButton >
@@ -126,7 +129,7 @@ export const HeaderUserThemeMenu = () => {
126129 aria-label = { i18n . translate ( 'advancedSettings.headerGlobalNav.themeMenuButtonAriaLabel' , {
127130 defaultMessage : 'Appearance menu' ,
128131 } ) }
129- onClick = { onButtonClick }
132+ onClick = { togglePopover }
130133 />
131134 ) ;
132135
@@ -146,22 +149,26 @@ export const HeaderUserThemeMenu = () => {
146149 // TODO: fix focus behavior
147150 const appearanceContent = (
148151 < div style = { { maxWidth : 300 } } >
149- < EuiCompressedFormRow label = "Theme version" helpText = { `Default: ${ defaultTheme } ` } >
150- < EuiCompressedSelect options = { themeOptions } value = { theme } onChange = { onThemeChange } />
152+ < EuiCompressedFormRow label = "Theme version" helpText = { `Default: ${ defaultThemeVersion } ` } >
153+ < EuiCompressedSelect
154+ options = { themeVersionOptions }
155+ value = { selectedThemeVersion }
156+ onChange = { handleThemeVersionChange }
157+ />
151158 </ EuiCompressedFormRow >
152159 < EuiCompressedFormRow
153160 label = "Screen mode"
154161 helpText = { `Default: ${
155- screenModeOptions . find ( ( t ) => {
156- const defaultValue = defaultScreenMode ? 'dark' : 'light' ;
162+ colorModeOptions . find ( ( t ) => {
163+ const defaultValue = defaultIsDarkMode ? 'dark' : 'light' ;
157164 return defaultValue === t . value ;
158165 } ) ?. text
159166 } `}
160167 >
161168 < EuiCompressedSelect
162- options = { screenModeOptions }
163- value = { screenMode }
164- onChange = { onScreenModeChange }
169+ options = { colorModeOptions }
170+ value = { selectedColorMode }
171+ onChange = { handleColorModeChange }
165172 />
166173 </ EuiCompressedFormRow >
167174 < EuiFlexGroup >
@@ -178,7 +185,7 @@ export const HeaderUserThemeMenu = () => {
178185 < EuiFlexItem grow = { false } >
179186 < EuiCompressedFormRow hasEmptyLabelSpace >
180187 { /* TODO: disable submit until changes */ }
181- < EuiSmallButton onClick = { onAppearanceSubmit } type = "submit" >
188+ < EuiSmallButton onClick = { applyAppearanceSettings } type = "submit" >
182189 Apply
183190 </ EuiSmallButton >
184191 </ EuiCompressedFormRow >
0 commit comments