import ToolHeader from '../../../components/ToolHeader' import ToolLayout from '../../../components/ToolLayout' import { Box, Radio, Stack, TextField, useTheme } from '@mui/material' import Grid from '@mui/material/Grid' import Typography from '@mui/material/Typography' import Button from '@mui/material/Button' import PublishIcon from '@mui/icons-material/Publish' import ContentPasteIcon from '@mui/icons-material/ContentPaste' import DownloadIcon from '@mui/icons-material/Download' import React, { useEffect, useRef, useState } from 'react' import ToolTextInput from '../../../components/input/ToolTextInput' import ToolTextResult from '../../../components/result/ToolTextResult' import SettingsIcon from '@mui/icons-material/Settings' import { Field, Formik, FormikProps } from 'formik' import * as Yup from 'yup' type SplitOperatorType = 'symbol' | 'regex' | 'length' | 'chunks'; const initialValues = { splitSeparatorType: 'symbol', splitSeparator: ' ' } const initialSplitOperators: { title: string; description: string; defaultValue: 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.)', defaultValue: ' ', type: 'symbol' }, { title: 'Use a Regex for Splitting', defaultValue: '/\\s+/', 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.', defaultValue: '16', type: 'length' }, { title: 'Use a Number of Chunks', description: 'Number of chunks of equal\n' + 'length in the output.', defaultValue: '4', type: 'chunks' }] const CustomRadioButton = ({ fieldName, type, title, setFieldValue, value, description, onTextChange }: { fieldName: string; title: string; type: SplitOperatorType; setFieldValue: (fieldName: string, val: string) => void; value: string; description: string; onTextChange: (type: SplitOperatorType, value: string) => void; }) => { const onChange = () => setFieldValue(fieldName, type) return ( {title} onTextChange(type, event.target.value)} /> {description} ) } export default function SplitText() { const [input, setInput] = useState('') const [result, setResult] = useState('') const formRef = useRef>() const theme = useTheme() const [splitOperators, setSplitOperators] = useState<{ title: string; description: string; defaultValue: string; type: SplitOperatorType; value: string }[]>(initialSplitOperators.map(operator => ({ ...operator, value: operator.defaultValue }))) useEffect(() => { setResult(input.split(' ').join('\n')) }, [input]) const validationSchema = Yup.object({ splitSeparator: Yup.string().required('The separator is required') }) const onSplitOperatorTextChange = (type: SplitOperatorType, value: string) => { const splitOperatorsClone = [...splitOperators].map(splitOperator => { if (splitOperator.type === type) { splitOperator.value = value } return splitOperator }) setSplitOperators(splitOperatorsClone) } return ( Tool options { }} > {({ setFieldValue }) => ( Split separator options {splitOperators.map(({ title, description, type, value }) => )} )} ) }