Path: blob/main/components/dashboard/src/dedicated-setup/OrgNamingStep.tsx
2506 views
/**1* Copyright (c) 2023 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56import { FC, useCallback, useState } from "react";7import { SetupLayout } from "./SetupLayout";8import { Heading1, Subheading } from "../components/typography/headings";9import { TextInputField } from "../components/forms/TextInputField";10import { useOnBlurError } from "../hooks/use-onblur-error";11import { useCreateOrgMutation } from "../data/organizations/create-org-mutation";12import Alert from "../components/Alert";13import { useCurrentOrg } from "../data/organizations/orgs-query";14import { useUpdateOrgMutation } from "../data/organizations/update-org-mutation";15import { LoadingButton } from "@podkit/buttons/LoadingButton";1617type Props = {18onComplete: () => void;19progressCurrent?: number;20progressTotal?: number;21};22export const OrgNamingStep: FC<Props> = ({ onComplete, progressCurrent, progressTotal }) => {23const org = useCurrentOrg();24const [orgName, setOrgName] = useState(org.data?.name ?? "");25const createOrg = useCreateOrgMutation();26const updateOrg = useUpdateOrgMutation();2728const handleContinue = useCallback(29(e) => {30e.preventDefault();3132if (org.data) {33updateOrg.mutate({ name: orgName }, { onSuccess: onComplete });34} else {35createOrg.mutate(36{ name: orgName },37{38onSuccess: (newOrg) => {39// Need to manually set active-org here so it's returned via subsequent useCurrentOrg() calls40localStorage.setItem("active-org", newOrg.id);41onComplete();42},43},44);45}46},47[createOrg, onComplete, org.data, orgName, updateOrg],48);4950const nameError = useOnBlurError("Please provide a name", orgName.trim().length > 0);5152return (53<SetupLayout progressCurrent={progressCurrent} progressTotal={progressTotal}>54<div className="mb-10">55<Heading1>Name your organization</Heading1>56<Subheading>57Your Gitpod organization allows you to manage settings, projects and collaborate with teammates.58</Subheading>59</div>60{(createOrg.isError || updateOrg.isError) && (61<Alert type="danger">{createOrg.error?.message || updateOrg.error?.message}</Alert>62)}63<form onSubmit={handleContinue}>64<TextInputField65label="Organization Name"66placeholder="e.g. ACME Inc"67hint="The name of your company or organization."68value={orgName}69error={nameError.message}70onChange={setOrgName}71onBlur={nameError.onBlur}72/>73<div className="mt-6">74<LoadingButton75type="submit"76className="w-full"77disabled={!nameError.isValid}78loading={createOrg.isLoading || updateOrg.isLoading}79>80Continue81</LoadingButton>82</div>83</form>84</SetupLayout>85);86};878889