import { useMachine } from "@xstate/react" import { TemplateVersionParameter } from "api/typesGenerated" import { useMe } from "hooks/useMe" import { useOrganizationId } from "hooks/useOrganizationId" import { FC } from "react" import { Helmet } from "react-helmet-async" import { useNavigate, useParams, useSearchParams } from "react-router-dom" import { pageTitle } from "utils/page" import { createWorkspaceMachine } from "xServices/createWorkspace/createWorkspaceXService" import { CreateWorkspaceErrors, CreateWorkspacePageView, } from "./CreateWorkspacePageView" const CreateWorkspacePage: FC = () => { const organizationId = useOrganizationId() const { template: templateName } = useParams() as { template: string } const navigate = useNavigate() const me = useMe() const [createWorkspaceState, send] = useMachine(createWorkspaceMachine, { context: { organizationId, templateName, owner: me, }, actions: { onCreateWorkspace: (_, event) => { navigate(`/@${event.data.owner_name}/${event.data.name}`) }, }, }) const { templates, templateParameters, templateSchema, templateGitAuth, selectedTemplate, getTemplateSchemaError, getTemplateGitAuthError, getTemplatesError, createWorkspaceError, permissions, owner, } = createWorkspaceState.context const [searchParams] = useSearchParams() const defaultParameterValues = getDefaultParameterValues(searchParams) return ( <> {pageTitle("Create Workspace")} { send({ type: "SELECT_OWNER", owner: user, }) }} onCancel={() => { // Go back navigate(-1) }} onSubmit={(request) => { send({ type: "CREATE_WORKSPACE", request, owner, }) }} /> ) } const getDefaultParameterValues = ( urlSearchParams: URLSearchParams, ): Record => { const paramValues: Record = {} Array.from(urlSearchParams.keys()) .filter((key) => key.startsWith("param.")) .forEach((key) => { const paramName = key.replace("param.", "") const paramValue = urlSearchParams.get(key) paramValues[paramName] = paramValue ?? "" }) return paramValues } export const orderedTemplateParameters = ( templateParameters?: TemplateVersionParameter[], ): TemplateVersionParameter[] => { if (!templateParameters) { return [] } const immutables = templateParameters.filter( (parameter) => !parameter.mutable, ) const mutables = templateParameters.filter((parameter) => parameter.mutable) return [...immutables, ...mutables] } export default CreateWorkspacePage