diff --git a/src/components/ExtensionCard.tsx b/src/components/ExtensionCard.tsx index 2278a10e..955eda68 100644 --- a/src/components/ExtensionCard.tsx +++ b/src/components/ExtensionCard.tsx @@ -14,14 +14,15 @@ import Avatar from '@mui/material/Avatar'; import Typography from '@mui/material/Typography'; import Box from '@mui/material/Box'; import { useTranslation } from 'react-i18next'; -import { PartialExtension, TranslationKey } from '@/typings'; +import { TranslationKey } from '@/typings'; import { requestManager } from '@/lib/requests/RequestManager.ts'; import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts'; import { makeToast } from '@/components/util/Toast.tsx'; import { SpinnerImage } from '@/components/util/SpinnerImage.tsx'; +import { TExtension } from '@/screens/util/Extensions.ts'; interface IProps { - extension: PartialExtension; + extension: TExtension; handleUpdate: () => void; showSourceRepo: boolean; } diff --git a/src/lib/graphql/Fragments.ts b/src/lib/graphql/Fragments.ts index 5c2e037e..cdc0dea7 100644 --- a/src/lib/graphql/Fragments.ts +++ b/src/lib/graphql/Fragments.ts @@ -168,23 +168,6 @@ export const FULL_MANGA_FIELDS = gql` } `; -export const FULL_EXTENSION_FIELDS = gql` - fragment FULL_EXTENSION_FIELDS on ExtensionType { - apkName - repo - hasUpdate - iconUrl - isInstalled - isNsfw - isObsolete - lang - name - pkgName - versionCode - versionName - } -`; - export const ABOUT_WEBUI = gql` fragment ABOUT_WEBUI on AboutWebUI { channel diff --git a/src/lib/graphql/fragments/ExtensionFragments.ts b/src/lib/graphql/fragments/ExtensionFragments.ts new file mode 100644 index 00000000..83b6f843 --- /dev/null +++ b/src/lib/graphql/fragments/ExtensionFragments.ts @@ -0,0 +1,25 @@ +/* + * 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 gql from 'graphql-tag'; + +export const EXTENSION_LIST_FIELDS = gql` + fragment EXTENSION_LIST_FIELDS on ExtensionType { + pkgName + name + lang + versionCode + versionName + iconUrl + repo + isNsfw + isInstalled + isObsolete + hasUpdate + } +`; diff --git a/src/lib/graphql/generated/apollo-helpers.ts b/src/lib/graphql/generated/apollo-helpers.ts index 348c37b1..2c9a59b9 100644 --- a/src/lib/graphql/generated/apollo-helpers.ts +++ b/src/lib/graphql/generated/apollo-helpers.ts @@ -1,6 +1,6 @@ import {FieldPolicy, FieldReadFunction, Reference, TypePolicies, TypePolicy} from '@apollo/client/cache'; import { - GetChaptersMangaQuery, GetDownloadStatusQueryVariables, GetExtensionQueryVariables, GetGlobalMetadataQueryVariables, + GetChaptersMangaQuery, GetDownloadStatusQueryVariables, GetGlobalMetadataQueryVariables, GetMangaQueryVariables, GetSourceBrowseQueryVariables, GetUpdateStatusQueryVariables, GetWebuiUpdateStatusQueryVariables, } from "@/lib/graphql/generated/graphql.ts"; import {FieldFunctionOptions} from "@apollo/client/cache/inmemory/policies"; @@ -579,7 +579,7 @@ export type QueryFieldPolicy = { checkForServerUpdates?: FieldPolicy | FieldReadFunction, checkForWebUIUpdate?: FieldPolicy | FieldReadFunction, downloadStatus?: FieldPolicy> | FieldReadFunction>, - extension?: FieldPolicy> | FieldReadFunction>, + extension?: FieldPolicy | FieldReadFunction, extensions?: FieldPolicy | FieldReadFunction, getWebUIUpdateStatus?: FieldPolicy> | FieldReadFunction>, lastUpdateTimestamp?: FieldPolicy | FieldReadFunction, diff --git a/src/lib/graphql/generated/graphql.ts b/src/lib/graphql/generated/graphql.ts index aae24933..c0d6cdd7 100644 --- a/src/lib/graphql/generated/graphql.ts +++ b/src/lib/graphql/generated/graphql.ts @@ -2602,8 +2602,6 @@ export type FullChapterFieldsFragment = { __typename?: 'ChapterType', chapterNum export type FullMangaFieldsFragment = { __typename?: 'MangaType', unreadCount: number, downloadCount: number, bookmarkCount: number, artist?: string | null, author?: string | null, chaptersLastFetchedAt?: string | null, description?: string | null, genre: Array, id: number, inLibrary: boolean, inLibraryAt: string, initialized: boolean, lastFetchedAt?: string | null, realUrl?: string | null, status: MangaStatus, thumbnailUrl?: string | null, thumbnailUrlLastFetched?: string | null, title: string, url: string, lastReadChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: string, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: string, mangaId: number, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: string, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null, lastFetchedAt?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestReadChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: string, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: string, mangaId: number, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: string, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null, lastFetchedAt?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestFetchedChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: string, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: string, mangaId: number, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: string, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null, lastFetchedAt?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestUploadedChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: string, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: string, mangaId: number, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: string, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null, lastFetchedAt?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, firstUnreadChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: string, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: string, mangaId: number, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: string, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null, lastFetchedAt?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, categories: { __typename?: 'CategoryNodeList', totalCount: number, nodes: Array<{ __typename?: 'CategoryType', default: boolean, id: number, includeInUpdate: IncludeOrExclude, includeInDownload: IncludeOrExclude, name: string, order: number, meta: Array<{ __typename?: 'CategoryMetaType', key: string, value: string }>, mangas: { __typename?: 'MangaNodeList', totalCount: number } }> }, chapters: { __typename?: 'ChapterNodeList', totalCount: number }, meta: Array<{ __typename?: 'MangaMetaType', key: string, value: string }>, source?: { __typename?: 'SourceType', id: string, name: string, displayName: string } | null, trackRecords: { __typename?: 'TrackRecordNodeList', totalCount: number, nodes: Array<{ __typename?: 'TrackRecordType', id: number, remoteId: string, trackerId: number, remoteUrl: string, title: string, status: number, lastChapterRead: number, totalChapters: number, score: number, displayScore: string, startDate: string, finishDate: string, tracker: { __typename?: 'TrackerType', icon: string, supportsTrackDeletion?: boolean | null, scores: Array, id: number, name: string, isLoggedIn: boolean, isTokenExpired: boolean, statuses: Array<{ __typename?: 'TrackStatusType', name: string, value: number }>, trackRecords: { __typename?: 'TrackRecordNodeList', nodes: Array<{ __typename?: 'TrackRecordType', id: number, remoteId: string, trackerId: number, remoteUrl: string, title: string, status: number, lastChapterRead: number, totalChapters: number, score: number, displayScore: string, startDate: string, finishDate: string }> } } }> } }; -export type FullExtensionFieldsFragment = { __typename?: 'ExtensionType', apkName: string, repo?: string | null, hasUpdate: boolean, iconUrl: string, isInstalled: boolean, isNsfw: boolean, isObsolete: boolean, lang: string, name: string, pkgName: string, versionCode: number, versionName: string }; - export type AboutWebuiFragment = { __typename?: 'AboutWebUI', channel: string, tag: string }; export type WebuiUpdateCheckFragment = { __typename?: 'WebUIUpdateCheck', channel: string, tag: string, updateAvailable: boolean }; @@ -2634,6 +2632,8 @@ export type ChapterUpdateListFieldsFragment = { __typename?: 'ChapterType', fetc export type DownloadStatusFieldsFragment = { __typename?: 'DownloadStatus', state: DownloaderState, queue: Array<{ __typename?: 'DownloadType', progress: number, state: DownloadState, tries: number, chapter: { __typename?: 'ChapterType', id: number, name: string, sourceOrder: number, isDownloaded: boolean }, manga: { __typename?: 'MangaType', id: number, title: string, downloadCount: number } }> }; +export type ExtensionListFieldsFragment = { __typename?: 'ExtensionType', pkgName: string, name: string, lang: string, versionCode: number, versionName: string, iconUrl: string, repo?: string | null, isNsfw: boolean, isInstalled: boolean, isObsolete: boolean, hasUpdate: boolean }; + export type SourceBaseFieldsFragment = { __typename?: 'SourceType', id: string, name: string, displayName: string }; export type SourceMigratableFieldsFragment = { __typename?: 'SourceType', lang: string, iconUrl: string, id: string, name: string, displayName: string }; @@ -2862,28 +2862,28 @@ export type GetExtensionsFetchMutationVariables = Exact<{ }>; -export type GetExtensionsFetchMutation = { __typename?: 'Mutation', fetchExtensions?: { __typename?: 'FetchExtensionsPayload', clientMutationId?: string | null, extensions: Array<{ __typename?: 'ExtensionType', apkName: string, repo?: string | null, hasUpdate: boolean, iconUrl: string, isInstalled: boolean, isNsfw: boolean, isObsolete: boolean, lang: string, name: string, pkgName: string, versionCode: number, versionName: string }> } | null }; +export type GetExtensionsFetchMutation = { __typename?: 'Mutation', fetchExtensions?: { __typename?: 'FetchExtensionsPayload', clientMutationId?: string | null, extensions: Array<{ __typename?: 'ExtensionType', pkgName: string, name: string, lang: string, versionCode: number, versionName: string, iconUrl: string, repo?: string | null, isNsfw: boolean, isInstalled: boolean, isObsolete: boolean, hasUpdate: boolean }> } | null }; export type UpdateExtensionMutationVariables = Exact<{ input: UpdateExtensionInput; }>; -export type UpdateExtensionMutation = { __typename?: 'Mutation', updateExtension?: { __typename?: 'UpdateExtensionPayload', clientMutationId?: string | null, extension?: { __typename?: 'ExtensionType', pkgName: string, apkName: string, repo?: string | null, versionName: string, versionCode: number, isInstalled: boolean, isObsolete: boolean, hasUpdate: boolean } | null } | null }; +export type UpdateExtensionMutation = { __typename?: 'Mutation', updateExtension?: { __typename?: 'UpdateExtensionPayload', clientMutationId?: string | null, extension?: { __typename?: 'ExtensionType', pkgName: string, name: string, lang: string, versionCode: number, versionName: string, iconUrl: string, repo?: string | null, isNsfw: boolean, isInstalled: boolean, isObsolete: boolean, hasUpdate: boolean } | null } | null }; export type UpdateExtensionsMutationVariables = Exact<{ input: UpdateExtensionsInput; }>; -export type UpdateExtensionsMutation = { __typename?: 'Mutation', updateExtensions?: { __typename?: 'UpdateExtensionsPayload', clientMutationId?: string | null, extensions: Array<{ __typename?: 'ExtensionType', pkgName: string, apkName: string, repo?: string | null, versionName: string, versionCode: number, isInstalled: boolean, isObsolete: boolean, hasUpdate: boolean }> } | null }; +export type UpdateExtensionsMutation = { __typename?: 'Mutation', updateExtensions?: { __typename?: 'UpdateExtensionsPayload', clientMutationId?: string | null, extensions: Array<{ __typename?: 'ExtensionType', pkgName: string, name: string, lang: string, versionCode: number, versionName: string, iconUrl: string, repo?: string | null, isNsfw: boolean, isInstalled: boolean, isObsolete: boolean, hasUpdate: boolean }> } | null }; export type InstallExternalExtensionMutationVariables = Exact<{ file: Scalars['Upload']['input']; }>; -export type InstallExternalExtensionMutation = { __typename?: 'Mutation', installExternalExtension?: { __typename?: 'InstallExternalExtensionPayload', clientMutationId?: string | null, extension: { __typename?: 'ExtensionType', apkName: string, repo?: string | null, hasUpdate: boolean, iconUrl: string, isInstalled: boolean, isNsfw: boolean, isObsolete: boolean, lang: string, name: string, pkgName: string, versionCode: number, versionName: string } } | null }; +export type InstallExternalExtensionMutation = { __typename?: 'Mutation', installExternalExtension?: { __typename?: 'InstallExternalExtensionPayload', clientMutationId?: string | null, extension: { __typename?: 'ExtensionType', pkgName: string, name: string, lang: string, versionCode: number, versionName: string, iconUrl: string, repo?: string | null, isNsfw: boolean, isInstalled: boolean, isObsolete: boolean, hasUpdate: boolean } } | null }; export type DeleteGlobalMetadataMutationVariables = Exact<{ input: DeleteGlobalMetaInput; @@ -3214,13 +3214,6 @@ export type GetDownloadStatusQueryVariables = Exact<{ [key: string]: never; }>; export type GetDownloadStatusQuery = { __typename?: 'Query', downloadStatus: { __typename?: 'DownloadStatus', state: DownloaderState, queue: Array<{ __typename?: 'DownloadType', progress: number, state: DownloadState, tries: number, chapter: { __typename?: 'ChapterType', id: number, name: string, sourceOrder: number, isDownloaded: boolean }, manga: { __typename?: 'MangaType', id: number, title: string, downloadCount: number } }> } }; -export type GetExtensionQueryVariables = Exact<{ - pkgName: Scalars['String']['input']; -}>; - - -export type GetExtensionQuery = { __typename?: 'Query', extension: { __typename?: 'ExtensionType', apkName: string, repo?: string | null, hasUpdate: boolean, iconUrl: string, isInstalled: boolean, isNsfw: boolean, isObsolete: boolean, lang: string, name: string, pkgName: string, versionCode: number, versionName: string } }; - export type GetExtensionsQueryVariables = Exact<{ after?: InputMaybe; before?: InputMaybe; @@ -3234,7 +3227,7 @@ export type GetExtensionsQueryVariables = Exact<{ }>; -export type GetExtensionsQuery = { __typename?: 'Query', extensions: { __typename?: 'ExtensionNodeList', totalCount: number, nodes: Array<{ __typename?: 'ExtensionType', apkName: string, repo?: string | null, hasUpdate: boolean, iconUrl: string, isInstalled: boolean, isNsfw: boolean, isObsolete: boolean, lang: string, name: string, pkgName: string, versionCode: number, versionName: string }>, pageInfo: { __typename?: 'PageInfo', endCursor?: string | null, hasNextPage: boolean, hasPreviousPage: boolean, startCursor?: string | null } } }; +export type GetExtensionsQuery = { __typename?: 'Query', extensions: { __typename?: 'ExtensionNodeList', totalCount: number, nodes: Array<{ __typename?: 'ExtensionType', pkgName: string, name: string, lang: string, versionCode: number, versionName: string, iconUrl: string, repo?: string | null, isNsfw: boolean, isInstalled: boolean, isObsolete: boolean, hasUpdate: boolean }>, pageInfo: { __typename?: 'PageInfo', endCursor?: string | null, hasNextPage: boolean, hasPreviousPage: boolean, startCursor?: string | null } } }; export type GetGlobalMetadataQueryVariables = Exact<{ key: Scalars['String']['input']; diff --git a/src/lib/graphql/mutations/ExtensionMutation.ts b/src/lib/graphql/mutations/ExtensionMutation.ts index 231b6180..04c55d6b 100644 --- a/src/lib/graphql/mutations/ExtensionMutation.ts +++ b/src/lib/graphql/mutations/ExtensionMutation.ts @@ -7,64 +7,56 @@ */ import gql from 'graphql-tag'; -import { FULL_EXTENSION_FIELDS } from '@/lib/graphql/Fragments'; +import { EXTENSION_LIST_FIELDS } from '@/lib/graphql/fragments/ExtensionFragments.ts'; // makes the server fetch and return the latest extensions export const GET_EXTENSIONS_FETCH = gql` - ${FULL_EXTENSION_FIELDS} + ${EXTENSION_LIST_FIELDS} + mutation GET_EXTENSIONS_FETCH($input: FetchExtensionsInput = {}) { fetchExtensions(input: $input) { clientMutationId extensions { - ...FULL_EXTENSION_FIELDS + ...EXTENSION_LIST_FIELDS } } } `; export const UPDATE_EXTENSION = gql` + ${EXTENSION_LIST_FIELDS} + mutation UPDATE_EXTENSION($input: UpdateExtensionInput!) { updateExtension(input: $input) { clientMutationId extension { - pkgName - apkName - repo - versionName - versionCode - isInstalled - isObsolete - hasUpdate + ...EXTENSION_LIST_FIELDS } } } `; export const UPDATE_EXTENSIONS = gql` + ${EXTENSION_LIST_FIELDS} + mutation UPDATE_EXTENSIONS($input: UpdateExtensionsInput!) { updateExtensions(input: $input) { clientMutationId extensions { - pkgName - apkName - repo - versionName - versionCode - isInstalled - isObsolete - hasUpdate + ...EXTENSION_LIST_FIELDS } } } `; export const INSTALL_EXTERNAL_EXTENSION = gql` - ${FULL_EXTENSION_FIELDS} + ${EXTENSION_LIST_FIELDS} + mutation INSTALL_EXTERNAL_EXTENSION($file: Upload!) { installExternalExtension(input: { extensionFile: $file }) { clientMutationId extension { - ...FULL_EXTENSION_FIELDS + ...EXTENSION_LIST_FIELDS } } } diff --git a/src/lib/graphql/queries/ExtensionQuery.ts b/src/lib/graphql/queries/ExtensionQuery.ts index 16d4184d..ed50779a 100644 --- a/src/lib/graphql/queries/ExtensionQuery.ts +++ b/src/lib/graphql/queries/ExtensionQuery.ts @@ -7,22 +7,14 @@ */ import gql from 'graphql-tag'; -import { FULL_EXTENSION_FIELDS, PAGE_INFO } from '@/lib/graphql/Fragments'; - -// returns the current extension from the database -export const GET_EXTENSION = gql` - ${FULL_EXTENSION_FIELDS} - query GET_EXTENSION($pkgName: String!) { - extension(pkgName: $pkgName) { - ...FULL_EXTENSION_FIELDS - } - } -`; +import { PAGE_INFO } from '@/lib/graphql/Fragments'; +import { EXTENSION_LIST_FIELDS } from '@/lib/graphql/fragments/ExtensionFragments.ts'; // returns the current extensions from the database export const GET_EXTENSIONS = gql` - ${FULL_EXTENSION_FIELDS} + ${EXTENSION_LIST_FIELDS} ${PAGE_INFO} + query GET_EXTENSIONS( $after: Cursor $before: Cursor @@ -46,7 +38,7 @@ export const GET_EXTENSIONS = gql` orderByType: $orderByType ) { nodes { - ...FULL_EXTENSION_FIELDS + ...EXTENSION_LIST_FIELDS } pageInfo { ...PAGE_INFO diff --git a/src/lib/requests/RequestManager.ts b/src/lib/requests/RequestManager.ts index c5fb6dd1..975f7bd1 100644 --- a/src/lib/requests/RequestManager.ts +++ b/src/lib/requests/RequestManager.ts @@ -283,7 +283,7 @@ import { DOWNLOAD_STATUS_SUBSCRIPTION } from '@/lib/graphql/subscriptions/Downlo import { UPDATER_SUBSCRIPTION } from '@/lib/graphql/subscriptions/UpdaterSubscription.ts'; import { GET_SERVER_SETTINGS } from '@/lib/graphql/queries/SettingsQuery.ts'; import { UPDATE_SERVER_SETTINGS } from '@/lib/graphql/mutations/SettingsMutation.ts'; -import { BASE_MANGA_FIELDS, FULL_EXTENSION_FIELDS, GLOBAL_METADATA } from '@/lib/graphql/Fragments.ts'; +import { BASE_MANGA_FIELDS, GLOBAL_METADATA } from '@/lib/graphql/Fragments.ts'; import { CLEAR_SERVER_CACHE } from '@/lib/graphql/mutations/ImageMutation.ts'; import { RESET_WEBUI_UPDATE_STATUS, UPDATE_WEBUI } from '@/lib/graphql/mutations/ServerInfoMutation.ts'; import { WEBUI_UPDATE_SUBSCRIPTION } from '@/lib/graphql/subscriptions/ServerInfoSubscription.ts'; @@ -303,6 +303,7 @@ import { import { ControlledPromise } from '@/lib/ControlledPromise.ts'; import { MetadataMigrationSettings, TManga } from '@/typings.ts'; import { DOWNLOAD_STATUS_FIELDS } from '@/lib/graphql/fragments/DownloadFragments.ts'; +import { EXTENSION_LIST_FIELDS } from '@/lib/graphql/fragments/ExtensionFragments.ts'; enum GQLMethod { QUERY = 'QUERY', @@ -1181,7 +1182,7 @@ export class RequestManager { >['extensions'][0] >({ id: this.graphQLClient.client.cache.identify(extension), - fragment: FULL_EXTENSION_FIELDS, + fragment: EXTENSION_LIST_FIELDS, }) ?? extension, ), }, diff --git a/src/screens/Extensions.tsx b/src/screens/Extensions.tsx index 36d57e76..03aaefa9 100644 --- a/src/screens/Extensions.tsx +++ b/src/screens/Extensions.tsx @@ -25,6 +25,7 @@ import { GroupedExtensions, GroupedExtensionsResult, isExtensionStateOrLanguage, + TExtension, translateExtensionLanguage, } from '@/screens/util/Extensions'; import { AppbarSearch } from '@/components/util/AppbarSearch'; @@ -32,7 +33,6 @@ import { LoadingPlaceholder } from '@/components/util/LoadingPlaceholder'; import { makeToaster } from '@/components/util/Toast'; import { LangSelect } from '@/components/navbar/action/LangSelect'; import { ExtensionCard } from '@/components/ExtensionCard'; -import { PartialExtension } from '@/typings.ts'; import { NavBarContext } from '@/components/context/NavbarContext.tsx'; import { StyledGroupedVirtuoso } from '@/components/virtuoso/StyledGroupedVirtuoso.tsx'; import { StyledGroupHeader } from '@/components/virtuoso/StyledGroupHeader.tsx'; @@ -44,7 +44,7 @@ import { MediaQuery } from '@/lib/ui/MediaQuery.tsx'; const LANGUAGE = 0; const EXTENSIONS = 1; -function getExtensionsInfo(extensions: PartialExtension[]): { +function getExtensionsInfo(extensions: TExtension[]): { allLangs: string[]; groupedExtensions: GroupedExtensionsResult; } { diff --git a/src/screens/util/Extensions.ts b/src/screens/util/Extensions.ts index 5d83890c..dc931602 100644 --- a/src/screens/util/Extensions.ts +++ b/src/screens/util/Extensions.ts @@ -7,8 +7,9 @@ */ import { t } from 'i18next'; -import { PartialExtension, TranslationKey } from '@/typings'; +import { TranslationKey } from '@/typings'; import { DefaultLanguage, langCodeToName } from '@/util/language'; +import { ExtensionType } from '@/lib/graphql/generated/graphql.ts'; export enum ExtensionState { INSTALLED = 'INSTALLED', @@ -16,16 +17,31 @@ export enum ExtensionState { OBSOLETE = 'OBSOLETE', } -export type GroupedExtensionsResult = [KEY, PartialExtension[]][]; +export type TExtension = Pick< + ExtensionType, + | 'pkgName' + | 'name' + | 'lang' + | 'versionCode' + | 'versionName' + | 'iconUrl' + | 'repo' + | 'isNsfw' + | 'isInstalled' + | 'isObsolete' + | 'hasUpdate' +>; + +export type GroupedExtensionsResult = [KEY, TExtension[]][]; export type GroupedByExtensionState = { - [state in ExtensionState]: PartialExtension[]; + [state in ExtensionState]: TExtension[]; }; export type GroupedByLanguage = { - [language in DefaultLanguage]: PartialExtension[]; + [language in DefaultLanguage]: TExtension[]; } & { - [language: string]: PartialExtension[]; + [language: string]: TExtension[]; }; export type GroupedExtensions = GroupedByExtensionState & GroupedByLanguage; diff --git a/src/typings.ts b/src/typings.ts index 25063758..1017d85a 100644 --- a/src/typings.ts +++ b/src/typings.ts @@ -12,7 +12,6 @@ import { ParseKeys } from 'i18next'; import { Location } from 'react-router-dom'; import { GetChaptersReaderQuery, - GetExtensionQuery, GetMangaQuery, GetServerSettingsQuery, GetSourceBrowseQuery, @@ -32,8 +31,6 @@ declare module 'react-router-dom' { export type TranslationKey = ParseKeys; -export type PartialExtension = GetExtensionQuery['extension']; - export interface IPos { type: 'selectState' | 'textState' | 'checkBoxState' | 'triState' | 'sortState'; position: number; diff --git a/tools/scripts/codegenFormatter.ts b/tools/scripts/codegenFormatter.ts index a7ccd275..899a3ce4 100644 --- a/tools/scripts/codegenFormatter.ts +++ b/tools/scripts/codegenFormatter.ts @@ -41,7 +41,7 @@ const addImports = format( `import { FieldPolicy, FieldReadFunction, TypePolicies, TypePolicy } from '@apollo/client/cache';`, `import {FieldPolicy, FieldReadFunction, Reference, TypePolicies, TypePolicy} from '@apollo/client/cache'; import { -\tGetChaptersMangaQuery, GetDownloadStatusQueryVariables, GetExtensionQueryVariables, GetGlobalMetadataQueryVariables, +\tGetChaptersMangaQuery, GetDownloadStatusQueryVariables, GetGlobalMetadataQueryVariables, \tGetMangaQueryVariables, GetSourceBrowseQueryVariables, GetUpdateStatusQueryVariables, GetWebuiUpdateStatusQueryVariables, } from "@/lib/graphql/generated/graphql.ts"; import {FieldFunctionOptions} from "@apollo/client/cache/inmemory/policies";`, @@ -89,7 +89,7 @@ const fixTypingOfQueryTypePolicies = format( \tcheckForServerUpdates?: FieldPolicy | FieldReadFunction, \tcheckForWebUIUpdate?: FieldPolicy | FieldReadFunction, \tdownloadStatus?: FieldPolicy> | FieldReadFunction>, -\textension?: FieldPolicy> | FieldReadFunction>, +\textension?: FieldPolicy | FieldReadFunction, \textensions?: FieldPolicy | FieldReadFunction, \tgetWebUIUpdateStatus?: FieldPolicy> | FieldReadFunction>, \tlastUpdateTimestamp?: FieldPolicy | FieldReadFunction,