Skip to content

Commit 4ae8ee3

Browse files
authored
feat: add loadFileCollection imperative API (#4056)
1 parent 0949192 commit 4ae8ee3

File tree

3 files changed

+50
-17
lines changed

3 files changed

+50
-17
lines changed

src/component/loader/useLoadFiles.ts

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,13 @@ export function useLoadFiles(onOpenMetaInformation?: (file: File) => void) {
8585

8686
const currentPreferences = preferences.current;
8787
const loadUserFiles = useCallback(
88-
async (files: File[]) => {
89-
if (onOpenMetaInformation && files.length === 1 && isMetaFile(files[0])) {
88+
async (files: File[] | FileCollection) => {
89+
if (
90+
onOpenMetaInformation &&
91+
Array.isArray(files) &&
92+
files.length === 1 &&
93+
isMetaFile(files[0])
94+
) {
9095
onOpenMetaInformation(files[0]);
9196
return;
9297
}
@@ -101,18 +106,22 @@ export function useLoadFiles(onOpenMetaInformation?: (file: File) => void) {
101106
experimentalFeatures,
102107
};
103108

104-
const groupedFiles = await groupFiles(files);
105-
const { nmriumArchiveFiles, fileCollection, metaFile } = groupedFiles;
106-
107-
if (nmriumArchiveFiles.length > 0) {
108-
await Promise.all(
109-
nmriumArchiveFiles.map((file) =>
110-
loadNmriumArchives(file, parsingOptions),
111-
),
112-
);
109+
if (Array.isArray(files)) {
110+
const groupedFiles = await groupFiles(files);
111+
const { nmriumArchiveFiles, fileCollection, metaFile } = groupedFiles;
112+
113+
if (nmriumArchiveFiles.length > 0) {
114+
await Promise.all(
115+
nmriumArchiveFiles.map((file) =>
116+
loadNmriumArchives(file, parsingOptions),
117+
),
118+
);
119+
}
120+
121+
await loadFileCollection(fileCollection, metaFile, parsingOptions);
122+
} else {
123+
await loadFileCollection(files, undefined, parsingOptions);
113124
}
114-
115-
await loadFileCollection(fileCollection, metaFile, parsingOptions);
116125
},
117126
[
118127
experimentalFeatures,
@@ -126,7 +135,7 @@ export function useLoadFiles(onOpenMetaInformation?: (file: File) => void) {
126135
);
127136

128137
return useCallback(
129-
(files: File[]) => {
138+
(files: File[] | FileCollection) => {
130139
dispatch({ type: 'SET_LOADING_FLAG', payload: { isLoading: true } });
131140

132141
loadUserFiles(files)

src/component/main/NMRiumRefAPI.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { FileCollection } from 'file-collection';
12
import type { ForwardedRef, RefObject } from 'react';
23
import { useImperativeHandle } from 'react';
34

@@ -11,6 +12,7 @@ export interface NMRiumRefAPI {
1112
getSpectraViewerAsBlob: () => BlobObject | null;
1213
getNMRiumFile: (option: SaveIncludeOptions) => Promise<Blob>;
1314
loadFiles: (files: File[]) => void;
15+
loadFileCollection: (fileCollection: FileCollection) => void;
1416
}
1517

1618
export function useNMRiumRefAPI(
@@ -29,6 +31,8 @@ export function useNMRiumRefAPI(
2931
: null;
3032
},
3133
loadFiles,
34+
loadFileCollection: (fileCollection: FileCollection) =>
35+
loadFiles(fileCollection),
3236
getNMRiumFile: (options) => createNmriumZip(options),
3337
}),
3438
[loadFiles, rootRef, createNmriumZip],

src/demo/views/RefAPI.tsx

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { FileCollection } from 'file-collection';
12
import { useCallback, useRef } from 'react';
23
import { Button, DropZone } from 'react-science/ui';
34

@@ -7,7 +8,13 @@ import { saveAs } from '../../component/utility/save_as.ts';
78

89
export default function RefAPI() {
910
const nmriumRef = useRef<NMRiumRefAPI>(null);
10-
const dropFileHandler = useCallback((dropFiles: File[]) => {
11+
const dropLoadFileCollectionHandler = useCallback((dropFiles: File[]) => {
12+
const fileCollection = new FileCollection();
13+
void fileCollection.appendFileList(dropFiles).then(() => {
14+
nmriumRef.current?.loadFileCollection(fileCollection);
15+
});
16+
}, []);
17+
const dropLoadFilesHandler = useCallback((dropFiles: File[]) => {
1118
nmriumRef.current?.loadFiles(dropFiles);
1219
}, []);
1320

@@ -49,8 +56,21 @@ export default function RefAPI() {
4956
flex: 3,
5057
}}
5158
>
52-
<div style={{ flex: 3 }}>
53-
<DropZone onDrop={dropFileHandler} emptyTitle="Drop data files" />
59+
<div style={{ flex: 3, display: 'flex', flexDirection: 'column' }}>
60+
<div style={{ flex: 1 }}>
61+
<DropZone
62+
onDrop={dropLoadFileCollectionHandler}
63+
emptyTitle="Drop data files"
64+
emptyDescription="To load with ref.loadFileCollection API"
65+
/>
66+
</div>
67+
<div style={{ flex: 1 }}>
68+
<DropZone
69+
onDrop={dropLoadFilesHandler}
70+
emptyTitle="Drop data files"
71+
emptyDescription="To load with ref.loadFiles API"
72+
/>
73+
</div>
5474
</div>
5575
</div>
5676
</div>

0 commit comments

Comments
 (0)