1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-10-18 20:09:08 +02:00

fix: envrionments should give understandable error if not possible to… (#433)

This commit is contained in:
Ivar Conradi Østhus 2021-10-14 19:58:57 +02:00 committed by GitHub
parent bbf06725a3
commit 1058b4049c
9 changed files with 67 additions and 57 deletions

View File

@ -21,7 +21,7 @@ export const useStyles = makeStyles(theme => ({
paddingLeft: '10px',
},
tableCellEnv: {
width: '20px',
width: '90px',
[theme.breakpoints.down('sm')]: {
display: 'none',
},
@ -33,4 +33,11 @@ export const useStyles = makeStyles(theme => ({
display: 'none',
},
},
envName: {
display: 'inline-block',
width: '90px',
textOverflow: 'ellipsis',
overflow: 'hidden',
whiteSpace: 'nowrap',
}
}));

View File

@ -120,10 +120,8 @@ const FeatureToggleListNew = ({
)}
align="center"
>
<span data-loading>
{env.name === ':global:'
? 'Status'
: env.name}
<span data-loading className={styles.envName} >
{env.name}
</span>
</TableCell>
);

View File

@ -63,7 +63,7 @@ const FeatureToggleListNewItem = ({
setToastData({
show: true,
type: 'error',
text: e.toString(),
text: e.message,
});
});
};

View File

@ -2,7 +2,6 @@ import { useHistory, useParams } from 'react-router';
import { useCommonStyles } from '../../../common.styles';
import useProject from '../../../hooks/api/getters/useProject/useProject';
import useLoading from '../../../hooks/useLoading';
import useUiConfig from '../../../hooks/api/getters/useUiConfig/useUiConfig';
import ApiError from '../../common/ApiError/ApiError';
import ConditionallyRender from '../../common/ConditionallyRender';
import { useStyles } from './Project.styles';
@ -23,7 +22,6 @@ const Project = () => {
const { id, activeTab } = useParams<{ id: string, activeTab: string }>();
const params = useQueryParams();
const { project, error, loading, refetch } = useProject(id);
const { uiConfig } = useUiConfig();
const ref = useLoading(loading);
const { toast, setToastData } = useToast();
const commonStyles = useCommonStyles();
@ -57,7 +55,6 @@ const Project = () => {
component: <ProjectEnvironment projectId={id} />,
path: `${basePath}/environments`,
name: 'environments',
disabled: !uiConfig.flags.E
},
{
title: 'Settings',

View File

@ -138,10 +138,6 @@ const ProjectEnvironmentList = ({ projectId }: ProjectEnvironmentListProps) => {
);
const renderEnvironments = () => {
if (!uiConfig.flags.E) {
return <p>Feature not enabled.</p>;
}
return (
<FormGroup>
{envs.map(env => (
@ -167,45 +163,53 @@ const ProjectEnvironmentList = ({ projectId }: ProjectEnvironmentListProps) => {
<PageContent
headerContent={
<HeaderTitle
title={`Configure environments for "${project?.name}"`}
title={`Configure environments for "${project?.name}" project`}
/>}
>
<Alert severity="info">
<b>Important!</b> In order for your application to retrieve feature toggle activation strategies for a specific environment, the application<br/> must use an environment-specific API key. You can look up the environment-specific API keys {' '}
<Link
to='/admin/api'
>
here.
</Link>{' '}
<br/>
<br/>
Your administrator can configure an environment-specific API key and add it to your SDK if you can't find it on the list.
If you are an administrator you can create a new API key {' '}
<Link
to='/admin/api'
>
here.
</Link>{' '}
<ConditionallyRender condition={uiConfig.flags.E} show={
<div className={styles.container}>
<ConditionallyRender condition={error} show={renderError()} />
<Alert severity="info" style={{marginBottom: '20px'}}>
<b>Important!</b> In order for your application to retrieve configured activation strategies for a specific environment,
the application<br/> must use an environment specific API key. You can look up the environment-specific API keys {' '}
<Link
to='/admin/api'
>
here.
</Link>
<br/>
<br/>
Your administrator can configure an environment-specific API key to be used in the SDK.
If you are an administrator you can {' '}
<Link
to='/admin/api'
>
create a new API key.
</Link>
</Alert>
<ConditionallyRender
condition={environments.length < 1 && !loading}
show={<div>No environments available.</div>}
elseShow={renderEnvironments()}
/>
<EnvironmentDisableConfirm
env={selectedEnv}
open={!!selectedEnv}
handleDisableEnvironment={handleDisableEnvironment}
handleCancelDisableEnvironment={
handleCancelDisableEnvironment
}
confirmName={confirmName}
setConfirmName={setConfirmName}
/>
</div>
} elseShow={
<Alert security="success">
This feature has not been Unleashed for you yet.
</Alert>
<br/>
<ConditionallyRender condition={error} show={renderError()} />
<div className={styles.container}>
<ConditionallyRender
condition={environments.length < 1 && !loading}
show={<div>No environments available.</div>}
elseShow={renderEnvironments()}
/>
</div>
<EnvironmentDisableConfirm
env={selectedEnv}
open={!!selectedEnv}
handleDisableEnvironment={handleDisableEnvironment}
handleCancelDisableEnvironment={
handleCancelDisableEnvironment
}
confirmName={confirmName}
setConfirmName={setConfirmName}
/>
} />
{toast}
</PageContent>
</div>

View File

@ -107,16 +107,16 @@ const ProjectFormComponent = (props: ProjectFormComponentProps) => {
<PageContent
headerContent={
<HeaderTitle
title={`${submitText} Project`}
title={`${submitText} ${project?.name} project`}
/>
}
>
<ConditionallyRender condition={isOss()} show={
<Alert data-loading severity="error">
Creating and updating projects requires a paid version of Unleash.
Check out <a href="https://www.getunleash.io" target="_blank" rel="noreferrer">getunleash.io</a>
to find out more.
{submitText} project requires a paid version of Unleash.
Check out <a href="https://www.getunleash.io" target="_blank" rel="noreferrer">getunleash.io</a>{' '}
to learn more.
</Alert>
} elseShow={
<>

View File

@ -66,9 +66,11 @@ export const handleForbidden = async (
if (res) {
const data = await res.json();
const message = data.isJoi ? data.details[0].message : data[0].msg;
setErrors(prev => ({
...prev,
[requestId]: data[0].msg,
[requestId]: message,
}));
}

View File

@ -153,12 +153,14 @@ const useAPI = ({
}
if (propagateErrors) {
throw new ForbiddenError(res.status);
const response = await res.json();
throw new ForbiddenError(res.status, response);
}
}
if (res.status > 399) {
const response = await res.json();
if (response?.details?.length > 0) {
const error = response.details[0];
if (propagateErrors) {

View File

@ -27,8 +27,8 @@ export class AuthenticationError extends Error {
}
export class ForbiddenError extends Error {
constructor(statusCode, body) {
super('You cannot perform this action');
constructor(statusCode, body = {}) {
super(body.details?.length > 0 ? body.details[0].message : 'You cannot perform this action');
this.name = 'ForbiddenError';
this.statusCode = statusCode;
this.body = body;