Skip to content

Commit a8a3ae8

Browse files
committed
Controlled inputs for settings + fixes
1 parent dc8a6ca commit a8a3ae8

11 files changed

Lines changed: 40 additions & 28 deletions

File tree

src-tauri/capabilities/main.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
"database:allow-reset",
4343
"default-view:allow-set",
4444
"shell-extension:allow-show-item-in-folder",
45+
"sleepblocker:allow-enable",
4546
"sleepblocker:allow-disable"
4647
],
4748
"platforms": ["linux", "macOS", "windows"]

src-tauri/src/plugins/config.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ pub enum DefaultView {
4646
pub struct Config {
4747
pub theme: String,
4848
pub audio_volume: f32,
49-
pub audio_playback_rate: f32,
49+
pub audio_playback_rate: Option<f32>,
5050
pub audio_output_device: String,
5151
pub audio_muted: bool,
5252
pub audio_shuffle: bool,
@@ -67,7 +67,7 @@ impl Config {
6767
Config {
6868
theme: "__system".to_owned(),
6969
audio_volume: 1.0,
70-
audio_playback_rate: 1.0,
70+
audio_playback_rate: Some(1.0),
7171
audio_output_device: "default".to_owned(),
7272
audio_muted: false,
7373
audio_shuffle: false,

src/components/AudioOutputSelect/AudioOutputSelect.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { logAndNotifyError } from '../../lib/utils';
55
import * as Setting from '../Setting/Setting';
66

77
type Props = {
8-
defaultValue: string;
8+
value: string;
99
onChange: (deviceID: string) => void;
1010
} & Setting.InputProps;
1111

@@ -73,7 +73,7 @@ export default function AudioOutputSelect(props: Props) {
7373
<Setting.Select
7474
{...selectProps}
7575
key="devicesOk" // avoid default value problems
76-
defaultValue={props.defaultValue}
76+
value={props.value}
7777
onChange={setAudioOutputDevice}
7878
>
7979
{devices.map((device) => {

src/components/SettingCheckbox/SettingCheckbox.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import styles from './SettingCheckbox.module.css';
55
type Props = {
66
title: string;
77
slug: string;
8-
defaultValue: boolean;
9-
onClick: (value: boolean) => void;
8+
value: boolean;
9+
onChange: (value: boolean) => void;
1010
description?: string;
1111
};
1212

@@ -17,8 +17,8 @@ export default function CheckboxSetting(props: Props) {
1717
<input
1818
id={`setting-${slug}`}
1919
type="checkbox"
20-
onClick={(e) => props.onClick(e.currentTarget.checked)}
21-
defaultChecked={props.defaultValue}
20+
onChange={(e) => props.onChange(e.currentTarget.checked)}
21+
checked={props.value}
2222
/>
2323
<Setting.Label htmlFor={slug} noMargin>
2424
{title}

src/generated/typings/Config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ import type { Repeat } from "./Repeat";
44
import type { SortBy } from "./SortBy";
55
import type { SortOrder } from "./SortOrder";
66

7-
export interface Config { theme: string, audio_volume: number, audio_playback_rate: number, audio_output_device: string, audio_muted: boolean, audio_shuffle: boolean, audio_repeat: Repeat, default_view: DefaultView, library_sort_by: SortBy, library_sort_order: SortOrder, library_folders: Array<string>, sleepblocker: boolean, auto_update_checker: boolean, minimize_to_tray: boolean, notifications: boolean, track_view_density: string, }
7+
export interface Config { theme: string, audio_volume: number, audio_playback_rate: number | null, audio_output_device: string, audio_muted: boolean, audio_shuffle: boolean, audio_repeat: Repeat, default_view: DefaultView, library_sort_by: SortBy, library_sort_order: SortOrder, library_folders: Array<string>, sleepblocker: boolean, auto_update_checker: boolean, minimize_to_tray: boolean, notifications: boolean, track_view_density: string, }

src/lib/player.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ class Player {
127127

128128
export default new Player({
129129
volume: config.getInitial('audio_volume'),
130-
playbackRate: config.getInitial('audio_playback_rate'),
130+
playbackRate: config.getInitial('audio_playback_rate') ?? 1,
131131
audioOutputDevice: config.getInitial('audio_output_device'),
132132
muted: config.getInitial('audio_muted'),
133133
});

src/stores/SettingsAPI.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { themes } from '../lib/themes';
99
import { logAndNotifyError } from '../lib/utils';
1010
import type { Theme } from '../types/museeks';
1111

12+
import router from '../views/router';
1213
import useToastsStore from './useToastsStore';
1314

1415
interface UpdateCheckOptions {
@@ -52,6 +53,7 @@ const setTracksDensity = async (
5253
density: Config['track_view_density'],
5354
): Promise<void> => {
5455
await config.set('track_view_density', density);
56+
router.revalidate();
5557
};
5658

5759
/**
@@ -137,10 +139,11 @@ const check = async (): Promise<void> => {
137139
*/
138140
const toggleSleepBlocker = async (value: boolean): Promise<void> => {
139141
if (value === true) {
140-
invoke('plugin:sleepblocker|enable');
142+
await invoke('plugin:sleepblocker|enable');
141143
} else {
142-
invoke('plugin:sleepblocker|disable');
144+
await invoke('plugin:sleepblocker|disable');
143145
}
146+
router.revalidate();
144147
};
145148

146149
/**
@@ -150,20 +153,23 @@ const setDefaultView = async (defaultView: DefaultView): Promise<void> => {
150153
await invoke('plugin:default-view|set', {
151154
defaultView,
152155
});
156+
router.revalidate();
153157
};
154158

155159
/**
156160
* Toggle update check on startup
157161
*/
158162
const toggleAutoUpdateChecker = async (value: boolean): Promise<void> => {
159163
await config.set('auto_update_checker', value);
164+
router.revalidate();
160165
};
161166

162167
/**
163168
* Toggle native notifications display
164169
*/
165170
const toggleDisplayNotifications = async (value: boolean): Promise<void> => {
166171
await config.set('notifications', value);
172+
router.revalidate();
167173
};
168174

169175
// Should we use something else to harmonize between zustand and non-store APIs?

src/stores/usePlayerStore.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,6 @@ const usePlayerStore = createPlayerStore<PlayerState>((set, get) => ({
239239

240240
const newTrack = queue[newQueueCursor];
241241

242-
// tslint:disable-next-line
243242
if (newTrack !== undefined) {
244243
player.setTrack(newTrack);
245244
await player.play();
@@ -334,18 +333,22 @@ const usePlayerStore = createPlayerStore<PlayerState>((set, get) => ({
334333
else player.unmute();
335334

336335
await config.set('audio_muted', muted);
336+
router.revalidate();
337337
},
338338

339339
/**
340340
* Set audio's playback rate
341341
*/
342342
setPlaybackRate: async (value) => {
343-
if (value >= 0.5 && value <= 5) {
344-
// if in allowed range
345-
player.setPlaybackRate(value);
346-
343+
// if in allowed range
344+
if (!Number.isNaN(value) && value >= 0.5 && value <= 5) {
347345
await config.set('audio_playback_rate', value);
346+
player.setPlaybackRate(value);
347+
} else {
348+
await config.set('audio_playback_rate', null);
349+
player.setPlaybackRate(1.0);
348350
}
351+
router.revalidate();
349352
},
350353

351354
/**
@@ -356,6 +359,7 @@ const usePlayerStore = createPlayerStore<PlayerState>((set, get) => ({
356359
try {
357360
await player.setOutputDevice(deviceID);
358361
await config.set('audio_output_device', deviceID);
362+
router.revalidate();
359363
} catch (err) {
360364
logAndNotifyError(err);
361365
}
@@ -568,4 +572,5 @@ function createPlayerStore<T extends PlayerState>(store: StateCreator<T>) {
568572
*/
569573
const saveVolume = debounce(async (volume: number) => {
570574
await config.set('audio_volume', volume);
575+
router.revalidate();
571576
}, 500);

src/views/ViewSettingsAbout.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ export default function ViewSettingsAbout() {
3333
<CheckboxSetting
3434
slug="update"
3535
title="Automatically check for updates"
36-
defaultValue={config.auto_update_checker}
37-
onClick={SettingsAPI.toggleAutoUpdateChecker}
36+
value={config.auto_update_checker}
37+
onChange={SettingsAPI.toggleAutoUpdateChecker}
3838
/>
3939
<div>
4040
<Button

src/views/ViewSettingsAudio.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export default function ViewSettingsAudio() {
2727
description="Increase the playback rate: a value of 2 will play your music at a 2x
2828
speed"
2929
id="setting-playbackrate"
30-
defaultValue={config.audio_playback_rate}
30+
value={config.audio_playback_rate ?? ''}
3131
onChange={setPlaybackRate}
3232
type="number"
3333
min="0.5"
@@ -40,7 +40,7 @@ export default function ViewSettingsAudio() {
4040
label="Audio output"
4141
description="Advanced: set a custom audio output device."
4242
id="setting-playbackrate"
43-
defaultValue={config.audio_output_device}
43+
value={config.audio_output_device}
4444
onChange={playerAPI.setOutputDevice}
4545
/>
4646
</Setting.Section>

0 commit comments

Comments
 (0)