Skip to content

Commit ec5c14a

Browse files
committed
add pop up to upload directory feature
1 parent d0c8982 commit ec5c14a

1 file changed

Lines changed: 58 additions & 20 deletions

File tree

src/component/fileBrowser.jsx

Lines changed: 58 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,24 @@ import React, { useEffect, useState } from 'react';
77
import FileBrowser, { FileRenderers, FolderRenderers } from 'react-keyed-file-browser';
88
import { readFile, readTextFile } from '../toolbarActions/toolbarFunctions';
99
import { actionType as T } from '../reducer';
10+
import ConfirmModal from './modals/ConfirmModal';
1011
import './fileBrowser.css';
1112

1213
const 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

Comments
 (0)