import ToolHeader from '../../../components/ToolHeader'; import ToolLayout from '../../../components/ToolLayout'; import { Box, Stack, TextField } from '@mui/material'; import Grid from '@mui/material/Grid'; import Typography from '@mui/material/Typography'; import React, { useEffect, useRef, useState } from 'react'; import ToolTextInput from '../../../components/input/ToolTextInput'; import ToolTextResult from '../../../components/result/ToolTextResult'; import { Field, Formik, FormikProps } from 'formik'; import * as Yup from 'yup'; import ToolOptions from '../../../components/ToolOptions'; type SplitOperatorType = 'symbol' | 'regex' | 'length' | 'chunks'; const initialValues = { splitSeparatorType: 'symbol', 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' } ]; const CustomRadioButton = ({ fieldName, type, title, onTypeChange, value, description, onTextChange }: { fieldName: string; title: string; type: SplitOperatorType; onTypeChange: (val: string) => void; value: string; description: string; onTextChange: (value: string) => void; }) => { const onChange = () => onTypeChange(type); return ( {title} ); }; const InputWithDesc = ({ description, value, onChange }: { description: string; value: string; onChange: (value: string) => void; }) => { return ( onChange(event.target.value)} /> {description} ); }; export default function SplitText() { const [input, setInput] = useState(''); const [result, setResult] = useState(''); const formRef = useRef>(); useEffect(() => { setResult(input.split(' ').join('\n')); }, [input]); const validationSchema = Yup.object({ // splitSeparator: Yup.string().required('The separator is required') }); return ( {}} > {({ setFieldValue, values }) => ( Split separator options {splitOperators.map(({ title, description, type }) => ( setFieldValue('splitSeparatorType', type) } onTextChange={(val) => setFieldValue(`${type}Value`, val)} /> ))} Output separator options {outputOptions.map((option) => ( setFieldValue(option.accessor, value)} description={option.description} /> ))} )} ); }