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/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 Navigasi from "../../components/home/staticNav"; import { ToastContainer } from "react-toastify"; import getMedia from "../../lib/anilist/getMedia"; // import UserRecommendation from "../../components/home/recommendation"; import MobileNav from "../../components/shared/MobileNav"; import { getGreetings } from "../../utils/getGreetings"; import redis from "../../lib/redis"; export async function getServerSideProps() { let cachedData; if (redis) { cachedData = await redis.get("index_server"); } if (cachedData) { const { genre, detail, populars } = JSON.parse(cachedData); const upComing = await getUpcomingAnime(); return { props: { genre, detail, populars, upComing, }, }; } 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, }), // 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, }, }; } } export default function Home({ detail, populars, upComing }) { const { data: sessions } = useSession(); const { media: current } = getMedia(sessions, { stats: "CURRENT" }); const { media: plan } = getMedia(sessions, { stats: "PLANNING" }); const { media: release, recommendations } = getMedia(sessions); 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()); setRecentAdded(data?.results); } useEffect(() => { if (sessions?.user?.version) { if (sessions.user.version !== "1.0.1") { signOut("AniListProvider"); } } }, [sessions?.user?.version]); useEffect(() => { getRecent(); }, []); const update = () => { setAnime((prevAnime) => prevAnime.slice(1)); }; useEffect(() => { if (upComing && upComing.length > 0) { setAnime(upComing); } }, [upComing]); useEffect(() => { const getSchedule = async () => { const res = await fetch(`/api/v2/etc/schedule`); const data = await res.json(); if (!res.ok) { setSchedules(null); } else { setSchedules(data); } }; getSchedule(); }, []); const [releaseData, setReleaseData] = useState([]); useEffect(() => { function getRelease() { let releasingAnime = []; let progress = []; let seenIds = new Set(); // Create a Set to store the IDs of seen anime release.map((list) => { list.entries.map((entry) => { 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); setProg(progress); } getRelease(); }, [release]); const [list, setList] = useState(null); const [planned, setPlanned] = useState(null); const [user, setUser] = useState(null); const [removed, setRemoved] = useState(); const [prog, setProg] = useState(null); const popular = populars?.data; const data = detail.data[0]; useEffect(() => { async function userData() { try { if (sessions?.user?.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; try { if (sessions?.user?.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 = JSON.parse(localStorage.getItem("artplayer_settings")); if (dat) { const arr = Object.keys(dat).map((key) => dat[key]); const newFirst = arr?.sort((a, b) => { return new Date(b?.createdAt) - new Date(a?.createdAt); }); const uniqueTitles = new Set(); // Filter out duplicates and store unique entries const filteredData = newFirst.filter((entry) => { if (uniqueTitles.has(entry.aniTitle)) { return false; } uniqueTitles.add(entry.aniTitle); return true; }); 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(); }, [sessions?.user?.name, removed]); useEffect(() => { async function userData() { if (!sessions?.user?.name) return; const getMedia = current.filter((item) => item.status === "CURRENT")[0] || null; const list = getMedia?.entries .map(({ media }) => media) .filter((media) => media); const planned = plan?.[0]?.entries .map(({ media }) => media) .filter((media) => media); if (list) { setList(list); } if (planned) { setPlanned(planned); } } userData(); }, [sessions?.user?.name, current, plan]); return ( Moopa {/* Write the best SEO for this homepage */}
{/* PC / TABLET */}

{data.title.english || data.title.romaji || data.title.native}

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

{sessions?.user.name}

)}
)}
{user?.length > 0 && user?.some((i) => i?.watchId) && ( )} {sessions && releaseData?.length > 0 && ( )} {sessions && list?.length > 0 && ( )} {/* {recommendations.length > 0 && (

Based on Your List
Recommendations

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