| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- 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;
|