"use client"; import Link from "next/link"; import { useEffect, useMemo, useState } from "react"; import animeData from "../data/anime-detail.json"; import styles from "./AnimeDetail.module.css"; type Episode = (typeof animeData.episodes)[number]; type Product = (typeof animeData.products)[number]; type Reply = { id: number; author: string; initial: string; content: string; time: string; likes: number }; type Comment = { id: number; author: string; initial: string; tone: string; score: number; time: string; episode: string; content: string; likes: number; spoiler: boolean; replies: Reply[]; }; const work = animeData.work; export default function AnimeDetailPage() { const [favorite, setFavorite] = useState(false); const [cartCount, setCartCount] = useState(0); const [selectedEpisode, setSelectedEpisode] = useState(2); const [comments, setComments] = useState(animeData.comments as Comment[]); const [likedComments, setLikedComments] = useState([]); const [commentText, setCommentText] = useState(""); const [commentScore, setCommentScore] = useState(5); const [sort, setSort] = useState<"hot" | "new">("hot"); const [toast, setToast] = useState(""); const [activeSection, setActiveSection] = useState("overview"); const [hydrated, setHydrated] = useState(false); useEffect(() => { try { setFavorite(window.localStorage.getItem("star-echoes-favorite") === "1"); setCartCount(Number(window.localStorage.getItem("star-echoes-cart") || 0)); const savedComments = window.localStorage.getItem("star-echoes-comments"); const savedLikes = window.localStorage.getItem("star-echoes-likes"); if (savedComments) setComments(JSON.parse(savedComments)); if (savedLikes) setLikedComments(JSON.parse(savedLikes)); } catch { // Invalid demo cache falls back to the bundled JSON data. } setHydrated(true); }, []); useEffect(() => { if (!hydrated) return; window.localStorage.setItem("star-echoes-favorite", favorite ? "1" : "0"); window.localStorage.setItem("star-echoes-cart", String(cartCount)); window.localStorage.setItem("star-echoes-comments", JSON.stringify(comments)); window.localStorage.setItem("star-echoes-likes", JSON.stringify(likedComments)); }, [favorite, cartCount, comments, likedComments, hydrated]); const visibleComments = useMemo( () => [...comments].sort((a, b) => (sort === "hot" ? b.likes - a.likes : b.id - a.id)), [comments, sort], ); const notify = (message: string) => { setToast(message); window.setTimeout(() => setToast(""), 2200); }; const jumpTo = (id: string) => { setActiveSection(id); document.getElementById(id)?.scrollIntoView({ behavior: "smooth", block: "start" }); }; const playEpisode = (episode: Episode) => { if (!episode.released) return notify("该剧集尚未更新,已为你开启更新提醒"); setSelectedEpisode(episode.id); notify(`正在播放:第 ${episode.id} 话 ${episode.title}`); }; const addProduct = (product: Product) => { setCartCount((count) => count + 1); notify(`已将「${product.name}」加入购物车`); }; const publishComment = () => { if (commentText.trim().length < 8) return notify("评论至少需要 8 个字"); const newComment: Comment = { id: Date.now(), author: "林知夏", initial: "林", tone: "blue", score: commentScore, time: "刚刚", episode: `看到第 ${selectedEpisode} 话`, content: commentText.trim(), likes: 0, spoiler: false, replies: [], }; setComments((current) => [newComment, ...current]); setCommentText(""); setSort("new"); notify("评论发布成功,已保存在当前浏览器"); }; const toggleLike = (id: number) => { setLikedComments((current) => current.includes(id) ? current.filter((item) => item !== id) : [...current, id]); }; return (
S STELLARANIME ARCHIVE
模板首页/动漫作品/星海回响
{work.status} {work.year}{work.region}{work.age}

{work.titleEn}

{work.title}

{work.subtitle}

{work.tags.map((tag) => {tag})}
总播放{work.watchCount}
追番人数{work.followCount}
当前更新{work.updatedEpisode} / {work.episodes}
ABOUT THE SERIES

作品详情

{work.copyright}

STORY

在没有星空的城市,
追寻一束跨越十二年的光。

{work.description}

“我们不是为了找到答案才抬头,而是因为抬头之后,世界会变得不一样。”
EPISODE GUIDE

剧集列表

正在观看第 {selectedEpisode} 话
CONTINUE WATCHING

第 {selectedEpisode} 话 {animeData.episodes[selectedEpisode - 1].title}

{animeData.episodes[selectedEpisode - 1].summary}

{animeData.episodes[selectedEpisode - 1].progress}%
{animeData.episodes.map((episode) => ( ))}
OFFICIAL MERCHANDISE

官方周边

限时企划

把星光,带回日常。

动画官方收藏系列 · 满 299 元免运费

{animeData.products.map((product) => (
{product.badge}
{product.category}

{product.name}

★ {product.rating}{product.stock}

¥{product.price}¥{product.originalPrice}

))}
COMMUNITY REVIEWS

观众评论

友善交流,请勿发布未经标记的剧透内容

{work.rating}★★★★★{work.ratingCount.toLocaleString()} 人评分
{animeData.ratingDistribution.map((row) =>
{row.stars} 星{row.percent}%
)}
96%愿意推荐
8.8剧情表现
9.6美术音乐
共 {comments.length} 条精选评论
{visibleComments.map((comment) => toggleLike(comment.id)} onReply={() => notify("回复编辑器为模板交互占位")} />)}