import { IconButton, ListItemIcon, ListItemText, Menu, MenuItem, Theme, Tooltip } from "@mui/material"; import { blue } from "@mui/material/colors"; import RemoveSelfIcon from "@mui/icons-material/ExitToApp"; import MoreIcon from "@mui/icons-material/MoreVert"; import GroupSettingsIcon from "@mui/icons-material/Settings"; import ShareObjectIcon from "@mui/icons-material/Share"; //import SensorIcon from "@material-ui/icons/Sensor"; import SensorIcon from "@mui/icons-material/SettingsInputAntenna"; import ObjectUsersIcon from "@mui/icons-material/AccountCircle"; import ObjectTeamsIcon from "@mui/icons-material/SupervisedUserCircle"; import BinSettings from "bin/BinSettings"; import { Bin, binScope, Component, User } from "models"; import { pond } from "protobuf-ts/pond"; import React, { useState } from "react"; import ObjectUsers from "user/ObjectUsers"; import RemoveSelfFromObject from "user/RemoveSelfFromObject"; import ShareObject from "user/ShareObject"; import { isOffline } from "utils/environment"; import ObjectTeams from "teams/ObjectTeams"; // import BinDuplication from "./BinDuplication"; import BinsIcon from "products/Bindapt/BinsIcon"; import HelpIcon from "@mui/icons-material/Help"; import BinSensors from "./BinSensors"; import { useGlobalState, useSnackbar, useUserAPI } from "providers"; import { useMobile } from "hooks"; import { makeStyles } from "@mui/styles"; const useStyles = makeStyles((theme: Theme) => { return ({ shareIcon: { color: blue["500"], "&:hover": { color: blue["600"] } }, removeIcon: { color: "var(--status-alert)" }, red: { color: "var(--status-alert)" } }); }); interface Props { bin: Bin; permissions: pond.Permission[]; refreshCallback: () => void; userID: string; components?: Map; setComponents?: React.Dispatch>>; updateBinStatus?: (componentKeys: string[], removed?: boolean) => void; } interface OpenState { share: boolean; users: boolean; teams: boolean; settings: boolean; sensors: boolean; removeSelf: boolean; duplication: boolean; } export default function BinActions(props: Props) { const classes = useStyles(); const { bin, permissions, refreshCallback, userID, components, setComponents, updateBinStatus } = props; const [anchorEl, setAnchorEl] = React.useState(null); const [{ user }, dispatch] = useGlobalState(); const isMobile = useMobile(); const { error } = useSnackbar(); const userAPI = useUserAPI(); const [openState, setOpenState] = useState({ share: false, users: false, teams: false, settings: false, sensors: false, removeSelf: false, duplication: false }); const startTour = () => { if (user) { let u = user.protobuf(); if (u.status) { u.status.finishedBinIntro = ""; userAPI .updateUser(userID, u) .then(() => { dispatch({ key: "user", value: User.any(u) }); }) .catch((err: any) => error(err)); } } }; const groupMenu = () => { const canShare = permissions.includes(pond.Permission.PERMISSION_SHARE); const canManageUsers = permissions.includes(pond.Permission.PERMISSION_USERS); return ( setAnchorEl(null)} keepMounted disableAutoFocusItem> {!isOffline() && canShare && ( { setOpenState({ ...openState, share: true }); setAnchorEl(null); }} > )} {!isOffline() && canManageUsers && ( { setOpenState({ ...openState, users: true }); setAnchorEl(null); }} > )} {!isOffline() && canManageUsers && ( { setOpenState({ ...openState, teams: true }); setAnchorEl(null); }} > )} { setOpenState({ ...openState, duplication: true }); setAnchorEl(null); }} > {isMobile && ( { setAnchorEl(null); startTour(); }} > )} {isMobile && ( { setAnchorEl(null); setOpenState({ ...openState, sensors: true }); }} > )} { setOpenState({ ...openState, removeSelf: true }); setAnchorEl(null); }} > ); }; const dialogs = () => { const hasWritePermission = permissions.includes(pond.Permission.PERMISSION_WRITE); const key = bin.key(); const label = bin.name(); return ( { if (refresh === true) { refreshCallback(); } setOpenState({ ...openState, settings: false }); }} /> { if (refresh === true) { refreshCallback(); } setOpenState({ ...openState, sensors: false }); }} /> setOpenState({ ...openState, share: false })} /> setOpenState({ ...openState, users: false })} refreshCallback={refreshCallback} /> {/* { setOpenState({ ...openState, duplication: false }); }} bin={bin} refreshCallback={refreshCallback} /> */} setOpenState({ ...openState, removeSelf: false })} /> ); }; return ( {!isMobile && ( )} {!isMobile && ( setOpenState({ ...openState, sensors: true })}> )} setOpenState({ ...openState, settings: true })}> ) => setAnchorEl(event.currentTarget)}> {groupMenu()} {dialogs()} setOpenState({ ...openState, teams: false })} /> ); }