From a590a41e73f165d7ce1981005787d6d2db0e7d33 Mon Sep 17 00:00:00 2001 From: Ho Ngoc Hai Date: Wed, 8 Apr 2026 13:48:33 +0700 Subject: [PATCH] feat(web): add loading skeletons, error boundaries, and accessibility improvements - Add segment-level loading.tsx for dashboard, search, admin, and auth routes - Add segment-level error.tsx with Vietnamese error messages for all route groups - Add skip-to-content navigation link in root layout - Add id="main-content" to all layout main elements - Add aria-label to nav elements and mobile menu buttons - Improve dashboard nav responsiveness (icon-only on mobile) - Hide user name on small screens in dashboard layout Co-Authored-By: Paperclip --- apps/web/app/(admin)/error.tsx | 58 +++++++++++++++++++ apps/web/app/(admin)/layout.tsx | 7 ++- apps/web/app/(admin)/loading.tsx | 60 ++++++++++++++++++++ apps/web/app/(auth)/error.tsx | 58 +++++++++++++++++++ apps/web/app/(auth)/layout.tsx | 4 +- apps/web/app/(auth)/loading.tsx | 40 +++++++++++++ apps/web/app/(dashboard)/error.tsx | 58 +++++++++++++++++++ apps/web/app/(dashboard)/layout.tsx | 13 +++-- apps/web/app/(dashboard)/loading.tsx | 71 +++++++++++++++++++++++ apps/web/app/(public)/layout.tsx | 4 +- apps/web/app/(public)/search/error.tsx | 60 ++++++++++++++++++++ apps/web/app/(public)/search/loading.tsx | 72 ++++++++++++++++++++++++ apps/web/app/layout.tsx | 6 ++ 13 files changed, 498 insertions(+), 13 deletions(-) create mode 100644 apps/web/app/(admin)/error.tsx create mode 100644 apps/web/app/(admin)/loading.tsx create mode 100644 apps/web/app/(auth)/error.tsx create mode 100644 apps/web/app/(auth)/loading.tsx create mode 100644 apps/web/app/(dashboard)/error.tsx create mode 100644 apps/web/app/(dashboard)/loading.tsx create mode 100644 apps/web/app/(public)/search/error.tsx create mode 100644 apps/web/app/(public)/search/loading.tsx diff --git a/apps/web/app/(admin)/error.tsx b/apps/web/app/(admin)/error.tsx new file mode 100644 index 0000000..e32333a --- /dev/null +++ b/apps/web/app/(admin)/error.tsx @@ -0,0 +1,58 @@ +'use client'; + +import { useEffect } from 'react'; + +export default function AdminError({ + error, + reset, +}: { + error: Error & { digest?: string }; + reset: () => void; +}) { + useEffect(() => { + console.error('Admin error:', error); + }, [error]); + + return ( +
+
+
+ + + +
+

Lỗi trang quản trị

+

+ Không thể tải trang quản trị. Vui lòng thử lại sau. +

+ {error.digest && ( +

Mã lỗi: {error.digest}

+ )} +
+ + + Tải lại trang + +
+
+
+ ); +} diff --git a/apps/web/app/(admin)/layout.tsx b/apps/web/app/(admin)/layout.tsx index 0d99eb4..d55c5a2 100644 --- a/apps/web/app/(admin)/layout.tsx +++ b/apps/web/app/(admin)/layout.tsx @@ -72,6 +72,7 @@ export default function AdminLayout({ children }: { children: React.ReactNode }) -