From 8b1fc942cf15d7f0572a78269f4efe215c603cd7 Mon Sep 17 00:00:00 2001 From: Amirhossein Khalili Date: Mon, 8 Jun 2026 22:36:27 +0330 Subject: [PATCH] fix(frontend): resolve published blog detail 404 --- src/app/blog/[slug]/page.tsx | 2 ++ src/lib/api.ts | 16 ++++++++-------- src/lib/public-api.ts | 14 ++++++++++---- src/views/Blog.tsx | 2 +- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/app/blog/[slug]/page.tsx b/src/app/blog/[slug]/page.tsx index 82e2d15..603269d 100644 --- a/src/app/blog/[slug]/page.tsx +++ b/src/app/blog/[slug]/page.tsx @@ -12,6 +12,8 @@ import { formatJalali } from "@/lib/utils"; type Params = Promise<{ slug: string }>; +export const dynamic = "force-dynamic"; + function cleanText(value?: string | null) { if (!value) return ""; return value.replace(/<[^>]*>/g, " ").replace(/\s+/g, " ").trim(); diff --git a/src/lib/api.ts b/src/lib/api.ts index f77c9ea..fe84de3 100644 --- a/src/lib/api.ts +++ b/src/lib/api.ts @@ -422,7 +422,7 @@ class ApiClient { } async getPost(slug: string) { - return this.request(`/api/blog/posts/${slug}`); + return this.request(`/api/blog/posts/${encodeURIComponent(slug)}`); } async createPost(data: Types.PostCreateSchema) { @@ -511,7 +511,7 @@ class ApiClient { } async deletePost(slug: string) { - return this.request(`/api/blog/posts/${slug}`, { + return this.request(`/api/blog/posts/${encodeURIComponent(slug)}`, { method: 'DELETE', }); } @@ -528,11 +528,11 @@ class ApiClient { // Comments async getComments(slug: string) { - return this.request(`/api/blog/posts/${slug}/comments`); + return this.request(`/api/blog/posts/${encodeURIComponent(slug)}/comments`); } async createComment(slug: string, data: Types.CommentCreateSchema) { - return this.request(`/api/blog/posts/${slug}/comments`, { + return this.request(`/api/blog/posts/${encodeURIComponent(slug)}/comments`, { method: 'POST', body: JSON.stringify(data), }); @@ -557,23 +557,23 @@ class ApiClient { // Likes async toggleLike(slug: string) { - return this.request(`/api/blog/posts/${slug}/like`, { + return this.request(`/api/blog/posts/${encodeURIComponent(slug)}/like`, { method: 'POST', }); } async toggleSave(slug: string) { - return this.request(`/api/blog/posts/${slug}/save`, { + return this.request(`/api/blog/posts/${encodeURIComponent(slug)}/save`, { method: 'POST', }); } async getBlogInteraction(slug: string) { - return this.request(`/api/blog/posts/${slug}/interaction`); + return this.request(`/api/blog/posts/${encodeURIComponent(slug)}/interaction`); } async getLikesCount(slug: string) { - return this.request(`/api/blog/posts/${slug}/likes`); + return this.request(`/api/blog/posts/${encodeURIComponent(slug)}/likes`); } async getMyBlogActivity() { diff --git a/src/lib/public-api.ts b/src/lib/public-api.ts index 566f881..185293a 100644 --- a/src/lib/public-api.ts +++ b/src/lib/public-api.ts @@ -54,11 +54,15 @@ async function requestJson( options?: { params?: Record; revalidate?: number; + cache?: RequestCache; }, ) { - const response = await fetch(buildUrl(path, options?.params), { - next: { revalidate: options?.revalidate ?? DEFAULT_REVALIDATE_SECONDS }, - }); + const response = await fetch( + buildUrl(path, options?.params), + options?.cache + ? { cache: options.cache } + : { next: { revalidate: options?.revalidate ?? DEFAULT_REVALIDATE_SECONDS } }, + ); if (!response.ok) { throw new PublicApiError(path, response.status); @@ -80,7 +84,9 @@ export async function getPublicPosts(options?: { search?: string; limit?: number } export async function getPublicPost(slug: string) { - return requestJson(`/api/blog/posts/${encodeURIComponent(slug)}`); + return requestJson(`/api/blog/posts/${encodeURIComponent(slug)}`, { + cache: "no-store", + }); } export async function getPublicEvents(options?: { search?: string; limit?: number }) { diff --git a/src/views/Blog.tsx b/src/views/Blog.tsx index 4256d3a..c478de9 100644 --- a/src/views/Blog.tsx +++ b/src/views/Blog.tsx @@ -80,7 +80,7 @@ export default function Blog({ ) : (
{posts.map((post) => ( - + {post.title}