1
0
Fork 0
mirror of https://github.com/binwiederhier/ntfy.git synced 2024-08-24 20:13:51 +02:00
ntfy/web/src/components/SubscriptionSettings.js

118 lines
4 KiB
JavaScript
Raw Normal View History

2022-02-21 22:24:13 +01:00
import * as React from 'react';
import {useEffect, useRef, useState} from 'react';
import ClickAwayListener from '@mui/material/ClickAwayListener';
import Grow from '@mui/material/Grow';
import Paper from '@mui/material/Paper';
import Popper from '@mui/material/Popper';
import MenuItem from '@mui/material/MenuItem';
import MenuList from '@mui/material/MenuList';
import IconButton from "@mui/material/IconButton";
import MoreVertIcon from "@mui/icons-material/MoreVert";
import api from "../app/Api";
2022-02-21 22:24:13 +01:00
// Originally from https://mui.com/components/menus/#MenuListComposition.js
2022-02-24 20:53:45 +01:00
const SubscriptionSettings = (props) => {
2022-02-21 22:24:13 +01:00
const [open, setOpen] = useState(false);
const anchorRef = useRef(null);
const handleToggle = () => {
setOpen((prevOpen) => !prevOpen);
};
const handleClose = (event) => {
if (anchorRef.current && anchorRef.current.contains(event.target)) {
return;
}
setOpen(false);
2022-02-23 05:22:30 +01:00
};
2022-02-24 18:26:07 +01:00
const handleClearAll = (event) => {
handleClose(event);
props.onClearAll(props.subscription.id);
};
2022-02-23 05:22:30 +01:00
const handleUnsubscribe = (event) => {
handleClose(event);
props.onUnsubscribe(props.subscription.id);
2022-02-21 22:24:13 +01:00
};
2022-02-23 05:22:30 +01:00
const handleSendTestMessage = () => {
const baseUrl = props.subscription.baseUrl;
const topic = props.subscription.topic;
2022-02-24 20:53:45 +01:00
api.publish(baseUrl, topic, `This is a test notification sent by the ntfy Web UI at ${new Date().toString()}.`); // FIXME result ignored
2022-02-23 05:22:30 +01:00
setOpen(false);
}
2022-02-21 22:24:13 +01:00
function handleListKeyDown(event) {
if (event.key === 'Tab') {
event.preventDefault();
setOpen(false);
} else if (event.key === 'Escape') {
setOpen(false);
}
}
// return focus to the button when we transitioned from !open -> open
const prevOpen = useRef(open);
useEffect(() => {
if (prevOpen.current === true && open === false) {
anchorRef.current.focus();
}
prevOpen.current = open;
}, [open]);
return (
<>
<IconButton
color="inherit"
size="large"
edge="end"
ref={anchorRef}
id="composition-button"
aria-controls={open ? 'composition-menu' : undefined}
aria-expanded={open ? 'true' : undefined}
aria-haspopup="true"
onClick={handleToggle}
>
<MoreVertIcon/>
</IconButton>
<Popper
open={open}
anchorEl={anchorRef.current}
role={undefined}
placement="bottom-start"
transition
disablePortal
>
{({TransitionProps, placement}) => (
<Grow
{...TransitionProps}
style={{
transformOrigin:
placement === 'bottom-start' ? 'left top' : 'left bottom',
}}
>
<Paper>
<ClickAwayListener onClickAway={handleClose}>
<MenuList
autoFocusItem={open}
id="composition-menu"
aria-labelledby="composition-button"
onKeyDown={handleListKeyDown}
>
2022-02-23 05:22:30 +01:00
<MenuItem onClick={handleSendTestMessage}>Send test notification</MenuItem>
2022-02-24 18:26:07 +01:00
<MenuItem onClick={handleClearAll}>Clear all notifications</MenuItem>
2022-02-23 05:22:30 +01:00
<MenuItem onClick={handleUnsubscribe}>Unsubscribe</MenuItem>
2022-02-21 22:24:13 +01:00
</MenuList>
</ClickAwayListener>
</Paper>
</Grow>
)}
</Popper>
</>
);
}
2022-02-24 20:53:45 +01:00
export default SubscriptionSettings;