From 2494e40ffd09ee704397c812f63d03bb7ec156f1 Mon Sep 17 00:00:00 2001 From: EvanLin3141 Date: Mon, 3 Mar 2025 13:31:37 +0000 Subject: [PATCH] Refactor: Follow and Follow Categories in the same page --- frontend/src/App.tsx | 1 - frontend/src/pages/FollowUsers.tsx | 101 ---------------------- frontend/src/pages/FollowedCategories.tsx | 84 ------------------ frontend/src/pages/Following.tsx | 32 ++++++- 4 files changed, 30 insertions(+), 188 deletions(-) delete mode 100644 frontend/src/pages/FollowUsers.tsx delete mode 100644 frontend/src/pages/FollowedCategories.tsx diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 29f1bf4..0009939 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -15,7 +15,6 @@ import DashboardPage from "./pages/DashboardPage"; import { Brightness } from "./context/BrightnessContext"; import LoadingScreen from "./components/Layout/LoadingScreen"; import Following from "./pages/Following"; -import FollowedCategories from "./pages/FollowedCategories"; function App() { const [isLoggedIn, setIsLoggedIn] = useState(false); diff --git a/frontend/src/pages/FollowUsers.tsx b/frontend/src/pages/FollowUsers.tsx deleted file mode 100644 index 9ed7009..0000000 --- a/frontend/src/pages/FollowUsers.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import React, { useEffect, useState } from "react"; -import { useAuth } from "../context/AuthContext"; -import { useNavigate } from "react-router-dom"; -import DynamicPageContent from "../components/Layout/DynamicPageContent"; -import { useFollow } from "../hooks/useFollow"; -import { useAuthModal } from "../hooks/useAuthModal"; -import FollowUserButton from "../components/Input/FollowUserButton"; - -interface Streamer { - user_id: number; - username: string; -} - -interface FollowingStreamerProps { - extraClasses?: string; -} - -const FollowUsers: React.FC = ({ extraClasses = "" }) => { - const navigate = useNavigate(); - const { isLoggedIn } = useAuth(); - const [followedStreamers, setFollowedStreamers] = useState([]); - const [followingStatus, setFollowingStatus] = useState<{ [key: number]: boolean }>({}); // Store follow status for each streamer - - const { isFollowing, checkFollowStatus, followUser, unfollowUser } = - useFollow(); - - useEffect(() => { - const fetchFollowedStreamers = async () => { - try { - const response = await fetch("/api/user/following"); - if (!response.ok) throw new Error("Failed to fetch followed streamers"); - const data = await response.json(); - setFollowedStreamers(data); - - const updatedStatus: { [key: number]: boolean } = {}; - for (const streamer of data || []) { - const status = await checkFollowStatus(streamer.username); - updatedStatus[streamer.user_id] = Boolean(status); - } - setFollowingStatus(updatedStatus); - - console.log("Fetched Follow Status:", updatedStatus); // Log the status - } catch (error) { - console.error("Error fetching followed streamers:", error); - } - }; - - if (isLoggedIn) { - fetchFollowedStreamers(); - } - }, [isLoggedIn]); - - - const handleFollowToggle = async (userId: number) => { - const isCurrentlyFollowing = followingStatus[userId]; - - if (isCurrentlyFollowing) { - await unfollowUser(userId); - } else { - await followUser(userId); - } - - // Update local state for this specific streamer - setFollowingStatus((prev) => ({ - ...prev, - [userId]: !isCurrentlyFollowing, // Toggle based on previous state - })); - }; - - return ( - - - - ); -}; - -export default FollowUsers; \ No newline at end of file diff --git a/frontend/src/pages/FollowedCategories.tsx b/frontend/src/pages/FollowedCategories.tsx deleted file mode 100644 index c71633d..0000000 --- a/frontend/src/pages/FollowedCategories.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import React, { useState, useEffect, useRef } from "react"; -import { useAuth } from "../context/AuthContext"; -import { useNavigate, useParams } from "react-router-dom"; -import DynamicPageContent from "../components/Layout/DynamicPageContent"; -import { useCategoryFollow } from "../hooks/useCategoryFollow"; -import FollowButton from "../components/Input/FollowButton"; -import { useAuthModal } from "../hooks/useAuthModal"; - - -interface Category { - isFollowing: boolean; - category_id: number; - category_name: string; -} - -interface FollowedCategoryProps { - extraClasses?: string; -} - -const FollowedCategories: React.FC = ({ extraClasses = "" }) => { - const navigate = useNavigate(); - const { username, isLoggedIn } = useAuth(); - const [followedCategories, setFollowedCategories] = useState([]); - const { categoryName } = useParams<{ categoryName: string }>(); - const { checkCategoryFollowStatus, followCategory, unfollowCategory } = useCategoryFollow(); - - - useEffect(() => { - if (categoryName) checkCategoryFollowStatus(categoryName); - }, [categoryName]); - - useEffect(() => { - if (!isLoggedIn) return; - - const fetchFollowedCategories = async () => { - try { - const response = await fetch("/api/categories/your_categories"); - if (!response.ok) throw new Error("Failed to fetch followed categories"); - const data = await response.json(); - setFollowedCategories(data); - } catch (error) { - console.error("Error fetching followed categories:", error); - } - }; - - fetchFollowedCategories(); - }, [isLoggedIn]); - - - return ( - - - - ); -}; - -export default FollowedCategories; diff --git a/frontend/src/pages/Following.tsx b/frontend/src/pages/Following.tsx index 8b779b0..b4a43c4 100644 --- a/frontend/src/pages/Following.tsx +++ b/frontend/src/pages/Following.tsx @@ -4,6 +4,7 @@ import { useLocation, useNavigate } from "react-router-dom"; import DynamicPageContent from "../components/Layout/DynamicPageContent"; import { useFollow } from "../hooks/useFollow"; import FollowUserButton from "../components/Input/FollowUserButton"; +import FollowButton from "../components/Input/FollowButton"; interface Streamer { user_id: number; @@ -11,6 +12,7 @@ interface Streamer { } interface Category { + isFollowing: boolean; category_id: number; category_name: string; } @@ -30,7 +32,7 @@ const Following: React.FC = ({ extraClasses = "" }) => { const location = useLocation(); const queryParams = new URLSearchParams(location.search); - const initialTab = queryParams.get("tab") === "streamers" ? "streamers" : "categories"; + const initialTab = queryParams.get("tab") === "streamers" ? "categories" : "categories"; const [activeTab, setActiveTab] = useState<"categories" | "streamers">(initialTab); //const [followingStatus, setFollowingStatus] = useState>({}); @@ -103,8 +105,34 @@ const Following: React.FC = ({ extraClasses = "" }) => { ))} )} + + {activeTab === "categories" && ( +
+ {followedCategories.map((category) => { + return ( +
navigate(`/category/${category.category_name}`)} + > + + {category.category_name} +
+ {category.category_name} +
+
+ ); + })} + +
+ )}; + - +