From 98f2d15c59aedff659dc2602d3109729b52980d8 Mon Sep 17 00:00:00 2001 From: Ian Littman Date: Tue, 22 Oct 2024 17:51:11 -0500 Subject: [PATCH] Provide better error messages on 404s for install or uninstall results (#23106) #22965 # Checklist for submitter If some of the following don't apply, delete the relevant line. - [x] Changes file added for user-visible changes in `changes/`, `orbit/changes/` or `ee/fleetd-chrome/changes`. See [Changes files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/Committing-Changes.md#changes-files) for more information. - [x] Manual QA for all new/changed functionality --- changes/22965-error-cleanup | 1 + .../SoftwareInstallDetails.tsx | 13 +++++++-- .../SoftwareUninstallDetailsModal.tsx | 27 ++++++++++++++----- 3 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 changes/22965-error-cleanup diff --git a/changes/22965-error-cleanup b/changes/22965-error-cleanup new file mode 100644 index 0000000000..40c23de691 --- /dev/null +++ b/changes/22965-error-cleanup @@ -0,0 +1 @@ +* Added a more descriptive error message when install or uninstall details do not exist for an activity diff --git a/frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetails/SoftwareInstallDetails.tsx b/frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetails/SoftwareInstallDetails.tsx index e3747f952a..91d13ad1ed 100644 --- a/frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetails/SoftwareInstallDetails.tsx +++ b/frontend/components/ActivityDetails/InstallDetails/SoftwareInstallDetails/SoftwareInstallDetails.tsx @@ -1,6 +1,7 @@ import React from "react"; import { useQuery } from "react-query"; import { formatDistanceToNow } from "date-fns"; +import { AxiosError } from "axios"; import { IActivityDetails } from "interfaces/activity"; import { @@ -90,9 +91,9 @@ export const SoftwareInstallDetails = ({ host_display_name = "", install_uuid = "", }: IPackageInstallDetails) => { - const { data: result, isLoading, isError } = useQuery< + const { data: result, isLoading, isError, error } = useQuery< ISoftwareInstallResults, - Error, + AxiosError, ISoftwareInstallResult >( ["softwareInstallResults", install_uuid], @@ -103,11 +104,19 @@ export const SoftwareInstallDetails = ({ refetchOnWindowFocus: false, staleTime: 3000, select: (data) => data.results, + retry: (failureCount, err) => err?.status !== 404 && failureCount < 3, } ); if (isLoading) { return ; + } else if (isError && error?.status === 404) { + return ( + + ); } else if (isError) { return ; } else if (!result) { diff --git a/frontend/components/ActivityDetails/InstallDetails/SoftwareUninstallDetailsModal/SoftwareUninstallDetailsModal.tsx b/frontend/components/ActivityDetails/InstallDetails/SoftwareUninstallDetailsModal/SoftwareUninstallDetailsModal.tsx index dfb4ef13c9..e0838b0717 100644 --- a/frontend/components/ActivityDetails/InstallDetails/SoftwareUninstallDetailsModal/SoftwareUninstallDetailsModal.tsx +++ b/frontend/components/ActivityDetails/InstallDetails/SoftwareUninstallDetailsModal/SoftwareUninstallDetailsModal.tsx @@ -9,6 +9,7 @@ import { IActivityDetails } from "interfaces/activity"; import { isPendingStatus, SoftwareInstallStatus } from "interfaces/software"; import React from "react"; import { useQuery } from "react-query"; +import { AxiosError } from "axios"; import scriptsAPI, { IScriptResultResponse } from "services/entities/scripts"; import { DEFAULT_USE_QUERY_OPTIONS } from "utilities/constants"; import { @@ -55,7 +56,10 @@ const StatusMessage = ({ return (
Fleet {getInstallDetailsStatusPredicate(status)} {software_title}{" "} @@ -80,20 +84,29 @@ const SoftwareUninstallDetailsModal = ({ software_title = "", status = "", }: ISoftwareUninstallDetails) => { - const { - data: scriptResult, - isLoading, - isError, - } = useQuery( + const { data: scriptResult, isLoading, isError, error } = useQuery< + IScriptResultResponse, + AxiosError + >( ["uninstallResult", details.script_execution_id], () => { return scriptsAPI.getScriptResult(script_execution_id); }, - { ...DEFAULT_USE_QUERY_OPTIONS } + { + ...DEFAULT_USE_QUERY_OPTIONS, + retry: (failureCount, err) => err?.status !== 404 && failureCount < 3, + } ); if (isLoading) { return ; + } else if (isError && error?.status === 404) { + return ( + + ); } else if (isError) { return ; } else if (!scriptResult) {