diff --git a/site/src/api/api.ts b/site/src/api/api.ts index 1613a52384618..31a634997427d 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -1021,7 +1021,7 @@ export const getWorkspaceBuildParameters = async ( return response.data } type Claims = { - license_expires?: jwt.NumericDate + license_expires?: number account_type?: string account_id?: string trial: boolean diff --git a/site/src/pages/TerminalPage/TerminalPage.tsx b/site/src/pages/TerminalPage/TerminalPage.tsx index 183b9405c99a0..7bef86379e145 100644 --- a/site/src/pages/TerminalPage/TerminalPage.tsx +++ b/site/src/pages/TerminalPage/TerminalPage.tsx @@ -1,4 +1,7 @@ +import Button from "@material-ui/core/Button" import { makeStyles } from "@material-ui/core/styles" +import WarningIcon from "@material-ui/icons/ErrorOutlineRounded" +import RefreshOutlined from "@material-ui/icons/RefreshOutlined" import { useMachine } from "@xstate/react" import { portForwardURL } from "components/PortForwardButton/PortForwardButton" import { Stack } from "components/Stack/Stack" @@ -15,6 +18,7 @@ import { MONOSPACE_FONT_FAMILY } from "../../theme/constants" import { pageTitle } from "../../utils/page" import { terminalMachine } from "../../xServices/terminal/terminalXService" import { useProxy } from "contexts/ProxyContext" +import { combineClasses } from "utils/combineClasses" export const Language = { workspaceErrorMessagePrefix: "Unable to fetch workspace: ", @@ -22,34 +26,6 @@ export const Language = { websocketErrorMessagePrefix: "WebSocket failed: ", } -const useReloading = (isDisconnected: boolean) => { - const [status, setStatus] = useState<"reloading" | "notReloading">( - "notReloading", - ) - - // Retry connection on key press when it is disconnected - useEffect(() => { - if (!isDisconnected) { - return - } - - const keyDownHandler = () => { - setStatus("reloading") - window.location.reload() - } - - document.addEventListener("keydown", keyDownHandler) - - return () => { - document.removeEventListener("keydown", keyDownHandler) - } - }, [isDisconnected]) - - return { - status, - } -} - const TerminalPage: FC< React.PropsWithChildren<{ readonly renderer?: XTerm.RendererType @@ -102,6 +78,12 @@ const TerminalPage: FC< websocketError, } = terminalState.context const reloading = useReloading(isDisconnected) + const shouldDisplayStartupWarning = workspaceAgent + ? ["starting", "starting_timeout"].includes(workspaceAgent.lifecycle_state) + : false + const shouldDisplayStartupError = workspaceAgent + ? workspaceAgent.lifecycle_state === "start_error" + : false // handleWebLink handles opening of URLs in the terminal! const handleWebLink = useCallback( @@ -316,12 +298,80 @@ const TerminalPage: FC< )} + {shouldDisplayStartupError && ( +