mirror of
https://github.com/sussy-code/smov.git
synced 2026-05-03 16:58:55 +00:00
79 lines
2.3 KiB
TypeScript
79 lines
2.3 KiB
TypeScript
import { useMemo } from "react";
|
|
import { useTranslation } from "react-i18next";
|
|
|
|
import { Button } from "@/components/buttons/Button";
|
|
import { Icons } from "@/components/Icon";
|
|
import { IconPill } from "@/components/layout/IconPill";
|
|
import { useModal } from "@/components/overlays/Modal";
|
|
import { Paragraph } from "@/components/text/Paragraph";
|
|
import { Title } from "@/components/text/Title";
|
|
import { ScrapingItems, ScrapingSegment } from "@/hooks/useProviderScrape";
|
|
import { ErrorContainer, ErrorLayout } from "@/pages/layouts/ErrorLayout";
|
|
|
|
import { ErrorCardInModal } from "../errors/ErrorCard";
|
|
|
|
export interface ScrapeErrorPartProps {
|
|
data: {
|
|
sources: Record<string, ScrapingSegment>;
|
|
sourceOrder: ScrapingItems[];
|
|
};
|
|
}
|
|
|
|
export function ScrapeErrorPart(props: ScrapeErrorPartProps) {
|
|
const { t } = useTranslation();
|
|
const modal = useModal("error");
|
|
|
|
const error = useMemo(() => {
|
|
const data = props.data;
|
|
const amountError = Object.values(data.sources).filter(
|
|
(v) => v.status === "failure"
|
|
);
|
|
if (amountError.length === 0) return null;
|
|
let str = "";
|
|
Object.values(data.sources).forEach((v) => {
|
|
str += `${v.id}: ${v.status}\n`;
|
|
if (v.reason) str += `${v.reason}\n`;
|
|
if (v.error) str += `${v.error.toString()}\n`;
|
|
});
|
|
return str;
|
|
}, [props]);
|
|
|
|
return (
|
|
<ErrorLayout>
|
|
<ErrorContainer>
|
|
<IconPill icon={Icons.WAND}>
|
|
{t("player.scraping.notFound.badge")}
|
|
</IconPill>
|
|
<Title>{t("player.scraping.notFound.title")}</Title>
|
|
<Paragraph>{t("player.scraping.notFound.text")}</Paragraph>
|
|
<div className="flex gap-3">
|
|
<Button
|
|
href="/"
|
|
theme="secondary"
|
|
padding="md:px-12 p-2.5"
|
|
className="mt-6"
|
|
>
|
|
{t("player.scraping.notFound.homeButton")}
|
|
</Button>
|
|
<Button
|
|
onClick={() => modal.show()}
|
|
theme="purple"
|
|
padding="md:px-12 p-2.5"
|
|
className="mt-6"
|
|
>
|
|
{t("errors.showError")}
|
|
</Button>
|
|
</div>
|
|
</ErrorContainer>
|
|
<ErrorContainer maxWidth="max-w-[45rem]">
|
|
{error ? (
|
|
<ErrorCardInModal
|
|
id={modal.id}
|
|
onClose={() => modal.hide()}
|
|
error={error}
|
|
/>
|
|
) : null}
|
|
</ErrorContainer>
|
|
</ErrorLayout>
|
|
);
|
|
}
|