diff --git a/frontend/src/component/project/Project/CreateProject/CreateProject.tsx b/frontend/src/component/project/Project/CreateProject/CreateProject.tsx
index 520b9cf23e..8e865b476a 100644
--- a/frontend/src/component/project/Project/CreateProject/CreateProject.tsx
+++ b/frontend/src/component/project/Project/CreateProject/CreateProject.tsx
@@ -1,141 +1,7 @@
-import { Navigate, useNavigate } from 'react-router-dom';
-import ProjectForm from '../ProjectForm/ProjectForm';
-import useProjectForm, {
- DEFAULT_PROJECT_STICKINESS,
-} from '../hooks/useProjectForm';
-import { CreateButton } from 'component/common/CreateButton/CreateButton';
-import FormTemplate from 'component/common/FormTemplate/FormTemplate';
-import { CREATE_PROJECT } from 'component/providers/AccessProvider/permissions';
-import useProjectApi from 'hooks/api/actions/useProjectApi/useProjectApi';
-import { useAuthUser } from 'hooks/api/getters/useAuth/useAuthUser';
-import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
-import useToast from 'hooks/useToast';
-import { formatUnknownError } from 'utils/formatUnknownError';
-import { GO_BACK } from 'constants/navigate';
-import { usePlausibleTracker } from 'hooks/usePlausibleTracker';
-import { Button, styled } from '@mui/material';
-import { useUiFlag } from 'hooks/useUiFlag';
-
-const CREATE_PROJECT_BTN = 'CREATE_PROJECT_BTN';
-
-const StyledButton = styled(Button)(({ theme }) => ({
- marginLeft: theme.spacing(3),
-}));
+import { Navigate } from 'react-router-dom';
const CreateProject = () => {
- const { setToastData, setToastApiError } = useToast();
- const { refetchUser } = useAuthUser();
- const { uiConfig } = useUiConfig();
- const useNewProjectForm = useUiFlag('newCreateProjectUI');
- const navigate = useNavigate();
- const { trackEvent } = usePlausibleTracker();
- const {
- projectId,
- projectName,
- projectDesc,
- projectMode,
- setProjectMode,
- setProjectId,
- setProjectName,
- setProjectDesc,
- getCreateProjectPayload,
- clearErrors,
- validateProjectId,
- validateName,
- setProjectStickiness,
- projectStickiness,
- errors,
- } = useProjectForm();
-
- if (useNewProjectForm) {
- return ;
- }
-
- const { createProject, loading } = useProjectApi();
-
- const handleSubmit = async (e: Event) => {
- e.preventDefault();
- clearErrors();
- const validName = validateName();
- const validId = useNewProjectForm || (await validateProjectId());
-
- if (validName && validId) {
- const payload = getCreateProjectPayload({
- omitId: useNewProjectForm,
- });
- try {
- const createdProject = await createProject(payload);
- refetchUser();
- navigate(`/projects/${createdProject.id}`, { replace: true });
- setToastData({
- title: 'Project created',
- text: 'Now you can add flags to this project',
- confetti: true,
- type: 'success',
- });
-
- if (projectStickiness !== DEFAULT_PROJECT_STICKINESS) {
- trackEvent('project_stickiness_set');
- }
- trackEvent('project-mode', {
- props: { mode: projectMode, action: 'added' },
- });
- } catch (error: unknown) {
- setToastApiError(formatUnknownError(error));
- }
- }
- };
-
- const formatApiCode = () => {
- return `curl --location --request POST '${uiConfig.unleashUrl}/api/admin/projects' \\
---header 'Authorization: INSERT_API_KEY' \\
---header 'Content-Type: application/json' \\
---data-raw '${JSON.stringify(
- getCreateProjectPayload({ omitId: useNewProjectForm }),
- undefined,
- 2,
- )}'`;
- };
-
- const handleCancel = () => {
- navigate(GO_BACK);
- };
-
- return (
-
-
-
- Cancel
-
-
- );
+ return ;
};
export default CreateProject;
diff --git a/frontend/src/component/project/ProjectList/ProjectList.tsx b/frontend/src/component/project/ProjectList/ProjectList.tsx
index bff5dc8cff..4010f25299 100644
--- a/frontend/src/component/project/ProjectList/ProjectList.tsx
+++ b/frontend/src/component/project/ProjectList/ProjectList.tsx
@@ -1,5 +1,5 @@
import { useContext, useEffect, useMemo, useState } from 'react';
-import { useNavigate, useSearchParams } from 'react-router-dom';
+import { useSearchParams } from 'react-router-dom';
import useProjects from 'hooks/api/getters/useProjects/useProjects';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import type { IProjectCard } from 'interfaces/project';
@@ -20,7 +20,6 @@ import { ReactComponent as ProPlanIcon } from 'assets/icons/pro-enterprise-featu
import { ReactComponent as ProPlanIconLight } from 'assets/icons/pro-enterprise-feature-badge-light.svg';
import { safeRegExp } from '@server/util/escape-regex';
import { ThemeMode } from 'component/common/ThemeMode/ThemeMode';
-import { useUiFlag } from 'hooks/useUiFlag';
import { useProfile } from 'hooks/api/getters/useProfile/useProfile';
import { groupProjects } from './group-projects';
import { ProjectGroup } from './ProjectGroup';
@@ -92,7 +91,6 @@ const ProjectCreationButton = () => {
const showCreateDialog = Boolean(searchParams.get('create'));
const [openCreateDialog, setOpenCreateDialog] = useState(showCreateDialog);
const { hasAccess } = useContext(AccessContext);
- const navigate = useNavigate();
const { isOss } = useUiConfig();
const createButtonData = resolveCreateButtonData(
@@ -100,14 +98,12 @@ const ProjectCreationButton = () => {
hasAccess(CREATE_PROJECT),
);
- const useNewProjectForm = useUiFlag('newCreateProjectUI');
-
- const CreateButton: React.FC<{ onClick: () => void }> = ({ onClick }) => {
- return (
+ return (
+ <>
setOpenCreateDialog(true)}
maxWidth='700px'
permission={CREATE_PROJECT}
disabled={createButtonData.disabled}
@@ -116,22 +112,12 @@ const ProjectCreationButton = () => {
>
New project
- );
- };
-
- if (useNewProjectForm) {
- return (
- <>
- setOpenCreateDialog(true)} />
- setOpenCreateDialog(false)}
- />
- >
- );
- } else {
- return navigate('/projects/create')} />;
- }
+ setOpenCreateDialog(false)}
+ />
+ >
+ );
};
export const ProjectListNew = () => {
diff --git a/frontend/src/interfaces/uiConfig.ts b/frontend/src/interfaces/uiConfig.ts
index 47a70528a9..d6dd7ea4ff 100644
--- a/frontend/src/interfaces/uiConfig.ts
+++ b/frontend/src/interfaces/uiConfig.ts
@@ -81,8 +81,6 @@ export type UiFlags = {
projectOverviewRefactorFeedback?: boolean;
featureLifecycle?: boolean;
scimApi?: boolean;
- createProjectWithEnvironmentConfig?: boolean;
- newCreateProjectUI?: boolean;
manyStrategiesPagination?: boolean;
enableLegacyVariants?: boolean;
navigationSidebar?: boolean;
diff --git a/src/lib/__snapshots__/create-config.test.ts.snap b/src/lib/__snapshots__/create-config.test.ts.snap
index 177ab87032..f2bf6f3842 100644
--- a/src/lib/__snapshots__/create-config.test.ts.snap
+++ b/src/lib/__snapshots__/create-config.test.ts.snap
@@ -83,7 +83,6 @@ exports[`should create default config 1`] = `
"celebrateUnleash": false,
"collectTrafficDataUsage": false,
"commandBarUI": false,
- "createProjectWithEnvironmentConfig": false,
"demo": false,
"disableBulkToggle": false,
"disableMetrics": false,
@@ -138,7 +137,6 @@ exports[`should create default config 1`] = `
},
"migrationLock": true,
"navigationSidebar": true,
- "newCreateProjectUI": false,
"outdatedSdksBanner": false,
"parseProjectFromSession": false,
"personalAccessTokensKillSwitch": false,
diff --git a/src/lib/features/project/project-service.e2e.test.ts b/src/lib/features/project/project-service.e2e.test.ts
index b9e6c704ff..fd01f57380 100644
--- a/src/lib/features/project/project-service.e2e.test.ts
+++ b/src/lib/features/project/project-service.e2e.test.ts
@@ -79,9 +79,7 @@ beforeAll(async () => {
const config = createTestConfig({
getLogger,
experimental: {
- flags: {
- createProjectWithEnvironmentConfig: true,
- },
+ flags: {},
},
});
eventService = new EventService(stores, config);
@@ -2715,26 +2713,5 @@ describe('automatic ID generation for create project', () => {
expect(project.id).toBe(id);
},
);
-
- test.each(['', undefined, ' '])(
- 'if the flag to enable auto ID generation is off, not providing a valid ID (testing `%s`) throws an error',
- async (id) => {
- // @ts-expect-error
- projectService.flagResolver.isEnabled = () => {
- return false;
- };
-
- const createProject = () =>
- projectService.createProject(
- {
- name: randomId(),
- id,
- },
- user,
- auditUser,
- );
- expect(createProject).rejects.toThrow();
- },
- );
});
});
diff --git a/src/lib/features/project/project-service.ts b/src/lib/features/project/project-service.ts
index d1233afc73..ef40dc258e 100644
--- a/src/lib/features/project/project-service.ts
+++ b/src/lib/features/project/project-service.ts
@@ -294,10 +294,7 @@ export default class ProjectService {
}
async validateProjectEnvironments(environments: string[] | undefined) {
- if (
- this.flagResolver.isEnabled('createProjectWithEnvironmentConfig') &&
- environments
- ) {
+ if (environments) {
if (environments.length === 0) {
throw new BadDataError(
'A project must always have at least one environment.',
@@ -339,12 +336,7 @@ export default class ProjectService {
const validateData = async () => {
await this.validateProjectEnvironments(newProject.environments);
- if (
- !newProject.id?.trim() &&
- this.flagResolver.isEnabled(
- 'createProjectWithEnvironmentConfig',
- )
- ) {
+ if (!newProject.id?.trim()) {
newProject.id = await this.generateUniqueProjectId(
newProject.name,
);
@@ -362,15 +354,13 @@ export default class ProjectService {
await this.projectStore.create(data);
- const envsToEnable =
- this.flagResolver.isEnabled('createProjectWithEnvironmentConfig') &&
- newProject.environments?.length
- ? newProject.environments
- : (
- await this.environmentStore.getAll({
- enabled: true,
- })
- ).map((env) => env.name);
+ const envsToEnable = newProject.environments?.length
+ ? newProject.environments
+ : (
+ await this.environmentStore.getAll({
+ enabled: true,
+ })
+ ).map((env) => env.name);
await Promise.all(
envsToEnable.map(async (env) => {
@@ -378,10 +368,7 @@ export default class ProjectService {
}),
);
- if (
- this.isEnterprise &&
- this.flagResolver.isEnabled('createProjectWithEnvironmentConfig')
- ) {
+ if (this.isEnterprise) {
if (newProject.changeRequestEnvironments) {
await this.validateEnvironmentsExist(
newProject.changeRequestEnvironments.map((env) => env.name),
diff --git a/src/lib/types/experimental.ts b/src/lib/types/experimental.ts
index bd577be748..c8652ed05e 100644
--- a/src/lib/types/experimental.ts
+++ b/src/lib/types/experimental.ts
@@ -56,9 +56,7 @@ export type IFlagKey =
| 'featureLifecycle'
| 'featureLifecycleMetrics'
| 'parseProjectFromSession'
- | 'createProjectWithEnvironmentConfig'
| 'manyStrategiesPagination'
- | 'newCreateProjectUI'
| 'enableLegacyVariants'
| 'navigationSidebar'
| 'commandBarUI'
@@ -272,14 +270,6 @@ const flags: IFlags = {
process.env.UNLEASH_EXPERIMENTAL_PARSE_PROJECT_FROM_SESSION,
false,
),
- createProjectWithEnvironmentConfig: parseEnvVarBoolean(
- process.env.UNLEASH_EXPERIMENTAL_CREATE_PROJECT_WITH_ENVIRONMENT_CONFIG,
- false,
- ),
- newCreateProjectUI: parseEnvVarBoolean(
- process.env.UNLEASH_EXPERIMENTAL_NEW_CREATE_PROJECT_UI,
- false,
- ),
manyStrategiesPagination: parseEnvVarBoolean(
process.env.UNLEASH_EXPERIMENTAL_MANY_STRATEGIES_PAGINATION,
false,
diff --git a/src/server-dev.ts b/src/server-dev.ts
index 3fc317203b..7c91d90e49 100644
--- a/src/server-dev.ts
+++ b/src/server-dev.ts
@@ -50,7 +50,6 @@ process.nextTick(async () => {
projectOverviewRefactorFeedback: true,
featureLifecycle: true,
parseProjectFromSession: true,
- createProjectWithEnvironmentConfig: true,
manyStrategiesPagination: true,
enableLegacyVariants: false,
commandBarUI: true,