clean: remove obsolete repair debug code + unused core utilities

This commit is contained in:
Tom Boullay
2026-05-08 02:07:03 +01:00
parent 15c3d1858f
commit eee69825c6
34 changed files with 144 additions and 797 deletions
-79
View File
@@ -1,79 +0,0 @@
import { useCallback, useEffect, useState } from "react";
import type { ModelCatalogItem } from "@/data/gameplay/repairGameModelCatalog";
interface UseModelSelectionResult {
isOpen: boolean;
selectedIndex: number;
selectedModel: ModelCatalogItem;
open: () => void;
close: () => void;
}
export function useModelSelection(
models: ModelCatalogItem[],
onSelect: (model: ModelCatalogItem) => void,
): UseModelSelectionResult {
const [isOpen, setIsOpen] = useState(false);
const [selectedIndex, setSelectedIndex] = useState(0);
const firstModel = models[0];
if (!firstModel) {
throw new Error("useModelSelection requires at least one model");
}
const selectedModel = models[selectedIndex] ?? firstModel;
const close = useCallback(() => setIsOpen(false), []);
const open = useCallback(() => setIsOpen(true), []);
useEffect(() => {
if (!isOpen) return;
const handleKeyDown = (event: KeyboardEvent): void => {
const key = event.key.toLowerCase();
if (["arrowup", "arrowleft"].includes(key)) {
setSelectedIndex((index) =>
index === 0 ? models.length - 1 : index - 1,
);
event.preventDefault();
event.stopPropagation();
return;
}
if (["arrowdown", "arrowright"].includes(key)) {
setSelectedIndex((index) => (index + 1) % models.length);
event.preventDefault();
event.stopPropagation();
return;
}
if (key === "e" || key === "enter") {
onSelect(selectedModel);
close();
event.preventDefault();
event.stopPropagation();
return;
}
if (key === "escape") {
close();
event.preventDefault();
event.stopPropagation();
}
};
window.addEventListener("keydown", handleKeyDown, { capture: true });
return () => {
window.removeEventListener("keydown", handleKeyDown, { capture: true });
};
}, [close, isOpen, models, onSelect, selectedModel]);
return {
isOpen,
selectedIndex,
selectedModel,
open,
close,
};
}
@@ -1,6 +1,5 @@
import { useEffect, useRef, useState } from "react";
import {
HAND_TRACKING_CAMERA_TIMEOUT_MS,
HAND_TRACKING_FRAME_HEIGHT,
HAND_TRACKING_FRAME_WIDTH,
HAND_TRACKING_TARGET_FPS,
@@ -9,51 +8,22 @@ import {
convertBrowserHandResult,
getBrowserHandLandmarker,
} from "@/lib/handTracking/browserHandTracking";
import {
INITIAL_HAND_TRACKING_SNAPSHOT,
getCameraStreamWithTimeout,
} from "@/lib/handTracking/handTrackingSession";
import type { HandTrackingSnapshot } from "@/types/handTracking/handTracking";
interface UseBrowserHandTrackingOptions {
enabled: boolean;
}
const INITIAL_SNAPSHOT: HandTrackingSnapshot = {
hands: [],
status: "idle",
usageStatus: "inactive",
serverStatus: null,
error: null,
};
function getCameraStreamWithTimeout(
constraints: MediaStreamConstraints,
): Promise<MediaStream> {
let didTimeout = false;
const streamPromise = navigator.mediaDevices.getUserMedia(constraints);
const timeoutPromise = new Promise<never>((_, reject) => {
window.setTimeout(() => {
didTimeout = true;
reject(
new Error(
"Camera request timed out. Restart Arc or check camera permissions for localhost:5173.",
),
);
}, HAND_TRACKING_CAMERA_TIMEOUT_MS);
});
streamPromise.then((stream) => {
if (didTimeout) {
stream.getTracks().forEach((track) => track.stop());
}
});
return Promise.race([streamPromise, timeoutPromise]);
}
export function useBrowserHandTracking({
enabled,
}: UseBrowserHandTrackingOptions): HandTrackingSnapshot {
const [snapshot, setSnapshot] =
useState<HandTrackingSnapshot>(INITIAL_SNAPSHOT);
const [snapshot, setSnapshot] = useState<HandTrackingSnapshot>(
INITIAL_HAND_TRACKING_SNAPSHOT,
);
const videoRef = useRef<HTMLVideoElement | null>(null);
const streamRef = useRef<MediaStream | null>(null);
const intervalRef = useRef<number | null>(null);
@@ -1,6 +1,5 @@
import { useEffect, useRef, useState } from "react";
import {
HAND_TRACKING_CAMERA_TIMEOUT_MS,
HAND_TRACKING_FRAME_HEIGHT,
HAND_TRACKING_FRAME_WIDTH,
HAND_TRACKING_JPEG_QUALITY,
@@ -8,6 +7,10 @@ import {
HAND_TRACKING_TARGET_FPS,
getHandTrackingWsUrl,
} from "@/data/handTrackingConfig";
import {
INITIAL_HAND_TRACKING_SNAPSHOT,
getCameraStreamWithTimeout,
} from "@/lib/handTracking/handTrackingSession";
import type {
HandTrackingFrameMessage,
HandTrackingHand,
@@ -20,14 +23,6 @@ interface UseRemoteHandTrackingOptions {
websocketUrl?: string;
}
const INITIAL_SNAPSHOT: HandTrackingSnapshot = {
hands: [],
status: "idle",
usageStatus: "inactive",
serverStatus: null,
error: null,
};
function getBase64Payload(dataUrl: string): string {
return dataUrl.slice(dataUrl.indexOf(",") + 1);
}
@@ -84,38 +79,13 @@ function isHandTrackingServerMessage(
);
}
function getCameraStreamWithTimeout(
constraints: MediaStreamConstraints,
): Promise<MediaStream> {
let didTimeout = false;
const streamPromise = navigator.mediaDevices.getUserMedia(constraints);
const timeoutPromise = new Promise<never>((_, reject) => {
window.setTimeout(() => {
didTimeout = true;
reject(
new Error(
"Camera request timed out. Restart Arc or check camera permissions for localhost:5173.",
),
);
}, HAND_TRACKING_CAMERA_TIMEOUT_MS);
});
streamPromise.then((stream) => {
if (didTimeout) {
stream.getTracks().forEach((track) => track.stop());
}
});
return Promise.race([streamPromise, timeoutPromise]);
}
export function useRemoteHandTracking({
enabled,
websocketUrl = getHandTrackingWsUrl(),
}: UseRemoteHandTrackingOptions): HandTrackingSnapshot {
const [snapshot, setSnapshot] =
useState<HandTrackingSnapshot>(INITIAL_SNAPSHOT);
const [snapshot, setSnapshot] = useState<HandTrackingSnapshot>(
INITIAL_HAND_TRACKING_SNAPSHOT,
);
const videoRef = useRef<HTMLVideoElement | null>(null);
const canvasRef = useRef<HTMLCanvasElement | null>(null);
const streamRef = useRef<MediaStream | null>(null);