Path: blob/main/components/dashboard/src/data/workspaces/resolve-context-query.ts
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 { useQuery } from "@tanstack/react-query";7import {8GitInitializer,9GitInitializer_CloneTargetMode,10ParseContextURLResponse,11} from "@gitpod/public-api/lib/gitpod/v1/workspace_pb";12import { workspaceClient } from "../../service/public-api";1314export function useWorkspaceContext(contextUrl?: string) {15const query = useQuery<{16data: ParseContextURLResponse;17refererIDE?: string;18cloneUrl?: string;19revision?: string;20} | null>(21["workspace-context", contextUrl],22async () => {23if (!contextUrl) {24return null;25}26const data = await workspaceClient.parseContextURL({ contextUrl });27const commitInfo = getCommitInfo(data);28return {29data,30refererIDE: matchRefererIDE(contextUrl),31cloneUrl: commitInfo?.cloneUrl,32revision: commitInfo?.revision,33};34},35{36retry: false,37},38);39return query;40}4142// TODO: Compatible code, remove me43function getCommitInfo(response: ParseContextURLResponse | null) {44if (!response) {45return undefined;46}47const specs = response.spec?.initializer?.specs;48if (!specs || specs.length === 0) {49return undefined;50}51const gitInit: GitInitializer | undefined = specs.find((item) => item.spec.case === "git")?.spec.value as any;52if (!gitInit) {53return undefined;54}55const result: { cloneUrl: string; revision?: string } = { cloneUrl: gitInit.remoteUri };56if (gitInit.targetMode === GitInitializer_CloneTargetMode.REMOTE_BRANCH) {57result.revision = gitInit.cloneTarget;58}59return result;60}6162// TODO: Compatible code, remove me63function matchRefererIDE(url: string) {64const regex = /^\/?referrer:([^/:]*)(?::([^/]*))?\//;65const matches = regex.exec(url);66const referrerIde = matches?.[2];67return referrerIde;68}697071