{"ast":null,"code":"import React,{useState,useEffect}from'react';import{List,Card,Button,Space,Tag,message,Empty,Popconfirm}from'antd';import{CheckOutlined,DeleteOutlined,ReadOutlined}from'@ant-design/icons';import{notificationsAPI}from'../services/api';import dayjs from'dayjs';import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";const Notifications=()=>{const[notifications,setNotifications]=useState([]);const[loading,setLoading]=useState(false);const[pagination,setPagination]=useState({current:1,pageSize:20,total:0,unread:0});const[unreadOnly,setUnreadOnly]=useState(false);useEffect(()=>{fetchNotifications();},[pagination.current,pagination.pageSize,unreadOnly]);const fetchNotifications=async()=>{setLoading(true);try{const response=await notificationsAPI.getAll({page:pagination.current,limit:pagination.pageSize,unreadOnly:unreadOnly});setNotifications(response.data.notifications);setPagination(prev=>{var _response$data$pagina,_response$data$pagina2;return{...prev,total:((_response$data$pagina=response.data.pagination)===null||_response$data$pagina===void 0?void 0:_response$data$pagina.total)||0,unread:((_response$data$pagina2=response.data.pagination)===null||_response$data$pagina2===void 0?void 0:_response$data$pagina2.unread)||0};});}catch(error){message.error('获取通知失败');}finally{setLoading(false);}};const markAsRead=async id=>{try{await notificationsAPI.markAsRead(id);message.success('已标记为已读');fetchNotifications();}catch(error){message.error('操作失败');}};const markAllAsRead=async()=>{try{await notificationsAPI.markAllAsRead();message.success('全部已标记为已读');fetchNotifications();}catch(error){message.error('操作失败');}};const handleDelete=async id=>{try{await notificationsAPI.delete(id);message.success('删除成功');fetchNotifications();}catch(error){message.error('删除失败');}};const getTypeColor=type=>{const colors={info:'blue',success:'green',warning:'orange',error:'red'};return colors[type]||'default';};const getTypeText=type=>{const texts={info:'通知',success:'成功',warning:'警告',error:'错误'};return texts[type]||type;};return/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"div\",{className:\"page-header\",children:/*#__PURE__*/_jsx(\"h1\",{children:\"\\u901A\\u77E5\\u4E2D\\u5FC3\"})}),/*#__PURE__*/_jsx(Card,{extra:/*#__PURE__*/_jsxs(Space,{children:[/*#__PURE__*/_jsx(Button,{type:unreadOnly?'primary':'default',onClick:()=>setUnreadOnly(!unreadOnly),children:unreadOnly?'显示全部':'只看未读'}),pagination.unread>0&&/*#__PURE__*/_jsx(Button,{icon:/*#__PURE__*/_jsx(ReadOutlined,{}),onClick:markAllAsRead,children:\"\\u5168\\u90E8\\u6807\\u8BB0\\u5DF2\\u8BFB\"})]}),children:/*#__PURE__*/_jsx(List,{loading:loading,itemLayout:\"horizontal\",dataSource:notifications,locale:{emptyText:/*#__PURE__*/_jsx(Empty,{description:\"\\u6682\\u65E0\\u901A\\u77E5\"})},pagination:{...pagination,showSizeChanger:true,showQuickJumper:true,showTotal:total=>`共 ${total} 条`,onChange:(page,pageSize)=>setPagination(prev=>({...prev,current:page,pageSize}))},renderItem:item=>/*#__PURE__*/_jsx(List.Item,{actions:[!item.is_read&&/*#__PURE__*/_jsx(Button,{type:\"text\",icon:/*#__PURE__*/_jsx(CheckOutlined,{}),onClick:()=>markAsRead(item.id),children:\"\\u6807\\u4E3A\\u5DF2\\u8BFB\"}),/*#__PURE__*/_jsx(Popconfirm,{title:\"\\u786E\\u5B9A\\u5220\\u9664\\u8FD9\\u6761\\u901A\\u77E5\\u5417?\",onConfirm:()=>handleDelete(item.id),children:/*#__PURE__*/_jsx(Button,{type:\"text\",danger:true,icon:/*#__PURE__*/_jsx(DeleteOutlined,{}),children:\"\\u5220\\u9664\"})})],style:{opacity:item.is_read?0.7:1,background:item.is_read?'transparent':'#f0f5ff'},children:/*#__PURE__*/_jsx(List.Item.Meta,{avatar:/*#__PURE__*/_jsx(Tag,{color:getTypeColor(item.type),children:getTypeText(item.type)}),title:/*#__PURE__*/_jsxs(Space,{children:[/*#__PURE__*/_jsx(\"span\",{style:{fontWeight:item.is_read?'normal':'bold'},children:item.title}),!item.is_read&&/*#__PURE__*/_jsx(\"span\",{style:{color:'#1890ff',fontSize:12},children:\"\\u65B0\"})]}),description:/*#__PURE__*/_jsxs(\"div\",{children:[/*#__PURE__*/_jsx(\"div\",{style:{marginBottom:4},children:item.content}),/*#__PURE__*/_jsx(\"div\",{style:{color:'#999',fontSize:12},children:dayjs(item.created_at).format('YYYY-MM-DD HH:mm')})]})})})})})]});};export default Notifications;","map":{"version":3,"names":["React","useState","useEffect","List","Card","Button","Space","Tag","message","Empty","Popconfirm","CheckOutlined","DeleteOutlined","ReadOutlined","notificationsAPI","dayjs","jsx","_jsx","jsxs","_jsxs","Notifications","notifications","setNotifications","loading","setLoading","pagination","setPagination","current","pageSize","total","unread","unreadOnly","setUnreadOnly","fetchNotifications","response","getAll","page","limit","data","prev","_response$data$pagina","_response$data$pagina2","error","markAsRead","id","success","markAllAsRead","handleDelete","delete","getTypeColor","type","colors","info","warning","getTypeText","texts","children","className","extra","onClick","icon","itemLayout","dataSource","locale","emptyText","description","showSizeChanger","showQuickJumper","showTotal","onChange","renderItem","item","Item","actions","is_read","title","onConfirm","danger","style","opacity","background","Meta","avatar","color","fontWeight","fontSize","marginBottom","content","created_at","format"],"sources":["/Users/nili/Documents/trae_projects/client/src/pages/Notifications.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { List, Card, Button, Space, Tag, message, Empty, Popconfirm } from 'antd';\nimport { CheckOutlined, DeleteOutlined, ReadOutlined } from '@ant-design/icons';\nimport { notificationsAPI } from '../services/api';\nimport dayjs from 'dayjs';\n\nconst Notifications = () => {\n  const [notifications, setNotifications] = useState([]);\n  const [loading, setLoading] = useState(false);\n  const [pagination, setPagination] = useState({ current: 1, pageSize: 20, total: 0, unread: 0 });\n  const [unreadOnly, setUnreadOnly] = useState(false);\n\n  useEffect(() => {\n    fetchNotifications();\n  }, [pagination.current, pagination.pageSize, unreadOnly]);\n\n  const fetchNotifications = async () => {\n    setLoading(true);\n    try {\n      const response = await notificationsAPI.getAll({\n        page: pagination.current,\n        limit: pagination.pageSize,\n        unreadOnly: unreadOnly\n      });\n      setNotifications(response.data.notifications);\n      setPagination(prev => ({\n        ...prev,\n        total: response.data.pagination?.total || 0,\n        unread: response.data.pagination?.unread || 0\n      }));\n    } catch (error) {\n      message.error('获取通知失败');\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const markAsRead = async (id) => {\n    try {\n      await notificationsAPI.markAsRead(id);\n      message.success('已标记为已读');\n      fetchNotifications();\n    } catch (error) {\n      message.error('操作失败');\n    }\n  };\n\n  const markAllAsRead = async () => {\n    try {\n      await notificationsAPI.markAllAsRead();\n      message.success('全部已标记为已读');\n      fetchNotifications();\n    } catch (error) {\n      message.error('操作失败');\n    }\n  };\n\n  const handleDelete = async (id) => {\n    try {\n      await notificationsAPI.delete(id);\n      message.success('删除成功');\n      fetchNotifications();\n    } catch (error) {\n      message.error('删除失败');\n    }\n  };\n\n  const getTypeColor = (type) => {\n    const colors = { info: 'blue', success: 'green', warning: 'orange', error: 'red' };\n    return colors[type] || 'default';\n  };\n\n  const getTypeText = (type) => {\n    const texts = { info: '通知', success: '成功', warning: '警告', error: '错误' };\n    return texts[type] || type;\n  };\n\n  return (\n    <div>\n      <div className=\"page-header\">\n        <h1>通知中心</h1>\n      </div>\n\n      <Card\n        extra={\n          <Space>\n            <Button\n              type={unreadOnly ? 'primary' : 'default'}\n              onClick={() => setUnreadOnly(!unreadOnly)}\n            >\n              {unreadOnly ? '显示全部' : '只看未读'}\n            </Button>\n            {pagination.unread > 0 && (\n              <Button icon={<ReadOutlined />} onClick={markAllAsRead}>\n                全部标记已读\n              </Button>\n            )}\n          </Space>\n        }\n      >\n        <List\n          loading={loading}\n          itemLayout=\"horizontal\"\n          dataSource={notifications}\n          locale={{ emptyText: <Empty description=\"暂无通知\" /> }}\n          pagination={{\n            ...pagination,\n            showSizeChanger: true,\n            showQuickJumper: true,\n            showTotal: (total) => `共 ${total} 条`,\n            onChange: (page, pageSize) => setPagination(prev => ({ ...prev, current: page, pageSize }))\n          }}\n          renderItem={(item) => (\n            <List.Item\n              actions={[\n                !item.is_read && (\n                  <Button\n                    type=\"text\"\n                    icon={<CheckOutlined />}\n                    onClick={() => markAsRead(item.id)}\n                  >\n                    标为已读\n                  </Button>\n                ),\n                <Popconfirm title=\"确定删除这条通知吗?\" onConfirm={() => handleDelete(item.id)}>\n                  <Button type=\"text\" danger icon={<DeleteOutlined />}>删除</Button>\n                </Popconfirm>\n              ]}\n              style={{ opacity: item.is_read ? 0.7 : 1, background: item.is_read ? 'transparent' : '#f0f5ff' }}\n            >\n              <List.Item.Meta\n                avatar={\n                  <Tag color={getTypeColor(item.type)}>\n                    {getTypeText(item.type)}\n                  </Tag>\n                }\n                title={\n                  <Space>\n                    <span style={{ fontWeight: item.is_read ? 'normal' : 'bold' }}>{item.title}</span>\n                    {!item.is_read && <span style={{ color: '#1890ff', fontSize: 12 }}>新</span>}\n                  </Space>\n                }\n                description={\n                  <div>\n                    <div style={{ marginBottom: 4 }}>{item.content}</div>\n                    <div style={{ color: '#999', fontSize: 12 }}>\n                      {dayjs(item.created_at).format('YYYY-MM-DD HH:mm')}\n                    </div>\n                  </div>\n                }\n              />\n            </List.Item>\n          )}\n        />\n      </Card>\n    </div>\n  );\n};\n\nexport default Notifications;\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}