Feature/manga migration (#536)
* Add "migration" tab to "Browse" screen * Add missing useEffect cleanup for navbar title and actions * Make "SourceGridLayout" reusable * Add migration tab to "Browse" * Add migration logic
This commit is contained in:
@@ -78,6 +78,7 @@ export type ChapterIdInfo = Pick<TChapter, 'id'>;
|
||||
export type ChapterDownloadInfo = ChapterIdInfo & Pick<TChapter, 'isDownloaded'>;
|
||||
export type ChapterBookmarkInfo = ChapterIdInfo & Pick<TChapter, 'isBookmarked'>;
|
||||
export type ChapterReadInfo = ChapterIdInfo & Pick<TChapter, 'isRead'>;
|
||||
export type ChapterNumberInfo = ChapterIdInfo & Pick<TChapter, 'chapterNumber'>;
|
||||
|
||||
export class Chapters {
|
||||
static getIds(chapters: { id: number }[]): number[] {
|
||||
@@ -130,6 +131,23 @@ export class Chapters {
|
||||
return chapters.filter((chapter) => !Chapters.isRead(chapter));
|
||||
}
|
||||
|
||||
static getMatchingChapterNumberChapters<Chapter extends ChapterNumberInfo>(
|
||||
chaptersA: Chapter[],
|
||||
chaptersB: Chapter[],
|
||||
): [ChapterA: Chapter, ChapterB: Chapter][] {
|
||||
return chaptersA
|
||||
.map((chapterA) => {
|
||||
const matchingChapter = chaptersB.find((chapterB) => chapterA.chapterNumber === chapterB.chapterNumber);
|
||||
|
||||
if (!matchingChapter) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return [chapterA, matchingChapter];
|
||||
})
|
||||
.filter((matchingChapters) => matchingChapters !== null) as [Chapter, Chapter][];
|
||||
}
|
||||
|
||||
static async download(chapterIds: number[]): Promise<void> {
|
||||
return Chapters.executeAction(
|
||||
'download',
|
||||
|
||||
@@ -12,6 +12,8 @@ import { requestManager } from '@/lib/requests/RequestManager.ts';
|
||||
import {
|
||||
ChapterConditionInput,
|
||||
GetMangasChapterIdsWithStateQuery,
|
||||
GetMangaToMigrateQuery,
|
||||
GetMangaToMigrateToFetchMutation,
|
||||
UpdateMangaCategoriesPatchInput,
|
||||
} from '@/lib/graphql/generated/graphql.ts';
|
||||
import { Chapters } from '@/lib/data/Chapters.ts';
|
||||
@@ -23,7 +25,8 @@ export type MangaAction =
|
||||
| 'mark_as_read'
|
||||
| 'mark_as_unread'
|
||||
| 'remove_from_library'
|
||||
| 'change_categories';
|
||||
| 'change_categories'
|
||||
| 'migrate';
|
||||
|
||||
export const actionToTranslationKey: {
|
||||
[key in MangaAction]: {
|
||||
@@ -83,11 +86,38 @@ export const actionToTranslationKey: {
|
||||
success: 'manga.action.category.label.success',
|
||||
error: 'manga.action.category.label.error',
|
||||
},
|
||||
migrate: {
|
||||
action: {
|
||||
single: 'global.button.migrate',
|
||||
selected: 'global.button.migrate', // not supported
|
||||
},
|
||||
success: 'manga.action.migrate.label.success',
|
||||
error: 'manga.action.migrate.label.error',
|
||||
},
|
||||
};
|
||||
|
||||
export type MangaChapterCountInfo = { chapters: Pick<TManga['chapters'], 'totalCount'> };
|
||||
export type MangaDownloadInfo = Pick<TManga, 'downloadCount'> & MangaChapterCountInfo;
|
||||
export type MangaUnreadInfo = Pick<TManga, 'unreadCount'> & MangaChapterCountInfo;
|
||||
|
||||
export type MigrateMode = 'copy' | 'migrate';
|
||||
|
||||
type MarkAsReadOptions = { wasManuallyMarkedAsRead: boolean };
|
||||
type ChangeCategoriesOptions = { changeCategoriesPatch: UpdateMangaCategoriesPatchInput };
|
||||
type MigrateOptions = {
|
||||
mangaIdToMigrateTo: number;
|
||||
mode: MigrateMode;
|
||||
migrateChapters?: boolean;
|
||||
migrateCategories?: boolean;
|
||||
};
|
||||
type PerformActionOptions<Action extends MangaAction> = Action extends 'mark_as_read'
|
||||
? MarkAsReadOptions & PropertiesNever<ChangeCategoriesOptions> & PropertiesNever<MigrateOptions>
|
||||
: Action extends 'change_categories'
|
||||
? PropertiesNever<MarkAsReadOptions> & ChangeCategoriesOptions & PropertiesNever<MigrateOptions>
|
||||
: Action extends 'migrate'
|
||||
? PropertiesNever<MarkAsReadOptions> & PropertiesNever<ChangeCategoriesOptions> & MigrateOptions
|
||||
: Partial<MarkAsReadOptions> & Partial<ChangeCategoriesOptions> & Partial<MigrateOptions>;
|
||||
|
||||
export class Mangas {
|
||||
static getIds(mangas: { id: number }[]): number[] {
|
||||
return mangas.map((manga) => manga.id);
|
||||
@@ -185,6 +215,89 @@ export class Mangas {
|
||||
);
|
||||
}
|
||||
|
||||
private static async migrateChapters(
|
||||
mangaToMigrate: GetMangaToMigrateQuery['manga'],
|
||||
mangaToMigrateToInfo: GetMangaToMigrateToFetchMutation,
|
||||
): Promise<void> {
|
||||
if (!mangaToMigrate.chapters || !mangaToMigrateToInfo.fetchChapters?.chapters) {
|
||||
throw new Error('Chapters are missing');
|
||||
}
|
||||
|
||||
const chaptersToMigrate = mangaToMigrate.chapters.nodes;
|
||||
|
||||
const chaptersToMigrateTo = mangaToMigrateToInfo.fetchChapters?.chapters;
|
||||
const migratableChapters = Chapters.getMatchingChapterNumberChapters(chaptersToMigrate, chaptersToMigrateTo);
|
||||
|
||||
const readChapters: number[] = [];
|
||||
const bookmarkedChapters: number[] = [];
|
||||
|
||||
migratableChapters.forEach(([chapterToMigrate, chapterToMigrateTo]) => {
|
||||
const { isRead, isBookmarked } = chapterToMigrate;
|
||||
|
||||
if (isRead) {
|
||||
readChapters.push(chapterToMigrateTo.id);
|
||||
}
|
||||
|
||||
if (isBookmarked) {
|
||||
bookmarkedChapters.push(chapterToMigrateTo.id);
|
||||
}
|
||||
});
|
||||
|
||||
await Promise.all([
|
||||
requestManager.updateChapters(readChapters, { isRead: true }).response,
|
||||
requestManager.updateChapters(bookmarkedChapters, { isBookmarked: true }).response,
|
||||
]);
|
||||
}
|
||||
|
||||
private static async migrateCategories(
|
||||
mangaToMigrate: GetMangaToMigrateQuery['manga'],
|
||||
mangaToMigrateTo: GetMangaToMigrateToFetchMutation['fetchManga']['manga'],
|
||||
): Promise<void> {
|
||||
if (!mangaToMigrate?.categories) {
|
||||
throw new Error('Categories are missing');
|
||||
}
|
||||
|
||||
requestManager.updateMangasCategories([mangaToMigrateTo.id], {
|
||||
addToCategories: mangaToMigrate.categories.nodes.map((category) => category.id),
|
||||
});
|
||||
}
|
||||
|
||||
static async migrate(
|
||||
mangaId: number,
|
||||
mangaIdToMigrateTo: number,
|
||||
{ mode, migrateChapters, migrateCategories }: Omit<MigrateOptions, 'mangaIdToMigrateTo'>,
|
||||
): Promise<void> {
|
||||
return Mangas.executeAction('migrate', 1, async () => {
|
||||
const [{ data: mangaToMigrateData }, { data: mangaToMigrateToData }] = await Promise.all([
|
||||
requestManager.getMangaToMigrate(mangaId, { migrateChapters, migrateCategories }).response,
|
||||
requestManager.getMangaToMigrateToFetch(mangaIdToMigrateTo, { migrateChapters, migrateCategories })
|
||||
.response,
|
||||
]);
|
||||
|
||||
if (!mangaToMigrateData.manga || !mangaToMigrateToData?.fetchManga.manga) {
|
||||
throw new Error('Mangas::migrate: missing manga data');
|
||||
}
|
||||
|
||||
if (
|
||||
migrateChapters &&
|
||||
(!mangaToMigrateData.manga.chapters || !mangaToMigrateToData.fetchChapters?.chapters)
|
||||
) {
|
||||
throw new Error('Mangas::migrate: missing chapters data');
|
||||
}
|
||||
|
||||
await Promise.all([
|
||||
migrateChapters ? Mangas.migrateChapters(mangaToMigrateData.manga, mangaToMigrateToData) : undefined,
|
||||
migrateCategories
|
||||
? Mangas.migrateCategories(mangaToMigrateData.manga, mangaToMigrateToData.fetchManga.manga)
|
||||
: undefined,
|
||||
!mangaToMigrateToData.fetchManga.manga.inLibrary
|
||||
? requestManager.updateManga(mangaIdToMigrateTo, { inLibrary: true }).response
|
||||
: undefined,
|
||||
mode === 'migrate' ? requestManager.updateManga(mangaId, { inLibrary: false }).response : undefined,
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
||||
private static async executeAction(
|
||||
action: MangaAction,
|
||||
itemCount: number,
|
||||
@@ -205,11 +318,9 @@ export class Mangas {
|
||||
{
|
||||
wasManuallyMarkedAsRead,
|
||||
changeCategoriesPatch,
|
||||
}: Action extends 'mark_as_read'
|
||||
? { wasManuallyMarkedAsRead: boolean; changeCategoriesPatch?: never }
|
||||
: Action extends 'change_categories'
|
||||
? { wasManuallyMarkedAsRead?: never; changeCategoriesPatch: UpdateMangaCategoriesPatchInput }
|
||||
: { wasManuallyMarkedAsRead?: boolean; changeCategoriesPatch?: UpdateMangaCategoriesPatchInput },
|
||||
mangaIdToMigrateTo,
|
||||
...migrateOptions
|
||||
}: PerformActionOptions<Action>,
|
||||
): Promise<void> {
|
||||
switch (action) {
|
||||
case 'download':
|
||||
@@ -224,6 +335,9 @@ export class Mangas {
|
||||
return Mangas.removeFromLibrary(mangaIds);
|
||||
case 'change_categories':
|
||||
return Mangas.changeCategories(mangaIds, changeCategoriesPatch!);
|
||||
case 'migrate': {
|
||||
return Mangas.migrate(mangaIds[0], mangaIdToMigrateTo!, migrateOptions as unknown as MigrateOptions);
|
||||
}
|
||||
default:
|
||||
throw new Error(`Mangas::performAction: unknown action "${action}"`);
|
||||
}
|
||||
|
||||
@@ -508,7 +508,7 @@ export type PageInfoFieldPolicy = {
|
||||
hasPreviousPage?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
startCursor?: FieldPolicy<any> | FieldReadFunction<any>
|
||||
};
|
||||
export type PartialSettingsTypeKeySpecifier = ('autoDownloadAheadLimit' | 'autoDownloadNewChapters' | 'backupInterval' | 'backupPath' | 'backupTTL' | 'backupTime' | 'basicAuthEnabled' | 'basicAuthPassword' | 'basicAuthUsername' | 'debugLogsEnabled' | 'downloadAsCbz' | 'downloadsPath' | 'electronPath' | 'excludeCompleted' | 'excludeEntryWithUnreadChapters' | 'excludeNotStarted' | 'excludeUnreadChapters' | 'extensionRepos' | 'globalUpdateInterval' | 'gqlDebugLogsEnabled' | 'initialOpenInBrowserEnabled' | 'ip' | 'localSourcePath' | 'maxSourcesInParallel' | 'port' | 'socksProxyEnabled' | 'socksProxyHost' | 'socksProxyPort' | 'systemTrayEnabled' | 'updateMangas' | 'webUIChannel' | 'webUIFlavor' | 'webUIInterface' | 'webUIUpdateCheckInterval' | PartialSettingsTypeKeySpecifier)[];
|
||||
export type PartialSettingsTypeKeySpecifier = ('autoDownloadAheadLimit' | 'autoDownloadNewChapters' | 'backupInterval' | 'backupPath' | 'backupTTL' | 'backupTime' | 'basicAuthEnabled' | 'basicAuthPassword' | 'basicAuthUsername' | 'debugLogsEnabled' | 'downloadAsCbz' | 'downloadsPath' | 'electronPath' | 'excludeCompleted' | 'excludeEntryWithUnreadChapters' | 'excludeNotStarted' | 'excludeUnreadChapters' | 'extensionRepos' | 'flareSolverrEnabled' | 'flareSolverrSessionName' | 'flareSolverrSessionTtl' | 'flareSolverrTimeout' | 'flareSolverrUrl' | 'globalUpdateInterval' | 'gqlDebugLogsEnabled' | 'initialOpenInBrowserEnabled' | 'ip' | 'localSourcePath' | 'maxSourcesInParallel' | 'port' | 'socksProxyEnabled' | 'socksProxyHost' | 'socksProxyPort' | 'systemTrayEnabled' | 'updateMangas' | 'webUIChannel' | 'webUIFlavor' | 'webUIInterface' | 'webUIUpdateCheckInterval' | PartialSettingsTypeKeySpecifier)[];
|
||||
export type PartialSettingsTypeFieldPolicy = {
|
||||
autoDownloadAheadLimit?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
autoDownloadNewChapters?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
@@ -528,6 +528,11 @@ export type PartialSettingsTypeFieldPolicy = {
|
||||
excludeNotStarted?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
excludeUnreadChapters?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
extensionRepos?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
flareSolverrEnabled?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
flareSolverrSessionName?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
flareSolverrSessionTtl?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
flareSolverrTimeout?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
flareSolverrUrl?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
globalUpdateInterval?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
gqlDebugLogsEnabled?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
initialOpenInBrowserEnabled?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
@@ -631,7 +636,7 @@ export type SetSettingsPayloadFieldPolicy = {
|
||||
clientMutationId?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
settings?: FieldPolicy<any> | FieldReadFunction<any>
|
||||
};
|
||||
export type SettingsKeySpecifier = ('autoDownloadAheadLimit' | 'autoDownloadNewChapters' | 'backupInterval' | 'backupPath' | 'backupTTL' | 'backupTime' | 'basicAuthEnabled' | 'basicAuthPassword' | 'basicAuthUsername' | 'debugLogsEnabled' | 'downloadAsCbz' | 'downloadsPath' | 'electronPath' | 'excludeCompleted' | 'excludeEntryWithUnreadChapters' | 'excludeNotStarted' | 'excludeUnreadChapters' | 'extensionRepos' | 'globalUpdateInterval' | 'gqlDebugLogsEnabled' | 'initialOpenInBrowserEnabled' | 'ip' | 'localSourcePath' | 'maxSourcesInParallel' | 'port' | 'socksProxyEnabled' | 'socksProxyHost' | 'socksProxyPort' | 'systemTrayEnabled' | 'updateMangas' | 'webUIChannel' | 'webUIFlavor' | 'webUIInterface' | 'webUIUpdateCheckInterval' | SettingsKeySpecifier)[];
|
||||
export type SettingsKeySpecifier = ('autoDownloadAheadLimit' | 'autoDownloadNewChapters' | 'backupInterval' | 'backupPath' | 'backupTTL' | 'backupTime' | 'basicAuthEnabled' | 'basicAuthPassword' | 'basicAuthUsername' | 'debugLogsEnabled' | 'downloadAsCbz' | 'downloadsPath' | 'electronPath' | 'excludeCompleted' | 'excludeEntryWithUnreadChapters' | 'excludeNotStarted' | 'excludeUnreadChapters' | 'extensionRepos' | 'flareSolverrEnabled' | 'flareSolverrSessionName' | 'flareSolverrSessionTtl' | 'flareSolverrTimeout' | 'flareSolverrUrl' | 'globalUpdateInterval' | 'gqlDebugLogsEnabled' | 'initialOpenInBrowserEnabled' | 'ip' | 'localSourcePath' | 'maxSourcesInParallel' | 'port' | 'socksProxyEnabled' | 'socksProxyHost' | 'socksProxyPort' | 'systemTrayEnabled' | 'updateMangas' | 'webUIChannel' | 'webUIFlavor' | 'webUIInterface' | 'webUIUpdateCheckInterval' | SettingsKeySpecifier)[];
|
||||
export type SettingsFieldPolicy = {
|
||||
autoDownloadAheadLimit?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
autoDownloadNewChapters?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
@@ -651,6 +656,11 @@ export type SettingsFieldPolicy = {
|
||||
excludeNotStarted?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
excludeUnreadChapters?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
extensionRepos?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
flareSolverrEnabled?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
flareSolverrSessionName?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
flareSolverrSessionTtl?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
flareSolverrTimeout?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
flareSolverrUrl?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
globalUpdateInterval?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
gqlDebugLogsEnabled?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
initialOpenInBrowserEnabled?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
@@ -668,7 +678,7 @@ export type SettingsFieldPolicy = {
|
||||
webUIInterface?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
webUIUpdateCheckInterval?: FieldPolicy<any> | FieldReadFunction<any>
|
||||
};
|
||||
export type SettingsTypeKeySpecifier = ('autoDownloadAheadLimit' | 'autoDownloadNewChapters' | 'backupInterval' | 'backupPath' | 'backupTTL' | 'backupTime' | 'basicAuthEnabled' | 'basicAuthPassword' | 'basicAuthUsername' | 'debugLogsEnabled' | 'downloadAsCbz' | 'downloadsPath' | 'electronPath' | 'excludeCompleted' | 'excludeEntryWithUnreadChapters' | 'excludeNotStarted' | 'excludeUnreadChapters' | 'extensionRepos' | 'globalUpdateInterval' | 'gqlDebugLogsEnabled' | 'initialOpenInBrowserEnabled' | 'ip' | 'localSourcePath' | 'maxSourcesInParallel' | 'port' | 'socksProxyEnabled' | 'socksProxyHost' | 'socksProxyPort' | 'systemTrayEnabled' | 'updateMangas' | 'webUIChannel' | 'webUIFlavor' | 'webUIInterface' | 'webUIUpdateCheckInterval' | SettingsTypeKeySpecifier)[];
|
||||
export type SettingsTypeKeySpecifier = ('autoDownloadAheadLimit' | 'autoDownloadNewChapters' | 'backupInterval' | 'backupPath' | 'backupTTL' | 'backupTime' | 'basicAuthEnabled' | 'basicAuthPassword' | 'basicAuthUsername' | 'debugLogsEnabled' | 'downloadAsCbz' | 'downloadsPath' | 'electronPath' | 'excludeCompleted' | 'excludeEntryWithUnreadChapters' | 'excludeNotStarted' | 'excludeUnreadChapters' | 'extensionRepos' | 'flareSolverrEnabled' | 'flareSolverrSessionName' | 'flareSolverrSessionTtl' | 'flareSolverrTimeout' | 'flareSolverrUrl' | 'globalUpdateInterval' | 'gqlDebugLogsEnabled' | 'initialOpenInBrowserEnabled' | 'ip' | 'localSourcePath' | 'maxSourcesInParallel' | 'port' | 'socksProxyEnabled' | 'socksProxyHost' | 'socksProxyPort' | 'systemTrayEnabled' | 'updateMangas' | 'webUIChannel' | 'webUIFlavor' | 'webUIInterface' | 'webUIUpdateCheckInterval' | SettingsTypeKeySpecifier)[];
|
||||
export type SettingsTypeFieldPolicy = {
|
||||
autoDownloadAheadLimit?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
autoDownloadNewChapters?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
@@ -688,6 +698,11 @@ export type SettingsTypeFieldPolicy = {
|
||||
excludeNotStarted?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
excludeUnreadChapters?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
extensionRepos?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
flareSolverrEnabled?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
flareSolverrSessionName?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
flareSolverrSessionTtl?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
flareSolverrTimeout?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
flareSolverrUrl?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
globalUpdateInterval?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
gqlDebugLogsEnabled?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
initialOpenInBrowserEnabled?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
@@ -785,7 +800,7 @@ export type TrackRecordNodeListFieldPolicy = {
|
||||
pageInfo?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
totalCount?: FieldPolicy<any> | FieldReadFunction<any>
|
||||
};
|
||||
export type TrackRecordTypeKeySpecifier = ('displayScore' | 'finishDate' | 'id' | 'lastChapterRead' | 'libraryId' | 'manga' | 'mangaId' | 'remoteId' | 'remoteUrl' | 'score' | 'startDate' | 'status' | 'syncId' | 'title' | 'totalChapters' | 'tracker' | TrackRecordTypeKeySpecifier)[];
|
||||
export type TrackRecordTypeKeySpecifier = ('displayScore' | 'finishDate' | 'id' | 'lastChapterRead' | 'libraryId' | 'manga' | 'mangaId' | 'remoteId' | 'remoteUrl' | 'score' | 'startDate' | 'status' | 'title' | 'totalChapters' | 'tracker' | 'trackerId' | TrackRecordTypeKeySpecifier)[];
|
||||
export type TrackRecordTypeFieldPolicy = {
|
||||
displayScore?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
finishDate?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
@@ -799,25 +814,31 @@ export type TrackRecordTypeFieldPolicy = {
|
||||
score?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
startDate?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
status?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
syncId?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
title?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
totalChapters?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
tracker?: FieldPolicy<any> | FieldReadFunction<any>
|
||||
};
|
||||
export type TrackSearchTypeKeySpecifier = ('coverUrl' | 'mediaId' | 'publishingStatus' | 'publishingType' | 'startDate' | 'summary' | 'syncId' | 'title' | 'totalChapters' | 'tracker' | 'trackingUrl' | TrackSearchTypeKeySpecifier)[];
|
||||
export type TrackSearchTypeFieldPolicy = {
|
||||
coverUrl?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
mediaId?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
publishingStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
publishingType?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
startDate?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
summary?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
syncId?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
title?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
totalChapters?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
tracker?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
trackerId?: FieldPolicy<any> | FieldReadFunction<any>
|
||||
};
|
||||
export type TrackSearchTypeKeySpecifier = ('coverUrl' | 'id' | 'publishingStatus' | 'publishingType' | 'remoteId' | 'startDate' | 'summary' | 'title' | 'totalChapters' | 'tracker' | 'trackerId' | 'trackingUrl' | TrackSearchTypeKeySpecifier)[];
|
||||
export type TrackSearchTypeFieldPolicy = {
|
||||
coverUrl?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
id?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
publishingStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
publishingType?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
remoteId?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
startDate?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
summary?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
title?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
totalChapters?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
tracker?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
trackerId?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
trackingUrl?: FieldPolicy<any> | FieldReadFunction<any>
|
||||
};
|
||||
export type TrackStatusTypeKeySpecifier = ('name' | 'value' | TrackStatusTypeKeySpecifier)[];
|
||||
export type TrackStatusTypeFieldPolicy = {
|
||||
name?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
value?: FieldPolicy<any> | FieldReadFunction<any>
|
||||
};
|
||||
export type TrackerEdgeKeySpecifier = ('cursor' | 'node' | TrackerEdgeKeySpecifier)[];
|
||||
export type TrackerEdgeFieldPolicy = {
|
||||
cursor?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
@@ -830,13 +851,15 @@ export type TrackerNodeListFieldPolicy = {
|
||||
pageInfo?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
totalCount?: FieldPolicy<any> | FieldReadFunction<any>
|
||||
};
|
||||
export type TrackerTypeKeySpecifier = ('authUrl' | 'icon' | 'id' | 'isLoggedIn' | 'name' | 'trackRecords' | TrackerTypeKeySpecifier)[];
|
||||
export type TrackerTypeKeySpecifier = ('authUrl' | 'icon' | 'id' | 'isLoggedIn' | 'name' | 'scores' | 'statuses' | 'trackRecords' | TrackerTypeKeySpecifier)[];
|
||||
export type TrackerTypeFieldPolicy = {
|
||||
authUrl?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
icon?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
id?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
isLoggedIn?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
name?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
scores?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
statuses?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||
trackRecords?: FieldPolicy<any> | FieldReadFunction<any>
|
||||
};
|
||||
export type TriStateFilterKeySpecifier = ('default' | 'name' | TriStateFilterKeySpecifier)[];
|
||||
@@ -1351,6 +1374,10 @@ export type StrictTypedTypePolicies = {
|
||||
keyFields?: false | TrackSearchTypeKeySpecifier | (() => undefined | TrackSearchTypeKeySpecifier),
|
||||
fields?: TrackSearchTypeFieldPolicy,
|
||||
},
|
||||
TrackStatusType?: Omit<TypePolicy, "fields" | "keyFields"> & {
|
||||
keyFields?: false | TrackStatusTypeKeySpecifier | (() => undefined | TrackStatusTypeKeySpecifier),
|
||||
fields?: TrackStatusTypeFieldPolicy,
|
||||
},
|
||||
TrackerEdge?: Omit<TypePolicy, "fields" | "keyFields"> & {
|
||||
keyFields?: false | TrackerEdgeKeySpecifier | (() => undefined | TrackerEdgeKeySpecifier),
|
||||
fields?: TrackerEdgeFieldPolicy,
|
||||
|
||||
@@ -52,7 +52,8 @@ export type BackupRestoreStatus = {
|
||||
export type BindTrackInput = {
|
||||
clientMutationId?: InputMaybe<Scalars['String']['input']>;
|
||||
mangaId: Scalars['Int']['input'];
|
||||
track: TrackSearchTypeInput;
|
||||
remoteId: Scalars['LongString']['input'];
|
||||
trackerId: Scalars['Int']['input'];
|
||||
};
|
||||
|
||||
export type BindTrackPayload = {
|
||||
@@ -1369,6 +1370,11 @@ export type PartialSettingsType = Settings & {
|
||||
excludeNotStarted?: Maybe<Scalars['Boolean']['output']>;
|
||||
excludeUnreadChapters?: Maybe<Scalars['Boolean']['output']>;
|
||||
extensionRepos?: Maybe<Array<Scalars['String']['output']>>;
|
||||
flareSolverrEnabled?: Maybe<Scalars['Boolean']['output']>;
|
||||
flareSolverrSessionName?: Maybe<Scalars['String']['output']>;
|
||||
flareSolverrSessionTtl?: Maybe<Scalars['Int']['output']>;
|
||||
flareSolverrTimeout?: Maybe<Scalars['Int']['output']>;
|
||||
flareSolverrUrl?: Maybe<Scalars['String']['output']>;
|
||||
globalUpdateInterval?: Maybe<Scalars['Float']['output']>;
|
||||
gqlDebugLogsEnabled?: Maybe<Scalars['Boolean']['output']>;
|
||||
initialOpenInBrowserEnabled?: Maybe<Scalars['Boolean']['output']>;
|
||||
@@ -1406,6 +1412,11 @@ export type PartialSettingsTypeInput = {
|
||||
excludeNotStarted?: InputMaybe<Scalars['Boolean']['input']>;
|
||||
excludeUnreadChapters?: InputMaybe<Scalars['Boolean']['input']>;
|
||||
extensionRepos?: InputMaybe<Array<Scalars['String']['input']>>;
|
||||
flareSolverrEnabled?: InputMaybe<Scalars['Boolean']['input']>;
|
||||
flareSolverrSessionName?: InputMaybe<Scalars['String']['input']>;
|
||||
flareSolverrSessionTtl?: InputMaybe<Scalars['Int']['input']>;
|
||||
flareSolverrTimeout?: InputMaybe<Scalars['Int']['input']>;
|
||||
flareSolverrUrl?: InputMaybe<Scalars['String']['input']>;
|
||||
globalUpdateInterval?: InputMaybe<Scalars['Float']['input']>;
|
||||
gqlDebugLogsEnabled?: InputMaybe<Scalars['Boolean']['input']>;
|
||||
initialOpenInBrowserEnabled?: InputMaybe<Scalars['Boolean']['input']>;
|
||||
@@ -1746,6 +1757,11 @@ export type Settings = {
|
||||
excludeNotStarted?: Maybe<Scalars['Boolean']['output']>;
|
||||
excludeUnreadChapters?: Maybe<Scalars['Boolean']['output']>;
|
||||
extensionRepos?: Maybe<Array<Scalars['String']['output']>>;
|
||||
flareSolverrEnabled?: Maybe<Scalars['Boolean']['output']>;
|
||||
flareSolverrSessionName?: Maybe<Scalars['String']['output']>;
|
||||
flareSolverrSessionTtl?: Maybe<Scalars['Int']['output']>;
|
||||
flareSolverrTimeout?: Maybe<Scalars['Int']['output']>;
|
||||
flareSolverrUrl?: Maybe<Scalars['String']['output']>;
|
||||
globalUpdateInterval?: Maybe<Scalars['Float']['output']>;
|
||||
gqlDebugLogsEnabled?: Maybe<Scalars['Boolean']['output']>;
|
||||
initialOpenInBrowserEnabled?: Maybe<Scalars['Boolean']['output']>;
|
||||
@@ -1784,6 +1800,11 @@ export type SettingsType = Settings & {
|
||||
excludeNotStarted: Scalars['Boolean']['output'];
|
||||
excludeUnreadChapters: Scalars['Boolean']['output'];
|
||||
extensionRepos: Array<Scalars['String']['output']>;
|
||||
flareSolverrEnabled: Scalars['Boolean']['output'];
|
||||
flareSolverrSessionName: Scalars['String']['output'];
|
||||
flareSolverrSessionTtl: Scalars['Int']['output'];
|
||||
flareSolverrTimeout: Scalars['Int']['output'];
|
||||
flareSolverrUrl: Scalars['String']['output'];
|
||||
globalUpdateInterval: Scalars['Float']['output'];
|
||||
gqlDebugLogsEnabled: Scalars['Boolean']['output'];
|
||||
initialOpenInBrowserEnabled: Scalars['Boolean']['output'];
|
||||
@@ -1983,9 +2004,9 @@ export type TrackRecordConditionInput = {
|
||||
score?: InputMaybe<Scalars['Float']['input']>;
|
||||
startDate?: InputMaybe<Scalars['LongString']['input']>;
|
||||
status?: InputMaybe<Scalars['Int']['input']>;
|
||||
syncId?: InputMaybe<Scalars['Int']['input']>;
|
||||
title?: InputMaybe<Scalars['String']['input']>;
|
||||
totalChapters?: InputMaybe<Scalars['Int']['input']>;
|
||||
trackerId?: InputMaybe<Scalars['Int']['input']>;
|
||||
};
|
||||
|
||||
export type TrackRecordEdge = Edge & {
|
||||
@@ -2008,9 +2029,9 @@ export type TrackRecordFilterInput = {
|
||||
score?: InputMaybe<DoubleFilterInput>;
|
||||
startDate?: InputMaybe<LongFilterInput>;
|
||||
status?: InputMaybe<IntFilterInput>;
|
||||
syncId?: InputMaybe<IntFilterInput>;
|
||||
title?: InputMaybe<StringFilterInput>;
|
||||
totalChapters?: InputMaybe<IntFilterInput>;
|
||||
trackerId?: InputMaybe<IntFilterInput>;
|
||||
};
|
||||
|
||||
export type TrackRecordNodeList = NodeList & {
|
||||
@@ -2029,9 +2050,9 @@ export enum TrackRecordOrderBy {
|
||||
RemoteId = 'REMOTE_ID',
|
||||
Score = 'SCORE',
|
||||
StartDate = 'START_DATE',
|
||||
SyncId = 'SYNC_ID',
|
||||
Title = 'TITLE',
|
||||
TotalChapters = 'TOTAL_CHAPTERS'
|
||||
TotalChapters = 'TOTAL_CHAPTERS',
|
||||
TrackerId = 'TRACKER_ID'
|
||||
}
|
||||
|
||||
export type TrackRecordType = {
|
||||
@@ -2048,38 +2069,32 @@ export type TrackRecordType = {
|
||||
score: Scalars['Float']['output'];
|
||||
startDate: Scalars['LongString']['output'];
|
||||
status: Scalars['Int']['output'];
|
||||
syncId: Scalars['Int']['output'];
|
||||
title: Scalars['String']['output'];
|
||||
totalChapters: Scalars['Int']['output'];
|
||||
tracker: TrackerType;
|
||||
trackerId: Scalars['Int']['output'];
|
||||
};
|
||||
|
||||
export type TrackSearchType = {
|
||||
__typename?: 'TrackSearchType';
|
||||
coverUrl: Scalars['String']['output'];
|
||||
mediaId: Scalars['LongString']['output'];
|
||||
id: Scalars['Int']['output'];
|
||||
publishingStatus: Scalars['String']['output'];
|
||||
publishingType: Scalars['String']['output'];
|
||||
remoteId: Scalars['LongString']['output'];
|
||||
startDate: Scalars['String']['output'];
|
||||
summary: Scalars['String']['output'];
|
||||
syncId: Scalars['Int']['output'];
|
||||
title: Scalars['String']['output'];
|
||||
totalChapters: Scalars['Int']['output'];
|
||||
tracker: TrackerType;
|
||||
trackerId: Scalars['Int']['output'];
|
||||
trackingUrl: Scalars['String']['output'];
|
||||
};
|
||||
|
||||
export type TrackSearchTypeInput = {
|
||||
coverUrl: Scalars['String']['input'];
|
||||
mediaId: Scalars['LongString']['input'];
|
||||
publishingStatus: Scalars['String']['input'];
|
||||
publishingType: Scalars['String']['input'];
|
||||
startDate: Scalars['String']['input'];
|
||||
summary: Scalars['String']['input'];
|
||||
syncId: Scalars['Int']['input'];
|
||||
title: Scalars['String']['input'];
|
||||
totalChapters: Scalars['Int']['input'];
|
||||
trackingUrl: Scalars['String']['input'];
|
||||
export type TrackStatusType = {
|
||||
__typename?: 'TrackStatusType';
|
||||
name: Scalars['String']['output'];
|
||||
value: Scalars['Int']['output'];
|
||||
};
|
||||
|
||||
export type TrackerConditionInput = {
|
||||
@@ -2116,6 +2131,8 @@ export type TrackerType = {
|
||||
id: Scalars['Int']['output'];
|
||||
isLoggedIn: Scalars['Boolean']['output'];
|
||||
name: Scalars['String']['output'];
|
||||
scores: Array<Scalars['String']['output']>;
|
||||
statuses: Array<TrackStatusType>;
|
||||
trackRecords: TrackRecordNodeList;
|
||||
};
|
||||
|
||||
@@ -2756,6 +2773,15 @@ export type GetMangaFetchMutationVariables = Exact<{
|
||||
|
||||
export type GetMangaFetchMutation = { __typename?: 'Mutation', fetchManga: { __typename?: 'FetchMangaPayload', clientMutationId?: string | null, manga: { __typename?: 'MangaType', unreadCount: number, downloadCount: number, artist?: string | null, author?: string | null, chaptersLastFetchedAt?: any | null, description?: string | null, genre: Array<string>, id: number, inLibrary: boolean, inLibraryAt: any, initialized: boolean, lastFetchedAt?: any | null, realUrl?: string | null, status: MangaStatus, thumbnailUrl?: string | null, title: string, url: string, lastReadChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestReadChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestFetchedChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestUploadedChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: 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', displayName: string, iconUrl: string, id: any, isConfigurable: boolean, isNsfw: boolean, lang: string, name: string, supportsLatest: boolean, extension: { __typename?: 'ExtensionType', pkgName: string, repo?: string | null } } | null } } };
|
||||
|
||||
export type GetMangaToMigrateToFetchMutationVariables = Exact<{
|
||||
id: Scalars['Int']['input'];
|
||||
migrateChapters: Scalars['Boolean']['input'];
|
||||
migrateCategories: Scalars['Boolean']['input'];
|
||||
}>;
|
||||
|
||||
|
||||
export type GetMangaToMigrateToFetchMutation = { __typename?: 'Mutation', fetchManga: { __typename?: 'FetchMangaPayload', clientMutationId?: string | null, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, categories?: { __typename?: 'CategoryNodeList', nodes: Array<{ __typename?: 'CategoryType', id: number }> } } }, fetchChapters?: { __typename?: 'FetchChaptersPayload', chapters: Array<{ __typename?: 'ChapterType', id: number, chapterNumber: number, isRead: boolean, isDownloaded: boolean, isBookmarked: boolean, manga: { __typename?: 'MangaType', id: number } }> } };
|
||||
|
||||
export type SetMangaMetadataMutationVariables = Exact<{
|
||||
input: SetMangaMetaInput;
|
||||
}>;
|
||||
@@ -2983,6 +3009,15 @@ export type GetMangaQueryVariables = Exact<{
|
||||
|
||||
export type GetMangaQuery = { __typename?: 'Query', manga: { __typename?: 'MangaType', unreadCount: number, downloadCount: number, artist?: string | null, author?: string | null, chaptersLastFetchedAt?: any | null, description?: string | null, genre: Array<string>, id: number, inLibrary: boolean, inLibraryAt: any, initialized: boolean, lastFetchedAt?: any | null, realUrl?: string | null, status: MangaStatus, thumbnailUrl?: string | null, title: string, url: string, lastReadChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestReadChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestFetchedChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestUploadedChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: 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', displayName: string, iconUrl: string, id: any, isConfigurable: boolean, isNsfw: boolean, lang: string, name: string, supportsLatest: boolean, extension: { __typename?: 'ExtensionType', pkgName: string, repo?: string | null } } | null } };
|
||||
|
||||
export type GetMangaToMigrateQueryVariables = Exact<{
|
||||
id: Scalars['Int']['input'];
|
||||
migrateChapters: Scalars['Boolean']['input'];
|
||||
migrateCategories: Scalars['Boolean']['input'];
|
||||
}>;
|
||||
|
||||
|
||||
export type GetMangaToMigrateQuery = { __typename?: 'Query', manga: { __typename?: 'MangaType', id: number, inLibrary: boolean, title: string, chapters?: { __typename?: 'ChapterNodeList', totalCount: number, nodes: Array<{ __typename?: 'ChapterType', id: number, chapterNumber: number, isRead: boolean, isDownloaded: boolean, isBookmarked: boolean, manga: { __typename?: 'MangaType', id: number } }> }, categories?: { __typename?: 'CategoryNodeList', nodes: Array<{ __typename?: 'CategoryType', id: number }> } } };
|
||||
|
||||
export type GetMangasQueryVariables = Exact<{
|
||||
after?: InputMaybe<Scalars['Cursor']['input']>;
|
||||
before?: InputMaybe<Scalars['Cursor']['input']>;
|
||||
@@ -2998,6 +3033,13 @@ export type GetMangasQueryVariables = Exact<{
|
||||
|
||||
export type GetMangasQuery = { __typename?: 'Query', mangas: { __typename?: 'MangaNodeList', totalCount: number, nodes: Array<{ __typename?: 'MangaType', unreadCount: number, downloadCount: number, artist?: string | null, author?: string | null, chaptersLastFetchedAt?: any | null, description?: string | null, genre: Array<string>, id: number, inLibrary: boolean, inLibraryAt: any, initialized: boolean, lastFetchedAt?: any | null, realUrl?: string | null, status: MangaStatus, thumbnailUrl?: string | null, title: string, url: string, lastReadChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestReadChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestFetchedChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestUploadedChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: 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', displayName: string, iconUrl: string, id: any, isConfigurable: boolean, isNsfw: boolean, lang: string, name: string, supportsLatest: boolean, extension: { __typename?: 'ExtensionType', pkgName: string, repo?: string | null } } | null }>, pageInfo: { __typename?: 'PageInfo', endCursor?: any | null, hasNextPage: boolean, hasPreviousPage: boolean, startCursor?: any | null } } };
|
||||
|
||||
export type GetMigratableSourceMangasQueryVariables = Exact<{
|
||||
sourceId: Scalars['LongString']['input'];
|
||||
}>;
|
||||
|
||||
|
||||
export type GetMigratableSourceMangasQuery = { __typename?: 'Query', mangas: { __typename?: 'MangaNodeList', nodes: Array<{ __typename?: 'MangaType', id: number, title: string, thumbnailUrl?: string | null, source?: { __typename?: 'SourceType', id: any } | null, categories: { __typename?: 'CategoryNodeList', nodes: Array<{ __typename?: 'CategoryType', id: number }> } }> } };
|
||||
|
||||
export type GetAboutQueryVariables = Exact<{ [key: string]: never; }>;
|
||||
|
||||
|
||||
@@ -3035,6 +3077,11 @@ export type GetSourcesQueryVariables = Exact<{ [key: string]: never; }>;
|
||||
|
||||
export type GetSourcesQuery = { __typename?: 'Query', sources: { __typename?: 'SourceNodeList', nodes: Array<{ __typename?: 'SourceType', displayName: string, iconUrl: string, id: any, isConfigurable: boolean, isNsfw: boolean, lang: string, name: string, supportsLatest: boolean, extension: { __typename?: 'ExtensionType', pkgName: string, repo?: string | null } }> } };
|
||||
|
||||
export type GetMigratableSourcesQueryVariables = Exact<{ [key: string]: never; }>;
|
||||
|
||||
|
||||
export type GetMigratableSourcesQuery = { __typename?: 'Query', mangas: { __typename?: 'MangaNodeList', nodes: Array<{ __typename?: 'MangaType', sourceId: any, source?: { __typename?: 'SourceType', id: any, name: string, lang: string, iconUrl: string } | null }> } };
|
||||
|
||||
export type GetUpdateStatusQueryVariables = Exact<{ [key: string]: never; }>;
|
||||
|
||||
|
||||
|
||||
@@ -48,6 +48,37 @@ export const GET_MANGA_FETCH = gql`
|
||||
}
|
||||
`;
|
||||
|
||||
// makes the server fetch and return the manga
|
||||
export const GET_MANGA_TO_MIGRATE_TO_FETCH = gql`
|
||||
mutation GET_MANGA_TO_MIGRATE_TO_FETCH($id: Int!, $migrateChapters: Boolean!, $migrateCategories: Boolean!) {
|
||||
fetchManga(input: { id: $id }) {
|
||||
clientMutationId
|
||||
manga {
|
||||
id
|
||||
title
|
||||
inLibrary
|
||||
categories @include(if: $migrateCategories) {
|
||||
nodes {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
fetchChapters(input: { mangaId: $id }) @include(if: $migrateChapters) {
|
||||
chapters {
|
||||
id
|
||||
manga {
|
||||
id
|
||||
}
|
||||
chapterNumber
|
||||
isRead
|
||||
isDownloaded
|
||||
isBookmarked
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
export const SET_MANGA_METADATA = gql`
|
||||
mutation SET_MANGA_METADATA($input: SetMangaMetaInput!) {
|
||||
setMangaMeta(input: $input) {
|
||||
|
||||
@@ -20,6 +20,35 @@ export const GET_MANGA = gql`
|
||||
}
|
||||
`;
|
||||
|
||||
// returns the current manga from the database
|
||||
export const GET_MANGA_TO_MIGRATE = gql`
|
||||
query GET_MANGA_TO_MIGRATE($id: Int!, $migrateChapters: Boolean!, $migrateCategories: Boolean!) {
|
||||
manga(id: $id) {
|
||||
id
|
||||
inLibrary
|
||||
title
|
||||
chapters @include(if: $migrateChapters) {
|
||||
nodes {
|
||||
id
|
||||
manga {
|
||||
id
|
||||
}
|
||||
chapterNumber
|
||||
isRead
|
||||
isDownloaded
|
||||
isBookmarked
|
||||
}
|
||||
totalCount
|
||||
}
|
||||
categories @include(if: $migrateCategories) {
|
||||
nodes {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
// returns the current manga from the database
|
||||
export const GET_MANGAS = gql`
|
||||
${FULL_MANGA_FIELDS}
|
||||
@@ -57,3 +86,23 @@ export const GET_MANGAS = gql`
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
export const GET_MIGRATABLE_SOURCE_MANGAS = gql`
|
||||
query GET_MIGRATABLE_SOURCE_MANGAS($sourceId: LongString!) {
|
||||
mangas(condition: { sourceId: $sourceId, inLibrary: true }) {
|
||||
nodes {
|
||||
id
|
||||
title
|
||||
thumbnailUrl
|
||||
source {
|
||||
id
|
||||
}
|
||||
categories {
|
||||
nodes {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
@@ -28,3 +28,19 @@ export const GET_SOURCES = gql`
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
export const GET_MIGRATABLE_SOURCES = gql`
|
||||
query GET_MIGRATABLE_SOURCES {
|
||||
mangas(condition: { inLibrary: true }) {
|
||||
nodes {
|
||||
sourceId
|
||||
source {
|
||||
id
|
||||
name
|
||||
lang
|
||||
iconUrl
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
@@ -172,6 +172,14 @@ import {
|
||||
UpdateMangaCategoriesPatchInput,
|
||||
GetWebuiUpdateStatusQuery,
|
||||
GetWebuiUpdateStatusQueryVariables,
|
||||
GetMigratableSourcesQuery,
|
||||
GetMigratableSourcesQueryVariables,
|
||||
GetMigratableSourceMangasQuery,
|
||||
GetMigratableSourceMangasQueryVariables,
|
||||
GetMangaToMigrateQuery,
|
||||
GetMangaToMigrateQueryVariables,
|
||||
GetMangaToMigrateToFetchMutation,
|
||||
GetMangaToMigrateToFetchMutationVariables,
|
||||
} from '@/lib/graphql/generated/graphql.ts';
|
||||
import { GET_GLOBAL_METADATAS } from '@/lib/graphql/queries/GlobalMetadataQuery.ts';
|
||||
import { SET_GLOBAL_METADATA } from '@/lib/graphql/mutations/GlobalMetadataMutation.ts';
|
||||
@@ -187,16 +195,22 @@ import {
|
||||
INSTALL_EXTERNAL_EXTENSION,
|
||||
UPDATE_EXTENSION,
|
||||
} from '@/lib/graphql/mutations/ExtensionMutation.ts';
|
||||
import { GET_SOURCE, GET_SOURCES } from '@/lib/graphql/queries/SourceQuery.ts';
|
||||
import { GET_MIGRATABLE_SOURCES, GET_SOURCE, GET_SOURCES } from '@/lib/graphql/queries/SourceQuery.ts';
|
||||
import {
|
||||
GET_MANGA_FETCH,
|
||||
GET_MANGA_TO_MIGRATE_TO_FETCH,
|
||||
SET_MANGA_METADATA,
|
||||
UPDATE_MANGA,
|
||||
UPDATE_MANGA_CATEGORIES,
|
||||
UPDATE_MANGAS,
|
||||
UPDATE_MANGAS_CATEGORIES,
|
||||
} from '@/lib/graphql/mutations/MangaMutation.ts';
|
||||
import { GET_MANGA, GET_MANGAS } from '@/lib/graphql/queries/MangaQuery.ts';
|
||||
import {
|
||||
GET_MANGA,
|
||||
GET_MANGA_TO_MIGRATE,
|
||||
GET_MANGAS,
|
||||
GET_MIGRATABLE_SOURCE_MANGAS,
|
||||
} from '@/lib/graphql/queries/MangaQuery.ts';
|
||||
import { GET_CATEGORIES, GET_CATEGORY_MANGAS } from '@/lib/graphql/queries/CategoryQuery.ts';
|
||||
import { GET_SOURCE_MANGAS_FETCH, UPDATE_SOURCE_PREFERENCES } from '@/lib/graphql/mutations/SourceMutation.ts';
|
||||
import {
|
||||
@@ -1330,6 +1344,33 @@ export class RequestManager {
|
||||
return this.doRequest(GQLMethod.USE_QUERY, GET_MANGA, { id: Number(mangaId) }, options);
|
||||
}
|
||||
|
||||
public getManga(
|
||||
mangaId: number | string,
|
||||
options?: QueryOptions<GetMangaQueryVariables, GetMangaQuery>,
|
||||
): AbortabaleApolloQueryResponse<GetMangaQuery> {
|
||||
return this.doRequest(GQLMethod.QUERY, GET_MANGA, { id: Number(mangaId) }, options);
|
||||
}
|
||||
|
||||
public getMangaToMigrate(
|
||||
mangaId: number | string,
|
||||
{
|
||||
migrateChapters = false,
|
||||
migrateCategories = false,
|
||||
apolloOptions: options,
|
||||
}: {
|
||||
migrateChapters?: boolean;
|
||||
migrateCategories?: boolean;
|
||||
apolloOptions?: QueryOptions<GetMangaToMigrateQueryVariables, GetMangaToMigrateQuery>;
|
||||
} = {},
|
||||
): AbortabaleApolloQueryResponse<GetMangaToMigrateQuery> {
|
||||
return this.doRequest(
|
||||
GQLMethod.QUERY,
|
||||
GET_MANGA_TO_MIGRATE,
|
||||
{ id: Number(mangaId), migrateChapters, migrateCategories },
|
||||
options,
|
||||
);
|
||||
}
|
||||
|
||||
public getMangaFetch(
|
||||
mangaId: number | string,
|
||||
options?: MutationOptions<GetMangaFetchMutation, GetMangaFetchMutationVariables>,
|
||||
@@ -1346,6 +1387,33 @@ export class RequestManager {
|
||||
);
|
||||
}
|
||||
|
||||
public getMangaToMigrateToFetch(
|
||||
mangaId: number | string,
|
||||
{
|
||||
migrateChapters = false,
|
||||
migrateCategories = false,
|
||||
apolloOptions: options,
|
||||
}: {
|
||||
migrateChapters?: boolean;
|
||||
migrateCategories?: boolean;
|
||||
apolloOptions?: MutationOptions<
|
||||
GetMangaToMigrateToFetchMutation,
|
||||
GetMangaToMigrateToFetchMutationVariables
|
||||
>;
|
||||
} = {},
|
||||
): AbortableApolloMutationResponse<GetMangaToMigrateToFetchMutation> {
|
||||
return this.doRequest<GetMangaToMigrateToFetchMutation, GetMangaToMigrateToFetchMutationVariables>(
|
||||
GQLMethod.MUTATION,
|
||||
GET_MANGA_TO_MIGRATE_TO_FETCH,
|
||||
{
|
||||
id: Number(mangaId),
|
||||
migrateChapters,
|
||||
migrateCategories,
|
||||
},
|
||||
options,
|
||||
);
|
||||
}
|
||||
|
||||
public useGetMangas(
|
||||
variables: GetMangasQueryVariables,
|
||||
options?: QueryHookOptions<GetMangasQuery, GetMangasQueryVariables>,
|
||||
@@ -1360,6 +1428,13 @@ export class RequestManager {
|
||||
return this.doRequest(GQLMethod.QUERY, GET_MANGAS, variables, options);
|
||||
}
|
||||
|
||||
public useGetMigratableSourceMangas(
|
||||
sourceId: string,
|
||||
options?: QueryHookOptions<GetMigratableSourceMangasQuery, GetMigratableSourceMangasQueryVariables>,
|
||||
): AbortableApolloUseQueryResponse<GetMigratableSourceMangasQuery, GetMigratableSourceMangasQueryVariables> {
|
||||
return this.doRequest(GQLMethod.USE_QUERY, GET_MIGRATABLE_SOURCE_MANGAS, { sourceId }, options);
|
||||
}
|
||||
|
||||
public getMangaThumbnailUrl(mangaId: number): string {
|
||||
return this.getValidImgUrlFor(`manga/${mangaId}/thumbnail`);
|
||||
}
|
||||
@@ -2182,6 +2257,12 @@ export class RequestManager {
|
||||
): AbortableApolloUseQueryResponse<GetWebuiUpdateStatusQuery, GetWebuiUpdateStatusQueryVariables> {
|
||||
return this.doRequest(GQLMethod.USE_QUERY, GET_WEBUI_UPDATE_STATUS, undefined, options);
|
||||
}
|
||||
|
||||
public useGetMigratableSources(
|
||||
options?: QueryHookOptions<GetMigratableSourcesQuery, GetMigratableSourcesQueryVariables>,
|
||||
): AbortableApolloUseQueryResponse<GetMigratableSourcesQuery, GetMigratableSourcesQueryVariables> {
|
||||
return this.doRequest(GQLMethod.USE_QUERY, GET_MIGRATABLE_SOURCES, undefined, options);
|
||||
}
|
||||
}
|
||||
|
||||
export const requestManager = new RequestManager();
|
||||
|
||||
Reference in New Issue
Block a user