import React, { useState, useEffect, useRef } from "react"; import { useParams } from "react-router-dom"; import ListRow from "../components/Layout/ListRow"; import DynamicPageContent from "../components/Layout/DynamicPageContent"; import { fetchContentOnScroll } from "../hooks/fetchContentOnScroll"; import Button from "../components/Input/Button"; import { useAuth } from "../context/AuthContext"; import { useCategoryFollow } from "../hooks/useCategoryFollow"; import { ListItemProps as StreamData } from "../components/Layout/ListItem"; const CategoryPage: React.FC = () => { const { categoryName } = useParams<{ categoryName: string }>(); const [streams, setStreams] = useState([]); const listRowRef = useRef(null); const isLoading = useRef(false); const [streamOffset, setStreamOffset] = useState(0); const [noStreams, setNoStreams] = useState(12); const [hasMoreData, setHasMoreData] = useState(true); const { isLoggedIn } = useAuth(); const { isCategoryFollowing, checkCategoryFollowStatus, followCategory, unfollowCategory, } = useCategoryFollow(); useEffect(() => { if (categoryName) checkCategoryFollowStatus(categoryName); }, [categoryName]); const fetchCategoryStreams = async () => { // If already loading, skip this fetch if (isLoading.current) return; isLoading.current = true; try { const response = await fetch( `/api/streams/popular/${categoryName}/${noStreams}/${streamOffset}` ); if (!response.ok) { throw new Error("Failed to fetch category streams"); } const data = await response.json(); if (data.length === 0) { setHasMoreData(false); return []; } setStreamOffset((prev) => prev + data.length); const processedStreams: StreamData[] = data.map((stream: any) => ({ type: "stream", id: stream.user_id, title: stream.title, username: stream.username, streamCategory: categoryName, viewers: stream.num_viewers, thumbnail: stream.thumbnail || (categoryName && `/images/category_thumbnails/${categoryName .toLowerCase() .replace(/ /g, "_")}.webp`), })); setStreams((prev) => [...prev, ...processedStreams]); return processedStreams; } catch (error) { console.error("Error fetching category streams:", error); } finally { isLoading.current = false; } }; useEffect(() => { fetchCategoryStreams(); }, []); const logOnScroll = async () => { if (hasMoreData && listRowRef.current) { const newCategories = await fetchCategoryStreams(); if (newCategories && newCategories.length > 0) { listRowRef.current.addMoreItems(newCategories); } else console.log("No more data to fetch"); } }; fetchContentOnScroll(logOnScroll, hasMoreData); const handleStreamClick = (streamerName: string) => { window.location.href = `/${streamerName}`; }; if (hasMoreData && !streams.length) { return (
Loading...
); } return (
{isLoggedIn && ( )}
{streams.length === 0 && !isLoading && (
No live streams found in this category
)}
); }; export default CategoryPage;