import { Button, DialogFooter, Radio, RadioGroup, SegmentedControl, Tag, } from '@blueprintjs/core'; import { yupResolver } from '@hookform/resolvers/yup'; import type { AdvanceExportSettings, BasicExportSettings, ExportSettings, } from '@zakodium/nmrium-core'; import { useEffect, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; import ActionButtons from '../ActionButtons.js'; import { CheckController } from '../CheckController.js'; import type { LabelStyle } from '../Label.js'; import Label from '../Label.js'; import { NumberInput2Controller } from '../NumberInput2Controller.js'; import { Select2Controller } from '../Select2Controller.js'; import { StandardDialog } from '../StandardDialog.tsx'; import { StyledDialogBody } from '../StyledDialogBody.js'; import type { SizeItem } from '../print/pageSize.js'; import { getSizesList } from '../print/pageSize.js'; import type { BaseExportProps } from './ExportContent.js'; import { units } from './units.js'; import { useExportConfigurer } from './useExportConfigurer.js'; import { exportOptionValidationSchema } from './utilities/exportOptionValidationSchema.js'; import { getExportDefaultOptions, getExportDefaultOptionsByMode, } from './utilities/getExportOptions.js'; import type { Mode } from './utilities/getModes.js'; import { MODES } from './utilities/getModes.js'; interface InnerExportOptionsModalProps extends BaseExportProps { onCloseDialog: () => void; confirmButtonText?: string; } interface ExportOptionsModalProps extends InnerExportOptionsModalProps { isOpen: boolean; } export function ExportOptionsModal(props: ExportOptionsModalProps) { const { isOpen, ...otherProps } = props; if (!isOpen) return; return ; } const labelStyle: LabelStyle = { label: { color: '#232323', width: '80px', }, wrapper: { display: 'flex', justifyContent: 'flex-start', }, container: { margin: '5px 0' }, }; function InnerExportOptionsModal(props: InnerExportOptionsModalProps) { const { onCloseDialog, onExportOptionsChange, confirmButtonText, defaultExportOptions, } = props; const defaultValues = getExportDefaultOptions(defaultExportOptions); const [mode, setMode] = useState(defaultValues.mode); const methods = useForm({ defaultValues, resolver: yupResolver(exportOptionValidationSchema as any), }); const { handleSubmit, control, watch, setValue, formState: { isValid, errors }, reset, setFocus, } = methods; const watchSettings = watch(); const { unit, dpi = 0, layout, } = watchSettings as AdvanceExportSettings & BasicExportSettings; const { widthInPixel, heightInPixel, isAspectRatioEnabled, changeDPI, enableAspectRatio, changeSize, changeUnit, } = useExportConfigurer(watchSettings); let sizesList: SizeItem[] = []; if (layout) { sizesList = getSizesList(layout); } function handleChangeMode(mode: any) { const options = defaultValues; setMode(mode); if (options.mode === mode) { reset(defaultValues); } else { reset(getExportDefaultOptionsByMode(mode)); } } useEffect(() => { const handleRenderComplete = () => { setTimeout(() => { if (mode === 'advance') { setFocus('width'); } else { setFocus('dpi'); } }, 0); }; const handleKeyDown = (event: any) => { if (event.key === 'Enter') { void handleSubmit(onExportOptionsChange)(); } }; globalThis.addEventListener('keydown', handleKeyDown); const animationFrameId = requestAnimationFrame(handleRenderComplete); return () => { cancelAnimationFrame(animationFrameId); globalThis.removeEventListener('keydown', handleKeyDown); }; }, [handleSubmit, mode, onExportOptionsChange, setFocus]); return (
{mode === 'basic' && ( <> )} {mode === 'advance' && ( <> )}
{ void handleSubmit(onExportOptionsChange)(); }} doneLabel={confirmButtonText} onCancel={() => onCloseDialog?.()} />
); }