Skip to content

Commit

Permalink
Merge pull request #44 from Cainuse/notifications
Browse files Browse the repository at this point in the history
Notifications
  • Loading branch information
abid-salahi authored Jul 20, 2020
2 parents 62e545f + 05fd104 commit 9cd001a
Show file tree
Hide file tree
Showing 11 changed files with 519 additions and 25 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"axios": "^0.19.2",
"babel-loader": "^8.1.0",
"dotenv": "^8.2.0",
"moment": "^2.27.0",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-google-login": "^5.1.20",
Expand Down
2 changes: 1 addition & 1 deletion src/components/AddOffering/AddOffering.js
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ class AddOffering extends React.Component {
this.state.comment,
this.state.addedItems,
this.props.currentUser,
this.props.itemDetail._id,
this.props.itemDetail._id
);

let id = this.props.itemDetail._id;
Expand Down
26 changes: 2 additions & 24 deletions src/components/Navigation/NavBar/ActionBtns/ActionButtons.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@ import { connect } from "react-redux";

import Button from "@material-ui/core/Button";
import { makeStyles } from "@material-ui/core/styles";
import { IconButton } from "@material-ui/core";
import AddCircleOutlineOutlinedIcon from "@material-ui/icons/AddCircleOutlineOutlined";
import NotificationsNoneOutlinedIcon from "@material-ui/icons/NotificationsNoneOutlined";
import NotificationsMenu from "./NotificationsMenu";

import { unsetUser } from "../../../../redux/actions/userActions";
import {
openPostingModal,
openLoginModal,
Expand Down Expand Up @@ -41,10 +39,6 @@ const loggedInStyles = makeStyles(() => ({
fontSize: "1.3rem",
fontWeight: "100",
},
notificationBtn: {
fontSize: "1.7rem",
padding: "5px",
},
accountBtn: {
fontSize: "2rem",
padding: "5px",
Expand Down Expand Up @@ -91,18 +85,6 @@ const LoginBtn = (props) => {
);
};

const NotificationBtn = (props) => {
return (
<IconButton
className={props.iconBtnClass}
color="inherit"
aria-label="chat"
>
<NotificationsNoneOutlinedIcon className={props.notificationBtnClass} />
</IconButton>
);
};

/**
* MAIN: Logged Out Action Item Components
**/
Expand All @@ -117,10 +99,7 @@ const LoggedInActionItems = (props) => {
openPostingModal={props.openPostingModal}
/>
<AppBarDivider className={classes.divider} />
<NotificationBtn
iconBtnClass={classes.iconBtn}
notificationBtnClass={classes.notificationBtn}
/>
<NotificationsMenu />
<AccountBtn
iconBtnClass={classes.iconBtn}
accountBtnClass={classes.accountBtn}
Expand All @@ -139,5 +118,4 @@ const ActionItems = (props) => {
export default connect(null, {
openPostingModal,
openLoginModal,
unsetUser,
})(ActionItems);
167 changes: 167 additions & 0 deletions src/components/Navigation/NavBar/ActionBtns/Notification.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
import React, { useState } from "react";
import { connect } from "react-redux";
import { ListItemAvatar, ListItemText } from "@material-ui/core";
import { makeStyles } from "@material-ui/core/styles";
import IconButton from "@material-ui/core/IconButton";
import LocalOfferIcon from "@material-ui/icons/LocalOffer";
import Menu from "@material-ui/core/Menu";
import MenuItem from "@material-ui/core/MenuItem";
import moment from "moment";
import Typography from "@material-ui/core/Typography";
import ClearIcon from "@material-ui/icons/Clear";
import CheckIcon from "@material-ui/icons/Check";
import ErrorIcon from "@material-ui/icons/Error";
import CancelIcon from "@material-ui/icons/Cancel";
import MoreHorizIcon from "@material-ui/icons/MoreHoriz";
import CheckBoxIcon from "@material-ui/icons/CheckBox";
import MarkunreadIcon from "@material-ui/icons/Markunread";
import Button from "@material-ui/core/Button";
import {
updateNotificationAsync,
removeNotificationAsync,
} from "../../../../redux/actions/notificationActions";

const useStyles = makeStyles(() => ({
acceptedIcon: {
color: "green",
},
rejectedIcon: {
color: "red",
},
moreItems: {
textTransform: "none",
},
}));

const SeeMoreMenu = ({
dispatch,
handleDeleteClick,
onUpdateStatus,
_id,
isRead,
}) => {
const [anchorEl, setAnchorEl] = useState(null);
const classes = useStyles();
const open = Boolean(anchorEl);

const handleClick = (event) => {
setAnchorEl(event.currentTarget);
};

const handleClose = () => {
setAnchorEl(null);
};

const handleReadClick = () => {
dispatch(updateNotificationAsync(_id, !isRead)).then(() => {
onUpdateStatus(_id, !isRead);
});
};

return (
<div>
<IconButton
aria-label="more"
aria-controls="more-menu"
aria-haspopup="true"
onClick={handleClick}
>
<MoreHorizIcon />
</IconButton>
<Menu
id="more-menu"
anchorEl={anchorEl}
anchorOrigin={{
vertical: "bottom",
horizontal: "center",
}}
transformOrigin={{
vertical: "top",
horizontal: "center",
}}
keepMounted
open={open}
onClose={handleClose}
>
<MenuItem onClick={handleClose}>
<Button
color="inherit"
onClick={handleReadClick}
className={classes.moreItems}
startIcon={isRead ? <MarkunreadIcon /> : <CheckIcon />}
>
{isRead ? "Mark as unread" : "Mark as read"}
</Button>
</MenuItem>
<MenuItem onClick={handleClose}>
<Button
color="inherit"
onClick={handleDeleteClick}
className={classes.moreItems}
startIcon={<ClearIcon />}
>
Clear
</Button>
</MenuItem>
</Menu>
</div>
);
};

const Notification = ({
dispatch,
_id,
type,
date,
isRead,
content,
key,
onUpdateStatus,
}) => {
const classes = useStyles();

const [isExisting, setIsExisting] = useState(true);

const handleDeleteClick = () => {
dispatch(removeNotificationAsync(_id)).then(() => {
setIsExisting(false);
});
};

const getItemAvatar = (type) => {
if (type === "newOffering") {
return <LocalOfferIcon color="primary" />;
} else if (type === "offeringAccepted") {
return <CheckBoxIcon className={classes.acceptedIcon} />;
} else if (type === "offeringRejected") {
return <CancelIcon className={classes.rejectedIcon} />;
} else {
return <ErrorIcon />;
}
};

return isExisting ? (
<MenuItem selected={!isRead} divider={true} key={key}>
<ListItemAvatar>{getItemAvatar(type)}</ListItemAvatar>

<ListItemText
primary={content}
primaryTypographyProps={{
style: { whiteSpace: "normal", wordWrap: "break-word" },
}}
secondary={moment(date).format("MMMM Do YYYY, h:mm a")}
/>

<SeeMoreMenu
dispatch={dispatch}
handleDeleteClick={handleDeleteClick}
onUpdateStatus={onUpdateStatus}
_id={_id}
isRead={isRead}
className={classes.seeMoreMenu}
/>
</MenuItem>
) : null;
};

export default connect()(Notification);
Loading

0 comments on commit 9cd001a

Please sign in to comment.