mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-17 10:00:46 -04:00
websocket / polling toggle
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -11,7 +11,7 @@
|
|||||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||||
<meta name="apple-mobile-web-app-title" content="Multi Roomba Rover" />
|
<meta name="apple-mobile-web-app-title" content="Multi Roomba Rover" />
|
||||||
<title>Multi Roomba Rover</title>
|
<title>Multi Roomba Rover</title>
|
||||||
<script type="module" crossorigin src="/assets/index-dcJYUpo5.js"></script>
|
<script type="module" crossorigin src="/assets/index-puYPJv33.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/assets/index-BY_dmM98.css">
|
<link rel="stylesheet" crossorigin href="/assets/index-BY_dmM98.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ import Tabs, { Tab, TabList, TabPanel, TabPanels } from './Tabs.jsx';
|
|||||||
import SessionSnapshot from './SessionSnapshot.jsx';
|
import SessionSnapshot from './SessionSnapshot.jsx';
|
||||||
import SocketLogPanel from './SocketLogPanel.jsx';
|
import SocketLogPanel from './SocketLogPanel.jsx';
|
||||||
import { useHudMapSetting } from '../hooks/useHudMapSetting.js';
|
import { useHudMapSetting } from '../hooks/useHudMapSetting.js';
|
||||||
|
import { useSettingsNamespace } from '../settings/index.js';
|
||||||
|
import { useSocket } from '../context/SocketContext.jsx';
|
||||||
|
|
||||||
const manualTabs = [
|
const manualTabs = [
|
||||||
{ key: 'start', label: 'Start OI' },
|
{ key: 'start', label: 'Start OI' },
|
||||||
@@ -24,6 +26,12 @@ export default function SettingsPanel() {
|
|||||||
} = useControlSystem();
|
} = useControlSystem();
|
||||||
const canControl = Boolean(roverId);
|
const canControl = Boolean(roverId);
|
||||||
const [hudMapDesktop, setHudMapDesktop] = useHudMapSetting();
|
const [hudMapDesktop, setHudMapDesktop] = useHudMapSetting();
|
||||||
|
const socket = useSocket();
|
||||||
|
const { value: pageSettings, save: savePageSettings } = useSettingsNamespace('page', {
|
||||||
|
hudMapDesktop: false,
|
||||||
|
connectionTransport: 'websocket',
|
||||||
|
});
|
||||||
|
const connectionTransport = pageSettings?.connectionTransport || 'websocket';
|
||||||
|
|
||||||
const sensorButtons = useMemo(
|
const sensorButtons = useMemo(
|
||||||
() => [
|
() => [
|
||||||
@@ -37,6 +45,15 @@ export default function SettingsPanel() {
|
|||||||
if (!roverId) return;
|
if (!roverId) return;
|
||||||
setSensorStream(enable);
|
setSensorStream(enable);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleTransportChange = (event) => {
|
||||||
|
const next = event.target.value;
|
||||||
|
savePageSettings((current) => ({ ...(current ?? {}), connectionTransport: next }));
|
||||||
|
if (!socket?.io?.opts) return;
|
||||||
|
socket.io.opts.transports = next === 'polling' ? ['polling'] : ['websocket', 'polling'];
|
||||||
|
socket.disconnect();
|
||||||
|
socket.connect();
|
||||||
|
};
|
||||||
return (
|
return (
|
||||||
<Tabs defaultTab="keybindings">
|
<Tabs defaultTab="keybindings">
|
||||||
<TabList>
|
<TabList>
|
||||||
@@ -71,6 +88,21 @@ export default function SettingsPanel() {
|
|||||||
</label>
|
</label>
|
||||||
<p className="text-xs text-slate-500">Mobile HUD keeps the map on by default.</p>
|
<p className="text-xs text-slate-500">Mobile HUD keeps the map on by default.</p>
|
||||||
</section>
|
</section>
|
||||||
|
<section className="panel-section space-y-0.5 text-sm">
|
||||||
|
<p className="text-slate-400">Connection</p>
|
||||||
|
<label className="flex items-center justify-between gap-0.5 text-slate-200">
|
||||||
|
<span>Transport</span>
|
||||||
|
<select
|
||||||
|
value={connectionTransport}
|
||||||
|
onChange={handleTransportChange}
|
||||||
|
className="field-input text-sm"
|
||||||
|
>
|
||||||
|
<option value="websocket">WebSocket</option>
|
||||||
|
<option value="polling">Polling</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
<p className="text-xs text-slate-500">Switching reconnects your session.</p>
|
||||||
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</TabPanel>
|
</TabPanel>
|
||||||
<TabPanel id="admin">
|
<TabPanel id="admin">
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
import { io } from 'socket.io-client';
|
import { io } from 'socket.io-client';
|
||||||
|
import { loadSettings } from '../settings/persistence.js';
|
||||||
|
|
||||||
const configured = import.meta.env.VITE_ROVERD_URL?.trim();
|
const configured = import.meta.env.VITE_ROVERD_URL?.trim();
|
||||||
const resolvedUrl = configured && configured.length > 0 ? configured : window.location.origin;
|
const resolvedUrl = configured && configured.length > 0 ? configured : window.location.origin;
|
||||||
console.info('[socket] connecting to', resolvedUrl);
|
console.info('[socket] connecting to', resolvedUrl);
|
||||||
|
const settings = loadSettings();
|
||||||
|
const transportPref = settings?.page?.connectionTransport || 'websocket';
|
||||||
|
const transports = transportPref === 'polling' ? ['polling'] : ['websocket', 'polling'];
|
||||||
export const socket = io(resolvedUrl, {
|
export const socket = io(resolvedUrl, {
|
||||||
transports: ['polling', 'websocket'],
|
transports,
|
||||||
timeout: 15000,
|
timeout: 15000,
|
||||||
});
|
});
|
||||||
socket.on('connect_error', (err) => console.error('connect_error', err.code, err.message, err.data));
|
socket.on('connect_error', (err) => console.error('connect_error', err.code, err.message, err.data));
|
||||||
|
|||||||
Reference in New Issue
Block a user