From bd96da4dc9873d744957722f1444f3028adfe591 Mon Sep 17 00:00:00 2001 From: cottongin Date: Tue, 22 Sep 2026 19:00:34 -0400 Subject: [PATCH] feat: add appMode preference (clipper/player) with persistence Co-authored-by: Cursor --- src/lib/stores/preferences.svelte.ts | 10 ++++++++ tests/lib/stores/preferences.test.ts | 38 ++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 tests/lib/stores/preferences.test.ts diff --git a/src/lib/stores/preferences.svelte.ts b/src/lib/stores/preferences.svelte.ts index 31459b1..a803f80 100644 --- a/src/lib/stores/preferences.svelte.ts +++ b/src/lib/stores/preferences.svelte.ts @@ -49,6 +49,7 @@ export interface Preferences { captionSettings: CaptionSettings; clipListPosition: 'bottom' | 'left'; clipListWidth: number; + appMode: 'clipper' | 'player'; } const DEFAULT_PREFERENCES: Preferences = { @@ -57,6 +58,7 @@ const DEFAULT_PREFERENCES: Preferences = { captionSettings: { ...DEFAULT_CAPTION_SETTINGS }, clipListPosition: 'bottom', clipListWidth: 220, + appMode: 'clipper', }; let store: Store | null = null; @@ -81,6 +83,8 @@ export async function loadPreferences(): Promise { const savedClipListWidth = await store.get('clipListWidth'); if (savedClipListPosition) preferences.clipListPosition = savedClipListPosition; if (savedClipListWidth != null) preferences.clipListWidth = savedClipListWidth; + const savedAppMode = await store.get<'clipper' | 'player'>('appMode'); + if (savedAppMode) preferences.appMode = savedAppMode; })(); await loadPromise; } @@ -95,6 +99,7 @@ export async function savePreferences(): Promise { await store.set('captionSettings', preferences.captionSettings); await store.set('clipListPosition', preferences.clipListPosition); await store.set('clipListWidth', preferences.clipListWidth); + await store.set('appMode', preferences.appMode); await store.save(); } @@ -122,3 +127,8 @@ export async function setClipListWidth(width: number): Promise { preferences.clipListWidth = width; await savePreferences(); } + +export async function setAppMode(mode: 'clipper' | 'player'): Promise { + preferences.appMode = mode; + await savePreferences(); +} diff --git a/tests/lib/stores/preferences.test.ts b/tests/lib/stores/preferences.test.ts new file mode 100644 index 0000000..75ab192 --- /dev/null +++ b/tests/lib/stores/preferences.test.ts @@ -0,0 +1,38 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; + +// Mock the Tauri store before importing the module under test +vi.mock('@tauri-apps/plugin-store', () => { + const mockStore = { + get: vi.fn().mockResolvedValue(null), + set: vi.fn().mockResolvedValue(undefined), + save: vi.fn().mockResolvedValue(undefined), + }; + return { + load: vi.fn().mockResolvedValue(mockStore), + Store: vi.fn(), + }; +}); + +describe('preferences store — appMode', () => { + beforeEach(() => { + vi.resetModules(); + }); + + it('defaults appMode to clipper', async () => { + const { preferences } = await import('$lib/stores/preferences.svelte'); + expect(preferences.appMode).toBe('clipper'); + }); + + it('setAppMode updates appMode to player', async () => { + const { preferences, setAppMode } = await import('$lib/stores/preferences.svelte'); + await setAppMode('player'); + expect(preferences.appMode).toBe('player'); + }); + + it('setAppMode updates appMode back to clipper', async () => { + const { preferences, setAppMode } = await import('$lib/stores/preferences.svelte'); + await setAppMode('player'); + await setAppMode('clipper'); + expect(preferences.appMode).toBe('clipper'); + }); +});