2023-07-10 21:44:55 +01:00
|
|
|
import clamp from 'just-clamp';
|
|
|
|
|
import { persisted } from 'svelte-local-storage-store';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @typedef {Object} UserPreferences
|
|
|
|
|
* @property {number} playback_rate - The audio player playback rate (speed)
|
|
|
|
|
* @property {number} volume - The audio player volume
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The default user preferences
|
|
|
|
|
* @type {UserPreferences}
|
|
|
|
|
*/
|
|
|
|
|
const DEFAULT_USER_PREFERENCES = { playback_rate: 1, volume: 1 };
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The user preferences store
|
|
|
|
|
* @type {import('svelte/store').Writable<UserPreferences>}
|
|
|
|
|
*/
|
2023-07-11 22:13:18 +01:00
|
|
|
const USER_PREFERENCES_STORE = persisted(
|
|
|
|
|
'USER_PREFERENCE',
|
|
|
|
|
DEFAULT_USER_PREFERENCES,
|
|
|
|
|
);
|
2023-07-10 21:44:55 +01:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sets the playback rate for the user
|
|
|
|
|
* @param {number} value - The playback rate value
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
const set_playback_rate = (value) => {
|
|
|
|
|
const playback_rate = clamp(value, 0.5, 5);
|
2023-07-11 22:13:18 +01:00
|
|
|
return USER_PREFERENCES_STORE.update((prefs) => ({
|
|
|
|
|
...prefs,
|
|
|
|
|
playback_rate,
|
|
|
|
|
}));
|
2023-07-10 21:44:55 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sets the volume for the user
|
|
|
|
|
* @param {number} value - The volume value
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
const set_volume = (value) => {
|
|
|
|
|
const volume = clamp(value, 0, 1);
|
|
|
|
|
return USER_PREFERENCES_STORE.update((prefs) => ({ ...prefs, volume }));
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Clears user preferences store
|
|
|
|
|
*/
|
|
|
|
|
const clear_store = () => USER_PREFERENCES_STORE.set(DEFAULT_USER_PREFERENCES);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @typedef {Object} UserPreferencesObject
|
|
|
|
|
* @property {typeof USER_PREFERENCES_STORE.subscribe} subscribe - Subscribes to the user preferences store
|
|
|
|
|
* @property {typeof set_playback_rate} set_playback_rate - Sets the playback rate for the user
|
|
|
|
|
* @property {typeof set_volume} set_volume - Sets the volume for the user
|
|
|
|
|
* @property {typeof clear_store} clear - Clears saved user preferences
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The user preferences object
|
|
|
|
|
* @type {UserPreferencesObject}
|
|
|
|
|
*/
|
|
|
|
|
export const user_preferences = {
|
|
|
|
|
/**
|
|
|
|
|
* Subscribes to user preferences store
|
|
|
|
|
*/
|
|
|
|
|
subscribe: USER_PREFERENCES_STORE.subscribe,
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sets the playback rate for the user
|
|
|
|
|
* @type {typeof set_playback_rate}
|
|
|
|
|
*/
|
|
|
|
|
set_playback_rate,
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sets the volume for the user
|
|
|
|
|
* @type {typeof set_volume}
|
|
|
|
|
*/
|
|
|
|
|
set_volume,
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Clears user preferences store
|
|
|
|
|
* @type {typeof clear_store}
|
|
|
|
|
*/
|
|
|
|
|
clear: clear_store,
|
|
|
|
|
};
|