mirror of
https://github.com/sourcebot-dev/sourcebot.git
synced 2025-12-12 12:25:22 +00:00
54 lines
No EOL
1.9 KiB
TypeScript
54 lines
No EOL
1.9 KiB
TypeScript
'use client';
|
|
|
|
import { Button } from '@/components/ui/button';
|
|
import { serviceErrorSchema } from '@/lib/serviceError';
|
|
import { AlertCircle, X } from "lucide-react";
|
|
import { useMemo } from 'react';
|
|
|
|
interface ErrorBannerProps {
|
|
error: Error;
|
|
isVisible: boolean;
|
|
onClose: () => void;
|
|
}
|
|
|
|
export const ErrorBanner = ({ error, isVisible, onClose }: ErrorBannerProps) => {
|
|
const errorMessage = useMemo(() => {
|
|
try {
|
|
const errorJson = JSON.parse(error.message);
|
|
const serviceError = serviceErrorSchema.parse(errorJson);
|
|
return serviceError.message;
|
|
} catch {
|
|
return error.message;
|
|
}
|
|
}, [error]);
|
|
|
|
if (!isVisible) {
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<div className="bg-red-50 border-b border-red-200 dark:bg-red-950/20 dark:border-red-800">
|
|
<div className="max-w-5xl mx-auto px-4 py-3">
|
|
<div className="flex items-center justify-between">
|
|
<div className="flex items-center gap-2">
|
|
<AlertCircle className="h-4 w-4 text-red-600 dark:text-red-400" />
|
|
<span className="text-sm font-medium text-red-800 dark:text-red-200">
|
|
Error occurred
|
|
</span>
|
|
<span className="text-sm text-red-600 dark:text-red-400">
|
|
{errorMessage}
|
|
</span>
|
|
</div>
|
|
<Button
|
|
variant="ghost"
|
|
size="sm"
|
|
onClick={onClose}
|
|
className="h-6 w-6 p-0 text-red-600 hover:text-red-800 dark:text-red-400 dark:hover:text-red-200"
|
|
>
|
|
<X className="h-4 w-4" />
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|