| import React, { useEffect, useState } from 'react'; | |
| import { Button, Modal, Empty } from '@douyinfe/semi-ui'; | |
| import { useTranslation } from 'react-i18next'; | |
| import { API, showError } from '../../helpers'; | |
| import { marked } from 'marked'; | |
| import { IllustrationNoContent, IllustrationNoContentDark } from '@douyinfe/semi-illustrations'; | |
| const NoticeModal = ({ visible, onClose, isMobile }) => { | |
| const { t } = useTranslation(); | |
| const [noticeContent, setNoticeContent] = useState(''); | |
| const [loading, setLoading] = useState(false); | |
| const handleCloseTodayNotice = () => { | |
| const today = new Date().toDateString(); | |
| localStorage.setItem('notice_close_date', today); | |
| onClose(); | |
| }; | |
| const displayNotice = async () => { | |
| setLoading(true); | |
| try { | |
| const res = await API.get('/api/notice'); | |
| const { success, message, data } = res.data; | |
| if (success) { | |
| if (data !== '') { | |
| const htmlNotice = marked.parse(data); | |
| setNoticeContent(htmlNotice); | |
| } else { | |
| setNoticeContent(''); | |
| } | |
| } else { | |
| showError(message); | |
| } | |
| } catch (error) { | |
| showError(error.message); | |
| } finally { | |
| setLoading(false); | |
| } | |
| }; | |
| useEffect(() => { | |
| if (visible) { | |
| displayNotice(); | |
| } | |
| }, [visible]); | |
| const renderContent = () => { | |
| if (loading) { | |
| return <div className="py-12"><Empty description={t('加载中...')} /></div>; | |
| } | |
| if (!noticeContent) { | |
| return ( | |
| <div className="py-12"> | |
| <Empty | |
| image={<IllustrationNoContent style={{ width: 150, height: 150 }} />} | |
| darkModeImage={<IllustrationNoContentDark style={{ width: 150, height: 150 }} />} | |
| description={t('暂无公告')} | |
| /> | |
| </div> | |
| ); | |
| } | |
| return ( | |
| <div | |
| dangerouslySetInnerHTML={{ __html: noticeContent }} | |
| className="max-h-[60vh] overflow-y-auto pr-2" | |
| style={{ | |
| scrollbarWidth: 'thin', | |
| scrollbarColor: 'var(--semi-color-tertiary) transparent' | |
| }} | |
| /> | |
| ); | |
| }; | |
| return ( | |
| <Modal | |
| title={t('系统公告')} | |
| visible={visible} | |
| onCancel={onClose} | |
| footer={( | |
| <div className="flex justify-end"> | |
| <Button type='secondary' className='!rounded-full' onClick={handleCloseTodayNotice}>{t('今日关闭')}</Button> | |
| <Button type="primary" className='!rounded-full' onClick={onClose}>{t('关闭公告')}</Button> | |
| </div> | |
| )} | |
| size={isMobile ? 'full-width' : 'large'} | |
| > | |
| {renderContent()} | |
| </Modal> | |
| ); | |
| }; | |
| export default NoticeModal; |