import { useCallback, useMemo, useState } from 'react'; import { getProceduralDemoMachine, proceduralDemoMachines, } from './proceduralDemoManifest'; import type { ProceduralMachineId, ProceduralMachineModule, } from './types'; export interface UseProceduralDemoMachineResult { machine: ProceduralMachineModule; machines: ProceduralMachineModule[]; selectedMachineId: ProceduralMachineId; selectMachine: (machineId: ProceduralMachineId) => void; selectNextMachine: () => void; selectPreviousMachine: () => void; } export function useProceduralDemoMachine( initialMachineId?: string | null, ): UseProceduralDemoMachineResult { const initial = getProceduralDemoMachine(initialMachineId); const [selectedMachineId, setSelectedMachineId] = useState(initial.definition.id); const machine = useMemo( () => getProceduralDemoMachine(selectedMachineId), [selectedMachineId], ); const selectMachine = useCallback((machineId: ProceduralMachineId) => { setSelectedMachineId(machineId); }, []); const selectNextMachine = useCallback(() => { setSelectedMachineId((currentId) => { const index = proceduralDemoMachines.findIndex((candidate) => candidate.definition.id === currentId); return proceduralDemoMachines[(index + 1) % proceduralDemoMachines.length].definition.id; }); }, []); const selectPreviousMachine = useCallback(() => { setSelectedMachineId((currentId) => { const index = proceduralDemoMachines.findIndex((candidate) => candidate.definition.id === currentId); return proceduralDemoMachines[ (index - 1 + proceduralDemoMachines.length) % proceduralDemoMachines.length ].definition.id; }); }, []); return { machine, machines: proceduralDemoMachines, selectedMachineId, selectMachine, selectNextMachine, selectPreviousMachine, }; }