From bf8fbe3f7003228f9866f5611c671e7e9db23ad3 Mon Sep 17 00:00:00 2001 From: Stacey Ilioukhina Date: Tue, 16 Feb 2021 15:14:10 -0800 Subject: [PATCH] Update Flipper to use grouped data Summary: Updated FileList to traverse folders Reviewed By: jdlehman Differential Revision: D26372158 fbshipit-source-id: 16fadb179545cb701d0a970e3cc2411860ee8ed9 --- desktop/app/src/ui/components/FileList.tsx | 105 ++++++++++++++------- 1 file changed, 69 insertions(+), 36 deletions(-) diff --git a/desktop/app/src/ui/components/FileList.tsx b/desktop/app/src/ui/components/FileList.tsx index 11460b17b..364f897ac 100644 --- a/desktop/app/src/ui/components/FileList.tsx +++ b/desktop/app/src/ui/components/FileList.tsx @@ -57,9 +57,9 @@ export default class FileList extends Component { watcher: fs.FSWatcher | null | undefined; - fetchFile(name: string): Promise { + fetchFile(src: string, name: string): Promise { return new Promise((resolve, reject) => { - const loc = path.join(this.props.src, name); + const loc = path.join(src, name); fs.lstat(loc, (err, stat) => { if (err) { @@ -82,6 +82,64 @@ export default class FileList extends Component { }); } + fetchFilesFromFolder( + originalSrc: string, + currentSrc: string, + callback: Function, + ) { + const hasChangedDir = () => this.props.src !== originalSrc; + + let filesSet: Map = new Map(); + fs.readdir(currentSrc, (err, files) => { + if (err) { + return callback(err, EMPTY_MAP); + } + let remainingPaths = files.length; + + const next = () => { + if (hasChangedDir()) { + return callback(null, EMPTY_MAP); + } + + if (!remainingPaths) { + return callback(null, filesSet); + } + + const name = files.shift(); + if (name) { + this.fetchFile(currentSrc, name) + .then((data) => { + filesSet.set(name, data); + if (data.type == 'folder') { + this.fetchFilesFromFolder( + originalSrc, + path.join(currentSrc, name), + function (err: Error, files: Map) { + if (err) { + return callback(err, EMPTY_MAP); + } + filesSet = new Map([...filesSet, ...files]); + remainingPaths--; + if (!remainingPaths) { + return callback(null, filesSet); + } + }, + ); + } else { + remainingPaths--; + } + next(); + }) + .catch((err) => { + return callback(err, EMPTY_MAP); + }); + } + }; + + next(); + }); + } + fetchFiles(callback?: Function) { const {src} = this.props; @@ -93,41 +151,16 @@ export default class FileList extends Component { const hasChangedDir = () => this.props.src !== src; - fs.readdir(src, (err, files) => { - if (err) { - setState({error: err, files: EMPTY_MAP}); - return; - } - - const filesSet: Map = new Map(); - const next = () => { - if (hasChangedDir()) { - return; + this.fetchFilesFromFolder( + src, + src, + function (err: Error, files: Map) { + setState({error: err, files: files}); + if (callback) { + callback(); } - - if (!files.length) { - setState({error: null, files: filesSet}); - if (callback) { - callback(); - } - return; - } - - const name = files.shift(); - if (name) { - this.fetchFile(name) - .then((data) => { - filesSet.set(name, data); - next(); - }) - .catch((err) => { - setState({error: err, files: EMPTY_MAP}); - }); - } - }; - - next(); - }); + }, + ); } UNSAFE_componentWillReceiveProps(nextProps: FileListProps) {