Skip to content

Commit 1c03bb2

Browse files
committed
[dashboard Use public-api to CreateTeams
1 parent 4c3007a commit 1c03bb2

File tree

6 files changed

+103
-1
lines changed

6 files changed

+103
-1
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/contexts/FeatureFlagContext.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@ const FeatureFlagContext = createContext<{
1919
showPersistentVolumeClaimUI: boolean;
2020
showUsageView: boolean;
2121
showUseLastSuccessfulPrebuild: boolean;
22+
usePublicApiTeamsService: boolean;
2223
}>({
2324
showPersistentVolumeClaimUI: false,
2425
showUsageView: false,
2526
showUseLastSuccessfulPrebuild: false,
27+
usePublicApiTeamsService: false,
2628
});
2729

2830
const FeatureFlagContextProvider: React.FC = ({ children }) => {
@@ -34,6 +36,7 @@ const FeatureFlagContextProvider: React.FC = ({ children }) => {
3436
const [showPersistentVolumeClaimUI, setShowPersistentVolumeClaimUI] = useState<boolean>(false);
3537
const [showUsageView, setShowUsageView] = useState<boolean>(false);
3638
const [showUseLastSuccessfulPrebuild, setShowUseLastSuccessfulPrebuild] = useState<boolean>(false);
39+
const [usePublicApiTeamsService, setUsePublicApiTeamsService] = useState<boolean>(false);
3740

3841
useEffect(() => {
3942
if (!user) return;
@@ -42,6 +45,7 @@ const FeatureFlagContextProvider: React.FC = ({ children }) => {
4245
persistent_volume_claim: { defaultValue: true, setter: setShowPersistentVolumeClaimUI },
4346
usage_view: { defaultValue: false, setter: setShowUsageView },
4447
showUseLastSuccessfulPrebuild: { defaultValue: false, setter: setShowUseLastSuccessfulPrebuild },
48+
usePublicApiTeamsService: { defaultValue: false, setter: setUsePublicApiTeamsService },
4549
};
4650
for (const [flagName, config] of Object.entries(featureFlags)) {
4751
if (teams) {
@@ -74,7 +78,12 @@ const FeatureFlagContextProvider: React.FC = ({ children }) => {
7478

7579
return (
7680
<FeatureFlagContext.Provider
77-
value={{ showPersistentVolumeClaimUI, showUsageView, showUseLastSuccessfulPrebuild }}
81+
value={{
82+
showPersistentVolumeClaimUI,
83+
showUsageView,
84+
showUseLastSuccessfulPrebuild,
85+
usePublicApiTeamsService,
86+
}}
7887
>
7988
{children}
8089
</FeatureFlagContext.Provider>

components/dashboard/src/projects/NewProject.tsx

Lines changed: 27 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 { FeatureFlagContext } from "../contexts/FeatureFlagContext";
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 { usePublicApiTeamsService } = useContext(FeatureFlagContext);
724727

725728
const [teamName, setTeamName] = useState<string | undefined>();
726729
const [error, setError] = useState<string | undefined>();
@@ -729,6 +732,30 @@ function NewTeam(props: { onSuccess: (team: Team) => void }) {
729732
if (!teamName) {
730733
return;
731734
}
735+
736+
if (usePublicApiTeamsService) {
737+
try {
738+
const response = await teamsService.createTeam({
739+
name: teamName,
740+
});
741+
const team = response.team;
742+
setTeams(await getGitpodService().server.getTeams());
743+
744+
const mappedTeam: Team = {
745+
id: team?.id || "",
746+
name: team?.name || "",
747+
slug: team?.slug || "",
748+
creationTime: "",
749+
};
750+
props.onSuccess(mappedTeam);
751+
return;
752+
} catch (error) {
753+
console.error(error);
754+
setError(error?.message || "Failed to create new team!");
755+
return;
756+
}
757+
}
758+
732759
try {
733760
const team = await getGitpodService().server.createTeam(teamName);
734761
setTeams(await getGitpodService().server.getTeams());
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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:getGenericInvite",
27+
"function:listenForWorkspaceInstanceUpdates",
28+
"resource:default",
29+
],
30+
});
31+
token = newToken;
32+
}
33+
34+
req.header.set("Authorization", `Bearer ${token}`);
35+
return await next(req);
36+
};
37+
38+
const transport = createConnectTransport({
39+
baseUrl: `${window.location.protocol}//api.${window.location.host}`,
40+
interceptors: [authInterceptor],
41+
});
42+
43+
export const teamsService = createPromiseClient(TeamsService, transport);

components/dashboard/src/teams/NewTeam.tsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,35 @@ 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 { FeatureFlagContext } from "../contexts/FeatureFlagContext";
1113

1214
export default function () {
1315
const { setTeams } = useContext(TeamsContext);
16+
const { usePublicApiTeamsService } = useContext(FeatureFlagContext);
17+
1418
const history = useHistory();
1519

1620
const [creationError, setCreationError] = useState<Error>();
1721
let name = "";
1822
const createTeam = async (event: FormEvent) => {
1923
event.preventDefault();
24+
25+
if (usePublicApiTeamsService) {
26+
try {
27+
const response = await teamsService.createTeam({ name });
28+
const team = response.team;
29+
setTeams(await getGitpodService().server.getTeams());
30+
31+
history.push(`/t/${team!.slug}`);
32+
return;
33+
} catch (error) {
34+
console.error(error);
35+
setCreationError(error);
36+
return;
37+
}
38+
}
39+
2040
try {
2141
const team = await getGitpodService().server.createTeam(name);
2242
const teams = await getGitpodService().server.getTeams();

0 commit comments

Comments
 (0)