make default reader settings changeable (#217)
* [#214] Move "reader settings" util functions into new file * [#214] Extract "options" of "ReaderSettings" to new component * [#214] Add component for changing the default reader settings * [#214] Add default "ReaderSettings" to "Settings" * [#214] Use default "ReaderSettings" stored on the server Wait for both "manga" and "defaultSettings" to be loaded. Otherwise, by the time the "manga" response was received, the "defaultSettings" might be still loading and thus, the local fallback "default" settings will get used as the "default settings" * [#214] Save and update "ReaderSettings" options in case they are missing - Manga gets read the first time => save settings in metadata - Default settings get opened the first time => save settings in global metadata
This commit is contained in:
89
src/util/readerSettings.ts
Normal file
89
src/util/readerSettings.ts
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* 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 { getMetadataFrom, requestUpdateMangaMetadata, requestUpdateServerMetadata } from 'util/metadata';
|
||||
import { useQuery } from './client';
|
||||
|
||||
export const getDefaultSettings = (forceUndefined: boolean = false) => ({
|
||||
staticNav: forceUndefined ? undefined : false,
|
||||
showPageNumber: forceUndefined ? undefined : true,
|
||||
continuesPageGap: forceUndefined ? undefined : false,
|
||||
loadNextonEnding: forceUndefined ? undefined : false,
|
||||
readerType: forceUndefined ? undefined : 'ContinuesVertical',
|
||||
} as IReaderSettings);
|
||||
|
||||
const getReaderSettingsWithDefaultValueFallback = (
|
||||
meta?: IMetadata,
|
||||
defaultSettings?: IReaderSettings,
|
||||
): IReaderSettings => ({
|
||||
...getMetadataFrom(
|
||||
{ meta },
|
||||
Object.entries(defaultSettings ?? getDefaultSettings()) as MetadataKeyValuePair[],
|
||||
) as unknown as IReaderSettings,
|
||||
});
|
||||
|
||||
export const getReaderSettingsFromMetadata = (
|
||||
meta?: IMetadata,
|
||||
defaultSettings?: IReaderSettings,
|
||||
): IReaderSettings => ({
|
||||
...getReaderSettingsWithDefaultValueFallback(meta, defaultSettings),
|
||||
});
|
||||
|
||||
export const getReaderSettingsFor = (
|
||||
{ meta }: IMetadataHolder,
|
||||
defaultSettings?: IReaderSettings,
|
||||
): IReaderSettings => getReaderSettingsFromMetadata(meta, defaultSettings);
|
||||
|
||||
export const useDefaultReaderSettings = (): {
|
||||
metadata?: IMetadata,
|
||||
settings: IReaderSettings,
|
||||
loading: boolean
|
||||
} => {
|
||||
const { data: meta, loading } = useQuery<IMetadata>('/api/v1/meta');
|
||||
const settings = getReaderSettingsWithDefaultValueFallback(meta);
|
||||
|
||||
return { metadata: meta, settings, loading };
|
||||
};
|
||||
|
||||
/**
|
||||
* Saves all missing reader settings from the metadata to the server
|
||||
*
|
||||
* @param metadataHolder
|
||||
* @param metadataHolderType
|
||||
* @param defaultSettings
|
||||
*/
|
||||
export const checkAndHandleMissingStoredReaderSettings = async (
|
||||
metadataHolder: IManga | IMetadataHolder,
|
||||
metadataHolderType: 'manga' | 'server',
|
||||
defaultSettings: IReaderSettings,
|
||||
): Promise<void | void[]> => {
|
||||
const meta = metadataHolder.meta ?? metadataHolder as IMetadata;
|
||||
const settingsToCheck = getReaderSettingsFor({ meta }, getDefaultSettings(true));
|
||||
const newSettings = getReaderSettingsFor({ meta }, defaultSettings);
|
||||
|
||||
const undefinedSettings = Object.entries(settingsToCheck)
|
||||
.filter((setting) => setting[1] === undefined);
|
||||
|
||||
const settingsToUpdate: MetadataKeyValuePair[] = [];
|
||||
undefinedSettings.forEach((setting) => {
|
||||
const key = setting[0] as keyof IReaderSettings;
|
||||
|
||||
settingsToUpdate.push([key, newSettings[key]]);
|
||||
});
|
||||
|
||||
if (!undefinedSettings.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (metadataHolderType === 'manga') {
|
||||
await requestUpdateMangaMetadata(metadataHolder as IManga, settingsToUpdate);
|
||||
return;
|
||||
}
|
||||
|
||||
await requestUpdateServerMetadata(meta, settingsToUpdate);
|
||||
};
|
||||
Reference in New Issue
Block a user