import * as React from 'react'; import {useState} from 'react'; import Button from '@mui/material/Button'; import TextField from '@mui/material/TextField'; import Dialog from '@mui/material/Dialog'; import DialogContent from '@mui/material/DialogContent'; import DialogContentText from '@mui/material/DialogContentText'; import DialogTitle from '@mui/material/DialogTitle'; import {Alert, FormControl, Select, useMediaQuery} from "@mui/material"; import theme from "./theme"; import {validTopic} from "../app/utils"; import DialogFooter from "./DialogFooter"; import {useTranslation} from "react-i18next"; import session from "../app/Session"; import routes from "./routes"; import accountApi, {Permission} from "../app/AccountApi"; import ReserveTopicSelect from "./ReserveTopicSelect"; import MenuItem from "@mui/material/MenuItem"; import ListItemIcon from "@mui/material/ListItemIcon"; import ListItemText from "@mui/material/ListItemText"; import {Check, DeleteForever} from "@mui/icons-material"; import {TopicReservedError, UnauthorizedError} from "../app/errors"; export const ReserveAddDialog = (props) => { const { t } = useTranslation(); const [error, setError] = useState(""); const [topic, setTopic] = useState(props.topic || ""); const [everyone, setEveryone] = useState(Permission.DENY_ALL); const fullScreen = useMediaQuery(theme.breakpoints.down('sm')); const allowTopicEdit = !props.topic; const alreadyReserved = props.reservations.filter(r => r.topic === topic).length > 0; const submitButtonEnabled = validTopic(topic) && !alreadyReserved; const handleSubmit = async () => { try { await accountApi.upsertReservation(topic, everyone); console.debug(`[ReserveAddDialog] Added reservation for topic ${t}: ${everyone}`); } catch (e) { console.log(`[ReserveAddDialog] Error adding topic reservation.`, e); if (e instanceof UnauthorizedError) { session.resetAndRedirect(routes.login); } else if (e instanceof TopicReservedError) { setError(t("subscribe_dialog_error_topic_already_reserved")); return; } else { setError(e.message); return; } } props.onClose(); }; return ( {t("prefs_reservations_dialog_title_add")} {t("prefs_reservations_dialog_description")} {allowTopicEdit && setTopic(ev.target.value)} type="url" fullWidth variant="standard" />} ); }; export const ReserveEditDialog = (props) => { const { t } = useTranslation(); const [error, setError] = useState(""); const [everyone, setEveryone] = useState(props.reservation?.everyone || Permission.DENY_ALL); const fullScreen = useMediaQuery(theme.breakpoints.down('sm')); const handleSubmit = async () => { try { await accountApi.upsertReservation(props.reservation.topic, everyone); console.debug(`[ReserveEditDialog] Updated reservation for topic ${t}: ${everyone}`); } catch (e) { console.log(`[ReserveEditDialog] Error updating topic reservation.`, e); if (e instanceof UnauthorizedError) { session.resetAndRedirect(routes.login); } else { setError(e.message); return; } } props.onClose(); }; return ( {t("prefs_reservations_dialog_title_edit")} {t("prefs_reservations_dialog_description")} ); }; export const ReserveDeleteDialog = (props) => { const { t } = useTranslation(); const [error, setError] = useState(""); const [deleteMessages, setDeleteMessages] = useState(false); const fullScreen = useMediaQuery(theme.breakpoints.down('sm')); const handleSubmit = async () => { try { await accountApi.deleteReservation(props.topic, deleteMessages); console.debug(`[ReserveDeleteDialog] Deleted reservation for topic ${props.topic}`); } catch (e) { console.log(`[ReserveDeleteDialog] Error deleting topic reservation.`, e); if (e instanceof UnauthorizedError) { session.resetAndRedirect(routes.login); } else { setError(e.message); return; } } props.onClose(); }; return ( {t("prefs_reservations_dialog_title_delete")} {t("reservation_delete_dialog_description")} {!deleteMessages && {t("reservation_delete_dialog_action_keep_description")} } {deleteMessages && {t("reservation_delete_dialog_action_delete_description")} } ); };