import { IconAlertTriangle, IconCopy, IconRefresh, IconChevronDown, IconChevronUp } from '@tabler/icons-react' import { useState } from 'react' /** * ErrorAlert - улучшенный компонент для отображения ошибок * Добавлены: Copy error, Retry, Show details */ function ErrorAlert({ message, details, error, // альтернативный формат - объект error onClose, onRetry, className = '', showDetails = true }) { const [isExpanded, setIsExpanded] = useState(false) const [copied, setCopied] = useState(false) // Поддержка обоих форматов: { message, details } или { error } const errorMessage = message || (typeof error === 'string' ? error : error?.message) || 'Произошла неизвестная ошибка' const errorDetails = details || error?.details || error?.stack || null const errorCode = error?.code || error?.status || null if (!errorMessage) return null const handleCopy = () => { const errorText = ` Ошибка: ${errorMessage} ${errorCode ? `Код: ${errorCode}` : ''} ${errorDetails ? `Детали:\n${typeof errorDetails === 'string' ? errorDetails : JSON.stringify(errorDetails, null, 2)}` : ''} Время: ${new Date().toLocaleString('ru-RU')} `.trim() navigator.clipboard.writeText(errorText).then(() => { setCopied(true) setTimeout(() => setCopied(false), 2000) }).catch(err => { console.error('Не удалось скопировать:', err) }) } return (

Ошибка {errorCode && ( {errorCode} )}

{errorMessage}
{/* Детали ошибки (раскрывающийся блок) */} {errorDetails && showDetails && (
{isExpanded && (
                  {typeof errorDetails === 'string' ? errorDetails : JSON.stringify(errorDetails, null, 2)}
                
)}
)} {/* Действия */} {(onRetry || handleCopy) && (
{onRetry && ( )}
)}
{onClose && (
) } export default ErrorAlert