feat: Implement robust error/not-found pages & UI components

- Introduce dedicated error pages for dashboard and video routes
- Add specific not-found pages for dashboard, projects, videos, and settings
- Implement global `not-found.tsx` for general unhandled routes
- Integrate root and dashboard layouts with ErrorBoundary and Suspense
- Add new UI components: Accordion, Hover Card, Menubar, Navigation Menu, Select, Tabs
- Update Navbar to utilize the new Navigation Menu component
- Enhance `button` component with a `link` variant for better styling
- Refine existing UI components (dialog, dropdown, input, etc.)
- Update Tailwind config with new colors and animation extensions
This commit is contained in:
Yusuf İpek
2026-02-07 15:53:31 +03:00
parent 48ddb03995
commit 373aab964c
30 changed files with 846 additions and 497 deletions
+45
View File
@@ -0,0 +1,45 @@
"use client";
import { useEffect } from "react";
import { Button } from "@/components/ui/button";
import { AlertTriangle, Film } from "lucide-react";
export default function WatchError({
error,
reset,
}: {
error: Error & { digest?: string };
reset: () => void;
}) {
useEffect(() => {
console.error("Watch page error:", error);
}, [error]);
return (
<div className="flex min-h-screen flex-col items-center justify-center gap-4 p-4">
<div className="flex flex-col items-center gap-2 text-center">
<div className="relative">
<Film className="h-12 w-12 text-muted-foreground" />
<AlertTriangle className="absolute -bottom-1 -right-1 h-6 w-6 text-destructive" />
</div>
<h1 className="text-2xl font-bold">Video Unavailable</h1>
<p className="text-muted-foreground max-w-md">
We couldn&apos;t load this video. It may have been removed or the link might be incorrect.
</p>
{error.digest && (
<p className="text-muted-foreground text-xs">
Error ID: {error.digest}
</p>
)}
</div>
<div className="flex gap-2">
<Button onClick={reset} variant="default">
Try again
</Button>
<Button onClick={() => window.location.href = "/"} variant="outline">
Go home
</Button>
</div>
</div>
);
}
+25
View File
@@ -0,0 +1,25 @@
import Link from "next/link";
import { Button } from "@/components/ui/button";
import { Film, XCircle } from "lucide-react";
export default function WatchNotFound() {
return (
<div className="flex min-h-screen flex-col items-center justify-center gap-4 p-4">
<div className="flex flex-col items-center gap-2 text-center">
<div className="relative">
<Film className="h-12 w-12 text-muted-foreground" />
<XCircle className="absolute -bottom-1 -right-1 h-6 w-6 text-destructive" />
</div>
<h1 className="text-2xl font-bold">Video Not Found</h1>
<p className="text-muted-foreground max-w-md">
The video you&apos;re looking for doesn&apos;t exist, has been removed, or the link may be expired.
</p>
</div>
<div className="flex gap-2">
<Button asChild variant="default">
<Link href="/">Go home</Link>
</Button>
</div>
</div>
);
}