spectation

This commit is contained in:
legop3
2025-11-15 05:04:25 -05:00
parent b242ecf5ac
commit 50c56e7271
14 changed files with 321 additions and 23 deletions
+29
View File
@@ -0,0 +1,29 @@
import { useEffect, useState } from 'react';
import { useSocket } from '../context/SocketContext.jsx';
export function useSensorFeed() {
const socket = useSocket();
const [frames, setFrames] = useState({});
useEffect(() => {
function handleFrame({ roverId, sensors = {}, frame = {} }) {
if (!roverId) return;
setFrames((prev) => ({
...prev,
[roverId]: {
roverId,
sensors,
raw: frame?.data || null,
receivedAt: Date.now(),
},
}));
}
socket.on('sensorFrame', handleFrame);
return () => {
socket.off('sensorFrame', handleFrame);
};
}, [socket]);
return frames;
}
+30
View File
@@ -0,0 +1,30 @@
import { useEffect, useState } from 'react';
import { useSession } from '../context/SessionContext.jsx';
export function useSpectatorMode() {
const { session, setRole, subscribeAll } = useSession();
const [ready, setReady] = useState(false);
useEffect(() => {
let cancelled = false;
async function ensureSpectator() {
try {
if (session?.role !== 'spectator') {
await setRole('spectator');
}
await subscribeAll();
if (!cancelled) {
setReady(true);
}
} catch (err) {
console.error('Failed to enter spectator mode', err);
}
}
ensureSpectator();
return () => {
cancelled = true;
};
}, [session?.role, setRole, subscribeAll]);
return ready;
}
+29
View File
@@ -0,0 +1,29 @@
import { useEffect, useState } from 'react';
import { useSocket } from '../context/SocketContext.jsx';
export function useVideoRequests(roverIds = []) {
const socket = useSocket();
const [sources, setSources] = useState({});
useEffect(() => {
const ids = Array.from(new Set(roverIds.filter(Boolean)));
if (!ids.length) return;
let cancelled = false;
ids.forEach((roverId) => {
socket.emit('video:request', { roverId }, (resp = {}) => {
if (cancelled) return;
setSources((prev) => ({
...prev,
[roverId]: resp,
}));
});
});
return () => {
cancelled = true;
};
}, [socket, roverIds.join('|')]);
return sources;
}