"use client"; import { ENDPOINTS } from "#/api/config"; import { useState, useEffect } from "react"; import { Swiper, SwiperSlide } from "swiper/react"; import "swiper/css"; import "swiper/css/navigation"; import "swiper/css/mousewheel"; import "swiper/css/scrollbar"; import { Navigation, Mousewheel, Scrollbar } from "swiper/modules"; import { Button } from "flowbite-react"; import { getAnonEpisodesWatched, saveAnonEpisodeWatched, } from "./ReleasePlayer"; interface Episode { id: number; position: number; name: string; is_watched: boolean; } interface Source { id: number; name: string; episodes_count: number; } export const EpisodeSelector = (props: { availableEpisodes: Episode[]; episode: Episode; setEpisode: any; source: Source; release_id: any; voiceover: any; token: string | null; }) => { let anonEpisodesWatched = getAnonEpisodesWatched( props.release_id, props.source.id, props.voiceover.id ); anonEpisodesWatched = anonEpisodesWatched[props.release_id][props.source.id][props.voiceover.id]; async function saveEpisodeToHistory(episode: Episode) { if (episode && props.token) { fetch( `${ENDPOINTS.statistic.addHistory}/${props.release_id}/${props.source.id}/${episode.position}?token=${props.token}` ); fetch( `${ENDPOINTS.statistic.markWatched}/${props.release_id}/${props.source.id}/${episode.position}?token=${props.token}` ); } } return ( <div> <Swiper modules={[Navigation, Mousewheel, Scrollbar]} spaceBetween={8} slidesPerView={"auto"} direction={"horizontal"} mousewheel={{ enabled: true, sensitivity: 4, }} scrollbar={true} allowTouchMove={true} style={ { "--swiper-scrollbar-bottom": "0", } as React.CSSProperties } > {props.availableEpisodes.map((episode: Episode) => ( <SwiperSlide key={`episode_${episode.position}`} style={{ maxWidth: "fit-content" }} > <Button color={ props.episode.position === episode.position ? "blue" : "light" } theme={{ base: "w-full disabled:opacity-100" }} onClick={() => { if (["Sibnet"].includes(props.source.name)) { props.availableEpisodes[episode.position].is_watched = true; } else { props.availableEpisodes[episode.position - 1].is_watched = true; } saveAnonEpisodeWatched( props.release_id, props.source.id, props.voiceover.id, episode.position ); saveEpisodeToHistory(episode); props.setEpisode({ selected: { ...episode, is_watched: true }, available: props.availableEpisodes, }); }} disabled={props.episode.position === episode.position} > <div className="flex items-center"> {episode.name ? episode.name : ["Sibnet"].includes(props.source.name) ? `${episode.position + 1} Серия` : `${episode.position} Серия`} {( episode.is_watched || Object.keys(anonEpisodesWatched).includes( episode.position.toString() ) ) ? <span className="w-4 h-4 ml-2 iconify material-symbols--check-circle"></span> : <span className="w-4 h-4 ml-2 iconify material-symbols--check-circle-outline"></span> } </div> </Button> </SwiperSlide> ))} </Swiper> </div> ); };