diff --git a/components/dashboard/src/icons/Spinner.svg b/components/dashboard/src/icons/Spinner.svg index 5ed476c64d224a..989c65996ab86b 100644 --- a/components/dashboard/src/icons/Spinner.svg +++ b/components/dashboard/src/icons/Spinner.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/components/dashboard/src/icons/SpinnerDark.svg b/components/dashboard/src/icons/SpinnerDark.svg deleted file mode 100644 index 3698f94217afc4..00000000000000 --- a/components/dashboard/src/icons/SpinnerDark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/components/dashboard/src/projects/ConfigureProject.tsx b/components/dashboard/src/projects/ConfigureProject.tsx index f173ad1b22f621..20a717e6853efa 100644 --- a/components/dashboard/src/projects/ConfigureProject.tsx +++ b/components/dashboard/src/projects/ConfigureProject.tsx @@ -13,7 +13,6 @@ import { getGitpodService } from "../service/service"; import { getCurrentTeam, TeamsContext } from "../teams/teams-context"; import Header from "../components/Header"; import Spinner from "../icons/Spinner.svg"; -import SpinnerDark from "../icons/SpinnerDark.svg"; import PrebuildLogsEmpty from "../images/prebuild-logs-empty.svg"; import PrebuildLogsEmptyDark from "../images/prebuild-logs-empty-dark.svg"; import { ThemeContext } from "../theme-context"; @@ -163,7 +162,7 @@ export default function () { } {isDetecting &&
- + Detecting project configuration ...
} @@ -177,7 +176,7 @@ export default function () { ) }
- {prebuildWasTriggered && } + {prebuildWasTriggered && }
{(prebuildInstance?.status.phase === "stopped" && !prebuildInstance?.status.conditions.failed) ? diff --git a/components/dashboard/src/projects/Prebuild.tsx b/components/dashboard/src/projects/Prebuild.tsx index 3c9e46e788c3ef..c02318c061e4c4 100644 --- a/components/dashboard/src/projects/Prebuild.tsx +++ b/components/dashboard/src/projects/Prebuild.tsx @@ -12,7 +12,6 @@ import Header from "../components/Header"; import PrebuildLogs from "../components/PrebuildLogs"; import { getGitpodService, gitpodHostUrl } from "../service/service"; import { TeamsContext, getCurrentTeam } from "../teams/teams-context"; -import { ThemeContext } from "../theme-context"; import { PrebuildInstanceStatus } from "./Prebuilds"; import { shortCommitMessage } from "./render-utils"; @@ -28,7 +27,6 @@ export default function () { const [ prebuild, setPrebuild ] = useState(); const [ prebuildInstance, setPrebuildInstance ] = useState(); - const { isDark } = useContext(ThemeContext); useEffect(() => { if (!teams || !projectName || !prebuildId) { @@ -88,7 +86,7 @@ export default function () {
- {prebuildInstance && } + {prebuildInstance && }
{prebuildInstance?.status.phase === "stopped" ? diff --git a/components/dashboard/src/projects/Prebuilds.tsx b/components/dashboard/src/projects/Prebuilds.tsx index cf106f9b0d011d..8867632149132c 100644 --- a/components/dashboard/src/projects/Prebuilds.tsx +++ b/components/dashboard/src/projects/Prebuilds.tsx @@ -5,14 +5,13 @@ */ import moment from "moment"; -import { PrebuildInfo, PrebuildWithStatus, PrebuiltWorkspaceState, Project, WorkspaceInstance } from "@gitpod/gitpod-protocol"; +import { PrebuildInfo, PrebuildWithStatus, PrebuiltWorkspaceState, Project, StartPrebuildResult, WorkspaceInstance } from "@gitpod/gitpod-protocol"; import { useContext, useEffect, useState } from "react"; import { useHistory, useLocation, useRouteMatch } from "react-router"; import Header from "../components/Header"; import DropDown, { DropDownEntry } from "../components/DropDown"; import { ItemsList, Item, ItemField, ItemFieldContextMenu } from "../components/ItemsList"; import Spinner from "../icons/Spinner.svg"; -import SpinnerDark from "../icons/SpinnerDark.svg"; import StatusDone from "../icons/StatusDone.svg"; import StatusFailed from "../icons/StatusFailed.svg"; import StatusPaused from "../icons/StatusPaused.svg"; @@ -38,6 +37,7 @@ export default function () { const [statusFilter, setStatusFilter] = useState(); const [prebuilds, setPrebuilds] = useState([]); + const [isPrebuildPending, setIsPrebuildPending] = useState(false); useEffect(() => { if (!project) { @@ -46,7 +46,8 @@ export default function () { const registration = getGitpodService().registerClient({ onPrebuildUpdate: (update: PrebuildWithStatus) => { if (update.info.projectId === project.id) { - setPrebuilds(prev => [update, ...prev.filter(p => p.info.id !== update.info.id)]) + setPrebuilds(prev => [update, ...prev.filter(p => p.info.id !== update.info.id)]); + setIsPrebuildPending(false); } } }); @@ -126,9 +127,23 @@ export default function () { history.push(`/${!!team ? 't/'+team.slug : 'projects'}/${projectName}/${pb.id}`); } - const triggerPrebuild = (branchName: string | null) => { + const triggerPrebuild = async (branchName: string | null) => { if (project) { - getGitpodService().server.triggerPrebuild(project.id, branchName); + setIsPrebuildPending(true); + try { + const result = await Promise.race([ + getGitpodService().server.triggerPrebuild(project.id, branchName), + new Promise((_, reject) => setTimeout(() => reject(new Error('Timed out while waiting for new prebuild')), 30000)), + ]) as StartPrebuildResult; + console.log('Successfully triggerred!', result); + if (result.done) { + // TODO(janx): Visually highlight the prebuild with `p.info.buildWorkspaceId === result.wsid` + setIsPrebuildPending(false); + } + } catch (error) { + console.error('Running prebuild failed!', error); + setIsPrebuildPending(false); + } } } @@ -150,7 +165,7 @@ export default function () {
- +
@@ -233,7 +248,7 @@ export function prebuildStatusIcon(status: PrebuiltWorkspaceState | undefined) { } } -export function PrebuildInstanceStatus(props: { prebuildInstance?: WorkspaceInstance, isDark?: boolean }) { +export function PrebuildInstanceStatus(props: { prebuildInstance?: WorkspaceInstance }) { let status = <>; let details = <>; switch (props.prebuildInstance?.status.phase) { @@ -244,7 +259,7 @@ export function PrebuildInstanceStatus(props: { prebuildInstance?: WorkspaceInst PENDING
; details =
- + Prebuild in progress ...
; break; @@ -259,7 +274,7 @@ export function PrebuildInstanceStatus(props: { prebuildInstance?: WorkspaceInst RUNNING
; details =
- + Prebuild in progress ...
; break;