import { Divider, IconButton, ListItemIcon, ListItemText, Menu, MenuItem, Theme, Tooltip } from "@mui/material"; // import { amber, blue, green } from "@mui/co"; import { AddCircle as AddIcon, ExitToApp as RemoveSelfIcon, History as HistoryIcon, MoreVert as MoreIcon, PauseCircleFilled, PlayCircleFilled, Reorder as ComponentOrderIcon, Save as SaveDeviceProfileIcon, SaveAlt as LoadDeviceProfileIcon, Settings as DeviceSettingsIcon, Share as ShareObjectIcon, AccountCircle as ObjectUsersIcon, SupervisedUserCircle as ObjectTeamsIcon, Sync as SyncDeviceIcon, Wifi as WifiIcon, Visibility } from "@mui/icons-material"; import { Skeleton } from "@mui/material"; // import Datadog from "assets/external/datadog.png"; // import { ImgIcon } from "common/ImgIcon"; import NotificationButton from "common/NotificationButton"; // import ComponentOrder from "component/ComponentOrder"; // import ComponentSettings from "component/ComponentSettings"; // import DeviceSettings from "device/DeviceSettings"; // import LoadDeviceProfile from "device/LoadDeviceProfile"; import { PauseData } from "device/PauseData"; import { ResumeData } from "device/ResumeData"; // import SaveDeviceProfile from "device/SaveDeviceProfile"; import SyncDevice from "device/SyncDevice"; // import UpgradeDevice from "device/UpgradeDevice"; // import InteractionSettings from "interactions/InteractionSettings"; import { cloneDeep } from "lodash"; // import { Component, Device, deviceScope, Interaction } from "models"; import { Component, Device, deviceScope, Interaction } from "models"; // import { MatchParams } from "navigation/Routes"; // import { isShareableLink } from "pbHelpers/Device"; import { pond } from "protobuf-ts/pond"; import { useGlobalState } from "providers"; import React, { useEffect, useState } from "react"; // import { useHistory, useRouteMatch } from "react-router"; import { isOffline } from "utils/environment"; import { or } from "utils/types"; import ObjectUsers from "user/ObjectUsers"; import RemoveSelfFromObject from "user/RemoveSelfFromObject"; import ShareObject from "user/ShareObject"; // import Connection from "./Connection"; // import ObjectTeams from "teams/ObjectTeams"; // import ArcGISDeviceData from "./ArcGISDeviceData"; import { DeviceAvailabilityMap, OffsetAvailabilityMap } from "pbHelpers/DeviceAvailability"; import { amber, blue, green } from "@mui/material/colors"; import { makeStyles } from "@mui/styles"; import { useNavigate } from "react-router-dom"; import DeviceSettings from "device/DeviceSettings"; import ObjectTeams from "teams/ObjectTeams"; import ComponentSettings from "component/ComponentSettings"; import LoadDeviceProfile from "./LoadDeviceProfile"; import InteractionSettings from "interactions/InteractionSettings"; import SaveDeviceProfile from "./SaveDeviceProfile"; import Connection from "./Connection"; import ComponentOrder from "component/ComponentOrder"; import ArcGISDeviceData from "./ArcGISDeviceData"; import UpgradeDevice from "./UpgradeDevice"; import { DevicePageData } from "pages/Device"; import { quack } from "protobuf-ts/quack"; const useStyles = makeStyles((_theme: Theme) => { // const isMobile = useMobile() return ({ greenIcon: { color: green["500"], "&:hover": { color: green["600"] } }, amberIcon: { color: amber["600"], "&:hover": { color: amber["700"] } }, blueIcon: { color: blue["500"], "&:hover": { color: blue["600"] } }, red: { color: "var(--status-alert)" } }); }); interface Props { device: Device; isPaused: boolean; components: Component[]; interactions: Interaction[]; refreshCallback: () => void; availablePositions: DeviceAvailabilityMap; availableOffsets: OffsetAvailabilityMap; permissions: Array; preferences: pond.DevicePreferences; isLoading: boolean; toggleNotificationPreference: Function; } interface DialogState { isAddComponentDialogOpen: boolean; isDeviceSettingsDialogOpen: boolean; isShareObjectDialogOpen: boolean; isSyncDeviceDialogOpen: boolean; isPauseDialogOpen: boolean; isResumeDialogOpen: boolean; isInteractionSettingsOpen: boolean; isObjectUsersDialogOpen: boolean; isObjectTeamsDialogOpen: boolean; isRemoveSelfDialogOpen: boolean; isSaveDeviceProfileOpen: boolean; isLoadDeviceProfileOpen: boolean; isConnectionDialogOpen: boolean; isComponentOrderDialogOpen: boolean; isJsonDataDialogOpen: boolean; } export default function DeviceActions(props: Props) { const { device, isPaused, components, interactions, refreshCallback, availablePositions, availableOffsets, permissions, preferences, isLoading, toggleNotificationPreference } = props; const classes = useStyles(); const [{ user }] = useGlobalState(); const canWrite = permissions.includes(pond.Permission.PERMISSION_WRITE); const navigate = useNavigate(); // const match = useRouteMatch(); const [menuAnchorEl, setMenuAnchorEl] = useState(null); const [dialogState, setDialogState] = useState({ isAddComponentDialogOpen: false, isDeviceSettingsDialogOpen: false, isShareObjectDialogOpen: false, isSyncDeviceDialogOpen: false, isPauseDialogOpen: false, isResumeDialogOpen: false, isInteractionSettingsOpen: false, isObjectUsersDialogOpen: false, isObjectTeamsDialogOpen: false, isRemoveSelfDialogOpen: false, isSaveDeviceProfileOpen: false, isLoadDeviceProfileOpen: false, isConnectionDialogOpen: false, isComponentOrderDialogOpen: false, isJsonDataDialogOpen: false }); const [devicePageData, setDevicePageData] = useState(undefined); useEffect(() => { let newPageData: DevicePageData = { device: device, components: components, interactions: interactions, preferences: preferences, permissions: permissions, } setDevicePageData(newPageData) }, [device, components, interactions, preferences, permissions]) const openDialog = (target: keyof DialogState) => { let updatedDialogState = cloneDeep(dialogState); updatedDialogState[target] = true; setDialogState(updatedDialogState); setMenuAnchorEl(null); }; const closeDialog = (target: keyof DialogState) => { let updatedDialogState = cloneDeep(dialogState); updatedDialogState[target] = false; setDialogState(updatedDialogState); }; const closeAndRefresh = (target: keyof DialogState) => (refresh: boolean) => { closeDialog(target); if (refresh) props.refreshCallback(); }; const deviceMenu = () => { const canShare = permissions.includes(pond.Permission.PERMISSION_SHARE); const canManageUsers = permissions.includes(pond.Permission.PERMISSION_USERS); const canProvision = user.allowedTo("provision"); const isCellular = device.settings.platform === pond.DevicePlatform.DEVICE_PLATFORM_ELECTRON; const canPause = canWrite && isCellular && user.allowedTo("pause-data"); const isWifi = device.settings.platform === pond.DevicePlatform.DEVICE_PLATFORM_PHOTON; // const isShareLink = isShareableLink(match.params.deviceID); const isShareLink = false const isV2 = device.settings.platform >= pond.DevicePlatform.DEVICE_PLATFORM_V2_CELLULAR return ( setMenuAnchorEl(null)} disableAutoFocusItem> {canWrite && ( { openDialog("isAddComponentDialogOpen"); }} dense> )} {canWrite && ( openDialog("isInteractionSettingsOpen")} dense> )} {canWrite && } {!isOffline() && canShare && ( openDialog("isShareObjectDialogOpen")} dense> )} {canWrite && user.hasAdmin() && ( openDialog("isSyncDeviceDialogOpen")} dense> )} {user.hasFeature("json") && ( openDialog("isJsonDataDialogOpen")} dense> )} openDialog("isComponentOrderDialogOpen")} dense> {canPause && !isPaused && ( openDialog("isPauseDialogOpen")} dense> )} {canPause && isPaused && ( openDialog("isResumeDialogOpen")} dense> )} {(isWifi || isV2) && canWrite && ( openDialog("isConnectionDialogOpen")} dense> )} {(canPause || (isWifi && canWrite)) && } {canProvision && ( openDialog("isSaveDeviceProfileOpen")} dense> )} {canProvision && ( openDialog("isLoadDeviceProfileOpen")} dense> )} {canProvision && } {!isOffline() && canManageUsers && ( openDialog("isObjectUsersDialogOpen")} dense> )} {!isOffline() && canManageUsers && ( openDialog("isObjectTeamsDialogOpen")} dense> )} { // const groupID: number = parseInt(match.params.groupID, 10); // const groupPath: string = groupID > 0 ? "/groups/" + groupID.toString() : ""; const devicePath: string = "/devices/" + device.id().toString(); // let path = groupPath + devicePath + "/history"; let path = devicePath + "/history"; navigate(path); }} dense> {/* {canProvision && ( { window.open( "https://app.datadoghq.com/logs?cols=core_host%2Ccore_service&index=main&live=true&messageDisplay=inline&stream_sort=desc&query=%40device%3A" + device.id(), "_blank" ); }} dense> )} */} {!isShareLink && ( openDialog("isRemoveSelfDialogOpen")} dense> )} ); }; const dialogs = () => { const deviceName = device.name(); const { isAddComponentDialogOpen, isDeviceSettingsDialogOpen, isShareObjectDialogOpen, isSyncDeviceDialogOpen, isPauseDialogOpen, isResumeDialogOpen, isInteractionSettingsOpen, isObjectUsersDialogOpen, isObjectTeamsDialogOpen, isRemoveSelfDialogOpen, isSaveDeviceProfileOpen, isLoadDeviceProfileOpen, isConnectionDialogOpen, isComponentOrderDialogOpen, isJsonDataDialogOpen } = dialogState; return ( closeDialog("isDeviceSettingsDialogOpen")} refreshCallback={refreshCallback} canEdit={canWrite} components={components} //components={[]} /> closeDialog("isAddComponentDialogOpen")} availablePositions={availablePositions} availableOffsets={availableOffsets} refreshCallback={refreshCallback} canEdit={canWrite} /> closeDialog("isSyncDeviceDialogOpen")} refreshCallback={refreshCallback} /> closeDialog("isShareObjectDialogOpen")} /> closeDialog("isInteractionSettingsOpen")} refreshCallback={refreshCallback} canEdit={canWrite} /> closeDialog("isObjectUsersDialogOpen")} refreshCallback={refreshCallback} /> closeDialog("isObjectTeamsDialogOpen")} refreshCallback={refreshCallback} /> closeDialog("isRemoveSelfDialogOpen")} /> closeDialog("isSaveDeviceProfileOpen")} device={device} components={components} interactions={interactions} tagIds={device.status.tagKeys} refreshCallback={refreshCallback} /> closeDialog("isLoadDeviceProfileOpen")} device={device} refreshCallback={refreshCallback} /> ); }; const showSupport = () => { return user.hasAdmin() && !location.pathname.includes("support") } const buttons = () => { return ( {showSupport() && navigate("support", { state: {device: device, devicePageData: devicePageData }})}> } {canWrite && user.hasAdmin() && } {/* {!isShareableLink(match.params.deviceID) && ( */} ); }; if (isLoading) return ( ); return ( {buttons()} {deviceMenu()} {dialogs()} ); }