diff --git a/src/modules/metadata/Metadata.utils.ts b/src/modules/metadata/Metadata.utils.ts new file mode 100644 index 00000000..bf0200f1 --- /dev/null +++ b/src/modules/metadata/Metadata.utils.ts @@ -0,0 +1,45 @@ +/* + * 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 { APP_METADATA_KEY_PREFIX, GLOBAL_METADATA_KEYS } from '@/modules/metadata/Metadata.constants.ts'; +import { AppMetadataKeys, Metadata } from '@/modules/metadata/Metadata.types.ts'; +import { getActiveDevice } from '@/modules/device/services/Device.ts'; + +export const extractOriginalKey = (key: string) => key.split('_').slice(-1)[0]; + +/** + * Returns the key with the provided prefixes. + * + * In case the key is not a global key ({@link GLOBAL_METADATA_KEYS}), the active device name ({@link getActiveDevice}) + * will be added as the second prefix. + * + * **Important** + * + * "default" (case-insensitive) is a reserved value and will be handled as if there is no prefix to add + * + * The format is \_ + * + * e.g.: \_[device_name]\_[optional_prefix1]\_[optional_prefix2]\_ + */ +export const getMetadataKey = (key: string, prefixes: string[] = [], appPrefix: string = APP_METADATA_KEY_PREFIX) => { + const isGlobalMetadataKey = GLOBAL_METADATA_KEYS.includes(key as AppMetadataKeys); + const addActiveDevicePrefix = !isGlobalMetadataKey; + + const finalPrefix = [appPrefix, ...(addActiveDevicePrefix ? [getActiveDevice()] : []), ...prefixes].filter( + (prefix) => prefix.toLowerCase() !== 'default', + ); + + return `${finalPrefix.join('_')}_${key}`; +}; + +export const doesMetadataKeyExistIn = ( + meta: Metadata | undefined, + key: string, + prefixes?: string[], + appPrefix?: string, +): boolean => Object.prototype.hasOwnProperty.call(meta ?? {}, getMetadataKey(key, prefixes, appPrefix)); diff --git a/src/modules/metadata/services/MetadataMigrations.ts b/src/modules/metadata/services/MetadataMigrations.ts index 5ffd7984..a31afe0d 100644 --- a/src/modules/metadata/services/MetadataMigrations.ts +++ b/src/modules/metadata/services/MetadataMigrations.ts @@ -8,7 +8,7 @@ import { APP_METADATA_KEY_PREFIX, METADATA_MIGRATIONS } from '@/modules/metadata/Metadata.constants.ts'; import { IMetadataMigration, Metadata } from '@/modules/metadata/Metadata.types.ts'; -import { doesMetadataKeyExistIn, getMetadataKey } from '@/modules/metadata/services/MetadataReader.ts'; +import { doesMetadataKeyExistIn, getMetadataKey } from '@/modules/metadata/Metadata.utils.ts'; export const getAppKeyPrefixForMigration = (migrationId: number): string => { const appKeyPrefix = METADATA_MIGRATIONS.slice(0, migrationId) diff --git a/src/modules/metadata/services/MetadataReader.ts b/src/modules/metadata/services/MetadataReader.ts index 2f527504..1bbf8196 100644 --- a/src/modules/metadata/services/MetadataReader.ts +++ b/src/modules/metadata/services/MetadataReader.ts @@ -7,13 +7,7 @@ */ import { useEffect } from 'react'; -import { - APP_METADATA_KEY_PREFIX, - GLOBAL_METADATA_KEYS, - METADATA_MIGRATIONS, - VALID_APP_METADATA_KEYS, -} from '@/modules/metadata/Metadata.constants.ts'; -import { getActiveDevice } from '@/modules/device/services/Device.ts'; +import { METADATA_MIGRATIONS, VALID_APP_METADATA_KEYS } from '@/modules/metadata/Metadata.constants.ts'; import { applyMetadataMigrations } from '@/modules/metadata/services/MetadataMigrations.ts'; import { convertToGqlMeta, convertValueFromMetadata } from '@/modules/metadata/services/MetadataConverter.ts'; import { @@ -41,40 +35,7 @@ import { defaultPromiseErrorHandler } from '@/lib/DefaultPromiseErrorHandler.ts' import { ChapterIdInfo } from '@/modules/chapter/services/Chapters.ts'; import { CategoryIdInfo } from '@/modules/category/Category.types.ts'; import { SourceType } from '@/lib/graphql/generated/graphql.ts'; - -export const extractOriginalKey = (key: string) => key.split('_').slice(-1)[0]; - -/** - * Returns the key with the provided prefixes. - * - * In case the key is not a global key ({@link GLOBAL_METADATA_KEYS}), the active device name ({@link getActiveDevice}) - * will be added as the second prefix. - * - * **Important** - * - * "default" (case-insensitive) is a reserved value and will be handled as if there is no prefix to add - * - * The format is \_ - * - * e.g.: \_[device_name]\_[optional_prefix1]\_[optional_prefix2]\_ - */ -export const getMetadataKey = (key: string, prefixes: string[] = [], appPrefix: string = APP_METADATA_KEY_PREFIX) => { - const isGlobalMetadataKey = GLOBAL_METADATA_KEYS.includes(key as AppMetadataKeys); - const addActiveDevicePrefix = !isGlobalMetadataKey; - - const finalPrefix = [appPrefix, ...(addActiveDevicePrefix ? [getActiveDevice()] : []), ...prefixes].filter( - (prefix) => prefix.toLowerCase() !== 'default', - ); - - return `${finalPrefix.join('_')}_${key}`; -}; - -export const doesMetadataKeyExistIn = ( - meta: Metadata | undefined, - key: string, - prefixes?: string[], - appPrefix?: string, -): boolean => Object.prototype.hasOwnProperty.call(meta ?? {}, getMetadataKey(key, prefixes, appPrefix)); +import { doesMetadataKeyExistIn, extractOriginalKey, getMetadataKey } from '@/modules/metadata/Metadata.utils.ts'; export const getMetadataValueFrom = ( { meta }: MetadataHolder, diff --git a/src/modules/metadata/services/MetadataUpdater.ts b/src/modules/metadata/services/MetadataUpdater.ts index 0f59febd..d89a0019 100644 --- a/src/modules/metadata/services/MetadataUpdater.ts +++ b/src/modules/metadata/services/MetadataUpdater.ts @@ -10,7 +10,6 @@ import { requestManager } from '@/lib/requests/RequestManager.ts'; import { SourceType } from '@/lib/graphql/generated/graphql.ts'; import { ChapterIdInfo } from '@/modules/chapter/services/Chapters.ts'; import { CategoryIdInfo } from '@/modules/category/Category.types.ts'; -import { getMetadataKey } from '@/modules/metadata/services/MetadataReader.ts'; import { AllowedMetadataValueTypes, AppMetadataKeys, @@ -19,6 +18,7 @@ import { MetadataKeyValuePair, } from '@/modules/metadata/Metadata.types.ts'; import { MangaIdInfo } from '@/modules/manga/Manga.types.ts'; +import { getMetadataKey } from '@/modules/metadata/Metadata.utils.ts'; export const requestUpdateMetadataValue = async ( metadataHolder: GqlMetaHolder, diff --git a/src/modules/reader/services/ReaderService.ts b/src/modules/reader/services/ReaderService.ts index ff9c811b..ad454071 100644 --- a/src/modules/reader/services/ReaderService.ts +++ b/src/modules/reader/services/ReaderService.ts @@ -27,7 +27,6 @@ import { updateReaderSettings, } from '@/modules/reader/services/ReaderSettingsMetadata.ts'; import { MangaIdInfo } from '@/modules/manga/Manga.types.ts'; -import { getMetadataKey } from '@/modules/metadata/services/MetadataReader.ts'; import { requestManager } from '@/lib/requests/RequestManager.ts'; import { MANGA_META_FIELDS } from '@/lib/graphql/fragments/MangaFragments.ts'; import { makeToast } from '@/modules/core/utils/Toast.ts'; @@ -51,6 +50,7 @@ import { Queue } from '@/lib/Queue.ts'; import { AppRoutes } from '@/modules/core/AppRoute.constants.ts'; import { getErrorMessage } from '@/lib/HelperFunctions.ts'; import { FALLBACK_MANGA } from '@/modules/manga/Manga.constants.ts'; +import { getMetadataKey } from '@/modules/metadata/Metadata.utils.ts'; const DIRECTION_TO_INVERTED: Record = { ltr: 'rtl', diff --git a/src/modules/reader/services/ReaderSettingsMetadata.ts b/src/modules/reader/services/ReaderSettingsMetadata.ts index 3b086725..7d3fc1bf 100644 --- a/src/modules/reader/services/ReaderSettingsMetadata.ts +++ b/src/modules/reader/services/ReaderSettingsMetadata.ts @@ -15,7 +15,7 @@ import { import { MangaType } from '@/lib/graphql/generated/graphql.ts'; import { IReaderSettings, IReaderSettingsWithDefaultFlag, ReadingMode } from '@/modules/reader/types/Reader.types.ts'; import { convertFromGqlMeta } from '@/modules/metadata/services/MetadataConverter.ts'; -import { extractOriginalKey, getMetadataFrom } from '@/modules/metadata/services/MetadataReader.ts'; +import { getMetadataFrom } from '@/modules/metadata/services/MetadataReader.ts'; import { AllowedMetadataValueTypes, AppMetadataKeys, @@ -33,6 +33,7 @@ import { } from '@/modules/reader/constants/ReaderSettings.constants.tsx'; import { DEFAULT_DEVICE, getActiveDevice } from '@/modules/device/services/Device.ts'; import { APP_METADATA_KEY_PREFIX } from '@/modules/metadata/Metadata.constants.ts'; +import { extractOriginalKey } from '@/modules/metadata/Metadata.utils.ts'; export const convertFromReaderSettingsWithDefaultFlag = (settings: IReaderSettingsWithDefaultFlag): IReaderSettings => Object.fromEntries(