diff --git a/awx/ui_next/src/screens/Credential/Credential.jsx b/awx/ui_next/src/screens/Credential/Credential.jsx index b2e07ed137..f4453a17fd 100644 --- a/awx/ui_next/src/screens/Credential/Credential.jsx +++ b/awx/ui_next/src/screens/Credential/Credential.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useCallback, useEffect } from 'react'; import { t } from '@lingui/macro'; import { CaretLeftIcon } from '@patternfly/react-icons'; @@ -12,37 +12,49 @@ import { Redirect, Link, } from 'react-router-dom'; +import useRequest from '../../util/useRequest'; import { ResourceAccessList } from '../../components/ResourceAccessList'; import ContentError from '../../components/ContentError'; +import ContentLoading from '../../components/ContentLoading'; import RoutedTabs from '../../components/RoutedTabs'; import CredentialDetail from './CredentialDetail'; import CredentialEdit from './CredentialEdit'; import { CredentialsAPI } from '../../api'; function Credential({ setBreadcrumb }) { - const [credential, setCredential] = useState(null); - const [contentError, setContentError] = useState(null); - const [hasContentLoading, setHasContentLoading] = useState(true); const { pathname } = useLocation(); + const match = useRouteMatch({ path: '/credentials/:id', }); const { id } = useParams(); - useEffect(() => { - async function fetchData() { - try { - const { data } = await CredentialsAPI.readDetail(id); - setBreadcrumb(data); - setCredential(data); - } catch (error) { - setContentError(error); - } finally { - setHasContentLoading(false); - } + const { + request: fetchCredential, + result: { credential }, + isLoading: hasContentLoading, + error: contentError, + } = useRequest( + useCallback(async () => { + const { data } = await CredentialsAPI.readDetail(id); + return { + credential: data, + }; + }, [id]), + { + credential: null, } - fetchData(); - }, [id, pathname, setBreadcrumb]); + ); + + useEffect(() => { + fetchCredential(); + }, [fetchCredential, pathname]); + + useEffect(() => { + if (credential) { + setBreadcrumb(credential); + } + }, [credential, setBreadcrumb]); const tabsArray = [ { @@ -90,49 +102,52 @@ function Credential({ setBreadcrumb }) { {showCardHeader && } - - - {credential && [ - - - , - - - , - - - , + {hasContentLoading && } + {!hasContentLoading && credential && ( + + + {credential && [ + + + , + + + , + + + , + + {!hasContentLoading && ( + + {match.params.id && ( + + {t`View Credential Details`} + + )} + + )} + , + ]} {!hasContentLoading && ( - {match.params.id && ( - + {id && ( + {t`View Credential Details`} )} )} - , - ]} - - {!hasContentLoading && ( - - {id && ( - - {t`View Credential Details`} - - )} - - )} - - + + + )} ); diff --git a/awx/ui_next/src/screens/Credential/CredentialDetail/CredentialDetail.jsx b/awx/ui_next/src/screens/Credential/CredentialDetail/CredentialDetail.jsx index 6c74f82767..9ca1c1ed0d 100644 --- a/awx/ui_next/src/screens/Credential/CredentialDetail/CredentialDetail.jsx +++ b/awx/ui_next/src/screens/Credential/CredentialDetail/CredentialDetail.jsx @@ -23,7 +23,7 @@ import { Credential } from '../../../types'; import useRequest, { useDismissableError } from '../../../util/useRequest'; import { relatedResourceDeleteRequests } from '../../../util/getRelatedResourceDeleteDetails'; -const PluginInputMetadata = styled(CodeEditor)` +const PluginInputMetadata = styled.div` grid-column: 1 / -1; `; @@ -117,16 +117,18 @@ function CredentialDetail({ credential }) { } /> - {}} - rows={5} - hasErrors={false} - /> + + {}} + rows={5} + hasErrors={false} + /> + ); }