Files
suwayomi-material-you-webui/src/modules/metadata/Metadata.constants.ts

376 lines
12 KiB
TypeScript
Raw Normal View History

2024-10-05 23:17:20 +02:00
/*
* 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 { AppMetadataKeys, IMetadataMigration } from '@/modules/metadata/Metadata.types.ts';
import { ProgressBarPosition, ReaderPageScaleMode, ReadingMode } from '@/modules/reader/types/Reader.types.ts';
import { DEFAULT_READER_SETTINGS } from '@/modules/reader/constants/ReaderSettings.constants.tsx';
2024-10-05 23:17:20 +02:00
2024-10-28 18:03:29 +01:00
export const APP_METADATA_KEY_PREFIX = 'webUI';
2024-10-05 23:17:20 +02:00
// At the moment any non-primitive types need to be specified as "string" and handled in the according "MetadataService".
// "auto" can be used to try to automatically convert the value to a specific type (string, number, boolean, undefined, null)
export const APP_METADATA_KEY_TO_TYPE = {
migration: 'number',
deleteChaptersManuallyMarkedRead: 'boolean',
deleteChaptersWhileReading: 'number',
deleteChaptersWithBookmark: 'boolean',
downloadAheadLimit: 'number',
showAddToLibraryCategorySelectDialog: 'boolean',
ignoreFilters: 'boolean',
removeMangaFromCategories: 'boolean',
showTabSize: 'boolean',
devices: 'string', // string[]
migrateChapters: 'boolean',
migrateCategories: 'boolean',
migrateTracking: 'boolean',
deleteChapters: 'boolean',
migrateSortSettings: 'string', // SortSettings (object)
hideLibraryEntries: 'boolean',
updateProgressAfterReading: 'boolean',
updateProgressManualMarkRead: 'boolean',
webUIInformAvailableUpdate: 'boolean',
serverInformAvailableUpdate: 'boolean',
readerWidth: 'string', // object
savedSearches: 'string', // object
showContinueReadingButton: 'boolean',
showDownloadBadge: 'boolean',
showUnreadBadge: 'boolean',
gridLayout: 'number', // GridLayout (enum)
sortBy: 'auto', // LibrarySortMode undefined null
sortDesc: 'auto', // boolean undefined null
hasDownloadedChapters: 'auto', // boolean undefined null
hasBookmarkedChapters: 'auto', // boolean undefined null
hasUnreadChapters: 'auto', // boolean undefined null
hasReadChapters: 'auto', // boolean undefined null
hasDuplicateChapters: 'auto', // boolean undefined null
hasTrackerBinding: 'string', // object
hasStatus: 'string', // object
customThemes: 'string', // object
mangaThumbnailBackdrop: 'boolean',
mangaDynamicColorSchemes: 'boolean',
tapZoneLayout: 'number', // TapZoneLayouts (enum)
tapZoneInvertMode: 'string', // TapZoneInvertMode (object)
readingDirection: 'number', // ReadingDirection (enum)
progressBarType: 'number', // ProgressBarType (enum)
progressBarSize: 'number',
progressBarPosition: 'number', // ProgressBarPosition (enum)
progressBarPositionAutoVertical: 'number', // TProgressBarPositionAutoVertical (enum)
readingMode: 'number', // ReadingMode (enum)
pageScaleMode: 'number', // ReaderPageScaleMode (enum)
shouldOffsetDoubleSpreads: 'boolean',
exitMode: 'number', // ReaderExitMode (enum)
customFilter: 'string', // ReaderCustomFilter (object)
shouldSkipDupChapters: 'boolean',
isStaticNav: 'boolean',
overlayMode: 'number', // ReaderOverlayMode (enum)
shouldStretchPage: 'boolean',
shouldShowPageNumber: 'boolean',
backgroundColor: 'number', // ReaderBackgroundColor (enum)
pageGap: 'number',
hotkeys: 'string', // object
imagePreLoadAmount: 'number',
shouldUseAutoWebtoonMode: 'boolean',
autoScroll: 'string', // object
shouldShowReadingModePreview: 'boolean',
shouldShowTapZoneLayoutPreview: 'boolean',
shouldInformAboutMissingChapter: 'boolean',
shouldInformAboutScanlatorChange: 'boolean',
hideHistory: 'boolean',
scrollAmount: 'number', // ReaderScrollAmount (enum)
reverse: 'boolean',
bookmarked: 'auto', // boolean undefined null
downloaded: 'auto', // boolean undefined null
unread: 'auto', // boolean undefined null
showChapterNumber: 'boolean',
extensionLanguages: 'string', // string[]
showNsfw: 'boolean',
shouldUseInfiniteScroll: 'boolean',
shouldShowTransitionPage: 'boolean',
appTheme: 'string',
themeMode: 'string', // ThemeMode (enum)
shouldUsePureBlackMode: 'boolean',
mangaGridItemWidth: 'number',
isPinned: 'boolean',
2025-05-17 23:37:00 +02:00
lastUsedSourceId: 'string',
shouldShowOnlySourcesWithResults: 'boolean',
} as const satisfies Record<AppMetadataKeys, 'auto' | 'string' | 'number' | 'boolean'>;
export const VALID_APP_METADATA_KEYS = Object.keys(APP_METADATA_KEY_TO_TYPE);
2024-10-05 23:17:20 +02:00
export const GLOBAL_METADATA_KEYS: AppMetadataKeys[] = [
// metadata applied migration id
'migration',
2024-10-05 23:17:20 +02:00
// downloads
'deleteChaptersManuallyMarkedRead',
'deleteChaptersWhileReading',
'deleteChaptersWithBookmark',
// library
'showAddToLibraryCategorySelectDialog',
'ignoreFilters',
'removeMangaFromCategories',
'showTabSize',
// library category options
// filter
'hasDownloadedChapters',
'hasBookmarkedChapters',
'hasUnreadChapters',
2024-12-27 03:32:30 +01:00
'hasReadChapters',
2024-10-05 23:17:20 +02:00
'hasDuplicateChapters',
'hasTrackerBinding',
'hasStatus',
// sort
'sortBy',
'sortDesc',
// display
'showDownloadBadge',
'showUnreadBadge',
'showTabSize',
'showContinueReadingButton',
// client
'devices',
// migration
'migrateChapters',
'migrateCategories',
'migrateTracking',
'deleteChapters',
'migrateSortSettings',
// browse
'hideLibraryEntries',
'extensionLanguages',
2025-04-21 19:18:42 +02:00
'showNsfw',
2025-05-17 23:37:00 +02:00
'lastUsedSourceId',
'shouldShowOnlySourcesWithResults',
2024-10-05 23:17:20 +02:00
2025-03-23 01:21:45 +01:00
// history
'hideHistory',
2024-10-05 23:17:20 +02:00
// tracking
'updateProgressAfterReading',
'updateProgressManualMarkRead',
// updates
'webUIInformAvailableUpdate',
'serverInformAvailableUpdate',
// sources
'savedSearches',
2025-05-17 22:17:15 +02:00
'isPinned',
2024-10-05 23:17:20 +02:00
// themes
'customThemes',
'mangaThumbnailBackdrop',
'mangaDynamicColorSchemes',
2024-11-04 18:00:35 +01:00
// reader
'exitMode',
'customFilter',
'shouldSkipDupChapters',
2024-11-03 03:09:00 +01:00
'hotkeys',
'shouldShowTransitionPage',
2025-04-20 21:40:28 +02:00
// manga
// chapter list options
'reverse',
'bookmarked',
'downloaded',
'unread',
'showChapterNumber',
2024-10-05 23:17:20 +02:00
];
2024-10-03 04:03:04 +02:00
2024-10-05 23:17:20 +02:00
/**
* Once all changes have been done in the current branch, a new migration for all changes should be
* created.
*
* In case a value should be migrated for a specific key, and in the same migration the key is
* getting migrated, the key in the value migration is the "old" key (before the migration to the
* new key).
*
* Migration order (function "applyMetadataMigrations"):
* 1. app metadata key prefix
* 2. app metadata values
* 3. app metadata keys
* 4. app metadata keys deletion
2024-10-05 23:17:20 +02:00
*
* @example
* // changes:
* // commit: change key "X" to "Z"
* // commit: change key "Y" to "A"
* // commit: fix typo in reader setting "someTipo"
* // commit: add metadata migration
*
* // result:
* // old migrations:
* // const migrations = [
* // {
* // keys: [{ oldKey: 'loadNextonEnding', newKey: 'loadNextOnEnding' }],
* // }
* // ];
*
* // updated migrations
* const migrations = [
* {
* keys: [{ oldKey: 'loadNextonEnding', newKey: 'loadNextOnEnding' }],
* },
* {
* keys: [
* { oldKey: 'X', newKey: 'Z' },
* { oldKey: 'Y', newKey: 'A' },
* ],
* // all stored values in the metadata (of this app) will get migrated
* values: [
* {
* oldValue: 'someTipo',
* newValue: 'someTypo'
* },
* ],
* // to migrate only the value of a specific key (in this case of "someKey"):
* // values: [
* // {
* // key: 'someKey',
* // oldValue: 'someTipo',
* // newValue: 'someTypo',
* // },
* // ],
* },
* ];
*/
export const METADATA_MIGRATIONS: IMetadataMigration[] = [
{
keys: [{ oldKey: 'loadNextonEnding', newKey: 'loadNextOnEnding' }],
},
{
keys: [{ oldKey: 'deleteChaptersAutoMarkedRead', newKey: 'deleteChaptersWhileReading' }],
},
2024-10-03 04:03:04 +02:00
{
keys: [
{
oldKey: 'readerType',
newKey: 'readingMode',
},
2024-10-03 04:02:59 +02:00
{
oldKey: 'offsetFirstPage',
newKey: 'shouldOffsetDoubleSpreads',
},
{
oldKey: 'fitPageToWindow',
newKey: 'pageScaleMode',
},
{
oldKey: 'scalePage',
2024-11-04 18:00:35 +01:00
newKey: 'shouldStretchPage',
},
{
oldKey: 'skipDupChapters',
newKey: 'shouldSkipDupChapters',
},
{
oldKey: 'showPageNumber',
newKey: 'shouldShowPageNumber',
},
{
oldKey: 'staticNav',
newKey: 'isStaticNav',
2024-10-03 04:02:59 +02:00
},
2024-10-03 04:03:04 +02:00
],
values: [
// START: readerType
{
key: 'readerType',
oldValue: 'ContinuesVertical',
newValue: `${ReadingMode.CONTINUOUS_VERTICAL}`,
},
{
key: 'readerType',
oldValue: 'Webtoon',
newValue: `${ReadingMode.WEBTOON}`,
2024-10-03 04:03:04 +02:00
},
{
key: 'readerType',
oldValue: 'SingleRTL',
newValue: `${ReadingMode.SINGLE_PAGE}`,
},
{
key: 'readerType',
oldValue: 'SingleLTR',
newValue: `${ReadingMode.SINGLE_PAGE}`,
},
{
key: 'readerType',
oldValue: 'DoubleRTL',
newValue: `${ReadingMode.DOUBLE_PAGE}`,
},
{
key: 'readerType',
oldValue: 'DoubleLTR',
newValue: `${ReadingMode.DOUBLE_PAGE}`,
},
{
key: 'readerType',
oldValue: 'ContinuesHorizontalLTR',
newValue: `${ReadingMode.CONTINUOUS_HORIZONTAL}`,
},
{
key: 'readerType',
oldValue: 'ContinuesHorizontalRTL',
newValue: `${ReadingMode.CONTINUOUS_HORIZONTAL}`,
},
// END: readerType
2024-10-03 04:02:59 +02:00
// START: fitPageToWindow
{
key: 'fitPageToWindow',
oldValue: 'false',
newValue: `${ReaderPageScaleMode.ORIGINAL}`,
},
{
key: 'fitPageToWindow',
oldValue: 'true',
newValue: `${ReaderPageScaleMode.SCREEN}`,
},
// END: fitPageToWindow
2024-12-10 21:14:56 +01:00
{
key: 'readerWidth',
oldValue: /^[0-9]+$/g,
2024-12-10 21:14:56 +01:00
newValue: (oldValue) => JSON.stringify({ value: Number(oldValue), enabled: true }),
},
2024-10-03 04:03:04 +02:00
],
},
2025-01-05 14:29:47 +01:00
{
deleteKeys: ['pageScaleMode', 'shouldStretchPage', 'readerWidth'],
},
{
values: [
{
key: 'progressBarPositionAutoVertical',
oldValue: '-1',
newValue: `${DEFAULT_READER_SETTINGS.progressBarPositionAutoVertical}`,
},
{
key: 'progressBarPosition',
oldValue: '0',
newValue: `${ProgressBarPosition.BOTTOM}`,
},
{
key: 'progressBarPosition',
oldValue: '1',
newValue: `${ProgressBarPosition.LEFT}`,
},
{
key: 'progressBarPosition',
oldValue: '2',
newValue: `${ProgressBarPosition.RIGHT}`,
},
],
},
2024-10-05 23:17:20 +02:00
];