import { Box } from '@mui/material'; import React, { useState } from 'react'; import * as Yup from 'yup'; import ToolImageInput from '@components/input/ToolImageInput'; import ToolFileResult from '@components/result/ToolFileResult'; import { GetGroupsType } from '@components/options/ToolOptions'; import TextFieldWithDesc from '@components/options/TextFieldWithDesc'; import ToolContent from '@components/ToolContent'; import { ToolComponentProps } from '@tools/defineTool'; import SimpleRadio from '@components/options/SimpleRadio'; import CheckboxWithDesc from '@components/options/CheckboxWithDesc'; import { processImage } from './service'; import { InitialValuesType } from './types'; import { useTranslation } from 'react-i18next'; const initialValues: InitialValuesType = { resizeMethod: 'pixels' as 'pixels' | 'percentage', dimensionType: 'width' as 'width' | 'height', width: '800', height: '600', percentage: '50', maintainAspectRatio: true }; const validationSchema = Yup.object({ width: Yup.number().when('resizeMethod', { is: 'pixels', then: (schema) => schema.min(1, 'Width must be at least 1px').required('Width is required') }), height: Yup.number().when('resizeMethod', { is: 'pixels', then: (schema) => schema .min(1, 'Height must be at least 1px') .required('Height is required') }), percentage: Yup.number().when('resizeMethod', { is: 'percentage', then: (schema) => schema .min(1, 'Percentage must be at least 1%') .max(1000, 'Percentage must be at most 1000%') .required('Percentage is required') }) }); export default function ResizeImage({ title }: ToolComponentProps) { const { t } = useTranslation(); const [input, setInput] = useState(null); const [result, setResult] = useState(null); const compute = async (optionsValues: InitialValuesType, input: any) => { if (!input) return; setResult(await processImage(input, optionsValues)); }; const getGroups: GetGroupsType = ({ values, updateField }) => [ { title: t('image:resize.resizeMethod'), component: ( updateField('resizeMethod', 'pixels')} checked={values.resizeMethod === 'pixels'} description={t('image:resize.resizeByPixelsDescription')} title={t('image:resize.resizeByPixels')} /> updateField('resizeMethod', 'percentage')} checked={values.resizeMethod === 'percentage'} description={t('image:resize.resizeByPercentageDescription')} title={t('image:resize.resizeByPercentage')} /> ) }, ...(values.resizeMethod === 'pixels' ? [ { title: t('image:resize.dimensionType'), component: ( updateField('maintainAspectRatio', value) } description={t('image:resize.maintainAspectRatioDescription')} title={t('image:resize.maintainAspectRatio')} /> {values.maintainAspectRatio && ( updateField('dimensionType', 'width')} checked={values.dimensionType === 'width'} description={t('image:resize.setWidthDescription')} title={t('image:resize.setWidth')} /> updateField('dimensionType', 'height')} checked={values.dimensionType === 'height'} description={t('image:resize.setHeightDescription')} title={t('image:resize.setHeight')} /> )} updateField('width', val)} description={t('image:resize.widthDescription')} disabled={ values.maintainAspectRatio && values.dimensionType === 'height' } inputProps={{ 'data-testid': 'width-input', type: 'number', min: 1 }} /> updateField('height', val)} description={t('image:resize.heightDescription')} disabled={ values.maintainAspectRatio && values.dimensionType === 'width' } inputProps={{ 'data-testid': 'height-input', type: 'number', min: 1 }} /> ) } ] : [ { title: t('image:resize.percentage'), component: ( updateField('percentage', val)} description={t('image:resize.percentageDescription')} inputProps={{ 'data-testid': 'percentage-input', type: 'number', min: 1, max: 1000 }} /> ) } ]) ]; return ( } resultComponent={ } toolInfo={{ title: t('image:resize.toolInfo.title'), description: t('image:resize.toolInfo.description') }} /> ); }