diff --git a/api/mangamochi.ts b/api/mangamochi.ts index fa4a7c7..2277b67 100644 --- a/api/mangamochi.ts +++ b/api/mangamochi.ts @@ -24,6 +24,10 @@ import type { } from '@tanstack/react-query'; import { customInstance } from './api'; +export interface UpdateMangaDataCommand { + mangaId?: number; +} + export interface DefaultResponseDTOVoid { timestamp?: string; data?: unknown; @@ -105,18 +109,18 @@ export interface PageMangaListDTO { content?: MangaListDTO[]; number?: number; pageable?: PageableObject; + sort?: SortObject; first?: boolean; last?: boolean; - sort?: SortObject; numberOfElements?: number; empty?: boolean; } export interface PageableObject { offset?: number; - paged?: boolean; pageNumber?: number; pageSize?: number; + paged?: boolean; sort?: SortObject; unpaged?: boolean; } @@ -268,6 +272,65 @@ type SecondParameter unknown> = Parameters[1]; +export const sendRecord = ( + updateMangaDataCommand: UpdateMangaDataCommand, + options?: SecondParameter,signal?: AbortSignal +) => { + + + return customInstance( + {url: `http://mangamochi.badger-pirarucu.ts.net:8080/records`, method: 'POST', + headers: {'Content-Type': 'application/json', }, + data: updateMangaDataCommand, signal + }, + options); + } + + + +export const getSendRecordMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{data: UpdateMangaDataCommand}, TContext>, request?: SecondParameter} +): UseMutationOptions>, TError,{data: UpdateMangaDataCommand}, TContext> => { + +const mutationKey = ['sendRecord']; +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>, {data: UpdateMangaDataCommand}> = (props) => { + const {data} = props ?? {}; + + return sendRecord(data,requestOptions) + } + + + + + return { mutationFn, ...mutationOptions }} + + export type SendRecordMutationResult = NonNullable>> + export type SendRecordMutationBody = UpdateMangaDataCommand + export type SendRecordMutationError = unknown + + export const useSendRecord = (options?: { mutation?:UseMutationOptions>, TError,{data: UpdateMangaDataCommand}, TContext>, request?: SecondParameter} + , queryClient?: QueryClient): UseMutationResult< + Awaited>, + TError, + {data: UpdateMangaDataCommand}, + TContext + > => { + + const mutationOptions = getSendRecordMutationOptions(options); + + return useMutation(mutationOptions, queryClient); + } + /** * Fetch a list of manga chapters for a specific manga/provider combination. * @summary Fetch the available chapters for a specific manga/provider combination @@ -332,6 +395,70 @@ export const useFetchMangaChapters = ,signal?: AbortSignal +) => { + + + return customInstance( + {url: `http://mangamochi.badger-pirarucu.ts.net:8080/mangas/${encodeURIComponent(String(mangaProviderId))}/fetch-all-chapters`, method: 'POST', signal + }, + options); + } + + + +export const getFetchAllChaptersMutationOptions = (options?: { mutation?:UseMutationOptions>, TError,{mangaProviderId: number}, TContext>, request?: SecondParameter} +): UseMutationOptions>, TError,{mangaProviderId: number}, TContext> => { + +const mutationKey = ['fetchAllChapters']; +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>, {mangaProviderId: number}> = (props) => { + const {mangaProviderId} = props ?? {}; + + return fetchAllChapters(mangaProviderId,requestOptions) + } + + + + + return { mutationFn, ...mutationOptions }} + + export type FetchAllChaptersMutationResult = NonNullable>> + + export type FetchAllChaptersMutationError = unknown + + /** + * @summary Fetch all chapters + */ +export const useFetchAllChapters = (options?: { mutation?:UseMutationOptions>, TError,{mangaProviderId: number}, TContext>, request?: SecondParameter} + , queryClient?: QueryClient): UseMutationResult< + Awaited>, + TError, + {mangaProviderId: number}, + TContext + > => { + + const mutationOptions = getFetchAllChaptersMutationOptions(options); + + return useMutation(mutationOptions, queryClient); + } + /** * Remove a manga from favorites for the logged user. * @summary Unfavorite a manga diff --git a/app/manga/[id]/page.tsx b/app/manga/[id]/page.tsx index 2a830da..9ebf3b2 100644 --- a/app/manga/[id]/page.tsx +++ b/app/manga/[id]/page.tsx @@ -20,9 +20,10 @@ import { CollapsibleTrigger, } from "@/components/ui/collapsible"; import { ThemeToggle } from "@/components/theme-toggle"; -import { useFetchMangaChapters, useGetManga } from "@/api/mangamochi"; +import {useFetchAllChapters, useFetchMangaChapters, useGetManga} from "@/api/mangamochi"; import { MangaChapter } from "@/components/manga-chapter"; import { useQueryClient } from "@tanstack/react-query"; +import {toast} from "sonner"; export default function MangaDetailPage() { const params = useParams(); @@ -33,12 +34,20 @@ export default function MangaDetailPage() { const { data: mangaData, queryKey } = useGetManga(mangaId); - const { mutate, isPending } = useFetchMangaChapters({ + const { mutate, isPending: fetchPending } = useFetchMangaChapters({ mutation: { onSuccess: () => queryClient.invalidateQueries({ queryKey }), }, }); + const { mutate: fetchAllMutate, isPending: fetchAllPending } = useFetchAllChapters({ + mutation: { + onSuccess: () => toast.success("Chapter import queued successfully.") + } + }) + + const isPending = fetchPending || fetchAllPending; + const [openProviders, setOpenProviders] = useState>(new Set()); if (!mangaData) { @@ -258,7 +267,19 @@ export default function MangaDetailPage() { {provider.supportsChapterFetch && ( -
+
+