import { mdiFolderUploadOutline } from "@mdi/js"; import Icon from "@mdi/react"; import DeleteIcon from "@mui/icons-material/Delete"; import DownloadIcon from "@mui/icons-material/Download"; import FileUploadIcon from "@mui/icons-material/FileUpload"; import RefreshIcon from "@mui/icons-material/Refresh"; import { IconButton, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Tooltip, } from "@mui/material"; import { filesize } from "filesize"; import React from "react"; import { OTAAPI, OTAUpdate } from "../api/OTAApi"; import { DeployOTAUpdateDialogProvider } from "../dialogs/DeployOTAUpdateDialogProvider"; import { UploadUpdateDialog } from "../dialogs/UploadUpdateDialog"; import { useAlert } from "../hooks/context_providers/AlertDialogProvider"; import { useConfirm } from "../hooks/context_providers/ConfirmDialogProvider"; import { useLoadingMessage } from "../hooks/context_providers/LoadingMessageProvider"; import { useSnackbar } from "../hooks/context_providers/SnackbarProvider"; import { AsyncWidget } from "../widgets/AsyncWidget"; import { RouterLink } from "../widgets/RouterLink"; import { SolarEnergyRouteContainer } from "../widgets/SolarEnergyRouteContainer"; export function OTARoute(): React.ReactElement { const [list, setList] = React.useState(); const load = async () => { setList(await OTAAPI.SupportedPlatforms()); }; return ( <_OTARoute platforms={list!} />} /> ); } function _OTARoute(p: { platforms: Array }): React.ReactElement { const key = React.useRef(1); const [showUploadDialog, setShowUploadDialog] = React.useState(false); const [list, setList] = React.useState(); const load = async () => { const list = await OTAAPI.ListOTAUpdates(); list.sort((a, b) => `${a.platform}#${a.version}`.localeCompare(`${b.platform}#${b.version}`) ); list.reverse(); setList(list); }; const reload = async () => { key.current += 1; setList(undefined); }; return ( setShowUploadDialog(true)}> } > {showUploadDialog && ( setShowUploadDialog(false)} onCreated={() => { setShowUploadDialog(false); reload(); }} /> )} <_OTAList list={list!} onReload={reload} />} /> ); } function _OTAList(p: { list: OTAUpdate[]; onReload: () => void; }): React.ReactElement { const alert = useAlert(); const confirm = useConfirm(); const loadingMessage = useLoadingMessage(); const snackbar = useSnackbar(); const [deployUpdate, setDeployUpdate] = React.useState< OTAUpdate | undefined >(); const deleteUpdate = async (update: OTAUpdate) => { if ( !(await confirm( `Do you really want to delete the update for platform ${update.platform} version ${update.version}?` )) ) return; try { loadingMessage.show("Deleting update..."); await OTAAPI.DeleteUpdate(update); snackbar("The update was successfully deleted!"); p.onReload(); } catch (e) { console.error("Failed to delete update!", e); alert(`Failed to delete the update! ${e}`); } finally { loadingMessage.hide(); } }; return ( <> {deployUpdate && ( setDeployUpdate(undefined)} /> )} Platform Version File size {p.list.map((row, num) => ( {row.platform} {row.version} {filesize(row.file_size)} setDeployUpdate(row)}> deleteUpdate(row)}> ))}
); }