import * as React from 'react'; import {useContext, useEffect, 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, Autocomplete, Checkbox, FormControl, FormControlLabel, FormGroup, Select, useMediaQuery } from "@mui/material"; import theme from "./theme"; import api from "../app/Api"; import {randomAlphanumericString, topicUrl, validTopic, validUrl} from "../app/utils"; import userManager from "../app/UserManager"; import subscriptionManager from "../app/SubscriptionManager"; import poller from "../app/Poller"; import DialogFooter from "./DialogFooter"; import {useTranslation} from "react-i18next"; import session from "../app/Session"; import routes from "./routes"; import accountApi, {Permission, Role, TopicReservedError, UnauthorizedError} from "../app/AccountApi"; import ReserveTopicSelect from "./ReserveTopicSelect"; import {AccountContext} from "./App"; import DialogActions from "@mui/material/DialogActions"; import MenuItem from "@mui/material/MenuItem"; import ListItemIcon from "@mui/material/ListItemIcon"; import {PermissionDenyAll, PermissionRead, PermissionReadWrite, PermissionWrite} from "./ReserveIcons"; import ListItemText from "@mui/material/ListItemText"; import {Check, DeleteForever} from "@mui/icons-material"; export const ReserveAddDialog = (props) => { const { t } = useTranslation(); const [topic, setTopic] = useState(props.topic || ""); const [everyone, setEveryone] = useState(Permission.DENY_ALL); const [errorText, setErrorText] = useState(""); 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)) { setErrorText(t("subscribe_dialog_error_topic_already_reserved")); return; } } props.onClose(); // FIXME handle 401/403/409 }; 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 [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); } } props.onClose(); // FIXME handle 401/403/409 }; return ( {t("prefs_reservations_dialog_title_edit")} {t("prefs_reservations_dialog_description")} ); }; export const ReserveDeleteDialog = (props) => { const { t } = useTranslation(); 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 ${t}`); } catch (e) { console.log(`[ReserveDeleteDialog] Error deleting topic reservation.`, e); if ((e instanceof UnauthorizedError)) { session.resetAndRedirect(routes.login); } } props.onClose(); // FIXME handle 401/403/409 }; 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")} } ); };