import { Fragment, useCallback, useState } from 'react' import { fs, AppConfiguration, isSubdirectory } from '@janhq/core' import { Button, Input } from '@janhq/uikit' import { useAtomValue, useSetAtom } from 'jotai' import { PencilIcon, FolderOpenIcon } from 'lucide-react' import Loader from '@/containers/Loader' export const SUCCESS_SET_NEW_DESTINATION = 'successSetNewDestination' import ModalChangeDirectory, { showDirectoryConfirmModalAtom, } from './ModalChangeDirectory' import ModalChangeDestNotEmpty, { showDestNotEmptyConfirmAtom, } from './ModalConfirmDestNotEmpty' import ModalErrorSetDestGlobal, { showChangeFolderErrorAtom, } from './ModalErrorSetDestGlobal' import ModalSameDirectory, { showSamePathModalAtom } from './ModalSameDirectory' import { janDataFolderPathAtom } from '@/helpers/atoms/AppConfig.atom' const DataFolder = () => { const [showLoader, setShowLoader] = useState(false) const setShowDirectoryConfirm = useSetAtom(showDirectoryConfirmModalAtom) const setShowSameDirectory = useSetAtom(showSamePathModalAtom) const setShowChangeFolderError = useSetAtom(showChangeFolderErrorAtom) const showDestNotEmptyConfirm = useSetAtom(showDestNotEmptyConfirmAtom) const [destinationPath, setDestinationPath] = useState(undefined) const janDataFolderPath = useAtomValue(janDataFolderPathAtom) const onChangeFolderClick = useCallback(async () => { const destFolder = await window.core?.api?.selectDirectory() if (!destFolder) return if (destFolder === janDataFolderPath) { setShowSameDirectory(true) return } const appConfiguration: AppConfiguration = await window.core?.api?.getAppConfigurations() const currentJanDataFolder = appConfiguration.data_folder if (await isSubdirectory(currentJanDataFolder, destFolder)) { setShowSameDirectory(true) return } const newDestChildren: string[] = await fs.readdirSync(destFolder) const isNotEmpty = newDestChildren.filter((x) => x !== '.DS_Store').length > 0 if (isNotEmpty) { setDestinationPath(destFolder) showDestNotEmptyConfirm(true) return } setDestinationPath(destFolder) setShowDirectoryConfirm(true) }, [ janDataFolderPath, setShowDirectoryConfirm, setShowSameDirectory, showDestNotEmptyConfirm, ]) const onUserConfirmed = useCallback(async () => { if (!destinationPath) return try { setShowLoader(true) const appConfiguration: AppConfiguration = await window.core?.api?.getAppConfigurations() const currentJanDataFolder = appConfiguration.data_folder appConfiguration.data_folder = destinationPath const { err } = await fs.syncFile(currentJanDataFolder, destinationPath) if (err) throw err await window.core?.api?.updateAppConfiguration(appConfiguration) console.debug( `File sync finished from ${currentJanDataFolder} to ${destinationPath}` ) localStorage.setItem(SUCCESS_SET_NEW_DESTINATION, 'true') setTimeout(() => { setShowLoader(false) }, 1200) await window.core?.api?.relaunch() } catch (e) { console.error(e) setShowLoader(false) setShowChangeFolderError(true) } }, [destinationPath, setShowChangeFolderError]) return (
Jan Data Folder

Where messages, model configurations, and other user data are placed.

window.core?.api?.openAppDirectory()} />
{showLoader && }
) } export default DataFolder