Use gql for "mangas" I - get manga

This commit is contained in:
schroda
2023-09-08 00:44:01 +02:00
parent a5b4b95bce
commit 89dc053f00
14 changed files with 170 additions and 126 deletions

View File

@@ -6,21 +6,17 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { mutate } from 'swr';
import {
AllowedMetadataValueTypes,
AppMetadataKeys,
ICategory,
IManga,
IMangaCard,
IMangaChapter,
GqlMetaHolder,
IMetadataMigration,
Metadata,
MetadataHolder,
MetadataKeyValuePair,
} from '@/typings';
import requestManager, { RequestManager } from '@/lib/requests/RequestManager.ts';
import { MetaType } from '@/lib/graphql/generated/graphql.ts';
import requestManager from '@/lib/requests/RequestManager.ts';
import { CategoryType, ChapterType, MangaType, MetaType } from '@/lib/graphql/generated/graphql.ts';
const APP_METADATA_KEY_PREFIX = 'webUI_';
@@ -118,6 +114,27 @@ const convertValueFromMetadata = <T extends AllowedMetadataValueTypes = AllowedM
return value as T;
};
export const convertFromGqlMeta = (gqlMetadata?: MetaType[]): Metadata | undefined => {
if (!gqlMetadata) {
return undefined;
}
const metadata: Metadata = {};
gqlMetadata.forEach(({ key, value }) => {
metadata[key] = value;
});
return metadata;
};
export const convertToGqlMeta = (metadata?: Metadata): MetaType[] | undefined => {
if (!metadata) {
return undefined;
}
return Object.entries(metadata).map(([key, value]) => ({ key, value }));
};
const getAppMetadataFrom = (meta: Metadata, appPrefix: string = APP_METADATA_KEY_PREFIX): Metadata => {
const appMetadata: Metadata = {};
@@ -277,6 +294,8 @@ export const getMetadataFrom = <METADATA extends Partial<Metadata<AppMetadataKey
return appMetadata;
};
// @ts-ignore
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const wrapMetadataWithMetaKey = (wrap: boolean, metadata: Metadata): MetadataHolder => {
if (wrap) {
return {
@@ -294,85 +313,54 @@ const wrapMetadataWithMetaKey = (wrap: boolean, metadata: Metadata): MetadataHol
type MetadataHolderType = 'manga' | 'chapter' | 'category' | 'global';
export const requestUpdateMetadataValue = async (
metadataHolder: MetadataHolder,
metadataHolder: GqlMetaHolder,
holderType: MetadataHolderType,
key: AppMetadataKeys,
value: AllowedMetadataValueTypes,
): Promise<void> => {
const metadataKey = getMetadataKey(key);
const mutatedMetadata = {
...metadataHolder.meta,
[metadataKey]: `${value}`,
};
let endpoint: string;
switch (holderType) {
case 'category':
endpoint = `category/${(metadataHolder as ICategory).id}/meta`;
await requestManager.setCategoryMeta((metadataHolder as ICategory).id, metadataKey, value).response;
await requestManager.setCategoryMeta((metadataHolder as CategoryType).id, metadataKey, value).response;
break;
case 'chapter':
// eslint-disable-next-line no-case-declarations
const { manga, chapter } = metadataHolder as IMangaChapter;
endpoint = `manga/${manga.id}/chapter/${chapter.index}/meta`;
await requestManager.setChapterMeta(chapter.id, metadataKey, value).response;
await requestManager.setChapterMeta((metadataHolder as ChapterType).id, metadataKey, value).response;
break;
case 'global':
endpoint = 'meta';
await requestManager.setGlobalMetadata(metadataKey, value).response;
break;
case 'manga':
endpoint = `manga/${(metadataHolder as IManga).id}/meta`;
await requestManager.setMangaMeta((metadataHolder as IManga).id, metadataKey, value).response;
await requestManager.setMangaMeta((metadataHolder as MangaType).id, metadataKey, value).response;
break;
default:
throw new Error(`requestUpdateMetadataValue: unknown holderType "${holderType}"`);
}
const urlToMutate = `${RequestManager.API_VERSION}${endpoint}`;
mutate(
urlToMutate,
{ ...metadataHolder, ...wrapMetadataWithMetaKey(holderType !== 'global', mutatedMetadata) },
{ revalidate: false },
);
};
export const requestUpdateMetadata = async (
metadataHolder: MetadataHolder,
metadataHolder: GqlMetaHolder,
holderType: MetadataHolderType,
keysToValues: [AppMetadataKeys, AllowedMetadataValueTypes][],
): Promise<void[]> =>
Promise.all(keysToValues.map(([key, value]) => requestUpdateMetadataValue(metadataHolder, holderType, key, value)));
export const requestUpdateServerMetadata = async (
serverMetadata: Metadata,
serverMetadata: MetaType[],
keysToValues: MetadataKeyValuePair[],
): Promise<void[]> => requestUpdateMetadata({ meta: serverMetadata }, 'global', keysToValues);
export const requestUpdateMangaMetadata = async (
manga: IMangaCard | IManga,
manga: MangaType,
keysToValues: MetadataKeyValuePair[],
): Promise<void[]> => requestUpdateMetadata(manga, 'manga', keysToValues);
export const requestUpdateChapterMetadata = async (
mangaChapter: IMangaChapter,
chapter: ChapterType,
keysToValues: MetadataKeyValuePair[],
): Promise<void[]> => requestUpdateMetadata(mangaChapter.chapter, 'chapter', keysToValues);
): Promise<void[]> => requestUpdateMetadata(chapter, 'chapter', keysToValues);
export const requestUpdateCategoryMetadata = async (
category: ICategory,
category: CategoryType,
keysToValues: MetadataKeyValuePair[],
): Promise<void[]> => requestUpdateMetadata(category, 'category', keysToValues);
export const convertGqlMetadata = (gqlMetadata?: MetaType[]): Metadata | undefined => {
if (!gqlMetadata) {
return undefined;
}
const metadata: Metadata = {};
gqlMetadata.forEach(({ key, value }) => {
metadata[key] = value;
});
return metadata;
};

View File

@@ -6,14 +6,15 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { IManga, Metadata, MetadataHolder, IReaderSettings, MetadataKeyValuePair } from '@/typings';
import { Metadata, IReaderSettings, MetadataKeyValuePair, GqlMetaHolder } from '@/typings';
import requestManager from '@/lib/requests/RequestManager.ts';
import {
convertGqlMetadata,
convertFromGqlMeta,
getMetadataFrom,
requestUpdateMangaMetadata,
requestUpdateServerMetadata,
} from '@/util/metadata';
import { MangaType, MetaType } from '@/lib/graphql/generated/graphql.ts';
type UndefinedReaderSettings = {
[setting in keyof IReaderSettings]: IReaderSettings[setting] | undefined;
@@ -42,10 +43,10 @@ export const getReaderSettingsFromMetadata = (
): IReaderSettings => getReaderSettingsWithDefaultValueFallback(meta, defaultSettings, applyMetadataMigration);
export const getReaderSettingsFor = (
{ meta }: MetadataHolder,
{ meta }: GqlMetaHolder = {},
defaultSettings?: IReaderSettings,
applyMetadataMigration?: boolean,
): IReaderSettings => getReaderSettingsFromMetadata(meta, defaultSettings, applyMetadataMigration);
): IReaderSettings => getReaderSettingsFromMetadata(convertFromGqlMeta(meta), defaultSettings, applyMetadataMigration);
export const useDefaultReaderSettings = (): {
metadata?: Metadata;
@@ -53,7 +54,7 @@ export const useDefaultReaderSettings = (): {
loading: boolean;
} => {
const { data, loading } = requestManager.useGetGlobalMeta();
const metadata = convertGqlMetadata(data?.metas.nodes);
const metadata = convertFromGqlMeta(data?.metas.nodes);
const settings = getReaderSettingsWithDefaultValueFallback<IReaderSettings>(metadata);
return { metadata, settings, loading };
@@ -67,11 +68,12 @@ export const useDefaultReaderSettings = (): {
* @param defaultSettings
*/
export const checkAndHandleMissingStoredReaderSettings = async (
metadataHolder: IManga | MetadataHolder,
metadataHolder: Required<GqlMetaHolder> | MetaType[],
metadataHolderType: 'manga' | 'server',
defaultSettings: IReaderSettings,
): Promise<void | void[]> => {
const meta = metadataHolder.meta ?? (metadataHolder as Metadata);
const getMeta = () => (Array.isArray(metadataHolder) ? metadataHolder : metadataHolder.meta);
const meta = convertFromGqlMeta(getMeta())!;
const settingsToCheck = getReaderSettingsWithDefaultValueFallback(
meta,
{
@@ -85,7 +87,7 @@ export const checkAndHandleMissingStoredReaderSettings = async (
},
false,
);
const newSettings = getReaderSettingsFor({ meta }, defaultSettings);
const newSettings = getReaderSettingsFor({ meta: getMeta() }, defaultSettings);
const undefinedSettings = Object.entries(settingsToCheck).filter((setting) => setting[1] === undefined);
@@ -101,9 +103,9 @@ export const checkAndHandleMissingStoredReaderSettings = async (
}
if (metadataHolderType === 'manga') {
await requestUpdateMangaMetadata(metadataHolder as IManga, settingsToUpdate);
await requestUpdateMangaMetadata(metadataHolder as MangaType, settingsToUpdate);
return;
}
await requestUpdateServerMetadata(meta, settingsToUpdate);
await requestUpdateServerMetadata(metadataHolder as MetaType[], settingsToUpdate);
};

View File

@@ -8,7 +8,7 @@
import { Metadata, ISearchSettings } from '@/typings';
import requestManager from '@/lib/requests/RequestManager.ts';
import { convertGqlMetadata, getMetadataFrom } from '@/util/metadata';
import { convertFromGqlMeta, getMetadataFrom } from '@/util/metadata';
export const getDefaultSettings = (): ISearchSettings => ({
ignoreFilters: false,
@@ -25,7 +25,7 @@ export const useSearchSettings = (): {
loading: boolean;
} => {
const { data, loading } = requestManager.useGetGlobalMeta();
const metadata = convertGqlMetadata(data?.metas.nodes);
const metadata = convertFromGqlMeta(data?.metas.nodes);
const settings = getSearchSettingsWithDefaultValueFallback(metadata);
return { metadata, settings, loading };