Skip to content

Commit 31a3f38

Browse files
authored
webui: allow to use system ui theme (#228)
1 parent 7d2c363 commit 31a3f38

File tree

5 files changed

+45
-6
lines changed

5 files changed

+45
-6
lines changed

js/webui/src/css_settings_controller.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import startsWith from 'lodash/startsWith'
2-
import SettingsModel, { MediaSize } from './settings_model'
2+
import { MediaSize } from './settings_model'
33

44
const settingClassPrefix = 'st-';
55

@@ -27,11 +27,11 @@ export default class CssSettingsController
2727

2828
start()
2929
{
30-
this.settingsModel.on('change', this.handleUpdate.bind(this));
31-
this.handleUpdate();
30+
this.settingsModel.on('change', this.update.bind(this));
31+
this.update();
3232
}
3333

34-
handleUpdate()
34+
update()
3535
{
3636
const rootElement = document.documentElement;
3737

js/webui/src/general_settings.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class GeneralSettings extends React.PureComponent
2929

3030
return (
3131
<form className='settings-form'>
32-
<SettingEditor settingKey='uiTheme' />
32+
<SettingEditor settingKey='uiThemePreference' />
3333
<SettingEditor settingKey='windowTitleExpression' />
3434
{
3535
showFullWidth ? <SettingEditor settingKey='fullWidth' /> : null

js/webui/src/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import urls, { getPathFromUrl } from './urls'
1515
import { playlistTableKey } from './playlist_content';
1616
import { PlaybackState } from 'beefweb-client/src';
1717
import { SettingsView, View } from './navigation_model';
18+
import MediaThemeController from "./media_theme_controller";
1819

1920
const client = new PlayerClient(new RequestHandler());
2021
const settingsStore = new SettingsStore();
@@ -30,6 +31,7 @@ const {
3031
} = appModel;
3132

3233
const mediaSizeController = new MediaSizeController(settingsModel);
34+
const mediaThemeController = new MediaThemeController(settingsModel);
3335
const touchModeController = new TouchModeController(settingsModel);
3436
const cssSettingsController = new CssSettingsController(settingsModel);
3537
const windowController = new WindowController(playerModel);
@@ -131,6 +133,7 @@ playlistModel.on('playlistsChange', () => {
131133

132134
appModel.load();
133135
mediaSizeController.start();
136+
mediaThemeController.start();
134137
touchModeController.start();
135138
cssSettingsController.start();
136139
appModel.start();
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { UITheme } from "./settings_model";
2+
3+
export default class MediaThemeController
4+
{
5+
constructor(settingsModel)
6+
{
7+
this.settingsModel = settingsModel;
8+
this.darkThemeQuery = window.matchMedia('(prefers-color-scheme: dark)');
9+
this.update = this.update.bind(this);
10+
}
11+
12+
start()
13+
{
14+
this.settingsModel.on('uiThemePreferenceChange', this.update);
15+
this.darkThemeQuery.addEventListener('change', this.update);
16+
this.update();
17+
}
18+
19+
update()
20+
{
21+
this.settingsModel.uiTheme = this.settingsModel.uiThemePreference === UITheme.system
22+
? (this.darkThemeQuery.matches ? UITheme.dark : UITheme.light)
23+
: this.settingsModel.uiThemePreference;
24+
}
25+
}

js/webui/src/settings_model.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export const MediaSize = Object.freeze({
3333
});
3434

3535
export const UITheme = Object.freeze({
36+
system: 'system',
3637
light: 'light',
3738
dark: 'dark',
3839
})
@@ -70,6 +71,7 @@ const defaultSettingProps = Object.freeze({
7071
* @property {string} mediaSize
7172
* @property {boolean} showPlaybackInfo
7273
* @property {string} uiTheme
74+
* @property {string} uiThemePreference
7375
*/
7476
export default class SettingsModel extends EventEmitter
7577
{
@@ -138,15 +140,24 @@ export default class SettingsModel extends EventEmitter
138140
}
139141
});
140142

143+
// Actual UI Theme (takes into account currently selected system theme)
141144
this.define({
142145
key: 'uiTheme',
143146
type: SettingType.enum,
144147
defaultValue: UITheme.light,
148+
cssVisible: true
149+
});
150+
151+
// What user selects in settings screen
152+
this.define({
153+
key: 'uiThemePreference',
154+
type: SettingType.enum,
155+
defaultValue: UITheme.system,
145156
title: 'UI Theme',
146157
persistent: true,
147-
cssVisible: true,
148158
enumKeys: UITheme,
149159
enumNames: {
160+
[UITheme.system]: 'Use system setting',
150161
[UITheme.light]: 'Light',
151162
[UITheme.dark]: 'Dark',
152163
}

0 commit comments

Comments
 (0)