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