mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-21 23:05:46 +00:00
feat(queue): persist queue header duration mode (#724)
* feat(queue): persist header duration mode (#625) The queue header chip cycles total / remaining / ETA, but the choice lived in QueuePanel `useState` and reset to 'total' on every app launch. Move it into `authStore` (persisted under `psysonic-auth`) so the chosen mode survives restarts like other UI preferences. - `DurationMode` consolidated in `authStoreTypes` (re-exported from `queuePanelHelpers` so existing component imports stay valid). - New `queueDurationDisplayMode` field + `setQueueDurationDisplayMode` setter wired through `createUiAppearanceActions`, default `'total'`. - `computeAuthStoreRehydration` validates the persisted value against the three known modes (pattern matches the existing seekbarStyle block) — garbage, null, undefined, or a missing key map back to `'total'` so the chip never receives an unknown mode. - `QueuePanel` reads / writes via `useAuthStore` selectors instead of local `useState`. - Tests: trivial-setter coverage in `authStore.settings.test.ts` and a new `authStoreRehydrate.test.ts` covering corrupt, missing, and valid rehydration cases. Reuses kveld9's design from PR #625; not merged because the 1.46 refactor split locales and reshuffled queue-helper exports. Credited via Co-Authored-By trailer. Co-Authored-By: Kveld. <kveld912@proton.me> * docs(changelog): queue header duration mode persistence (#724) Adds the CHANGELOG entry + kveld9 credits line referencing the real PR numbers (no #TBD placeholder) — feedback.md §2.7+§2.8 workflow: commit docs as a second push onto the open PR. --------- Co-authored-by: Kveld. <kveld912@proton.me>
This commit is contained in:
committed by
GitHub
parent
187170057d
commit
ccf4d5d8cb
@@ -0,0 +1,42 @@
|
||||
import { beforeEach, describe, expect, it } from 'vitest';
|
||||
import { computeAuthStoreRehydration } from './authStoreRehydrate';
|
||||
import { useAuthStore } from './authStore';
|
||||
import type { AuthState } from './authStoreTypes';
|
||||
import { resetAuthStore } from '@/test/helpers/storeReset';
|
||||
|
||||
describe('computeAuthStoreRehydration — queueDurationDisplayMode', () => {
|
||||
beforeEach(() => {
|
||||
resetAuthStore();
|
||||
});
|
||||
|
||||
it.each(['invalid_mode', 123, null, undefined] as const)(
|
||||
'maps corrupted value %j back to "total"',
|
||||
(corrupt) => {
|
||||
const base = useAuthStore.getState();
|
||||
const patch = computeAuthStoreRehydration({
|
||||
...base,
|
||||
queueDurationDisplayMode: corrupt as never,
|
||||
});
|
||||
expect(patch.queueDurationDisplayMode).toBe('total');
|
||||
},
|
||||
);
|
||||
|
||||
it('maps a rehydrated payload without the key back to "total"', () => {
|
||||
const base = useAuthStore.getState();
|
||||
const { queueDurationDisplayMode: _drop, ...without } = base;
|
||||
const patch = computeAuthStoreRehydration(without as AuthState);
|
||||
expect(patch.queueDurationDisplayMode).toBe('total');
|
||||
});
|
||||
|
||||
it.each(['total', 'remaining', 'eta'] as const)(
|
||||
'does not overwrite a valid mode (%s)',
|
||||
(mode) => {
|
||||
const base = useAuthStore.getState();
|
||||
const patch = computeAuthStoreRehydration({
|
||||
...base,
|
||||
queueDurationDisplayMode: mode,
|
||||
});
|
||||
expect(patch.queueDurationDisplayMode).toBeUndefined();
|
||||
},
|
||||
);
|
||||
});
|
||||
Reference in New Issue
Block a user