@@ -2,7 +2,7 @@ import axios from 'axios';
22import getFileUploadUrl from '@/api/server/files/getFileUploadUrl' ;
33import tw from 'twin.macro' ;
44import Button from '@/components/elements/Button' ;
5- import React , { useEffect , useState } from 'react' ;
5+ import React , { useEffect , useRef , useState } from 'react' ;
66import styled from 'styled-components/macro' ;
77import { ModalMask } from '@/components/elements/Modal' ;
88import Fade from '@/components/elements/Fade' ;
@@ -18,6 +18,7 @@ const InnerContainer = styled.div`
1818` ;
1919
2020export default ( ) => {
21+ const fileUploadInput = useRef < HTMLInputElement > ( null ) ;
2122 const uuid = ServerContext . useStoreState ( state => state . server . data ! . uuid ) ;
2223 const [ visible , setVisible ] = useState ( false ) ;
2324 const [ loading , setLoading ] = useState ( false ) ;
@@ -46,17 +47,9 @@ export default () => {
4647 } ;
4748 } , [ visible ] ) ;
4849
49- const onFileDrop = ( e : React . DragEvent < HTMLDivElement > ) => {
50- e . preventDefault ( ) ;
51- e . stopPropagation ( ) ;
52-
53- setVisible ( false ) ;
54- if ( e . dataTransfer === undefined || e . dataTransfer === null ) {
55- return ;
56- }
57-
50+ const onFileSubmission = ( files : FileList ) => {
5851 const form = new FormData ( ) ;
59- Array . from ( e . dataTransfer . files ) . forEach ( file => form . append ( 'files' , file ) ) ;
52+ Array . from ( files ) . forEach ( file => form . append ( 'files' , file ) ) ;
6053
6154 setLoading ( true ) ;
6255 clearFlashes ( 'files' ) ;
@@ -84,7 +77,21 @@ export default () => {
8477 key = { 'upload_modal_mask' }
8578 unmountOnExit
8679 >
87- < ModalMask onClick = { ( ) => setVisible ( false ) } onDrop = { onFileDrop } onDragOver = { e => e . preventDefault ( ) } >
80+ < ModalMask
81+ onClick = { ( ) => setVisible ( false ) }
82+ onDragOver = { e => e . preventDefault ( ) }
83+ onDrop = { e => {
84+ e . preventDefault ( ) ;
85+ e . stopPropagation ( ) ;
86+
87+ setVisible ( false ) ;
88+ if ( e . dataTransfer === undefined || e . dataTransfer === null ) {
89+ return ;
90+ }
91+
92+ onFileSubmission ( e . dataTransfer . files ) ;
93+ } }
94+ >
8895 < div css = { tw `w-full flex items-center justify-center` } style = { { pointerEvents : 'none' } } >
8996 < InnerContainer >
9097 < p css = { tw `text-lg text-neutral-200 text-center` } >
@@ -95,7 +102,27 @@ export default () => {
95102 </ ModalMask >
96103 </ Fade >
97104 < SpinnerOverlay visible = { loading } size = { 'large' } />
98- < Button css = { tw `mr-2` } onClick = { ( ) => setVisible ( true ) } >
105+ < input
106+ type = { 'file' }
107+ ref = { fileUploadInput }
108+ css = { tw `hidden` }
109+ onChange = { e => {
110+ if ( ! e . currentTarget . files ) return ;
111+
112+ onFileSubmission ( e . currentTarget . files ) ;
113+ if ( fileUploadInput . current ) {
114+ fileUploadInput . current . files = null ;
115+ }
116+ } }
117+ />
118+ < Button
119+ css = { tw `mr-2` }
120+ onClick = { ( ) => {
121+ fileUploadInput . current
122+ ? fileUploadInput . current . click ( )
123+ : setVisible ( true ) ;
124+ } }
125+ >
99126 Upload
100127 </ Button >
101128 </ >
0 commit comments