import type { SheetProps } from "tamagui"; import { useCallback, useEffect, useState } from "react"; import { Ionicons, MaterialCommunityIcons } from "@expo/vector-icons"; import { Spinner, Text, useTheme, View } from "tamagui"; import { getBuiltinSources, providers } from "@movie-web/provider-utils"; import { useEmbedScrape, useSourceScrape, } from "~/hooks/player/useSourceScrape"; import { usePlayerStore } from "~/stores/player/store"; import { MWButton } from "../ui/Button"; import { Controls } from "./Controls"; import { Settings } from "./settings/Sheet"; const SourceItem = ({ name, id, active, embed, onPress, }: { name: string; id: string; active?: boolean; embed?: { url: string; embedId: string }; onPress?: (id: string) => void; }) => { const theme = useTheme(); const { mutate, isPending, isError } = useEmbedScrape(); return ( {active && ( )} {isError && ( )} {isPending && } } onPress={() => { if (onPress) { onPress(id); return; } if (embed) { mutate({ url: embed.url, embedId: embed.embedId, sourceId: id, }); } }} /> ); }; const EmbedsPart = ({ sourceId, closeParent, ...props }: SheetProps & { sourceId: string; closeParent?: (open: boolean) => void; }) => { const theme = useTheme(); const { data, isPending, isError, error, status } = useSourceScrape(sourceId); useEffect(() => { if (status === "success" && !isError && data && data?.length <= 1) { props.onOpenChange?.(false); closeParent?.(false); } }, [status, data, isError, props, closeParent]); return ( { props.onOpenChange?.(false); }} /> } title={providers.getMetadata(sourceId)?.name ?? "Embeds"} /> {isPending && } {error && Something went wrong!} {data && data?.length > 1 && ( {data.map((embed) => { const metaData = providers.getMetadata(embed.embedId)!; return ( ); })} )} ); }; export const SourceSelector = () => { const theme = useTheme(); const [open, setOpen] = useState(false); const [embedOpen, setEmbedOpen] = useState(false); const sourceId = usePlayerStore((state) => state.interface.sourceId); const setSourceId = usePlayerStore((state) => state.setSourceId); const isActive = useCallback( (id: string) => { return sourceId === id; }, [sourceId], ); return ( <> } onPress={() => setOpen(true)} > Source {embedOpen && sourceId ? ( ) : ( <> setOpen(false)} /> } title="Sources" /> {getBuiltinSources() .sort((a, b) => b.rank - a.rank) .map((source) => ( { setSourceId(id); setEmbedOpen(true); }} /> ))} )} ); };