Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d225f2c

Browse files
feat: Display warning on agent connection timeout (#4983)
1 parent 16e9b1e commit d225f2c

File tree

6 files changed

+100
-13
lines changed

6 files changed

+100
-13
lines changed

site/src/components/Resources/AgentRow.stories.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
MockWorkspace,
44
MockWorkspaceAgent,
55
MockWorkspaceAgentConnecting,
6+
MockWorkspaceAgentTimeout,
67
MockWorkspaceApp,
78
} from "testHelpers/entities"
89
import { AgentRow, AgentRowProps } from "./AgentRow"
@@ -67,3 +68,11 @@ Connecting.args = {
6768
applicationsHost: "",
6869
showApps: true,
6970
}
71+
72+
export const Timeout = Template.bind({})
73+
Timeout.args = {
74+
agent: MockWorkspaceAgentTimeout,
75+
workspace: MockWorkspace,
76+
applicationsHost: "",
77+
showApps: true,
78+
}

site/src/components/Resources/AgentRow.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { AgentVersion } from "./AgentVersion"
1212
import { Maybe } from "components/Conditionals/Maybe"
1313
import { AgentStatus } from "./AgentStatus"
1414
import { AppLinkSkeleton } from "components/AppLink/AppLinkSkeleton"
15+
import { useTranslation } from "react-i18next"
1516

