mirror of
https://github.com/kilyabin/psysonic.git
synced 2026-07-22 06:25:41 +00:00
39f4d03da5
Snapshot queue, current track, time, and pause before queue mutations. Ctrl+Z/Cmd+Z restores prior state; Ctrl+Shift+Z/Cmd+Shift+Z reapplies undone edits when the redo stack is non-empty; new edits clear redo. Resync the Rust audio engine only when the current song identity changes from the pre-apply state so reorder/enqueue-style edits keep live playback. Register the document capture listener from main.tsx after the window label is set. Mini player forwards undo/redo via mini:undo-queue and mini:redo-queue.
57 lines
1.8 KiB
TypeScript
57 lines
1.8 KiB
TypeScript
import { StrictMode } from 'react';
|
|
import ReactDOM from 'react-dom/client';
|
|
import { invoke } from '@tauri-apps/api/core';
|
|
import { getCurrentWindow } from '@tauri-apps/api/window';
|
|
import App from './App';
|
|
import { installQueueUndoHotkey } from './store/playerStore';
|
|
import './i18n';
|
|
import './styles/theme.css';
|
|
import './styles/layout.css';
|
|
import './styles/components.css';
|
|
import './styles/tracks.css';
|
|
|
|
// Expose the Tauri window label synchronously so App() can pick its root
|
|
// component (main app vs mini player) on first render without flicker.
|
|
try {
|
|
(window as any).__PSY_WINDOW_LABEL__ = getCurrentWindow().label;
|
|
} catch {
|
|
(window as any).__PSY_WINDOW_LABEL__ = 'main';
|
|
}
|
|
|
|
// Sync backend HTTP User-Agent from the main webview once at startup.
|
|
try {
|
|
const windowLabel = (window as any).__PSY_WINDOW_LABEL__ ?? 'main';
|
|
if (windowLabel === 'main') {
|
|
const ua = window.navigator.userAgent?.trim();
|
|
if (ua) {
|
|
void invoke('set_subsonic_wire_user_agent', { userAgent: ua, windowLabel });
|
|
}
|
|
}
|
|
} catch {
|
|
// Ignore in non-Tauri runtimes.
|
|
}
|
|
|
|
// Zustand rehydrate runs after first paint; AppShell's useEffect can miss the
|
|
// user's persisted `loggingMode` until then — but waveform/audio may already
|
|
// run. Push persisted mode to Rust before React mounts (matches `psysonic-auth`).
|
|
try {
|
|
const raw = localStorage.getItem('psysonic-auth');
|
|
if (raw) {
|
|
const parsed = JSON.parse(raw) as { state?: { loggingMode?: string } };
|
|
const mode = parsed.state?.loggingMode;
|
|
if (mode === 'off' || mode === 'normal' || mode === 'debug') {
|
|
void invoke('set_logging_mode', { mode });
|
|
}
|
|
}
|
|
} catch {
|
|
// Ignore parse / non-Tauri.
|
|
}
|
|
|
|
installQueueUndoHotkey();
|
|
|
|
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
<StrictMode>
|
|
<App />
|
|
</StrictMode>
|
|
);
|