import { getSkinUrl } from '@/utils/minecraft'; import { useEffect, useRef } from 'react'; import * as skinviewer from 'skinview3d'; import { twMerge } from 'tailwind-merge'; export interface SkinViewerProps { skinUrl?: string | undefined | null; capeUrl?: string | undefined | null; width?: number; height?: number; className?: string | undefined; } export function SkinViewer({ skinUrl, capeUrl, width = 260, height = 300, className, }: SkinViewerProps) { const canvasRef = useRef(null); const viewerRef = useRef(null); useEffect(() => { if (!canvasRef.current) return; const viewer = new skinviewer.SkinViewer({ canvas: canvasRef.current, }); viewer.autoRotate = true; viewer.autoRotateSpeed = 0.25; viewerRef.current = viewer; return () => { viewer.dispose(); }; }, []); useEffect(() => { if (!viewerRef.current) return; viewerRef.current.loadSkin(getSkinUrl(skinUrl)); }, [skinUrl]); useEffect(() => { }, [capeUrl]); useEffect(() => { if (!viewerRef.current) return; if (capeUrl) viewerRef.current.loadCape(capeUrl); else viewerRef.current.resetCape(); }, [capeUrl]); useEffect(() => { if (!viewerRef.current) return; viewerRef.current.setSize(width, height); }, [width, height]); return (
Hold to drag. Scroll to zoom in/out.
); }