frontend/src/app/HeaderButtons.tsx
csawatzky 38e0bcb33c added notification drawer to the header
for the moment commented out the code to get the component icons and am just displaying the device icons until the component stuff is added to the new frontend
2025-01-20 14:58:36 -06:00

174 lines
No EOL
4.7 KiB
TypeScript

import { Chat as ChatIcon, Notifications } from "@mui/icons-material";
import { Box, IconButton, Theme, Tooltip } from "@mui/material";
import { makeStyles } from "@mui/styles";
import { ChatDrawer } from "chat/ChatDrawer";
import { Team, User } from "models";
import moment from "moment";
import { pond } from "protobuf-ts/pond";
import { useEffect, useState } from "react";
import { getSignatureAccentColour } from "services/whiteLabel";
import NotificationDrawer from "./NotificationDrawer";
const useStyles = makeStyles((theme: Theme) => ({
button: {
color: getSignatureAccentColour(),
width: theme.spacing(6),
height: theme.spacing(6),
marginTop: "auto",
marginBottom: "auto",
marginLeft: theme.spacing(0.5)
},
on: {
boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,
animationName: "$ripple",
animationDuration: "1.2s",
animationTimingFunction: "ease-in-out",
animationIterationCount: "infinite",
position: "absolute",
right: theme.spacing(0.5),
top: theme.spacing(0.5),
backgroundColor: theme.palette.primary.main
},
off: {
backgroundColor: "transparent"
},
drawerHeader: {
display: "flex",
alignItems: "center",
padding: theme.spacing(0, 1),
// necessary for content to be below app bar
...theme.mixins.toolbar,
justifyContent: "flex-start"
}
}))
interface Props {
hasTeams: boolean;
team: Team;
user: User
}
export default function HeaderButtons(props: Props) {
const {hasTeams, user, team} = props
const [hasNewChats, setHasNewChats] = useState(false);
const [hasNewNotifications, setHasNewNotifications] = useState(false);
const [chatDrawerOpen, setChatDrawerOpen] = useState(false);
const [notificationDrawerOpen, setNotificationDrawerOpen] = useState<boolean>(false);
const classes = useStyles();
useEffect(() => {
if (!team) return;
if (
team.preferences.chatViewedTimestamp.length < 1 &&
team.settings.lastChatTimestamp.length > 1
) {
setHasNewChats(true);
return;
}
let viewMoment = moment(team.preferences.chatViewedTimestamp);
let chatMoment = moment(team.settings.lastChatTimestamp);
if (viewMoment.diff(chatMoment) < 0) {
setHasNewChats(true);
} else {
setHasNewChats(false);
}
}, [team]);
useEffect(() => {
if (!user) return;
if (!user.status) return;
if (
user.status.lastNotificationViewed.length < 1 &&
user.status.lastNotifiedTimestamp.length > 1
) {
setHasNewNotifications(true);
return;
}
let viewMoment = moment(new Date(user.status.lastNotificationViewed));
let notiMoment = moment(new Date(user.status.lastNotifiedTimestamp));
if (viewMoment.diff(notiMoment) < 0) {
setHasNewNotifications(true);
} else {
setHasNewNotifications(false);
}
}, [user]);
// If the drawer has been opened, get rid of the ping
useEffect(() => {
if (notificationDrawerOpen) setHasNewNotifications(false);
}, [notificationDrawerOpen]);
const chatButton = () => {
if (!hasTeams) return;
if (team.key().length < 1) return
return (
<>
<Tooltip title="Team chat">
<IconButton
className={classes.button}
onClick={() => {
setChatDrawerOpen(true);
setHasNewChats(false);
}}>
<ChatIcon />
{hasNewChats && (
<Box
width="8px"
height="8px"
borderRadius="50%"
className={classes.on}
/>
)}
</IconButton>
</Tooltip>
</>
)
}
const notificationButton = () => {
if (!user.settings?.notificationMethods?.includes(
pond.NotificationMethod.NOTIFICATION_METHOD_APP
)) return
return (
<>
<Tooltip title="Notifications">
<IconButton
className={classes.button}
onClick={() => {
setNotificationDrawerOpen(true);
setHasNewChats(false);
}}>
<Notifications />
{hasNewNotifications && (
<Box
width="8px"
height="8px"
borderRadius="50%"
className={classes.on}
/>
)}
</IconButton>
</Tooltip>
</>
)
}
return (
<>
{chatButton()}
{team && team.settings && team.settings.key && (
<ChatDrawer
open={chatDrawerOpen}
onClose={() => setChatDrawerOpen(false)}
team={team}
/>
)}
{notificationButton()}
<NotificationDrawer
setNotificationDrawerOpen={setNotificationDrawerOpen}
notificationDrawerOpen={notificationDrawerOpen}
/>
</>
)
}