smov/src/pages/parts/player/ScrapeErrorPart.tsx
mrjvs 4dc3a3216a Some shoepolish for movie-web
Co-authored-by: Jip Frijlink <JipFr@users.noreply.github.com>
2023-11-30 21:25:28 +01:00

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>
);
}