Skip to content

Commit d82144b

Browse files
committed
[dashboard Use public-api to CreateTeams
1 parent 43b063a commit d82144b

File tree

5 files changed

+105
-0
lines changed

5 files changed

+105
-0
lines changed

components/dashboard/BUILD.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ packages:
1717
- scripts/run-integration-tests.sh
1818
deps:
1919
- components/gitpod-protocol:lib
20+
- components/public-api/typescript:lib
2021
config:
2122
commands:
2223
build: ["yarn", "build"]

components/dashboard/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
"version": "0.0.0",
55
"private": true,
66
"dependencies": {
7+
"@bufbuild/connect-web": "^0.2.1",
78
"@gitpod/gitpod-protocol": "0.1.5",
9+
"@gitpod/public-api": "0.1.5",
810
"@stripe/react-stripe-js": "^1.7.2",
911
"@stripe/stripe-js": "^1.29.0",
1012
"configcat-js": "^6.0.0",

components/dashboard/src/projects/NewProject.tsx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import { trackEvent } from "../Analytics";
2121
import exclamation from "../images/exclamation.svg";
2222
import ErrorMessage from "../components/ErrorMessage";
2323
import Spinner from "../icons/Spinner.svg";
24+
import { teamsService } from "../service/public-api";
25+
import { getExperimentsClient } from "../experiments/client";
2426

2527
export default function NewProject() {
2628
const location = useLocation();
@@ -721,6 +723,7 @@ function GitProviders(props: {
721723

722724
function NewTeam(props: { onSuccess: (team: Team) => void }) {
723725
const { setTeams } = useContext(TeamsContext);
726+
const { user } = useContext(UserContext);
724727

725728
const [teamName, setTeamName] = useState<string | undefined>();
726729
const [error, setError] = useState<string | undefined>();
@@ -729,6 +732,37 @@ function NewTeam(props: { onSuccess: (team: Team) => void }) {
729732
if (!teamName) {
730733
return;
731734
}
735+
736+
const isExperimentalTeamsServiceEnabled = await getExperimentsClient().getValueAsync(
737+
"publicApiExperimentalTeamsService",
738+
false,
739+
{
740+
user,
741+
},
742+
);
743+
if (isExperimentalTeamsServiceEnabled) {
744+
try {
745+
const response = await teamsService.createTeam({
746+
name: teamName,
747+
});
748+
const team = response.team;
749+
setTeams(await getGitpodService().server.getTeams());
750+
751+
const mappedTeam: Team = {
752+
id: team?.id || "",
753+
name: team?.name || "",
754+
slug: team?.slug || "",
755+
creationTime: "",
756+
};
757+
props.onSuccess(mappedTeam);
758+
return;
759+
} catch (error) {
760+
console.error(error);
761+
setError(error?.message || "Failed to create new team!");
762+
return;
763+
}
764+
}
765+
732766
try {
733767
const team = await getGitpodService().server.createTeam(teamName);
734768
setTeams(await getGitpodService().server.getTeams());
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* Copyright (c) 2022 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 { createConnectTransport, createPromiseClient, Interceptor } from "@bufbuild/connect-web";
8+
9+
// Import service definition that you want to connect to.
10+
import { TeamsService } from "@gitpod/public-api/lib/gitpod/experimental/v1/teams_connectweb";
11+
import { getGitpodService } from "./service";
12+
13+
let token: string | undefined;
14+
15+
const authInterceptor: Interceptor = (next) => async (req) => {
16+
if (!token) {
17+
const newToken = await getGitpodService().server.generateNewGitpodToken({
18+
type: 1,
19+
scopes: [
20+
"function:getGitpodTokenScopes",
21+
"function:getWorkspace",
22+
"function:getWorkspaces",
23+
"function:createTeam",
24+
"function:joinTeam",
25+
"function:getTeamMembers",
26+
"function:listenForWorkspaceInstanceUpdates",
27+
"resource:default",
28+
],
29+
});
30+
token = newToken;
31+
}
32+
33+
req.header.set("Authorization", `Bearer ${token}`);
34+
return await next(req);
35+
};
36+
37+
const transport = createConnectTransport({
38+
baseUrl: `${window.location.protocol}//api.${window.location.host}`,
39+
interceptors: [authInterceptor],
40+
});
41+
42+
export const teamsService = createPromiseClient(TeamsService, transport);

components/dashboard/src/teams/NewTeam.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,41 @@ import { FormEvent, useContext, useEffect, useState } from "react";
88
import { useHistory } from "react-router-dom";
99
import { getGitpodService } from "../service/service";
1010
import { TeamsContext } from "./teams-context";
11+
import { teamsService } from "../service/public-api";
12+
import { getExperimentsClient } from "../experiments/client";
13+
import { UserContext } from "../user-context";
1114

1215
export default function () {
1316
const { setTeams } = useContext(TeamsContext);
17+
const { user } = useContext(UserContext);
1418
const history = useHistory();
1519

1620
const [creationError, setCreationError] = useState<Error>();
1721
let name = "";
1822
const createTeam = async (event: FormEvent) => {
1923
event.preventDefault();
24+
const isExperimentalTeamsServiceEnabled = await getExperimentsClient().getValueAsync(
25+
"publicApiExperimentalTeamsService",
26+
false,
27+
{
28+
user,
29+
},
30+
);
31+
if (isExperimentalTeamsServiceEnabled) {
32+
try {
33+
const response = await teamsService.createTeam({ name });
34+
const team = response.team;
35+
setTeams(await getGitpodService().server.getTeams());
36+
37+
history.push(`/t/${team!.slug}`);
38+
return;
39+
} catch (error) {
40+
console.error(error);
41+
setCreationError(error);
42+
return;
43+
}
44+
}
45+
2046
try {
2147
const team = await getGitpodService().server.createTeam(name);
2248
const teams = await getGitpodService().server.getTeams();

0 commit comments

Comments
 (0)