| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import React from 'react'; |
| import { Card, Tag, Timeline, Empty } from '@douyinfe/semi-ui'; |
| import { Bell } from 'lucide-react'; |
| import { marked } from 'marked'; |
| import { |
| IllustrationConstruction, |
| IllustrationConstructionDark, |
| } from '@douyinfe/semi-illustrations'; |
| import ScrollableContainer from '../common/ui/ScrollableContainer'; |
|
|
| const AnnouncementsPanel = ({ |
| announcementData, |
| announcementLegendData, |
| CARD_PROPS, |
| ILLUSTRATION_SIZE, |
| t, |
| }) => { |
| return ( |
| <Card |
| {...CARD_PROPS} |
| className='shadow-sm !rounded-2xl lg:col-span-2' |
| title={ |
| <div className='flex flex-col lg:flex-row lg:items-center lg:justify-between gap-2 w-full'> |
| <div className='flex items-center gap-2'> |
| <Bell size={16} /> |
| {t('系统公告')} |
| <Tag color='white' shape='circle'> |
| {t('显示最新20条')} |
| </Tag> |
| </div> |
| {/* 图例 */} |
| <div className='flex flex-wrap gap-3 text-xs'> |
| {announcementLegendData.map((legend, index) => ( |
| <div key={index} className='flex items-center gap-1'> |
| <div |
| className='w-2 h-2 rounded-full' |
| style={{ |
| backgroundColor: |
| legend.color === 'grey' |
| ? '#8b9aa7' |
| : legend.color === 'blue' |
| ? '#3b82f6' |
| : legend.color === 'green' |
| ? '#10b981' |
| : legend.color === 'orange' |
| ? '#f59e0b' |
| : legend.color === 'red' |
| ? '#ef4444' |
| : '#8b9aa7', |
| }} |
| /> |
| <span className='text-gray-600'>{legend.label}</span> |
| </div> |
| ))} |
| </div> |
| </div> |
| } |
| bodyStyle={{ padding: 0 }} |
| > |
| <ScrollableContainer maxHeight='24rem'> |
| {announcementData.length > 0 ? ( |
| <Timeline mode='left'> |
| {announcementData.map((item, idx) => { |
| const htmlExtra = item.extra ? marked.parse(item.extra) : ''; |
| return ( |
| <Timeline.Item |
| key={idx} |
| type={item.type || 'default'} |
| time={`${item.relative ? item.relative + ' ' : ''}${item.time}`} |
| extra={ |
| item.extra ? ( |
| <div |
| className='text-xs text-gray-500' |
| dangerouslySetInnerHTML={{ __html: htmlExtra }} |
| /> |
| ) : null |
| } |
| > |
| <div> |
| <div |
| dangerouslySetInnerHTML={{ |
| __html: marked.parse(item.content || ''), |
| }} |
| /> |
| </div> |
| </Timeline.Item> |
| ); |
| })} |
| </Timeline> |
| ) : ( |
| <div className='flex justify-center items-center py-8'> |
| <Empty |
| image={<IllustrationConstruction style={ILLUSTRATION_SIZE} />} |
| darkModeImage={ |
| <IllustrationConstructionDark style={ILLUSTRATION_SIZE} /> |
| } |
| title={t('暂无系统公告')} |
| description={t('请联系管理员在系统设置中配置公告信息')} |
| /> |
| </div> |
| )} |
| </ScrollableContainer> |
| </Card> |
| ); |
| }; |
|
|
| export default AnnouncementsPanel; |
|
|