import { Box, Alert, Chip } from '@mui/material'; import { useState } from 'react'; import ToolContent from '@components/ToolContent'; import { ToolComponentProps } from '@tools/defineTool'; import ToolTextResult from '@components/result/ToolTextResult'; import { GetGroupsType } from '@components/options/ToolOptions'; import { generateRandomNumbers, validateInput, formatNumbers } from './service'; import { InitialValuesType, RandomNumberResult } from './types'; import { useTranslation } from 'react-i18next'; import TextFieldWithDesc from '@components/options/TextFieldWithDesc'; import CheckboxWithDesc from '@components/options/CheckboxWithDesc'; const initialValues: InitialValuesType = { minValue: 1, maxValue: 100, count: 10, allowDecimals: false, allowDuplicates: true, sortResults: false, separator: ', ' }; export default function RandomNumberGenerator({ title, longDescription }: ToolComponentProps) { const { t } = useTranslation(); const [result, setResult] = useState(null); const [error, setError] = useState(null); const [formattedResult, setFormattedResult] = useState(''); const compute = (values: InitialValuesType) => { try { setError(null); setResult(null); setFormattedResult(''); // Validate input const validationError = validateInput(values); if (validationError) { setError(validationError); return; } // Generate random numbers const randomResult = generateRandomNumbers(values); setResult(randomResult); // Format for display const formatted = formatNumbers( randomResult.numbers, values.separator, values.allowDecimals ); setFormattedResult(formatted); } catch (err) { console.error('Random number generation failed:', err); setError(t('number:randomNumberGenerator.error.generationFailed')); } }; const getGroups: GetGroupsType | null = ({ values, updateField }) => [ { title: t('number:randomNumberGenerator.options.range.title'), component: ( updateField('minValue', parseInt(value) || 1) } description={t( 'number:randomNumberGenerator.options.range.minDescription' )} inputProps={{ type: 'number', 'data-testid': 'min-value-input' }} /> updateField('maxValue', parseInt(value) || 100) } description={t( 'number:randomNumberGenerator.options.range.maxDescription' )} inputProps={{ type: 'number', 'data-testid': 'max-value-input' }} /> ) }, { title: t('number:randomNumberGenerator.options.generation.title'), component: ( updateField('count', parseInt(value) || 10)} description={t( 'number:randomNumberGenerator.options.generation.countDescription' )} inputProps={{ type: 'number', min: 1, max: 10000, 'data-testid': 'count-input' }} /> updateField('allowDecimals', value)} description={t( 'number:randomNumberGenerator.options.generation.allowDecimals.description' )} /> updateField('allowDuplicates', value)} description={t( 'number:randomNumberGenerator.options.generation.allowDuplicates.description' )} /> updateField('sortResults', value)} description={t( 'number:randomNumberGenerator.options.generation.sortResults.description' )} /> ) }, { title: t('number:randomNumberGenerator.options.output.title'), component: ( updateField('separator', value)} description={t( 'number:randomNumberGenerator.options.output.separatorDescription' )} inputProps={{ 'data-testid': 'separator-input' }} /> ) } ]; return ( {error && ( {error} )} {result && ( {result.hasDuplicates && ( )} {result.isSorted && ( )} )} } toolInfo={{ title: t('number:randomNumberGenerator.info.title'), description: longDescription || t('number:randomNumberGenerator.info.description') }} /> ); }