From 8faf1a233eaaf6ac1236f372f53c05f8a79b6673 Mon Sep 17 00:00:00 2001 From: lyonbot Date: Sun, 19 Jan 2025 14:46:33 +0800 Subject: [PATCH] feat: drag'n'drop with directory --- web/src/components/ContentInput.tsx | 17 ++++++---- web/src/utils/fileEntry.ts | 50 +++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 web/src/utils/fileEntry.ts diff --git a/web/src/components/ContentInput.tsx b/web/src/components/ContentInput.tsx index a053e0b..3fe256c 100644 --- a/web/src/components/ContentInput.tsx +++ b/web/src/components/ContentInput.tsx @@ -2,6 +2,7 @@ import { memo, useEffect, useMemo, useRef, useState } from 'react'; import { useConsistCallback } from '../utils/useConsistCallback'; import { isEqual } from '../utils/isEqual'; import { createThumbnail } from '../utils/createThumbnail'; +import { getFilesFromDataTransferItem } from '../utils/fileEntry'; interface Props { text?: string; @@ -105,10 +106,13 @@ export const ContentInput = memo((props) => { e.preventDefault(); e.stopPropagation(); - const droppedFiles = Array.from(e.dataTransfer!.files); - if (droppedFiles.length) { - handleFilesChange((prev) => [...prev, ...droppedFiles]); - } + const promises = Array.from(e.dataTransfer?.items || [], getFilesFromDataTransferItem) + Promise.all(promises).then((files) => { + const droppedFiles = ([] as File[]).concat(...files); + if (droppedFiles.length) { + handleFilesChange((prev) => [...prev, ...droppedFiles]); + } + }); }; window.addEventListener('drop', handleDrop, true); @@ -184,7 +188,7 @@ export const ContentInput = memo((props) => { Add file - {files.map((file, index) => )} + {files.map((file, index) => )}