Spaces:
Configuration error
Configuration error
import React, { useEffect } from 'react' | |
import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' | |
import Editor from './Editor/Editor' | |
import ShortcutsModal from './Shortcuts/ShortcutsModal' | |
import SettingModal from './Settings/SettingsModal' | |
import Toast from './shared/Toast' | |
import { | |
AIModel, | |
fileState, | |
isPaintByExampleState, | |
isPix2PixState, | |
isSDState, | |
settingState, | |
showFileManagerState, | |
toastState, | |
} from '../store/Atoms' | |
import { | |
currentModel, | |
getMediaFile, | |
modelDownloaded, | |
switchModel, | |
} from '../adapters/inpainting' | |
import SidePanel from './SidePanel/SidePanel' | |
import PESidePanel from './SidePanel/PESidePanel' | |
import FileManager from './FileManager/FileManager' | |
import P2PSidePanel from './SidePanel/P2PSidePanel' | |
import Plugins from './Plugins/Plugins' | |
import Flex from './shared/Layout' | |
import ImageSize from './ImageSize/ImageSize' | |
const Workspace = () => { | |
const setFile = useSetRecoilState(fileState) | |
const [settings, setSettingState] = useRecoilState(settingState) | |
const [toastVal, setToastState] = useRecoilState(toastState) | |
const isSD = useRecoilValue(isSDState) | |
const isPaintByExample = useRecoilValue(isPaintByExampleState) | |
const isPix2Pix = useRecoilValue(isPix2PixState) | |
const [showFileManager, setShowFileManager] = | |
useRecoilState(showFileManagerState) | |
const onSettingClose = async () => { | |
const curModel = await currentModel().then(res => res.text()) | |
if (curModel === settings.model) { | |
return | |
} | |
const downloaded = await modelDownloaded(settings.model).then(res => | |
res.text() | |
) | |
const { model } = settings | |
let loadingMessage = `Switching to ${model} model` | |
let loadingDuration = 3000 | |
if (downloaded === 'False') { | |
loadingMessage = `Downloading ${model} model, this may take a while` | |
loadingDuration = 9999999999 | |
} | |
setToastState({ | |
open: true, | |
desc: loadingMessage, | |
state: 'loading', | |
duration: loadingDuration, | |
}) | |
switchModel(model) | |
.then(res => { | |
if (res.ok) { | |
setToastState({ | |
open: true, | |
desc: `Switch to ${model} model success`, | |
state: 'success', | |
duration: 3000, | |
}) | |
} else { | |
throw new Error('Server error') | |
} | |
}) | |
.catch(() => { | |
setToastState({ | |
open: true, | |
desc: `Switch to ${model} model failed`, | |
state: 'error', | |
duration: 3000, | |
}) | |
setSettingState(old => { | |
return { ...old, model: curModel as AIModel } | |
}) | |
}) | |
} | |
useEffect(() => { | |
currentModel() | |
.then(res => res.text()) | |
.then(model => { | |
setSettingState(old => { | |
return { ...old, model: model as AIModel } | |
}) | |
}) | |
}, [setSettingState]) | |
return ( | |
<> | |
{isSD ? <SidePanel /> : <></>} | |
{isPaintByExample ? <PESidePanel /> : <></>} | |
{isPix2Pix ? <P2PSidePanel /> : <></>} | |
<Flex style={{ position: 'absolute', top: 68, left: 24, gap: 12 }}> | |
<Plugins /> | |
<ImageSize /> | |
</Flex> | |
<FileManager | |
photoWidth={256} | |
show={showFileManager} | |
onClose={() => { | |
setShowFileManager(false) | |
}} | |
onPhotoClick={async (tab: string, filename: string) => { | |
const newFile = await getMediaFile(tab, filename) | |
setFile(newFile) | |
setShowFileManager(false) | |
}} | |
/> | |
<Editor /> | |
<SettingModal onClose={onSettingClose} /> | |
<ShortcutsModal /> | |
<Toast | |
{...toastVal} | |
onOpenChange={(open: boolean) => { | |
setToastState(old => { | |
return { ...old, open } | |
}) | |
}} | |
/> | |
</> | |
) | |
} | |
export default Workspace | |