frontend: Automatically reconnect websocket when navigating back

This commit is contained in:
2025-02-15 22:31:24 -08:00
parent a3801f6698
commit 92c5582c98

View File

@@ -11,7 +11,7 @@ const App: React.FC = () => {
const [volume, setVolume] = useState(100); const [volume, setVolume] = useState(100);
const [volumeSettingIsLocked, setVolumeSettingIsLocked] = useState(false); const [volumeSettingIsLocked, setVolumeSettingIsLocked] = useState(false);
const [songs, setSongs] = useState<PlaylistItem[]>([]); const [songs, setSongs] = useState<PlaylistItem[]>([]);
const [_, setWs] = useState<WebSocket | null>(null); const [ws, setWs] = useState<WebSocket | null>(null);
const fetchPlaylist = useCallback(async () => { const fetchPlaylist = useCallback(async () => {
const playlist = await API.getPlaylist(); const playlist = await API.getPlaylist();
@@ -104,14 +104,25 @@ const App: React.FC = () => {
fetchNowPlaying(); fetchNowPlaying();
}, [fetchPlaylist, fetchNowPlaying]); }, [fetchPlaylist, fetchNowPlaying]);
// WebSocket connection // Update WebSocket connection
useEffect(() => { useEffect(() => {
const ws = API.subscribeToEvents(handleWebSocketEvent); const websocket = API.subscribeToEvents(handleWebSocketEvent);
setWs(ws); setWs(websocket);
// Handle page visibility changes, so if the user navigates back to this tab, we reconnect the WebSocket
const handleVisibilityChange = () => {
if (document.visibilityState === 'visible' && (!ws || ws.readyState === WebSocket.CLOSED)) {
const newWs = API.subscribeToEvents(handleWebSocketEvent);
setWs(newWs);
}
};
document.addEventListener('visibilitychange', handleVisibilityChange);
return () => { return () => {
if (ws) { document.removeEventListener('visibilitychange', handleVisibilityChange);
ws.close(); if (websocket) {
websocket.close();
} }
}; };
}, [handleWebSocketEvent]); }, [handleWebSocketEvent]);