import { ReactNode, useCallback, useEffect, useMemo, useState } from "react"; import { MWEmbed, MWEmbedScraper, MWEmbedType } from "@/backend/helpers/embed"; import { getEmbeds } from "@/backend/helpers/register"; import { runEmbedScraper } from "@/backend/helpers/run"; import { MWStream } from "@/backend/helpers/streams"; import { Button } from "@/components/Button"; 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 { embedType: MWEmbedType; onSelect: (meta: MWEmbed) => void; } interface EmbedScraperSelectorProps { onSelect: (embedScraperId: string) => void; } interface MediaScraperProps { embed: MWEmbed; scraper: MWEmbedScraper; } function MediaSelector(props: MediaSelectorProps) { const [url, setUrl] = useState(""); const select = useCallback( (urlSt: string) => { props.onSelect({ type: props.embedType, url: urlSt, }); }, [props] ); return (
Input embed url
setUrl(e.target.value)} />
); } function MediaScraper(props: MediaScraperProps) { const [results, setResults] = useState(null); const [percentage, setPercentage] = useState(0); const [scrape, loading, error] = useLoading(async (url: string) => { const data = await runEmbedScraper(props.scraper, { url, progress(num) { console.log(`SCRAPING AT ${num}%`); setPercentage(num); }, }); console.log("got data", data); setResults(data); }); useEffect(() => { if (props.embed) { scrape(props.embed.url); } }, [props.embed, scrape]); if (loading) return

Scraping... ({percentage}%)

; if (error) return

Errored, check console

; return (
Output data
{JSON.stringify(results, null, 2)}
); } function EmbedScraperSelector(props: EmbedScraperSelectorProps) { const embedScrapers = getEmbeds(); return (
Choose embed scraper {embedScrapers.map((v) => ( props.onSelect(v.id)} direction="right" linkText={v.displayName} /> ))}
); } export default function EmbedTesterView() { const [embed, setEmbed] = useState(null); const [embedScraperId, setEmbedScraperId] = useState(null); const embedScraper = useMemo( () => getEmbeds().find((v) => v.id === embedScraperId), [embedScraperId] ); let content: ReactNode = null; if (!embedScraperId || !embedScraper) { content = setEmbedScraperId(id)} />; } else if (!embed) { content = ( setEmbed(v)} /> ); } else { content = ; } return (
{content}
); }