Full Next.js 15 platform with tRPC, Prisma, PostgreSQL, NextAuth. Includes production Dockerfile (multi-stage, port 7600), docker-compose with registry-based image pull, Gitea Actions CI workflow, nginx config for portal.monaco-opc.com, deployment scripts, and DEPLOYMENT.md guide. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
39 lines
1.1 KiB
TypeScript
39 lines
1.1 KiB
TypeScript
'use client'
|
|
|
|
import { useEffect } from 'react'
|
|
import { Button } from '@/components/ui/button'
|
|
import { AlertTriangle } from 'lucide-react'
|
|
|
|
export default function Error({
|
|
error,
|
|
reset,
|
|
}: {
|
|
error: Error & { digest?: string }
|
|
reset: () => void
|
|
}) {
|
|
useEffect(() => {
|
|
// Log the error to an error reporting service
|
|
console.error(error)
|
|
}, [error])
|
|
|
|
return (
|
|
<div className="flex min-h-screen flex-col items-center justify-center gap-4 text-center">
|
|
<AlertTriangle className="h-16 w-16 text-destructive/50" />
|
|
<h1 className="text-2xl font-semibold">Something went wrong</h1>
|
|
<p className="max-w-md text-muted-foreground">
|
|
An unexpected error occurred. Please try again or contact support if the
|
|
problem persists.
|
|
</p>
|
|
{error.digest && (
|
|
<p className="text-xs text-muted-foreground">Error ID: {error.digest}</p>
|
|
)}
|
|
<div className="flex gap-4">
|
|
<Button onClick={() => reset()}>Try Again</Button>
|
|
<Button variant="outline" onClick={() => window.location.reload()}>
|
|
Refresh Page
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|