Fix: Watch Together Raum-Erstellung + Download-Button

- Server/Frontend Protokoll-Mismatch behoben (create_room, join_room, room_created, room_joined, playback_state)
- togglePlay sendet jetzt korrekt pause/resume statt toggle_play
- Download-Button: SPA-Fallback fuer /downloads/ verhindert, 404 statt Reload
- download-Attribut am Link hinzugefuegt

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Daniel 2026-03-07 02:48:43 +01:00
parent 73f247ada3
commit e748fc97e9
6 changed files with 74 additions and 61 deletions

View file

@ -263,35 +263,38 @@ export default function WatchTogetherTab({ data }: { data: any }) {
if (msg.rooms) setRooms(msg.rooms);
break;
case 'room_created':
case 'room_created': {
const r = msg.room;
setCurrentRoom({
id: msg.roomId,
name: msg.name,
hostId: msg.hostId,
members: msg.members || [],
currentVideo: null,
playing: false,
currentTime: 0,
queue: [],
id: r.id,
name: r.name,
hostId: r.hostId,
members: r.members || [],
currentVideo: r.currentVideo || null,
playing: r.playing || false,
currentTime: r.currentTime || 0,
queue: r.queue || [],
});
break;
}
case 'room_joined':
case 'room_joined': {
const r = msg.room;
setCurrentRoom({
id: msg.roomId,
name: msg.name,
hostId: msg.hostId,
members: msg.members || [],
currentVideo: msg.currentVideo || null,
playing: msg.playing || false,
currentTime: msg.currentTime || 0,
queue: msg.queue || [],
id: r.id,
name: r.name,
hostId: r.hostId,
members: r.members || [],
currentVideo: r.currentVideo || null,
playing: r.playing || false,
currentTime: r.currentTime || 0,
queue: r.queue || [],
});
// Load video if one is playing
if (msg.currentVideo?.url) {
setTimeout(() => loadVideo(msg.currentVideo.url), 100);
if (r.currentVideo?.url) {
setTimeout(() => loadVideo(r.currentVideo.url), 100);
}
break;
}
case 'playback_state': {
const room = currentRoomRef.current;
@ -402,8 +405,8 @@ export default function WatchTogetherTab({ data }: { data: any }) {
if (wsRef.current?.readyState === WebSocket.OPEN) {
wsSend({
type: 'create_room',
name: userName.trim(),
roomName: roomName.trim(),
name: roomName.trim(),
userName: userName.trim(),
password: roomPassword.trim() || undefined,
});
} else {
@ -423,7 +426,7 @@ export default function WatchTogetherTab({ data }: { data: any }) {
if (wsRef.current?.readyState === WebSocket.OPEN) {
wsSend({
type: 'join_room',
name: userName.trim(),
userName: userName.trim(),
roomId,
password: password?.trim() || undefined,
});
@ -458,7 +461,9 @@ export default function WatchTogetherTab({ data }: { data: any }) {
// ── Playback controls (host only) ──
const togglePlay = useCallback(() => {
wsSend({ type: 'toggle_play' });
const room = currentRoomRef.current;
if (!room) return;
wsSend({ type: room.playing ? 'pause' : 'resume' });
}, [wsSend]);
const skip = useCallback(() => {