From 1179d9f0630469839a76db212cc2983174aa1fe2 Mon Sep 17 00:00:00 2001 From: Mistral Vibe Date: Sun, 29 Mar 2026 20:37:25 +0200 Subject: [PATCH] WIP: Fix play behaviour in track view - Added wasPlayingRef to preserve playback state across version changes - Auto-play new waveform if previous version was playing - Ensure play/pause buttons work correctly after version switch - Added WebSocket proxy configuration for real-time features Fixes: Version switching now preserves playback state Todo: Test edge cases and finalize implementation --- web/nginx.conf | 16 ++++++++++++++++ web/src/hooks/useWaveform.ts | 30 +++++++++++++++++++++++++----- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/web/nginx.conf b/web/nginx.conf index b054424..cd1f909 100644 --- a/web/nginx.conf +++ b/web/nginx.conf @@ -31,6 +31,22 @@ server { proxy_send_timeout 300s; } + # WebSocket proxy for real-time version room events + location /ws/ { + proxy_pass http://api:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + # WebSocket specific headers + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + proxy_read_timeout 60s; + proxy_send_timeout 60s; + } + # SPA routing — all other paths fall back to index.html location / { try_files $uri $uri/ /index.html; diff --git a/web/src/hooks/useWaveform.ts b/web/src/hooks/useWaveform.ts index 0023fcb..06f812b 100644 --- a/web/src/hooks/useWaveform.ts +++ b/web/src/hooks/useWaveform.ts @@ -16,6 +16,7 @@ export function useWaveform( const [isPlaying, setIsPlaying] = useState(false); const [isReady, setIsReady] = useState(false); const [currentTime, setCurrentTime] = useState(0); + const wasPlayingRef = useRef(false); useEffect(() => { if (!containerRef.current || !options.url) return; @@ -38,6 +39,10 @@ export function useWaveform( ws.on("ready", () => { setIsReady(true); options.onReady?.(ws.getDuration()); + // Auto-play if previous version was playing + if (wasPlayingRef.current) { + ws.play(); + } }); ws.on("audioprocess", (time) => { @@ -45,9 +50,18 @@ export function useWaveform( options.onTimeUpdate?.(time); }); - ws.on("play", () => setIsPlaying(true)); - ws.on("pause", () => setIsPlaying(false)); - ws.on("finish", () => setIsPlaying(false)); + ws.on("play", () => { + setIsPlaying(true); + wasPlayingRef.current = true; + }); + ws.on("pause", () => { + setIsPlaying(false); + wasPlayingRef.current = false; + }); + ws.on("finish", () => { + setIsPlaying(false); + wasPlayingRef.current = false; + }); wsRef.current = ws; return () => { @@ -57,8 +71,14 @@ export function useWaveform( // eslint-disable-next-line react-hooks/exhaustive-deps }, [options.url]); - const play = () => wsRef.current?.play(); - const pause = () => wsRef.current?.pause(); + const play = () => { + wsRef.current?.play(); + wasPlayingRef.current = true; + }; + const pause = () => { + wsRef.current?.pause(); + wasPlayingRef.current = false; + }; const seekTo = (time: number) => { if (wsRef.current && isReady) { wsRef.current.setTime(time);