From 9f0eeab4fb54868b5cf8c98237e38aeff1d1457d Mon Sep 17 00:00:00 2001 From: Rodrigo Verdiani Date: Wed, 31 Dec 2025 20:01:42 -0300 Subject: [PATCH] feat: Add AniList ID support for manga imports, introduce manga data update API, and include chapter language. --- src/api/generated/api.schemas.ts | 16 ++++- src/api/generated/management/management.ts | 63 +++++++++++++++++ .../home/components/ProviderImportDialog.tsx | 69 +++++++++++++------ 3 files changed, 123 insertions(+), 25 deletions(-) diff --git a/src/api/generated/api.schemas.ts b/src/api/generated/api.schemas.ts index 2e198e7..bc1c485 100644 --- a/src/api/generated/api.schemas.ts +++ b/src/api/generated/api.schemas.ts @@ -12,6 +12,7 @@ export interface DefaultResponseDTOVoid { export interface ImportRequestDTO { metadataId?: string; + aniListId?: string; id: string; } @@ -114,18 +115,18 @@ export interface PageMangaListDTO { } export interface PageableObject { + paged?: boolean; pageNumber?: number; pageSize?: number; - paged?: boolean; + unpaged?: boolean; offset?: number; sort?: SortObject; - unpaged?: boolean; } export interface SortObject { sorted?: boolean; - empty?: boolean; unsorted?: boolean; + empty?: boolean; } export interface DefaultResponseDTOListMangaChapterDTO { @@ -134,12 +135,21 @@ export interface DefaultResponseDTOListMangaChapterDTO { message?: string; } +export interface LanguageDTO { + id: number; + /** @minLength 1 */ + code: string; + /** @minLength 1 */ + name: string; +} + export interface MangaChapterDTO { id: number; /** @minLength 1 */ title: string; downloaded: boolean; isRead: boolean; + language?: LanguageDTO; } export interface DefaultResponseDTOMangaDTO { diff --git a/src/api/generated/management/management.ts b/src/api/generated/management/management.ts index 549b14e..315f5de 100644 --- a/src/api/generated/management/management.ts +++ b/src/api/generated/management/management.ts @@ -217,6 +217,69 @@ export const useUpdateMangaList = ,signal?: AbortSignal +) => { + + + return customInstance( + {url: `/management/update-manga-data/${encodeURIComponent(String(mangaId))}`, method: 'POST', signal + }, + options); + } + + + +export const getTriggerUpdateMangaDataMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{mangaId: number}, TContext>, request?: SecondParameter} +): UseMutationOptions>, TError,{mangaId: number}, TContext> => { + +const mutationKey = ['triggerUpdateMangaData']; +const {mutation: mutationOptions, request: requestOptions} = options ? + options.mutation && 'mutationKey' in options.mutation && options.mutation.mutationKey ? + options + : {...options, mutation: {...options.mutation, mutationKey}} + : {mutation: { mutationKey, }, request: undefined}; + + + + + const mutationFn: MutationFunction>, {mangaId: number}> = (props) => { + const {mangaId} = props ?? {}; + + return triggerUpdateMangaData(mangaId,requestOptions) + } + + + + + return { mutationFn, ...mutationOptions }} + + export type TriggerUpdateMangaDataMutationResult = NonNullable>> + + export type TriggerUpdateMangaDataMutationError = unknown + + /** + * @summary Trigger manga data update + */ +export const useTriggerUpdateMangaData = (options?: { mutation?:UseMutationOptions>, TError,{mangaId: number}, TContext>, request?: SecondParameter} + , queryClient?: QueryClient): UseMutationResult< + Awaited>, + TError, + {mangaId: number}, + TContext + > => { + + const mutationOptions = getTriggerUpdateMangaDataMutationOptions(options); + + return useMutation(mutationOptions, queryClient); + } + /** * Sends a test notification to all users * @summary Test notification */ diff --git a/src/features/home/components/ProviderImportDialog.tsx b/src/features/home/components/ProviderImportDialog.tsx index 7b080c6..412e693 100644 --- a/src/features/home/components/ProviderImportDialog.tsx +++ b/src/features/home/components/ProviderImportDialog.tsx @@ -45,6 +45,7 @@ export const ProviderImportDialog = ({ value: z.string().min(1, "Please enter an ID or URL."), providerId: z.string(), myAnimeListId: z.string().optional(), + anilistId: z.string().optional(), }); const form = useForm>({ @@ -53,6 +54,7 @@ export const ProviderImportDialog = ({ value: "", providerId: "", myAnimeListId: undefined, + anilistId: undefined, }, }); @@ -74,7 +76,11 @@ export const ProviderImportDialog = ({ (data: z.output) => { importFromProvider({ providerId: Number(data.providerId), - data: { id: data.value, metadataId: data.myAnimeListId }, + data: { + id: data.value, + metadataId: data.myAnimeListId, + aniListId: data.anilistId, + }, }); }, [importFromProvider], @@ -145,27 +151,46 @@ export const ProviderImportDialog = ({ )} /> - ( - - MyAnimeList ID (Optional) - - - - - Optionally link this manga to a MyAnimeList entry for better - precision on metadata fetching. - - - - )} - /> +
+ ( + + MyAnimeList ID (Optional) + + + + + + )} + /> + ( + + AniList ID (Optional) + + + + + + )} + /> +
+ + Optionally link this manga to a MyAnimeList or AniList entry for + better precision on metadata fetching. +