import { isAbsolute, relative } from 'path' import { Fragment, useCallback, useEffect, useState } from 'react' import { Button, Input } from '@janhq/joi' import { useAtom, 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 [janDataFolderPath, setJanDataFolderPath] = useAtom( janDataFolderPathAtom ) const getAppDataFolder = useCallback(async () => { return window.electronAPI?.appDataFolder().then(setJanDataFolderPath) }, [setJanDataFolderPath]) const [destinationPath, setDestinationPath] = useState(undefined) useEffect(() => { getAppDataFolder() }, [getAppDataFolder]) const onChangeFolderClick = useCallback(async () => { const destFolder = await window.core?.api?.selectDirectory() if (!destFolder) return if (destFolder === janDataFolderPath) { setShowSameDirectory(true) return } const currentJanDataFolder = await window.electronAPI?.appDataFolder() const relativePath = relative(currentJanDataFolder, destFolder) if ( relativePath && !relativePath.startsWith('..') && !isAbsolute(relativePath) ) { setShowSameDirectory(true) return } const isEmpty: boolean = await window.core?.api?.isDirectoryEmpty(destFolder) if (!isEmpty) { setDestinationPath(destFolder) showDestNotEmptyConfirm(true) return } setDestinationPath(destFolder) setShowDirectoryConfirm(true) }, [ janDataFolderPath, setShowDirectoryConfirm, setShowSameDirectory, showDestNotEmptyConfirm, ]) const onUserConfirmed = useCallback(async () => { if (!destinationPath) return try { setShowLoader(true) await window.core?.api?.changeDataFolder(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

Default location for messages and other user data.

window.electronAPI?.openFileExplorer(janDataFolderPath) } />
{showLoader && }
) } export default DataFolder