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.

<!-- Note that API documentation changes are now addressed by the
product design team. -->

- [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
This commit is contained in:
Ian Littman
2024-10-22 17:51:11 -05:00
committed by GitHub
parent 111426d62f
commit 98f2d15c59
3 changed files with 32 additions and 9 deletions
+1
View File
@@ -0,0 +1 @@
* Added a more descriptive error message when install or uninstall details do not exist for an activity
@@ -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 <Spinner />;
} else if (isError && error?.status === 404) {
return (
<DataError
description="Install details are no longer available for this activity."
excludeIssueLink
/>
);
} else if (isError) {
return <DataError description="Close this modal and try again." />;
} else if (!result) {
@@ -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 (
<div className={`${baseClass}__status-message`}>
<Icon
name={INSTALL_DETAILS_STATUS_ICONS[status as SoftwareInstallStatus]}
name={
INSTALL_DETAILS_STATUS_ICONS[status as SoftwareInstallStatus] ??
"pending-outline"
}
/>
<span>
Fleet {getInstallDetailsStatusPredicate(status)} <b>{software_title}</b>{" "}
@@ -80,20 +84,29 @@ const SoftwareUninstallDetailsModal = ({
software_title = "",
status = "",
}: ISoftwareUninstallDetails) => {
const {
data: scriptResult,
isLoading,
isError,
} = useQuery<IScriptResultResponse>(
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 <Spinner />;
} else if (isError && error?.status === 404) {
return (
<DataError
description="Uninstall details are no longer available for this activity."
excludeIssueLink
/>
);
} else if (isError) {
return <DataError description="Close this modal and try again." />;
} else if (!scriptResult) {