diff --git a/app/api/views/route.ts b/app/api/views/route.ts index ee0b9df..388891f 100644 --- a/app/api/views/route.ts +++ b/app/api/views/route.ts @@ -1,26 +1,25 @@ import { NextResponse } from "next/server"; import { getRedisClient } from "../../../lib/redis"; -export const dynamic = 'force-dynamic'; // Отключаем кеширование +export const dynamic = 'force-dynamic'; +export const fetchCache = 'force-no-store'; export async function GET() { - try { - const redis = getRedisClient(); - const projects = await redis.keys("projects:*:views"); - const viewsEntries = await redis.mget(...projects); + try { + const redis = getRedisClient(); + const keys = await redis.keys('projects:*:views'); + if (keys.length === 0) return NextResponse.json({}); + + const values = await redis.mget(...keys); + const views = keys.reduce((acc, key, i) => { + const slug = key.split(':')[1]; + acc[slug] = parseInt(values[i] as string) || 0; + return acc; + }, {} as Record); - const viewsData = projects.reduce((acc, key, index) => { - const slug = key.split(":")[1]; - acc[slug] = parseInt(viewsEntries[index] as string) || 0; - return acc; - }, {} as Record); - - return NextResponse.json(viewsData); - } catch (error) { - console.error("Redis error:", error); - return NextResponse.json( - { error: "Failed to fetch views" }, - { status: 500 } - ); - } + return NextResponse.json(views); + } catch (error) { + console.error('Redis error:', error); + return NextResponse.json({}, { status: 500 }); + } } \ No newline at end of file diff --git a/app/projects/page.tsx b/app/projects/page.tsx index 54cbdd4..b2ea28a 100644 --- a/app/projects/page.tsx +++ b/app/projects/page.tsx @@ -1,4 +1,4 @@ -'use client'; // Превращаем компонент в клиентский +'use client'; import Link from "next/link"; import React, { useEffect, useState } from "react"; @@ -8,8 +8,6 @@ import { Card } from "../components/card"; import { Article } from "./article"; import { Eye } from "lucide-react"; -export const revalidate = 60; - type ViewsData = Record; export default function ProjectsPage() { @@ -17,12 +15,11 @@ export default function ProjectsPage() { const [loading, setLoading] = useState(true); const [error, setError] = useState(null); - // Загружаем данные через клиентский запрос useEffect(() => { const fetchViews = async () => { try { const response = await fetch('/api/views'); - if (!response.ok) throw new Error('Failed to fetch views'); + if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); const data = await response.json(); setViews(data); } catch (err) { @@ -38,7 +35,7 @@ export default function ProjectsPage() { const featured = allProjects.find((project) => project.slug === "cbg")!; const top2 = allProjects.find((project) => project.slug === "blog")!; const top3 = allProjects.find((project) => project.slug === "bimkaspace")!; - + const sorted = allProjects .filter((p) => p.published) .filter(