Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/dashboard/src/prebuilds/list/RunPrebuildModal.tsx
2501 views
1
/**
2
* Copyright (c) 2024 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, useMemo, useState } from "react";
8
import Modal, { ModalBody, ModalFooter, ModalFooterAlert, ModalHeader } from "../../components/Modal";
9
import RepositoryFinder from "../../components/RepositoryFinder";
10
import { InputField } from "../../components/forms/InputField";
11
import { AuthorizeGit, useNeedsGitAuthorization } from "../../components/AuthorizeGit";
12
import { LoadingButton } from "@podkit/buttons/LoadingButton";
13
import { Button } from "@podkit/buttons/Button";
14
import { useTriggerPrebuildMutation } from "../../data/prebuilds/prebuild-queries";
15
import { SuggestedRepository } from "@gitpod/public-api/lib/gitpod/v1/scm_pb";
16
import { useConfiguration } from "../../data/configurations/configuration-queries";
17
import { Link } from "react-router-dom";
18
import { repositoriesRoutes } from "../../repositories/repositories.routes";
19
import { TextInputField } from "../../components/forms/TextInputField";
20
import { ApplicationError } from "@gitpod/gitpod-protocol/lib/messaging/error";
21
22
type Props = {
23
defaultRepositoryId?: string;
24
onRun: (prebuildId: string) => void;
25
onClose: () => void;
26
};
27
export const RunPrebuildModal: FC<Props> = ({ defaultRepositoryId: defaultConfigurationId, onClose, onRun }) => {
28
const needsGitAuth = useNeedsGitAuthorization();
29
const [selectedRepo, setSelectedRepo] = useState<SuggestedRepository>();
30
const [branchName, setBranchName] = useState<string>();
31
32
const [createErrorMsg, setCreateErrorMsg] = useState<JSX.Element | undefined>();
33
const configurationId = useMemo(
34
() => selectedRepo?.configurationId ?? defaultConfigurationId,
35
[defaultConfigurationId, selectedRepo?.configurationId],
36
);
37
38
const triggerPrebuildMutation = useTriggerPrebuildMutation(configurationId, branchName);
39
const [isTriggeringNewPrebuild, setTriggeringNewPrebuild] = useState(false);
40
const triggerPrebuild = useCallback(async () => {
41
try {
42
setTriggeringNewPrebuild(true);
43
await triggerPrebuildMutation.mutateAsync(undefined, {
44
onSuccess: (newPrebuildId) => {
45
onRun(newPrebuildId);
46
onClose();
47
},
48
onError: (error) => {
49
if (error instanceof ApplicationError) {
50
setCreateErrorMsg(<>Failed to trigger prebuild: {error.message}</>);
51
}
52
},
53
onSettled: () => {
54
setTriggeringNewPrebuild(false);
55
},
56
});
57
} catch (error) {
58
console.error("Could not trigger prebuild", error);
59
}
60
}, [onClose, onRun, triggerPrebuildMutation]);
61
62
const { data: configuration } = useConfiguration(configurationId);
63
64
const handleSubmit = useCallback(() => {
65
if (!configurationId) {
66
setCreateErrorMsg(<>Please select a repository</>);
67
return;
68
}
69
70
if (!configuration?.prebuildSettings?.enabled) {
71
if (configuration?.id)
72
setCreateErrorMsg(
73
<>
74
Prebuilds have to be enabled for this repository. Enable them in the{" "}
75
<Link className="underline" to={repositoriesRoutes.PrebuildsSettings(configuration.id)}>
76
Prebuild settings
77
</Link>{" "}
78
first.
79
</>,
80
);
81
return;
82
}
83
84
triggerPrebuild();
85
}, [configuration, configurationId, triggerPrebuild]);
86
87
return (
88
<Modal visible onClose={onClose} onSubmit={handleSubmit}>
89
<ModalHeader>Run a prebuild</ModalHeader>
90
<ModalBody>
91
<div className="w-112 max-w-full flex flex-col">
92
{needsGitAuth ? (
93
<AuthorizeGit />
94
) : (
95
<>
96
<InputField className="w-full">
97
<RepositoryFinder
98
selectedContextURL={selectedRepo?.url}
99
selectedConfigurationId={configurationId}
100
onChange={setSelectedRepo}
101
onlyConfigurations
102
/>
103
</InputField>
104
<TextInputField
105
label="Branch"
106
hint={
107
<>
108
Leaving this blank will result in running your prebuild on the repository's
109
default branch.
110
</>
111
}
112
value={branchName}
113
onChange={setBranchName}
114
disabled={isTriggeringNewPrebuild}
115
/>
116
</>
117
)}
118
</div>
119
</ModalBody>
120
<ModalFooter
121
alert={
122
createErrorMsg && (
123
<ModalFooterAlert type="danger" onClose={() => setCreateErrorMsg(undefined)}>
124
{createErrorMsg}
125
</ModalFooterAlert>
126
)
127
}
128
>
129
<Button variant="secondary" onClick={onClose}>
130
Cancel
131
</Button>
132
<LoadingButton type="submit" loading={isTriggeringNewPrebuild}>
133
Run prebuild
134
</LoadingButton>
135
</ModalFooter>
136
</Modal>
137
);
138
};
139
140