/** * Copyright (c) 2023-present Plane Software, Inc. and contributors * SPDX-License-Identifier: AGPL-3.0-only * See the LICENSE file for details. */ import { useEffect, useState } from "react"; import { observer } from "mobx-react"; // plane imports import { useTranslation } from "@plane/i18n"; import { Button, getButtonStyling } from "@plane/propel/button"; import type { IWorkspace } from "@plane/types"; // assets import WorkspaceCreationDisabled from "@/app/assets/workspace/workspace-creation-disabled.png?url"; import { AuthHeaderBase } from "@/components/auth-screens/header"; // components import { CreateWorkspaceForm } from "@/components/workspace/create-workspace-form"; // hooks import { useUser, useUserProfile } from "@/hooks/store/user"; 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(); // router const router = useAppRouter(); // store hooks const { config } = useInstance(); const { data: currentUser } = useUser(); const { updateUserProfile } = useUserProfile(); // states const [defaultValues, setDefaultValues] = useState>({ name: "", 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", managed_by: "tasker", default_managed_by: "tasker", workspaces: [], reason: "NODE.DC workspace policy is unavailable.", }); } }) .finally(() => { if (mounted) setWorkspacePolicyLoading(false); }); return () => { mounted = false; }; }, []); // methods const getMailtoHref = () => { const subject = t("workspace_creation.request_email.subject"); const body = t("workspace_creation.request_email.body", { firstName: currentUser?.first_name || "", lastName: currentUser?.last_name || "", email: currentUser?.email || "", }); return `mailto:?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`; }; const onSubmit = async (workspace: IWorkspace) => { await updateUserProfile({ last_workspace_id: workspace.id }).then(() => router.push(`/${workspace.slug}`)); }; return (
{workspacePolicyLoading ? (

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

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

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

) : shouldBlockWorkspaceCreation ? (
Workspace creation disabled

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

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

) : (

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

Создайте рабочее пространство.

)}
); }); export default CreateWorkspacePage;