diff --git a/pkg/app/web/src/components/application-detail.stories.tsx b/pkg/app/web/src/components/application-detail.stories.tsx index 2956b260fc..626d3f7583 100644 --- a/pkg/app/web/src/components/application-detail.stories.tsx +++ b/pkg/app/web/src/components/application-detail.stories.tsx @@ -19,6 +19,7 @@ const dummyStore: Partial = { disabling: {}, adding: false, loading: false, + fetchApplicationError: null, }, environments: { entities: { diff --git a/pkg/app/web/src/components/application-detail.tsx b/pkg/app/web/src/components/application-detail.tsx index cea3c3776d..c71c076907 100644 --- a/pkg/app/web/src/components/application-detail.tsx +++ b/pkg/app/web/src/components/application-detail.tsx @@ -22,6 +22,7 @@ import { AppState } from "../modules"; import { Application, ApplicationDeploymentReference, + fetchApplication, selectById as selectApplicationById, syncApplication, } from "../modules/applications"; @@ -38,6 +39,8 @@ import { DetailTableRow } from "./detail-table-row"; import { ApplicationHealthStatusIcon } from "./health-status-icon"; import { SyncStateReason } from "./sync-state-reason"; import { SyncStatusIcon } from "./sync-status-icon"; +import { SerializedError } from "@reduxjs/toolkit"; +import { UI_TEXT_REFRESH } from "../constants/ui-text"; const useStyles = makeStyles((theme) => ({ root: { @@ -95,13 +98,15 @@ const useIsSyncingApplication = ( }); }; +const ERROR_MESSAGE = "It was unable to fetch the application."; + const MostRecentlySuccessfulDeployment: FC<{ deployment?: ApplicationDeploymentReference.AsObject; }> = ({ deployment }) => { const classes = useStyles(); if (!deployment) { - return ; + return ; } const date = dayjs(deployment.startedAt * 1000); @@ -139,12 +144,17 @@ export const ApplicationDetail: FC = memo(function ApplicationDetail({ const classes = useStyles(); const dispatch = useDispatch(); - const [app, liveState] = useSelector< + const [app, liveState, fetchApplicationError] = useSelector< AppState, - [Application | undefined, ApplicationLiveState | undefined] + [ + Application | undefined, + ApplicationLiveState | undefined, + SerializedError | null + ] >((state) => [ selectApplicationById(state.applications, applicationId), selectLiveStateById(state.applicationLiveState, applicationId), + state.applications.fetchApplicationError, ]); const [pipe, env] = useSelector< @@ -163,6 +173,30 @@ export const ApplicationDetail: FC = memo(function ApplicationDetail({ } }; + if (fetchApplicationError) { + return ( + + + {ERROR_MESSAGE} + + + + ); + } + return ( @@ -242,7 +276,7 @@ export const ApplicationDetail: FC = memo(function ApplicationDetail({ ) : ( - + )} @@ -258,7 +292,7 @@ export const ApplicationDetail: FC = memo(function ApplicationDetail({ variant="outlined" color="primary" onClick={handleSync} - disabled={isSyncing} + disabled={isSyncing || !app} startIcon={} > SYNC diff --git a/pkg/app/web/src/components/application-state-view.test.tsx b/pkg/app/web/src/components/application-state-view.test.tsx index a390ea7c0e..11375a891a 100644 --- a/pkg/app/web/src/components/application-state-view.test.tsx +++ b/pkg/app/web/src/components/application-state-view.test.tsx @@ -2,7 +2,7 @@ import React from "react"; import { createStore, render, screen } from "../../test-utils"; import { ApplicationStateView } from "./application-state-view"; import { dummyApplicationLiveState } from "../__fixtures__/dummy-application-live-state"; -import { clearError } from "../modules/applications-live-state"; +import { fetchApplicationStateById } from "../modules/applications-live-state"; import { UI_TEXT_REFRESH } from "../constants/ui-text"; import userEvent from "@testing-library/user-event"; @@ -35,5 +35,7 @@ it("shows refresh button if live state fetching has error", () => { userEvent.click(screen.getByRole("button", { name: UI_TEXT_REFRESH })); - expect(store.getActions()).toMatchObject([{ type: clearError.type }]); + expect(store.getActions()).toMatchObject([ + { type: fetchApplicationStateById.pending.type }, + ]); }); diff --git a/pkg/app/web/src/components/application-state-view.tsx b/pkg/app/web/src/components/application-state-view.tsx index aa956ea615..98f077f8c2 100644 --- a/pkg/app/web/src/components/application-state-view.tsx +++ b/pkg/app/web/src/components/application-state-view.tsx @@ -12,7 +12,7 @@ import { UI_TEXT_REFRESH } from "../constants/ui-text"; import { AppState } from "../modules"; import { ApplicationLiveState, - clearError, + fetchApplicationStateById, selectById as selectLiveStateById, selectHasError, } from "../modules/applications-live-state"; @@ -52,7 +52,7 @@ export const ApplicationStateView: FC = memo(