@@ -7,17 +7,24 @@ import React, { useEffect, useState } from 'react';
77import FileBrowser , { FileRenderers , FolderRenderers } from 'react-keyed-file-browser' ;
88import { readFile , readTextFile } from '../toolbarActions/toolbarFunctions' ;
99import { actionType as T } from '../reducer' ;
10+ import ConfirmModal from './modals/ConfirmModal' ;
1011import './fileBrowser.css' ;
1112
1213const LocalFileBrowser = ( { superState, dispatcher } ) => {
1314 const fileRef = React . useRef ( ) ;
15+ const dirInputRef = React . useRef ( ) ;
16+ const tempFilesRef = React . useRef ( null ) ;
17+ const [ confirmOpen , setConfirmOpen ] = useState ( false ) ;
18+ const [ pendingFolderName , setPendingFolderName ] = useState ( '' ) ;
1419 const [ dirButton , setDirButton ] = useState ( false ) ;
1520 const [ fileState , setFileState ] = useState ( [ ] ) ;
1621
1722 useEffect ( ( ) => {
18- if ( navigator . userAgent . indexOf ( 'Edg' ) !== - 1 || navigator . userAgent . indexOf ( 'Chrome' ) !== - 1 ) {
19- setDirButton ( true ) ;
20- }
23+ // if (navigator.userAgent.indexOf('Edg') !== -1 || navigator.userAgent.indexOf('Chrome') !== -1) {
24+ // setDirButton(true);
25+ // }
26+ // Force fallback to webkitdirectory to allow custom popup flow
27+ setDirButton ( false ) ;
2128 dispatcher ( { type : T . SET_FILE_REF , payload : fileRef } ) ;
2229 } , [ ] ) ;
2330
@@ -133,31 +140,32 @@ const LocalFileBrowser = ({ superState, dispatcher }) => {
133140 return (
134141 < div >
135142 { ! dirButton && (
136- < label
137- className = "inputButton"
138- htmlFor = "fileButton"
139- >
140- Upload Directory
143+ < >
144+ < button
145+ type = "button"
146+ className = "inputButton"
147+ onClick = { ( ) => dirInputRef . current . click ( ) }
148+ >
149+ Upload Directory
150+ </ button >
141151 < input
142152 type = "file"
143153 accept = ".py, .m, .c, .cpp, .v, .sh"
144- id = "fileButton"
154+ ref = { dirInputRef }
145155 style = { { display : 'none' } }
146156 onClick = { ( e ) => { e . target . value = null ; } }
147157 onChange = { ( e ) => {
148- const filesArray = Array . from ( e . target . files ) . map ( ( file ) => ( {
149- key : file . webkitRelativePath ,
150- modified : file . lastModified ,
151- size : file . size ,
152- fileObj : file ,
153- } ) ) ;
154-
155- setFileState ( filesArray ) ;
156- window . localStorage . setItem ( 'fileList' , JSON . stringify ( filesArray ) ) ;
158+ const { files } = e . target ;
159+ if ( files && files . length > 0 ) {
160+ tempFilesRef . current = files ;
161+ const folderName = files [ 0 ] . webkitRelativePath . split ( '/' ) [ 0 ] ;
162+ setPendingFolderName ( folderName ) ;
163+ setConfirmOpen ( true ) ;
164+ }
157165 } }
158- webkitdirectory
166+ webkitdirectory = ""
159167 />
160- </ label >
168+ </ >
161169 ) }
162170 { dirButton && (
163171 < button
@@ -212,6 +220,36 @@ const LocalFileBrowser = ({ superState, dispatcher }) => {
212220 fileRenderer = { FileRenderers . TableFile }
213221 folderRenderer = { FolderRenderers . TableFolder }
214222 />
223+ < ConfirmModal
224+ isOpen = { confirmOpen }
225+ title = "Upload Directory"
226+ message = { `Directory Selected: ${ pendingFolderName } ` }
227+ onConfirm = { ( ) => {
228+ setConfirmOpen ( false ) ;
229+ const files = tempFilesRef . current ;
230+ if ( files && files . length > 0 ) {
231+ const filesArray = Array . from ( files ) . map ( ( file ) => ( {
232+ key : file . webkitRelativePath ,
233+ modified : file . lastModified ,
234+ size : file . size ,
235+ fileObj : file ,
236+ } ) ) ;
237+
238+ setFileState ( filesArray ) ;
239+ window . localStorage . setItem ( 'fileList' , JSON . stringify ( filesArray ) ) ;
240+ if ( filesArray . length > 0 ) {
241+ dispatcher ( { type : T . SET_DIR_NAME , payload : filesArray [ 0 ] . key . split ( '/' ) [ 0 ] } ) ;
242+ dispatcher ( { type : T . SET_FILE_STATE , payload : filesArray } ) ;
243+ }
244+ }
245+ tempFilesRef . current = null ;
246+ } }
247+ onCancel = { ( ) => {
248+ setConfirmOpen ( false ) ;
249+ if ( dirInputRef . current ) dirInputRef . current . value = '' ;
250+ tempFilesRef . current = null ;
251+ } }
252+ />
215253 </ div >
216254 ) ;
217255} ;
0 commit comments