diff --git a/site/src/modules/dashboard/Navbar/MobileMenu.stories.tsx b/site/src/modules/dashboard/Navbar/MobileMenu.stories.tsx index 00193cdcbc0..d8391c1f958 100644 --- a/site/src/modules/dashboard/Navbar/MobileMenu.stories.tsx +++ b/site/src/modules/dashboard/Navbar/MobileMenu.stories.tsx @@ -11,6 +11,22 @@ import { } from "#/testHelpers/entities"; import { MobileMenu } from "./MobileMenu"; +const defaultProxyContextValue = { + latenciesLoaded: true, + proxy: { + preferredPathAppURL: "", + preferredWildcardHostname: "", + proxy: MockPrimaryWorkspaceProxy, + }, + isLoading: false, + isFetched: true, + setProxy: fn(), + clearProxy: fn(), + refetchProxyLatencies: fn(), + proxyLatencies: MockProxyLatencies, + proxies: MockWorkspaceProxies, +}; + const meta: Meta = { title: "modules/dashboard/MobileMenu", parameters: { @@ -21,21 +37,7 @@ const meta: Meta = { }, component: MobileMenu, args: { - proxyContextValue: { - latenciesLoaded: true, - proxy: { - preferredPathAppURL: "", - preferredWildcardHostname: "", - proxy: MockPrimaryWorkspaceProxy, - }, - isLoading: false, - isFetched: true, - setProxy: fn(), - clearProxy: fn(), - refetchProxyLatencies: fn(), - proxyLatencies: MockProxyLatencies, - proxies: MockWorkspaceProxies, - }, + proxyContextValue: defaultProxyContextValue, user: MockUserOwner, supportLinks: MockSupportLinks, onSignOut: fn(), @@ -105,6 +107,53 @@ export const ProxySettings: Story = { }, }; +export const ProxyWarningLatency: Story = { + args: { + proxyContextValue: { + ...defaultProxyContextValue, + proxyLatencies: { + ...MockProxyLatencies, + [MockPrimaryWorkspaceProxy.id]: { + accurate: true, + latencyMS: 224, + at: new Date(), + nextHopProtocol: "h2", + }, + }, + }, + }, +}; + +export const ProxyCriticalLatency: Story = { + args: { + proxyContextValue: { + ...defaultProxyContextValue, + proxyLatencies: { + ...MockProxyLatencies, + [MockPrimaryWorkspaceProxy.id]: { + accurate: true, + latencyMS: 471, + at: new Date(), + nextHopProtocol: "h2", + }, + }, + }, + }, +}; + +export const ProxyNoLatency: Story = { + args: { + proxyContextValue: { + ...defaultProxyContextValue, + proxyLatencies: Object.fromEntries( + Object.entries(MockProxyLatencies).filter( + ([id]) => id !== MockPrimaryWorkspaceProxy.id, + ), + ), + }, + }, +}; + export const UserSettings: Story = { play: async ({ canvasElement }) => { const user = userEvent.setup(); diff --git a/site/src/modules/dashboard/Navbar/MobileMenu.tsx b/site/src/modules/dashboard/Navbar/MobileMenu.tsx index 661341830c7..b8bd979a74b 100644 --- a/site/src/modules/dashboard/Navbar/MobileMenu.tsx +++ b/site/src/modules/dashboard/Navbar/MobileMenu.tsx @@ -2,6 +2,7 @@ import { ChevronRightIcon, CircleHelpIcon, MenuIcon, + RadioIcon, XIcon, } from "lucide-react"; import { type FC, useState } from "react"; @@ -26,6 +27,7 @@ import { ExternalImage } from "#/components/ExternalImage/ExternalImage"; import { Latency } from "#/components/Latency/Latency"; import type { ProxyContextValue } from "#/contexts/ProxyContext"; import { cn } from "#/utils/cn"; +import { getLatencyColor } from "#/utils/latency"; import { AdminSettingsItems, type AdminSettingsPermissions, @@ -132,12 +134,19 @@ const ProxySettingsSub: FC = ({ proxyContextValue }) => { > Workspace proxy settings: - + Latency for {selectedProxy.display_name || selectedProxy.name} + +