import React from 'react'; import ReactDOM from 'react-dom'; import { navigate } from '@reach/router'; import { Utils } from './utils/utils'; import { gettext, siteRoot, mediaUrl, logoPath, logoWidth, logoHeight, siteTitle } from './utils/constants'; import { seafileAPI } from './utils/seafile-api'; import Loading from './components/loading'; import Paginator from './components/paginator'; import CommonToolbar from './components/toolbar/common-toolbar'; import NoticeItem from './components/common/notice-item'; import './css/toolbar.css'; import './css/search.css'; import './css/user-notifications.css'; class UserNotifications extends React.Component { constructor(props) { super(props); this.state = { isLoading: true, errorMsg: '', currentPage: 1, perPage: 25, hasNextPage: false, items: [] }; } componentDidMount() { let urlParams = (new URL(window.location)).searchParams; const { currentPage, perPage } = this.state; this.setState({ perPage: parseInt(urlParams.get('per_page') || perPage), currentPage: parseInt(urlParams.get('page') || currentPage) }, () => { this.getItems(this.state.currentPage); }); } getItems = (page) => { const { perPage } = this.state; seafileAPI.listNotifications(page, perPage).then((res) => { this.setState({ isLoading: false, items: res.data.notification_list, currentPage: page, hasNextPage: Utils.hasNextPage(page, perPage, res.data.count) }); }).catch((error) => { this.setState({ isLoading: false, errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403 }); }); } resetPerPage = (perPage) => { this.setState({ perPage: perPage }, () => { this.getItems(1); }); } onSearchedClick = (selectedItem) => { if (selectedItem.is_dir === true) { let url = siteRoot + 'library/' + selectedItem.repo_id + '/' + selectedItem.repo_name + selectedItem.path; navigate(url, {repalce: true}); } else { let url = siteRoot + 'lib/' + selectedItem.repo_id + '/file' + Utils.encodePath(selectedItem.path); let newWindow = window.open('about:blank'); newWindow.location.href = url; } } markAllRead = () => { seafileAPI.updateNotifications().then((res) => { this.setState({ items: this.state.items.map(item => { item.seen = true; return item; }) }); }).catch((error) => { this.setState({ isLoading: false, errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403 }); }); } clearAll = () => { seafileAPI.deleteNotifications().then((res) => { this.setState({ items: [] }); }).catch((error) => { this.setState({ isLoading: false, errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403 }); }); } render() { return (
logo

{gettext('Notifications')}

); } } class Content extends React.Component { constructor(props) { super(props); this.theadData = [ {width: '7%', text: ''}, {width: '73%', text: gettext('Message')}, {width: '20%', text: gettext('Time')} ]; } getPreviousPage = () => { this.props.getListByPage(this.props.currentPage - 1); } getNextPage = () => { this.props.getListByPage(this.props.currentPage + 1); } render() { const { isLoading, errorMsg, items, curPerPage, currentPage, hasNextPage } = this.props; if (isLoading) { return ; } if (errorMsg) { return

{errorMsg}

; } return ( {this.theadData.map((item, index) => { return ; })} {items.map((item, index) => { return (); })}
{item.text}
{items.length > 0 && }
); } } ReactDOM.render( , document.getElementById('wrapper') );