- 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>
66 lines
1.9 KiB
TypeScript
66 lines
1.9 KiB
TypeScript
/**
|
|
* Хук для обработки ошибок в компонентах
|
|
*/
|
|
'use client';
|
|
|
|
import { useState, useCallback } from 'react';
|
|
import { logError } from '@/lib/logger';
|
|
import { getUserFriendlyError, getContextualErrorMessage } from '@/lib/errors/user-friendly-messages';
|
|
import { captureException } from '@/lib/monitoring/sentry';
|
|
|
|
interface UseErrorHandlerOptions {
|
|
onError?: (error: Error) => void;
|
|
logError?: boolean;
|
|
sendToSentry?: boolean;
|
|
}
|
|
|
|
export function useErrorHandler(options: UseErrorHandlerOptions = {}) {
|
|
const [error, setError] = useState<Error | null>(null);
|
|
const [userFriendlyError, setUserFriendlyError] = useState<ReturnType<typeof getUserFriendlyError> | null>(null);
|
|
|
|
const handleError = useCallback((error: unknown, context?: { action?: string; resource?: string }) => {
|
|
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
|
|
// Логирование
|
|
if (options.logError !== false) {
|
|
logError('Component error', errorObj, context);
|
|
}
|
|
|
|
// Отправка в Sentry
|
|
if (options.sendToSentry !== false && process.env.NEXT_PUBLIC_SENTRY_DSN) {
|
|
try {
|
|
captureException(errorObj, context);
|
|
} catch (e) {
|
|
// Игнорируем ошибки Sentry
|
|
}
|
|
}
|
|
|
|
// Установка ошибки
|
|
setError(errorObj);
|
|
|
|
// Получение понятного сообщения
|
|
const friendlyError = context
|
|
? getContextualErrorMessage(errorObj, context)
|
|
: getUserFriendlyError(errorObj);
|
|
setUserFriendlyError(friendlyError);
|
|
|
|
// Вызов пользовательского обработчика
|
|
if (options.onError) {
|
|
options.onError(errorObj);
|
|
}
|
|
}, [options]);
|
|
|
|
const clearError = useCallback(() => {
|
|
setError(null);
|
|
setUserFriendlyError(null);
|
|
}, []);
|
|
|
|
return {
|
|
error,
|
|
userFriendlyError,
|
|
handleError,
|
|
clearError,
|
|
hasError: error !== null,
|
|
};
|
|
}
|