Headless Improvements (#41)

This commit is contained in:
Ollie Taylor
2023-07-10 16:35:58 +01:00
committed by GitHub
parent 980588930a
commit 16366ec7f3
54 changed files with 1406 additions and 1034 deletions
+2 -2
View File
@@ -1,2 +1,2 @@
export * from './preferences';
export * from './progress';
export * from './user-preferences';
export * from './user-progress';
-21
View File
@@ -1,21 +0,0 @@
import clamp from 'just-clamp';
import { persisted } from 'svelte-local-storage-store';
import type { UserPreferences } from '../types';
const _default_user_preferences = { playback_rate: 1, volume: 1 } satisfies UserPreferences;
const _user_preferences = persisted<UserPreferences>('USER_PREFERENCE', _default_user_preferences);
export const user_preferences = {
subscribe: _user_preferences.subscribe,
set: {
playback_rate: (value: number) => {
const playback_rate = clamp(value, 0.5, 5);
return _user_preferences.update((prefs) => ({ ...prefs, playback_rate }));
},
volume: (value: number) => {
const volume = clamp(value, 0, 1);
return _user_preferences.update((prefs) => ({ ...prefs, volume }));
},
},
clear: () => _user_preferences.set(_default_user_preferences),
};
-27
View File
@@ -1,27 +0,0 @@
import { persisted } from 'svelte-local-storage-store';
import { get } from 'svelte/store';
import { episode_audio, episode_progress } from '../audio';
import type { UserProgress } from '../types';
import { get_pathname_from_url } from '../utility';
import { info } from '../utility/package/log';
const _default_user_progress = {} satisfies UserProgress;
const _user_progress = persisted<UserProgress>('USER_PROGRESS', _default_user_progress);
const save = () => {
const audio = get(episode_audio);
if (!audio?.src) return;
info('saving progress: ', audio.src);
const pathname = get_pathname_from_url(audio.src);
const current_time = get(episode_progress).current_time;
_user_progress.update((prev) => ({ ...prev, [pathname]: current_time }));
};
export const user_progress = {
subscribe: _user_progress.subscribe,
get: (src: string) => get(_user_progress)[get_pathname_from_url(src)],
save,
clear: () => _user_progress.set(_default_user_progress),
};
+49
View File
@@ -0,0 +1,49 @@
import clamp from 'just-clamp';
import { persisted } from 'svelte-local-storage-store';
export interface UserPreferences {
playback_rate: number;
volume: number;
}
const default_user_preferences = { playback_rate: 1, volume: 1 };
const user_preferences_store = persisted<UserPreferences>(
'USER_PREFERENCE',
default_user_preferences,
);
/**
* Sets the playback rate for the user
* @param value - The playback rate value
* @returns A Promise that resolves with the updated user preferences
*/
const set_playback_rate = (value: number) => {
const playback_rate = clamp(value, 0.5, 5);
return user_preferences_store.update((prefs) => ({ ...prefs, playback_rate }));
};
/**
* Sets the volume for the user
* @param value - The volume value
* @returns A Promise that resolves with the updated user preferences
*/
const set_volume = (value: number) => {
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);
export const user_preferences = {
/**
* Subscribes to user preferences store
*/
subscribe: user_preferences_store.subscribe,
set_playback_rate,
set_volume,
clear: clear_store,
};
+53
View File
@@ -0,0 +1,53 @@
import { persisted } from 'svelte-local-storage-store';
import { get } from 'svelte/store';
import { episode_audio, episode_progress } from '../audio';
import { announce, use_url } from '../utility';
export type UserProgress = {
[key: string]: number;
};
const default_user_progress = {};
const user_progress_store = persisted<UserProgress>('USER_PROGRESS', default_user_progress);
/**
* Saves user progress
*/
const save = () => {
const audio = get(episode_audio);
if (!audio?.src) return;
announce.info('saving progress: ', audio.src);
const pathname = use_url(audio.src).pathname;
const current_time = get(episode_progress).current_time;
user_progress_store.update((prev) => ({ ...prev, [pathname]: current_time }));
};
/**
* Gets user progress for a given audio source
* @param {string} src - Audio source
* @returns {number} - User progress for the given audio source
*/
const get_user_progress = (src: string) => {
const pathname = use_url(src).pathname;
const store = get(user_progress_store) as UserProgress;
return store[pathname];
};
/**
* Clears user progress store
*/
const clear_user_progress = () => user_progress_store.set(default_user_progress);
export const user_progress = {
/**
* Subscribes to user preferences store
*/
subscribe: user_progress_store.subscribe,
get: get_user_progress,
clear: clear_user_progress,
save,
};