import * as React from "react"; import { useState } from "react"; import { Button, TextField, Dialog, DialogContent, DialogContentText, DialogTitle, Alert, FormControl, Select, useMediaQuery, MenuItem, ListItemIcon, ListItemText, } from "@mui/material"; import { useTranslation } from "react-i18next"; import { Check, DeleteForever } from "@mui/icons-material"; import theme from "./theme"; import { validTopic } from "../app/utils"; import DialogFooter from "./DialogFooter"; import session from "../app/Session"; import routes from "./routes"; import accountApi, { Permission } from "../app/AccountApi"; import ReserveTopicSelect from "./ReserveTopicSelect"; 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 ${topic}: ${everyone}`); } catch (e) { console.log(`[ReserveAddDialog] Error adding topic reservation.`, e); if (e instanceof UnauthorizedError) { await 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) { await 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) { await 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")} )} ); };