import { ReactNode, useEffect, useState } from "react";
import { testData } from "@/__tests__/providers/testdata";
import { MWProviderScrapeResult } from "@/backend/helpers/provider";
import { getProviders } from "@/backend/helpers/register";
import { runProvider } from "@/backend/helpers/run";
import { DetailedMeta } from "@/backend/metadata/getmeta";
import { Navigation } from "@/components/layout/Navigation";
import { ArrowLink } from "@/components/text/ArrowLink";
import { Title } from "@/components/text/Title";
import { useLoading } from "@/hooks/useLoading";
interface MediaSelectorProps {
onSelect: (meta: DetailedMeta) => void;
}
interface ProviderSelectorProps {
onSelect: (providerId: string) => void;
}
interface MediaScraperProps {
media: DetailedMeta | null;
id: string;
}
function MediaSelector(props: MediaSelectorProps) {
const options: DetailedMeta[] = testData;
return (
Choose media
{options.map((v) => (
props.onSelect(v)}
direction="right"
linkText={`${v.meta.title} (${v.meta.type})`}
/>
))}
);
}
function MediaScraper(props: MediaScraperProps) {
const [results, setResults] = useState(null);
const [percentage, setPercentage] = useState(0);
const [scrape, loading, error] = useLoading(async (media: DetailedMeta) => {
const provider = getProviders().find((v) => v.id === props.id);
if (!provider) throw new Error("provider not found");
const data = await runProvider(provider, {
progress(num) {
console.log(`SCRAPING AT ${num}%`);
setPercentage(num);
},
media,
type: media.meta.type as any,
});
console.log("got data", data);
setResults(data);
});
useEffect(() => {
if (props.media) {
scrape(props.media);
}
}, [props.media, scrape]);
if (loading) return Scraping... ({percentage}%)
;
if (error) return Errored, check console
;
return (
Output data
{JSON.stringify(results, null, 2)}
);
}
function ProviderSelector(props: ProviderSelectorProps) {
const providers = getProviders();
return (
Choose provider
{providers.map((v) => (
props.onSelect(v.id)}
direction="right"
linkText={v.displayName}
/>
))}
);
}
export default function ProviderTesterView() {
const [media, setMedia] = useState(null);
const [providerId, setProviderId] = useState(null);
let content: ReactNode = null;
if (!providerId) {
content = setProviderId(id)} />;
} else if (!media) {
content = setMedia(v)} />;
} else {
content = ;
}
return (
);
}