@@ -5,39 +5,41 @@ import tw from 'twin.macro';
55import Button from '@/components/elements/Button' ;
66import React , { useEffect , useState } from 'react' ;
77import 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
1417export 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 >
0 commit comments