1617
export interface AgentRowProps {
1718
agent: WorkspaceAgent
@@ -31,6 +32,7 @@ export const AgentRow: FC<AgentRowProps> = ({
3132
serverVersion,
3233
}) => {
3334
const styles = useStyles()
35+
const { t } = useTranslation("agent")
3436

3537
return (
3638
<Stack
@@ -43,7 +45,7 @@ export const AgentRow: FC<AgentRowProps> = ({
4345
>
4446
<Stack direction="row" alignItems="baseline">
4547
<div className={styles.agentStatusWrapper}>
46-
<AgentStatus agent={agent} />
48+
<AgentStatus agent={agent} workspace={workspace} />
4749
</div>
4850
<div>
4951
<div className={styles.agentName}>{agent.name}</div>
@@ -65,6 +67,10 @@ export const AgentRow: FC<AgentRowProps> = ({
6567
<Skeleton width={160} variant="text" />
6668
<Skeleton width={36} variant="text" />
6769
</Maybe>
70+
71+
<Maybe condition={agent.status === "timeout"}>
72+
{t("unableToConnect")}
73+
</Maybe>
6874
</Stack>
6975
</div>
7076
</Stack>

site/src/components/Resources/AgentStatus.tsx

Lines changed: 71 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
11
import Tooltip from "@material-ui/core/Tooltip"
22
import { makeStyles } from "@material-ui/core/styles"
33
import { combineClasses } from "util/combineClasses"
4-
import { WorkspaceAgent } from "api/typesGenerated"
4+
import { Workspace, WorkspaceAgent } from "api/typesGenerated"
55
import { ChooseOne, Cond } from "components/Conditionals/ChooseOne"
66
import { useTranslation } from "react-i18next"
7+
import WarningRounded from "@material-ui/icons/WarningRounded"
8+
import {
9+
HelpPopover,
10+
HelpTooltipText,
11+
HelpTooltipTitle,
12+
} from "components/Tooltips/HelpTooltip"
13+
import { useRef, useState } from "react"
14+
import Link from "@material-ui/core/Link"
715

816
const ConnectedStatus: React.FC = () => {
917
const styles = useStyles()
1018
const { t } = useTranslation("workspacePage")
1119

1220
return (
13-
<Tooltip title={t("agentStatus.connected")}>
14-
<div
15-
role="status"
16-
aria-label={t("agentStatus.connected")}
17-
className={combineClasses([styles.status, styles.connected])}
18-
/>
19-
</Tooltip>
21+
<div
22+
role="status"
23+
aria-label={t("agentStatus.connected")}
24+
className={combineClasses([styles.status, styles.connected])}
25+
/>
2026
)
2127
}
2228

@@ -50,7 +56,52 @@ const ConnectingStatus: React.FC = () => {
5056
)
5157
}
5258

53-
export const AgentStatus: React.FC<{ agent: WorkspaceAgent }> = ({ agent }) => {
59+
const TimeoutStatus: React.FC<{
60+
agent: WorkspaceAgent
61+
workspace: Workspace
62+
}> = ({ agent, workspace }) => {
63+
const { t } = useTranslation("agent")
64+
const styles = useStyles()
65+
const anchorRef = useRef<SVGSVGElement>(null)
66+
const [isOpen, setIsOpen] = useState(false)
67+
const id = isOpen ? "timeout-popover" : undefined
68+
const troubleshootLink =
69+
agent.troubleshooting_url ?? `/templates/${workspace.template_name}#readme`
70+
71+
return (
72+
<>
73+
<WarningRounded
74+
ref={anchorRef}
75+
onMouseEnter={() => setIsOpen(true)}
76+
onMouseLeave={() => setIsOpen(false)}
77+
role="status"
78+
aria-label={t("status.timeout")}
79+
className={styles.timeoutWarning}
80+
/>
81+
<HelpPopover
82+
id={id}
83+
open={isOpen}
84+
anchorEl={anchorRef.current}
85+
onOpen={() => setIsOpen(true)}
86+
onClose={() => setIsOpen(false)}
87+
>
88+
<HelpTooltipTitle>{t("timeoutTooltip.title")}</HelpTooltipTitle>
89+
<HelpTooltipText>
90+
{t("timeoutTooltip.message")}{" "}
91+
<Link target="_blank" rel="noreferrer" href={troubleshootLink}>
92+
{t("timeoutTooltip.link")}
93+
</Link>
94+
.
95+
</HelpTooltipText>
96+
</HelpPopover>
97+
</>
98+
)
99+
}
100+
101+
export const AgentStatus: React.FC<{
102+
agent: WorkspaceAgent
103+
workspace: Workspace
104+
}> = ({ agent, workspace }) => {
54105
return (
55106
<ChooseOne>
56107
<Cond condition={agent.status === "connected"}>
@@ -59,6 +110,9 @@ export const AgentStatus: React.FC<{ agent: WorkspaceAgent }> = ({ agent }) => {
59110
<Cond condition={agent.status === "disconnected"}>
60111
<DisconnectedStatus />
61112
</Cond>
113+
<Cond condition={agent.status === "timeout"}>
114+
<TimeoutStatus agent={agent} workspace={workspace} />
115+
</Cond>
62116
<Cond>
63117
<ConnectingStatus />
64118
</Cond>
@@ -98,4 +152,12 @@ const useStyles = makeStyles((theme) => ({
98152
backgroundColor: theme.palette.info.light,
99153
animation: "$pulse 1.5s 0.5s ease-in-out forwards infinite",
100154
},
155+
156+
timeoutWarning: {
157+
color: theme.palette.warning.light,
158+
width: theme.spacing(2.5),
159+
height: theme.spacing(2.5),
160+
position: "relative",
161+
top: theme.spacing(1),
162+
},
101163
}))

site/src/i18n/en/agent.json

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,14 @@
99
"os": "OS",
1010
"apps": "Apps",
1111
"noApps": "None"
12-
}
12+
},
13+
"status": {
14+
"timeout": "Timeout"
15+
},
16+
"timeoutTooltip": {
17+
"title": "Agent is taking too long to connect",
18+
"message": "We noticed this agent is taking longer than expected to connect. You can try troubleshooting the issue",
19+
"link": "here"
20+
},
21+
"unableToConnect": "Unable to connect"
1322
}

site/src/i18n/en/workspacePage.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@
3737
"agentStatus": {
3838
"connected": "Connected",
3939
"connecting": "Connecting...",
40-
"disconnected": "Disconnected"
40+
"disconnected": "Disconnected",
41+
"timeout": "Timeout"
4142
},
4243
"buildMessage": {
4344
"start": "started",

site/src/pages/TemplatePage/TemplateSummaryPage/TemplateSummaryPageView.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export const TemplateSummaryPageView: FC<
5959
resources={getStartedResources(templateResources)}
6060
/>
6161

62-
<div className={styles.markdownSection}>
62+
<div className={styles.markdownSection} id="readme">
6363
<div className={styles.readmeLabel}>README.md</div>
6464
<div className={styles.markdownWrapper}>
6565
<MemoizedMarkdown>{readme.body}</MemoizedMarkdown>

0 commit comments

Comments
 (0)