mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-22 07:15:47 +00:00
53 lines
2.0 KiB
TypeScript
53 lines
2.0 KiB
TypeScript
import { useEffect } from 'react';
|
|
import { getMusicFolders } from '../api/subsonicLibrary';
|
|
import { probeEntityRatingSupport } from '../api/subsonicStarRating';
|
|
import { useAuthStore } from '../store/authStore';
|
|
import { cleanupOrphanedOrbitPlaylists } from '@/features/orbit';
|
|
|
|
/**
|
|
* Per-server one-shot probe run after login:
|
|
* - Fetches the server's music folders (falls back to []).
|
|
* - Probes which entity types support star ratings (falls back to
|
|
* `track_only` for old/non-Navidrome servers).
|
|
* - Sweeps leftover Orbit session / outbox playlists from crashed or
|
|
* force-closed sessions so they don't pollute the playlist view.
|
|
*
|
|
* Each step is server-scoped — if the user switches servers mid-probe the
|
|
* stale result is dropped.
|
|
*/
|
|
export function useServerCapabilitiesProbe(): void {
|
|
const isLoggedIn = useAuthStore(s => s.isLoggedIn);
|
|
const activeServerId = useAuthStore(s => s.activeServerId);
|
|
const setMusicFolders = useAuthStore(s => s.setMusicFolders);
|
|
const setEntityRatingSupport = useAuthStore(s => s.setEntityRatingSupport);
|
|
|
|
useEffect(() => {
|
|
if (!isLoggedIn || !activeServerId) return;
|
|
const serverAtStart = activeServerId;
|
|
let cancelled = false;
|
|
(async () => {
|
|
const stillThisServer = () => !cancelled && useAuthStore.getState().activeServerId === serverAtStart;
|
|
try {
|
|
const folders = await getMusicFolders();
|
|
if (stillThisServer()) setMusicFolders(folders);
|
|
} catch {
|
|
if (stillThisServer()) setMusicFolders([]);
|
|
}
|
|
try {
|
|
const level = await probeEntityRatingSupport();
|
|
if (stillThisServer()) setEntityRatingSupport(serverAtStart, level);
|
|
} catch {
|
|
if (stillThisServer()) setEntityRatingSupport(serverAtStart, 'track_only');
|
|
}
|
|
})();
|
|
return () => {
|
|
cancelled = true;
|
|
};
|
|
}, [isLoggedIn, activeServerId, setMusicFolders, setEntityRatingSupport]);
|
|
|
|
useEffect(() => {
|
|
if (!isLoggedIn || !activeServerId) return;
|
|
void cleanupOrphanedOrbitPlaylists();
|
|
}, [isLoggedIn, activeServerId]);
|
|
}
|