import { useSignal } from '@preact/signals'; import { useEffect } from 'preact/hooks'; import { RequestBody, ResponseBody } from '/routes/api/files/get-directories.tsx'; import { Directory } from '/lib/types.ts'; interface MoveDirectoryOrFileModalProps { isOpen: boolean; initialPath: string; isDirectory: boolean; name: string; onClickSave: (newPath: string) => Promise; onClose: () => void; } export default function MoveDirectoryOrFileModal( { isOpen, initialPath, isDirectory, name, onClickSave, onClose }: MoveDirectoryOrFileModalProps, ) { const newPath = useSignal(initialPath); const isLoading = useSignal(false); const directories = useSignal([]); useEffect(() => { newPath.value = initialPath; fetchDirectories(); }, [initialPath]); async function fetchDirectories() { if (!initialPath) { return; } isLoading.value = true; try { const requestBody: RequestBody = { parentPath: newPath.value, directoryPathToExclude: isDirectory ? `${initialPath}${name}` : '', }; const response = await fetch(`/api/files/get-directories`, { method: 'POST', body: JSON.stringify(requestBody), }); if (!response.ok) { throw new Error(`Failed to get directories. ${response.statusText} ${await response.text()}`); } const result = await response.json() as ResponseBody; if (!result.success) { throw new Error('Failed to get directories!'); } directories.value = [...result.directories]; isLoading.value = false; } catch (error) { console.error(error); } } async function onChooseNewDirectory(chosenPath: string) { newPath.value = chosenPath; await fetchDirectories(); } const parentPath = newPath.value === '/' ? null : `/${newPath.peek().split('/').filter(Boolean).slice(0, -1).join('/')}`; if (!name) { return null; } return ( <>

Move "{name}" into "{newPath.value}"

    {parentPath ? (
  1. onChooseNewDirectory(parentPath === '/' ? parentPath : `${parentPath}/`)} >

    ..

  2. ) : null} {directories.value.map((directory) => (
  3. onChooseNewDirectory(`${directory.parent_path}${directory.directory_name}/`)} >

    {directory.directory_name}

  4. ))}
{isLoading.value ? ( <> Loading... ) : null} {!isLoading.value ? <>  : null}
); }