Skip to content

Commit f561089

Browse files
committed
Fix the unholy hell that is drag events
1 parent 56475d8 commit f561089

File tree

3 files changed

+53
-50
lines changed

3 files changed

+53
-50
lines changed

resources/scripts/components/elements/Modal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export interface ModalProps extends RequiredModalProps {
2020
showSpinnerOverlay?: boolean;
2121
}
2222

23-
const ModalMask = styled.div`
23+
export const ModalMask = styled.div`
2424
${tw`fixed z-50 overflow-auto flex w-full inset-0`};
2525
background: rgba(0, 0, 0, 0.70);
2626
`;

resources/scripts/components/server/files/UploadButton.tsx

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,41 @@ import tw from 'twin.macro';
55
import Button from '@/components/elements/Button';
66
import React, { useEffect, useState } from 'react';
77
import styled from 'styled-components/macro';
8+
import { ModalMask } from '@/components/elements/Modal';
9+
import Fade from '@/components/elements/Fade';
10+
import useEventListener from '@/plugins/useEventListener';
811

9-
const ModalMask = styled.div`
10-
${tw`fixed z-50 overflow-auto flex w-full inset-0`};
11-
background: rgba(0, 0, 0, 0.70);
12+
const InnerContainer = styled.div`
13+
max-width: 600px;
14+
${tw`bg-black w-full border-4 border-primary-500 border-dashed rounded p-10 mx-10`}
1215
`;
1316

1417
export default () => {
1518
const { uuid } = useServer();
1619
const [ visible, setVisible ] = useState(false);
1720

18-
const handleEscapeEvent = () => {
21+
useEventListener('dragenter', e => {
22+
e.stopPropagation();
23+
setVisible(true);
24+
}, true);
25+
26+
useEventListener('dragexit', e => {
27+
e.stopPropagation();
1928
setVisible(false);
20-
};
29+
}, true);
2130

2231
useEffect(() => {
23-
window.addEventListener('keydown', handleEscapeEvent);
32+
if (!visible) return;
2433

25-
return () => window.removeEventListener('keydown', handleEscapeEvent);
26-
}, [ visible ]);
34+
const hide = () => setVisible(false);
2735

28-
const onDragOver = (e: any) => {
29-
e.preventDefault();
30-
};
31-
32-
const onDragEnter = (e: any) => {
33-
e.preventDefault();
34-
};
35-
36-
const onDragLeave = (e: any) => {
37-
e.preventDefault();
38-
};
36+
window.addEventListener('keydown', hide);
37+
return () => {
38+
window.removeEventListener('keydown', hide);
39+
};
40+
}, [ visible ]);
3941

40-
const onFileDrop = (e: any) => {
42+
const onFileDrop = (e: React.DragEvent<HTMLDivElement>) => {
4143
e.preventDefault();
4244

4345
if (e.dataTransfer === undefined || e.dataTransfer === null) {
@@ -55,12 +57,10 @@ export default () => {
5557
formData.append('files', files[i]);
5658
}
5759

58-
console.log('getFileUploadUrl');
5960
getFileUploadUrl(uuid)
6061
.then(url => {
6162
console.log(url);
6263

63-
// `${url}&directory=`
6464
axios.post(url, formData, {
6565
headers: {
6666
'Content-Type': 'multipart/form-data',
@@ -81,20 +81,26 @@ export default () => {
8181

8282
return (
8383
<>
84-
{
85-
visible ?
86-
<ModalMask>
87-
<div css={tw`w-full flex items-center justify-center`} onDragOver={onDragOver} onDragEnter={onDragEnter} onDragLeave={onDragLeave} onDrop={onFileDrop}>
88-
<div css={tw`w-full md:w-3/4 lg:w-3/5 xl:w-2/5 flex flex-col items-center border-2 border-dashed border-neutral-400 rounded py-8 px-12 mx-8 md:mx-0`}>
89-
<img src={'/assets/svgs/file_upload.svg'} css={tw`h-auto w-full select-none`}/>
90-
<p css={tw`text-lg text-neutral-200 font-normal mt-8`}>Drag and drop files to upload</p>
91-
</div>
92-
</div>
93-
</ModalMask>
94-
:
95-
null
96-
}
97-
84+
<Fade
85+
appear
86+
in={visible}
87+
timeout={75}
88+
key={'upload_modal_mask'}
89+
unmountOnExit
90+
>
91+
<ModalMask
92+
onClick={() => setVisible(false)}
93+
onDrop={onFileDrop}
94+
>
95+
<div css={tw`w-full flex items-center justify-center`} style={{ pointerEvents: 'none' }}>
96+
<InnerContainer>
97+
<p css={tw`text-lg text-neutral-200 text-center`}>
98+
Drag and drop files to upload.
99+
</p>
100+
</InnerContainer>
101+
</div>
102+
</ModalMask>
103+
</Fade>
98104
<Button css={tw`mr-2`} onClick={() => setVisible(true)}>
99105
Upload
100106
</Button>
Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,20 @@
11
import { useEffect, useRef } from 'react';
22

3-
export default (eventName: string, handler: (e: Event | CustomEvent | UIEvent | any) => void, element: any = window) => {
3+
export default (eventName: string, handler: (e: Event | CustomEvent | UIEvent | any) => void, options?: boolean | EventListenerOptions) => {
44
const savedHandler = useRef<any>(null);
55

66
useEffect(() => {
77
savedHandler.current = handler;
88
}, [ handler ]);
99

10-
useEffect(
11-
() => {
12-
const isSupported = element && element.addEventListener;
13-
if (!isSupported) return;
10+
useEffect(() => {
11+
const isSupported = document && document.addEventListener;
12+
if (!isSupported) return;
1413

15-
const eventListener = (event: any) => savedHandler.current(event);
16-
element.addEventListener(eventName, eventListener);
17-
return () => {
18-
element.removeEventListener(eventName, eventListener);
19-
};
20-
},
21-
[ eventName, element ],
22-
);
14+
const eventListener = (event: any) => savedHandler.current(event);
15+
document.addEventListener(eventName, eventListener, options);
16+
return () => {
17+
document.removeEventListener(eventName, eventListener);
18+
};
19+
}, [ eventName, document ]);
2320
};

0 commit comments

Comments
 (0)