Refactor blog state setup and fetch logic

cgen-0fc59795d0ba4fd6bce05aaf407958c4
This commit is contained in:
Builder.io 2025-10-04 10:58:25 +00:00
parent c015a309a1
commit 782f4e7fd2

View file

@ -65,8 +65,110 @@ export default function Blog() {
const [isLoading, setIsLoading] = useState(true);
const [selectedCategory, setSelectedCategory] = useState("all");
const toastShownRef = useRef(false);
const [posts, setPosts] = useState<any[]>([]);
const [featuredPost, setFeaturedPost] = useState<any | null>(null);
const [posts, setPosts] = useState<BlogPost[]>([]);
const [featuredPost, setFeaturedPost] = useState<BlogPost | null>(null);
const staticPosts = useMemo<BlogPost[]>(
() => [
{
id: "static-1",
slug: "building-scalable-game-architecture",
title: "Building Scalable Game Architecture with Microservices",
excerpt:
"Learn how to design game backends that can handle millions of concurrent players using modern microservices patterns.",
author: "Marcus Rodriguez",
date: "December 12, 2024",
readTime: "6 min read",
category: "Technology",
likes: 89,
comments: 15,
trending: true,
image:
"https://images.unsplash.com/photo-1518770660439-4636190af475?auto=format&fit=crop&w=1200&q=80",
},
{
id: "static-2",
slug: "advanced-unity-optimization-techniques",
title: "Advanced Unity Optimization Techniques",
excerpt:
"Performance optimization strategies that can boost your Unity game's frame rate by up to 300%.",
author: "Alex Thompson",
date: "December 10, 2024",
readTime: "12 min read",
category: "Tutorials",
likes: 156,
comments: 34,
trending: false,
image:
"https://images.unsplash.com/photo-1527443224154-dcc0707b462b?auto=format&fit=crop&w=1200&q=80",
},
{
id: "static-3",
slug: "aethex-labs-neural-network-compression",
title: "AeThex Labs: Breakthrough in Neural Network Compression",
excerpt:
"Our research team achieves 90% model size reduction while maintaining accuracy for mobile game AI.",
author: "Dr. Aisha Patel",
date: "December 8, 2024",
readTime: "5 min read",
category: "Research",
likes: 203,
comments: 41,
trending: true,
image:
"https://images.unsplash.com/photo-1504384308090-c894fdcc538d?auto=format&fit=crop&w=1200&q=80",
},
{
id: "static-4",
slug: "introducing-aethex-cloud-gaming-platform",
title: "Introducing AeThex Cloud Gaming Platform",
excerpt:
"Launch games instantly across any device with our new cloud gaming infrastructure and global CDN.",
author: "AeThex Team",
date: "December 5, 2024",
readTime: "4 min read",
category: "Company News",
likes: 278,
comments: 52,
trending: false,
image:
"https://images.unsplash.com/photo-1511512578047-dfb367046420?auto=format&fit=crop&w=1200&q=80",
},
{
id: "static-5",
slug: "real-time-ray-tracing-in-web-games",
title: "Real-time Ray Tracing in Web Games",
excerpt:
"Tutorial: Implementing hardware-accelerated ray tracing in browser-based games using WebGPU.",
author: "Jordan Kim",
date: "December 3, 2024",
readTime: "15 min read",
category: "Tutorials",
likes: 94,
comments: 18,
trending: false,
image:
"https://images.unsplash.com/photo-1489515217757-5fd1be406fef?auto=format&fit=crop&w=1200&q=80",
},
{
id: "static-6",
slug: "the-evolution-of-game-ai",
title: "The Evolution of Game AI: From Scripts to Neural Networks",
excerpt:
"A comprehensive look at how artificial intelligence in games has evolved and where it's heading next.",
author: "Dr. Michael Chen",
date: "December 1, 2024",
readTime: "10 min read",
category: "Technology",
likes: 167,
comments: 29,
trending: false,
image:
"https://images.unsplash.com/photo-1523580846011-d3a5bc25702b?auto=format&fit=crop&w=1200&q=80",
},
],
[],
);
useEffect(() => {
let cancelled = false;
@ -75,22 +177,23 @@ export default function Blog() {
const res = await fetch("/api/blog?limit=50");
const data = res.ok ? await res.json() : [];
if (!cancelled && Array.isArray(data)) {
const mapped = data.map((r: any) => ({
const mapped: BlogPost[] = data.map((r: any) => ({
id: r.id,
slug: r.slug,
slug: r.slug ?? r.id ?? undefined,
title: r.title,
excerpt: r.excerpt,
author: r.author,
date: r.date,
readTime: r.read_time,
category: r.category || "General",
image: r.image,
likes: r.likes || 0,
comments: r.comments || 0,
readTime: r.read_time ?? r.readTime,
category: r.category ?? "General",
image: r.image ?? null,
likes: typeof r.likes === "number" ? r.likes : 0,
comments: typeof r.comments === "number" ? r.comments : 0,
trending: Boolean(r.trending),
}));
setPosts(mapped);
setFeaturedPost(mapped[0] || null);
const highlighted = mapped.find((post) => post.trending) ?? mapped[0] ?? null;
setFeaturedPost(highlighted);
}
} catch (e) {
console.warn("Blog fetch failed:", e);