import { DialogBody, DialogFooter } from '@blueprintjs/core'; import { yupResolver } from '@hookform/resolvers/yup'; import type { Tolerance } from 'nmr-correlation'; import { useMemo } from 'react'; import { useForm } from 'react-hook-form'; import type { CellProps } from 'react-table'; import * as Yup from 'yup'; import { useChartData } from '../../context/ChartContext.js'; import { useDispatch } from '../../context/DispatchContext.js'; import Button from '../../elements/Button.js'; import { NumberInput2Controller } from '../../elements/NumberInput2Controller.js'; import type { Column } from '../../elements/ReactTable/ReactTable.js'; import ReactTable from '../../elements/ReactTable/ReactTable.js'; import { StandardDialog } from '../../elements/StandardDialog.tsx'; interface ToleranceItem { atom: string; value: number; } interface SetShiftToleranceModalProps extends InnerSetShiftToleranceModalProps { isOpen: boolean; } interface InnerSetShiftToleranceModalProps { onClose: () => void; } const toleranceValidationSchema = Yup.array() .of( Yup.object().shape({ value: Yup.number().required(), atom: Yup.string().required(), }), ) .required() .min(1); const schema = Yup.object().shape({ tolerances: toleranceValidationSchema, }); export function SetShiftToleranceModal(props: SetShiftToleranceModalProps) { const { isOpen, ...otherPros } = props; if (!isOpen) { return; } return ; } function InnerSetShiftToleranceModal(props: InnerSetShiftToleranceModalProps) { const { onClose } = props; const { correlations } = useChartData(); const dispatch = useDispatch(); const tolerances = correlations?.options?.tolerance || {}; const tolerancesData: ToleranceItem[] = Object.keys(tolerances).map((atom) => ({ atom, value: tolerances[atom], })) || []; const { handleSubmit, control, formState: { isValid }, } = useForm<{ tolerances: ToleranceItem[] }>({ defaultValues: { tolerances: tolerancesData }, resolver: yupResolver(schema), mode: 'onChange', }); function onSaveHandler(data: any) { const tolerance: Tolerance = {}; for (const { atom, value } of data.tolerances) { tolerance[atom] = value; } dispatch({ type: 'SET_CORRELATIONS_TOLERANCE', payload: { tolerance, }, }); onClose?.(); } const COLUMNS: Array> = useMemo( () => [ { Header: '#', style: { width: '25px', textAlign: 'center' }, accessor: (_, index) => index + 1, }, { Header: 'Atom', style: { width: '25px', textAlign: 'center' }, accessor: 'atom', }, { Header: 'Value', style: { padding: 0 }, Cell: (cell: CellProps) => { return ( ); }, }, ], [control], ); return ( handleSubmit(onSaveHandler)()} disabled={!isValid} > Set shift tolerances ); }