materialuiupgraded
Version:
Material-UI's workspace package
98 lines (81 loc) • 2.51 kB
JavaScript
/* eslint-disable react/no-danger */
import 'isomorphic-fetch';
import React from 'react';
import Button from '@material-ui/core/Button';
import Snackbar from '@material-ui/core/Snackbar';
import sleep from 'modules/waterfall/sleep';
function getLastSeenNotification() {
const seen = document.cookie.replace(
/(?:(?:^|.*;\s*)lastSeenNotification\s*=\s*([^;]*).*$)|^.*$/,
'$1',
);
return seen === '' ? 0 : parseInt(seen, 10);
}
let messages = null;
async function getMessages() {
try {
if (!messages) {
await sleep(1e3); // Soften the pressure on the main thread.
const result = await fetch(
'https://raw.githubusercontent.com/mui-org/material-ui/master/docs/notifications.json',
);
messages = await result.json();
}
} catch (err) {
// Swallow the exceptions.
}
messages = messages || [];
}
class Notifications extends React.Component {
mounted = false;
state = {
open: false,
message: {},
};
async componentDidMount() {
this.mounted = true;
// Prevent search engines from indexing the notification.
if (/glebot/.test(navigator.userAgent)) {
return;
}
await getMessages();
this.handleMessage();
}
handleMessage = () => {
const lastSeen = getLastSeenNotification();
const unseenMessages = messages.filter(message => message.id > lastSeen);
if (unseenMessages.length > 0 && this.mounted) {
this.setState({ message: unseenMessages[0], open: true });
}
};
handleClose = () => {
this.setState({ open: false });
document.cookie = `lastSeenNotification=${this.state.message.id};path=/;max-age=31536000`;
};
componentWillUnmout() {
this.mounted = false;
}
render() {
const { message, open } = this.state;
return (
<Snackbar
key={message.id}
anchorOrigin={{ vertical: 'top', horizontal: 'center' }}
ContentProps={{ 'aria-describedby': 'notification-message' }}
message={
<span id="notification-message" dangerouslySetInnerHTML={{ __html: message.text }} />
}
action={
<Button size="small" color="secondary" onClick={this.handleClose}>
Close
</Button>
}
open={open}
autoHideDuration={20e3}
onClose={this.handleClose}
onExited={this.handleMessage}
/>
);
}
}
export default Notifications;