import { Box, Stack } from '@mui/material'; import Grid from '@mui/material/Grid'; import React, { useContext, useEffect, useState } from 'react'; import ToolTextInput from '../../../components/input/ToolTextInput'; import ToolTextResult from '../../../components/result/ToolTextResult'; import { Formik, useFormikContext } from 'formik'; import * as Yup from 'yup'; import ToolOptions from '../../../components/options/ToolOptions'; import { compute, SplitOperatorType } from './service'; import { CustomSnackBarContext } from '../../../contexts/CustomSnackBarContext'; import RadioWithTextField from '../../../components/options/RadioWithTextField'; import TextFieldWithDesc from '../../../components/options/TextFieldWithDesc'; import ToolOptionGroups from '../../../components/options/ToolOptionGroups'; const initialValues = { splitSeparatorType: 'symbol' as SplitOperatorType, symbolValue: ' ', regexValue: '/\\s+/', lengthValue: '16', chunksValue: '4', outputSeparator: '\\n', charBeforeChunk: '', charAfterChunk: '' }; const splitOperators: { title: string; description: string; type: SplitOperatorType; }[] = [ { title: 'Use a Symbol for Splitting', description: 'Character that will be used to\n' + 'break text into parts.\n' + '(Space by default.)', type: 'symbol' }, { title: 'Use a Regex for Splitting', type: 'regex', description: 'Regular expression that will be\n' + 'used to break text into parts.\n' + '(Multiple spaces by default.)' }, { title: 'Use Length for Splitting', description: 'Number of symbols that will be\n' + 'put in each output chunk.', type: 'length' }, { title: 'Use a Number of Chunks', description: 'Number of chunks of equal\n' + 'length in the output.', type: 'chunks' } ]; const outputOptions: { description: string; accessor: keyof typeof initialValues; }[] = [ { description: 'Character that will be put\n' + 'between the split chunks.\n' + '(It\'s newline "\\n" by default.)', accessor: 'outputSeparator' }, { description: 'Character before each chunk', accessor: 'charBeforeChunk' }, { description: 'Character after each chunk', accessor: 'charAfterChunk' } ]; export default function SplitText() { const [input, setInput] = useState(''); const [result, setResult] = useState(''); // const formRef = useRef>(null); const { showSnackBar } = useContext(CustomSnackBarContext); const FormikListenerComponent = () => { const { values } = useFormikContext(); useEffect(() => { try { const { splitSeparatorType, outputSeparator, charBeforeChunk, charAfterChunk, chunksValue, symbolValue, regexValue, lengthValue } = values; setResult( compute( splitSeparatorType, input, symbolValue, regexValue, Number(lengthValue), Number(chunksValue), charBeforeChunk, charAfterChunk, outputSeparator ) ); } catch (exception: unknown) { if (exception instanceof Error) showSnackBar(exception.message, 'error'); } }, [values, input]); return null; // This component doesn't render anything }; const validationSchema = Yup.object({ // splitSeparator: Yup.string().required('The separator is required') }); return ( {}} > {({ setFieldValue, values }) => ( ( setFieldValue('splitSeparatorType', type) } onTextChange={(val) => setFieldValue(`${type}Value`, val) } /> ) ) }, { title: 'Output separator options', component: outputOptions.map((option) => ( setFieldValue(option.accessor, value) } description={option.description} /> )) } ]} /> )} ); }