From 49b0522b1fb2d2e0de6778510c17ebca28380451 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Sat, 25 Mar 2023 16:31:31 +0100 Subject: [PATCH 1/3] Improve metadata typing --- src/typings.ts | 12 ++++++------ src/util/metadata.ts | 27 ++++++++++++++++----------- src/util/readerSettings.ts | 8 ++------ src/util/searchSettings.ts | 10 +++------- 4 files changed, 27 insertions(+), 30 deletions(-) diff --git a/src/typings.ts b/src/typings.ts index 20a3b03ffb..3b52abd7b6 100644 --- a/src/typings.ts +++ b/src/typings.ts @@ -74,13 +74,13 @@ export interface IMetadataMigration { keys?: { oldKey: string; newKey: string }[]; } -export interface IMetadata { - [key: string]: VALUES; -} +export type IMetadata = { + [key in Keys]: Values; +}; -export interface IMetadataHolder { - meta?: IMetadata; -} +export type IMetadataHolder = { + meta?: IMetadata; +}; export type AllowedMetadataValueTypes = string | boolean | number | undefined; diff --git a/src/util/metadata.ts b/src/util/metadata.ts index e1beff1b34..18f8823f83 100644 --- a/src/util/metadata.ts +++ b/src/util/metadata.ts @@ -246,12 +246,12 @@ const applyMetadataMigrations = (meta?: IMetadata): IMetadata | undefined => { return migrationToMetadata.pop()![1]; }; -export const getMetadataValueFrom = ( +export const getMetadataValueFrom = ( { meta }: IMetadataHolder, - key: AppMetadataKeys, - defaultValue?: T, + key: Key, + defaultValue?: Value, applyMigrations: boolean = true, -): T | undefined => { +): Value | undefined => { const metadata = applyMigrations ? applyMetadataMigrations(meta) : meta; if (metadata === undefined || !doesMetadataKeyExistIn(metadata, key)) { @@ -261,15 +261,20 @@ export const getMetadataValueFrom = >>( { meta }: IMetadataHolder, - keysToDefaultValues: MetadataKeyValuePair[], + metadataWithDefaultValues: Metadata, applyMigrations?: boolean, -): IMetadata => { - const appMetadata: IMetadata = {}; - - keysToDefaultValues.forEach(([key, defaultValue]) => { - appMetadata[key] = getMetadataValueFrom({ meta }, key, defaultValue, applyMigrations); +): Metadata => { + const appMetadata = {} as Metadata; + + Object.entries(metadataWithDefaultValues).forEach(([key, defaultValue]) => { + appMetadata[key as AppMetadataKeys] = getMetadataValueFrom( + { meta }, + key as AppMetadataKeys, + defaultValue, + applyMigrations, + ); }); return appMetadata; diff --git a/src/util/readerSettings.ts b/src/util/readerSettings.ts index e6cae1d294..68b8b58c76 100644 --- a/src/util/readerSettings.ts +++ b/src/util/readerSettings.ts @@ -22,14 +22,10 @@ export const getDefaultSettings = (forceUndefined: boolean = false) => const getReaderSettingsWithDefaultValueFallback = ( meta?: IMetadata, - defaultSettings?: IReaderSettings, + defaultSettings: IReaderSettings = getDefaultSettings(), applyMetadataMigration: boolean = true, ): IReaderSettings => ({ - ...(getMetadataFrom( - { meta }, - Object.entries(defaultSettings ?? getDefaultSettings()) as MetadataKeyValuePair[], - applyMetadataMigration, - ) as unknown as IReaderSettings), + ...getMetadataFrom({ meta }, defaultSettings, applyMetadataMigration), }); export const getReaderSettingsFromMetadata = ( diff --git a/src/util/searchSettings.ts b/src/util/searchSettings.ts index 73fd789e08..c5482deb74 100644 --- a/src/util/searchSettings.ts +++ b/src/util/searchSettings.ts @@ -1,6 +1,6 @@ import { useQuery } from 'util/client'; import { getMetadataFrom } from 'util/metadata'; -import { IMetadata, ISearchSettings, MetadataKeyValuePair } from 'typings'; +import { IMetadata, ISearchSettings } from 'typings'; export const getDefaultSettings = () => ({ @@ -9,14 +9,10 @@ export const getDefaultSettings = () => const getSearchSettingsWithDefaultValueFallback = ( meta?: IMetadata, - defaultSettings?: ISearchSettings, + defaultSettings: ISearchSettings = getDefaultSettings(), applyMetadataMigration: boolean = true, ): ISearchSettings => ({ - ...(getMetadataFrom( - { meta }, - Object.entries(defaultSettings ?? getDefaultSettings()) as MetadataKeyValuePair[], - applyMetadataMigration, - ) as unknown as ISearchSettings), + ...getMetadataFrom({ meta }, defaultSettings, applyMetadataMigration), }); export const useSearchSettings = (): { From 5407325806e698ae9a95c91519cedb3ae8148ba0 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Sat, 22 Apr 2023 00:15:52 +0200 Subject: [PATCH 2/3] Rename types Still included the "I" prefix for interfaces --- src/typings.ts | 14 +++++------ src/util/metadata.ts | 50 ++++++++++++++++++-------------------- src/util/readerSettings.ts | 16 ++++++------ src/util/searchSettings.ts | 8 +++--- 4 files changed, 42 insertions(+), 46 deletions(-) diff --git a/src/typings.ts b/src/typings.ts index 3b52abd7b6..02eb2bec61 100644 --- a/src/typings.ts +++ b/src/typings.ts @@ -74,12 +74,12 @@ export interface IMetadataMigration { keys?: { oldKey: string; newKey: string }[]; } -export type IMetadata = { +export type Metadata = { [key in Keys]: Values; }; -export type IMetadataHolder = { - meta?: IMetadata; +export type MetadataHolder = { + meta?: Metadata; }; export type AllowedMetadataValueTypes = string | boolean | number | undefined; @@ -100,7 +100,7 @@ export interface IMangaCard { unreadCount?: number; downloadCount?: number; inLibrary?: boolean; - meta?: IMetadata; + meta?: Metadata; inLibraryAt: number; lastReadAt: number; } @@ -122,7 +122,7 @@ export interface IManga { inLibrary: boolean; source: ISource; - meta: IMetadata; + meta: Metadata; realUrl: string; freshData: boolean; @@ -158,7 +158,7 @@ export interface IChapter { chapterCount: number; pageCount: number; downloaded: boolean; - meta: IMetadata; + meta: Metadata; } export interface IMangaChapter { @@ -178,7 +178,7 @@ export interface ICategory { order: number; name: string; default: boolean; - meta: IMetadata; + meta: Metadata; } export interface INavbarOverride { diff --git a/src/util/metadata.ts b/src/util/metadata.ts index 18f8823f83..50c3758aff 100644 --- a/src/util/metadata.ts +++ b/src/util/metadata.ts @@ -15,8 +15,8 @@ import { IManga, IMangaCard, IMangaChapter, - IMetadata, - IMetadataHolder, + Metadata, + MetadataHolder, IMetadataMigration, MetadataKeyValuePair, } from 'typings'; @@ -96,7 +96,7 @@ const getAppKeyPrefixForMigration = (migrationId: number): string => { const getMetadataKey = (key: string, appPrefix: string = APP_METADATA_KEY_PREFIX) => `${appPrefix}${key}`; -const doesMetadataKeyExistIn = (meta: IMetadata | undefined, key: string, appPrefix?: string): boolean => +const doesMetadataKeyExistIn = (meta: Metadata | undefined, key: string, appPrefix?: string): boolean => Object.prototype.hasOwnProperty.call(meta ?? {}, getMetadataKey(key, appPrefix)); const convertValueFromMetadata = ( @@ -117,8 +117,8 @@ const convertValueFromMetadata = { - const appMetadata: IMetadata = {}; +const getAppMetadataFrom = (meta: Metadata, appPrefix: string = APP_METADATA_KEY_PREFIX): Metadata => { + const appMetadata: Metadata = {}; Object.entries(meta).forEach(([key, value]) => { if (key.startsWith(appPrefix)) { @@ -129,8 +129,8 @@ const getAppMetadataFrom = (meta: IMetadata, appPrefix: string = APP_METADATA_KE return appMetadata; }; -const applyAppKeyPrefixMigration = (meta: IMetadata, migration: IMetadataMigration): IMetadata => { - const migratedMetadata: IMetadata = { ...meta }; +const applyAppKeyPrefixMigration = (meta: Metadata, migration: IMetadataMigration): Metadata => { + const migratedMetadata: Metadata = { ...meta }; if (!migration.appKeyPrefix) { return migratedMetadata; @@ -154,12 +154,8 @@ const applyAppKeyPrefixMigration = (meta: IMetadata, migration: IMetadataMigrati return migratedMetadata; }; -const applyMetadataValueMigration = ( - meta: IMetadata, - migration: IMetadataMigration, - appKeyPrefix: string, -): IMetadata => { - const migratedMetadata: IMetadata = { ...meta }; +const applyMetadataValueMigration = (meta: Metadata, migration: IMetadataMigration, appKeyPrefix: string): Metadata => { + const migratedMetadata: Metadata = { ...meta }; if (!migration.values) { return migratedMetadata; @@ -193,8 +189,8 @@ const applyMetadataValueMigration = ( return migratedMetadata; }; -const applyMetadataKeyMigration = (meta: IMetadata, migration: IMetadataMigration): IMetadata => { - const migratedMetadata: IMetadata = { ...meta }; +const applyMetadataKeyMigration = (meta: Metadata, migration: IMetadataMigration): Metadata => { + const migratedMetadata: Metadata = { ...meta }; if (!migration.keys) { return migratedMetadata; @@ -217,12 +213,12 @@ const applyMetadataKeyMigration = (meta: IMetadata, migration: IMetadataMigratio return migratedMetadata; }; -const applyMetadataMigrations = (meta?: IMetadata): IMetadata | undefined => { +const applyMetadataMigrations = (meta?: Metadata): Metadata | undefined => { if (!meta) { return undefined; } - const migrationToMetadata: [number, IMetadata][] = [[0, meta]]; + const migrationToMetadata: [number, Metadata][] = [[0, meta]]; migrations.forEach((migration, index) => { const migrationId = index + 1; @@ -247,7 +243,7 @@ const applyMetadataMigrations = (meta?: IMetadata): IMetadata | undefined => { }; export const getMetadataValueFrom = ( - { meta }: IMetadataHolder, + { meta }: MetadataHolder, key: Key, defaultValue?: Value, applyMigrations: boolean = true, @@ -261,12 +257,12 @@ export const getMetadataValueFrom = >>( - { meta }: IMetadataHolder, - metadataWithDefaultValues: Metadata, +export const getMetadataFrom = >>( + { meta }: MetadataHolder, + metadataWithDefaultValues: METADATA, applyMigrations?: boolean, -): Metadata => { - const appMetadata = {} as Metadata; +): METADATA => { + const appMetadata = {} as METADATA; Object.entries(metadataWithDefaultValues).forEach(([key, defaultValue]) => { appMetadata[key as AppMetadataKeys] = getMetadataValueFrom( @@ -280,7 +276,7 @@ export const getMetadataFrom = { +const wrapMetadataWithMetaKey = (wrap: boolean, metadata: Metadata): MetadataHolder => { if (wrap) { return { meta: { @@ -296,7 +292,7 @@ const wrapMetadataWithMetaKey = (wrap: boolean, metadata: IMetadata): IMetadataH export const requestUpdateMetadataValue = async ( endpoint: string, - metadataHolder: IMetadataHolder, + metadataHolder: MetadataHolder, key: AppMetadataKeys, value: AllowedMetadataValueTypes, endpointToMutate: string = endpoint, @@ -328,7 +324,7 @@ export const requestUpdateMetadataValue = async ( export const requestUpdateMetadata = async ( endpoint: string, - metadataHolder: IMetadataHolder, + metadataHolder: MetadataHolder, keysToValues: [AppMetadataKeys, AllowedMetadataValueTypes][], endpointToMutate?: string, wrapWithMetaKey?: boolean, @@ -340,7 +336,7 @@ export const requestUpdateMetadata = async ( ); export const requestUpdateServerMetadata = async ( - serverMetadata: IMetadata, + serverMetadata: Metadata, keysToValues: MetadataKeyValuePair[], ): Promise => requestUpdateMetadata('', { meta: serverMetadata }, keysToValues, '/meta', false); diff --git a/src/util/readerSettings.ts b/src/util/readerSettings.ts index 68b8b58c76..89d901e72a 100644 --- a/src/util/readerSettings.ts +++ b/src/util/readerSettings.ts @@ -8,7 +8,7 @@ import { getMetadataFrom, requestUpdateMangaMetadata, requestUpdateServerMetadata } from 'util/metadata'; import { useQuery } from 'util/client'; -import { IManga, IMetadata, IMetadataHolder, IReaderSettings, MetadataKeyValuePair } from 'typings'; +import { IManga, Metadata, MetadataHolder, IReaderSettings, MetadataKeyValuePair } from 'typings'; export const getDefaultSettings = (forceUndefined: boolean = false) => ({ @@ -21,7 +21,7 @@ export const getDefaultSettings = (forceUndefined: boolean = false) => } as IReaderSettings); const getReaderSettingsWithDefaultValueFallback = ( - meta?: IMetadata, + meta?: Metadata, defaultSettings: IReaderSettings = getDefaultSettings(), applyMetadataMigration: boolean = true, ): IReaderSettings => ({ @@ -29,7 +29,7 @@ const getReaderSettingsWithDefaultValueFallback = ( }); export const getReaderSettingsFromMetadata = ( - meta?: IMetadata, + meta?: Metadata, defaultSettings?: IReaderSettings, applyMetadataMigration?: boolean, ): IReaderSettings => ({ @@ -37,17 +37,17 @@ export const getReaderSettingsFromMetadata = ( }); export const getReaderSettingsFor = ( - { meta }: IMetadataHolder, + { meta }: MetadataHolder, defaultSettings?: IReaderSettings, applyMetadataMigration?: boolean, ): IReaderSettings => getReaderSettingsFromMetadata(meta, defaultSettings, applyMetadataMigration); export const useDefaultReaderSettings = (): { - metadata?: IMetadata; + metadata?: Metadata; settings: IReaderSettings; loading: boolean; } => { - const { data: meta, loading } = useQuery('/api/v1/meta'); + const { data: meta, loading } = useQuery('/api/v1/meta'); const settings = getReaderSettingsWithDefaultValueFallback(meta); return { metadata: meta, settings, loading }; @@ -61,11 +61,11 @@ export const useDefaultReaderSettings = (): { * @param defaultSettings */ export const checkAndHandleMissingStoredReaderSettings = async ( - metadataHolder: IManga | IMetadataHolder, + metadataHolder: IManga | MetadataHolder, metadataHolderType: 'manga' | 'server', defaultSettings: IReaderSettings, ): Promise => { - const meta = metadataHolder.meta ?? (metadataHolder as IMetadata); + const meta = metadataHolder.meta ?? (metadataHolder as Metadata); const settingsToCheck = getReaderSettingsFor({ meta }, getDefaultSettings(true), false); const newSettings = getReaderSettingsFor({ meta }, defaultSettings); diff --git a/src/util/searchSettings.ts b/src/util/searchSettings.ts index c5482deb74..fef8c9942f 100644 --- a/src/util/searchSettings.ts +++ b/src/util/searchSettings.ts @@ -1,6 +1,6 @@ import { useQuery } from 'util/client'; import { getMetadataFrom } from 'util/metadata'; -import { IMetadata, ISearchSettings } from 'typings'; +import { Metadata, ISearchSettings } from 'typings'; export const getDefaultSettings = () => ({ @@ -8,7 +8,7 @@ export const getDefaultSettings = () => } as ISearchSettings); const getSearchSettingsWithDefaultValueFallback = ( - meta?: IMetadata, + meta?: Metadata, defaultSettings: ISearchSettings = getDefaultSettings(), applyMetadataMigration: boolean = true, ): ISearchSettings => ({ @@ -16,11 +16,11 @@ const getSearchSettingsWithDefaultValueFallback = ( }); export const useSearchSettings = (): { - metadata?: IMetadata; + metadata?: Metadata; settings: ISearchSettings; loading: boolean; } => { - const { data: meta, loading } = useQuery('/api/v1/meta'); + const { data: meta, loading } = useQuery('/api/v1/meta'); const settings = getSearchSettingsWithDefaultValueFallback(meta); return { metadata: meta, settings, loading }; From d100389bb03d2c88dffbe4da1b8aec95275bdbed Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Sat, 25 Mar 2023 21:31:42 +0100 Subject: [PATCH 3/3] Improve typing in setting util files --- src/util/readerSettings.ts | 46 ++++++++++++++++++++++---------------- src/util/searchSettings.ts | 12 ++++------ 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/util/readerSettings.ts b/src/util/readerSettings.ts index 89d901e72a..c20c72e3b6 100644 --- a/src/util/readerSettings.ts +++ b/src/util/readerSettings.ts @@ -10,31 +10,29 @@ import { getMetadataFrom, requestUpdateMangaMetadata, requestUpdateServerMetadat import { useQuery } from 'util/client'; import { IManga, Metadata, MetadataHolder, IReaderSettings, MetadataKeyValuePair } from 'typings'; -export const getDefaultSettings = (forceUndefined: boolean = false) => - ({ - staticNav: forceUndefined ? undefined : false, - showPageNumber: forceUndefined ? undefined : true, - continuesPageGap: forceUndefined ? undefined : false, - loadNextOnEnding: forceUndefined ? undefined : false, - skipDupChapters: forceUndefined ? undefined : true, - readerType: forceUndefined ? undefined : 'ContinuesVertical', - } as IReaderSettings); +type UndefinedReaderSettings = { + [setting in keyof IReaderSettings]: IReaderSettings[setting] | undefined; +}; + +export const getDefaultSettings = (): IReaderSettings => ({ + staticNav: false, + showPageNumber: true, + loadNextOnEnding: false, + skipDupChapters: true, + readerType: 'ContinuesVertical', +}); -const getReaderSettingsWithDefaultValueFallback = ( +const getReaderSettingsWithDefaultValueFallback = ( meta?: Metadata, - defaultSettings: IReaderSettings = getDefaultSettings(), + defaultSettings: DefaultSettings = getDefaultSettings() as DefaultSettings, applyMetadataMigration: boolean = true, -): IReaderSettings => ({ - ...getMetadataFrom({ meta }, defaultSettings, applyMetadataMigration), -}); +): DefaultSettings => getMetadataFrom({ meta }, defaultSettings, applyMetadataMigration); export const getReaderSettingsFromMetadata = ( meta?: Metadata, defaultSettings?: IReaderSettings, applyMetadataMigration?: boolean, -): IReaderSettings => ({ - ...getReaderSettingsWithDefaultValueFallback(meta, defaultSettings, applyMetadataMigration), -}); +): IReaderSettings => getReaderSettingsWithDefaultValueFallback(meta, defaultSettings, applyMetadataMigration); export const getReaderSettingsFor = ( { meta }: MetadataHolder, @@ -48,7 +46,7 @@ export const useDefaultReaderSettings = (): { loading: boolean; } => { const { data: meta, loading } = useQuery('/api/v1/meta'); - const settings = getReaderSettingsWithDefaultValueFallback(meta); + const settings = getReaderSettingsWithDefaultValueFallback(meta); return { metadata: meta, settings, loading }; }; @@ -66,7 +64,17 @@ export const checkAndHandleMissingStoredReaderSettings = async ( defaultSettings: IReaderSettings, ): Promise => { const meta = metadataHolder.meta ?? (metadataHolder as Metadata); - const settingsToCheck = getReaderSettingsFor({ meta }, getDefaultSettings(true), false); + const settingsToCheck = getReaderSettingsWithDefaultValueFallback( + meta, + { + staticNav: undefined, + showPageNumber: undefined, + loadNextOnEnding: undefined, + skipDupChapters: undefined, + readerType: undefined, + }, + false, + ); const newSettings = getReaderSettingsFor({ meta }, defaultSettings); const undefinedSettings = Object.entries(settingsToCheck).filter((setting) => setting[1] === undefined); diff --git a/src/util/searchSettings.ts b/src/util/searchSettings.ts index fef8c9942f..d8fd47d422 100644 --- a/src/util/searchSettings.ts +++ b/src/util/searchSettings.ts @@ -2,19 +2,15 @@ import { useQuery } from 'util/client'; import { getMetadataFrom } from 'util/metadata'; import { Metadata, ISearchSettings } from 'typings'; -export const getDefaultSettings = () => - ({ - ignoreFilters: false, - } as ISearchSettings); +export const getDefaultSettings = (): ISearchSettings => ({ + ignoreFilters: false, +}); const getSearchSettingsWithDefaultValueFallback = ( meta?: Metadata, defaultSettings: ISearchSettings = getDefaultSettings(), applyMetadataMigration: boolean = true, -): ISearchSettings => ({ - ...getMetadataFrom({ meta }, defaultSettings, applyMetadataMigration), -}); - +): ISearchSettings => getMetadataFrom({ meta }, defaultSettings, applyMetadataMigration); export const useSearchSettings = (): { metadata?: Metadata; settings: ISearchSettings;