mirror of
https://github.com/C9Glax/tranga-website.git
synced 2025-04-18 22:33:20 +02:00
108 lines
4.7 KiB
TypeScript
108 lines
4.7 KiB
TypeScript
import Manga from "../Manga";
|
|
import React, {ReactElement, ReactEventHandler} from "react";
|
|
import Icon from '@mdi/react';
|
|
import { mdiTagTextOutline, mdiAccountEdit, mdiLinkVariant } from '@mdi/js';
|
|
import MarkdownPreview from '@uiw/react-markdown-preview';
|
|
import IJob from "./IJob";
|
|
import {AuthorElement} from "./IAuthor";
|
|
import Job from "../Job";
|
|
import {LinkElement} from "./ILink";
|
|
|
|
export default interface IManga{
|
|
mangaId: string;
|
|
connectorId: string;
|
|
name: string;
|
|
description: string;
|
|
websiteUrl: string;
|
|
year: number;
|
|
originalLanguage: string;
|
|
releaseStatus: MangaReleaseStatus;
|
|
folderName: string;
|
|
ignoreChapterBefore: number;
|
|
mangaConnectorId: string;
|
|
authorIds: string[];
|
|
tags: string[];
|
|
linkIds: string[];
|
|
altTitleIds: string[];
|
|
}
|
|
|
|
export enum MangaReleaseStatus {
|
|
Continuing = "Continuing",
|
|
Completed = "Completed",
|
|
OnHiatus = "OnHiatus",
|
|
Cancelled = "Cancelled",
|
|
Unreleased = "Unreleased",
|
|
}
|
|
|
|
export function CoverCard(apiUri: string, manga: IManga) : ReactElement {
|
|
return(
|
|
<div className="Manga" key={manga.mangaId}>
|
|
<img src="../../media/blahaj.png" alt="Manga Cover"></img>
|
|
<div>
|
|
<p className="pill connector-name">{manga.mangaConnectorId}</p>
|
|
<div className="Manga-status" release-status={manga.releaseStatus}></div>
|
|
<p className="Manga-name">{manga.name}</p>
|
|
</div>
|
|
</div>);
|
|
}
|
|
|
|
export function SearchResult(apiUri: string, manga: IManga, interval: Date, onJobsChanged: (internalId: string) => void) : ReactElement {
|
|
const MangaCover : ReactEventHandler<HTMLImageElement> = (e) => {
|
|
console.log(manga.mangaId);
|
|
if(e.currentTarget.src != Manga.GetMangaCoverImageUrl(apiUri, manga.mangaId, e.currentTarget))
|
|
e.currentTarget.src = Manga.GetMangaCoverImageUrl(apiUri, manga.mangaId, e.currentTarget);
|
|
}
|
|
|
|
return(
|
|
<div className="SearchResult" key={manga.mangaId}>
|
|
<img src={Manga.GetMangaCoverImageUrl(apiUri, manga.mangaId, undefined)} alt="Manga Cover" onLoad={MangaCover}></img>
|
|
<p className="connector-name">{manga.mangaConnectorId}</p>
|
|
<div className="Manga-status" release-status={manga.releaseStatus}></div>
|
|
<p className="Manga-name"><a href={manga.websiteUrl}>{manga.name}<img src="../../media/link.svg"
|
|
alt=""/></a></p>
|
|
<div className="Manga-tags">
|
|
{manga.authorIds.map(authorId =>
|
|
<p className="Manga-author" key={manga.mangaId + "-author-" + authorId} >
|
|
<Icon path={mdiAccountEdit} size={0.5} />
|
|
<AuthorElement apiUri={apiUri} authorId={authorId}></AuthorElement>
|
|
</p>)}
|
|
{manga.tags.map(tag =>
|
|
<p className="Manga-tag" key={manga.mangaId + "-tag-" + tag}>
|
|
<Icon path={mdiTagTextOutline} size={0.5}/>
|
|
{tag}
|
|
</p>)}
|
|
{manga.linkIds.map(linkId =>
|
|
<p className="Manga-link" key={manga.mangaId + "-link-" + linkId}>
|
|
<Icon path={mdiLinkVariant} size={0.5}/>
|
|
<LinkElement apiUri={apiUri} linkId={linkId}></LinkElement>
|
|
</p>)}
|
|
</div>
|
|
<MarkdownPreview className="Manga-description" source={manga.description}
|
|
style={{backgroundColor: "transparent", color: "black"}}/>
|
|
<button className="Manga-AddButton" onClick={() => {
|
|
Job.CreateDownloadAvailableChaptersJob(apiUri, manga.mangaId, interval.getMilliseconds()).then(() => onJobsChanged(manga.mangaId));
|
|
}}>Monitor
|
|
</button>
|
|
</div>);
|
|
}
|
|
|
|
export function QueueItem(apiUri: string, manga: IManga, job: IJob, triggerUpdate: () => void){
|
|
return (
|
|
<div className="QueueJob" key={"QueueJob-" + job.jobId}>
|
|
<img src="../../media/blahaj.png" alt="Manga Cover"></img>
|
|
<p className="QueueJob-Name">{manga.name}</p>
|
|
<p className="QueueJob-JobType">{job.jobType}</p>
|
|
<div className="QueueJob-actions">
|
|
<button className="QueueJob-Cancel"
|
|
onClick={() => Job.StopJob(apiUri, job.jobId).then(triggerUpdate)}>Cancel
|
|
</button>
|
|
{job.parentJobId != null
|
|
? <button className="QueueJob-Cancel"
|
|
onClick={() => Job.StopJob(apiUri, job.parentJobId!).then(triggerUpdate)}>Cancel all
|
|
related</button>
|
|
: <></>
|
|
}
|
|
</div>
|
|
</div>
|
|
);
|
|
} |