From f049da760e810a4dc04b68a548a979b262f1e483 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Wed, 27 Dec 2023 14:48:27 +0100 Subject: [PATCH 1/5] Move "SearchSettings" into "LibrarySettings" --- src/screens/settings/LibrarySettings.tsx | 36 ++++++++++++++++-- src/screens/settings/SearchSettings.tsx | 47 ------------------------ 2 files changed, 32 insertions(+), 51 deletions(-) delete mode 100644 src/screens/settings/SearchSettings.tsx diff --git a/src/screens/settings/LibrarySettings.tsx b/src/screens/settings/LibrarySettings.tsx index 1986b1b665..24d0b69b3e 100644 --- a/src/screens/settings/LibrarySettings.tsx +++ b/src/screens/settings/LibrarySettings.tsx @@ -8,9 +8,14 @@ import { useTranslation } from 'react-i18next'; import { useContext, useEffect } from 'react'; +import { List, ListItem, ListItemText, Switch } from '@mui/material'; +import ListSubheader from '@mui/material/ListSubheader'; import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext.tsx'; import { GlobalUpdateSettings } from '@/components/settings/globalUpdate/GlobalUpdateSettings.tsx'; -import { SearchSettings } from '@/screens/settings/SearchSettings.tsx'; +import { useSearchSettings } from '@/util/searchSettings.ts'; +import { SearchMetadataKeys } from '@/typings.ts'; +import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata.ts'; +import { makeToast } from '@/components/util/Toast.tsx'; export function LibrarySettings() { const { t } = useTranslation(); @@ -23,10 +28,33 @@ export function LibrarySettings() { useSetDefaultBackTo('settings'); + const { metadata, settings } = useSearchSettings(); + + const setSettingValue = (key: SearchMetadataKeys, value: boolean) => { + requestUpdateServerMetadata(convertToGqlMeta(metadata)! ?? {}, [[key, value]]).catch(() => + makeToast(t('search.error.label.failed_to_save_settings'), 'warning'), + ); + }; + return ( - <> - + + + {t('search.title.search')} + + } + > + + + setSettingValue('ignoreFilters', e.target.checked)} + /> + + - > + ); } diff --git a/src/screens/settings/SearchSettings.tsx b/src/screens/settings/SearchSettings.tsx deleted file mode 100644 index b9efc4bc83..0000000000 --- a/src/screens/settings/SearchSettings.tsx +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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 { List, ListItem, ListItemText, Switch } from '@mui/material'; -import { useTranslation } from 'react-i18next'; -import ListSubheader from '@mui/material/ListSubheader'; -import { SearchMetadataKeys } from '@/typings'; -import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata'; -import { useSearchSettings } from '@/util/searchSettings'; -import { makeToast } from '@/components/util/Toast'; -import { useSetDefaultBackTo } from '@/components/context/NavbarContext'; - -export function SearchSettings() { - const { t } = useTranslation(); - const { metadata, settings } = useSearchSettings(); - - useSetDefaultBackTo('settings'); - - const setSettingValue = (key: SearchMetadataKeys, value: boolean) => { - requestUpdateServerMetadata(convertToGqlMeta(metadata)! ?? {}, [[key, value]]).catch(() => - makeToast(t('search.error.label.failed_to_save_settings'), 'warning'), - ); - }; - return ( - - {t('search.title.search')} - - } - > - - - setSettingValue('ignoreFilters', e.target.checked)} - /> - - - ); -} From 28cf67ccf2ea501449ad64398320b384c0b2377b Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Wed, 27 Dec 2023 15:18:10 +0100 Subject: [PATCH 2/5] Change property "setOpen" to "onClose" for "CategorySelect" --- src/components/manga/MangaActionMenu.tsx | 4 ++-- src/components/manga/MangaToolbarMenu.tsx | 2 +- src/components/manga/MangasSelectionFABActionItems.tsx | 4 ++-- src/components/navbar/action/CategorySelect.tsx | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/manga/MangaActionMenu.tsx b/src/components/manga/MangaActionMenu.tsx index 3989efb802..2c557c0284 100644 --- a/src/components/manga/MangaActionMenu.tsx +++ b/src/components/manga/MangaActionMenu.tsx @@ -115,8 +115,8 @@ export const MangaActionMenu = ({ {isCategorySelectOpen && ( { - setIsCategorySelectOpen(open); + onClose={() => { + setIsCategorySelectOpen(false); bindMenuProps.onClose(); }} mangaId={manga.id} diff --git a/src/components/manga/MangaToolbarMenu.tsx b/src/components/manga/MangaToolbarMenu.tsx index 9d86bbd12d..e848dd19e6 100644 --- a/src/components/manga/MangaToolbarMenu.tsx +++ b/src/components/manga/MangaToolbarMenu.tsx @@ -119,7 +119,7 @@ export const MangaToolbarMenu = ({ manga, onRefresh, refreshing }: IProps) => { > )} - + setEditCategories(false)} mangaId={manga.id} /> > ); }; diff --git a/src/components/manga/MangasSelectionFABActionItems.tsx b/src/components/manga/MangasSelectionFABActionItems.tsx index e88a52d5f8..ce7f43f607 100644 --- a/src/components/manga/MangasSelectionFABActionItems.tsx +++ b/src/components/manga/MangasSelectionFABActionItems.tsx @@ -93,8 +93,8 @@ export const MangasSelectionFABActionItems = ({ {isCategorySelectOpen && ( { - setIsCategorySelectOpen(open); + onClose={() => { + setIsCategorySelectOpen(false); handleClose(true); }} mangaIds={Mangas.getIds(selectedMangas)} diff --git a/src/components/navbar/action/CategorySelect.tsx b/src/components/navbar/action/CategorySelect.tsx index 62eb5d04ee..b7595de67d 100644 --- a/src/components/navbar/action/CategorySelect.tsx +++ b/src/components/navbar/action/CategorySelect.tsx @@ -21,7 +21,7 @@ import { ThreeStateCheckboxInput } from '@/components/atoms/ThreeStateCheckboxIn type BaseProps = { open: boolean; - setOpen: (value: boolean) => void; + onClose: (didUpdateCategories: boolean) => void; }; type SingleMangaModeProps = { @@ -72,7 +72,7 @@ const getCategoryCheckedState = ( export function CategorySelect(props: Props) { const { t } = useTranslation(); - const { open, setOpen, mangaId, mangaIds: passedMangaIds } = props; + const { open, onClose, mangaId, mangaIds: passedMangaIds } = props; const isSingleSelectionMode = mangaId !== undefined; const mangaIds = passedMangaIds ?? [mangaId]; @@ -111,11 +111,11 @@ export function CategorySelect(props: Props) { const handleCancel = () => { setSelectionForKey('categoriesToAdd', mangaCategoryIds); setSelectionForKey('categoriesToRemove', []); - setOpen(false); + onClose(false); }; const handleOk = () => { - setOpen(false); + onClose(true); const addToCategories = isSingleSelectionMode ? categoriesToAdd.filter((categoryId) => !mangaCategoryIds.includes(categoryId)) From 566b692fcc7adeaf5bafec074906c4eb1a9ff1d0 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Wed, 27 Dec 2023 15:22:40 +0100 Subject: [PATCH 3/5] Optionally show category selection when adding manga to library --- src/components/manga/MangaDetails.tsx | 148 ++++++++++-------- .../navbar/action/CategorySelect.tsx | 16 +- src/i18n/locale/en.json | 35 +++-- src/screens/settings/LibrarySettings.tsx | 21 ++- src/typings.ts | 4 + src/util/metadataServerSettings.ts | 1 + 6 files changed, 144 insertions(+), 81 deletions(-) diff --git a/src/components/manga/MangaDetails.tsx b/src/components/manga/MangaDetails.tsx index eb9ab7a925..76793f0d19 100644 --- a/src/components/manga/MangaDetails.tsx +++ b/src/components/manga/MangaDetails.tsx @@ -10,13 +10,15 @@ import FavoriteIcon from '@mui/icons-material/Favorite'; import FavoriteBorderIcon from '@mui/icons-material/FavoriteBorder'; import PublicIcon from '@mui/icons-material/Public'; import { styled } from '@mui/material/styles'; -import React, { useEffect, useMemo } from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { t as translate } from 'i18next'; 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 { CategorySelect } from '@/components/navbar/action/CategorySelect.tsx'; const DetailsWrapper = styled('div')(({ theme }) => ({ width: '100%', @@ -167,12 +169,13 @@ function getValueOrUnknown(val?: string | null) { export const MangaDetails: React.FC = ({ manga }) => { const { t } = useTranslation(); - const { data: categoriesData, loading: areCategoriesLoading } = requestManager.useGetCategories(); - const categories = categoriesData?.categories.nodes ?? []; - const defaultCategoryIds = categories - .filter((category) => category.default && category.id !== 0) - .map((category) => category.id); - const [updateMangaCategories] = requestManager.useUpdateMangaCategories(); + + const { + settings: { showAddToLibraryCategorySelectDialog }, + loading: areSettingsLoading, + } = useMetadataServerSettings(); + + const [isCategorySelectOpen, setIsCategorySelectOpen] = useState(false); useEffect(() => { if (!manga.source) { @@ -181,18 +184,23 @@ export const MangaDetails: React.FC = ({ manga }) => { }, [manga.source]); const addToLibrary = () => { - Promise.all([ - requestManager.updateManga(manga.id, { inLibrary: true }).response, - updateMangaCategories({ - variables: { input: { id: manga.id, patch: { addToCategories: defaultCategoryIds } } }, - }), - ]) - .then(() => makeToast(t('library.info.label.added_to_library'), 'success')) + requestManager + .updateManga(manga.id, { inLibrary: true }) + .response.then(() => makeToast(t('library.info.label.added_to_library'), 'success')) .catch(() => { makeToast(t('library.error.label.add_to_library'), 'error'); }); }; + const handleAddToLibraryClick = () => { + if (!showAddToLibraryCategorySelectDialog) { + addToLibrary(); + return; + } + + setIsCategorySelectOpen(true); + }; + const removeFromLibrary = () => { Promise.all([requestManager.updateManga(manga.id, { inLibrary: false }).response]) .then(() => makeToast(t('library.info.label.removed_from_library'), 'success')) @@ -202,53 +210,69 @@ export const MangaDetails: React.FC = ({ manga }) => { }; return ( - - - - - {manga.thumbnailUrl && ( - - )} - - - {manga.title} - - {`${t('manga.label.author')}: `} - {getValueOrUnknown(manga.author)} - - - {`${t('manga.label.artist')}: `} - {getValueOrUnknown(manga.artist)} - - {`${t('manga.label.status')}: ${manga.status}`} - {`${t('source.title')}: ${getSourceName(manga.source)}`} - - - - - : } - onClick={manga.inLibrary ? removeFromLibrary : addToLibrary} - size="large" - > - {manga.inLibrary ? t('manga.button.in_library') : t('manga.button.add_to_library')} - - - - - - - - {t('settings.about.title')} - {manga.description} - - - {manga.genre.map((g) => ( - {g} - ))} - - - + <> + + + + + {manga.thumbnailUrl && ( + + )} + + + {manga.title} + + {`${t('manga.label.author')}: `} + {getValueOrUnknown(manga.author)} + + + {`${t('manga.label.artist')}: `} + {getValueOrUnknown(manga.artist)} + + {`${t('manga.label.status')}: ${manga.status}`} + {`${t('source.title')}: ${getSourceName(manga.source)}`} + + + + + : } + onClick={manga.inLibrary ? removeFromLibrary : handleAddToLibraryClick} + size="large" + > + {manga.inLibrary ? t('manga.button.in_library') : t('manga.button.add_to_library')} + + + + + + + + {t('settings.about.title')} + {manga.description} + + + {manga.genre.map((g) => ( + {g} + ))} + + + + {isCategorySelectOpen && ( + { + setIsCategorySelectOpen(false); + + if (didUpdateCategories) { + addToLibrary(); + } + }} + mangaId={manga.id} + addToLibrary + /> + )} + > ); }; diff --git a/src/components/navbar/action/CategorySelect.tsx b/src/components/navbar/action/CategorySelect.tsx index b7595de67d..dec3437c35 100644 --- a/src/components/navbar/action/CategorySelect.tsx +++ b/src/components/navbar/action/CategorySelect.tsx @@ -18,6 +18,7 @@ import { requestManager } from '@/lib/requests/RequestManager.ts'; import { Mangas } from '@/lib/data/Mangas.ts'; import { useSelectableCollection } from '@/components/collection/useSelectableCollection.ts'; import { ThreeStateCheckboxInput } from '@/components/atoms/ThreeStateCheckboxInput.tsx'; +import { TCategory } from '@/typings.ts'; type BaseProps = { open: boolean; @@ -26,6 +27,7 @@ type BaseProps = { type SingleMangaModeProps = { mangaId: number; + addToLibrary?: boolean; }; type MultiMangaModeProps = { @@ -69,10 +71,13 @@ const getCategoryCheckedState = ( return undefined; }; +const getDefaultCategoryIds = (categories: TCategory[]) => + categories.filter(({ default: isDefault }) => isDefault).map(({ id }) => id); + export function CategorySelect(props: Props) { const { t } = useTranslation(); - const { open, onClose, mangaId, mangaIds: passedMangaIds } = props; + const { open, onClose, mangaId, mangaIds: passedMangaIds, addToLibrary = false } = props; const isSingleSelectionMode = mangaId !== undefined; const mangaIds = passedMangaIds ?? [mangaId]; @@ -89,19 +94,24 @@ export function CategorySelect(props: Props) { return cats; }, [categoriesData]); + const defaultCategoryIds = useMemo( + () => (addToLibrary ? getDefaultCategoryIds(allCategories) : []), + [allCategories], + ); + const { handleSelection, setSelectionForKey, getSelectionForKey } = useSelectableCollection< number, 'categoriesToAdd' | 'categoriesToRemove' >(allCategories.length, { currentKey: 'categoriesToAdd', initialState: { - categoriesToAdd: mangaCategoryIds, + categoriesToAdd: [...mangaCategoryIds, ...defaultCategoryIds], categoriesToRemove: [], }, }); useEffect(() => { - setSelectionForKey('categoriesToAdd', mangaCategoryIds); + setSelectionForKey('categoriesToAdd', [...mangaCategoryIds, ...defaultCategoryIds]); setSelectionForKey('categoriesToRemove', []); }, [mangaCategoryIds]); diff --git a/src/i18n/locale/en.json b/src/i18n/locale/en.json index 41774564c8..b36709eac3 100644 --- a/src/i18n/locale/en.json +++ b/src/i18n/locale/en.json @@ -314,6 +314,7 @@ "discord": "Discord", "display": "Display", "filter": "Filter", + "general": "General", "github": "GitHub", "links": "Links", "loading": "Loading…", @@ -402,6 +403,16 @@ } }, "settings": { + "general": { + "add_to_library": { + "category_selection": { + "label": { + "description": "Show the category selection dialog when adding a manga to the library", + "title": "Category selection dialog" + } + } + } + }, "global_update": { "auto_update": { "interval": { @@ -447,6 +458,18 @@ }, "manga": { "action": { + "category": { + "button": { + "selected": "Change categories of selected" + }, + "label": { + "action": "Change categories", + "error_one": "Could not change the categories of the manga", + "error_other": "Could not change the categories of the manga", + "success_one": "Changed categories of manga", + "success_other": "Changed categories of {{count}} manga" + } + }, "library": { "remove": { "button": { @@ -460,18 +483,6 @@ "success_other": "Removed {{count}} manga from the library" } } - }, - "category": { - "button": { - "selected": "Change categories of selected" - }, - "label": { - "action": "Change categories", - "error_one": "Could not change the categories of the manga", - "error_other": "Could not change the categories of the manga", - "success_one": "Changed categories of manga", - "success_other": "Changed categories of {{count}} manga" - } } }, "button": { diff --git a/src/screens/settings/LibrarySettings.tsx b/src/screens/settings/LibrarySettings.tsx index 24d0b69b3e..1a73ca8b9a 100644 --- a/src/screens/settings/LibrarySettings.tsx +++ b/src/screens/settings/LibrarySettings.tsx @@ -13,9 +13,10 @@ import ListSubheader from '@mui/material/ListSubheader'; import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext.tsx'; import { GlobalUpdateSettings } from '@/components/settings/globalUpdate/GlobalUpdateSettings.tsx'; import { useSearchSettings } from '@/util/searchSettings.ts'; -import { SearchMetadataKeys } from '@/typings.ts'; +import { MetadataServerSettingKeys, SearchMetadataKeys } from '@/typings.ts'; import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata.ts'; import { makeToast } from '@/components/util/Toast.tsx'; +import { useMetadataServerSettings } from '@/util/metadataServerSettings.ts'; export function LibrarySettings() { const { t } = useTranslation(); @@ -29,8 +30,9 @@ export function LibrarySettings() { useSetDefaultBackTo('settings'); const { metadata, settings } = useSearchSettings(); + const { settings: serverSettings } = useMetadataServerSettings(); - const setSettingValue = (key: SearchMetadataKeys, value: boolean) => { + const setSettingValue = (key: SearchMetadataKeys | MetadataServerSettingKeys, value: boolean) => { requestUpdateServerMetadata(convertToGqlMeta(metadata)! ?? {}, [[key, value]]).catch(() => makeToast(t('search.error.label.failed_to_save_settings'), 'warning'), ); @@ -40,8 +42,8 @@ export function LibrarySettings() { - {t('search.title.search')} + + {t('global.label.general')} } > @@ -53,6 +55,17 @@ export function LibrarySettings() { onChange={(e) => setSettingValue('ignoreFilters', e.target.checked)} /> + + + setSettingValue('showAddToLibraryCategorySelectDialog', e.target.checked)} + /> + diff --git a/src/typings.ts b/src/typings.ts index 5a76c7e29b..e2f8c32eaa 100644 --- a/src/typings.ts +++ b/src/typings.ts @@ -213,9 +213,13 @@ export enum ChapterOffset { } export type MetadataServerSettings = { + // downloads deleteChaptersManuallyMarkedRead: boolean; deleteChaptersWhileReading: number; deleteChaptersWithBookmark: boolean; + + // library + showAddToLibraryCategorySelectDialog: boolean; }; export interface ISearchSettings { diff --git a/src/util/metadataServerSettings.ts b/src/util/metadataServerSettings.ts index ebd7e109b8..e4a160a7f3 100644 --- a/src/util/metadataServerSettings.ts +++ b/src/util/metadataServerSettings.ts @@ -14,6 +14,7 @@ export const getDefaultSettings = (): MetadataServerSettings => ({ deleteChaptersManuallyMarkedRead: false, deleteChaptersWhileReading: 0, deleteChaptersWithBookmark: false, + showAddToLibraryCategorySelectDialog: true, }); const getMetadataServerSettingsWithDefaultFallback = ( From 53538d1d8ac5eb22e3404f7e198ce03b38f8b4c0 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Wed, 27 Dec 2023 17:15:17 +0100 Subject: [PATCH 4/5] Update "ignore filters" translation --- src/i18n/locale/en.json | 11 ++++++++--- src/screens/settings/LibrarySettings.tsx | 5 ++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/i18n/locale/en.json b/src/i18n/locale/en.json index b36709eac3..c39f7955a3 100644 --- a/src/i18n/locale/en.json +++ b/src/i18n/locale/en.json @@ -411,6 +411,14 @@ "title": "Category selection dialog" } } + }, + "search": { + "ignore_filters": { + "label": { + "description": "Search results will include manga that do not match the current filters", + "title": "Ignore filters when searching" + } + } } }, "global_update": { @@ -569,9 +577,6 @@ "source_search_failed": "Could not search source" } }, - "label": { - "ignore_filters": "Ignore filters when searching" - }, "title": { "global_search": "Global Search", "search": "Search" diff --git a/src/screens/settings/LibrarySettings.tsx b/src/screens/settings/LibrarySettings.tsx index 1a73ca8b9a..c8d9c13931 100644 --- a/src/screens/settings/LibrarySettings.tsx +++ b/src/screens/settings/LibrarySettings.tsx @@ -48,7 +48,10 @@ export function LibrarySettings() { } > - + Date: Wed, 27 Dec 2023 17:19:13 +0100 Subject: [PATCH 5/5] Move "ignore_filters" setting to "metadataServerSettings" --- .../library/useGetVisibleLibraryMangas.ts | 4 +-- src/screens/settings/LibrarySettings.tsx | 15 +++++---- src/typings.ts | 1 + src/util/metadataServerSettings.ts | 4 +++ src/util/searchSettings.ts | 32 ------------------- 5 files changed, 15 insertions(+), 41 deletions(-) delete mode 100644 src/util/searchSettings.ts diff --git a/src/components/library/useGetVisibleLibraryMangas.ts b/src/components/library/useGetVisibleLibraryMangas.ts index f31a690efd..1a86fdbd04 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 { useSearchSettings } from '@/util/searchSettings.ts'; +import { useMetadataServerSettings } from '@/util/metadataServerSettings.ts'; const unreadFilter = (unread: NullAndUndefined, { unreadCount }: TManga): boolean => { switch (unread) { @@ -105,7 +105,7 @@ export const useGetVisibleLibraryMangas = (mangas: TManga[]) => { const [query] = useQueryParam('query', StringParam); const { options } = useLibraryOptionsContext(); const { unread, downloaded } = options; - const { settings } = useSearchSettings(); + const { settings } = useMetadataServerSettings(); const filteredMangas = useMemo( () => filterManga(mangas, query, unread, downloaded, settings.ignoreFilters), diff --git a/src/screens/settings/LibrarySettings.tsx b/src/screens/settings/LibrarySettings.tsx index c8d9c13931..6a954c879a 100644 --- a/src/screens/settings/LibrarySettings.tsx +++ b/src/screens/settings/LibrarySettings.tsx @@ -12,8 +12,7 @@ import { List, ListItem, ListItemText, Switch } from '@mui/material'; import ListSubheader from '@mui/material/ListSubheader'; import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext.tsx'; import { GlobalUpdateSettings } from '@/components/settings/globalUpdate/GlobalUpdateSettings.tsx'; -import { useSearchSettings } from '@/util/searchSettings.ts'; -import { MetadataServerSettingKeys, SearchMetadataKeys } from '@/typings.ts'; +import { MetadataServerSettingKeys, MetadataServerSettings } from '@/typings.ts'; import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata.ts'; import { makeToast } from '@/components/util/Toast.tsx'; import { useMetadataServerSettings } from '@/util/metadataServerSettings.ts'; @@ -29,11 +28,13 @@ export function LibrarySettings() { useSetDefaultBackTo('settings'); - const { metadata, settings } = useSearchSettings(); - const { settings: serverSettings } = useMetadataServerSettings(); + const { metadata, settings } = useMetadataServerSettings(); - const setSettingValue = (key: SearchMetadataKeys | MetadataServerSettingKeys, value: boolean) => { - requestUpdateServerMetadata(convertToGqlMeta(metadata)! ?? {}, [[key, value]]).catch(() => + const setSettingValue = ( + setting: Setting, + value: MetadataServerSettings[Setting], + ) => { + requestUpdateServerMetadata(convertToGqlMeta(metadata)! ?? {}, [[setting, value]]).catch(() => makeToast(t('search.error.label.failed_to_save_settings'), 'warning'), ); }; @@ -65,7 +66,7 @@ export function LibrarySettings() { /> setSettingValue('showAddToLibraryCategorySelectDialog', e.target.checked)} /> diff --git a/src/typings.ts b/src/typings.ts index e2f8c32eaa..720bb94fef 100644 --- a/src/typings.ts +++ b/src/typings.ts @@ -220,6 +220,7 @@ export type MetadataServerSettings = { // library showAddToLibraryCategorySelectDialog: boolean; + ignoreFilters: boolean; }; export interface ISearchSettings { diff --git a/src/util/metadataServerSettings.ts b/src/util/metadataServerSettings.ts index e4a160a7f3..86e532fc88 100644 --- a/src/util/metadataServerSettings.ts +++ b/src/util/metadataServerSettings.ts @@ -11,10 +11,14 @@ import { requestManager } from '@/lib/requests/RequestManager.ts'; import { convertFromGqlMeta, getMetadataFrom } from '@/util/metadata'; export const getDefaultSettings = (): MetadataServerSettings => ({ + // downloads deleteChaptersManuallyMarkedRead: false, deleteChaptersWhileReading: 0, deleteChaptersWithBookmark: false, + + // library showAddToLibraryCategorySelectDialog: true, + ignoreFilters: false, }); const getMetadataServerSettingsWithDefaultFallback = ( diff --git a/src/util/searchSettings.ts b/src/util/searchSettings.ts deleted file mode 100644 index 046cd9de56..0000000000 --- a/src/util/searchSettings.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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 { Metadata, ISearchSettings } from '@/typings'; -import { requestManager } from '@/lib/requests/RequestManager.ts'; -import { convertFromGqlMeta, getMetadataFrom } from '@/util/metadata'; - -export const getDefaultSettings = (): ISearchSettings => ({ - ignoreFilters: false, -}); - -const getSearchSettingsWithDefaultValueFallback = ( - meta?: Metadata, - defaultSettings: ISearchSettings = getDefaultSettings(), - applyMetadataMigration: boolean = true, -): ISearchSettings => getMetadataFrom({ meta }, defaultSettings, applyMetadataMigration); -export const useSearchSettings = (): { - metadata?: Metadata; - settings: ISearchSettings; - loading: boolean; -} => { - const { data, loading } = requestManager.useGetGlobalMeta(); - const metadata = convertFromGqlMeta(data?.metas.nodes); - const settings = getSearchSettingsWithDefaultValueFallback(metadata); - - return { metadata, settings, loading }; -};
{manga.description}