Files
plane/apps/web/app/error/dev.tsx
2025-11-06 14:08:48 +05:30

156 lines
5.7 KiB
TypeScript

"use client";
// plane imports
import { isRouteErrorResponse } from "react-router";
import { Banner } from "@plane/propel/banner";
import { Button } from "@plane/propel/button";
import { Card, ECardVariant } from "@plane/propel/card";
import { InfoFillIcon } from "@plane/propel/icons";
interface ErrorActionsProps {
onGoHome: () => void;
onReload?: () => void;
}
const ErrorActions: React.FC<ErrorActionsProps> = ({ onGoHome, onReload }) => (
<div className="flex gap-3 pt-2">
<Button variant="primary" size="md" onClick={onGoHome}>
Go to home
</Button>
{onReload && (
<Button variant="outline-primary" size="md" onClick={onReload}>
Reload page
</Button>
)}
</div>
);
interface DevErrorComponentProps {
error: unknown;
onGoHome: () => void;
onReload: () => void;
}
export const DevErrorComponent: React.FC<DevErrorComponentProps> = ({ error, onGoHome, onReload }) => {
if (isRouteErrorResponse(error)) {
return (
<div className="min-h-screen bg-custom-background-90 p-6 flex items-start justify-center transition-none">
<div className="w-full max-w-4xl mt-12 space-y-4 transition-none">
<Banner
variant="error"
icon={<InfoFillIcon className="size-5" />}
title="Route Error Response"
animationDuration={0}
/>
<Card variant={ECardVariant.WITH_SHADOW} className="!p-6 transition-none">
<div className="space-y-4">
<div>
<h2 className="text-2xl font-semibold text-red-500 mb-2">
{error.status} {error.statusText}
</h2>
<div className="h-px w-full bg-custom-border-200" />
</div>
<div className="space-y-2">
<h3 className="text-sm font-medium text-custom-text-300 uppercase tracking-wide">Error Data</h3>
<div className="bg-custom-background-80 rounded-md p-4">
<p className="text-sm text-custom-text-200 font-mono">{error.data}</p>
</div>
</div>
<ErrorActions onGoHome={onGoHome} onReload={onReload} />
</div>
</Card>
</div>
</div>
);
}
if (error instanceof Error) {
return (
<div className="min-h-screen bg-custom-background-90 p-6 flex items-start justify-center transition-none">
<div className="w-full max-w-4xl mt-12 space-y-4 transition-none">
<Banner
variant="error"
icon={<InfoFillIcon className="size-5" />}
title="Runtime Error"
animationDuration={0}
/>
<Card variant={ECardVariant.WITH_SHADOW} className="!p-6 transition-none">
<div className="space-y-4">
<div>
<h2 className="text-2xl font-semibold text-red-500 mb-2">Error</h2>
<div className="h-px w-full bg-custom-border-200" />
</div>
<div className="space-y-2">
<h3 className="text-sm font-medium text-custom-text-300 uppercase tracking-wide">Message</h3>
<div className="bg-custom-background-80 rounded-md p-4">
<p className="text-sm text-custom-text-100 font-medium">{error.message}</p>
</div>
</div>
{error.stack && (
<div className="space-y-2">
<h3 className="text-sm font-medium text-custom-text-300 uppercase tracking-wide">Stack Trace</h3>
<div className="bg-custom-background-80 rounded-md border border-custom-border-200 max-h-96 overflow-auto">
<pre className="p-4 text-xs text-custom-text-200 font-mono whitespace-pre-wrap break-words">
{error.stack}
</pre>
</div>
</div>
)}
<ErrorActions onGoHome={onGoHome} onReload={onReload} />
</div>
</Card>
<Card variant={ECardVariant.WITHOUT_SHADOW} className="!p-4 bg-custom-background-80 transition-none">
<div className="flex items-start gap-3">
<InfoFillIcon className="size-5 text-custom-text-300 flex-shrink-0 mt-0.5" />
<div className="space-y-1">
<p className="text-sm font-medium text-custom-text-200">Development Mode</p>
<p className="text-xs text-custom-text-300">
This detailed error view is only visible in development. In production, users will see a friendly
error page.
</p>
</div>
</div>
</Card>
</div>
</div>
);
}
return (
<div className="min-h-screen bg-custom-background-90 p-6 flex items-start justify-center transition-none">
<div className="w-full max-w-4xl mt-12 space-y-4 transition-none">
<Banner
variant="error"
icon={<InfoFillIcon className="size-5" />}
title="Unknown Error"
animationDuration={0}
/>
<Card variant={ECardVariant.WITH_SHADOW} className="!p-6">
<div className="space-y-4">
<div>
<h2 className="text-2xl font-semibold text-custom-text-100 mb-2">Unknown Error</h2>
<div className="h-px w-full bg-custom-border-200" />
</div>
<div className="bg-custom-background-80 rounded-md p-4">
<p className="text-sm text-custom-text-200">
An unknown error occurred. Please try refreshing the page or contact support if the problem persists.
</p>
</div>
<ErrorActions onGoHome={onGoHome} onReload={onReload} />
</div>
</Card>
</div>
</div>
);
};