From f391ace9b2a77ec780c1afaf8c4f6d63096aee47 Mon Sep 17 00:00:00 2001 From: glax Date: Sun, 18 May 2025 19:49:43 +0200 Subject: [PATCH] fetchApi dont throw rejected promises --- tranga-website/src/Components/Manga.tsx | 6 ++--- tranga-website/src/Components/MangaList.tsx | 12 +++++---- tranga-website/src/Components/Search.tsx | 14 +++++----- .../api/Contexts/MangaConnectorContext.tsx | 4 +++ tranga-website/src/api/Job.tsx | 4 +-- tranga-website/src/api/LocalLibrary.tsx | 6 ++--- tranga-website/src/api/Manga.tsx | 26 +++++++++++++++--- tranga-website/src/api/MangaConnector.tsx | 2 +- tranga-website/src/api/fetchApi.tsx | 27 ++++++++++++------- .../Jobs/IDownloadAvailableChaptersJob.ts | 6 ++--- .../api/types/Jobs/IDownloadMangaCoverJob.ts | 6 ++--- .../types/Jobs/IDownloadSingleChapterJob.ts | 6 ++--- tranga-website/src/api/types/Jobs/IJob.ts | 3 ++- .../src/api/types/Jobs/IJobWithChapterId.tsx | 5 ++++ .../src/api/types/Jobs/IJobWithMangaId.ts | 5 ++++ .../api/types/Jobs/IMoveMangaLibraryJob.ts | 5 ++-- .../api/types/Jobs/IRetrieveChaptersJob.ts | 6 ++--- .../Jobs/IUpdateChaptersDownloadedJob.ts | 5 ++++ .../src/api/types/Jobs/IUpdateCoverJob.ts | 5 ++++ .../types/Jobs/IUpdateFilesDownloadedJob.ts | 5 ---- .../src/api/types/Jobs/IUpdateMetadataJob.ts | 5 ---- .../Jobs/IUpdateSingleChapterDownloadedJob.ts | 5 ++++ 22 files changed, 109 insertions(+), 59 deletions(-) create mode 100644 tranga-website/src/api/Contexts/MangaConnectorContext.tsx create mode 100644 tranga-website/src/api/types/Jobs/IJobWithChapterId.tsx create mode 100644 tranga-website/src/api/types/Jobs/IJobWithMangaId.ts create mode 100644 tranga-website/src/api/types/Jobs/IUpdateChaptersDownloadedJob.ts create mode 100644 tranga-website/src/api/types/Jobs/IUpdateCoverJob.ts delete mode 100644 tranga-website/src/api/types/Jobs/IUpdateFilesDownloadedJob.ts delete mode 100644 tranga-website/src/api/types/Jobs/IUpdateMetadataJob.ts create mode 100644 tranga-website/src/api/types/Jobs/IUpdateSingleChapterDownloadedJob.ts diff --git a/tranga-website/src/Components/Manga.tsx b/tranga-website/src/Components/Manga.tsx index 10eee15..b5dfea4 100644 --- a/tranga-website/src/Components/Manga.tsx +++ b/tranga-website/src/Components/Manga.tsx @@ -5,7 +5,7 @@ import { CardContent, CardCover, Link, } from "@mui/joy"; -import IManga, {DefaultManga} from "../api/types/IManga.ts"; +import IManga from "../api/types/IManga.ts"; import {CSSProperties, ReactElement, useCallback, useContext, useEffect, useRef, useState} from "react"; import {GetMangaById, GetMangaCoverImageUrl} from "../api/Manga.tsx"; import {ApiUriContext, getData} from "../api/fetchApi.tsx"; @@ -16,7 +16,7 @@ import IMangaConnector from "../api/types/IMangaConnector.ts"; import {GetConnector} from "../api/MangaConnector.tsx"; export function MangaFromId({mangaId, children} : { mangaId: string, children?: ReactElement | ReactElement[] | undefined }){ - const [manga, setManga] = useState(DefaultManga); + const [manga, setManga] = useState(); const [loading, setLoading] = useState(true); const apiUri = useContext(ApiUriContext); @@ -32,7 +32,7 @@ export function MangaFromId({mangaId, children} : { mangaId: string, children?: return ( <> - {loading ? <> : } + {loading || manga === undefined ? <> : } ); } diff --git a/tranga-website/src/Components/MangaList.tsx b/tranga-website/src/Components/MangaList.tsx index eb59e2b..fd704fa 100644 --- a/tranga-website/src/Components/MangaList.tsx +++ b/tranga-website/src/Components/MangaList.tsx @@ -35,21 +35,23 @@ export default function MangaList({connected, children}: {connected: boolean, ch const timerRef = React.useRef>(undefined); const updateTimer = () => { if(!connected){ - console.debug("Clear timer"); clearTimeout(timerRef.current); return; }else{ - console.debug("Add timer"); - timerRef.current = setInterval(() => { + if(timerRef.current === undefined) { + console.log("Added timer!"); getJobList(); - }, 2000); + timerRef.current = setInterval(() => { + getJobList(); + }, 2000); + } } } return( {children} - {jobList.map((job) => ( + {jobList?.map((job) => ( diff --git a/tranga-website/src/Components/Search.tsx b/tranga-website/src/Components/Search.tsx index 4bacf63..8a00d12 100644 --- a/tranga-website/src/Components/Search.tsx +++ b/tranga-website/src/Components/Search.tsx @@ -35,7 +35,7 @@ export default function Search({open, setOpen}:{open:boolean, setOpen:React.Disp const [step, setStep] = useState(1); const apiUri = useContext(ApiUriContext); - const [mangaConnectors, setMangaConnectors] = useState([]); + const [mangaConnectors, setMangaConnectors] = useState(); const [mangaConnectorsLoading, setMangaConnectorsLoading] = useState(true); const [selectedMangaConnector, setSelectedMangaConnector] = useState(); @@ -83,7 +83,7 @@ export default function Search({open, setOpen}:{open:boolean, setOpen:React.Disp return ( - o.name === option.value)?.iconUrl} /> + o.name === option.value)?.iconUrl} /> {option.label} @@ -101,13 +101,13 @@ export default function Search({open, setOpen}:{open:boolean, setOpen:React.Disp + 1 }> diff --git a/tranga-website/src/api/Contexts/MangaConnectorContext.tsx b/tranga-website/src/api/Contexts/MangaConnectorContext.tsx new file mode 100644 index 0000000..b830365 --- /dev/null +++ b/tranga-website/src/api/Contexts/MangaConnectorContext.tsx @@ -0,0 +1,4 @@ +import {createContext} from "react"; +import IMangaConnector from "../types/IMangaConnector.ts"; + +export const MangaConnectorContext = createContext([]); \ No newline at end of file diff --git a/tranga-website/src/api/Job.tsx b/tranga-website/src/api/Job.tsx index 8ad08a0..2f8ae65 100644 --- a/tranga-website/src/api/Job.tsx +++ b/tranga-website/src/api/Job.tsx @@ -88,10 +88,10 @@ export const CreateUpdateAllMetadataJob = async (apiUri: string) : Promise; } -export const StartJob = async (apiUri: string, jobId: string) : Promise => { +export const StartJob = async (apiUri: string, jobId: string) : Promise => { return await postData(`${apiUri}/v2/Job/${jobId}/Start`, {}); } -export const StopJob = async (apiUri: string, jobId: string) : Promise => { +export const StopJob = async (apiUri: string, jobId: string) : Promise => { return await postData(`${apiUri}/v2/Job/${jobId}/Stop`, {}); } \ No newline at end of file diff --git a/tranga-website/src/api/LocalLibrary.tsx b/tranga-website/src/api/LocalLibrary.tsx index 95b659d..3258972 100644 --- a/tranga-website/src/api/LocalLibrary.tsx +++ b/tranga-website/src/api/LocalLibrary.tsx @@ -18,14 +18,14 @@ export const DeleteLibrary = async (apiUri: string, libraryId: string) : Promis return await deleteData(`${apiUri}/v2/LocalLibraries/${libraryId}`); } -export const ChangeLibraryPath = async (apiUri: string, libraryId: string, newPath: string) : Promise => { +export const ChangeLibraryPath = async (apiUri: string, libraryId: string, newPath: string) : Promise => { return await patchData(`${apiUri}/v2/LocalLibraries/${libraryId}/ChangeBasePath`, newPath); } -export const ChangeLibraryName = async (apiUri: string, libraryId: string, newName: string) : Promise => { +export const ChangeLibraryName = async (apiUri: string, libraryId: string, newName: string) : Promise => { return await patchData(`${apiUri}/v2/LocalLibraries/${libraryId}/ChangeName`, newName); } -export const UpdateLibrary = async (apiUri: string, libraryId: string, record: INewLibraryRecord) : Promise => { +export const UpdateLibrary = async (apiUri: string, libraryId: string, record: INewLibraryRecord) : Promise => { return await patchData(`${apiUri}/v2/LocalLibraries/${libraryId}`, record); } \ No newline at end of file diff --git a/tranga-website/src/api/Manga.tsx b/tranga-website/src/api/Manga.tsx index 7940198..b12a4dd 100644 --- a/tranga-website/src/api/Manga.tsx +++ b/tranga-website/src/api/Manga.tsx @@ -1,5 +1,5 @@ import {deleteData, getData, patchData, postData} from './fetchApi.tsx'; -import IManga from "./types/IManga.ts"; +import IManga, {DefaultManga} from "./types/IManga.ts"; import IChapter from "./types/IChapter.ts"; export const GetAllManga = async (apiUri: string) : Promise => { @@ -15,63 +15,83 @@ export const GetMangaWithIds = async (apiUri: string, mangaIds: string[]) : Prom export const GetMangaById = async (apiUri: string, mangaId: string) : Promise => { if(mangaId === undefined || mangaId === null || mangaId.length < 1) return Promise.reject("mangaId was not provided"); + if(mangaId === DefaultManga.mangaId) + return Promise.reject("Default Manga was requested"); return await getData(`${apiUri}/v2/Manga/${mangaId}`) as Promise; } export const DeleteManga = async (apiUri: string, mangaId: string) : Promise => { if(mangaId === undefined || mangaId === null || mangaId.length < 1) return Promise.reject("mangaId was not provided"); + if(mangaId === DefaultManga.mangaId) + return Promise.reject("Default Manga was requested"); return await deleteData(`${apiUri}/v2/Manga/${mangaId}`); } export const GetMangaCoverImageUrl = (apiUri: string, mangaId: string, ref: HTMLImageElement | undefined | null) : string => { if(ref == null || ref == undefined) return `${apiUri}/v2/Manga/${mangaId}/Cover?width=64&height=64`; + if(mangaId === DefaultManga.mangaId) + return "/blahaj.png"; return `${apiUri}/v2/Manga/${mangaId}/Cover?width=${ref.clientWidth}&height=${ref.clientHeight}`; } export const GetChapters = async (apiUri: string, mangaId: string) : Promise => { if(mangaId === undefined || mangaId === null || mangaId.length < 1) return Promise.reject("mangaId was not provided"); + if(mangaId === DefaultManga.mangaId) + return Promise.reject("Default Manga was requested"); return await getData(`${apiUri}/v2/Manga/${mangaId}/Chapters`) as Promise; } export const GetDownloadedChapters = async (apiUri: string, mangaId: string) : Promise => { if(mangaId === undefined || mangaId === null || mangaId.length < 1) return Promise.reject("mangaId was not provided"); + if(mangaId === DefaultManga.mangaId) + return Promise.reject("Default Manga was requested"); return await getData(`${apiUri}/v2/Manga/${mangaId}/Chapters/Downloaded`) as Promise; } export const GetNotDownloadedChapters = async (apiUri: string, mangaId: string) : Promise => { if(mangaId === undefined || mangaId === null || mangaId.length < 1) return Promise.reject("mangaId was not provided"); + if(mangaId === DefaultManga.mangaId) + return Promise.reject("Default Manga was requested"); return await getData(`${apiUri}/v2/Manga/${mangaId}/Chapters/NotDownloaded`) as Promise; } export const GetLatestChapterAvailable = async (apiUri: string, mangaId: string) : Promise => { if(mangaId === undefined || mangaId === null || mangaId.length < 1) return Promise.reject("mangaId was not provided"); + if(mangaId === DefaultManga.mangaId) + return Promise.reject("Default Manga was requested"); return await getData(`${apiUri}/v2/Manga/${mangaId}/Chapter/LatestAvailable`) as Promise; } export const GetLatestChapterDownloaded = async (apiUri: string, mangaId: string) : Promise => { if(mangaId === undefined || mangaId === null || mangaId.length < 1) return Promise.reject("mangaId was not provided"); + if(mangaId === DefaultManga.mangaId) + return Promise.reject("Default Manga was requested"); return await getData(`${apiUri}/v2/Manga/${mangaId}/Chapter/LatestDownloaded`) as Promise; } -export const SetIgnoreThreshold = async (apiUri: string, mangaId: string, chapterThreshold: number) : Promise => { +export const SetIgnoreThreshold = async (apiUri: string, mangaId: string, chapterThreshold: number) : Promise => { if(mangaId === undefined || mangaId === null || mangaId.length < 1) return Promise.reject("mangaId was not provided"); if(chapterThreshold === undefined || chapterThreshold === null) return Promise.reject("chapterThreshold was not provided"); + if(mangaId === DefaultManga.mangaId) + return Promise.reject("Default Manga was requested"); return await patchData(`${apiUri}/v2/Manga/${mangaId}/IgnoreChaptersBefore`, chapterThreshold); } -export const MoveFolder = async (apiUri: string, mangaId: string, newPath: string) : Promise => { +export const MoveFolder = async (apiUri: string, mangaId: string, newPath: string) : Promise => { if(mangaId === undefined || mangaId === null || mangaId.length < 1) return Promise.reject("mangaId was not provided"); if(newPath === undefined || newPath === null || newPath.length < 1) return Promise.reject("newPath was not provided"); + if(mangaId === DefaultManga.mangaId) + return Promise.reject("Default Manga was requested"); return await postData(`${apiUri}/v2/Manga/{MangaId}/MoveFolder`, {newPath}); } \ No newline at end of file diff --git a/tranga-website/src/api/MangaConnector.tsx b/tranga-website/src/api/MangaConnector.tsx index 4ddb6df..d05b43c 100644 --- a/tranga-website/src/api/MangaConnector.tsx +++ b/tranga-website/src/api/MangaConnector.tsx @@ -17,7 +17,7 @@ export const GetDisabledConnectors = async (apiUri: string) : Promise } -export const SetConnectorEnabled = async (apiUri: string, connectorName: string, enabled: boolean) : Promise => { +export const SetConnectorEnabled = async (apiUri: string, connectorName: string, enabled: boolean) : Promise => { if(connectorName === undefined || connectorName === null || connectorName.length < 1) return Promise.reject("connectorName was not provided"); if(enabled === undefined || enabled === null) diff --git a/tranga-website/src/api/fetchApi.tsx b/tranga-website/src/api/fetchApi.tsx index 96c2a45..94aebc9 100644 --- a/tranga-website/src/api/fetchApi.tsx +++ b/tranga-website/src/api/fetchApi.tsx @@ -2,24 +2,33 @@ import {createContext} from "react"; export const ApiUriContext = createContext(""); -export function getData(uri: string) : Promise { - return makeRequest("GET", uri, null) as Promise; +export function getData(uri: string) : Promise { + return makeRequestWrapper("GET", uri, null); } -export function postData(uri: string, content: object | string | number | boolean) : Promise { - return makeRequest("POST", uri, content) as Promise; +export function postData(uri: string, content: object | string | number | boolean) : Promise { + return makeRequestWrapper("POST", uri, content); } export function deleteData(uri: string) : Promise { - return makeRequest("DELETE", uri, null) as Promise; + return makeRequestWrapper("DELETE", uri, null) as Promise; } -export function patchData(uri: string, content: object | string | number | boolean) : Promise { - return makeRequest("patch", uri, content) as Promise; +export function patchData(uri: string, content: object | string | number | boolean) : Promise { + return makeRequestWrapper("patch", uri, content); } -export function putData(uri: string, content: object | string | number | boolean) : Promise { - return makeRequest("PUT", uri, content) as Promise; +export function putData(uri: string, content: object | string | number | boolean) : Promise { + return makeRequestWrapper("PUT", uri, content); +} + +function makeRequestWrapper(method: string, uri: string, content: object | string | number | null | boolean) : Promise{ + return makeRequest(method, uri, content) + .then((result) => result as Promise) + .catch((e) => { + console.warn(e); + return Promise.resolve(undefined); + }); } let currentlyRequestedEndpoints: string[] = []; diff --git a/tranga-website/src/api/types/Jobs/IDownloadAvailableChaptersJob.ts b/tranga-website/src/api/types/Jobs/IDownloadAvailableChaptersJob.ts index 66c5104..9bb3097 100644 --- a/tranga-website/src/api/types/Jobs/IDownloadAvailableChaptersJob.ts +++ b/tranga-website/src/api/types/Jobs/IDownloadAvailableChaptersJob.ts @@ -1,5 +1,5 @@ -import IJob from "./IJob"; +import IJobWithMangaId from "./IJobWithMangaId.ts"; + +export default interface IDownloadAvailableChaptersJob extends IJobWithMangaId { -export default interface IDownloadAvailableChaptersJob extends IJob { - mangaId: string; } \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IDownloadMangaCoverJob.ts b/tranga-website/src/api/types/Jobs/IDownloadMangaCoverJob.ts index 42d4350..f869988 100644 --- a/tranga-website/src/api/types/Jobs/IDownloadMangaCoverJob.ts +++ b/tranga-website/src/api/types/Jobs/IDownloadMangaCoverJob.ts @@ -1,5 +1,5 @@ -import IJob from "./IJob"; +import IJobWithMangaId from "./IJobWithMangaId.ts"; + +export default interface IDownloadMangaCoverJob extends IJobWithMangaId { -export default interface IDownloadMangaCoverJob extends IJob { - mangaId: string; } \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IDownloadSingleChapterJob.ts b/tranga-website/src/api/types/Jobs/IDownloadSingleChapterJob.ts index c4b3b8b..9add634 100644 --- a/tranga-website/src/api/types/Jobs/IDownloadSingleChapterJob.ts +++ b/tranga-website/src/api/types/Jobs/IDownloadSingleChapterJob.ts @@ -1,5 +1,5 @@ -import IJob from "./IJob"; +import IJobWithChapterId from "./IJobWithChapterId.tsx"; + +export default interface IDownloadSingleChapterJob extends IJobWithChapterId { -export default interface IDownloadSingleChapterJob extends IJob { - chapterId: string; } \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IJob.ts b/tranga-website/src/api/types/Jobs/IJob.ts index e1f0757..4880b09 100644 --- a/tranga-website/src/api/types/Jobs/IJob.ts +++ b/tranga-website/src/api/types/Jobs/IJob.ts @@ -18,7 +18,8 @@ export enum JobType { RetrieveChaptersJob = "RetrieveChaptersJob", UpdateChaptersDownloadedJob = "UpdateChaptersDownloadedJob", MoveMangaLibraryJob = "MoveMangaLibraryJob", - UpdateSingleChapterDownloadedJob = "UpdateSingleChapterDownloadedJob" + UpdateSingleChapterDownloadedJob = "UpdateSingleChapterDownloadedJob", + UpdateCoverJob = "UpdateCoverJob" } export enum JobState { diff --git a/tranga-website/src/api/types/Jobs/IJobWithChapterId.tsx b/tranga-website/src/api/types/Jobs/IJobWithChapterId.tsx new file mode 100644 index 0000000..a71a9e1 --- /dev/null +++ b/tranga-website/src/api/types/Jobs/IJobWithChapterId.tsx @@ -0,0 +1,5 @@ +import IJob from "./IJob.ts"; + +export default interface IJobWithChapterId extends IJob { + chapterId: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IJobWithMangaId.ts b/tranga-website/src/api/types/Jobs/IJobWithMangaId.ts new file mode 100644 index 0000000..1e6147c --- /dev/null +++ b/tranga-website/src/api/types/Jobs/IJobWithMangaId.ts @@ -0,0 +1,5 @@ +import IJob from "./IJob.ts"; + +export default interface IJobWithMangaId extends IJob { + mangaId: string; +} \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IMoveMangaLibraryJob.ts b/tranga-website/src/api/types/Jobs/IMoveMangaLibraryJob.ts index 102646b..d861777 100644 --- a/tranga-website/src/api/types/Jobs/IMoveMangaLibraryJob.ts +++ b/tranga-website/src/api/types/Jobs/IMoveMangaLibraryJob.ts @@ -1,6 +1,5 @@ -import IJob from "./IJob"; +import IJobWithMangaId from "./IJobWithMangaId.ts"; -export default interface IMoveMangaLibraryJob extends IJob { - MangaId: string; +export default interface IMoveMangaLibraryJob extends IJobWithMangaId { ToLibraryId: string; } \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IRetrieveChaptersJob.ts b/tranga-website/src/api/types/Jobs/IRetrieveChaptersJob.ts index 2cadeb3..6af1397 100644 --- a/tranga-website/src/api/types/Jobs/IRetrieveChaptersJob.ts +++ b/tranga-website/src/api/types/Jobs/IRetrieveChaptersJob.ts @@ -1,5 +1,5 @@ -import IJob from "./IJob"; +import IJobWithMangaId from "./IJobWithMangaId.ts"; + +export default interface IRetrieveChaptersJob extends IJobWithMangaId { -export default interface IRetrieveChaptersJob extends IJob { - mangaId: string; } \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IUpdateChaptersDownloadedJob.ts b/tranga-website/src/api/types/Jobs/IUpdateChaptersDownloadedJob.ts new file mode 100644 index 0000000..8f1cff6 --- /dev/null +++ b/tranga-website/src/api/types/Jobs/IUpdateChaptersDownloadedJob.ts @@ -0,0 +1,5 @@ +import IJobWithMangaId from "./IJobWithMangaId.ts"; + +export default interface IUpdateChaptersDownloadedJob extends IJobWithMangaId { + +} \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IUpdateCoverJob.ts b/tranga-website/src/api/types/Jobs/IUpdateCoverJob.ts new file mode 100644 index 0000000..296db2a --- /dev/null +++ b/tranga-website/src/api/types/Jobs/IUpdateCoverJob.ts @@ -0,0 +1,5 @@ +import IJobWithMangaId from "./IJobWithMangaId.ts"; + +export default interface IUpdateCoverJob extends IJobWithMangaId { + +} \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IUpdateFilesDownloadedJob.ts b/tranga-website/src/api/types/Jobs/IUpdateFilesDownloadedJob.ts deleted file mode 100644 index 8fc2516..0000000 --- a/tranga-website/src/api/types/Jobs/IUpdateFilesDownloadedJob.ts +++ /dev/null @@ -1,5 +0,0 @@ -import IJob from "./IJob"; - -export default interface IUpdateFilesDownloadedJob extends IJob { - mangaId: string; -} \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IUpdateMetadataJob.ts b/tranga-website/src/api/types/Jobs/IUpdateMetadataJob.ts deleted file mode 100644 index 9464666..0000000 --- a/tranga-website/src/api/types/Jobs/IUpdateMetadataJob.ts +++ /dev/null @@ -1,5 +0,0 @@ -import IJob from "./IJob"; - -export default interface IUpdateMetadataJob extends IJob { - mangaId: string; -} \ No newline at end of file diff --git a/tranga-website/src/api/types/Jobs/IUpdateSingleChapterDownloadedJob.ts b/tranga-website/src/api/types/Jobs/IUpdateSingleChapterDownloadedJob.ts new file mode 100644 index 0000000..293aef2 --- /dev/null +++ b/tranga-website/src/api/types/Jobs/IUpdateSingleChapterDownloadedJob.ts @@ -0,0 +1,5 @@ +import IJobWithChapterId from "./IJobWithChapterId.tsx"; + +export default interface IUpdateChaptersDownloadedJob extends IJobWithChapterId { + +} \ No newline at end of file