import { useState, useEffect } from 'react' import { EngineCommandManagerEvents } from 'lang/std/engineConnection' import { engineCommandManager, sceneInfra } from 'lib/singletons' import { throttle, isReducedMotion } from 'lib/utils' import { reportRejection } from 'lib/trap' const updateDollyZoom = throttle( (newFov: number) => sceneInfra.camControls.dollyZoom(newFov), 1000 / 15 ) export const CamToggle = () => { const [isPerspective, setIsPerspective] = useState(true) const [fov, setFov] = useState(40) const [enableRotate, setEnableRotate] = useState(true) useEffect(() => { engineCommandManager.addEventListener( EngineCommandManagerEvents.SceneReady, () => { sceneInfra.camControls.dollyZoom(fov).catch(reportRejection) } ) }, []) const toggleCamera = () => { if (isPerspective) { isReducedMotion() ? sceneInfra.camControls.useOrthographicCamera() : sceneInfra.camControls.animateToOrthographic().catch(reportRejection) } else { isReducedMotion() ? sceneInfra.camControls.usePerspectiveCamera().catch(reportRejection) : sceneInfra.camControls.animateToPerspective().catch(reportRejection) } setIsPerspective(!isPerspective) } const handleFovChange = (newFov: number) => { setFov(newFov) updateDollyZoom(newFov) } return (