import { Html } from "@react-three/drei"; import { useCallback, useState } from "react"; import { TriggerObject } from "@/components/three/interaction/TriggerObject"; import { ExplodableModel } from "@/components/three/models/ExplodableModel"; import { REPAIR_GAME_MODEL_CATALOG } from "@/data/gameplay/repairGameModelCatalog"; import type { ModelCatalogItem } from "@/data/gameplay/repairGameModelCatalog"; import { useModelSelection } from "@/hooks/gameplay/useModelSelection"; import type { Vector3Tuple } from "@/types/three/three"; interface RepairModuleSlotProps { position: Vector3Tuple; label: string; disabled?: boolean; onModelSelected?: () => void; onSplit?: () => void; } export function RepairModuleSlot({ position, label, disabled = false, onModelSelected, onSplit, }: RepairModuleSlotProps): React.JSX.Element { const [selectedModel, setSelectedModel] = useState( null, ); const [split, setSplit] = useState(false); const handleSelect = useCallback( (model: ModelCatalogItem) => { setSelectedModel(model); setSplit(false); onModelSelected?.(); }, [onModelSelected], ); const selection = useModelSelection(REPAIR_GAME_MODEL_CATALOG, handleSelect); const triggerLabel = disabled ? "Ouvrir la mallette d'abord" : selectedModel ? split ? `Réassembler ${label}` : `Démonter ${label}` : `Choisir ${label}`; return ( { if (disabled) return; if (selectedModel) { setSplit((value) => { const nextSplit = !value; if (nextSplit) { onSplit?.(); } return nextSplit; }); return; } selection.open(); }} > {selectedModel ? ( ) : ( )} {selection.isOpen ? (
{label} Fleches: choisir E/Enter: valider
    {REPAIR_GAME_MODEL_CATALOG.map((model, index) => (
  • {model.name}
  • ))}
) : null}
); }