Skip to content

Commit 9adc522

Browse files
authored
Merge pull request #422 from rvsia/addNotificationsToDemo
Add notification panel to demo
2 parents 594a29f + 13a057e commit 9adc522

File tree

4 files changed

+134
-1
lines changed

4 files changed

+134
-1
lines changed

packages/react-renderer-demo/src/app/pages/_document.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class MyDocument extends Document {
2525
<body>
2626
<Main />
2727
<NextScript />
28+
<script async defer src="https://buttons.github.io/buttons.js"></script>
2829
</body>
2930
</html>
3031
);

packages/react-renderer-demo/src/app/pages/index.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ const useStyles = makeStyles((theme) => ({
2525
textAlign: 'center',
2626
marginTop: 48
2727
},
28+
npmLink: {
29+
display: 'block',
30+
textAlign: 'center',
31+
marginTop: 24
32+
},
2833
getStartedAnchor: {
2934
textDecoration: 'none'
3035
},
@@ -56,6 +61,20 @@ const LandingPage = () => {
5661
</a>
5762
</Link>
5863
</div>
64+
<div className={classes.npmLink}>
65+
<a
66+
className="github-button"
67+
href="https://github.com/data-driven-forms/react-forms"
68+
data-show-count="true"
69+
aria-label="Star data-driven-forms/react-forms on GitHub"
70+
>
71+
Star
72+
</a>
73+
&nbsp;
74+
<a href="https://badge.fury.io/js/%40data-driven-forms%2Freact-form-renderer" rel="noopener noreferrer" target="_blank">
75+
<img src="https://badge.fury.io/js/%40data-driven-forms%2Freact-form-renderer.svg" alt="current version" />
76+
</a>
77+
</div>
5978
</div>
6079
<LandingPageCards />
6180
</React.Fragment>

packages/react-renderer-demo/src/app/src/components/layout.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import makeStyles from '@material-ui/core/styles/makeStyles';
55
import Drawer from '@material-ui/core/Drawer';
66
import Toolbar from '@material-ui/core/Toolbar';
77
import Divider from '@material-ui/core/Divider';
8+
import Badge from '@material-ui/core/Badge';
9+
import NotificationsIcon from '@material-ui/icons/Notifications';
810
import IconButton from '@material-ui/core/IconButton';
911
import MenuIcon from '@material-ui/icons/Menu';
1012
import SvgIcon from '@material-ui/core/SvgIcon';
@@ -19,6 +21,7 @@ import ConnectedLinks from './common/connected-links';
1921
import Footer from './footer';
2022

2123
import dynamic from 'next/dynamic';
24+
import NotificationPanel, { lastMessageId } from './notification-panel';
2225
const DocSearch = dynamic(import('./docsearch'), {
2326
ssr: false
2427
});
@@ -121,11 +124,18 @@ const Layout = ({ children }) => {
121124
const [open, setOpen] = useState(router.pathname !== '/');
122125
const [links, setLinks] = useState({});
123126
const searchRef = useRef(null);
127+
const anchorRef = useRef(null);
128+
const [openNotification, setOpenNotifiation] = useState(false);
129+
const [lastCheck, setLastCheck] = useState('');
124130

125131
useEffect(() => {
126132
setLinks(findConnectedLinks(router.asPath, flatSchema) || {});
127133
}, [router.asPath]);
128134

135+
useEffect(() => {
136+
setLastCheck(localStorage.getItem('data-driven-forms-last-checked') || '');
137+
}, []);
138+
129139
const handleDrawerOpen = () => {
130140
setOpen(true);
131141
setTimeout(() => searchRef.current.focus(), 500);
@@ -135,6 +145,12 @@ const Layout = ({ children }) => {
135145
setOpen(false);
136146
}
137147

148+
const handleToggle = () => {
149+
localStorage.setItem('data-driven-forms-last-checked', lastMessageId);
150+
setLastCheck(lastMessageId);
151+
setOpenNotifiation(!openNotification);
152+
};
153+
138154
return (
139155
<MenuContext.Provider value={links}>
140156
<div className={classes.root}>
@@ -172,6 +188,12 @@ const Layout = ({ children }) => {
172188
})}
173189
>
174190
<DocSearch />
191+
<IconButton aria-label="show new notifications" onClick={handleToggle} color="inherit" ref={anchorRef} className={clsx(classes.menuButton)}>
192+
<Badge badgeContent={lastMessageId - lastCheck} color="secondary">
193+
<NotificationsIcon className={classes.menuIcons} />
194+
</Badge>
195+
</IconButton>
196+
<NotificationPanel isOpen={openNotification} anchorRef={anchorRef} onClose={() => setOpenNotifiation(false)} />
175197
<a href="https://github.com/data-driven-forms/react-forms" rel="noopener noreferrer" target="_blank">
176198
<IconButton color="inherit" aria-label="gh repository" edge="start" className={clsx(classes.menuButton)}>
177199
<SvgIcon>
@@ -180,7 +202,6 @@ const Layout = ({ children }) => {
180202
</IconButton>
181203
</a>
182204
</div>
183-
184205
<main
185206
className={clsx(classes.content, {
186207
[classes.contentShift]: open,
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import React from 'react';
2+
import PropTypes from 'prop-types';
3+
import Popper from '@material-ui/core/Popper';
4+
import Grow from '@material-ui/core/Grow';
5+
import Paper from '@material-ui/core/Paper';
6+
import ClickAwayListener from '@material-ui/core/ClickAwayListener';
7+
import List from '@material-ui/core/List';
8+
import ListItem from '@material-ui/core/ListItem';
9+
import ListItemText from '@material-ui/core/ListItemText';
10+
import Divider from '@material-ui/core/Divider';
11+
import Markdown from 'markdown-to-jsx';
12+
import { makeStyles } from '@material-ui/core/styles';
13+
14+
import MdxComponents from './mdx/mdx-components';
15+
16+
const options = {
17+
overrides: {
18+
a: {
19+
component: MdxComponents.a
20+
}
21+
}
22+
};
23+
24+
const messageList = [
25+
{
26+
id: '1',
27+
date: 'April 8 2020',
28+
title: 'Version 2 released',
29+
text: `Version 2 of Data Driven Forms has been released.<br /><br />
30+
Check what is new in [migration guide](/migration-guide)!<br /><br />
31+
If you need documenation for version 1, please use v1 [branch on GitHub](https://github.com/data-driven-forms/react-forms/tree/v1/packages/react-renderer-demo/src/app/pages)
32+
or visit our [backup link](https://pokus-next.firebaseapp.com/)!
33+
`
34+
}
35+
];
36+
37+
export const lastMessageId = messageList[0].id;
38+
39+
const useStyles = makeStyles((theme) => ({
40+
paper: {
41+
transformOrigin: 'top right'
42+
},
43+
list: {
44+
maxWidth: theme.spacing(40),
45+
maxHeight: theme.spacing(40),
46+
overflow: 'auto'
47+
},
48+
listItem: {
49+
display: 'flex',
50+
flexDirection: 'column'
51+
}
52+
}));
53+
54+
const NotificationPanel = ({ isOpen, onClose, anchorRef }) => {
55+
const classes = useStyles();
56+
57+
return (
58+
<Popper id="notifications-popup" open={isOpen} anchorEl={anchorRef.current} placement="bottom-end" transition disablePortal role={undefined}>
59+
{({ TransitionProps }) => (
60+
<ClickAwayListener onClickAway={onClose}>
61+
<Grow in={isOpen} {...TransitionProps}>
62+
<Paper className={classes.paper}>
63+
<List className={classes.list}>
64+
{messageList.map((message, index) => (
65+
<React.Fragment key={message.id}>
66+
<ListItem alignItems="flex-start" className={classes.listItem}>
67+
{message.date && <ListItemText secondary={message.date} />}
68+
<ListItemText
69+
primary={message.title}
70+
secondary={<Markdown options={options}>{message.text}</Markdown>}
71+
secondaryTypographyProps={{ color: 'textPrimary', component: 'div' }}
72+
/>
73+
</ListItem>
74+
{index < messageList.length - 1 ? <Divider variant="middle" /> : null}
75+
</React.Fragment>
76+
))}
77+
</List>
78+
</Paper>
79+
</Grow>
80+
</ClickAwayListener>
81+
)}
82+
</Popper>
83+
);
84+
};
85+
86+
NotificationPanel.propTypes = {
87+
isOpen: PropTypes.bool.isRequired,
88+
onClose: PropTypes.func.isRequired,
89+
anchorRef: PropTypes.oneOfType([PropTypes.func, PropTypes.shape({ current: PropTypes.any })]).isRequired
90+
};
91+
92+
export default NotificationPanel;

0 commit comments

Comments
 (0)