mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-22 07:15:47 +00:00
0e88e8a5cd
### Audio - Replay Gain support (track + album mode, configurable pre-gain, hard limiter) - Crossfade between tracks (configurable duration 1–10 s) - Gapless preloading ⚠️ experimental/alpha — enable in Settings → Playback - Atomic sink swap: old track plays until new one is decoded, then stops cleanly ### UI / UX - Settings redesigned with tab navigation (General, Playback, About) - Changelog viewer in Settings → About with collapsible version entries - Download Folder Modal: choose folder + "remember" checkbox per-download - EQ popup now accessible directly from the Player Bar - "Also Featured On" section on Artist pages for non-album appearances ### Fixes - Bundle identifier changed from dev.psysonic.app → dev.psysonic.player (fixes macOS warning) - Version sync: all four version files (package.json, Cargo.toml, tauri.conf.json, PKGBUILD) now at 1.6.0 ### Known Issues - FLAC seeking via waveform seekbar does not work (MP3/OGG unaffected) — under investigation Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
46 lines
1.2 KiB
TypeScript
46 lines
1.2 KiB
TypeScript
import { create } from 'zustand';
|
|
|
|
// Module-level callback — not in Zustand state to avoid serialization issues
|
|
let _resolve: ((folder: string | null) => void) | null = null;
|
|
|
|
interface DownloadModalStore {
|
|
isOpen: boolean;
|
|
folder: string;
|
|
remember: boolean;
|
|
requestFolder: () => Promise<string | null>;
|
|
setFolder: (f: string) => void;
|
|
setRemember: (r: boolean) => void;
|
|
confirm: (setDownloadFolder: (v: string) => void) => void;
|
|
cancel: () => void;
|
|
}
|
|
|
|
export const useDownloadModalStore = create<DownloadModalStore>((set, get) => ({
|
|
isOpen: false,
|
|
folder: '',
|
|
remember: false,
|
|
|
|
requestFolder: () =>
|
|
new Promise<string | null>(resolve => {
|
|
_resolve = resolve;
|
|
set({ isOpen: true, folder: '', remember: false });
|
|
}),
|
|
|
|
setFolder: (folder) => set({ folder }),
|
|
setRemember: (remember) => set({ remember }),
|
|
|
|
confirm: (setDownloadFolder) => {
|
|
const { folder, remember } = get();
|
|
if (!folder) return;
|
|
if (remember) setDownloadFolder(folder);
|
|
_resolve?.(folder);
|
|
_resolve = null;
|
|
set({ isOpen: false });
|
|
},
|
|
|
|
cancel: () => {
|
|
_resolve?.(null);
|
|
_resolve = null;
|
|
set({ isOpen: false });
|
|
},
|
|
}));
|