import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { useSelector } from "react-redux"; import Client, { ErrorInfo, Permission } from "../../../../classes/client"; import { activeInstance } from '../../../../redux/clientSlice'; import { SimpleDialogProps } from ".."; import BaseDialog from "../base-dialog"; import List from "@material-ui/core/List"; import ListItem from "@material-ui/core/ListItem"; import ListItemText from "@material-ui/core/ListItemText"; import IconButton from "@material-ui/core/IconButton"; import ListItemSecondaryAction from "@material-ui/core/ListItemSecondaryAction"; import DeleteIcon from '@material-ui/icons/Delete'; import Paper from "@material-ui/core/Paper"; import Select from "@material-ui/core/Select"; import MenuItem from "@material-ui/core/MenuItem"; import Button from "@material-ui/core/Button"; import TextField from "@material-ui/core/TextField"; import FormControlLabel from "@material-ui/core/FormControlLabel"; import Checkbox from "@material-ui/core/Checkbox"; import Typography from "@material-ui/core/Typography"; import { useStyles } from "./style"; import RoleIcon from "../../role-icon"; import Tooltip from "@material-ui/core/Tooltip"; type ShareModel = { emails: string, role: 'editor' | 'viewer', message: string } const defaultModel: ShareModel = { emails: '', role: 'editor', message: '' }; const ShareDialog = ({ mapId, onClose }: SimpleDialogProps): React.ReactElement => { const intl = useIntl(); const client: Client = useSelector(activeInstance); const queryClient = useQueryClient(); const classes = useStyles(); const [showMessage, setShowMessage] = React.useState(false); const [model, setModel] = React.useState(defaultModel); const [error, setError] = React.useState(); const deleteMutation = useMutation( (email: string) => { return client.deleteMapPermission(mapId, email); }, { onSuccess: () => { queryClient.invalidateQueries(`perm-${mapId}`); setModel(defaultModel); }, onError: (error: ErrorInfo) => { setError(error); } } ); const addMutation = useMutation( (model: ShareModel) => { const emails = model.emails.split("'"); const permissions = emails.map((email) => { return { email: email, role: model.role } }); return client.addMapPermissions(mapId, model.message, permissions); }, { onSuccess: () => { queryClient.invalidateQueries(`perm-${mapId}`); setModel(defaultModel); }, onError: (error: ErrorInfo) => { setError(error); } } ); const handleOnClose = (): void => { onClose(); }; const handleOnChange = (event: React.ChangeEvent): void => { event.preventDefault(); const name = event.target.name; const value = event.target.value; setModel({ ...model, [name as keyof ShareModel]: value }); } const handleOnAddClick = (event: React.MouseEvent): void => { event.stopPropagation(); addMutation.mutate(model); }; const handleOnDeleteClick = (event: React.MouseEvent, email: string): void => { event.stopPropagation(); deleteMutation.mutate(email); }; const { isLoading, data: permissions = [] } = useQuery(`perm-${mapId}`, () => { return client.fetchMapPermissions(mapId); }); return (
{ setShowMessage(value) }} style={{ fontSize: "5px" }} control={} label={} labelPlacement="end" /> {showMessage && }
{!isLoading && {permissions && permissions.map((permission) => { return ( `} /> < ListItemSecondaryAction > }> handleOnDeleteClick(e, permission.email)}> ); })} }
); } export default ShareDialog;