import { FOCUSABLE_BUT_NOT_TABBABLE } from '@/Constants/Constants' import { WebApplication } from '@/Application/Application' import { FileItem } from '@standardnotes/snjs' import { FilesIllustration } from '@standardnotes/icons' import { observer } from 'mobx-react-lite' import { Dispatch, FunctionComponent, SetStateAction, useRef, useState } from 'react' import Button from '@/Components/Button/Button' import Icon from '@/Components/Icon/Icon' import PopoverFileItem from './PopoverFileItem' import { PopoverFileItemActionType } from './PopoverFileItemAction' import { PopoverTabs } from './PopoverTabs' import { FilesController } from '@/Controllers/FilesController' import { StreamingFileReader } from '@standardnotes/filepicker' import ClearInputButton from '../ClearInputButton/ClearInputButton' import DecoratedInput from '../Input/DecoratedInput' type Props = { application: WebApplication filesController: FilesController allFiles: FileItem[] attachedFiles: FileItem[] currentTab: PopoverTabs isDraggingFiles: boolean setCurrentTab: Dispatch> attachedTabDisabled: boolean } const AttachedFilesPopover: FunctionComponent = ({ application, filesController, allFiles, attachedFiles, currentTab, isDraggingFiles, setCurrentTab, attachedTabDisabled, }) => { const fileInputRef = useRef(null) const [searchQuery, setSearchQuery] = useState('') const searchInputRef = useRef(null) const filesList = currentTab === PopoverTabs.AttachedFiles ? attachedFiles : allFiles const filteredList = searchQuery.length > 0 ? filesList.filter((file) => file.name.toLowerCase().indexOf(searchQuery.toLowerCase()) !== -1) : filesList const attachFilesIfRequired = (files: FileItem[]) => { if (currentTab === PopoverTabs.AttachedFiles) { files.forEach((file) => { filesController .handleFileAction({ type: PopoverFileItemActionType.AttachFileToNote, payload: { file }, }) .catch(console.error) }) } } const handleAttachFilesClick = async () => { if (!StreamingFileReader.available()) { fileInputRef.current?.click() return } const uploadedFiles = await filesController.uploadNewFile() if (!uploadedFiles) { return } attachFilesIfRequired(uploadedFiles) } const previewHandler = (file: FileItem) => { filesController .handleFileAction({ type: PopoverFileItemActionType.PreviewFile, payload: { file, otherFiles: currentTab === PopoverTabs.AllFiles ? allFiles : attachedFiles }, }) .catch(console.error) } return (
{filteredList.length > 0 || searchQuery.length > 0 ? (
0 && ( { setSearchQuery('') searchInputRef.current?.focus() }} /> ), ]} />
) : null} {filteredList.length > 0 ? ( filteredList.map((file: FileItem) => { return ( ) }) ) : (
{searchQuery.length > 0 ? 'No result found' : currentTab === PopoverTabs.AttachedFiles ? 'No files attached to this note' : 'No files found in this account'}
Or drop your files here
)}
{ const files = event.currentTarget.files if (!files) { return } for (const file of files) { const uploadedFiles = await filesController.uploadNewFile(file) if (uploadedFiles) { attachFilesIfRequired(uploadedFiles) } } }} /> {filteredList.length > 0 && ( )}
) } export default observer(AttachedFilesPopover)