From 0c22a9012ef3244a07772e5e8e173375a64210a1 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Sat, 16 Mar 2024 16:21:15 +0100 Subject: [PATCH] Feature/cleanup metadata related logic (#657) * Remove unnecessary parameter from "requestUpdateServerMetadata" * Streamline updating metadata server settings * Move metadata related logic --- src/components/MigrateDialog.tsx | 22 ++++++--------- .../library/useGetVisibleLibraryMangas.ts | 2 +- src/components/manga/MangaDetails.tsx | 2 +- .../navbar/action/CategorySelect.tsx | 10 +++---- src/components/settings/DeviceSetting.tsx | 9 +++---- .../downloads/DownloadAheadSetting.tsx | 10 +++---- src/lib/data/Chapters.ts | 2 +- src/lib/data/Mangas.ts | 2 +- src/{util => lib/metadata}/metadata.ts | 8 +++--- .../metadata}/metadataServerSettings.ts | 27 +++++++++++++++++-- src/{util => lib/metadata}/readerSettings.ts | 6 ++--- src/screens/Reader.tsx | 6 ++--- .../settings/DefaultReaderSettings.tsx | 6 ++--- src/screens/settings/DownloadSettings.tsx | 25 +++++++---------- src/screens/settings/LibrarySettings.tsx | 21 +++++++-------- src/typings.ts | 17 ++++++++---- 16 files changed, 91 insertions(+), 84 deletions(-) rename src/{util => lib/metadata}/metadata.ts (98%) rename src/{util => lib/metadata}/metadataServerSettings.ts (70%) rename src/{util => lib/metadata}/readerSettings.ts (96%) diff --git a/src/components/MigrateDialog.tsx b/src/components/MigrateDialog.tsx index e788a87d..baa8896f 100644 --- a/src/components/MigrateDialog.tsx +++ b/src/components/MigrateDialog.tsx @@ -19,13 +19,13 @@ import FormGroup from '@mui/material/FormGroup'; import { CheckboxInput } from '@/components/atoms/CheckboxInput.tsx'; import { Mangas, MigrateMode } from '@/lib/data/Mangas.ts'; import { makeToast } from '@/components/util/Toast.tsx'; -import { convertSettingsToMetadata, useMetadataServerSettings } from '@/util/metadataServerSettings.ts'; -import { MetadataServerSettings } from '@/typings.ts'; -import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata.ts'; +import { + createUpdateMetadataServerSettings, + useMetadataServerSettings, +} from '@/lib/metadata/metadataServerSettings.ts'; +import { MetadataMigrationSettings } from '@/typings.ts'; import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts'; -type MigrationSettingsType = Pick; - export const MigrateDialog = ({ mangaIdToMigrateTo, onClose }: { mangaIdToMigrateTo: number; onClose: () => void }) => { const { t } = useTranslation(); @@ -35,20 +35,14 @@ export const MigrateDialog = ({ mangaIdToMigrateTo, onClose }: { mangaIdToMigrat const mangaId = Number(mangaIdAsString); const { - metadata, settings: { includeChapters, includeCategories, deleteChapters }, } = useMetadataServerSettings(); const [isMigrationInProcess, setIsMigrationInProcess] = useState(false); - const setMigrationFlag = ( - setting: Setting, - value: MigrationSettingsType[Setting], - ) => { - requestUpdateServerMetadata(convertToGqlMeta(metadata) ?? [], [ - [setting, convertSettingsToMetadata({ [setting]: value })[setting]], - ]).catch(defaultPromiseErrorHandler('MigrateDialog::updateSetting')); - }; + const setMigrationFlag = createUpdateMetadataServerSettings( + defaultPromiseErrorHandler('MigrateDialog::updateSetting'), + ); const migrate = async (mode: MigrateMode) => { if (mangaId == null) { diff --git a/src/components/library/useGetVisibleLibraryMangas.ts b/src/components/library/useGetVisibleLibraryMangas.ts index 922438ca..fee8873d 100644 --- a/src/components/library/useGetVisibleLibraryMangas.ts +++ b/src/components/library/useGetVisibleLibraryMangas.ts @@ -10,7 +10,7 @@ import { StringParam, useQueryParam } from 'use-query-params'; import { useMemo } from 'react'; import { LibrarySortMode, NullAndUndefined, TManga } from '@/typings.ts'; import { useLibraryOptionsContext } from '@/components/context/LibraryOptionsContext.tsx'; -import { useMetadataServerSettings } from '@/util/metadataServerSettings.ts'; +import { useMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts'; const unreadFilter = (unread: NullAndUndefined, { unreadCount }: TManga): boolean => { switch (unread) { diff --git a/src/components/manga/MangaDetails.tsx b/src/components/manga/MangaDetails.tsx index 59774163..ed40238d 100644 --- a/src/components/manga/MangaDetails.tsx +++ b/src/components/manga/MangaDetails.tsx @@ -17,7 +17,7 @@ import Button from '@mui/material/Button'; import { ISource, TManga } from '@/typings'; import { requestManager } from '@/lib/requests/RequestManager.ts'; import { makeToast } from '@/components/util/Toast'; -import { useMetadataServerSettings } from '@/util/metadataServerSettings.ts'; +import { useMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts'; import { CategorySelect } from '@/components/navbar/action/CategorySelect.tsx'; import { Mangas } from '@/lib/data/Mangas.ts'; import { SpinnerImage } from '@/components/util/SpinnerImage.tsx'; diff --git a/src/components/navbar/action/CategorySelect.tsx b/src/components/navbar/action/CategorySelect.tsx index 76bdb665..8cabb3dc 100644 --- a/src/components/navbar/action/CategorySelect.tsx +++ b/src/components/navbar/action/CategorySelect.tsx @@ -22,10 +22,9 @@ import { useSelectableCollection } from '@/components/collection/useSelectableCo import { ThreeStateCheckboxInput } from '@/components/atoms/ThreeStateCheckboxInput.tsx'; import { Categories } from '@/lib/data/Categories.ts'; import { CheckboxInput } from '@/components/atoms/CheckboxInput.tsx'; -import { useMetadataServerSettings } from '@/util/metadataServerSettings.ts'; -import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata.ts'; import { makeToast } from '@/components/util/Toast.tsx'; import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts'; +import { updateMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts'; type BaseProps = { open: boolean; @@ -87,7 +86,6 @@ export function CategorySelect(props: Props) { const mangaIds = passedMangaIds ?? [mangaId]; const [doNotShowAddToLibraryDialogAgain, setDoNotShowAddToLibraryDialogAgain] = useState(false); - const { metadata: serverMetadata } = useMetadataServerSettings(); const mangaCategoryIds = useGetMangaCategoryIds(mangaId); const { data } = requestManager.useGetCategories(); @@ -136,9 +134,9 @@ export function CategorySelect(props: Props) { onClose(true, addToCategories, removeFromCategories); if (doNotShowAddToLibraryDialogAgain) { - requestUpdateServerMetadata(convertToGqlMeta(serverMetadata)! ?? {}, [ - ['showAddToLibraryCategorySelectDialog', false], - ]).catch(() => makeToast(t('search.error.label.failed_to_save_settings'), 'error')); + updateMetadataServerSettings('showAddToLibraryCategorySelectDialog', false).catch(() => + makeToast(t('search.error.label.failed_to_save_settings'), 'error'), + ); } const isUpdateRequired = !!addToCategories.length || !!removeFromCategories.length; diff --git a/src/components/settings/DeviceSetting.tsx b/src/components/settings/DeviceSetting.tsx index a13f6b24..d123a5d4 100644 --- a/src/components/settings/DeviceSetting.tsx +++ b/src/components/settings/DeviceSetting.tsx @@ -9,9 +9,8 @@ import { List, ListItem, ListItemText, MenuItem, Select } from '@mui/material'; import { useTranslation } from 'react-i18next'; import { useContext, useEffect } from 'react'; -import { convertSettingsToMetadata, useMetadataServerSettings } from '@/util/metadataServerSettings.ts'; +import { updateMetadataServerSettings, useMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts'; import { MetadataServerSettingKeys, MetadataServerSettings } from '@/typings.ts'; -import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata.ts'; import { makeToast } from '@/components/util/Toast.tsx'; import { MutableListSetting } from '@/components/settings/MutableListSetting.tsx'; import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext.tsx'; @@ -53,9 +52,9 @@ export const DeviceSetting = () => { setActiveDevice(DEFAULT_DEVICE); } - requestUpdateServerMetadata(convertToGqlMeta(metadata) ?? [], [ - [setting, convertSettingsToMetadata({ [setting]: value })[setting]], - ]).catch(() => makeToast(t('global.error.label.failed_to_save_changes'), 'error')); + updateMetadataServerSettings(setting, value).catch(() => + makeToast(t('global.error.label.failed_to_save_changes'), 'error'), + ); }; return ( diff --git a/src/components/settings/downloads/DownloadAheadSetting.tsx b/src/components/settings/downloads/DownloadAheadSetting.tsx index 813c5346..9aabf2fa 100644 --- a/src/components/settings/downloads/DownloadAheadSetting.tsx +++ b/src/components/settings/downloads/DownloadAheadSetting.tsx @@ -10,9 +10,8 @@ import { useTranslation } from 'react-i18next'; import { List, ListItem, ListItemText, Switch } from '@mui/material'; import { NumberSetting } from '@/components/settings/NumberSetting.tsx'; import { getPersistedServerSetting, usePersistedValue } from '@/util/usePersistedValue.tsx'; -import { useMetadataServerSettings } from '@/util/metadataServerSettings.ts'; -import { MetadataServerSettings } from '@/typings.ts'; -import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata.ts'; +import { updateMetadataServerSettings, useMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts'; +import { MetadataDownloadSettings } from '@/typings.ts'; import { makeToast } from '@/components/util/Toast.tsx'; const MIN_LIMIT = 2; @@ -23,7 +22,6 @@ export const DownloadAheadSetting = () => { const { t } = useTranslation(); const { - metadata, settings: { downloadAheadLimit }, } = useMetadataServerSettings(); @@ -35,9 +33,9 @@ export const DownloadAheadSetting = () => { getPersistedServerSetting, ); - const updateSetting = (value: MetadataServerSettings['downloadAheadLimit']) => { + const updateSetting = (value: MetadataDownloadSettings['downloadAheadLimit']) => { persistDownloadAheadLimit(value === 0 ? currentDownloadAheadLimit : value); - requestUpdateServerMetadata(convertToGqlMeta(metadata)! ?? {}, [['downloadAheadLimit', value]]).catch(() => + updateMetadataServerSettings('downloadAheadLimit', value).catch(() => makeToast(t('search.error.label.failed_to_save_settings'), 'warning'), ); }; diff --git a/src/lib/data/Chapters.ts b/src/lib/data/Chapters.ts index c95c2542..221e6a16 100644 --- a/src/lib/data/Chapters.ts +++ b/src/lib/data/Chapters.ts @@ -12,7 +12,7 @@ import { DocumentNode } from '@apollo/client'; import { ChapterOffset, TChapter, TranslationKey } from '@/typings.ts'; import { makeToast } from '@/components/util/Toast.tsx'; import { requestManager } from '@/lib/requests/RequestManager.ts'; -import { getMetadataServerSettings } from '@/util/metadataServerSettings.ts'; +import { getMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts'; import { FULL_CHAPTER_FIELDS } from '@/lib/graphql/Fragments.ts'; export type ChapterAction = 'download' | 'delete' | 'bookmark' | 'unbookmark' | 'mark_as_read' | 'mark_as_unread'; diff --git a/src/lib/data/Mangas.ts b/src/lib/data/Mangas.ts index 92eabdee..0095c0f9 100644 --- a/src/lib/data/Mangas.ts +++ b/src/lib/data/Mangas.ts @@ -18,7 +18,7 @@ import { } from '@/lib/graphql/generated/graphql.ts'; import { Chapters } from '@/lib/data/Chapters.ts'; import { makeToast } from '@/components/util/Toast.tsx'; -import { getMetadataServerSettings } from '@/util/metadataServerSettings.ts'; +import { getMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts'; export type MangaAction = | 'download' diff --git a/src/util/metadata.ts b/src/lib/metadata/metadata.ts similarity index 98% rename from src/util/metadata.ts rename to src/lib/metadata/metadata.ts index fc2ae5a3..416362e7 100644 --- a/src/util/metadata.ts +++ b/src/lib/metadata/metadata.ts @@ -17,7 +17,7 @@ import { TCategory, TChapter, TManga, -} from '@/typings'; +} from '@/typings.ts'; import { requestManager } from '@/lib/requests/RequestManager.ts'; import { MetaType } from '@/lib/graphql/generated/graphql.ts'; import { DEFAULT_DEVICE, getActiveDevice } from '@/util/device.ts'; @@ -372,10 +372,8 @@ export const requestUpdateMetadata = async ( ): Promise => Promise.all(keysToValues.map(([key, value]) => requestUpdateMetadataValue(metadataHolder, holderType, key, value))); -export const requestUpdateServerMetadata = async ( - serverMetadata: MetaType[], - keysToValues: MetadataKeyValuePair[], -): Promise => requestUpdateMetadata({ meta: serverMetadata }, 'global', keysToValues); +export const requestUpdateServerMetadata = async (keysToValues: MetadataKeyValuePair[]): Promise => + requestUpdateMetadata({}, 'global', keysToValues); export const requestUpdateMangaMetadata = async ( manga: TManga, diff --git a/src/util/metadataServerSettings.ts b/src/lib/metadata/metadataServerSettings.ts similarity index 70% rename from src/util/metadataServerSettings.ts rename to src/lib/metadata/metadataServerSettings.ts index 66bf100c..397f184c 100644 --- a/src/util/metadataServerSettings.ts +++ b/src/lib/metadata/metadataServerSettings.ts @@ -6,11 +6,18 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { AllowedMetadataValueTypes, AppMetadataKeys, Metadata, MetadataServerSettings } from '@/typings'; +import { + AllowedMetadataValueTypes, + AppMetadataKeys, + Metadata, + MetadataServerSettingKeys, + MetadataServerSettings, +} from '@/typings.ts'; import { requestManager } from '@/lib/requests/RequestManager.ts'; -import { convertFromGqlMeta, getMetadataFrom } from '@/util/metadata'; +import { convertFromGqlMeta, getMetadataFrom, requestUpdateServerMetadata } from '@/lib/metadata/metadata.ts'; import { jsonSaveParse } from '@/util/HelperFunctions.ts'; import { DEFAULT_DEVICE } from '@/util/device.ts'; +import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts'; export const getDefaultSettings = (): MetadataServerSettings => ({ // downloads @@ -79,3 +86,19 @@ export const getMetadataServerSettings = async (): Promise( + setting: Setting, + value: MetadataServerSettings[Setting], +): Promise => + requestUpdateServerMetadata([[setting, convertSettingsToMetadata({ [setting]: value })[setting]]]); + +export const createUpdateMetadataServerSettings = + ( + handleError: (error: any) => void = defaultPromiseErrorHandler('createUpdateMetadataServerSettings'), + ): ((...args: Parameters>) => Promise) => + (setting, value) => + updateMetadataServerSettings(setting, value).catch(handleError); diff --git a/src/util/readerSettings.ts b/src/lib/metadata/readerSettings.ts similarity index 96% rename from src/util/readerSettings.ts rename to src/lib/metadata/readerSettings.ts index 244343e6..6cb8338c 100644 --- a/src/util/readerSettings.ts +++ b/src/lib/metadata/readerSettings.ts @@ -6,14 +6,14 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { Metadata, IReaderSettings, MetadataKeyValuePair, GqlMetaHolder, TManga } from '@/typings'; +import { Metadata, IReaderSettings, MetadataKeyValuePair, GqlMetaHolder, TManga } from '@/typings.ts'; import { requestManager } from '@/lib/requests/RequestManager.ts'; import { convertFromGqlMeta, getMetadataFrom, requestUpdateMangaMetadata, requestUpdateServerMetadata, -} from '@/util/metadata'; +} from '@/lib/metadata/metadata.ts'; import { MetaType } from '@/lib/graphql/generated/graphql.ts'; type UndefinedReaderSettings = { @@ -111,5 +111,5 @@ export const checkAndHandleMissingStoredReaderSettings = async ( return; } - await requestUpdateServerMetadata(metadataHolder as MetaType[], settingsToUpdate); + await requestUpdateServerMetadata(settingsToUpdate); }; diff --git a/src/screens/Reader.tsx b/src/screens/Reader.tsx index da660fef..42588e63 100644 --- a/src/screens/Reader.tsx +++ b/src/screens/Reader.tsx @@ -17,8 +17,8 @@ import { checkAndHandleMissingStoredReaderSettings, getReaderSettingsFor, useDefaultReaderSettings, -} from '@/util/readerSettings'; -import { requestUpdateMangaMetadata } from '@/util/metadata'; +} from '@/lib/metadata/readerSettings.ts'; +import { requestUpdateMangaMetadata } from '@/lib/metadata/metadata.ts'; import { HorizontalPager } from '@/components/reader/pager/HorizontalPager'; import { PageNumber } from '@/components/reader/PageNumber'; import { PagedPager } from '@/components/reader/pager/PagedPager'; @@ -29,7 +29,7 @@ import { makeToast } from '@/components/util/Toast'; import { NavBarContext } from '@/components/context/NavbarContext.tsx'; import { useDebounce } from '@/util/useDebounce.ts'; import { UpdateChapterPatchInput } from '@/lib/graphql/generated/graphql.ts'; -import { useMetadataServerSettings } from '@/util/metadataServerSettings.ts'; +import { useMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts'; import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts'; import { Chapters } from '@/lib/data/Chapters.ts'; diff --git a/src/screens/settings/DefaultReaderSettings.tsx b/src/screens/settings/DefaultReaderSettings.tsx index 72a2effb..de972cc7 100644 --- a/src/screens/settings/DefaultReaderSettings.tsx +++ b/src/screens/settings/DefaultReaderSettings.tsx @@ -11,12 +11,12 @@ import { Box } from '@mui/material'; import CircularProgress from '@mui/material/CircularProgress'; import { useTranslation } from 'react-i18next'; import { AllowedMetadataValueTypes, IReaderSettings } from '@/typings'; -import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata'; +import { convertToGqlMeta, requestUpdateServerMetadata } from '@/lib/metadata/metadata.ts'; import { checkAndHandleMissingStoredReaderSettings, getDefaultSettings, useDefaultReaderSettings, -} from '@/util/readerSettings'; +} from '@/lib/metadata/readerSettings.ts'; import { ReaderSettingsOptions } from '@/components/reader/ReaderSettingsOptions'; import { makeToast } from '@/components/util/Toast'; import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext'; @@ -40,7 +40,7 @@ export function DefaultReaderSettings() { useSetDefaultBackTo('settings'); const setSettingValue = (key: keyof IReaderSettings, value: AllowedMetadataValueTypes) => { - requestUpdateServerMetadata(convertToGqlMeta(metadata)! ?? {}, [[key, value]]).catch(() => + requestUpdateServerMetadata([[key, value]]).catch(() => makeToast(t('reader.settings.error.label.failed_to_save_settings'), 'warning'), ); }; diff --git a/src/screens/settings/DownloadSettings.tsx b/src/screens/settings/DownloadSettings.tsx index bfe3ede0..489709a3 100644 --- a/src/screens/settings/DownloadSettings.tsx +++ b/src/screens/settings/DownloadSettings.tsx @@ -13,11 +13,13 @@ 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 { MetadataDownloadSettings, ServerSettings } from '@/typings.ts'; import { requestManager } from '@/lib/requests/RequestManager.ts'; import { DownloadAheadSetting } from '@/components/settings/downloads/DownloadAheadSetting.tsx'; -import { convertSettingsToMetadata, useMetadataServerSettings } from '@/util/metadataServerSettings.ts'; -import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata.ts'; +import { + createUpdateMetadataServerSettings, + useMetadataServerSettings, +} from '@/lib/metadata/metadataServerSettings.ts'; import { makeToast } from '@/components/util/Toast.tsx'; import { DeleteChaptersWhileReadingSetting } from '@/components/settings/downloads/DeleteChaptersWhileReadingSetting.tsx'; import { CategoriesInclusionSetting } from '@/components/settings/CategoriesInclusionSetting.tsx'; @@ -59,7 +61,7 @@ export const DownloadSettings = () => { const { data } = requestManager.useGetServerSettings(); const downloadSettings = data ? extractDownloadSettings(data.settings) : undefined; const [mutateSettings] = requestManager.useUpdateServerSettings(); - const { metadata, settings: metadataSettings } = useMetadataServerSettings(); + const { settings: metadataSettings } = useMetadataServerSettings(); const updateSetting = ( setting: Setting, @@ -70,18 +72,9 @@ export const DownloadSettings = () => { ); }; - const updateMetadataSetting = ( - setting: Setting, - value: MetadataServerSettings[Setting], - ) => { - if (!metadata) { - return; - } - - requestUpdateServerMetadata(convertToGqlMeta(metadata) ?? [], [ - [setting, convertSettingsToMetadata({ [setting]: value })[setting]], - ]).catch(() => makeToast(t('global.error.label.failed_to_save_changes'), 'error')); - }; + const updateMetadataSetting = createUpdateMetadataServerSettings(() => + makeToast(t('global.error.label.failed_to_save_changes'), 'error'), + ); return ( diff --git a/src/screens/settings/LibrarySettings.tsx b/src/screens/settings/LibrarySettings.tsx index 3d6e5325..75d5b523 100644 --- a/src/screens/settings/LibrarySettings.tsx +++ b/src/screens/settings/LibrarySettings.tsx @@ -13,10 +13,12 @@ import ListSubheader from '@mui/material/ListSubheader'; import { t as translate } from 'i18next'; import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext.tsx'; import { GlobalUpdateSettings } from '@/components/settings/globalUpdate/GlobalUpdateSettings.tsx'; -import { MetadataServerSettingKeys, MetadataServerSettings } from '@/typings.ts'; -import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata.ts'; +import { MetadataLibrarySettings } from '@/typings.ts'; import { makeToast } from '@/components/util/Toast.tsx'; -import { convertSettingsToMetadata, useMetadataServerSettings } from '@/util/metadataServerSettings.ts'; +import { + createUpdateMetadataServerSettings, + useMetadataServerSettings, +} from '@/lib/metadata/metadataServerSettings.ts'; import { requestManager } from '@/lib/requests/RequestManager.ts'; import { Mangas } from '@/lib/data/Mangas.ts'; @@ -55,16 +57,11 @@ export function LibrarySettings() { useSetDefaultBackTo('settings'); - const { metadata, settings } = useMetadataServerSettings(); + const { settings } = useMetadataServerSettings(); - const setSettingValue = ( - setting: Setting, - value: MetadataServerSettings[Setting], - ) => { - requestUpdateServerMetadata(convertToGqlMeta(metadata)! ?? {}, [ - [setting, convertSettingsToMetadata({ [setting]: value })[setting]], - ]).catch(() => makeToast(t('search.error.label.failed_to_save_settings'), 'warning')); - }; + const setSettingValue = createUpdateMetadataServerSettings(() => + makeToast(t('search.error.label.failed_to_save_settings'), 'warning'), + ); return ( diff --git a/src/typings.ts b/src/typings.ts index 61b609e9..ccbc11e7 100644 --- a/src/typings.ts +++ b/src/typings.ts @@ -218,27 +218,34 @@ export enum ChapterOffset { NEXT = 1, } -export type MetadataServerSettings = { - // downloads +export type MetadataDownloadSettings = { deleteChaptersManuallyMarkedRead: boolean; deleteChaptersWhileReading: number; deleteChaptersWithBookmark: boolean; downloadAheadLimit: number; +}; - // library +export type MetadataLibrarySettings = { showAddToLibraryCategorySelectDialog: boolean; ignoreFilters: boolean; removeMangaFromCategories: boolean; +}; - // client +export type MetadataClientSettings = { devices: string[]; +}; - // migration +export type MetadataMigrationSettings = { includeChapters: boolean; includeCategories: boolean; deleteChapters: boolean; }; +export type MetadataServerSettings = MetadataDownloadSettings & + MetadataLibrarySettings & + MetadataClientSettings & + MetadataMigrationSettings; + export interface ISearchSettings { ignoreFilters: boolean; }