diff --git a/packages/web/src/components/useCaseBuilder/UseCaseBuilderView.tsx b/packages/web/src/components/useCaseBuilder/UseCaseBuilderView.tsx index 3dd2df7f..4f76897b 100644 --- a/packages/web/src/components/useCaseBuilder/UseCaseBuilderView.tsx +++ b/packages/web/src/components/useCaseBuilder/UseCaseBuilderView.tsx @@ -166,6 +166,7 @@ const UseCaseBuilderView: React.FC = (props) => { errorMessages: fileErrorMessages, clear: clearFiles, } = useFiles(); + const [isOver, setIsOver] = useState(false); const [errorMessages, setErrorMessages] = useState([]); @@ -400,8 +401,57 @@ const UseCaseBuilderView: React.FC = (props) => { [deleteUploadedFile, accept] ); + const handleDragOver = (event: React.DragEvent) => { + // ファイルドラッグ時にオーバーレイを表示 + event.preventDefault(); + setIsOver(true); + }; + + const handleDragLeave = (event: React.DragEvent) => { + // ファイルドラッグ時にオーバーレイを非表示 + event.preventDefault(); + setIsOver(false); + }; + + const handleDrop = (event: React.DragEvent) => { + // ファイルドロップ時にファイルを追加 + event.preventDefault(); + setIsOver(false); + if (event.dataTransfer.files) { + // ファイルを反映しアップロード + uploadFiles(Array.from(event.dataTransfer.files), fileLimit, accept); + } + }; + + const handlePaste = async (pasteEvent: React.ClipboardEvent) => { + const fileList = pasteEvent.clipboardData.items || []; + const files = Array.from(fileList) + .filter((file) => file.kind === 'file') + .map((file) => file.getAsFile() as File); + if (files.length > 0 && fileLimit && accept) { + // ファイルをアップロード + uploadFiles(Array.from(files), fileLimit, accept); + // ファイルの場合ファイル名もペーストされるためデフォルトの挙動を止める + pasteEvent.preventDefault(); + } + // ファイルがない場合はデフォルトの挙動(テキストのペースト) + }; + return ( -
+
+ {isOver && props.fileUpload && ( +
+
+
ファイルをドロップしてアップロード
+
+
+ )}
{!props.previewMode &&
}