From 3d139c1a2490c5f9f0b957346ce5c67b4fa4eac0 Mon Sep 17 00:00:00 2001 From: Danielle Maywood Date: Thu, 9 Apr 2026 10:48:54 +0100 Subject: [PATCH] refactor(site): replace `!!` with `Boolean()` for boolean coercion (#24180) --- site/src/api/queries/organizations.ts | 4 ++-- site/src/contexts/useWebpushNotifications.ts | 2 +- site/src/hooks/useExternalAuth.ts | 2 +- site/src/modules/apps/useAppLink.ts | 2 +- .../WorkspaceMoreActions/WorkspaceDeleteDialog.tsx | 2 +- .../WorkspaceMoreActions/WorkspaceMoreActions.tsx | 2 +- .../WorkspaceMoreActions/useWorkspaceDuplication.ts | 2 +- site/src/pages/AgentsPage/AgentSettingsTemplatesPage.tsx | 2 +- .../components/ChatMessageInput/ChatMessageInput.tsx | 2 +- .../AgentsPage/components/DiffViewer/DiffViewer.tsx | 2 +- .../pages/AgentsPage/components/GitPanel/GitPanel.tsx | 6 +++--- .../AgentsPage/components/RetentionPeriodSettings.tsx | 2 +- .../AgentsPage/components/WorkspaceAutostopSettings.tsx | 6 ++++-- site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx | 2 +- .../pages/CreateWorkspacePage/CreateWorkspacePage.tsx | 4 ++-- .../IdpOrgSyncPage/IdpOrgSyncPage.tsx | 2 +- .../NotificationsPage/NotificationsPage.tsx | 9 ++++----- site/src/pages/GroupsPage/GroupPage.tsx | 2 +- site/src/pages/GroupsPage/GroupsPage.tsx | 4 ++-- .../OrganizationSettingsPage/IdpSyncPage/IdpSyncPage.tsx | 2 +- site/src/pages/TaskPage/TaskPage.tsx | 2 +- site/src/pages/TemplatePage/TemplateLayout.tsx | 2 +- .../WorkspacePage/WorkspaceActions/WorkspaceActions.tsx | 2 +- site/src/pages/WorkspacePage/WorkspacePage.tsx | 2 +- site/src/utils/platform.ts | 2 +- 25 files changed, 36 insertions(+), 35 deletions(-) diff --git a/site/src/api/queries/organizations.ts b/site/src/api/queries/organizations.ts index e15f625ba8..aef375b121 100644 --- a/site/src/api/queries/organizations.ts +++ b/site/src/api/queries/organizations.ts @@ -304,7 +304,7 @@ export const organizationsPermissions = ( organizationIds: string[] | undefined, ) => { return { - enabled: !!organizationIds, + enabled: Boolean(organizationIds), queryKey: [ "organizations", [...(organizationIds ?? []).sort()], @@ -351,7 +351,7 @@ export const workspacePermissionsByOrganization = ( userId: string, ) => { return { - enabled: !!organizationIds, + enabled: Boolean(organizationIds), queryKey: [ "workspaces", [...(organizationIds ?? []).sort()], diff --git a/site/src/contexts/useWebpushNotifications.ts b/site/src/contexts/useWebpushNotifications.ts index 04446d2e04..888301f362 100644 --- a/site/src/contexts/useWebpushNotifications.ts +++ b/site/src/contexts/useWebpushNotifications.ts @@ -35,7 +35,7 @@ export const useWebpushNotifications = (): WebpushNotifications => { try { const registration = await navigator.serviceWorker.ready; const subscription = await registration.pushManager.getSubscription(); - setSubscribed(!!subscription); + setSubscribed(Boolean(subscription)); } catch (error) { console.error("Error checking push subscription:", error); setSubscribed(false); diff --git a/site/src/hooks/useExternalAuth.ts b/site/src/hooks/useExternalAuth.ts index 8a421c024b..6c0db550d8 100644 --- a/site/src/hooks/useExternalAuth.ts +++ b/site/src/hooks/useExternalAuth.ts @@ -18,7 +18,7 @@ export const useExternalAuth = (versionId: string | undefined) => { error, } = useQuery({ ...templateVersionExternalAuth(versionId ?? ""), - enabled: !!versionId, + enabled: Boolean(versionId), refetchInterval: externalAuthPollingState === "polling" ? 1000 : false, }); diff --git a/site/src/modules/apps/useAppLink.ts b/site/src/modules/apps/useAppLink.ts index 497c18e184..e53ee9cb84 100644 --- a/site/src/modules/apps/useAppLink.ts +++ b/site/src/modules/apps/useAppLink.ts @@ -111,6 +111,6 @@ export const useAppLink = ( href, onClick, label, - hasToken: !!apiKeyResponse?.key, + hasToken: Boolean(apiKeyResponse?.key), }; }; diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.tsx index 1e61abc600..ba41958e18 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.tsx @@ -56,7 +56,7 @@ export const WorkspaceDeleteDialog: FC = ({ (workspace.latest_build.status === "failed" || workspace.latest_build.status === "canceled"); - const hasTask = !!workspace.task_id; + const hasTask = Boolean(workspace.task_id); return ( = ({ { setIsConfirmingDelete(false); diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.ts b/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.ts index 1a357805f4..5c86e33abd 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.ts +++ b/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.ts @@ -36,7 +36,7 @@ export function useWorkspaceDuplication(workspace?: Workspace) { const getLink = useLinks(); const buildParametersQuery = useQuery({ ...workspaceBuildParameters(workspace?.latest_build.id ?? ""), - enabled: !!workspace, + enabled: Boolean(workspace), }); // Not using useEffectEvent for this, because useEffect isn't really an diff --git a/site/src/pages/AgentsPage/AgentSettingsTemplatesPage.tsx b/site/src/pages/AgentsPage/AgentSettingsTemplatesPage.tsx index bbaa8965eb..ded9a5217d 100644 --- a/site/src/pages/AgentsPage/AgentSettingsTemplatesPage.tsx +++ b/site/src/pages/AgentsPage/AgentSettingsTemplatesPage.tsx @@ -27,7 +27,7 @@ const AgentSettingsTemplatesPage: FC = () => { templatesData={templatesQuery.data} allowlistData={allowlistQuery.data} isLoading={isLoading} - hasError={!!(templatesQuery.error || allowlistQuery.error)} + hasError={Boolean(templatesQuery.error || allowlistQuery.error)} onRetry={() => { void templatesQuery.refetch(); void allowlistQuery.refetch(); diff --git a/site/src/pages/AgentsPage/components/ChatMessageInput/ChatMessageInput.tsx b/site/src/pages/AgentsPage/components/ChatMessageInput/ChatMessageInput.tsx index 33d28bd9b6..9135e52e86 100644 --- a/site/src/pages/AgentsPage/components/ChatMessageInput/ChatMessageInput.tsx +++ b/site/src/pages/AgentsPage/components/ChatMessageInput/ChatMessageInput.tsx @@ -709,7 +709,7 @@ const ChatMessageInput = ({ initialEditorState={initialEditorState} /> - + {autoFocus && } diff --git a/site/src/pages/AgentsPage/components/DiffViewer/DiffViewer.tsx b/site/src/pages/AgentsPage/components/DiffViewer/DiffViewer.tsx index acc3e0ee47..f9a6836fac 100644 --- a/site/src/pages/AgentsPage/components/DiffViewer/DiffViewer.tsx +++ b/site/src/pages/AgentsPage/components/DiffViewer/DiffViewer.tsx @@ -540,7 +540,7 @@ export const DiffViewer: FC = ({ // When the parent provides per-file callbacks (e.g. line click // handlers for comment inputs), build options per file. Otherwise // share a single stable object to avoid unnecessary re-highlights. - const hasPerFileCallbacks = !!(onLineNumberClick || onLineSelected); + const hasPerFileCallbacks = Boolean(onLineNumberClick || onLineSelected); const getOptionsForFile = (fileName: string) => ({ ...diffOptions, diff --git a/site/src/pages/AgentsPage/components/GitPanel/GitPanel.tsx b/site/src/pages/AgentsPage/components/GitPanel/GitPanel.tsx index 8bb4e45118..4d1be06ab9 100644 --- a/site/src/pages/AgentsPage/components/GitPanel/GitPanel.tsx +++ b/site/src/pages/AgentsPage/components/GitPanel/GitPanel.tsx @@ -72,10 +72,10 @@ export const GitPanel: FC = ({ chatInputRef, }) => { const hasRemoteStats = - !!remoteDiffStats && - (remoteDiffStats.additions > 0 || remoteDiffStats.deletions > 0); + (remoteDiffStats?.additions ?? 0) > 0 || + (remoteDiffStats?.deletions ?? 0) > 0; - const showRemoteTab = !!prTab || hasRemoteStats; + const showRemoteTab = Boolean(prTab) || hasRemoteStats; const prTitle = remoteDiffStats?.pull_request_title; const prState = remoteDiffStats?.pull_request_state; diff --git a/site/src/pages/AgentsPage/components/RetentionPeriodSettings.tsx b/site/src/pages/AgentsPage/components/RetentionPeriodSettings.tsx index 89acb39217..2450887701 100644 --- a/site/src/pages/AgentsPage/components/RetentionPeriodSettings.tsx +++ b/site/src/pages/AgentsPage/components/RetentionPeriodSettings.tsx @@ -141,7 +141,7 @@ export const RetentionPeriodSettings: FC = ({ disabled={ isSavingRetentionDays || !form.dirty || - !!form.errors.retention_days + Boolean(form.errors.retention_days) } > Save diff --git a/site/src/pages/AgentsPage/components/WorkspaceAutostopSettings.tsx b/site/src/pages/AgentsPage/components/WorkspaceAutostopSettings.tsx index bcb7db094f..86f7c9cc4b 100644 --- a/site/src/pages/AgentsPage/components/WorkspaceAutostopSettings.tsx +++ b/site/src/pages/AgentsPage/components/WorkspaceAutostopSettings.tsx @@ -137,7 +137,7 @@ export const WorkspaceAutostopSettings: FC = ({ onChange={handleTTLChange} label="Autostop Fallback" disabled={isSavingWorkspaceTTL || isWorkspaceTTLLoading} - error={!!fieldError} + error={Boolean(fieldError)} helperText={fieldError} /> )} @@ -146,7 +146,9 @@ export const WorkspaceAutostopSettings: FC = ({ diff --git a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx index 016aeab958..1750a58804 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx @@ -224,7 +224,7 @@ export const CreateTemplateForm: FC = (props) => { const { data: provisioners } = useQuery({ ...provisionerDaemons(selectedOrg?.id ?? ""), - enabled: showOrganizationPicker && !!selectedOrg, + enabled: showOrganizationPicker && Boolean(selectedOrg), }); // TODO: Ideally, we would have a backend endpoint that could notify the diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx index 55ec46a58a..967dfa7715 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx @@ -78,7 +78,7 @@ const CreateWorkspacePage: FC = () => { ); const templateVersionPresetsQuery = useQuery({ ...templateVersionPresets(templateQuery.data?.active_version_id ?? ""), - enabled: !!templateQuery.data, + enabled: Boolean(templateQuery.data), }); const permissionsQuery = useQuery({ ...checkAuthorization({ @@ -87,7 +87,7 @@ const CreateWorkspacePage: FC = () => { templateQuery.data?.id, ), }), - enabled: !!templateQuery.data, + enabled: Boolean(templateQuery.data), }); const realizedVersionId = customVersionId ?? templateQuery.data?.active_version_id; diff --git a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPage.tsx b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPage.tsx index bf33be470f..fbb492f2b5 100644 --- a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPage.tsx @@ -36,7 +36,7 @@ const IdpOrgSyncPage: FC = () => { const fieldValuesQuery = useQuery({ ...deploymentIdpSyncFieldValues(field), - enabled: !!field, + enabled: Boolean(field), }); const patchOrganizationSyncSettingsMutation = useMutation( diff --git a/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationsPage.tsx b/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationsPage.tsx index 66526b1387..2214d8ac10 100644 --- a/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationsPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationsPage.tsx @@ -65,11 +65,10 @@ const NotificationsPage: FC = () => { ? tabState.value : NOTIFICATION_TABS[0]; - const ready = !!( - systemTemplatesByGroup.data && - customTemplatesByGroup.data && - dispatchMethods.data - ); + const ready = + systemTemplatesByGroup.data != null && + customTemplatesByGroup.data != null && + dispatchMethods.data != null; // Combine system and custom notification templates const allTemplatesByGroup = { ...systemTemplatesByGroup.data, diff --git a/site/src/pages/GroupsPage/GroupPage.tsx b/site/src/pages/GroupsPage/GroupPage.tsx index 03955f7748..8ffd8cb041 100644 --- a/site/src/pages/GroupsPage/GroupPage.tsx +++ b/site/src/pages/GroupsPage/GroupPage.tsx @@ -67,7 +67,7 @@ const GroupPage: FC = () => { const groupData = groupQuery.data; const { data: permissions } = useQuery({ ...groupPermissions(groupData?.id ?? ""), - enabled: !!groupData, + enabled: Boolean(groupData), }); const deleteGroupMutation = useMutation( deleteGroup(queryClient, organization), diff --git a/site/src/pages/GroupsPage/GroupsPage.tsx b/site/src/pages/GroupsPage/GroupsPage.tsx index c98e9e5e8a..0b317a73f7 100644 --- a/site/src/pages/GroupsPage/GroupsPage.tsx +++ b/site/src/pages/GroupsPage/GroupsPage.tsx @@ -25,11 +25,11 @@ const GroupsPage: FC = () => { const { organization, showOrganizations } = useGroupsSettings(); const groupsQuery = useQuery({ ...groupsByOrganization(organization?.name ?? ""), - enabled: !!organization, + enabled: Boolean(organization), }); const permissionsQuery = useQuery({ ...organizationsPermissions([organization?.id ?? ""]), - enabled: !!organization, + enabled: Boolean(organization), }); useEffect(() => { diff --git a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpSyncPage.tsx b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpSyncPage.tsx index 058ea6c7a9..91d1a066c3 100644 --- a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpSyncPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpSyncPage.tsx @@ -70,7 +70,7 @@ const IdpSyncPage: FC = () => { const fieldValuesQuery = useQuery({ ...organizationIdpSyncClaimFieldValues(organizationName, field), - enabled: !!field, + enabled: Boolean(field), }); const patchGroupSyncSettingsMutation = useMutation( diff --git a/site/src/pages/TaskPage/TaskPage.tsx b/site/src/pages/TaskPage/TaskPage.tsx index e07e239bf7..c4eafd6d7b 100644 --- a/site/src/pages/TaskPage/TaskPage.tsx +++ b/site/src/pages/TaskPage/TaskPage.tsx @@ -900,7 +900,7 @@ const TaskStartingAgent: FC = ({ task, agent }) => { function selectAgent(workspace: Workspace) { const agents = workspace.latest_build.resources .flatMap((r) => r.agents) - .filter((a) => !!a); + .filter(Boolean); return agents.at(0); } diff --git a/site/src/pages/TemplatePage/TemplateLayout.tsx b/site/src/pages/TemplatePage/TemplateLayout.tsx index 2973ce8590..3e9b97dd12 100644 --- a/site/src/pages/TemplatePage/TemplateLayout.tsx +++ b/site/src/pages/TemplatePage/TemplateLayout.tsx @@ -92,7 +92,7 @@ export const TemplateLayout: FC = ({ me.id, ), }), - enabled: !!data, + enabled: Boolean(data), }); const location = useLocation(); diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx index 95e4e6727d..a1953177bb 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx @@ -66,7 +66,7 @@ export const WorkspaceActions: FC = ({ const { actions, canCancel, canAcceptJobs } = abilitiesByWorkspaceStatus( workspace, { - canDebug: !!deployment?.config.enable_terraform_debug_mode, + canDebug: Boolean(deployment?.config.enable_terraform_debug_mode), isOwner: user.roles.some((role) => role.name === "owner"), }, ); diff --git a/site/src/pages/WorkspacePage/WorkspacePage.tsx b/site/src/pages/WorkspacePage/WorkspacePage.tsx index 91568ba58f..bce313a834 100644 --- a/site/src/pages/WorkspacePage/WorkspacePage.tsx +++ b/site/src/pages/WorkspacePage/WorkspacePage.tsx @@ -35,7 +35,7 @@ const WorkspacePage: FC = () => { // Template const templateQuery = useQuery({ ...templateQueryOptions(workspace?.template_id ?? ""), - enabled: !!workspace, + enabled: Boolean(workspace), }); const template = templateQuery.data; diff --git a/site/src/utils/platform.ts b/site/src/utils/platform.ts index a782c03d02..e8ac35eba1 100644 --- a/site/src/utils/platform.ts +++ b/site/src/utils/platform.ts @@ -2,7 +2,7 @@ * Returns true if the current platform is macOS. */ function isMac(): boolean { - return !!navigator.platform.match("Mac"); + return Boolean(navigator.platform.match("Mac")); } /**