import React, { useCallback, useEffect, useRef, useState } from 'react' import { download } from '../../utils/transfer' import classes from './App.module.css' import Menu from '../../components/Menu' import PopupOver from '../../components/PopupOver' import { useBodyEditor } from '../../hooks' import { LockClosedIcon, LockOpen2Icon, ResetIcon, ResumeIcon, } from '@radix-ui/react-icons' import { getCurrentTime } from '../../utils/time' import useMessageDispatch from '../../hooks/useMessageDispatch' const { app, threejsCanvas, gallery, background } = classes const PreviewCanvas = React.forwardRef< HTMLCanvasElement, { isLock: boolean enable: boolean onChange: (isLock: boolean) => void onRestore: () => void onRun: () => void } >(({ isLock, enable, onChange, onRestore, onRun }, ref) => { const Icon = isLock ? LockClosedIcon : LockOpen2Icon return (
{ onRun() }} > { onChange(!isLock) }} > { if (isLock) onRestore() }} >
) }) function App() { const canvasRef = useRef(null) const previewCanvasRef = useRef(null) const backgroundRef = useRef(null) const editor = useBodyEditor(canvasRef, previewCanvasRef, backgroundRef) const [imageData, setImageData] = useState< Record >(() => ({ pose: { title: '', src: '', }, depth: { title: '', src: '', }, normal: { title: '', src: '', }, canny: { title: '', src: '', }, })) const onChangeBackground = useCallback((url: string) => { const div = backgroundRef.current if (div) { div.style.backgroundImage = url ? `url(${url})` : 'none' } }, []) const onScreenShot = useCallback( (data: Record) => { setImageData(data) }, [] ) const [preview, setPreivew] = useState(false) const [lockView, setLockView] = useState(false) useEffect(() => { const preview = (enable: boolean) => { setPreivew(enable) } const lcokView = (value: boolean) => { setLockView(value) } editor?.PreviewEventManager.AddEventListener(preview) editor?.LockViewEventManager.AddEventListener(lcokView) return () => { editor?.PreviewEventManager.RemoveEventListener(preview) editor?.LockViewEventManager.RemoveEventListener(lcokView) } }, [editor]) useMessageDispatch({ GetAppVersion: () => __APP_VERSION__, MakeImages: () => editor?.MakeImages(), Pause: () => editor?.pause(), Resume: () => editor?.resume(), OutputWidth: (value: number) => { if (editor && typeof value === 'number') { editor.OutputWidth = value return true } else return false }, OutputHeight: (value: number) => { if (editor && typeof value === 'number') { editor.OutputHeight = value return true } else return false }, OnlyHand(value: boolean) { if (editor && typeof value === 'boolean') { editor.OnlyHand = value return true } else return false }, MoveMode(value: boolean) { if (editor && typeof value === 'boolean') { editor.MoveMode = value return true } else return false }, GetWidth: () => editor?.Width, GetHeight: () => editor?.Height, GetSceneData: () => editor?.GetSceneData(), LockView: () => editor?.LockView(), UnlockView: () => editor?.UnlockView(), RestoreView: () => editor?.RestoreView(), }) return (
{ e.preventDefault() }} >
{ if (isLock) { editor?.LockView() } else { editor?.UnlockView() } }} onRestore={() => { editor?.RestoreView() }} onRun={async () => { if (!editor) return const image = editor.MakeImages() const result = Object.fromEntries( Object.entries(image).map(([name, imgData]) => [ name, { src: imgData, title: name + '_' + getCurrentTime(), }, ]) ) onScreenShot(result) }} > {Object.entries(imageData).map(([name, { src, title }]) => ( { const image = e.target as HTMLImageElement const title = image?.getAttribute('title') ?? '' const url = image?.getAttribute('src') ?? '' download(url, title) }} > ))}
{editor ? ( ) : undefined}
{editor ? ( ) : undefined}
) } export default App