diff --git a/src/component/modal/metaImportation/MetaImportationModal.tsx b/src/component/modal/metaImportation/MetaImportationModal.tsx index 623dc37ca..2ab1febed 100644 --- a/src/component/modal/metaImportation/MetaImportationModal.tsx +++ b/src/component/modal/metaImportation/MetaImportationModal.tsx @@ -1,10 +1,11 @@ /** @jsxImportSource @emotion/react */ import { Dialog, DialogBody, DialogFooter } from '@blueprintjs/core'; -import { Formik, FormikProps } from 'formik'; +import { yupResolver } from '@hookform/resolvers/yup'; import { ParseResult } from 'papaparse'; -import { CSSProperties, useState, useMemo, useRef, useEffect } from 'react'; +import { CSSProperties, useState, useMemo, useEffect } from 'react'; import type { FileWithPath } from 'react-dropzone'; import { FileError } from 'react-dropzone'; +import { useForm } from 'react-hook-form'; import { DropZone } from 'react-science/ui'; import * as Yup from 'yup'; @@ -19,10 +20,10 @@ import { useChartData } from '../../context/ChartContext'; import { useDispatch } from '../../context/DispatchContext'; import { useToaster } from '../../context/ToasterContext'; import Button from '../../elements/Button'; +import { Input2Controller } from '../../elements/Input2Controller'; import Label from '../../elements/Label'; import ReactTable, { Column } from '../../elements/ReactTable/ReactTable'; -import FormikInput from '../../elements/formik/FormikInput'; -import FormikSelect from '../../elements/formik/FormikSelect'; +import { Select2Controller } from '../../elements/Select2Controller'; import { convertPathArrayToString } from '../../utility/convertPathArrayToString'; import { getSpectraObjectPaths } from '../../utility/getSpectraObjectPaths'; @@ -78,9 +79,14 @@ interface CompareResultItem { } type CompareResult = Record; +interface ImportLinkItem { + source: string; + target: string[]; +} + const validationSchema = Yup.object({ source: Yup.string().required(), - target: Yup.array(Yup.string()).min(1).required(), + target: Yup.array(Yup.string().required()).min(1).required(), }); interface InnerMetaImportationModalPropsProps { @@ -115,8 +121,6 @@ function InnerMetaImportationModal({ }: InnerMetaImportationModalPropsProps) { const toaster = useToaster(); const dispatch = useDispatch(); - - const formRef = useRef>(null); const [parseResult, setParseResult] = useState | null>(); const [compareResults, setCompareResults] = useState({}); const [matches, setMatchesResults] = useState>({}); @@ -131,6 +135,14 @@ function InnerMetaImportationModal({ })(); } + const { handleSubmit, control, setValue } = useForm({ + defaultValues: { + source: '', + target: [], + }, + resolver: yupResolver(validationSchema), + }); + useEffect(() => { if (file) { handleParseFile(file); @@ -195,8 +207,7 @@ function InnerMetaImportationModal({ } } catch (error: any) { if (error instanceof TargetPathError) { - void formRef.current?.setFieldValue('target', null); - formRef.current?.setFieldError('target', ''); + setValue('target', []); } toaster.show({ message: error.message, @@ -256,57 +267,37 @@ function InnerMetaImportationModal({ ) : ( <>
- + + + - formRef.current?.submitForm()}> + paths?.[key] || key} + mapValue={convertPathArrayToString} + style={{ minWidth: '200px' }} + /> + + handleSubmit(handleLinkSpectra)()}> Link Spectra
diff --git a/src/data/parseMeta/linkMetaWithSpectra.ts b/src/data/parseMeta/linkMetaWithSpectra.ts index 725c0fc8a..612b9a2f6 100644 --- a/src/data/parseMeta/linkMetaWithSpectra.ts +++ b/src/data/parseMeta/linkMetaWithSpectra.ts @@ -13,7 +13,7 @@ type CompareResult = Record; function linkMetaWithSpectra(options: { source?: string; - target?: string; + target?: string | string[]; autolink?: boolean; parseMetaFileResult: ParseResult; spectra: Spectrum[];