import React, { useMemo } from "react"; import { Stack, Text, Group, Divider, UnstyledButton, useMantineTheme, useMantineColorScheme } from "@mantine/core"; import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown"; import { useTranslation } from "react-i18next"; import { useMultipleEndpointsEnabled } from "../../../hooks/useEndpointConfig"; import GroupedFormatDropdown from "./GroupedFormatDropdown"; import ConvertToImageSettings from "./ConvertToImageSettings"; import ConvertFromImageSettings from "./ConvertFromImageSettings"; import { ConvertParameters } from "../../../hooks/tools/convert/useConvertParameters"; import { FROM_FORMAT_OPTIONS, EXTENSION_TO_ENDPOINT, COLOR_TYPES, OUTPUT_OPTIONS } from "../../../constants/convertConstants"; interface ConvertSettingsProps { parameters: ConvertParameters; onParameterChange: (key: keyof ConvertParameters, value: any) => void; getAvailableToExtensions: (fromExtension: string) => Array<{value: string, label: string, group: string}>; disabled?: boolean; } const ConvertSettings = ({ parameters, onParameterChange, getAvailableToExtensions, disabled = false }: ConvertSettingsProps) => { const { t } = useTranslation(); const theme = useMantineTheme(); const { colorScheme } = useMantineColorScheme(); // Get all possible conversion endpoints to check their availability const allEndpoints = useMemo(() => { const endpoints = new Set(); Object.values(EXTENSION_TO_ENDPOINT).forEach(toEndpoints => { Object.values(toEndpoints).forEach(endpoint => { endpoints.add(endpoint); }); }); return Array.from(endpoints); }, []); const { endpointStatus } = useMultipleEndpointsEnabled(allEndpoints); // Function to check if a conversion is available based on endpoint const isConversionAvailable = (fromExt: string, toExt: string): boolean => { const endpointKey = EXTENSION_TO_ENDPOINT[fromExt]?.[toExt]; if (!endpointKey) return false; return endpointStatus[endpointKey] === true; }; // Enhanced FROM options with endpoint availability const enhancedFromOptions = useMemo(() => { return FROM_FORMAT_OPTIONS.map(option => ({ ...option, enabled: true // All "from" formats are generally available for selection })); }, []); // Enhanced TO options with endpoint availability const enhancedToOptions = useMemo(() => { if (!parameters.fromExtension) return []; const availableOptions = getAvailableToExtensions(parameters.fromExtension) || []; return availableOptions.map(option => ({ ...option, enabled: isConversionAvailable(parameters.fromExtension, option.value) })); }, [parameters.fromExtension, getAvailableToExtensions]); const handleFromExtensionChange = (value: string) => { onParameterChange('fromExtension', value); // Reset to extension when from extension changes onParameterChange('toExtension', ''); // Reset format-specific options onParameterChange('imageOptions', { colorType: COLOR_TYPES.COLOR, dpi: 300, singleOrMultiple: OUTPUT_OPTIONS.MULTIPLE, }); }; const handleToExtensionChange = (value: string) => { onParameterChange('toExtension', value); // Reset format-specific options when target extension changes onParameterChange('imageOptions', { colorType: COLOR_TYPES.COLOR, dpi: 300, singleOrMultiple: OUTPUT_OPTIONS.MULTIPLE, }); }; return ( {/* Format Selection */} {t("convert.convertFrom", "Convert from")}: {t("convert.convertTo", "Convert to")}: {!parameters.fromExtension ? ( Select a source format first ) : ( )} {/* Format-specific options */} {['png', 'jpg'].includes(parameters.toExtension) && ( <> )} {/* Color options for image to PDF conversion */} {['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'webp'].includes(parameters.fromExtension) && parameters.toExtension === 'pdf' && ( <> )} ); }; export default ConvertSettings;