Spaces:
Configuration error
Configuration error
import React, { useEffect, useState } from 'react' | |
import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' | |
import Button from '../shared/Button' | |
import { fileState, gifImageState, toastState } from '../../store/Atoms' | |
import { makeGif } from '../../adapters/inpainting' | |
import Modal from '../shared/Modal' | |
import { LoadingIcon } from '../shared/Toast' | |
import { downloadImage } from '../../utils' | |
import emitter from '../../event' | |
import { PluginName } from '../Plugins/Plugins' | |
interface Props { | |
renders: HTMLImageElement[] | |
} | |
const MakeGIF = (props: Props) => { | |
const { renders } = props | |
const [gifImg, setGifImg] = useRecoilState(gifImageState) | |
const file = useRecoilValue(fileState) | |
const setToastState = useSetRecoilState(toastState) | |
const [show, setShow] = useState(false) | |
const handleOnClose = () => { | |
setShow(false) | |
} | |
const handleDownload = () => { | |
if (gifImg) { | |
const name = file.name.replace(/\.[^/.]+$/, '.gif') | |
downloadImage(gifImg.src, name) | |
} | |
} | |
useEffect(() => { | |
emitter.on(PluginName.MakeGIF, async () => { | |
if (renders.length === 0) { | |
setToastState({ | |
open: true, | |
desc: 'No render found', | |
state: 'error', | |
duration: 2000, | |
}) | |
return | |
} | |
setShow(true) | |
setGifImg(null) | |
try { | |
const gif = await makeGif( | |
file, | |
renders[renders.length - 1], | |
file.name, | |
file.type | |
) | |
if (gif) { | |
setGifImg(gif) | |
} | |
} catch (e: any) { | |
setToastState({ | |
open: true, | |
desc: e.message ? e.message : e.toString(), | |
state: 'error', | |
duration: 2000, | |
}) | |
setShow(false) | |
} | |
}) | |
return () => { | |
emitter.off(PluginName.MakeGIF) | |
} | |
}, [setGifImg, renders, file, setShow]) | |
return ( | |
<Modal | |
onClose={handleOnClose} | |
title="GIF" | |
className="modal-setting" | |
show={show} | |
> | |
<div | |
style={{ | |
display: 'flex', | |
alignItems: 'center', | |
justifyContent: 'center', | |
flexDirection: 'column', | |
gap: 16, | |
}} | |
> | |
{gifImg ? ( | |
<img src={gifImg.src} style={{ borderRadius: 8 }} alt="gif" /> | |
) : ( | |
<div | |
style={{ | |
display: 'flex', | |
alignItems: 'center', | |
justifyContent: 'center', | |
gap: 8, | |
}} | |
> | |
<LoadingIcon /> | |
Generating GIF... | |
</div> | |
)} | |
{gifImg && ( | |
<div | |
style={{ | |
display: 'flex', | |
width: '100%', | |
justifyContent: 'flex-end', | |
alignItems: 'center', | |
gap: '12px', | |
}} | |
> | |
<Button onClick={handleDownload} border> | |
Download | |
</Button> | |
</div> | |
)} | |
</div> | |
</Modal> | |
) | |
} | |
export default MakeGIF | |