diff --git a/src/app/organisms/drag-drop/DragDrop.jsx b/src/app/organisms/drag-drop/DragDrop.jsx new file mode 100644 index 00000000..4fd0bb7f --- /dev/null +++ b/src/app/organisms/drag-drop/DragDrop.jsx @@ -0,0 +1,24 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import './DragDrop.scss'; + +import RawModal from '../../atoms/modal/RawModal'; +import Text from '../../atoms/text/Text'; + +function DragDrop({ isOpen }) { + return ( + + Drop file to upload + + ); +} + +DragDrop.propTypes = { + isOpen: PropTypes.bool.isRequired, +}; + +export default DragDrop; diff --git a/src/app/organisms/drag-drop/DragDrop.scss b/src/app/organisms/drag-drop/DragDrop.scss new file mode 100644 index 00000000..6361553f --- /dev/null +++ b/src/app/organisms/drag-drop/DragDrop.scss @@ -0,0 +1,12 @@ +.drag-drop__model { + box-shadow: none; + text-align: center; + + .text { + color: white; + } +} + +.drag-drop__overlay { + background-color: var(--bg-overlay-low); +} diff --git a/src/app/templates/client/Client.jsx b/src/app/templates/client/Client.jsx index 6768cc4a..cec18956 100644 --- a/src/app/templates/client/Client.jsx +++ b/src/app/templates/client/Client.jsx @@ -14,10 +14,12 @@ import logout from '../../../client/action/logout'; import initMatrix from '../../../client/initMatrix'; import navigation from '../../../client/state/navigation'; import cons from '../../../client/state/cons'; +import DragDrop from '../../organisms/drag-drop/DragDrop'; function Client() { const [isLoading, changeLoading] = useState(true); const [loadingMsg, setLoadingMsg] = useState('Heating up'); + const [dragCounter, setDragCounter] = useState(0); useEffect(() => { let counter = 0; @@ -57,31 +59,68 @@ function Client() { ); } - const handleDrag = (e) => { + function dragContainsFiles(e) { + if (!e.dataTransfer.types) return false; + + for (let i = 0; i < e.dataTransfer.types.length; i += 1) { + if (e.dataTransfer.types[i] === 'Files') return true; + } + return false; + } + + function modalOpen() { + return navigation.isRawModalVisible && dragCounter <= 0; + } + + function handleDragOver(e) { + if (!dragContainsFiles(e)) return; + e.preventDefault(); - if (!navigation.selectedRoomId) { + if (!navigation.selectedRoomId || modalOpen()) { e.dataTransfer.dropEffect = 'none'; } - }; + } - const handleDrop = (e) => { + function handleDragEnter(e) { e.preventDefault(); + if (navigation.selectedRoomId && !modalOpen() && dragContainsFiles(e)) { + setDragCounter(dragCounter + 1); + } + } + + function handleDragLeave(e) { + e.preventDefault(); + + if (navigation.selectedRoomId && !modalOpen() && dragContainsFiles(e)) { + setDragCounter(dragCounter - 1); + } + } + + function handleDrop(e) { + e.preventDefault(); + + setDragCounter(0); + + if (modalOpen()) return; + const roomId = navigation.selectedRoomId; if (!roomId) return; const { files } = e.dataTransfer; - if (!files) return; + if (!files?.length) return; const file = files[0]; initMatrix.roomsInput.setAttachment(roomId, file); initMatrix.roomsInput.emit(cons.events.roomsInput.ATTACHMENT_SET, file); - }; + } return (
@@ -94,6 +133,7 @@ function Client() { +
); } diff --git a/src/index.scss b/src/index.scss index 3dbbfc94..9e8833ce 100644 --- a/src/index.scss +++ b/src/index.scss @@ -101,6 +101,7 @@ /* shadow and overlay */ --bg-overlay: rgba(0, 0, 0, 20%); + --bg-overlay-low: rgba(0, 0, 0, 85%); --bs-popup: 0 0 16px rgba(0, 0, 0, 10%);