Disable unsupported endpoints

This commit is contained in:
Connor Yoh 2025-07-23 16:41:27 +01:00
parent 0defce9883
commit 102b92190c
2 changed files with 47 additions and 4 deletions

View File

@ -1,14 +1,15 @@
import React from "react"; import React, { useMemo } from "react";
import { Stack, Text, Select, NumberInput, Group, Divider, UnstyledButton, useMantineTheme, useMantineColorScheme } from "@mantine/core"; import { Stack, Text, Select, NumberInput, Group, Divider, UnstyledButton, useMantineTheme, useMantineColorScheme } from "@mantine/core";
import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown"; import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useMultipleEndpointsEnabled } from "../../../hooks/useEndpointConfig";
import GroupedFormatDropdown from "./GroupedFormatDropdown"; import GroupedFormatDropdown from "./GroupedFormatDropdown";
import { ConvertParameters } from "../../../hooks/tools/convert/useConvertParameters"; import { ConvertParameters } from "../../../hooks/tools/convert/useConvertParameters";
import { import {
FROM_FORMAT_OPTIONS, FROM_FORMAT_OPTIONS,
TO_FORMAT_OPTIONS,
COLOR_TYPES, COLOR_TYPES,
OUTPUT_OPTIONS, OUTPUT_OPTIONS,
EXTENSION_TO_ENDPOINT
} from "../../../constants/convertConstants"; } from "../../../constants/convertConstants";
interface ConvertSettingsProps { interface ConvertSettingsProps {
@ -28,6 +29,46 @@ const ConvertSettings = ({
const theme = useMantineTheme(); const theme = useMantineTheme();
const { colorScheme } = useMantineColorScheme(); const { colorScheme } = useMantineColorScheme();
// Get all possible conversion endpoints to check their availability
const allEndpoints = useMemo(() => {
const endpoints = new Set<string>();
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) => { const handleFromExtensionChange = (value: string) => {
onParameterChange('fromExtension', value); onParameterChange('fromExtension', value);
// Reset to extension when from extension changes // Reset to extension when from extension changes
@ -61,7 +102,7 @@ const ConvertSettings = ({
<GroupedFormatDropdown <GroupedFormatDropdown
value={parameters.fromExtension} value={parameters.fromExtension}
placeholder="Select source file format" placeholder="Select source file format"
options={FROM_FORMAT_OPTIONS} options={enhancedFromOptions}
onChange={handleFromExtensionChange} onChange={handleFromExtensionChange}
disabled={disabled} disabled={disabled}
minWidth="21.875rem" minWidth="21.875rem"
@ -97,7 +138,7 @@ const ConvertSettings = ({
<GroupedFormatDropdown <GroupedFormatDropdown
value={parameters.toExtension} value={parameters.toExtension}
placeholder="Select target file format" placeholder="Select target file format"
options={getAvailableToExtensions(parameters.fromExtension) || []} options={enhancedToOptions}
onChange={handleToExtensionChange} onChange={handleToExtensionChange}
disabled={disabled} disabled={disabled}
minWidth="21.875rem" minWidth="21.875rem"

View File

@ -6,6 +6,7 @@ interface FormatOption {
value: string; value: string;
label: string; label: string;
group: string; group: string;
enabled?: boolean;
} }
interface GroupedFormatDropdownProps { interface GroupedFormatDropdownProps {
@ -124,6 +125,7 @@ const GroupedFormatDropdown = ({
variant={value === option.value ? "filled" : "outline"} variant={value === option.value ? "filled" : "outline"}
size="sm" size="sm"
onClick={() => handleOptionSelect(option.value)} onClick={() => handleOptionSelect(option.value)}
disabled={option.enabled === false}
style={{ style={{
fontSize: '0.75rem', fontSize: '0.75rem',
height: '2rem', height: '2rem',