import { ErrorInfo } from 'react'
import { Result, Button, Collapse, Typography } from 'antd'
import { BugOutlined, ReloadOutlined, HomeOutlined } from '@ant-design/icons'
import { useNavigate } from 'react-router-dom'
/**
* 模块错误提示组件
*
* @description
* 当模块加载或运行出错时显示的友好错误页面
* 提供重试和返回首页的操作
*
* @version Week 2 Day 7 - 任务17
*/
const { Paragraph, Text } = Typography
interface ModuleErrorFallbackProps {
/** 错误对象 */
error: Error | null
/** 错误详细信息 */
errorInfo?: ErrorInfo | null
/** 重置错误状态的回调 */
onReset?: () => void
/** 模块名称 */
moduleName?: string
}
const ModuleErrorFallback = ({
error,
errorInfo,
onReset,
moduleName,
}: ModuleErrorFallbackProps) => {
const navigate = useNavigate()
// 是否显示详细错误信息(开发环境显示,生产环境隐藏)
const isDevelopment = import.meta.env.DEV
/**
* 处理重试
*/
const handleRetry = () => {
if (onReset) {
onReset()
} else {
// 如果没有提供onReset,刷新页面
window.location.reload()
}
}
/**
* 返回首页
*/
const handleGoHome = () => {
navigate('/')
}
return (
}
title={
{moduleName ? `${moduleName}模块` : '页面'}加载失败
}
subTitle={
抱歉,模块加载时遇到了一些问题。这可能是由于网络问题或代码错误导致的。
您可以尝试重新加载,或者返回首页。如果问题持续存在,请联系技术支持。
}
extra={
}
onClick={handleRetry}
size="large"
>
重新加载
}
onClick={handleGoHome}
size="large"
>
返回首页
}
/>
{/* 开发环境:显示详细错误信息 */}
{isDevelopment && error && (
🔧 开发模式:查看错误详情
),
children: (
{/* 错误消息 */}
{/* 错误堆栈 */}
{error.stack && (
)}
{/* 组件堆栈 */}
{errorInfo?.componentStack && (
组件堆栈:
{errorInfo.componentStack}
)}
{/* 时间戳 */}
错误时间:{new Date().toLocaleString('zh-CN')}
),
},
]}
/>
)}
{/* 生产环境:错误ID提示 */}
{!isDevelopment && (
错误ID: {Date.now().toString(36)}
如需技术支持,请提供此错误ID
)}
)
}
export default ModuleErrorFallback
/**
* 🎨 设计说明:
*
* 1. 用户体验:
* - ✅ 友好的错误提示(不显示技术术语)
* - ✅ 明确的操作指引(重试/返回首页)
* - ✅ 视觉上与整体风格一致(Ant Design Result)
*
* 2. 开发体验:
* - ✅ 开发环境显示详细错误(方便调试)
* - ✅ 错误信息可复制(方便分享给团队)
* - ✅ 显示完整堆栈(快速定位问题)
*
* 3. 生产环境:
* - ✅ 隐藏技术细节(安全性)
* - ✅ 提供错误ID(方便追踪)
* - ✅ 引导用户联系支持
*
* 4. 后续优化:
* - [ ] 添加"反馈问题"按钮
* - [ ] 集成错误报告系统
* - [ ] 记录用户操作路径
* - [ ] 自动重试机制(网络错误)
*/