This commit is contained in:
2025-03-17 20:20:45 +01:00
parent 007b49c624
commit 62665f5660
34 changed files with 121 additions and 255 deletions

View File

@ -1,7 +1,7 @@
import React, {ReactElement, ReactEventHandler, useEffect, useState} from "react";
import Manga from "../Manga";
import MangaFunctions from "../MangaFunctions";
import IManga from "./IManga";
import Chapter from "../Chapter";
import ChapterFunctions from "../ChapterFunctions";
export default interface IChapter{
chapterId: string;
@ -24,25 +24,28 @@ export function ChapterItem({apiUri, chapterId} : {apiUri: string, chapterId: st
let [mangaCoverUrl, setMangaCoverUrl] = useState<string>("../../media/blahaj.png");
let [mangaCoverHtmlImageItem, setMangaCoverHtmlImageItem] = useState<HTMLImageElement | null>(null);
useEffect(() => {
Chapter.GetChapterFromId(apiUri, chapterId).then(setChapter);
ChapterFunctions.GetChapterFromId(apiUri, chapterId).then(setChapter);
}, []);
useEffect(() => {
if(chapter === null)
manga = null;
else
Manga.GetMangaById(apiUri, chapter.parentMangaId).then(setManga);
MangaFunctions.GetMangaById(apiUri, chapter.parentMangaId).then(setManga);
}, [chapter]);
useEffect(() => {
if(chapter != null && mangaCoverHtmlImageItem != null)
setMangaCoverUrl(Manga.GetMangaCoverImageUrl(apiUri, chapter.parentMangaId, mangaCoverHtmlImageItem));
setMangaCoverUrl(MangaFunctions.GetMangaCoverImageUrl(apiUri, chapter.parentMangaId, mangaCoverHtmlImageItem));
}, [chapter, mangaCoverHtmlImageItem]);
return (<div className="ChapterItem" key={chapterId}>
<img className="ChapterItem-Cover" src={mangaCoverUrl} alt="Manga Cover" onLoad={setCoverItem} onResize={setCoverItem}></img>
<p className="ChapterItem-MangaName">{manga ? manga.name : "Manga-Name"}</p>
<p className="ChapterItem-ChapterName">{chapter ? chapter.title : "Chapter-Title"}</p>
let [clicked, setClicked] = useState<boolean>(false);
return (<div className="ChapterItem" key={chapterId} is-clicked={clicked ? "clicked" : "not-clicked"} onClick={() => setClicked(!clicked)}>
<img className="ChapterItem-Cover" src={mangaCoverUrl} alt="MangaFunctions Cover" onLoad={setCoverItem} onResize={setCoverItem}></img>
<p className="ChapterItem-MangaName">{manga ? manga.name : "MangaFunctions-Name"}</p>
<p className="ChapterItem-ChapterName">{chapter ? chapter.title : "ChapterFunctions-Title"}</p>
<p className="ChapterItem-Volume">Vol.{chapter ? chapter.volumeNumber : "VolNum"}</p>
<p className="ChapterItem-Chapter">Ch.{chapter ? chapter.chapterNumber : "ChNum"}</p>
<p className="ChapterItem-VolumeChapter">Vol.{chapter ? chapter.volumeNumber : "VolNum"} Ch.{chapter ? chapter.chapterNumber : "ChNum"}</p>
<a className="ChapterItem-Website" href={chapter ? chapter.url : "#"}><img src="../../media/link.svg" alt="Link"/></a>
</div>)
}

View File

@ -8,7 +8,7 @@ export default interface ILocalLibrary {
export function LocalLibrary(library: ILocalLibrary) : ReactElement {
return (<div key={library.localLibraryId}>
<p className={"LocalLibrary-Name"}>{library.libraryName}</p>
<p className={"LocalLibrary-Path"}>{library.basePath}</p>
<p className={"LocalLibraryFunctions-Name"}>{library.libraryName}</p>
<p className={"LocalLibraryFunctions-Path"}>{library.basePath}</p>
</div>);
}

View File

@ -1,4 +1,4 @@
import Manga from "../Manga";
import MangaFunctions from "../MangaFunctions";
import React, {Children, ReactElement, ReactEventHandler, useEffect, useState} from "react";
import Icon from '@mdi/react';
import { mdiTagTextOutline, mdiAccountEdit, mdiLinkVariant } from '@mdi/js';
@ -34,18 +34,18 @@ export enum MangaReleaseStatus {
export function MangaItem({apiUri, mangaId, children} : {apiUri: string, mangaId: string, children?: (string | ReactElement)[]}) : ReactElement {
const LoadMangaCover : ReactEventHandler<HTMLImageElement> = (e) => {
if(e.currentTarget.src != Manga.GetMangaCoverImageUrl(apiUri, mangaId, e.currentTarget))
e.currentTarget.src = Manga.GetMangaCoverImageUrl(apiUri, mangaId, e.currentTarget);
if(e.currentTarget.src != MangaFunctions.GetMangaCoverImageUrl(apiUri, mangaId, e.currentTarget))
e.currentTarget.src = MangaFunctions.GetMangaCoverImageUrl(apiUri, mangaId, e.currentTarget);
}
let [manga, setManga] = useState<IManga | null>(null);
let [clicked, setClicked] = useState<boolean>(false);
useEffect(() => {
Manga.GetMangaById(apiUri, mangaId).then(setManga);
MangaFunctions.GetMangaById(apiUri, mangaId).then(setManga);
}, []);
return (<div className="MangaItem" key={mangaId} is-clicked={clicked ? "clicked" : "not-clicked"} onClick={()=>setClicked(!clicked)}>
<img className="MangaItem-Cover" src={Manga.GetMangaCoverImageUrl(apiUri, mangaId, undefined)} alt="Manga Cover" onLoad={LoadMangaCover} onResize={LoadMangaCover}></img>
<img className="MangaItem-Cover" src={MangaFunctions.GetMangaCoverImageUrl(apiUri, mangaId, undefined)} alt="MangaFunctions Cover" onLoad={LoadMangaCover} onResize={LoadMangaCover}></img>
<p className="MangaItem-Connector">{manga ? manga.mangaConnectorId : "Connector"}</p>
<p className="MangaItem-Status" release-status={manga?.releaseStatus}></p>
<p className="MangaItem-Name">{manga ? manga.name : "Name"}</p>

View File

@ -1,5 +0,0 @@
import IJob from "./IJob";
export default interface DownloadAvailableChaptersJob extends IJob {
mangaId: string;
}

View File

@ -1,5 +0,0 @@
import IJob from "./IJob";
export default interface DownloadMangaCoverJob extends IJob {
mangaId: string;
}

View File

@ -1,5 +0,0 @@
import IJob from "./IJob";
export default interface DownloadSingleChapterJob extends IJob {
chapterId: string;
}

View File

@ -0,0 +1,5 @@
import IJob from "./IJob";
export default interface IDownloadAvailableChaptersJob extends IJob {
mangaId: string;
}

View File

@ -0,0 +1,5 @@
import IJob from "./IJob";
export default interface IDownloadMangaCoverJob extends IJob {
mangaId: string;
}

View File

@ -0,0 +1,5 @@
import IJob from "./IJob";
export default interface IDownloadSingleChapterJob extends IJob {
chapterId: string;
}

View File

@ -17,7 +17,8 @@ export enum JobType {
MoveFileOrFolderJob = "MoveFileOrFolderJob",
DownloadMangaCoverJob = "DownloadMangaCoverJob",
RetrieveChaptersJob = "RetrieveChaptersJob",
UpdateFilesDownloadedJob = "UpdateFilesDownloadedJob"
UpdateFilesDownloadedJob = "UpdateFilesDownloadedJob",
MoveMangaLibraryJob = "MoveMangaLibraryJob"
}
export enum JobState {

View File

@ -1,6 +1,6 @@
import IJob from "./IJob";
export default interface MoveFileOrFolderJob extends IJob {
export default interface IMoveFileOrFolderJob extends IJob {
fromLocation: string;
toLocation: string;
}

View File

@ -0,0 +1,6 @@
import IJob from "./IJob";
export default interface IMoveMangaLibraryJob extends IJob {
MangaId: string;
ToLibraryId: string;
}

View File

@ -0,0 +1,5 @@
import IJob from "./IJob";
export default interface IRetrieveChaptersJob extends IJob {
mangaId: string;
}

View File

@ -0,0 +1,5 @@
import IJob from "./IJob";
export default interface IUpdateFilesDownloadedJob extends IJob {
mangaId: string;
}

View File

@ -0,0 +1,5 @@
import IJob from "./IJob";
export default interface IUpdateMetadataJob extends IJob {
mangaId: string;
}

View File

@ -1,5 +0,0 @@
import IJob from "./IJob";
export default interface RetrieveChaptersJob extends IJob {
mangaId: string;
}

View File

@ -1,5 +0,0 @@
import IJob from "./IJob";
export default interface UpdateFilesDownloadedJob extends IJob {
mangaId: string;
}

View File

@ -1,5 +0,0 @@
import IJob from "./IJob";
export default interface UpdateMetadataJob extends IJob {
mangaId: string;
}

View File

@ -1,51 +0,0 @@
import ILocalLibrary from "./ILocalLibrary";
import {deleteData, getData, patchData, putData} from "../../App";
import INewLibraryRecord from "./records/INewLibraryRecord";
export default class LocalLibrary
{
static async GetLibraries(apiUri: string): Promise<ILocalLibrary[]> {
return getData(`${apiUri}/v2/LocalLibraries`)
.then((json) => {
const ret = json as ILocalLibrary[];
console.debug(ret);
return (ret);
});
}
static async GetLibrary(apiUri: string, libraryId: string): Promise<ILocalLibrary> {
return getData(`${apiUri}/v2/LocalLibraries/${libraryId}`)
.then((json) => {
const ret = json as ILocalLibrary;
//console.debug(ret);
return (ret);
});
}
static async CreateLibrary(apiUri: string, data: INewLibraryRecord): Promise<ILocalLibrary> {
return putData(`${apiUri}/v2/LocalLibraries`, data)
.then((json) => {
const ret = json as ILocalLibrary;
//console.debug(ret);
return (ret);
});
}
static async DeleteLibrary(apiUri: string, libraryId: string): Promise<void> {
return deleteData(`${apiUri}/v2/LocalLibraries/${libraryId}`);
}
static async ChangeLibraryPath(apiUri: string, libraryId: string, newPath: string): Promise<void> {
return patchData(`${apiUri}/v2/LocalLibraries/${libraryId}/ChangeBasePath`, newPath)
.then(()=> {
return Promise.resolve()
});
}
static async ChangeLibraryName(apiUri: string, libraryId: string, newName: string): Promise<void> {
return patchData(`${apiUri}/v2/LocalLibraries/${libraryId}/ChangeName`, newName)
.then(()=> {
return Promise.resolve()
});
}
}

View File

@ -1,9 +0,0 @@
export default interface ICoverFormatRequestRecord {
size: Size;
}
export interface Size {
width: number;
height: number;
isEmpty: boolean;
}

View File

@ -0,0 +1,3 @@
export default interface ILunaseaRecord {
id: string;
}

View File

@ -1,3 +0,0 @@
export default interface IlunaseaRecord {
id: string;
}