frontend/app/needsupdate.tsx (103 lines of code) (raw):

import React from "react"; import { CompareVersionResult, compareVersionResults } from "./getbuilds"; import { IconButton, makeStyles, Tooltip } from "@material-ui/core"; import { Check, Compare, ErrorOutline, NotListedLocation, Update, Warning, WarningOutlined, } from "@material-ui/icons"; const Updates = { NotRequired: "not-required", Downgrade: "downgrade", Upgrade: "upgrade", }; type UpdateType = typeof Updates; interface NeedsUpdateProps { deployment: DeployedImageInfo; available: BuildInfo; updateRequested: (updateType: string) => void; } const useStyles = makeStyles((theme) => ({ ok: { color: theme.palette.success.dark, }, warning: { color: theme.palette.warning.dark, }, info: { color: theme.palette.info.dark, }, error: { color: theme.palette.error.dark, }, })); const NeedsUpdate: React.FC<NeedsUpdateProps> = (props) => { const classes = useStyles(); const updateNotRequired = () => { props.updateRequested(Updates.NotRequired); }; const downgradeRequested = () => { props.updateRequested(Updates.Downgrade); }; const updateRequested = () => { props.updateRequested(Updates.Upgrade); }; switch (compareVersionResults(props.deployment, props.available)) { case CompareVersionResult.SAME: return ( <Tooltip title="No update required"> <IconButton onClick={updateNotRequired}> <Check className={classes.ok} /> </IconButton> </Tooltip> ); case CompareVersionResult.DEPLOYMENT_AHEAD: return ( <Tooltip title="Deployed version is ahead of master"> <IconButton onClick={downgradeRequested}> <WarningOutlined className={classes.ok} /> </IconButton> </Tooltip> ); case CompareVersionResult.NEEDS_UPDATE: return ( <Tooltip title="Deployed version is behind master and should be updated"> <IconButton onClick={updateRequested}> <Warning className={classes.warning} /> </IconButton> </Tooltip> ); case CompareVersionResult.NON_NUMERIC: return ( <Tooltip title="Either the current version or the build is not on the version tree"> <IconButton onClick={updateRequested}> <NotListedLocation className={classes.info} /> </IconButton> </Tooltip> ); case CompareVersionResult.NOTHING_AVAILABLE: return ( <Tooltip title="The build image name does not match the deployed image. Something is misconfigured."> <IconButton onClick={updateNotRequired}> <ErrorOutline className={classes.error} /> </IconButton> </Tooltip> ); default: const weGot = compareVersionResults(props.deployment, props.available); console.log("Unexpected result from compare versions: ", weGot); return ( <Tooltip title="An internal error occurred, see the browser console for details"> <IconButton onClick={updateRequested}> <ErrorOutline className={classes.error} /> </IconButton> </Tooltip> ); } }; export { Updates }; export default NeedsUpdate;