frontend/src/pages/Device.tsx

144 lines
No EOL
4.8 KiB
TypeScript

import { Grid2 } from "@mui/material";
import { Device, User } from "models";
import { getContextKeys, getContextTypes } from "pbHelpers/Context";
import { useDeviceAPI, useGlobalState, useSnackbar } from "providers";
import { useEffect, useState } from "react";
import { useLocation, useParams } from "react-router-dom";
import PageContainer from "./PageContainer";
import { useMobile } from "hooks";
import LoadingScreen from "app/LoadingScreen";
import SmartBreadcrumb from "common/SmartBreadcrumb";
import DeviceActions from "device/DeviceActions";
import { pond } from "protobuf-ts/pond";
import { cloneDeep } from "lodash";
import DeviceOverview from "device/DeviceOverview";
export default function DevicePage() {
const deviceAPI = useDeviceAPI()
const snackbar = useSnackbar()
const isMobile = useMobile()
const deviceID = useParams<{ deviceID: string }>()?.deviceID ?? "";
const { state } = useLocation();
const [{ as, team, user }] = useGlobalState()
const [device, setDevice] = useState<Device>(state?.device ? Device.create(state.device) : Device.create())
const [loading, setLoading] = useState(false)
const [permissions, setPermissions] = useState<pond.Permission[]>([])
const [preferences, setPreferences] = useState<pond.DevicePreferences>(pond.DevicePreferences.create())
const [cellularUsage, _setCellularUsage] = useState<number>(0);
const [cellularStatus, _setCellularStatus] = useState<string>("");
const loadDevice = () => {
if (loading) return
// if (state?.device && parseInt(state.device.settings.deviceId) === device.id()) return
// deviceAPI.get(deviceID, false, getContextKeys(), getContextTypes()).then(resp => {
// setDevice(Device.create(resp.data))
// console.log(resp.data)
// }).catch(() => {
// snackbar.error("Error loading device.")
// }).finally(() => {
// setLoading(false)
// })
setLoading(true)
deviceAPI.getPageData(deviceID, getContextKeys(), getContextTypes()).then(resp => {
setDevice(Device.any(resp.data.device))
let newPermissions: pond.Permission[] = []
resp.data.permissions.forEach(perm => {
if (typeof(perm) === "string" ) {
const permNumber = pond.Permission[perm as keyof typeof pond.Permission]
newPermissions.push(permNumber)
} else {
newPermissions.push(perm)
}
})
setPermissions(newPermissions)
let u = User.any(resp.data.user);
setPreferences(u.preferences)
}).catch(err => {
setDevice(Device.create());
// setComponents(new Map());
// setInteractions([]);
// setAvailablePositions(new Map());
setPermissions([]);
setPreferences(pond.UserPreferences.create());
// setInvalidDevice(true);
// error(err);
if (err?.response?.data?.error.includes("not found")) {
let name = as === team.key() ? team.name() : user.name();
let warningString = name + " not permitted to view Device " + deviceID;
let length = getContextTypes().length;
if (length > 0) {
warningString = warningString + " through " + getContextTypes()[length - 1];
}
snackbar.warning(warningString);
} else {
snackbar.error(err);
}
})
.finally(() => setLoading(false));
}
useEffect(() => {
console.log(permissions)
}, [permissions])
useEffect(() => {
loadDevice()
}, [deviceID])
const toggleNotificationPreference = () => {
let updatedPreferences = cloneDeep(preferences);
updatedPreferences.notify = !preferences.notify;
deviceAPI
.updatePreferences(deviceID, updatedPreferences, getContextKeys(), getContextTypes())
.then(() => setPreferences(updatedPreferences))
.catch(() => {
snackbar.error(
"Error occured while " +
(preferences.notify ? "enabling" : "disabling") +
" notifications"
);
});
};
if (loading) return (
<LoadingScreen message="Loading device"/>
)
const getUsage = () => {
let usage = undefined;
if (cellularStatus && cellularStatus !== "") {
usage = { status: cellularStatus, bytes: cellularUsage };
}
return usage;
};
return (
<PageContainer padding={isMobile ? 0 : 2}>
<Grid2 container justifyContent={"space-between"}>
<Grid2>
<SmartBreadcrumb />
</Grid2>
<Grid2>
<DeviceActions
device={device}
isPaused={false}
isLoading={loading}
permissions={permissions}
preferences={preferences}
toggleNotificationPreference={toggleNotificationPreference}
refreshCallback={loadDevice}
/>
</Grid2>
</Grid2>
<DeviceOverview
device={device}
// components={[...components.values()]}
components={[]}
usage={getUsage()}
loading={loading}
/>
</PageContainer>
);
}