// app/projects/design/page.tsx 'use client'; import { Center, Environment, Loader, OrbitControls, useGLTF } from '@react-three/drei'; import { Canvas, useThree } from '@react-three/fiber'; import { Suspense, useEffect, useState, useTransition } from 'react'; import { TbCube3dSphere } from 'react-icons/tb'; import * as THREE from 'three'; import Image from 'next/image'; const models = [ { name: 'Wallet', src: 'Wallet' }, { name: 'Car', src: 'Car' }, { name: 'Magnet holder', src: 'Magnet holder' }, { name: 'PC', src: 'PC' }, ]; function Model({ url, onReady }: { url: string; onReady: () => void }) { const { scene } = useGLTF(url); useEffect(() => { if (scene) { const timer = setTimeout(onReady, 100); return () => clearTimeout(timer); } }, [scene, onReady]); return ; } function DynamicCamera({ radius }: { radius: number }) { const { camera } = useThree(); useEffect(() => { camera.position.set(0, radius * 0.5, radius * 2.5); camera.lookAt(0, 0, 0); camera.updateProjectionMatrix(); }, [radius, camera]); return null; } export default function DesignPage() { const [activeModel, setActiveModel] = useState(models[0].src); const [modelRadius, setModelRadius] = useState(1); const [isPending, startTransition] = useTransition(); const [isSceneReady, setIsSceneReady] = useState(false); const [isCentering, setIsCentering] = useState(true); const handleModelChange = (newModel: string) => { if (newModel === activeModel) return; setIsCentering(true); setIsSceneReady(false); startTransition(() => { setActiveModel(newModel); }); }; const showOverlay = isPending || !isSceneReady; return ( CAD Library {showOverlay && ( {isPending ? "Fetching Data..." : "Compiling Materials..."} )} { setModelRadius(boundingSphere.radius); requestAnimationFrame(() => setIsCentering(false)); }} > setIsSceneReady(true)} /> View in AR {models.map((model) => ( handleModelChange(model.src)} onMouseEnter={() => useGLTF.preload(`/models/${model.src}.glb`)} aria-label={`View ${model.name} model`} > {model.name} ))} ); }
{isPending ? "Fetching Data..." : "Compiling Materials..."}