diff --git a/plane-src/apps/web/app/(all)/create-workspace/page.tsx b/plane-src/apps/web/app/(all)/create-workspace/page.tsx index 80d17a1..a7c3648 100644 --- a/plane-src/apps/web/app/(all)/create-workspace/page.tsx +++ b/plane-src/apps/web/app/(all)/create-workspace/page.tsx @@ -4,7 +4,7 @@ * See the LICENSE file for details. */ -import { useState } from "react"; +import { useEffect, useState } from "react"; import { observer } from "mobx-react"; // plane imports import { useTranslation } from "@plane/i18n"; @@ -21,6 +21,9 @@ import { useInstance } from "@/hooks/store/use-instance"; import { useAppRouter } from "@/hooks/use-app-router"; // wrappers import { AuthenticationWrapper } from "@/lib/wrappers/authentication-wrapper"; +import { WorkspaceService, type NodeDCWorkspacePolicy } from "@/services/workspace.service"; + +const workspaceService = new WorkspaceService(); const CreateWorkspacePage = observer(function CreateWorkspacePage() { const { t } = useTranslation(); @@ -36,8 +39,39 @@ const CreateWorkspacePage = observer(function CreateWorkspacePage() { slug: "", organization_size: "", }); + const [workspacePolicy, setWorkspacePolicy] = useState(null); + const [workspacePolicyLoading, setWorkspacePolicyLoading] = useState(true); // derived values const isWorkspaceCreationDisabled = config?.is_workspace_creation_disabled ?? false; + const isWorkspaceCreationDeniedByNodeDC = Boolean(workspacePolicy?.enabled && !workspacePolicy.can_create_workspace); + const shouldBlockWorkspaceCreation = isWorkspaceCreationDisabled || isWorkspaceCreationDeniedByNodeDC; + + useEffect(() => { + let mounted = true; + + workspaceService + .getNodeDCWorkspacePolicy() + .then((policy) => { + if (mounted) setWorkspacePolicy(policy); + }) + .catch(() => { + if (mounted) { + setWorkspacePolicy({ + enabled: false, + can_create_workspace: true, + mode: "unavailable", + reason: "NODE.DC workspace policy is unavailable.", + }); + } + }) + .finally(() => { + if (mounted) setWorkspacePolicyLoading(false); + }); + + return () => { + mounted = false; + }; + }, []); // methods const getMailtoHref = () => { @@ -60,7 +94,17 @@ const CreateWorkspacePage = observer(function CreateWorkspacePage() {
- {isWorkspaceCreationDisabled ? ( + {workspacePolicyLoading ? ( +
+
+

Работайте во всех измерениях.

+

Проверяем доступ к workspace.

+
+

+ Сверяем платформенную policy NODE.DC перед созданием рабочего пространства. +

+
+ ) : shouldBlockWorkspaceCreation ? (
Workspace creation disabled

- {t("workspace_creation.errors.creation_disabled.title")} + {isWorkspaceCreationDeniedByNodeDC + ? "Workspace создаёт администратор." + : t("workspace_creation.errors.creation_disabled.title")}

- {t("workspace_creation.errors.creation_disabled.description")} + {isWorkspaceCreationDeniedByNodeDC + ? workspacePolicy?.reason || "Дождитесь назначения в рабочее пространство администратором NODE.DC." + : t("workspace_creation.errors.creation_disabled.description")}