- Unify API: lib/api.ts uses /api/v1, inbox uses /api/inbox (rewrites) - Remove localhost refs: openapi, inbox page - Add rewrites: /api/inbox|tmc -> inbox-server, /api/v1 -> FastAPI - Add stub routes: knowledge/insights, recommendations, search, log-error - Transfer from PAPA: prompts (inspection, tmc), scripts, supabase, data/tmc-requests - Fix inbox-server: ORDER BY created_at, package.json - Remove redundant app/api/inbox/files route (rewrites handle it) - knowledge/ in gitignore (large PDFs) Co-authored-by: Cursor <cursoragent@cursor.com>
61 lines
1.5 KiB
TypeScript
61 lines
1.5 KiB
TypeScript
/**
|
|
* Глобальная страница ошибок Next.js
|
|
*/
|
|
'use client';
|
|
|
|
import { useEffect } from 'react';
|
|
import ErrorDisplay from '@/components/ErrorDisplay';
|
|
import { getUserFriendlyError } from '@/lib/errors/user-friendly-messages';
|
|
import { captureException } from '@/lib/monitoring/sentry';
|
|
|
|
export default function Error({
|
|
error,
|
|
reset,
|
|
}: {
|
|
error: Error & { digest?: string };
|
|
reset: () => void;
|
|
}) {
|
|
useEffect(() => {
|
|
// Логирование ошибки
|
|
console.error('Global error:', error);
|
|
|
|
// Отправка в Sentry
|
|
if (process.env.NEXT_PUBLIC_SENTRY_DSN) {
|
|
try {
|
|
captureException(error, {
|
|
digest: error.digest,
|
|
component: 'global-error',
|
|
});
|
|
} catch (e) {
|
|
// Игнорируем ошибки Sentry
|
|
}
|
|
}
|
|
}, [error]);
|
|
|
|
const friendlyError = getUserFriendlyError(error);
|
|
|
|
return (
|
|
<div
|
|
style={{
|
|
display: 'flex',
|
|
alignItems: 'center',
|
|
justifyContent: 'center',
|
|
minHeight: '100vh',
|
|
padding: '40px',
|
|
backgroundColor: '#f5f5f5',
|
|
}}
|
|
>
|
|
<div style={{ maxWidth: '600px', width: '100%' }}>
|
|
<ErrorDisplay
|
|
title={friendlyError.title}
|
|
message={friendlyError.message}
|
|
type={friendlyError.type}
|
|
onRetry={reset}
|
|
showDetails={process.env.NODE_ENV === 'development'}
|
|
details={error.stack}
|
|
/>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|