mirror of
https://github.com/Unleash/unleash.git
synced 2024-12-22 19:07:54 +01:00
fix:handle non-existing feature toggle
This commit is contained in:
parent
195cded10b
commit
b5072928b3
@ -75,17 +75,32 @@ const App = ({ location, user, fetchUiBootstrap, feedback }: IAppProps) => {
|
||||
};
|
||||
|
||||
return (
|
||||
<SWRConfig value={{
|
||||
onError: (error) => {
|
||||
if (!isUnauthorized()) {
|
||||
setToastData({
|
||||
show: true,
|
||||
type: 'error',
|
||||
text: error.message,
|
||||
});
|
||||
}
|
||||
},
|
||||
}}>
|
||||
<SWRConfig
|
||||
value={{
|
||||
onErrorRetry: (
|
||||
error,
|
||||
_key,
|
||||
_config,
|
||||
revalidate,
|
||||
{ retryCount }
|
||||
) => {
|
||||
// Never retry on 404.
|
||||
if (error.status === 404) {
|
||||
return error;
|
||||
}
|
||||
setTimeout(() => revalidate({ retryCount }), 5000);
|
||||
},
|
||||
onError: error => {
|
||||
if (!isUnauthorized()) {
|
||||
setToastData({
|
||||
show: true,
|
||||
type: 'error',
|
||||
text: error.message,
|
||||
});
|
||||
}
|
||||
},
|
||||
}}
|
||||
>
|
||||
<div className={styles.container}>
|
||||
<LayoutPicker location={location}>
|
||||
<Switch>
|
||||
|
@ -18,10 +18,12 @@ import FeatureVariants from './FeatureVariants/FeatureVariants';
|
||||
import { useStyles } from './FeatureView2.styles';
|
||||
import FeatureSettings from './FeatureSettings/FeatureSettings';
|
||||
import useLoading from '../../../hooks/useLoading';
|
||||
import ConditionallyRender from '../../common/ConditionallyRender';
|
||||
import { getCreateTogglePath } from '../../../utils/route-path-helpers';
|
||||
|
||||
const FeatureView2 = () => {
|
||||
const { projectId, featureId } = useParams<IFeatureViewParams>();
|
||||
const { feature, loading } = useFeature(projectId, featureId);
|
||||
const { feature, loading, error } = useFeature(projectId, featureId);
|
||||
const { a11yProps } = useTabs(0);
|
||||
const { archiveFeatureToggle } = useFeatureApi();
|
||||
const { toast, setToastData } = useToast();
|
||||
@ -97,82 +99,104 @@ const FeatureView2 = () => {
|
||||
});
|
||||
};
|
||||
|
||||
return (
|
||||
<div ref={ref}>
|
||||
<div className={styles.header}>
|
||||
<div className={styles.innerContainer}>
|
||||
<h2 className={styles.featureViewHeader} data-loading>
|
||||
{feature.name}
|
||||
</h2>
|
||||
<div className={styles.actions}>
|
||||
<PermissionIconButton
|
||||
permission={UPDATE_FEATURE}
|
||||
tooltip="Copy"
|
||||
data-loading
|
||||
component={Link}
|
||||
to={`/projects/${projectId}/features2/${featureId}/strategies/copy`}
|
||||
>
|
||||
<FileCopy />
|
||||
</PermissionIconButton>
|
||||
<PermissionIconButton
|
||||
permission={UPDATE_FEATURE}
|
||||
tooltip="Archive feature toggle"
|
||||
data-loading
|
||||
onClick={() => setShowDelDialog(true)}
|
||||
>
|
||||
<Archive />
|
||||
</PermissionIconButton>
|
||||
</div>
|
||||
</div>
|
||||
<div className={styles.separator} />
|
||||
<div className={styles.tabContainer}>
|
||||
<Tabs
|
||||
value={history.location.pathname}
|
||||
indicatorColor="primary"
|
||||
textColor="primary"
|
||||
className={styles.tabNavigation}
|
||||
>
|
||||
{renderTabs()}
|
||||
</Tabs>
|
||||
</div>
|
||||
const renderFeatureNotExist = () => {
|
||||
return (
|
||||
<div>
|
||||
<p>
|
||||
The feature <strong>{featureId} </strong>does not exist. Do
|
||||
you want to
|
||||
<Link to={getCreateTogglePath(projectId)}>create it</Link>
|
||||
?
|
||||
</p>
|
||||
</div>
|
||||
<Route
|
||||
exact
|
||||
path={`/projects/:projectId/features2/:featureId`}
|
||||
component={FeatureOverview}
|
||||
/>
|
||||
<Route
|
||||
path={`/projects/:projectId/features2/:featureId/strategies`}
|
||||
component={FeatureStrategies}
|
||||
/>
|
||||
<Route
|
||||
path={`/projects/:projectId/features2/:featureId/metrics`}
|
||||
component={FeatureMetrics}
|
||||
/>
|
||||
<Route
|
||||
path={`/projects/:projectId/features2/:featureId/logs`}
|
||||
component={FeatureLog}
|
||||
/>
|
||||
<Route
|
||||
path={`/projects/:projectId/features2/:featureId/variants`}
|
||||
component={FeatureVariants}
|
||||
/>
|
||||
<Route
|
||||
path={`/projects/:projectId/features2/:featureId/settings`}
|
||||
component={FeatureSettings}
|
||||
/>
|
||||
<Dialogue
|
||||
onClick={() => archiveToggle()}
|
||||
open={showDelDialog}
|
||||
onClose={handleCancel}
|
||||
primaryButtonText="Archive toggle"
|
||||
secondaryButtonText="Cancel"
|
||||
title="Archive feature toggle"
|
||||
>
|
||||
Are you sure you want to archive this feature toggle?
|
||||
</Dialogue>
|
||||
{toast}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<ConditionallyRender
|
||||
condition={error === undefined}
|
||||
show={
|
||||
<div ref={ref}>
|
||||
<div className={styles.header}>
|
||||
<div className={styles.innerContainer}>
|
||||
<h2
|
||||
className={styles.featureViewHeader}
|
||||
data-loading
|
||||
>
|
||||
{feature.name}
|
||||
</h2>
|
||||
<div className={styles.actions}>
|
||||
<PermissionIconButton
|
||||
permission={UPDATE_FEATURE}
|
||||
tooltip="Copy"
|
||||
data-loading
|
||||
component={Link}
|
||||
to={`/projects/${projectId}/features2/${featureId}/strategies/copy`}
|
||||
>
|
||||
<FileCopy />
|
||||
</PermissionIconButton>
|
||||
<PermissionIconButton
|
||||
permission={UPDATE_FEATURE}
|
||||
tooltip="Archive feature toggle"
|
||||
data-loading
|
||||
onClick={() => setShowDelDialog(true)}
|
||||
>
|
||||
<Archive />
|
||||
</PermissionIconButton>
|
||||
</div>
|
||||
</div>
|
||||
<div className={styles.separator} />
|
||||
<div className={styles.tabContainer}>
|
||||
<Tabs
|
||||
value={history.location.pathname}
|
||||
indicatorColor="primary"
|
||||
textColor="primary"
|
||||
className={styles.tabNavigation}
|
||||
>
|
||||
{renderTabs()}
|
||||
</Tabs>
|
||||
</div>
|
||||
</div>
|
||||
<Route
|
||||
exact
|
||||
path={`/projects/:projectId/features2/:featureId`}
|
||||
component={FeatureOverview}
|
||||
/>
|
||||
<Route
|
||||
path={`/projects/:projectId/features2/:featureId/strategies`}
|
||||
component={FeatureStrategies}
|
||||
/>
|
||||
<Route
|
||||
path={`/projects/:projectId/features2/:featureId/metrics`}
|
||||
component={FeatureMetrics}
|
||||
/>
|
||||
<Route
|
||||
path={`/projects/:projectId/features2/:featureId/logs`}
|
||||
component={FeatureLog}
|
||||
/>
|
||||
<Route
|
||||
path={`/projects/:projectId/features2/:featureId/variants`}
|
||||
component={FeatureVariants}
|
||||
/>
|
||||
<Route
|
||||
path={`/projects/:projectId/features2/:featureId/settings`}
|
||||
component={FeatureSettings}
|
||||
/>
|
||||
<Dialogue
|
||||
onClick={() => archiveToggle()}
|
||||
open={showDelDialog}
|
||||
onClose={handleCancel}
|
||||
primaryButtonText="Archive toggle"
|
||||
secondaryButtonText="Cancel"
|
||||
title="Archive feature toggle"
|
||||
>
|
||||
Are you sure you want to archive this feature toggle?
|
||||
</Dialogue>
|
||||
{toast}
|
||||
</div>
|
||||
}
|
||||
elseShow={renderFeatureNotExist()}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user