"use client";
import { useState, useEffect } from "react";
import { MediaPlayer, MediaProvider } from "@vidstack/react";
import "@vidstack/react/player/styles/default/theme.css";
import "@vidstack/react/player/styles/default/layouts/video.css";
import {
defaultLayoutIcons,
DefaultVideoLayout,
} from "@vidstack/react/player/layouts/default";
import styles from "../styles/buttons.module.css";
import { video_url } from "../data-fetch/request";
import { preFetchVideoLinks } from "./cacher";
import { storeLocal } from "./storeHistory";
const EpisodesButtons = ({ data: data }) => {
const [videoLink, setVideoLink] = useState(null);
const [buttonGroups, setButtonGroups] = useState(null);
const [videoLoading, setVideoLoading] = useState(null);
useEffect(() => {
setButtonGroups(createButtonGroups(0, 50));
}, []);
const groups = createGroups(data.episodes, 50);
/**
* Retrieves the video URL for a given episode ID.
* This function handles the initializing, changing URL, and hiding the video player.
* @param {string} epID - The episode ID.
*/
async function getVideoURL(epID) {
setVideoLoading(true);
const data = await video_url(epID);
setVideoLink(data.sources[data.sources.length - 2].url);
setVideoLoading(false);
}
/**
* Creates button groups for a range of episodes.
* @param {number} start - The starting index of episodes.
* @param {number} end - The ending index of episodes.
* @returns {JSX.Element} - Button groups JSX element.
*/
function createButtonGroups(start, end) {
try {
const buttons = document.getElementsByClassName("episode-button");
for (let i = 0; i < buttons.length; i++) {
buttons[i].style.backgroundColor = "#1f1f1fd2";
}
} catch (error) {
console.error(
"ERROR: This error is expected. This is done in order to reset the background color of the buttons. I can't think of a better way than this....so yeah.",
error.message
);
}
return (
)}
);
};
/**
* Divides an array into groups of a specified size.
* @param {Array} array - The array to be divided.
* @param {number} size - The size of each group.
* @returns {Array} - An array containing groups of elements.
*/
function createGroups(array, size) {
const groups = [];
for (let i = 0; i < array.length; i += size) {
groups.push(array.slice(i, i + size));
}
return groups;
}
/**
* Stores watch history to local storage.
* @param {string} name - The name of the episode.
* @param {string} image - The image URL of the episode.
* @param {number} episode - The episode number.
* @param {string} id - The ID of the episode.
*/
function store_to_local(name, image, episode, id) {
const currentDate = new Date();
try {
let newData = {
name: name,
image: image,
episode: episode,
id: id,
type: "anime",
date: `${currentDate.getDate()}-${String(
currentDate.getMonth() + 1
).padStart(2, "0")}`,
time: `${currentDate.getHours()}:${String(
currentDate.getMinutes()
).padStart(2, "0")}`,
};
storeLocal(newData);
} catch (error) {
console.error(
"Some error occurred during the process of saving your watch history to local storage. Please try again or contact us on GitHub if this issue persists.",
error.message
);
}
}
export default EpisodesButtons;