1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-01-06 00:07:44 +01:00
unleash.unleash/frontend/src/component/project/Project/hooks/useProjectForm.ts

108 lines
3.1 KiB
TypeScript
Raw Normal View History

import { useEffect, useState } from 'react';
2022-03-28 10:49:59 +02:00
import useProjectApi from 'hooks/api/actions/useProjectApi/useProjectApi';
import { formatUnknownError } from 'utils/formatUnknownError';
import { useDefaultProjectSettings } from 'hooks/useDefaultProjectSettings';
export type ProjectMode = 'open' | 'protected';
export type DefaultStickiness = 'default' | 'userId' | 'sessionId' | 'random';
export const DEFAULT_PROJECT_STICKINESS = 'default';
const useProjectForm = (
initialProjectId = '',
initialProjectName = '',
initialProjectDesc = '',
initialProjectStickiness: DefaultStickiness = DEFAULT_PROJECT_STICKINESS,
initialProjectMode: ProjectMode = 'open'
) => {
const [projectId, setProjectId] = useState(initialProjectId);
const { defaultStickiness } = useDefaultProjectSettings(projectId);
const [projectName, setProjectName] = useState(initialProjectName);
const [projectDesc, setProjectDesc] = useState(initialProjectDesc);
const [projectStickiness, setProjectStickiness] =
useState<DefaultStickiness>(
defaultStickiness || initialProjectStickiness
);
const [projectMode, setProjectMode] =
useState<ProjectMode>(initialProjectMode);
const [errors, setErrors] = useState({});
const { validateId } = useProjectApi();
useEffect(() => {
setProjectId(initialProjectId);
}, [initialProjectId]);
useEffect(() => {
setProjectName(initialProjectName);
}, [initialProjectName]);
useEffect(() => {
setProjectDesc(initialProjectDesc);
}, [initialProjectDesc]);
2023-03-16 15:29:52 +01:00
useEffect(() => {
setProjectMode(initialProjectMode);
}, [initialProjectMode]);
useEffect(() => {
setProjectStickiness(initialProjectStickiness);
}, [initialProjectStickiness]);
const getProjectPayload = () => {
return {
id: projectId,
name: projectName,
description: projectDesc,
defaultStickiness: projectStickiness,
2023-03-16 15:29:52 +01:00
mode: projectMode,
};
};
const validateProjectId = async () => {
2022-01-25 12:30:55 +01:00
if (projectId.length === 0) {
setErrors(prev => ({ ...prev, id: 'Id can not be empty.' }));
return false;
}
try {
await validateId(getProjectPayload().id);
return true;
} catch (error: unknown) {
setErrors(prev => ({ ...prev, id: formatUnknownError(error) }));
return false;
}
};
2022-02-18 08:26:26 +01:00
const validateName = () => {
if (projectName.length === 0) {
setErrors(prev => ({ ...prev, name: 'Name can not be empty.' }));
return false;
}
2022-01-25 12:30:55 +01:00
return true;
};
const clearErrors = () => {
setErrors({});
};
return {
projectId,
projectName,
projectDesc,
projectStickiness,
2023-03-16 15:29:52 +01:00
projectMode,
setProjectId,
setProjectName,
setProjectDesc,
setProjectStickiness,
2023-03-16 15:29:52 +01:00
setProjectMode,
getProjectPayload,
validateName,
validateProjectId,
clearErrors,
errors,
};
};
export default useProjectForm;