import React, { useState } from 'react'; import { Modal, TextInput, Button, Group, Box, Popover, ActionIcon, Text } from '@mantine/core'; import { IconFolderOpen } from '@tabler/icons-react'; import { useModalContext } from '../../../contexts/ModalContext'; import { useFileList } from '../../../hooks/useFileList'; import { FolderSelector } from '../../files/FolderSelector'; interface CreateFileModalProps { onCreateFile: (fileName: string) => Promise; } const CreateFileModal: React.FC = ({ onCreateFile }) => { const [fileName, setFileName] = useState(''); const [selectedFolder, setSelectedFolder] = useState(''); const [popoverOpened, setPopoverOpened] = useState(false); const { newFileModalVisible, setNewFileModalVisible } = useModalContext(); const { files, loadFileList } = useFileList(); const handleSubmit = async (): Promise => { if (fileName) { const fullPath = selectedFolder ? `${selectedFolder}/${fileName.trim()}` : fileName.trim(); await onCreateFile(fullPath); setFileName(''); setSelectedFolder(''); setNewFileModalVisible(false); } }; const handleClose = () => { setFileName(''); setSelectedFolder(''); setNewFileModalVisible(false); }; const handleFolderSelect = (path: string) => { setSelectedFolder(path); setPopoverOpened(false); }; // Load files when modal opens React.useEffect(() => { if (newFileModalVisible) { void loadFileList(); } }, [newFileModalVisible, loadFileList]); // Generate full path preview const fullPathPreview = selectedFolder ? `${selectedFolder}/${fileName || 'filename'}` : fileName || 'filename'; // Display text for location input const locationDisplay = selectedFolder || '/ (root)'; const handleKeyDown = (event: React.KeyboardEvent): void => { if (event.key === 'Enter' && !event.shiftKey) { event.preventDefault(); void handleSubmit(); } }; return ( {/* Location input with folder picker */} setPopoverOpened((o) => !o)} data-testid="folder-picker-button" > } styles={{ input: { cursor: 'pointer', }, }} onClick={() => setPopoverOpened(true)} /> {/* File name input */} setFileName(event.currentTarget.value)} onKeyDown={handleKeyDown} mb="xs" w="100%" /> {/* Hint text */} Tip: Use / to create nested folders (e.g., folder/subfolder/file.md) {/* Full path preview */} Full path: {fullPathPreview} ); }; export default CreateFileModal;