import React, { useState } from 'react'; import { Box } from '@mui/material'; import ToolContent from '@components/ToolContent'; import ToolTextInput from '@components/input/ToolTextInput'; import ToolTextResult from '@components/result/ToolTextResult'; import { duplicateList, SplitOperatorType } from './service'; import { CardExampleType } from '@components/examples/ToolExamples'; import { ToolComponentProps } from '@tools/defineTool'; import { GetGroupsType } from '@components/options/ToolOptions'; import TextFieldWithDesc from '@components/options/TextFieldWithDesc'; import SimpleRadio from '@components/options/SimpleRadio'; import CheckboxWithDesc from '@components/options/CheckboxWithDesc'; import * as Yup from 'yup'; import { useTranslation } from 'react-i18next'; interface InitialValuesType { splitOperatorType: SplitOperatorType; splitSeparator: string; joinSeparator: string; concatenate: boolean; reverse: boolean; copy: string; } const initialValues: InitialValuesType = { splitOperatorType: 'symbol', splitSeparator: ' ', joinSeparator: ' ', concatenate: true, reverse: false, copy: '2' }; const validationSchema = Yup.object({ splitSeparator: Yup.string().required('The separator is required'), joinSeparator: Yup.string().required('The join separator is required'), copy: Yup.number() .typeError('Number of copies must be a number') .min(0.1, 'Number of copies must be positive') .required('Number of copies is required') }); const exampleCards: CardExampleType[] = [ { title: 'Simple duplication', description: 'This example shows how to duplicate a list of words.', sampleText: 'Hello World', sampleResult: 'Hello World Hello World', sampleOptions: { splitOperatorType: 'symbol', splitSeparator: ' ', joinSeparator: ' ', concatenate: true, reverse: false, copy: '2' } }, { title: 'Reverse duplication', description: 'This example shows how to duplicate a list in reverse order.', sampleText: 'Hello World', sampleResult: 'Hello World World Hello', sampleOptions: { splitOperatorType: 'symbol', splitSeparator: ' ', joinSeparator: ' ', concatenate: true, reverse: true, copy: '2' } }, { title: 'Interweaving items', description: 'This example shows how to interweave items instead of concatenating them.', sampleText: 'Hello World', sampleResult: 'Hello Hello World World', sampleOptions: { splitOperatorType: 'symbol', splitSeparator: ' ', joinSeparator: ' ', concatenate: false, reverse: false, copy: '2' } }, { title: 'Fractional duplication', description: 'This example shows how to duplicate a list with a fractional number of copies.', sampleText: 'apple banana cherry', sampleResult: 'apple banana cherry apple banana', sampleOptions: { splitOperatorType: 'symbol', splitSeparator: ' ', joinSeparator: ' ', concatenate: true, reverse: false, copy: '1.7' } } ]; export default function Duplicate({ title }: ToolComponentProps) { const { t } = useTranslation('list'); const [input, setInput] = useState(''); const [result, setResult] = useState(''); const compute = (optionsValues: InitialValuesType, input: string) => { if (input) { try { const copy = parseFloat(optionsValues.copy); setResult( duplicateList( optionsValues.splitOperatorType, optionsValues.splitSeparator, optionsValues.joinSeparator, input, optionsValues.concatenate, optionsValues.reverse, copy ) ); } catch (error) { if (error instanceof Error) { setResult(`Error: ${error.message}`); } else { setResult('An unknown error occurred'); } } } }; const getGroups: GetGroupsType = ({ values, updateField }) => [ { title: t('duplicate.splitOptions'), component: ( updateField('splitOperatorType', 'symbol')} checked={values.splitOperatorType === 'symbol'} title={t('duplicate.splitBySymbol')} /> updateField('splitOperatorType', 'regex')} checked={values.splitOperatorType === 'regex'} title={t('duplicate.splitByRegex')} /> updateField('splitSeparator', val)} description={t('duplicate.splitSeparatorDescription')} /> updateField('joinSeparator', val)} description={t('duplicate.joinSeparatorDescription')} /> ) }, { title: t('duplicate.duplicationOptions'), component: ( updateField('copy', val)} description={t('duplicate.copyDescription')} type="number" /> updateField('concatenate', checked)} description={t('duplicate.concatenateDescription')} /> updateField('reverse', checked)} description={t('duplicate.reverseDescription')} /> ) } ]; return ( } resultComponent={ } initialValues={initialValues} getGroups={getGroups} validationSchema={validationSchema} toolInfo={{ title: t('duplicate.toolInfo.title'), description: t('duplicate.toolInfo.description') }} exampleCards={exampleCards} input={input} setInput={setInput} compute={compute} /> ); }