2023-05-01 23:31:41 +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
|
2023-05-18 13:17:41 +02:00
|
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
|
|
|
*/
|
2023-05-01 23:31:41 +02:00
|
|
|
|
2023-04-21 00:27:42 +02:00
|
|
|
import { t } from 'i18next';
|
2024-10-05 16:09:34 +02:00
|
|
|
import { DefaultLanguage, langCodeToName } from '@/lib/Languages.tsx';
|
2024-07-06 15:55:58 +02:00
|
|
|
import { ExtensionType } from '@/lib/graphql/generated/graphql.ts';
|
2024-10-05 16:09:34 +02:00
|
|
|
import { TranslationKey } from '@/Base.types.ts';
|
2023-04-21 00:27:42 +02:00
|
|
|
|
|
|
|
|
export enum ExtensionState {
|
|
|
|
|
INSTALLED = 'INSTALLED',
|
|
|
|
|
UPDATE_PENDING = 'UPDATE_PENDING',
|
2023-06-22 22:13:10 +02:00
|
|
|
OBSOLETE = 'OBSOLETE',
|
2023-04-21 00:27:42 +02:00
|
|
|
}
|
|
|
|
|
|
2024-07-06 15:55:58 +02:00
|
|
|
export type TExtension = Pick<
|
|
|
|
|
ExtensionType,
|
|
|
|
|
| 'pkgName'
|
|
|
|
|
| 'name'
|
|
|
|
|
| 'lang'
|
|
|
|
|
| 'versionCode'
|
|
|
|
|
| 'versionName'
|
|
|
|
|
| 'iconUrl'
|
|
|
|
|
| 'repo'
|
|
|
|
|
| 'isNsfw'
|
|
|
|
|
| 'isInstalled'
|
|
|
|
|
| 'isObsolete'
|
|
|
|
|
| 'hasUpdate'
|
|
|
|
|
>;
|
|
|
|
|
|
|
|
|
|
export type GroupedExtensionsResult<KEY extends string = string> = [KEY, TExtension[]][];
|
2023-04-21 00:27:42 +02:00
|
|
|
|
|
|
|
|
export type GroupedByExtensionState = {
|
2024-07-06 15:55:58 +02:00
|
|
|
[state in ExtensionState]: TExtension[];
|
2023-04-21 00:27:42 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export type GroupedByLanguage = {
|
2024-07-06 15:55:58 +02:00
|
|
|
[language in DefaultLanguage]: TExtension[];
|
2023-04-21 00:27:42 +02:00
|
|
|
} & {
|
2024-07-06 15:55:58 +02:00
|
|
|
[language: string]: TExtension[];
|
2023-04-21 00:27:42 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export type GroupedExtensions = GroupedByExtensionState & GroupedByLanguage;
|
|
|
|
|
|
|
|
|
|
export const extensionLanguageToTranslationKey: { [state in ExtensionState | DefaultLanguage]: TranslationKey } = {
|
|
|
|
|
[ExtensionState.INSTALLED]: 'extension.state.label.installed',
|
|
|
|
|
[ExtensionState.UPDATE_PENDING]: 'extension.state.label.update_pending',
|
2023-06-22 22:13:10 +02:00
|
|
|
[ExtensionState.OBSOLETE]: 'extension.state.label.obsolete',
|
2023-04-21 00:27:42 +02:00
|
|
|
[DefaultLanguage.ALL]: 'extension.language.all',
|
|
|
|
|
[DefaultLanguage.OTHER]: 'extension.language.other',
|
2024-09-30 03:38:49 +02:00
|
|
|
[DefaultLanguage.LOCAL_SOURCE]: 'extension.language.other',
|
2023-04-21 00:27:42 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const isExtensionStateOrLanguage = (languageCode: string): boolean =>
|
|
|
|
|
[
|
|
|
|
|
ExtensionState.INSTALLED,
|
|
|
|
|
ExtensionState.UPDATE_PENDING,
|
2023-06-22 22:13:10 +02:00
|
|
|
ExtensionState.OBSOLETE,
|
2023-04-21 00:27:42 +02:00
|
|
|
DefaultLanguage.ALL,
|
|
|
|
|
DefaultLanguage.OTHER,
|
|
|
|
|
DefaultLanguage.LOCAL_SOURCE,
|
|
|
|
|
].includes(languageCode as ExtensionState | DefaultLanguage);
|
|
|
|
|
|
|
|
|
|
export const translateExtensionLanguage = (languageCode: string): string =>
|
|
|
|
|
isExtensionStateOrLanguage(languageCode)
|
2023-07-04 21:53:25 +02:00
|
|
|
? t(extensionLanguageToTranslationKey[languageCode as ExtensionState | DefaultLanguage])
|
2023-04-21 00:27:42 +02:00
|
|
|
: langCodeToName(languageCode);
|