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 (
{
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 }]) => (
![{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