1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-01-25 00:07:47 +01:00

fix: handle existing feature name (#641)

* fix: handle existing feature name

* refactor: change feature input order
This commit is contained in:
Youssef Khedher 2022-01-28 15:03:42 +01:00 committed by GitHub
parent d69c024bbe
commit 3488bb5fd6
4 changed files with 51 additions and 47 deletions

View File

@ -27,8 +27,8 @@ const CreateFeature = () => {
setProject,
description,
setDescription,
validateToggleName,
getTogglePayload,
validateName,
clearErrors,
errors,
} = useFeatureForm();
@ -38,20 +38,23 @@ const CreateFeature = () => {
const handleSubmit = async (e: Event) => {
e.preventDefault();
clearErrors();
await validateName(name);
const payload = getTogglePayload();
try {
await createFeatureToggle(project, payload);
history.push(`/projects/${project}/features2/${name}`);
setToastData({
title: 'Toggle created successfully',
text: 'Now you can start using your toggle.',
confetti: true,
type: 'success',
});
setShowFeedback(true);
} catch (e: any) {
setToastApiError(e.toString());
const validToggleName = await validateToggleName();
if (validToggleName) {
const payload = getTogglePayload();
try {
await createFeatureToggle(project, payload);
history.push(`/projects/${project}/features2/${name}`);
setToastData({
title: 'Toggle created successfully',
text: 'Now you can start using your toggle.',
confetti: true,
type: 'success',
});
setShowFeedback(true);
} catch (e: any) {
setToastApiError(e.toString());
}
}
};
@ -86,6 +89,7 @@ const CreateFeature = () => {
setName={setName}
setProject={setProject}
setDescription={setDescription}
validateToggleName={validateToggleName}
errors={errors}
handleSubmit={handleSubmit}
handleCancel={handleCancel}

View File

@ -3,11 +3,7 @@ import Input from '../../../common/Input/Input';
import { Button } from '@material-ui/core';
import { useStyles } from './FeatureForm.styles';
import FeatureTypeSelect from '../../FeatureView2/FeatureSettings/FeatureSettingsMetadata/FeatureTypeSelect/FeatureTypeSelect';
import {
CF_DESC_ID,
CF_NAME_ID,
CF_TYPE_ID,
} from '../../../../testIds';
import { CF_DESC_ID, CF_NAME_ID, CF_TYPE_ID } from '../../../../testIds';
import useFeatureTypes from '../../../../hooks/api/getters/useFeatureTypes/useFeatureTypes';
import { KeyboardArrowDownOutlined } from '@material-ui/icons';
import useUser from '../../../../hooks/api/getters/useUser/useUser';
@ -25,6 +21,7 @@ interface IFeatureToggleForm {
setName: React.Dispatch<React.SetStateAction<string>>;
setDescription: React.Dispatch<React.SetStateAction<string>>;
setProject: React.Dispatch<React.SetStateAction<string>>;
validateToggleName: () => void;
handleSubmit: (e: any) => void;
handleCancel: () => void;
errors: { [key: string]: string };
@ -42,6 +39,7 @@ const FeatureForm: React.FC<IFeatureToggleForm> = ({
setName,
setDescription,
setProject,
validateToggleName,
handleSubmit,
handleCancel,
errors,
@ -60,6 +58,23 @@ const FeatureForm: React.FC<IFeatureToggleForm> = ({
return (
<form onSubmit={handleSubmit} className={styles.form}>
<div className={styles.container}>
<p className={styles.inputDescription}>
What would you like to call your toggle?
</p>
<Input
disabled={mode === 'Edit'}
className={styles.input}
label="Name"
error={Boolean(errors.name)}
errorText={errors.name}
onFocus={() => clearErrors()}
value={name}
onChange={e => setName(trim(e.target.value))}
inputProps={{
'data-test': CF_NAME_ID,
}}
onBlur={validateToggleName}
/>
<p className={styles.inputDescription}>
What kind of feature toggle do you want to create?
</p>
@ -80,23 +95,6 @@ const FeatureForm: React.FC<IFeatureToggleForm> = ({
<p className={styles.typeDescription}>
{renderToggleDescription()}
</p>
<p className={styles.inputDescription}>
What would you like to call your toggle?
</p>
<Input
disabled={mode === 'Edit'}
className={styles.input}
label="Name"
error={Boolean(errors.name)}
errorText={errors.name}
onFocus={() => clearErrors()}
value={name}
onChange={e => setName(trim(e.target.value))}
inputProps={{
'data-test': CF_NAME_ID,
}}
/>
<ConditionallyRender
condition={editable}
show={

View File

@ -47,23 +47,24 @@ const useFeatureForm = (
};
};
const validateName = async (name: string) => {
const NAME_EXISTS_ERROR = 'Error: A toggle with that name already exists';
const validateToggleName = async () => {
if (name.length === 0) {
setErrors(prev => ({ ...prev, name: 'Name can not be empty.' }));
return false;
}
if (name.length > 0) {
try {
await validateFeatureToggleName(name);
} catch (err: any) {
try {
await validateFeatureToggleName(name);
return true;
} catch (e: any) {
if (e.toString().includes(NAME_EXISTS_ERROR)) {
setErrors(prev => ({
...prev,
name:
err && err.message
? err.message
: 'Could not check name',
name: 'A feature with this name already exists',
}));
}
return false;
}
};
@ -81,7 +82,7 @@ const useFeatureForm = (
description,
setDescription,
getTogglePayload,
validateName,
validateToggleName,
clearErrors,
errors,
};

View File

@ -56,6 +56,7 @@ const useProjectForm = (
return false;
}
};
const validateProjectId = () => {
if (projectId.length === 0) {
setErrors(prev => ({ ...prev, id: 'id can not be empty.' }));