Skip to content

Commit 666086e

Browse files
feat!: update to nmrium version 0.31.0
1 parent 1293839 commit 666086e

8 files changed

Lines changed: 1017 additions & 972 deletions

File tree

package-lock.json

Lines changed: 678 additions & 538 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
"dependencies": {
1616
"@emotion/react": "^11.10.4",
1717
"jszip": "^3.10.1",
18-
"nmrium": "^0.28.0",
18+
"nmr-load-save": "^0.2.1",
19+
"nmrium": "^0.31.0",
1920
"react-router-dom": "^6.4.1"
2021
},
2122
"scripts": {
@@ -65,4 +66,4 @@
6566
"typescript": "^4.8.3",
6667
"vite": "^3.1.3"
6768
}
68-
}
69+
}

src/NMRiumWrapper.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export default function NMRiumWrapper() {
4141

4242
useEffect(() => {
4343
if (!isLoading) {
44-
setDate(loadedData);
44+
setDate(loadedData as unknown as NMRiumData);
4545
}
4646
}, [isLoading, loadedData]);
4747

src/demo/NMRiumWrapperDemo.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export default function NMRiumWrapperDemo() {
4545
'https://cheminfo.github.io/nmr-dataset-demo/cytisine/13c.jdx',
4646
'https://cheminfo.github.io/nmr-dataset-demo/cytisine/1h.jdx',
4747
'https://cheminfo.github.io/bruker-data-test/data/zipped/aspirin-1h.zip',
48-
'https://dev.nmrxiv.org/superadmin/datasets/untitled-project/mlm-041-01/mlm-041-13c',
48+
// 'https://dev.nmrxiv.org/superadmin/datasets/untitled-project/mlm-041-01/mlm-041-13c',
4949
'../data/13c.zip',
5050
],
5151
type: 'url',

src/hooks/useLoadSpectra.ts

Lines changed: 6 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -1,163 +1,17 @@
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';
113
import { 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';
157
import events from '../events';
168
import { isArrayOfString } from '../utilities/isArrayOfString';
17-
import { isArrayOfFile } from '../utilities/isArrayOfFile';
18-
import { isBruker } from '../utilities/isBruker';
19-
import { castToPromise } from '../utilities/castToPromise';
209
import { 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

15711
export 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);

src/utilities/loadFilesFromURLs.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
1-
import { File } from '../hooks/useLoadSpectra';
21
import { getFileNameFromURL } from './getFileNameFromURL';
32

43
export function loadFilesFromURLs(urls: string[]): Promise<File[]> {
54
const fetches = urls.map((url) =>
65
fetch(url)
76
.then((response) => response.arrayBuffer())
87
.then((data) => {
9-
return {
10-
data,
11-
name: getFileNameFromURL(url),
12-
};
8+
return new File([data], getFileNameFromURL(url));
139
}),
1410
);
1511

vite.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export default () => {
55
return defineConfig({
66
base: './',
77
esbuild: {
8+
jsx: 'automatic',
89
sourcemap: false,
910
},
1011
build: {

0 commit comments

Comments
 (0)