import Link from "next/link"; import React from "react"; import { allProjects } from "contentlayer/generated"; import { Navigation } from "../components/nav"; import { Card } from "../components/card"; import { Article } from "./article"; import { Redis } from "@upstash/redis"; import { Eye } from "lucide-react"; const redis = Redis.fromEnv(); export const revalidate = 60; export default async function ProjectsPage() { const views = ( await redis.mget( ...allProjects.map((p) => ["pageviews", "projects", p.slug].join(":")), ) ).reduce((acc, v, i) => { acc[allProjects[i].slug] = v ?? 0; return acc; }, {} as Record); const featured = allProjects.find( (project) => project.slug === "planetfall", )!; const top2 = allProjects.find((project) => project.slug === "envshare")!; const top3 = allProjects.find((project) => project.slug === "qstash")!; const sorted = allProjects .filter((p) => p.published) .filter( (project) => project.slug !== featured.slug && project.slug !== top2.slug && project.slug !== top3.slug, ) .sort( (a, b) => new Date(b.date ?? Number.POSITIVE_INFINITY).getTime() - new Date(a.date ?? Number.POSITIVE_INFINITY).getTime(), ); return (

Projects

Some of the projects are from work and some are on my own time.

{featured.date ? ( ) : ( SOON )}
{" "} {Intl.NumberFormat("en-US", { notation: "compact" }).format( views[featured.slug] ?? 0, )}

{featured.title}

{featured.description}

Read more
{[top2, top3].map((project) => (
))}
{sorted .filter((_, i) => i % 3 === 0) .map((project) => (
))}
{sorted .filter((_, i) => i % 3 === 1) .map((project) => (
))}
{sorted .filter((_, i) => i % 3 === 2) .map((project) => (
))}
); }