2025-05-15 22:18:01 +03:00

56 lines
1.4 KiB
TypeScript

import { notFound } from "next/navigation";
import { allProjects } from "contentlayer/generated";
import { Mdx } from "@/app/components/mdx";
import { Header } from "./header";
import "./mdx.css";
import { ReportView } from "./view";
import Redis from "ioredis";
export const revalidate = 60;
type Props = {
params: {
slug: string;
};
};
// Настройка подключения к локальному Redis
const redis = new Redis({
host: process.env.REDIS_HOST || "localhost",
port: parseInt(process.env.REDIS_PORT || "6379"),
password: process.env.REDIS_PASSWORD,
});
export async function generateStaticParams(): Promise<Props["params"][]> {
return allProjects
.filter((p) => p.published)
.map((p) => ({
slug: p.slug,
}));
}
export default async function PostPage({ params }: Props) {
const slug = params?.slug;
const project = allProjects.find((project) => project.slug === slug);
if (!project) {
notFound();
}
// Получаем и преобразуем значение просмотров
const views = parseInt(
(await redis.get(`projects:${slug}:views`)) || "0",
10
);
return (
<div className="bg-zinc-50 min-h-screen">
<Header project={project} views={views} />
<ReportView slug={project.slug} />
<article className="px-4 py-12 mx-auto prose prose-zinc prose-quoteless">
<Mdx code={project.body.code} />
</article>
</div>
);
}