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