Feature/cleanup metadata related logic (#657)
* Remove unnecessary parameter from "requestUpdateServerMetadata" * Streamline updating metadata server settings * Move metadata related logic
This commit is contained in:
@@ -19,13 +19,13 @@ import FormGroup from '@mui/material/FormGroup';
|
|||||||
import { CheckboxInput } from '@/components/atoms/CheckboxInput.tsx';
|
import { CheckboxInput } from '@/components/atoms/CheckboxInput.tsx';
|
||||||
import { Mangas, MigrateMode } from '@/lib/data/Mangas.ts';
|
import { Mangas, MigrateMode } from '@/lib/data/Mangas.ts';
|
||||||
import { makeToast } from '@/components/util/Toast.tsx';
|
import { makeToast } from '@/components/util/Toast.tsx';
|
||||||
import { convertSettingsToMetadata, useMetadataServerSettings } from '@/util/metadataServerSettings.ts';
|
import {
|
||||||
import { MetadataServerSettings } from '@/typings.ts';
|
createUpdateMetadataServerSettings,
|
||||||
import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata.ts';
|
useMetadataServerSettings,
|
||||||
|
} from '@/lib/metadata/metadataServerSettings.ts';
|
||||||
|
import { MetadataMigrationSettings } from '@/typings.ts';
|
||||||
import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts';
|
import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts';
|
||||||
|
|
||||||
type MigrationSettingsType = Pick<MetadataServerSettings, 'includeChapters' | 'includeCategories' | 'deleteChapters'>;
|
|
||||||
|
|
||||||
export const MigrateDialog = ({ mangaIdToMigrateTo, onClose }: { mangaIdToMigrateTo: number; onClose: () => void }) => {
|
export const MigrateDialog = ({ mangaIdToMigrateTo, onClose }: { mangaIdToMigrateTo: number; onClose: () => void }) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
@@ -35,20 +35,14 @@ export const MigrateDialog = ({ mangaIdToMigrateTo, onClose }: { mangaIdToMigrat
|
|||||||
const mangaId = Number(mangaIdAsString);
|
const mangaId = Number(mangaIdAsString);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
metadata,
|
|
||||||
settings: { includeChapters, includeCategories, deleteChapters },
|
settings: { includeChapters, includeCategories, deleteChapters },
|
||||||
} = useMetadataServerSettings();
|
} = useMetadataServerSettings();
|
||||||
|
|
||||||
const [isMigrationInProcess, setIsMigrationInProcess] = useState(false);
|
const [isMigrationInProcess, setIsMigrationInProcess] = useState(false);
|
||||||
|
|
||||||
const setMigrationFlag = <Setting extends keyof MigrationSettingsType>(
|
const setMigrationFlag = createUpdateMetadataServerSettings<keyof MetadataMigrationSettings>(
|
||||||
setting: Setting,
|
defaultPromiseErrorHandler('MigrateDialog::updateSetting'),
|
||||||
value: MigrationSettingsType[Setting],
|
);
|
||||||
) => {
|
|
||||||
requestUpdateServerMetadata(convertToGqlMeta(metadata) ?? [], [
|
|
||||||
[setting, convertSettingsToMetadata({ [setting]: value })[setting]],
|
|
||||||
]).catch(defaultPromiseErrorHandler('MigrateDialog::updateSetting'));
|
|
||||||
};
|
|
||||||
|
|
||||||
const migrate = async (mode: MigrateMode) => {
|
const migrate = async (mode: MigrateMode) => {
|
||||||
if (mangaId == null) {
|
if (mangaId == null) {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import { StringParam, useQueryParam } from 'use-query-params';
|
|||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
import { LibrarySortMode, NullAndUndefined, TManga } from '@/typings.ts';
|
import { LibrarySortMode, NullAndUndefined, TManga } from '@/typings.ts';
|
||||||
import { useLibraryOptionsContext } from '@/components/context/LibraryOptionsContext.tsx';
|
import { useLibraryOptionsContext } from '@/components/context/LibraryOptionsContext.tsx';
|
||||||
import { useMetadataServerSettings } from '@/util/metadataServerSettings.ts';
|
import { useMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts';
|
||||||
|
|
||||||
const unreadFilter = (unread: NullAndUndefined<boolean>, { unreadCount }: TManga): boolean => {
|
const unreadFilter = (unread: NullAndUndefined<boolean>, { unreadCount }: TManga): boolean => {
|
||||||
switch (unread) {
|
switch (unread) {
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import Button from '@mui/material/Button';
|
|||||||
import { ISource, TManga } from '@/typings';
|
import { ISource, TManga } from '@/typings';
|
||||||
import { requestManager } from '@/lib/requests/RequestManager.ts';
|
import { requestManager } from '@/lib/requests/RequestManager.ts';
|
||||||
import { makeToast } from '@/components/util/Toast';
|
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 { CategorySelect } from '@/components/navbar/action/CategorySelect.tsx';
|
||||||
import { Mangas } from '@/lib/data/Mangas.ts';
|
import { Mangas } from '@/lib/data/Mangas.ts';
|
||||||
import { SpinnerImage } from '@/components/util/SpinnerImage.tsx';
|
import { SpinnerImage } from '@/components/util/SpinnerImage.tsx';
|
||||||
|
|||||||
@@ -22,10 +22,9 @@ import { useSelectableCollection } from '@/components/collection/useSelectableCo
|
|||||||
import { ThreeStateCheckboxInput } from '@/components/atoms/ThreeStateCheckboxInput.tsx';
|
import { ThreeStateCheckboxInput } from '@/components/atoms/ThreeStateCheckboxInput.tsx';
|
||||||
import { Categories } from '@/lib/data/Categories.ts';
|
import { Categories } from '@/lib/data/Categories.ts';
|
||||||
import { CheckboxInput } from '@/components/atoms/CheckboxInput.tsx';
|
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 { makeToast } from '@/components/util/Toast.tsx';
|
||||||
import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts';
|
import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts';
|
||||||
|
import { updateMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts';
|
||||||
|
|
||||||
type BaseProps = {
|
type BaseProps = {
|
||||||
open: boolean;
|
open: boolean;
|
||||||
@@ -87,7 +86,6 @@ export function CategorySelect(props: Props) {
|
|||||||
const mangaIds = passedMangaIds ?? [mangaId];
|
const mangaIds = passedMangaIds ?? [mangaId];
|
||||||
|
|
||||||
const [doNotShowAddToLibraryDialogAgain, setDoNotShowAddToLibraryDialogAgain] = useState(false);
|
const [doNotShowAddToLibraryDialogAgain, setDoNotShowAddToLibraryDialogAgain] = useState(false);
|
||||||
const { metadata: serverMetadata } = useMetadataServerSettings();
|
|
||||||
|
|
||||||
const mangaCategoryIds = useGetMangaCategoryIds(mangaId);
|
const mangaCategoryIds = useGetMangaCategoryIds(mangaId);
|
||||||
const { data } = requestManager.useGetCategories();
|
const { data } = requestManager.useGetCategories();
|
||||||
@@ -136,9 +134,9 @@ export function CategorySelect(props: Props) {
|
|||||||
onClose(true, addToCategories, removeFromCategories);
|
onClose(true, addToCategories, removeFromCategories);
|
||||||
|
|
||||||
if (doNotShowAddToLibraryDialogAgain) {
|
if (doNotShowAddToLibraryDialogAgain) {
|
||||||
requestUpdateServerMetadata(convertToGqlMeta(serverMetadata)! ?? {}, [
|
updateMetadataServerSettings('showAddToLibraryCategorySelectDialog', false).catch(() =>
|
||||||
['showAddToLibraryCategorySelectDialog', false],
|
makeToast(t('search.error.label.failed_to_save_settings'), 'error'),
|
||||||
]).catch(() => makeToast(t('search.error.label.failed_to_save_settings'), 'error'));
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const isUpdateRequired = !!addToCategories.length || !!removeFromCategories.length;
|
const isUpdateRequired = !!addToCategories.length || !!removeFromCategories.length;
|
||||||
|
|||||||
@@ -9,9 +9,8 @@
|
|||||||
import { List, ListItem, ListItemText, MenuItem, Select } from '@mui/material';
|
import { List, ListItem, ListItemText, MenuItem, Select } from '@mui/material';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { useContext, useEffect } from 'react';
|
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 { MetadataServerSettingKeys, MetadataServerSettings } from '@/typings.ts';
|
||||||
import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata.ts';
|
|
||||||
import { makeToast } from '@/components/util/Toast.tsx';
|
import { makeToast } from '@/components/util/Toast.tsx';
|
||||||
import { MutableListSetting } from '@/components/settings/MutableListSetting.tsx';
|
import { MutableListSetting } from '@/components/settings/MutableListSetting.tsx';
|
||||||
import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext.tsx';
|
import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext.tsx';
|
||||||
@@ -53,9 +52,9 @@ export const DeviceSetting = () => {
|
|||||||
setActiveDevice(DEFAULT_DEVICE);
|
setActiveDevice(DEFAULT_DEVICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
requestUpdateServerMetadata(convertToGqlMeta(metadata) ?? [], [
|
updateMetadataServerSettings(setting, value).catch(() =>
|
||||||
[setting, convertSettingsToMetadata({ [setting]: value })[setting]],
|
makeToast(t('global.error.label.failed_to_save_changes'), 'error'),
|
||||||
]).catch(() => makeToast(t('global.error.label.failed_to_save_changes'), 'error'));
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -10,9 +10,8 @@ import { useTranslation } from 'react-i18next';
|
|||||||
import { List, ListItem, ListItemText, Switch } from '@mui/material';
|
import { List, ListItem, ListItemText, Switch } from '@mui/material';
|
||||||
import { NumberSetting } from '@/components/settings/NumberSetting.tsx';
|
import { NumberSetting } from '@/components/settings/NumberSetting.tsx';
|
||||||
import { getPersistedServerSetting, usePersistedValue } from '@/util/usePersistedValue.tsx';
|
import { getPersistedServerSetting, usePersistedValue } from '@/util/usePersistedValue.tsx';
|
||||||
import { useMetadataServerSettings } from '@/util/metadataServerSettings.ts';
|
import { updateMetadataServerSettings, useMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts';
|
||||||
import { MetadataServerSettings } from '@/typings.ts';
|
import { MetadataDownloadSettings } from '@/typings.ts';
|
||||||
import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata.ts';
|
|
||||||
import { makeToast } from '@/components/util/Toast.tsx';
|
import { makeToast } from '@/components/util/Toast.tsx';
|
||||||
|
|
||||||
const MIN_LIMIT = 2;
|
const MIN_LIMIT = 2;
|
||||||
@@ -23,7 +22,6 @@ export const DownloadAheadSetting = () => {
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const {
|
const {
|
||||||
metadata,
|
|
||||||
settings: { downloadAheadLimit },
|
settings: { downloadAheadLimit },
|
||||||
} = useMetadataServerSettings();
|
} = useMetadataServerSettings();
|
||||||
|
|
||||||
@@ -35,9 +33,9 @@ export const DownloadAheadSetting = () => {
|
|||||||
getPersistedServerSetting,
|
getPersistedServerSetting,
|
||||||
);
|
);
|
||||||
|
|
||||||
const updateSetting = (value: MetadataServerSettings['downloadAheadLimit']) => {
|
const updateSetting = (value: MetadataDownloadSettings['downloadAheadLimit']) => {
|
||||||
persistDownloadAheadLimit(value === 0 ? currentDownloadAheadLimit : value);
|
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'),
|
makeToast(t('search.error.label.failed_to_save_settings'), 'warning'),
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import { DocumentNode } from '@apollo/client';
|
|||||||
import { ChapterOffset, TChapter, TranslationKey } from '@/typings.ts';
|
import { ChapterOffset, TChapter, TranslationKey } from '@/typings.ts';
|
||||||
import { makeToast } from '@/components/util/Toast.tsx';
|
import { makeToast } from '@/components/util/Toast.tsx';
|
||||||
import { requestManager } from '@/lib/requests/RequestManager.ts';
|
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';
|
import { FULL_CHAPTER_FIELDS } from '@/lib/graphql/Fragments.ts';
|
||||||
|
|
||||||
export type ChapterAction = 'download' | 'delete' | 'bookmark' | 'unbookmark' | 'mark_as_read' | 'mark_as_unread';
|
export type ChapterAction = 'download' | 'delete' | 'bookmark' | 'unbookmark' | 'mark_as_read' | 'mark_as_unread';
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import {
|
|||||||
} from '@/lib/graphql/generated/graphql.ts';
|
} from '@/lib/graphql/generated/graphql.ts';
|
||||||
import { Chapters } from '@/lib/data/Chapters.ts';
|
import { Chapters } from '@/lib/data/Chapters.ts';
|
||||||
import { makeToast } from '@/components/util/Toast.tsx';
|
import { makeToast } from '@/components/util/Toast.tsx';
|
||||||
import { getMetadataServerSettings } from '@/util/metadataServerSettings.ts';
|
import { getMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts';
|
||||||
|
|
||||||
export type MangaAction =
|
export type MangaAction =
|
||||||
| 'download'
|
| 'download'
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import {
|
|||||||
TCategory,
|
TCategory,
|
||||||
TChapter,
|
TChapter,
|
||||||
TManga,
|
TManga,
|
||||||
} from '@/typings';
|
} from '@/typings.ts';
|
||||||
import { requestManager } from '@/lib/requests/RequestManager.ts';
|
import { requestManager } from '@/lib/requests/RequestManager.ts';
|
||||||
import { MetaType } from '@/lib/graphql/generated/graphql.ts';
|
import { MetaType } from '@/lib/graphql/generated/graphql.ts';
|
||||||
import { DEFAULT_DEVICE, getActiveDevice } from '@/util/device.ts';
|
import { DEFAULT_DEVICE, getActiveDevice } from '@/util/device.ts';
|
||||||
@@ -372,10 +372,8 @@ export const requestUpdateMetadata = async (
|
|||||||
): Promise<void[]> =>
|
): Promise<void[]> =>
|
||||||
Promise.all(keysToValues.map(([key, value]) => requestUpdateMetadataValue(metadataHolder, holderType, key, value)));
|
Promise.all(keysToValues.map(([key, value]) => requestUpdateMetadataValue(metadataHolder, holderType, key, value)));
|
||||||
|
|
||||||
export const requestUpdateServerMetadata = async (
|
export const requestUpdateServerMetadata = async (keysToValues: MetadataKeyValuePair[]): Promise<void[]> =>
|
||||||
serverMetadata: MetaType[],
|
requestUpdateMetadata({}, 'global', keysToValues);
|
||||||
keysToValues: MetadataKeyValuePair[],
|
|
||||||
): Promise<void[]> => requestUpdateMetadata({ meta: serverMetadata }, 'global', keysToValues);
|
|
||||||
|
|
||||||
export const requestUpdateMangaMetadata = async (
|
export const requestUpdateMangaMetadata = async (
|
||||||
manga: TManga,
|
manga: TManga,
|
||||||
@@ -6,11 +6,18 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* 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 { 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 { jsonSaveParse } from '@/util/HelperFunctions.ts';
|
||||||
import { DEFAULT_DEVICE } from '@/util/device.ts';
|
import { DEFAULT_DEVICE } from '@/util/device.ts';
|
||||||
|
import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts';
|
||||||
|
|
||||||
export const getDefaultSettings = (): MetadataServerSettings => ({
|
export const getDefaultSettings = (): MetadataServerSettings => ({
|
||||||
// downloads
|
// downloads
|
||||||
@@ -79,3 +86,19 @@ export const getMetadataServerSettings = async (): Promise<MetadataServerSetting
|
|||||||
const metadata = convertFromGqlMeta(data?.metas.nodes);
|
const metadata = convertFromGqlMeta(data?.metas.nodes);
|
||||||
return getMetadataServerSettingsWithDefaultFallback(metadata);
|
return getMetadataServerSettingsWithDefaultFallback(metadata);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const updateMetadataServerSettings = async <
|
||||||
|
Settings extends MetadataServerSettingKeys = MetadataServerSettingKeys,
|
||||||
|
Setting extends Settings = Settings,
|
||||||
|
>(
|
||||||
|
setting: Setting,
|
||||||
|
value: MetadataServerSettings[Setting],
|
||||||
|
): Promise<void[]> =>
|
||||||
|
requestUpdateServerMetadata([[setting, convertSettingsToMetadata({ [setting]: value })[setting]]]);
|
||||||
|
|
||||||
|
export const createUpdateMetadataServerSettings =
|
||||||
|
<Settings extends MetadataServerSettingKeys>(
|
||||||
|
handleError: (error: any) => void = defaultPromiseErrorHandler('createUpdateMetadataServerSettings'),
|
||||||
|
): ((...args: Parameters<typeof updateMetadataServerSettings<Settings>>) => Promise<void | void[]>) =>
|
||||||
|
(setting, value) =>
|
||||||
|
updateMetadataServerSettings(setting, value).catch(handleError);
|
||||||
@@ -6,14 +6,14 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* 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 { requestManager } from '@/lib/requests/RequestManager.ts';
|
||||||
import {
|
import {
|
||||||
convertFromGqlMeta,
|
convertFromGqlMeta,
|
||||||
getMetadataFrom,
|
getMetadataFrom,
|
||||||
requestUpdateMangaMetadata,
|
requestUpdateMangaMetadata,
|
||||||
requestUpdateServerMetadata,
|
requestUpdateServerMetadata,
|
||||||
} from '@/util/metadata';
|
} from '@/lib/metadata/metadata.ts';
|
||||||
import { MetaType } from '@/lib/graphql/generated/graphql.ts';
|
import { MetaType } from '@/lib/graphql/generated/graphql.ts';
|
||||||
|
|
||||||
type UndefinedReaderSettings = {
|
type UndefinedReaderSettings = {
|
||||||
@@ -111,5 +111,5 @@ export const checkAndHandleMissingStoredReaderSettings = async (
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await requestUpdateServerMetadata(metadataHolder as MetaType[], settingsToUpdate);
|
await requestUpdateServerMetadata(settingsToUpdate);
|
||||||
};
|
};
|
||||||
@@ -17,8 +17,8 @@ import {
|
|||||||
checkAndHandleMissingStoredReaderSettings,
|
checkAndHandleMissingStoredReaderSettings,
|
||||||
getReaderSettingsFor,
|
getReaderSettingsFor,
|
||||||
useDefaultReaderSettings,
|
useDefaultReaderSettings,
|
||||||
} from '@/util/readerSettings';
|
} from '@/lib/metadata/readerSettings.ts';
|
||||||
import { requestUpdateMangaMetadata } from '@/util/metadata';
|
import { requestUpdateMangaMetadata } from '@/lib/metadata/metadata.ts';
|
||||||
import { HorizontalPager } from '@/components/reader/pager/HorizontalPager';
|
import { HorizontalPager } from '@/components/reader/pager/HorizontalPager';
|
||||||
import { PageNumber } from '@/components/reader/PageNumber';
|
import { PageNumber } from '@/components/reader/PageNumber';
|
||||||
import { PagedPager } from '@/components/reader/pager/PagedPager';
|
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 { NavBarContext } from '@/components/context/NavbarContext.tsx';
|
||||||
import { useDebounce } from '@/util/useDebounce.ts';
|
import { useDebounce } from '@/util/useDebounce.ts';
|
||||||
import { UpdateChapterPatchInput } from '@/lib/graphql/generated/graphql.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 { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts';
|
||||||
import { Chapters } from '@/lib/data/Chapters.ts';
|
import { Chapters } from '@/lib/data/Chapters.ts';
|
||||||
|
|
||||||
|
|||||||
@@ -11,12 +11,12 @@ import { Box } from '@mui/material';
|
|||||||
import CircularProgress from '@mui/material/CircularProgress';
|
import CircularProgress from '@mui/material/CircularProgress';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { AllowedMetadataValueTypes, IReaderSettings } from '@/typings';
|
import { AllowedMetadataValueTypes, IReaderSettings } from '@/typings';
|
||||||
import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata';
|
import { convertToGqlMeta, requestUpdateServerMetadata } from '@/lib/metadata/metadata.ts';
|
||||||
import {
|
import {
|
||||||
checkAndHandleMissingStoredReaderSettings,
|
checkAndHandleMissingStoredReaderSettings,
|
||||||
getDefaultSettings,
|
getDefaultSettings,
|
||||||
useDefaultReaderSettings,
|
useDefaultReaderSettings,
|
||||||
} from '@/util/readerSettings';
|
} from '@/lib/metadata/readerSettings.ts';
|
||||||
import { ReaderSettingsOptions } from '@/components/reader/ReaderSettingsOptions';
|
import { ReaderSettingsOptions } from '@/components/reader/ReaderSettingsOptions';
|
||||||
import { makeToast } from '@/components/util/Toast';
|
import { makeToast } from '@/components/util/Toast';
|
||||||
import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext';
|
import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext';
|
||||||
@@ -40,7 +40,7 @@ export function DefaultReaderSettings() {
|
|||||||
useSetDefaultBackTo('settings');
|
useSetDefaultBackTo('settings');
|
||||||
|
|
||||||
const setSettingValue = (key: keyof IReaderSettings, value: AllowedMetadataValueTypes) => {
|
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'),
|
makeToast(t('reader.settings.error.label.failed_to_save_settings'), 'warning'),
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -13,11 +13,13 @@ import { ListItem, ListItemText, Switch } from '@mui/material';
|
|||||||
import ListSubheader from '@mui/material/ListSubheader';
|
import ListSubheader from '@mui/material/ListSubheader';
|
||||||
import { TextSetting } from '@/components/settings/text/TextSetting.tsx';
|
import { TextSetting } from '@/components/settings/text/TextSetting.tsx';
|
||||||
import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext.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 { requestManager } from '@/lib/requests/RequestManager.ts';
|
||||||
import { DownloadAheadSetting } from '@/components/settings/downloads/DownloadAheadSetting.tsx';
|
import { DownloadAheadSetting } from '@/components/settings/downloads/DownloadAheadSetting.tsx';
|
||||||
import { convertSettingsToMetadata, useMetadataServerSettings } from '@/util/metadataServerSettings.ts';
|
import {
|
||||||
import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata.ts';
|
createUpdateMetadataServerSettings,
|
||||||
|
useMetadataServerSettings,
|
||||||
|
} from '@/lib/metadata/metadataServerSettings.ts';
|
||||||
import { makeToast } from '@/components/util/Toast.tsx';
|
import { makeToast } from '@/components/util/Toast.tsx';
|
||||||
import { DeleteChaptersWhileReadingSetting } from '@/components/settings/downloads/DeleteChaptersWhileReadingSetting.tsx';
|
import { DeleteChaptersWhileReadingSetting } from '@/components/settings/downloads/DeleteChaptersWhileReadingSetting.tsx';
|
||||||
import { CategoriesInclusionSetting } from '@/components/settings/CategoriesInclusionSetting.tsx';
|
import { CategoriesInclusionSetting } from '@/components/settings/CategoriesInclusionSetting.tsx';
|
||||||
@@ -59,7 +61,7 @@ export const DownloadSettings = () => {
|
|||||||
const { data } = requestManager.useGetServerSettings();
|
const { data } = requestManager.useGetServerSettings();
|
||||||
const downloadSettings = data ? extractDownloadSettings(data.settings) : undefined;
|
const downloadSettings = data ? extractDownloadSettings(data.settings) : undefined;
|
||||||
const [mutateSettings] = requestManager.useUpdateServerSettings();
|
const [mutateSettings] = requestManager.useUpdateServerSettings();
|
||||||
const { metadata, settings: metadataSettings } = useMetadataServerSettings();
|
const { settings: metadataSettings } = useMetadataServerSettings();
|
||||||
|
|
||||||
const updateSetting = <Setting extends keyof DownloadSettingsType>(
|
const updateSetting = <Setting extends keyof DownloadSettingsType>(
|
||||||
setting: Setting,
|
setting: Setting,
|
||||||
@@ -70,18 +72,9 @@ export const DownloadSettings = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const updateMetadataSetting = <Setting extends MetadataServerSettingKeys>(
|
const updateMetadataSetting = createUpdateMetadataServerSettings<keyof MetadataDownloadSettings>(() =>
|
||||||
setting: Setting,
|
makeToast(t('global.error.label.failed_to_save_changes'), 'error'),
|
||||||
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'));
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<List>
|
<List>
|
||||||
|
|||||||
@@ -13,10 +13,12 @@ import ListSubheader from '@mui/material/ListSubheader';
|
|||||||
import { t as translate } from 'i18next';
|
import { t as translate } from 'i18next';
|
||||||
import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext.tsx';
|
import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext.tsx';
|
||||||
import { GlobalUpdateSettings } from '@/components/settings/globalUpdate/GlobalUpdateSettings.tsx';
|
import { GlobalUpdateSettings } from '@/components/settings/globalUpdate/GlobalUpdateSettings.tsx';
|
||||||
import { MetadataServerSettingKeys, MetadataServerSettings } from '@/typings.ts';
|
import { MetadataLibrarySettings } from '@/typings.ts';
|
||||||
import { convertToGqlMeta, requestUpdateServerMetadata } from '@/util/metadata.ts';
|
|
||||||
import { makeToast } from '@/components/util/Toast.tsx';
|
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 { requestManager } from '@/lib/requests/RequestManager.ts';
|
||||||
import { Mangas } from '@/lib/data/Mangas.ts';
|
import { Mangas } from '@/lib/data/Mangas.ts';
|
||||||
|
|
||||||
@@ -55,16 +57,11 @@ export function LibrarySettings() {
|
|||||||
|
|
||||||
useSetDefaultBackTo('settings');
|
useSetDefaultBackTo('settings');
|
||||||
|
|
||||||
const { metadata, settings } = useMetadataServerSettings();
|
const { settings } = useMetadataServerSettings();
|
||||||
|
|
||||||
const setSettingValue = <Setting extends MetadataServerSettingKeys>(
|
const setSettingValue = createUpdateMetadataServerSettings<keyof MetadataLibrarySettings>(() =>
|
||||||
setting: Setting,
|
makeToast(t('search.error.label.failed_to_save_settings'), 'warning'),
|
||||||
value: MetadataServerSettings[Setting],
|
);
|
||||||
) => {
|
|
||||||
requestUpdateServerMetadata(convertToGqlMeta(metadata)! ?? {}, [
|
|
||||||
[setting, convertSettingsToMetadata({ [setting]: value })[setting]],
|
|
||||||
]).catch(() => makeToast(t('search.error.label.failed_to_save_settings'), 'warning'));
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<List>
|
<List>
|
||||||
|
|||||||
@@ -218,27 +218,34 @@ export enum ChapterOffset {
|
|||||||
NEXT = 1,
|
NEXT = 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
export type MetadataServerSettings = {
|
export type MetadataDownloadSettings = {
|
||||||
// downloads
|
|
||||||
deleteChaptersManuallyMarkedRead: boolean;
|
deleteChaptersManuallyMarkedRead: boolean;
|
||||||
deleteChaptersWhileReading: number;
|
deleteChaptersWhileReading: number;
|
||||||
deleteChaptersWithBookmark: boolean;
|
deleteChaptersWithBookmark: boolean;
|
||||||
downloadAheadLimit: number;
|
downloadAheadLimit: number;
|
||||||
|
};
|
||||||
|
|
||||||
// library
|
export type MetadataLibrarySettings = {
|
||||||
showAddToLibraryCategorySelectDialog: boolean;
|
showAddToLibraryCategorySelectDialog: boolean;
|
||||||
ignoreFilters: boolean;
|
ignoreFilters: boolean;
|
||||||
removeMangaFromCategories: boolean;
|
removeMangaFromCategories: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
// client
|
export type MetadataClientSettings = {
|
||||||
devices: string[];
|
devices: string[];
|
||||||
|
};
|
||||||
|
|
||||||
// migration
|
export type MetadataMigrationSettings = {
|
||||||
includeChapters: boolean;
|
includeChapters: boolean;
|
||||||
includeCategories: boolean;
|
includeCategories: boolean;
|
||||||
deleteChapters: boolean;
|
deleteChapters: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type MetadataServerSettings = MetadataDownloadSettings &
|
||||||
|
MetadataLibrarySettings &
|
||||||
|
MetadataClientSettings &
|
||||||
|
MetadataMigrationSettings;
|
||||||
|
|
||||||
export interface ISearchSettings {
|
export interface ISearchSettings {
|
||||||
ignoreFilters: boolean;
|
ignoreFilters: boolean;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user