Path: blob/main/components/dashboard/src/repositories/detail/general/ConfigurationName.tsx
2502 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 type { Configuration } from "@gitpod/public-api/lib/gitpod/v1/configuration_pb";7import { LoadingButton } from "@podkit/buttons/LoadingButton";8import { FC, useCallback, useState } from "react";9import { TextInputField } from "../../../components/forms/TextInputField";10import { useToast } from "../../../components/toasts/Toasts";11import { useOnBlurError } from "../../../hooks/use-onblur-error";12import { ConfigurationSettingsField } from "../ConfigurationSettingsField";13import { useConfigurationMutation } from "../../../data/configurations/configuration-queries";14import { InputWithCopy } from "../../../components/InputWithCopy";15import { InputField } from "../../../components/forms/InputField";16import { usePrettyRepoURL } from "../../../hooks/use-pretty-repo-url";1718const MAX_LENGTH = 100;1920type Props = {21configuration: Configuration;22};23export const ConfigurationNameForm: FC<Props> = ({ configuration }) => {24const { toast } = useToast();25const updateConfiguration = useConfigurationMutation();26const [configurationName, setConfigurationName] = useState(configuration.name);2728const nameChanged = configurationName !== configuration.name;29const nameError = useOnBlurError("Sorry, this name is too long.", configurationName.length <= MAX_LENGTH);3031const url = usePrettyRepoURL(configuration.cloneUrl);3233const updateName = useCallback(34async (e: React.FormEvent) => {35e.preventDefault();3637if (!nameError.isValid) {38toast("Please correct the errors with the name.");39return;40}4142updateConfiguration.mutate(43{44configurationId: configuration.id,45name: configurationName,46},47{48onSuccess: (configuration) => {49toast(`Configuration name set to "${configuration.name}".`);50},51onError: (err) => {52toast(`Updating configuration name failed: ${err.message}`);53},54},55);56},57[nameError.isValid, updateConfiguration, configuration.id, configurationName, toast],58);5960return (61<ConfigurationSettingsField>62<form onSubmit={updateName}>63<TextInputField64label="Display name"65hint={66<a href={configuration.cloneUrl} target="_blank" rel="noopener noreferrer" className="gp-link">67{url}68</a>69}70value={configurationName}71error={nameError.message}72onChange={setConfigurationName}73onBlur={nameError.onBlur}74/>7576<InputField label="Repository ID">77<InputWithCopy value={configuration.id} tip="Click to copy configuration ID" />78</InputField>7980<div className="flex flex-row items-center justify-start gap-2 mt-4 w-full">81<LoadingButton type="submit" disabled={!nameChanged} loading={updateConfiguration.isLoading}>82Save83</LoadingButton>84</div>85</form>86</ConfigurationSettingsField>87);88};899091