import { aniListData } from "@/lib/anilist/AniList"; import { useState, useEffect, Fragment } from "react"; import Head from "next/head"; import Link from "next/link"; import Footer from "@/components/shared/footer"; import Image from "next/image"; import Content from "@/components/home/content"; import { motion } from "framer-motion"; import { signOut, useSession } from "next-auth/react"; import Genres from "@/components/home/genres"; import Schedule from "@/components/home/schedule"; import getUpcomingAnime from "@/lib/anilist/getUpcomingAnime"; import GetMedia from "@/lib/anilist/getMedia"; import MobileNav from "@/components/shared/MobileNav"; import { getGreetings } from "@/utils/getGreetings"; import { redis } from "@/lib/redis"; import { Navbar } from "@/components/shared/NavBar"; import UserRecommendation from "@/components/home/recommendation"; import { useRouter } from "next/router"; export async function getServerSideProps() { let cachedData; if (redis) { cachedData = await redis.get("index_server"); } if (cachedData) { const { genre, detail, populars, firstTrend } = JSON.parse(cachedData); const upComing = await getUpcomingAnime(); return { props: { genre, detail, populars, upComing, firstTrend, }, }; } else { const trendingDetail = await aniListData({ sort: "TRENDING_DESC", page: 1, }); const popularDetail = await aniListData({ sort: "POPULARITY_DESC", page: 1, }); const genreDetail = await aniListData({ sort: "TYPE", page: 1 }); if (redis) { await redis.set( "index_server", JSON.stringify({ genre: genreDetail.props, detail: trendingDetail.props, populars: popularDetail.props, firstTrend: trendingDetail.props.data[0], }), // set cache for 2 hours "EX", 60 * 60 * 2 ); } const upComing = await getUpcomingAnime(); return { props: { genre: genreDetail.props, detail: trendingDetail.props, populars: popularDetail.props, upComing, firstTrend: trendingDetail.props.data[0], }, }; } } type HomeProps = { genre: any; detail: any; populars: any; upComing: any; firstTrend: any; }; export interface SessionTypes { name: string; picture: Picture; sub: string; token: string; id: number; image: Image; list: string[]; version: string; iat: number; exp: number; jti: string; } interface Picture { large: string; medium: string; } interface Image { large: string; medium: string; } export default function Home({ detail, populars, upComing, firstTrend, }: HomeProps) { const { data: sessions }: any = useSession(); const userSession: SessionTypes = sessions?.user; const { anime: currentAnime, manga: currentManga, recommendations, }: { anime: CurrentMediaTypes[]; manga: CurrentMediaTypes[]; recommendations: CurrentMediaTypes[]; } = GetMedia(sessions, { stats: "CURRENT", }); const { anime: plan }: { anime: CurrentMediaTypes[] } = GetMedia(sessions, { stats: "PLANNING", }); const { anime: release } = GetMedia(sessions); const router = useRouter(); const [schedules, setSchedules] = useState(null); const [anime, setAnime] = useState([]); const [recentAdded, setRecentAdded] = useState([]); async function getRecent() { const data = await fetch(`/api/v2/etc/recent/1`) .then((res) => res.json()) .catch((err) => console.log(err)); setRecentAdded(data?.results); } useEffect(() => { if (userSession?.version) { if (userSession?.version !== "1.0.1") { signOut({ redirect: true }); } } }, [userSession?.version]); useEffect(() => { getRecent(); }, []); const update = () => { setAnime((prevAnime) => prevAnime.slice(1)); }; useEffect(() => { if (upComing && upComing.length > 0) { setAnime(upComing); } }, [upComing]); const [releaseData, setReleaseData] = useState([]); useEffect(() => { function getRelease() { let releasingAnime: any[] = []; let progress: any[] = []; let seenIds = new Set(); // Create a Set to store the IDs of seen anime (release as any[]).forEach((list: any) => { list.entries.forEach((entry: any) => { if ( entry.media.status === "RELEASING" && !seenIds.has(entry.media.id) ) { releasingAnime.push(entry.media); seenIds.add(entry.media.id); // Add the ID to the Set } progress.push(entry); }); }); setReleaseData(releasingAnime); if (progress.length > 0) setProg(progress); } getRelease(); }, [release]); const [listAnime, setListAnime] = useState(); const [listManga, setListManga] = useState(null); const [planned, setPlanned] = useState(null); const [user, setUser] = useState(null); const [removed, setRemoved] = useState(); const [prog, setProg] = useState(); const popular = populars?.data; useEffect(() => { async function userData() { try { if (userSession?.name) { await fetch(`/api/user/profile`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ name: sessions.user.name, }), }); } } catch (error) { console.log(error); } let data: UserDataType | null = null; try { if (userSession?.name) { const res = await fetch( `/api/user/profile?name=${sessions.user.name}` ); if (!res.ok) { switch (res.status) { case 404: { console.log("user not found"); break; } case 500: { console.log("server error"); break; } default: { console.log("unknown error"); break; } } } else { data = await res.json(); // Do something with the data } } } catch (error) { console.error(error); // Handle the error here } if (!data) { const dat: any = localStorage.getItem("artplayer_settings"); if (dat) { const arr = Object.keys(dat).map((key: string) => dat[key] as any); const newFirst = arr?.sort((a: any, b: any) => { return ( new Date(b?.createdAt).getTime() - new Date(a?.createdAt).getTime() ); }); const uniqueTitles = new Set(); // Filter out duplicates and store unique entries const filteredData = newFirst.filter((entry: any) => { if (uniqueTitles.has(entry.aniTitle)) { return false; } uniqueTitles.add(entry.aniTitle); return true; }); if (filteredData) { setUser(filteredData); } } } else { // Create a Set to store unique aniTitles const uniqueTitles = new Set(); // Filter out duplicates and store unique entries const filteredData = data?.WatchListEpisode.filter((entry) => { if (uniqueTitles.has(entry.aniTitle)) { return false; } uniqueTitles.add(entry.aniTitle); return true; }); setUser(filteredData); } // const data = await res.json(); } userData(); }, [userSession?.name, removed]); useEffect(() => { async function userData() { if (!userSession?.name) return; const getMedia = currentAnime.find((item) => item.status === "CURRENT") || null; const listAnime = getMedia?.entries .map(({ media }) => media) .filter((media) => media); const getManga = currentManga?.find((item) => item.status === "CURRENT") || null; const listManga = getManga?.entries .map(({ media }) => media) .filter((media) => media); const planned = plan?.[0]?.entries .map(({ media }) => media) .filter((media) => media); if (listManga) { setListManga(listManga); } if (listAnime) { setListAnime(listAnime); } if (planned) { setPlanned(planned); } } userData(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [userSession?.name, currentAnime, plan]); function removeHtmlTags(text: string): string { return text?.replace(/<[^>]+>/g, ""); } return ( Moopa

{firstTrend?.title?.english || firstTrend?.title?.romaji}

{removeHtmlTags(firstTrend?.description)}

{firstTrend && ( )}
{`cover
{sessions && (
{getGreetings() && ( <> {getGreetings()},

{sessions?.user.name}

)}
)}
{user && user?.length > 0 && user?.some((i) => i?.watchId) && ( )} {sessions && releaseData?.length > 0 && ( )} {sessions && listAnime && listAnime?.length > 0 && ( )} {sessions && listManga && listManga?.length > 0 && ( )} {recommendations.length > 0 && (

Based on Your List
Recommendations

)} {/* SECTION 2 */} {sessions && planned && planned?.length > 0 && ( )}
{/* SECTION 3 */} {recentAdded?.length > 0 && ( )} {/* SECTION 4 */} {detail && ( )} {/*
ad banner
*/} {/* Schedule */} {anime.length > 0 && ( )} {/* SECTION 5 */} {popular && ( )}