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 { isImageFormat, isWebFormat } from "../../../utils/convertUtils"; import { getConversionEndpoints } from "../../../data/toolsTaxonomy"; import { useFileSelectionActions } from "../../../contexts/FileSelectionContext"; import { useFileContext } from "../../../contexts/FileContext"; import { detectFileExtension } from "../../../utils/fileUtils"; import GroupedFormatDropdown from "./GroupedFormatDropdown"; import ConvertToImageSettings from "./ConvertToImageSettings"; import ConvertFromImageSettings from "./ConvertFromImageSettings"; import ConvertFromWebSettings from "./ConvertFromWebSettings"; import ConvertFromEmailSettings from "./ConvertFromEmailSettings"; import ConvertToPdfaSettings from "./ConvertToPdfaSettings"; import { ConvertParameters } from "../../../hooks/tools/convert/useConvertParameters"; import { FROM_FORMAT_OPTIONS, EXTENSION_TO_ENDPOINT, COLOR_TYPES, OUTPUT_OPTIONS, FIT_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}>; selectedFiles: File[]; disabled?: boolean; } const ConvertSettings = ({ parameters, onParameterChange, getAvailableToExtensions, selectedFiles, disabled = false }: ConvertSettingsProps) => { const { t } = useTranslation(); const theme = useMantineTheme(); const { colorScheme } = useMantineColorScheme(); const { setSelectedFiles } = useFileSelectionActions(); const { activeFiles, setSelectedFiles: setContextSelectedFiles } = useFileContext(); const allEndpoints = useMemo(() => getConversionEndpoints(EXTENSION_TO_ENDPOINT), []); const { endpointStatus } = useMultipleEndpointsEnabled(allEndpoints); 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(() => { const baseOptions = FROM_FORMAT_OPTIONS.map(option => { // Check if this source format has any available conversions const availableConversions = getAvailableToExtensions(option.value) || []; const hasAvailableConversions = availableConversions.some(targetOption => isConversionAvailable(option.value, targetOption.value) ); return { ...option, enabled: hasAvailableConversions }; }); // Add dynamic format option if current selection is a file- format if (parameters.fromExtension && parameters.fromExtension.startsWith('file-')) { const extension = parameters.fromExtension.replace('file-', ''); const dynamicOption = { value: parameters.fromExtension, label: extension.toUpperCase(), group: 'File', enabled: true }; // Add the dynamic option at the beginning return [dynamicOption, ...baseOptions]; } return baseOptions; }, [getAvailableToExtensions, endpointStatus, parameters.fromExtension]); // 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, endpointStatus]); const resetParametersToDefaults = () => { onParameterChange('imageOptions', { colorType: COLOR_TYPES.COLOR, dpi: 300, singleOrMultiple: OUTPUT_OPTIONS.MULTIPLE, fitOption: FIT_OPTIONS.MAINTAIN_ASPECT, autoRotate: true, combineImages: true, }); onParameterChange('emailOptions', { includeAttachments: true, maxAttachmentSizeMB: 10, downloadHtml: false, includeAllRecipients: false, }); onParameterChange('pdfaOptions', { outputFormat: 'pdfa-1', }); onParameterChange('isSmartDetection', false); onParameterChange('smartDetectionType', 'none'); }; const setAutoTargetExtension = (fromExtension: string) => { const availableToOptions = getAvailableToExtensions(fromExtension); const autoTarget = availableToOptions.length === 1 ? availableToOptions[0].value : ''; onParameterChange('toExtension', autoTarget); }; const filterFilesByExtension = (extension: string) => { return activeFiles.filter(file => { const fileExtension = detectFileExtension(file.name); if (extension === 'any') { return true; } else if (extension === 'image') { return isImageFormat(fileExtension); } else { return fileExtension === extension; } }); }; const updateFileSelection = (files: File[]) => { setSelectedFiles(files); const fileIds = files.map(file => (file as any).id || file.name); setContextSelectedFiles(fileIds); }; const handleFromExtensionChange = (value: string) => { onParameterChange('fromExtension', value); setAutoTargetExtension(value); resetParametersToDefaults(); if (activeFiles.length > 0) { const matchingFiles = filterFilesByExtension(value); updateFileSelection(matchingFiles); } else { updateFileSelection([]); } }; const handleToExtensionChange = (value: string) => { onParameterChange('toExtension', value); onParameterChange('imageOptions', { colorType: COLOR_TYPES.COLOR, dpi: 300, singleOrMultiple: OUTPUT_OPTIONS.MULTIPLE, fitOption: FIT_OPTIONS.MAINTAIN_ASPECT, autoRotate: true, combineImages: true, }); onParameterChange('emailOptions', { includeAttachments: true, maxAttachmentSizeMB: 10, downloadHtml: false, includeAllRecipients: false, }); onParameterChange('pdfaOptions', { outputFormat: 'pdfa-1', }); }; return ( {/* Format Selection */} {t("convert.convertFrom", "Convert from")}: {t("convert.convertTo", "Convert to")}: {!parameters.fromExtension ? ( {t("convert.selectSourceFormatFirst", "Select a source format first")} ) : ( )} {/* Format-specific options */} {isImageFormat(parameters.toExtension) && ( <> )} {/* Color options for image to PDF conversion */} {(isImageFormat(parameters.fromExtension) && parameters.toExtension === 'pdf') || (parameters.isSmartDetection && parameters.smartDetectionType === 'images') ? ( <> ) : null} {/* Web to PDF options */} {((isWebFormat(parameters.fromExtension) && parameters.toExtension === 'pdf') || (parameters.isSmartDetection && parameters.smartDetectionType === 'web')) ? ( <> ) : null} {/* Email to PDF options */} {parameters.fromExtension === 'eml' && parameters.toExtension === 'pdf' && ( <> )} {/* PDF to PDF/A options */} {parameters.fromExtension === 'pdf' && parameters.toExtension === 'pdfa' && ( <> )} ); }; export default ConvertSettings;