Files
psysonic/src/app/TauriEventBridge.tsx
T
Frank Stellmacher 1dd74f0fa1 refactor(tauri-bridge): split TauriEventBridge into per-concern hooks (#682)
Each Rust<->React bridge concern moves into its own hook under
hooks/tauriBridge/; TauriEventBridge just composes them:

- useZipDownloadBridge        download:zip:progress
- usePreviewBridge            audio:preview-* lifecycle
- useAudioDeviceBridge        audio:device-changed / -reset
- useCliBridge                full cli:* listener surface
- useTrayIconSync             tray-icon visibility
- useInAppKeybindings         configurable keydown chords
- useMediaAndWindowBridge     media keys, tray, shortcuts, close/force-quit
- usePlayerSnapshotPublisher  psysonic --info JSON snapshot

Pure code-move — event names, payloads, effect deps and cleanup all
verbatim. The MainApp call site is unchanged.
2026-05-14 12:31:14 +02:00

41 lines
1.7 KiB
TypeScript

import { useNavigate } from 'react-router-dom';
import { useZipDownloadBridge } from '../hooks/tauriBridge/useZipDownloadBridge';
import { usePreviewBridge } from '../hooks/tauriBridge/usePreviewBridge';
import { useAudioDeviceBridge } from '../hooks/tauriBridge/useAudioDeviceBridge';
import { useCliBridge } from '../hooks/tauriBridge/useCliBridge';
import { useTrayIconSync } from '../hooks/tauriBridge/useTrayIconSync';
import { useInAppKeybindings } from '../hooks/tauriBridge/useInAppKeybindings';
import { useMediaAndWindowBridge } from '../hooks/tauriBridge/useMediaAndWindowBridge';
import { usePlayerSnapshotPublisher } from '../hooks/tauriBridge/usePlayerSnapshotPublisher';
/**
* Single mount point for everything that bridges Rust ↔ React in the main
* webview: ZIP download progress, track-preview lifecycle, audio output device
* switches, the full `cli:*` listener surface (instant-mix, library / server
* resolution, search, player commands), tray-icon visibility, in-app
* keybindings, media keys + tray actions + window-close / force-quit flow, and
* the `psysonic --info` snapshot publisher. Renders null — pure side effects.
*
* Each concern lives in its own hook under `hooks/tauriBridge/`; this component
* just composes them.
*
* Lives outside `AppShell` so the listeners are attached before `RequireAuth`
* gates the rest of the tree.
*/
export function TauriEventBridge() {
const navigate = useNavigate();
useZipDownloadBridge();
usePreviewBridge();
useAudioDeviceBridge();
useCliBridge(navigate);
useTrayIconSync();
useInAppKeybindings(navigate);
useMediaAndWindowBridge(navigate);
usePlayerSnapshotPublisher();
return null;
}
export default TauriEventBridge;