From 4a06b30263658518ffe0dcaf910259dd63e2d1ea Mon Sep 17 00:00:00 2001 From: remco Date: Wed, 1 Jul 2026 21:32:59 +0200 Subject: [PATCH] feat: complete admin error handling improvements - add error display to articles pages - Add error display to articles pages (overview, edit, new) - Improve createArticle action to handle database errors gracefully - Redirect with error query params for user feedback on failure - Completes error handling improvements across admin pages - Enhances error reporting for better user experience --- src/actions/admin-articles.ts | 31 ++++++++++++++++------------ src/app/admin/articles/[id]/page.tsx | 8 +++++++ src/app/admin/articles/new/page.tsx | 13 +++++++++++- src/app/admin/articles/page.tsx | 15 ++++++++++++-- 4 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/actions/admin-articles.ts b/src/actions/admin-articles.ts index 45259e92..16e59054 100644 --- a/src/actions/admin-articles.ts +++ b/src/actions/admin-articles.ts @@ -24,19 +24,24 @@ export async function createArticle(formData: FormData): Promise { const image = String(formData.get("image") ?? "").trim(); if (!title) return; - const now = new Date(); - await prisma.websiteArticles.create({ - data: { - slug: await uniqueSlug(title), - title: title.slice(0, 255), - shortStory: shortStory.slice(0, 255), - fullStory, - image: image.slice(0, 255), - userId: staff.id, - createdAt: now, - updatedAt: now, - }, - }); + try { + const now = new Date(); + await prisma.websiteArticles.create({ + data: { + slug: await uniqueSlug(title), + title: title.slice(0, 255), + shortStory: shortStory.slice(0, 255), + fullStory, + image: image.slice(0, 255), + userId: staff.id, + createdAt: now, + updatedAt: now, + }, + }); + } catch (error) { + // Database error — re-render unchanged with error. + redirect("/admin/articles/new?error=Database error while creating article. Please try again."); + } redirect("/admin/articles"); } diff --git a/src/app/admin/articles/[id]/page.tsx b/src/app/admin/articles/[id]/page.tsx index 6882045e..c4ec138f 100644 --- a/src/app/admin/articles/[id]/page.tsx +++ b/src/app/admin/articles/[id]/page.tsx @@ -8,10 +8,13 @@ export const dynamic = "force-dynamic"; export default async function EditArticle({ params, + searchParams, }: { params: Promise<{ id: string }>; + searchParams: Promise<{ error?: string }>; }) { const { id } = await params; + const { error } = await searchParams; const article = await prisma.websiteArticles.findUnique({ where: { id: BigInt(id) }, select: { id: true, slug: true, title: true, shortStory: true, fullStory: true, image: true }, @@ -24,6 +27,11 @@ export default async function EditArticle({ ← Articles

Edit article

+ {error ? ( +

+ Error: {error} +

+ ) : null} { "use server"; diff --git a/src/app/admin/articles/new/page.tsx b/src/app/admin/articles/new/page.tsx index af3e5de4..02937eb5 100644 --- a/src/app/admin/articles/new/page.tsx +++ b/src/app/admin/articles/new/page.tsx @@ -2,13 +2,24 @@ import Link from "next/link"; import { createArticle } from "@/actions/admin-articles"; import { ArticleForm } from "@/components/admin/article-form"; -export default function NewArticle() { +export default async function NewArticle({ + searchParams, +}: { + searchParams: Promise<{ error?: string }>; +}) { + const { error } = await searchParams; + return (

← Articles

New article

+ {error ? ( +

+ Error: {error} +

+ ) : null}
); diff --git a/src/app/admin/articles/page.tsx b/src/app/admin/articles/page.tsx index 59cebda7..5da525c7 100644 --- a/src/app/admin/articles/page.tsx +++ b/src/app/admin/articles/page.tsx @@ -5,7 +5,12 @@ import { prisma } from "@/lib/prisma"; export const dynamic = "force-dynamic"; -export default async function AdminArticles() { +export default async function AdminArticles({ + searchParams, +}: { + searchParams: Promise<{ error?: string }>; +}) { + const { error } = await searchParams; const articles = await prisma.websiteArticles .findMany({ orderBy: { createdAt: "desc" }, @@ -30,6 +35,12 @@ export default async function AdminArticles() { News articles (website_articles) shown on the public site. 50 most recent.

+ {error ? ( +

+ Error: {error} +

+ ) : null} +
@@ -88,4 +99,4 @@ export default async function AdminArticles() { ); -} +} \ No newline at end of file