Path: blob/main/components/dashboard/src/repositories/detail/ConfigurationDetailPrebuilds.tsx
2501 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 { Configuration } from "@gitpod/public-api/lib/gitpod/v1/configuration_pb";8import { ConfigurationSettingsField } from "./ConfigurationSettingsField";9import { Heading3, Subheading } from "@podkit/typography/Headings";10import { SwitchInputField } from "@podkit/switch/Switch";11import { PrebuildSettingsForm } from "./prebuilds/PrebuildSettingsForm";12import { useConfigurationMutation } from "../../data/configurations/configuration-queries";13import { LoadingState } from "@podkit/loading/LoadingState";14import { EnablePrebuildsError } from "./prebuilds/EnablePrebuildsError";15import { TextMuted } from "@podkit/typography/TextMuted";16import { Link } from "react-router-dom";1718type Props = {19configuration: Configuration;20};21export const ConfigurationDetailPrebuilds: FC<Props> = ({ configuration }) => {22const updateConfiguration = useConfigurationMutation();2324const [enabled, setEnabled] = useState(!!configuration.prebuildSettings?.enabled);2526const updateEnabled = useCallback(27(newEnabled: boolean) => {28setEnabled(newEnabled);29updateConfiguration.mutate(30{31configurationId: configuration.id,32prebuildSettings: {33...configuration.prebuildSettings,34enabled: newEnabled,35},36},37{38onSettled(configuration) {39// True up local state with server state40if (configuration) {41setEnabled(configuration.prebuildSettings?.enabled ?? false);42} else {43setEnabled(false);44}45},46},47);48},49[configuration.id, configuration.prebuildSettings, updateConfiguration],50);5152const handleReconnection = useCallback(() => {53updateEnabled(true);54}, [updateEnabled]);5556return (57<>58<ConfigurationSettingsField>59<Heading3>Prebuilds</Heading3>60<Subheading className="max-w-lg">61Prebuilds reduce wait time for new workspaces.{" "}62<a63href="https://www.gitpod.io/docs/configure/repositories/prebuilds"64target="_blank"65rel="noreferrer"66className="gp-link"67>68Learn more69</a>70</Subheading>7172<SwitchInputField73className="mt-6"74id="prebuilds-enabled"75checked={enabled}76onCheckedChange={updateEnabled}77label={configuration.prebuildSettings?.enabled ? "Prebuilds are enabled" : "Prebuilds are disabled"}78description={79<TextMuted>80<Link to={`/prebuilds?configurationId=${configuration.id}`} className="gp-link">81View prebuild history82</Link>83</TextMuted>84}85/>86</ConfigurationSettingsField>8788{updateConfiguration.isLoading && enabled && (89<ConfigurationSettingsField>90<div className="flex flex-row gap-2 items-center text-pk-content-tertiary">91<LoadingState delay={false} />92<span>Enabling prebuilds...</span>93</div>94</ConfigurationSettingsField>95)}9697{updateConfiguration.isError && (98<EnablePrebuildsError error={updateConfiguration.error} onReconnect={handleReconnection} />99)}100101{enabled && !updateConfiguration.isLoading && !updateConfiguration.isError && (102<PrebuildSettingsForm configuration={configuration} />103)}104</>105);106};107108109