/* * Copyright (C) Contributors to the Suwayomi project * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ import { useTranslation } from 'react-i18next'; import { useState } from 'react'; import TextField from '@mui/material/TextField'; import Stack from '@mui/material/Stack'; import DeleteIcon from '@mui/icons-material/Delete'; import IconButton from '@mui/material/IconButton'; import InputAdornment from '@mui/material/InputAdornment'; import Button from '@mui/material/Button'; import { useTheme } from '@mui/material/styles'; import MenuItem from '@mui/material/MenuItem'; import InputLabel from '@mui/material/InputLabel'; import FormControl from '@mui/material/FormControl'; import { d } from 'koration'; import { useElementSize } from '@mantine/hooks'; import { Headers } from '@/features/settings/components/images/Headers.tsx'; import { CustomTooltip } from '@/base/components/CustomTooltip.tsx'; import { TranslationKey } from '@/base/Base.types.ts'; import { IMAGE_PROCESSING_CALL_TIMEOUT, IMAGE_PROCESSING_COMPRESSION, IMAGE_PROCESSING_CONNECT_TIMEOUT, IMAGE_PROCESSING_INPUT_WIDTH, IMAGE_PROCESSING_TARGET_MODES_SELECT_VALUES, TARGET_DISABLED, } from '@/features/settings/Settings.constants.ts'; import { Select } from '@/base/components/inputs/Select.tsx'; import { TypographyMaxLines } from '@/base/components/texts/TypographyMaxLines.tsx'; import { MimeTypeTextField } from '@/features/settings/components/images/MimeTypeTextField.tsx'; import { ImageProcessingTargetMode, TSettingsDownloadConversion } from '@/features/settings/Settings.types.ts'; import { isDefaultMimeType, isValidCallTimeoutSetting, isValidCompressionLevel, isValidConnectTimeoutSetting, } from '@/features/settings/ImageProcessing.utils.ts'; export const Processing = ({ conversion, conversion: { mode, mimeType, target, compressionLevel, headers, callTimeout, connectTimeout }, onChange, isDuplicate, }: { conversion: TSettingsDownloadConversion; onChange: (newConversion: TSettingsDownloadConversion | null) => void; isDuplicate: boolean; }) => { const { t } = useTranslation(); const theme = useTheme(); const { ref: textFieldRef, height: textFieldHeight } = useElementSize(); const [areHeadersCollapsed, setAreHeadersCollapsed] = useState(true); const isDisabledMode = mode === ImageProcessingTargetMode.DISABLED; const isImageMode = mode === ImageProcessingTargetMode.IMAGE; const isCallTimeoutValid = isValidCallTimeoutSetting(callTimeout); const isConnectTimeoutValid = isValidConnectTimeoutSetting(connectTimeout); const isCompressionLevelValid = isValidCompressionLevel(compressionLevel); const isDefault = isDefaultMimeType(mimeType) && !isDuplicate; const isDisabled = isDefault && !target && compressionLevel == null; return ( { onChange({ ...conversion, mimeType: value, }); }} /> {t('download.settings.conversion.target_modes.title')} {!isDisabledMode && ( onChange({ ...conversion, target: value, }) } /> )} {(() => { if (isDisabledMode) { return null; } if (isImageMode) { return ( { onChange({ ...conversion, compressionLevel: e.target.value ? Number(e.target.value) : null, }); }} /> ); } return ( <> {t('global.date.label.second_other')} ), }, }} onChange={(e) => { onChange({ ...conversion, callTimeout: e.target.value ? d(Number(e.target.value)).seconds.toISOString() : null, }); }} /> {t('global.date.label.second_other')} ), }, }} onChange={(e) => { onChange({ ...conversion, connectTimeout: e.target.value ? d(Number(e.target.value)).seconds.toISOString() : null, }); }} /> ); })()} { onChange(null); }} > onChange({ ...conversion, headers: updatedHeaders, }) } /> ); };