import { useContext, useCallback, useEffect, useState } from "react"; import { ViewerContext } from "@/features/vrmViewer/viewerContext"; export default function VRMDemo({ vrmUrl, onLoaded, onError, }: { vrmUrl: string, onLoaded?: () => void, onError?: () => void, }) { const { viewer } = useContext(ViewerContext); const [isLoading, setIsLoading] = useState(true); const [loadingError, setLoadingError] = useState(false); useEffect(() => { setIsLoading(true); setLoadingError(false); }, [vrmUrl]); const canvasRef = useCallback( (canvas: HTMLCanvasElement) => { if (canvas) { viewer.setup(canvas); (new Promise(async (resolve, reject) => { try { const loaded = await viewer.loadVrm(vrmUrl); resolve(true); } catch (e) { reject(); } })) .then(() => { console.log("vrm loaded"); setIsLoading(false); setLoadingError(false); onLoaded && onLoaded(); }) .catch((e) => { console.error("vrm loading error", e); setLoadingError(true); setIsLoading(false); onError && onError(); }); } }, [viewer, vrmUrl] ); return ( <> {isLoading && (
Loading...
)} {loadingError && (Error loading VRM model
)} > ); }