diff --git a/package.json b/package.json index b55307b..f91facd 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,8 @@ "dependencies": { "@chakra-ui/icons": "^2.1.1", "@chakra-ui/react": "^2.8.2", + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", "@emotion/react": "^11.11.3", "@emotion/styled": "^11.11.0", "@fortawesome/fontawesome-svg-core": "^6.5.1", diff --git a/src/components/FileUpload.tsx b/src/components/FileUpload.tsx index 23117c5..118c374 100644 --- a/src/components/FileUpload.tsx +++ b/src/components/FileUpload.tsx @@ -5,15 +5,15 @@ import { Track } from '../../types/types'; interface FileUploadProps { onUploadSuccess: () => void; } - - const FileUpload: React.FC = ({ onUploadSuccess }) => { - const [uploading, setUploading] = useState(false); +export const extractTitleFromFileName = (fileName: string) => { + // Remove file extension and replace underscores/dashes with spaces + return fileName.replace(/\.[^/.]+$/, '').replace(/[_-]/g, ' '); +}; +const FileUpload: React.FC = ({ onUploadSuccess }) => { + const [uploading, setUploading] = useState(false); const { uploadTrack } = useTracks(); // Use the `useTracks` hook - const extractTitleFromFileName = (fileName: string) => { - // Remove file extension and replace underscores/dashes with spaces - return fileName.replace(/\.[^/.]+$/, '').replace(/[_-]/g, ' '); - }; + const handleFileUpload = async (file: File) => { setUploading(true); @@ -56,7 +56,7 @@ interface FileUploadProps { - ); + ); }; export default FileUpload; \ No newline at end of file diff --git a/src/components/layout/DragAndDropWrapper.tsx b/src/components/layout/DragAndDropWrapper.tsx new file mode 100644 index 0000000..8838272 --- /dev/null +++ b/src/components/layout/DragAndDropWrapper.tsx @@ -0,0 +1,95 @@ +import React, {FC, useLayoutEffect, useRef, useState} from "react" +import {FaUpload} from "react-icons/fa"; +import {extractTitleFromFileName} from "../FileUpload"; +import {useTracks} from "@/hooks/UseTracks"; +import {createPortal} from "react-dom"; + +interface IProps { + +} + +const DragAndDropWrapper: FC = () => { + const wrapperRef = useRef(null); + const fileInputRef = useRef(null); + const [showModal, setShowModal] = useState(false); + const [uploading, setUploading] = useState(false) + const {uploadTrack, fetchTracks} = useTracks(); + const [portal, setPortal] = useState(null); + const onDragEnter = (e: DragEvent) => { + e.preventDefault() + setShowModal(true) + } + const onDragLeave = () => setShowModal(false) + const onDrop = async (event: DragEvent) => { + event.preventDefault(); + setShowModal(true) + const files = event.dataTransfer?.files || null; + const itemLength = event.dataTransfer?.items.length || 0; + setShowModal(true) + if (itemLength > 0) { + if (fileInputRef.current?.files) { + fileInputRef.current.files = files + setUploading(true); + for (let i = 0; i < itemLength; i++) { + const file: File | undefined = files?.[i] + if (!file) continue; + const formData = new FormData(); + formData.append('file', file); + formData.append('name', extractTitleFromFileName(file.name)); + try { + const success = await uploadTrack(formData); // Use the uploadTrack function from the hook + if (success) { + console.log('Track uploaded successfully'); + await fetchTracks(); + // Optionally, refetch tracks to update the list + } else { + console.error('Track upload failed with no error thrown'); + } + + } catch (error) { + console.error('Error during file upload:', error); + } + } + setUploading(false); + } + } + setShowModal(false) + + }; + useLayoutEffect(() => { + setPortal(document.body) + window.addEventListener('drop', onDrop) + window.addEventListener('dragover', onDragEnter) + window.addEventListener('dragenter', onDragEnter) + window.addEventListener('dragleave', onDragLeave) + return () => { + window.removeEventListener('drop', onDrop) + window.removeEventListener('dragover', onDragEnter) + window.removeEventListener('dragenter', onDragEnter) + window.removeEventListener('dragleave', onDragLeave) + } + }, []) + return portal && createPortal( + +
+ +
+ {(showModal || uploading) && ( +
+ + {uploading ? "File uploading" : "Drop file To upload"} +
+ )} +
+ , portal) +} +export default DragAndDropWrapper \ No newline at end of file diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 83dddfc..2c16576 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -10,6 +10,7 @@ import Modal from '@/components/Modal'; import NavBar from '@/components/layout/NavBar'; import { useRouter } from 'next/router'; import { useTracks } from '@/hooks/UseTracks'; +import DragAndDropWrapper from '@/components/layout/DragAndDropWrapper'; const HomePage: React.FC = () => { const [error, setError] = useState(''); @@ -79,6 +80,10 @@ const HomePage: React.FC = () => {
+ + + +