"use client"; import { Spinner } from "#/components/Spinner/Spinner"; import { useUserStore } from "#/store/auth"; import { Card, Dropdown, Button } from "flowbite-react"; import { ENDPOINTS } from "#/api/config"; import { useState, useEffect } from "react"; const DropdownTheme = { floating: { target: "w-full md:min-w-[256px] md:w-fit", }, }; async function _fetch(url: string) { const data = fetch(url) .then((res) => { if (res.ok) { return res.json(); } else { throw new Error("Error fetching data"); } }) .catch((err) => console.log(err)); return data; } export const ReleasePlayer = (props: { id: number }) => { const token = useUserStore((state) => state.token); const [voiceoverInfo, setVoiceoverInfo] = useState(null); const [selectedVoiceover, setSelectedVoiceover] = useState(null); const [sourcesInfo, setSourcesInfo] = useState(null); const [selectedSource, setSelectedSource] = useState(null); const [episodeInfo, setEpisodeInfo] = useState(null); const [selectedEpisode, setSelectedEpisode] = useState(null); useEffect(() => { async function _fetchInfo() { const voiceover = await _fetch( `${ENDPOINTS.release.episode}/${props.id}` ); setVoiceoverInfo(voiceover.types); setSelectedVoiceover(voiceover.types[0]); } _fetchInfo(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { async function _fetchInfo() { const sources = await _fetch( `${ENDPOINTS.release.episode}/${props.id}/${selectedVoiceover.id}` ); setSourcesInfo(sources.sources); setSelectedSource(sources.sources[0]); } if (selectedVoiceover) { _fetchInfo(); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedVoiceover]); useEffect(() => { async function _fetchInfo(url: string) { const episodes = await _fetch(url); if (episodes.episodes.length === 0) { const remSources = sourcesInfo.filter((source) => source.id !== selectedSource.id); setSourcesInfo(remSources); setSelectedSource(remSources[0]); return; } setEpisodeInfo(episodes.episodes); setSelectedEpisode(episodes.episodes[0]); } if (selectedSource) { let url = `${ENDPOINTS.release.episode}/${props.id}/${selectedVoiceover.id}/${selectedSource.id}`; if (token) { url = `${ENDPOINTS.release.episode}/${props.id}/${selectedVoiceover.id}/${selectedSource.id}?token=${token}`; } _fetchInfo(url); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedSource, token]); async function _addToHistory(episode: any) { if (episode && token) { _fetch( `${ENDPOINTS.statistic.addHistory}/${props.id}/${selectedSource.id}/${episode.position}?token=${token}` ); _fetch( `${ENDPOINTS.statistic.markWatched}/${props.id}/${selectedSource.id}/${episode.position}?token=${token}` ); } } return ( {!voiceoverInfo || !sourcesInfo || !episodeInfo ? (
) : ( <>
{voiceoverInfo.map((voiceover: any) => ( setSelectedVoiceover(voiceover)} > {voiceover.name} ))} {sourcesInfo.map((source: any) => ( setSelectedSource(source)} > {source.name} ))}
{episodeInfo.map((episode: any) => ( ))}
)}
); };