Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/dashboard/src/repositories/detail/ConfigurationDetailPrebuilds.tsx
2501 views
1
/**
2
* Copyright (c) 2023 Gitpod GmbH. All rights reserved.
3
* Licensed under the GNU Affero General Public License (AGPL).
4
* See License.AGPL.txt in the project root for license information.
5
*/
6
7
import { FC, useCallback, useState } from "react";
8
import { Configuration } from "@gitpod/public-api/lib/gitpod/v1/configuration_pb";
9
import { ConfigurationSettingsField } from "./ConfigurationSettingsField";
10
import { Heading3, Subheading } from "@podkit/typography/Headings";
11
import { SwitchInputField } from "@podkit/switch/Switch";
12
import { PrebuildSettingsForm } from "./prebuilds/PrebuildSettingsForm";
13
import { useConfigurationMutation } from "../../data/configurations/configuration-queries";
14
import { LoadingState } from "@podkit/loading/LoadingState";
15
import { EnablePrebuildsError } from "./prebuilds/EnablePrebuildsError";
16
import { TextMuted } from "@podkit/typography/TextMuted";
17
import { Link } from "react-router-dom";
18
19
type Props = {
20
configuration: Configuration;
21
};
22
export const ConfigurationDetailPrebuilds: FC<Props> = ({ configuration }) => {
23
const updateConfiguration = useConfigurationMutation();
24
25
const [enabled, setEnabled] = useState(!!configuration.prebuildSettings?.enabled);
26
27
const updateEnabled = useCallback(
28
(newEnabled: boolean) => {
29
setEnabled(newEnabled);
30
updateConfiguration.mutate(
31
{
32
configurationId: configuration.id,
33
prebuildSettings: {
34
...configuration.prebuildSettings,
35
enabled: newEnabled,
36
},
37
},
38
{
39
onSettled(configuration) {
40
// True up local state with server state
41
if (configuration) {
42
setEnabled(configuration.prebuildSettings?.enabled ?? false);
43
} else {
44
setEnabled(false);
45
}
46
},
47
},
48
);
49
},
50
[configuration.id, configuration.prebuildSettings, updateConfiguration],
51
);
52
53
const handleReconnection = useCallback(() => {
54
updateEnabled(true);
55
}, [updateEnabled]);
56
57
return (
58
<>
59
<ConfigurationSettingsField>
60
<Heading3>Prebuilds</Heading3>
61
<Subheading className="max-w-lg">
62
Prebuilds reduce wait time for new workspaces.{" "}
63
<a
64
href="https://www.gitpod.io/docs/configure/repositories/prebuilds"
65
target="_blank"
66
rel="noreferrer"
67
className="gp-link"
68
>
69
Learn more
70
</a>
71
</Subheading>
72
73
<SwitchInputField
74
className="mt-6"
75
id="prebuilds-enabled"
76
checked={enabled}
77
onCheckedChange={updateEnabled}
78
label={configuration.prebuildSettings?.enabled ? "Prebuilds are enabled" : "Prebuilds are disabled"}
79
description={
80
<TextMuted>
81
<Link to={`/prebuilds?configurationId=${configuration.id}`} className="gp-link">
82
View prebuild history
83
</Link>
84
</TextMuted>
85
}
86
/>
87
</ConfigurationSettingsField>
88
89
{updateConfiguration.isLoading && enabled && (
90
<ConfigurationSettingsField>
91
<div className="flex flex-row gap-2 items-center text-pk-content-tertiary">
92
<LoadingState delay={false} />
93
<span>Enabling prebuilds...</span>
94
</div>
95
</ConfigurationSettingsField>
96
)}
97
98
{updateConfiguration.isError && (
99
<EnablePrebuildsError error={updateConfiguration.error} onReconnect={handleReconnection} />
100
)}
101
102
{enabled && !updateConfiguration.isLoading && !updateConfiguration.isError && (
103
<PrebuildSettingsForm configuration={configuration} />
104
)}
105
</>
106
);
107
};
108
109