/* * 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 { useContext, useEffect } from 'react'; import List from '@mui/material/List'; import { ListItem, ListItemText, Switch } from '@mui/material'; import ListSubheader from '@mui/material/ListSubheader'; import { TextSetting } from '@/components/settings/text/TextSetting.tsx'; import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext.tsx'; import { MetadataServerSettingKeys, MetadataServerSettings, ServerSettings } from '@/typings.ts'; import { requestManager } from '@/lib/requests/RequestManager.ts'; import { DownloadAheadSetting } from '@/components/settings/downloads/DownloadAheadSetting.tsx'; import { useMetadataServerSettings } from '@/util/metadataServerSettings.ts'; import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata.ts'; import { makeToast } from '@/components/util/Toast.tsx'; import { DeleteChaptersWhileReadingSetting } from '@/components/settings/downloads/DeleteChaptersWhileReadingSetting.tsx'; import { CategoriesInclusionSetting } from '@/components/settings/CategoriesInclusionSetting.tsx'; type DownloadSettingsType = Pick< ServerSettings, | 'downloadAsCbz' | 'downloadsPath' | 'autoDownloadNewChapters' | 'autoDownloadAheadLimit' | 'excludeEntryWithUnreadChapters' >; const extractDownloadSettings = (settings: ServerSettings): DownloadSettingsType => ({ downloadAsCbz: settings.downloadAsCbz, downloadsPath: settings.downloadsPath, autoDownloadNewChapters: settings.autoDownloadNewChapters, autoDownloadAheadLimit: settings.autoDownloadAheadLimit, excludeEntryWithUnreadChapters: settings.excludeEntryWithUnreadChapters, }); export const DownloadSettings = () => { const { t } = useTranslation(); const { setTitle, setAction } = useContext(NavBarContext); useSetDefaultBackTo('settings'); useEffect(() => { setTitle(t('download.settings.title')); setAction(null); return () => { setTitle(''); setAction(null); }; }, [t]); const { data } = requestManager.useGetServerSettings(); const downloadSettings = data ? extractDownloadSettings(data.settings) : undefined; const [mutateSettings] = requestManager.useUpdateServerSettings(); const { metadata, settings: metadataSettings } = useMetadataServerSettings(); const updateSetting = ( setting: Setting, value: DownloadSettingsType[Setting], ) => { mutateSettings({ variables: { input: { settings: { [setting]: value } } } }).catch(() => makeToast(t('global.error.label.failed_to_save_changes'), 'error'), ); }; const updateMetadataSetting = ( setting: Setting, value: MetadataServerSettings[Setting], ) => { if (!metadata) { return; } requestUpdateServerMetadata(convertToGqlMeta(metadata) ?? [], [[setting, value]]).catch(() => makeToast(t('global.error.label.failed_to_save_changes'), 'error'), ); }; return ( updateSetting('downloadsPath', path)} /> updateSetting('downloadAsCbz', e.target.checked)} /> {t('download.settings.delete_chapters.title')} } > updateMetadataSetting('deleteChaptersManuallyMarkedRead', e.target.checked)} /> updateMetadataSetting('deleteChaptersWhileReading', chapterToDelete) } /> updateMetadataSetting('deleteChaptersWithBookmark', e.target.checked)} /> {t('download.settings.auto_download.title')} } > updateSetting('autoDownloadNewChapters', e.target.checked)} /> updateSetting('excludeEntryWithUnreadChapters', e.target.checked)} disabled={!downloadSettings?.autoDownloadNewChapters} /> {t('download.settings.download_ahead.title')} } > ); };