44/* eslint-disable no-param-reassign */
55/* eslint-disable react/state-in-constructor */
66import React , { useEffect , useState } from 'react' ;
7- import FileBrowser from 'react-keyed-file-browser' ;
7+ import FileBrowser , { FileRenderers , FolderRenderers } from 'react-keyed-file-browser' ;
88import { readFile , readTextFile } from '../toolbarActions/toolbarFunctions' ;
99import { actionType as T } from '../reducer' ;
1010import './fileBrowser.css' ;
1111
1212const LocalFileBrowser = ( { superState, dispatcher } ) => {
1313 const fileRef = React . useRef ( ) ;
14+ const [ dirButton , setDirButton ] = useState ( false ) ;
1415
1516 useEffect ( ( ) => {
17+ if ( navigator . userAgent . indexOf ( 'Edg' ) !== - 1 || navigator . userAgent . indexOf ( 'Chrome' ) !== - 1 ) {
18+ setDirButton ( true ) ;
19+ }
1620 dispatcher ( { type : T . SET_FILE_REF , payload : fileRef } ) ;
1721 } , [ ] ) ;
1822
@@ -26,18 +30,6 @@ const LocalFileBrowser = ({ superState, dispatcher }) => {
2630 // // return files;
2731 // // }
2832 // return { files };
29- // // files: [
30- // // {
31- // // key: '/home/emory/Desktop/github',
32- // // modified: +Moment().subtract(1, 'hours'),
33- // // size: 1.5 * 1024 * 1024,
34- // // },
35- // // {
36- // // key: '/concore/demo/sample2.graphml',
37- // // modified: +Moment().subtract(3, 'days'),
38- // // size: 545 * 1024,
39- // // },
40- // // ],
4133 // });
4234
4335 // TODO
@@ -49,86 +41,114 @@ const LocalFileBrowser = ({ superState, dispatcher }) => {
4941 window . localStorage . setItem ( 'fileList' , JSON . stringify ( fileState ) ) ;
5042 } , [ fileState ] ) ;
5143
52- // const handleCreateFolder = (key) => {
53- // setFileState((state) => {
54- // state.files = state.files.concat([{
55- // key: key,
56- // }]);
57- // console.log(fileState);
58- // return state;
59- // });
60- // };
61-
62- // TODO
63- // const handleCreateFiles = (files, prefix) => {
64- // setFileState((state) => {
65- // const newFiles = files.map((file) => {
66- // let newKey = prefix;
67- // if (prefix !== '' && prefix.substring(prefix.length - 1, prefix.length) !== '/') {
68- // newKey += '/';
69- // }
70- // newKey += file.name;
71- // return {
72- // key: newKey,
73- // size: file.size,
74- // modified: +Moment(),
75- // };
76- // });
77-
78- // const uniqueNewFiles = [];
79- // newFiles.map((newFile) => {
80- // let exists = false;
81- // state.files.map((existingFile) => {
82- // if (existingFile.key === newFile.key) {
83- // exists = true;
84- // }
85- // });
86- // if (!exists) {
87- // uniqueNewFiles.push(newFile);
88- // }
89- // });
90- // state.files = state.files.concat(uniqueNewFiles);
91- // return state;
92- // });
93- // };
94-
9544 const handleSelectFile = ( data ) => {
96- if ( data . fileObj . name . split ( '.' ) . pop ( ) === 'graphml' ) readFile ( superState , dispatcher , data . fileObj ) ;
45+ // eslint-disable-next-line max-len
46+ if ( data . fileObj . name . split ( '.' ) . pop ( ) === 'graphml' ) readFile ( superState , dispatcher , data . fileObj , data . fileHandle ) ;
9747 else {
98- readTextFile ( superState , dispatcher , data . fileObj ) ;
48+ readTextFile ( superState , dispatcher , data . fileObj , data . fileHandle ) ;
49+ }
50+ } ;
51+
52+ const handleFileInDirs = async ( topKey , value ) => {
53+ let state = [ ] ;
54+ // eslint-disable-next-line no-restricted-syntax
55+ for await ( const [ key , valueSubDir ] of value . entries ( ) ) {
56+ if ( valueSubDir . kind === 'file' ) {
57+ const fileData = await valueSubDir . getFile ( ) ;
58+ state = state . concat ( [ {
59+ key : `${ topKey } /${ value . name } /${ key } ` ,
60+ modified : fileData . lastModified ,
61+ size : fileData . size ,
62+ fileObj : fileData ,
63+ fileHandle : value ,
64+ } ] ) ;
65+ } else if ( valueSubDir . kind === 'directory' ) {
66+ const res = await handleFileInDirs ( ) ;
67+ state = state . concat ( res ) ;
68+ }
69+ }
70+ return state ;
71+ } ;
72+
73+ const newFeature = async ( ) => {
74+ const dirHandle = await window . showDirectoryPicker ( ) ;
75+ let state = [ ] ;
76+ // eslint-disable-next-line no-restricted-syntax
77+ for await ( const [ key , value ] of dirHandle . entries ( ) ) {
78+ if ( value . kind === 'file' ) {
79+ const fileData = await value . getFile ( ) ;
80+ state = state . concat ( [ {
81+ key : `${ dirHandle . name } /${ key } ` ,
82+ modified : fileData . lastModified ,
83+ size : fileData . size ,
84+ fileObj : fileData ,
85+ fileHandle : value ,
86+ } ] ) ;
87+ } else if ( value . kind === 'directory' ) {
88+ const res = await handleFileInDirs ( dirHandle . name , value ) ;
89+ state = state . concat ( res ) ;
90+ }
9991 }
92+ setFileState ( [ ] ) ;
93+ setFileState ( state ) ;
10094 } ;
10195
10296 return (
10397 < div >
104- < input
105- type = "file"
106- ref = { fileRef }
107- onClick = { ( e ) => { e . target . value = null ; } }
108- onChange = { ( e ) => {
109- setFileState ( ( state ) => {
110- for ( let i = 0 ; i < e . target . files . length ; i += 1 ) {
111- state = state . concat ( [ {
112- key : e . target . files [ i ] . name ,
113- modified : e . target . files [ i ] . lastModifiedDate ,
114- size : e . target . files [ i ] . size ,
115- fileObj : e . target . files [ i ] ,
116- } ] ) ;
117- }
118- return state ;
119- } ) ;
120- window . localStorage . setItem ( 'fileList' , JSON . stringify ( fileState ) ) ;
121- } }
122- directory
123- webkitdirectory = "true"
124- />
98+ { ! dirButton && (
99+ < label
100+ className = "inputButton"
101+ htmlFor = "fileButton"
102+ >
103+ Upload Directory
104+ < input
105+ type = "file"
106+ accept = ".py, .m, .c, .cpp, .v, .sh"
107+ ref = { fileRef }
108+ id = "fileButton"
109+ style = { { display : 'none' } }
110+ onClick = { ( e ) => { e . target . value = null ; } }
111+ onChange = { ( e ) => {
112+ setFileState ( [ ] ) ;
113+ setFileState ( ( state ) => {
114+ for ( let i = 0 ; i < e . target . files . length ; i += 1 ) {
115+ state = state . concat ( [ {
116+ key : e . target . files [ i ] . webkitRelativePath ,
117+ modified : e . target . files [ i ] . lastModified ,
118+ size : e . target . files [ i ] . size ,
119+ fileObj : e . target . files [ i ] ,
120+ } ] ) ;
121+ }
122+ return state ;
123+ } ) ;
124+ window . localStorage . setItem ( 'fileList' , JSON . stringify ( fileState ) ) ;
125+ } }
126+ directory
127+ webkitdirectory = "true"
128+ />
129+ </ label >
130+ ) }
131+ { dirButton && (
132+ < button
133+ type = "button"
134+ className = "inputButton"
135+ disabled = { ! dirButton }
136+ onClick = { newFeature }
137+ >
138+ Upload Directory
139+ </ button >
140+ ) }
141+ < h4 >
142+ Folder Name :
143+ { ' ' }
144+ { fileState [ 0 ] ? fileState [ 0 ] . key . split ( '/' ) [ 0 ] : '' }
145+ </ h4 >
125146 < FileBrowser
126147 files = { fileState }
127148 onSelectFile = { handleSelectFile }
128149 detailRenderer = { ( ) => null }
129- // TODO
130- // onCreateFolder={handleCreateFolder}
131- // onCreateFiles={handleCreateFiles}
150+ fileRenderer = { FileRenderers . TableFile }
151+ folderRenderer = { FolderRenderers . TableFolder }
132152 />
133153 </ div >
134154 ) ;
0 commit comments