// src/components/NotificationContainer/index.js /** * 通知容器组件 - 右下角层叠显示实时通知 */ import React from 'react'; import { Box, VStack, HStack, Text, IconButton, Icon, useColorModeValue, Slide, ScaleFade, } from '@chakra-ui/react'; import { MdClose, MdCheckCircle, MdError, MdWarning, MdInfo } from 'react-icons/md'; import { useNotification } from '../../contexts/NotificationContext'; // 通知类型对应的图标和颜色 const NOTIFICATION_STYLES = { success: { icon: MdCheckCircle, colorScheme: 'green', bg: 'green.50', borderColor: 'green.400', iconColor: 'green.500', }, error: { icon: MdError, colorScheme: 'red', bg: 'red.50', borderColor: 'red.400', iconColor: 'red.500', }, warning: { icon: MdWarning, colorScheme: 'orange', bg: 'orange.50', borderColor: 'orange.400', iconColor: 'orange.500', }, info: { icon: MdInfo, colorScheme: 'blue', bg: 'blue.50', borderColor: 'blue.400', iconColor: 'blue.500', }, }; /** * 单个通知项组件 */ const NotificationItem = ({ notification, onClose, isNewest = false }) => { const { id, severity = 'info', title, message } = notification; const style = NOTIFICATION_STYLES[severity] || NOTIFICATION_STYLES.info; const bgColor = useColorModeValue(style.bg, `${style.colorScheme}.900`); const borderColor = useColorModeValue(style.borderColor, `${style.colorScheme}.500`); const textColor = useColorModeValue('gray.800', 'white'); const subTextColor = useColorModeValue('gray.600', 'gray.300'); return ( {/* 图标 */} {/* 内容 */} {title} {message && ( {message} )} {/* 关闭按钮 */} } size="sm" variant="ghost" colorScheme={style.colorScheme} aria-label="关闭通知" onClick={() => onClose(id)} position="absolute" top={2} right={2} _hover={{ bg: useColorModeValue(`${style.colorScheme}.100`, `${style.colorScheme}.800`), }} /> ); }; /** * 通知容器组件 - 主组件 */ const NotificationContainer = () => { const { notifications, removeNotification } = useNotification(); // 如果没有通知,不渲染 if (notifications.length === 0) { return null; } return ( {notifications.map((notification, index) => ( ))} ); }; export default NotificationContainer;