11/* eslint-disable @typescript-eslint/no-explicit-any */
2- import Zip from 'jszip' ;
3- import {
4- FILES_TYPES ,
5- getFileExtension ,
6- getFileSignature ,
7- FILES_SIGNATURES ,
8- } from 'nmrium/lib/component/utility/FileUtility' ;
9- import { addBruker , addJcamp , addJDF } from 'nmrium/lib/data/SpectraManager' ;
10- import { addMolfile } from 'nmrium/lib/data/molecules/MoleculeManager' ;
2+ // import { addBruker, addJcamp, addJDF } from 'nmrium/lib/data/SpectraManager';
113import { useCallback , useMemo , useState } from 'react' ;
12- import { Datum1D } from 'nmrium/lib/data/types/data1d ' ;
13- import { Datum2D } from 'nmrium/lib/data/types/data2d ' ;
14- import { Molecule } from 'nmrium /lib/data/molecules/Molecule ' ;
4+ import { StateMolecule } from 'nmrium/lib/data/molecules/Molecule ' ;
5+ import { read } from 'nmr-load-save ' ;
6+ import { Spectrum } from 'nmr-load-save /lib/types/Spectra/Spectrum ' ;
157import events from '../events' ;
168import { isArrayOfString } from '../utilities/isArrayOfString' ;
17- import { isArrayOfFile } from '../utilities/isArrayOfFile' ;
18- import { isBruker } from '../utilities/isBruker' ;
19- import { castToPromise } from '../utilities/castToPromise' ;
209import { loadFilesFromURLs } from '../utilities/loadFilesFromURLs' ;
21- import { flatArray } from '../utilities/flatArray' ;
22-
23- type Spectrum = Datum1D | Datum2D ;
24-
25- interface FileMeta {
26- extension ?: string ;
27- name : string ;
28- }
29- export interface File extends FileMeta {
30- data : ArrayBuffer ;
31- }
32-
33- async function flatFiles ( files : File [ ] ) {
34- const result : File [ ] = [ ] ;
35- const zipFiles = files . filter (
36- ( { extension } ) => extension === FILES_TYPES . ZIP ,
37- ) ;
38-
39- const unZipFiles = await Promise . all (
40- zipFiles . map ( ( file ) => Zip . loadAsync ( file . data ) ) ,
41- ) ;
42-
43- const data = await Promise . all (
44- unZipFiles . reduce < ( Promise < Uint8Array > | ArrayBuffer | FileMeta ) [ ] > (
45- ( promises , unZipFile , index ) => {
46- if ( isBruker ( unZipFile . files ) ) {
47- promises . push ( zipFiles [ index ] . data ) ;
48- promises . push ( { ...( zipFiles [ index ] as FileMeta ) } ) ;
49- }
50- // eslint-disable-next-line no-restricted-syntax
51- for ( const file of Object . values ( unZipFile . files ) ) {
52- const extension = getFileExtension ( file . name ) ;
53- if (
54- [
55- FILES_TYPES . JDX ,
56- FILES_TYPES . DX ,
57- FILES_TYPES . JDF ,
58- FILES_TYPES . MOL ,
59- ] . includes ( extension )
60- ) {
61- promises . push ( file . async ( 'uint8array' ) ) ;
62- promises . push ( { name : file . name , extension } ) ;
63- }
64- }
65- return promises ;
66- } ,
67- [ ] ,
68- ) ,
69- ) ;
70-
71- for ( let i = 0 ; i < data . length ; i += 2 ) {
72- result . push ( {
73- data : data [ i ] as ArrayBuffer ,
74- ...( data [ i + 1 ] as FileMeta ) ,
75- } ) ;
76- }
77- return result ;
78- }
79-
80- async function mapFiles ( files : File [ ] ) : Promise < File [ ] > {
81- const sortFiles = files . reduce < {
82- zipFiles : File [ ] ;
83- files : File [ ] ;
84- } > (
85- ( filesAcc , file ) => {
86- let extension = getFileExtension ( file . name ) ;
87-
88- if (
89- extension === file . name &&
90- getFileSignature ( file . data ) === FILES_SIGNATURES . ZIP
91- ) {
92- extension = 'zip' ;
93- }
94-
95- const fileObject = { ...file , extension } ;
96- if ( fileObject . extension === FILES_TYPES . ZIP ) {
97- filesAcc . zipFiles . push ( fileObject ) ;
98- } else {
99- filesAcc . files . push ( fileObject ) ;
100- }
101- return filesAcc ;
102- } ,
103- { zipFiles : [ ] , files : [ ] } ,
104- ) ;
105- const zipFiles = await flatFiles ( sortFiles . zipFiles ) ;
106-
107- return zipFiles . concat ( sortFiles . files ) ;
108- }
109-
110- async function processFiles ( files : File [ ] ) {
111- const usedColors = { '1d' : [ ] , '2d' : [ ] } ;
112-
113- const callPromises = files . reduce < {
114- spectra : Promise < any > [ ] ;
115- molecules : Promise < any > [ ] ;
116- } > (
117- ( promises , { data : file , extension } ) => {
118- switch ( extension ) {
119- case FILES_TYPES . JDX :
120- case FILES_TYPES . DX : {
121- promises . spectra . push ( castToPromise ( addJcamp , file , { } , usedColors ) ) ;
122- break ;
123- }
124- case FILES_TYPES . JDF : {
125- promises . spectra . push ( castToPromise ( addJDF , file , { } , usedColors ) ) ;
126- break ;
127- }
128- case FILES_TYPES . ZIP : {
129- promises . spectra . push ( addBruker ( { } , file , usedColors ) ) ;
130- break ;
131- }
132- case FILES_TYPES . MOL : {
133- const decoder = new TextDecoder ( 'utf8' ) ;
134- const molfile = decoder . decode ( file ) ;
135- promises . molecules . push ( castToPromise ( addMolfile , molfile ) ) ;
136- break ;
137- }
138-
139- default :
140- throw new Error ( 'The file extension must be zip, dx, jdx, jdf' ) ;
141- }
142- return promises ;
143- } ,
144- { spectra : [ ] , molecules : [ ] } ,
145- ) ;
146- const spectraList = ( await Promise . all ( callPromises . spectra ) ) as Spectrum [ ] [ ] ;
147- const moleculesList = ( await Promise . all (
148- callPromises . molecules ,
149- ) ) as Molecule [ ] [ ] ;
150-
151- const spectra = flatArray < Spectrum > ( spectraList ) ;
152- const molecules = flatArray < Molecule > ( moleculesList ) ;
153-
154- return { spectra, molecules } ;
155- }
15610
15711export function useLoadSpectra ( ) {
15812 const [ data , setData ] = useState < {
15913 spectra : Spectrum [ ] ;
160- molecules : Molecule [ ] ;
14+ molecules : Record < string , string > [ ] ;
16115 } > ( { spectra : [ ] , molecules : [ ] } ) ;
16216 const [ isLoading , setLoading ] = useState < boolean > ( false ) ;
16317
@@ -174,15 +28,10 @@ export function useLoadSpectra() {
17428 throw new Error ( 'The input must be string[] ' ) ;
17529 }
17630 } else if ( 'files' in options ) {
177- if ( ! isArrayOfFile ( options . files ) ) {
178- throw new Error ( 'The input must be File[] ' ) ;
179- }
18031 inputFiles = options . files ;
18132 }
18233
183- const files = await mapFiles ( inputFiles ) ;
184-
185- const { spectra, molecules } = await processFiles ( files ) ;
34+ const { spectra, molecules } = await read ( inputFiles ) ;
18635 setData ( { spectra, molecules } ) ;
18736 } catch ( error : any ) {
18837 events . trigger ( 'error' , error ) ;
0 commit comments