import { ReactNode } from "react"; import { useAsync, useAsyncFn } from "react-use"; import { downloadSrt, getHighestRatedSubs, getOpenSubsId, } from "@/backend/helpers/subs"; import { FlagIcon } from "@/components/FlagIcon"; import { Menu } from "@/components/player/internals/ContextMenu"; import { SelectableLink } from "@/components/player/internals/ContextMenu/Links"; import { useOverlayRouter } from "@/hooks/useOverlayRouter"; import { usePlayerStore } from "@/stores/player/store"; import { useSubtitleStore } from "@/stores/subtitles"; export function CaptionOption(props: { countryCode?: string; children: React.ReactNode; selected?: boolean; onClick?: () => void; }) { return ( {props.children} ); } export function CaptionsView({ id }: { id: string }) { const router = useOverlayRouter(id); const setCaption = usePlayerStore((s) => s.setCaption); const lang = usePlayerStore((s) => s.caption.selected?.language); const setLanguage = useSubtitleStore((s) => s.setLanguage); const meta = usePlayerStore((s) => s.meta); const req = useAsync(async () => { if (!meta) throw new Error("No meta"); const subId = await getOpenSubsId(meta); if (!subId) throw new Error("No sub id found"); const subs = await getHighestRatedSubs(subId); return { subId, subs, }; }, [meta]); const [downloadReq, startDownload] = useAsyncFn( async (subtitleId: string, language: string) => { const srtData = await downloadSrt(subtitleId); setCaption({ language, srtData, url: "", // TODO remove url }); setLanguage(language); }, [setCaption, setLanguage] ); function disableCaption() { setCaption(null); setLanguage(null); } let downloadProgress: ReactNode = null; if (downloadReq.loading) downloadProgress =

downloading...

; else if (downloadReq.error) downloadProgress =

failed to download...

; let content: ReactNode = null; if (req.loading) content =

loading...

; else if (req.error) content =

errored!

; else if (req.value) content = req.value.subs.map((v) => ( startDownload(v.id, v.language)} > {v.language} )); return ( <> router.navigate("/")} rightSide={ } > Captions {downloadProgress} disableCaption()} selected={!lang}> Off {content} ); }