Skip to content

Commit cad078c

Browse files
committed
WIP
1 parent a8f060e commit cad078c

File tree

10 files changed

+158
-148
lines changed

10 files changed

+158
-148
lines changed

components/dashboard/src/components/AuthorizeGit.tsx

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@
44
* See License.AGPL.txt in the project root for license information.
55
*/
66

7-
import { AuthProviderInfo } from "@gitpod/gitpod-protocol";
87
import { FC, useCallback, useContext } from "react";
98
import { Link } from "react-router-dom";
10-
import { useAuthProviders } from "../data/auth-providers/auth-provider-query";
9+
import { useAuthProviderDescriptions } from "../data/auth-providers/auth-provider-query";
1110
import { openAuthorizeWindow } from "../provider-utils";
1211
import { getGitpodService } from "../service/service";
1312
import { UserContext, useCurrentUser } from "../user-context";
@@ -16,29 +15,29 @@ import { Heading2, Heading3, Subheading } from "./typography/headings";
1615
import classNames from "classnames";
1716
import { iconForAuthProvider, simplifyProviderName } from "../provider-utils";
1817
import { useIsOwner } from "../data/organizations/members-query";
18+
import { AuthProviderDescription } from "@gitpod/public-api/lib/gitpod/v1/authprovider_pb";
1919

2020
export function useNeedsGitAuthorization() {
21-
const authProviders = useAuthProviders();
21+
const authProviders = useAuthProviderDescriptions();
2222
const user = useCurrentUser();
2323
if (!user || !authProviders.data) {
2424
return false;
2525
}
26-
return !authProviders.data.some((ap) => user.identities.some((i) => ap.authProviderId === i.authProviderId));
26+
return !authProviders.data.some((ap) => user.identities.some((i) => ap.id === i.authProviderId));
2727
}
2828

2929
export const AuthorizeGit: FC<{ className?: string }> = ({ className }) => {
3030
const { setUser } = useContext(UserContext);
3131
const owner = useIsOwner();
32-
const authProviders = useAuthProviders();
32+
const authProviders = useAuthProviderDescriptions();
3333
const updateUser = useCallback(() => {
3434
getGitpodService().server.getLoggedInUser().then(setUser);
3535
}, [setUser]);
3636

3737
const connect = useCallback(
38-
(ap: AuthProviderInfo) => {
38+
(ap: AuthProviderDescription) => {
3939
openAuthorizeWindow({
4040
host: ap.host,
41-
scopes: ap.requirements?.default,
4241
overrideScopes: true,
4342
onSuccess: updateUser,
4443
});
@@ -91,7 +90,7 @@ export const AuthorizeGit: FC<{ className?: string }> = ({ className }) => {
9190
className="mt-3 btn-login flex-none w-56 px-0 py-0.5 inline-flex"
9291
>
9392
<div className="flex relative -left-4 w-56">
94-
{iconForAuthProvider(ap.authProviderType)}
93+
{iconForAuthProvider(ap.type)}
9594
<span className="pt-2 pb-2 mr-3 text-sm my-auto font-medium truncate overflow-ellipsis">
9695
Continue with {simplifyProviderName(ap.host)}
9796
</span>

components/dashboard/src/components/RepositoryFinder.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import { ReactComponent as RepositoryIcon } from "../icons/RepositoryWithColor.s
1111
import { SuggestedRepository } from "@gitpod/gitpod-protocol";
1212
import { MiddleDot } from "./typography/MiddleDot";
1313
import { useUnifiedRepositorySearch } from "../data/git-providers/unified-repositories-search-query";
14-
import { useAuthProviders } from "../data/auth-providers/auth-provider-query";
14+
import { useAuthProviderDescriptions } from "../data/auth-providers/auth-provider-query";
1515
import { ReactComponent as Exclamation2 } from "../images/exclamation2.svg";
16+
import { AuthProviderType } from "@gitpod/public-api/lib/gitpod/v1/authprovider_pb";
1617

1718
interface RepositoryFinderProps {
1819
selectedContextURL?: string;
@@ -39,7 +40,7 @@ export default function RepositoryFinder({
3940
hasMore,
4041
} = useUnifiedRepositorySearch({ searchString, excludeProjects });
4142

42-
const authProviders = useAuthProviders();
43+
const authProviders = useAuthProviderDescriptions();
4344

4445
const handleSelectionChange = useCallback(
4546
(selectedID: string) => {
@@ -115,7 +116,10 @@ export default function RepositoryFinder({
115116
isSelectable: false,
116117
} as ComboboxElement);
117118
}
118-
if (searchString.length >= 3 && authProviders.data?.some((p) => p.authProviderType === "BitbucketServer")) {
119+
if (
120+
searchString.length >= 3 &&
121+
authProviders.data?.some((p) => p.type === AuthProviderType.BITBUCKET_SERVER)
122+
) {
119123
// add an element that tells the user that the Bitbucket Server does only support prefix search
120124
result.push({
121125
id: "bitbucket-server",

components/dashboard/src/data/auth-providers/auth-provider-query.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,14 @@
44
* See License.AGPL.txt in the project root for license information.
55
*/
66

7-
import { AuthProviderInfo } from "@gitpod/gitpod-protocol";
87
import { useQuery } from "@tanstack/react-query";
9-
import { getGitpodService } from "../../service/service";
108
import { authProviderClient } from "../../service/public-api";
119
import { useCurrentUser } from "../../user-context";
1210
import {
1311
AuthProviderDescription,
1412
ListAuthProviderDescriptionsRequest,
1513
} from "@gitpod/public-api/lib/gitpod/v1/authprovider_pb";
1614

17-
export const useAuthProviders = () => {
18-
return useQuery<AuthProviderInfo[]>({
19-
queryKey: ["auth-providers"],
20-
queryFn: async () => {
21-
return await getGitpodService().server.getAuthProviders();
22-
},
23-
});
24-
};
25-
2615
export const useAuthProviderDescriptions = () => {
2716
const user = useCurrentUser();
2817
const query = useQuery<AuthProviderDescription[]>({

components/dashboard/src/projects/NewProject.tsx

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* See License.AGPL.txt in the project root for license information.
55
*/
66

7-
import { AuthProviderInfo, Project } from "@gitpod/gitpod-protocol";
7+
import { Project } from "@gitpod/gitpod-protocol";
88
import { FC, useCallback, useContext, useEffect, useMemo, useState } from "react";
99
import ErrorMessage from "../components/ErrorMessage";
1010
import { useCurrentOrg } from "../data/organizations/orgs-query";
@@ -13,19 +13,20 @@ import { iconForAuthProvider, openAuthorizeWindow, simplifyProviderName } from "
1313
import { getGitpodService } from "../service/service";
1414
import { UserContext, useCurrentUser } from "../user-context";
1515
import { Heading1, Subheading } from "../components/typography/headings";
16-
import { useAuthProviders } from "../data/auth-providers/auth-provider-query";
16+
import { useAuthProviderDescriptions } from "../data/auth-providers/auth-provider-query";
1717
import { AuthorizeGit, useNeedsGitAuthorization } from "../components/AuthorizeGit";
1818
import { NewProjectRepoSelection } from "./new-project/NewProjectRepoSelection";
1919
import { NewProjectSubheading } from "./new-project/NewProjectSubheading";
2020
import { Button } from "../components/Button";
21+
import { AuthProviderDescription, AuthProviderType } from "@gitpod/public-api/lib/gitpod/v1/authprovider_pb";
2122

2223
export default function NewProject() {
2324
const currentTeam = useCurrentOrg()?.data;
2425
const user = useCurrentUser();
25-
const authProviders = useAuthProviders();
26+
const authProviders = useAuthProviderDescriptions();
2627

2728
// State this component manages
28-
const [selectedProvider, setSelectedProvider] = useState<AuthProviderInfo>();
29+
const [selectedProvider, setSelectedProvider] = useState<AuthProviderDescription>();
2930
const [project, setProject] = useState<Project>();
3031

3132
// Defaults selectedProviderHost if not set yet
@@ -34,9 +35,7 @@ export default function NewProject() {
3435
for (let i = user.identities.length - 1; i >= 0; i--) {
3536
const candidate = user.identities[i];
3637
if (candidate) {
37-
const authProvider = authProviders.data.find(
38-
(ap) => ap.authProviderId === candidate.authProviderId,
39-
);
38+
const authProvider = authProviders.data.find((ap) => ap.id === candidate.authProviderId);
4039
if (authProvider) {
4140
setSelectedProvider(authProvider);
4241
break;
@@ -107,8 +106,8 @@ export default function NewProject() {
107106
}
108107

109108
type NewProjectMainContentProps = {
110-
selectedProvider?: AuthProviderInfo;
111-
onProviderSelected: (ap: AuthProviderInfo, updateUser?: boolean) => void;
109+
selectedProvider?: AuthProviderDescription;
110+
onProviderSelected: (ap: AuthProviderDescription, updateUser?: boolean) => void;
112111
onProjectCreated: (project: Project) => void;
113112
};
114113
const NewProjectMainContent: FC<NewProjectMainContentProps> = ({
@@ -117,12 +116,12 @@ const NewProjectMainContent: FC<NewProjectMainContentProps> = ({
117116
onProjectCreated,
118117
}) => {
119118
const { setUser } = useContext(UserContext);
120-
const authProviders = useAuthProviders();
119+
const authProviders = useAuthProviderDescriptions();
121120
const needsGitAuth = useNeedsGitAuthorization();
122121
const [showGitProviders, setShowGitProviders] = useState(false);
123122

124123
const onGitProviderSeleted = useCallback(
125-
async (ap: AuthProviderInfo, updateUser?: boolean) => {
124+
async (ap: AuthProviderDescription, updateUser?: boolean) => {
126125
// TODO: Can we push this down into where sends updateUser=true?
127126
if (updateUser) {
128127
setUser(await getGitpodService().server.getLoggedInUser());
@@ -151,23 +150,22 @@ const NewProjectMainContent: FC<NewProjectMainContentProps> = ({
151150
};
152151

153152
const GitProviders: FC<{
154-
authProviders: AuthProviderInfo[];
155-
onProviderSelected: (ap: AuthProviderInfo, updateUser?: boolean) => void;
153+
authProviders: AuthProviderDescription[];
154+
onProviderSelected: (ap: AuthProviderDescription, updateUser?: boolean) => void;
156155
}> = ({ authProviders, onProviderSelected }) => {
157156
const [errorMessage, setErrorMessage] = useState<string | undefined>(undefined);
158157

159158
const selectProvider = useCallback(
160-
async (ap: AuthProviderInfo) => {
159+
async (ap: AuthProviderDescription) => {
161160
setErrorMessage(undefined);
162161

163162
const token = await getGitpodService().server.getToken({ host: ap.host });
164-
if (token && !(ap.authProviderType === "GitHub" && !token.scopes.includes("repo"))) {
163+
if (token && !(ap.type === AuthProviderType.GITHUB && !token.scopes.includes("repo"))) {
165164
onProviderSelected(ap);
166165
return;
167166
}
168167
await openAuthorizeWindow({
169168
host: ap.host,
170-
scopes: ap.authProviderType === "GitHub" ? ["repo"] : ap.requirements?.default,
171169
onSuccess: async () => {
172170
onProviderSelected(ap, true);
173171
},
@@ -194,10 +192,10 @@ const GitProviders: FC<{
194192
() =>
195193
authProviders.filter(
196194
(p) =>
197-
p.authProviderType === "GitHub" ||
195+
p.type === AuthProviderType.GITHUB ||
198196
p.host === "bitbucket.org" ||
199-
p.authProviderType === "GitLab" ||
200-
p.authProviderType === "BitbucketServer",
197+
p.type === AuthProviderType.GITLAB ||
198+
p.type === AuthProviderType.BITBUCKET_SERVER,
201199
),
202200
[authProviders],
203201
);
@@ -216,7 +214,7 @@ const GitProviders: FC<{
216214
className="btn-login flex-none w-56 h-10 p-0 inline-flex"
217215
onClick={() => selectProvider(ap)}
218216
>
219-
{iconForAuthProvider(ap.authProviderType)}
217+
{iconForAuthProvider(ap.type)}
220218
<span className="pt-2 pb-2 mr-3 text-sm my-auto font-medium truncate overflow-ellipsis">
221219
Continue with {simplifyProviderName(ap.host)}
222220
</span>

components/dashboard/src/projects/new-project/NewProjectAuthRequired.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66

77
import { FC, useCallback } from "react";
8-
import { useAuthProviders } from "../../data/auth-providers/auth-provider-query";
8+
import { useAuthProviderDescriptions } from "../../data/auth-providers/auth-provider-query";
99
import { openAuthorizeWindow } from "../../provider-utils";
1010

1111
type Props = {
@@ -18,7 +18,7 @@ export const NewProjectAuthRequired: FC<Props> = ({
1818
areGitHubWebhooksUnauthorized = false,
1919
onReconfigure,
2020
}) => {
21-
const authProviders = useAuthProviders();
21+
const authProviders = useAuthProviderDescriptions();
2222

2323
const handleAuthorize = useCallback(() => {
2424
const ap = authProviders.data?.find((ap) => ap.host === selectedProviderHost);
@@ -27,12 +27,8 @@ export const NewProjectAuthRequired: FC<Props> = ({
2727
}
2828
openAuthorizeWindow({
2929
host: ap.host,
30-
scopes: ap.authProviderType === "GitHub" ? ["repo"] : ap.requirements?.default,
3130
onSuccess: async () => {
32-
// TODO: Verify this works correctly
33-
if (ap.authProviderType === "GitHub") {
34-
authProviders.refetch();
35-
}
31+
authProviders.refetch();
3632
},
3733
onError: (payload) => {
3834
console.error("Authorization failed", selectedProviderHost, payload);

components/dashboard/src/projects/new-project/NewProjectRepoSelection.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* See License.AGPL.txt in the project root for license information.
55
*/
66

7-
import { AuthProviderInfo, Project } from "@gitpod/gitpod-protocol";
7+
import { Project } from "@gitpod/gitpod-protocol";
88
import { FC, useCallback, useEffect, useMemo, useState } from "react";
99
import { useAreGithubWebhooksUnauthorized, useIsGithubAppEnabled } from "../../data/git-providers/github-queries";
1010
import { LinkButton } from "../../components/LinkButton";
@@ -22,9 +22,10 @@ import { NewProjectCreateFromURL } from "./NewProjectCreateFromURL";
2222
import { useStateWithDebounce } from "../../hooks/use-state-with-debounce";
2323
import { useFeatureFlag } from "../../data/featureflag-query";
2424
import Alert from "../../components/Alert";
25+
import { AuthProviderDescription, AuthProviderType } from "@gitpod/public-api/lib/gitpod/v1/authprovider_pb";
2526

2627
type Props = {
27-
selectedProvider?: AuthProviderInfo;
28+
selectedProvider?: AuthProviderDescription;
2829
onProjectCreated: (project: Project) => void;
2930
onChangeGitProvider: () => void;
3031
};
@@ -59,7 +60,7 @@ export const NewProjectRepoSelection: FC<Props> = ({ selectedProvider, onProject
5960
// Memoized & derived values
6061
const noReposAvailable = !!(reposInAccounts?.length === 0 || areGitHubWebhooksUnauthorized);
6162
const isGitHub = selectedProvider?.host === "github.com";
62-
const isBitbucketServer = selectedProvider?.authProviderType === "BitbucketServer";
63+
const isBitbucketServer = selectedProvider?.type === AuthProviderType.BITBUCKET_SERVER;
6364
const enableBBSIncrementalSearch = isBitbucketServer && newProjectIncrementalRepoSearchBBS;
6465

6566
const accounts = useMemo(() => {

components/dashboard/src/provider-utils.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,21 @@ function iconForAuthProvider(type: string | AuthProviderType) {
2929
}
3030
}
3131

32+
export function toAuthProviderLabel(type: AuthProviderType) {
33+
switch (type) {
34+
case AuthProviderType.GITHUB:
35+
return "GitHub";
36+
case AuthProviderType.GITLAB:
37+
return "GitLab";
38+
case AuthProviderType.BITBUCKET:
39+
return "Bitbucket Cloud";
40+
case AuthProviderType.BITBUCKET_SERVER:
41+
return "Bitbucket Server";
42+
default:
43+
return "Unknown type";
44+
}
45+
}
46+
3247
function simplifyProviderName(host: string) {
3348
switch (host) {
3449
case "github.com":

components/dashboard/src/user-settings/AuthEntryItem.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@
44
* See License.AGPL.txt in the project root for license information.
55
*/
66

7-
import { AuthProviderInfo } from "@gitpod/gitpod-protocol";
87
import { useState } from "react";
98
import { ContextMenuEntry } from "../components/ContextMenu";
109
import { Item, ItemFieldIcon, ItemField, ItemFieldContextMenu } from "../components/ItemsList";
10+
import { AuthProviderDescription } from "@gitpod/public-api/lib/gitpod/v1/authprovider_pb";
1111

1212
interface AuthEntryItemParams {
13-
ap: AuthProviderInfo;
13+
ap: AuthProviderDescription;
1414
isConnected: (authProviderId: string) => boolean;
1515
getUsername: (authProviderId: string) => string | undefined;
1616
getPermissions: (authProviderId: string) => string[] | undefined;
17-
gitProviderMenu: (provider: AuthProviderInfo) => ContextMenuEntry[];
17+
gitProviderMenu: (provider: AuthProviderDescription) => ContextMenuEntry[];
1818
}
1919

2020
export const AuthEntryItem = (props: AuthEntryItemParams) => {
@@ -25,32 +25,32 @@ export const AuthEntryItem = (props: AuthEntryItemParams) => {
2525
};
2626

2727
return (
28-
<Item key={"ap-" + props.ap.authProviderId} className="h-16" solid={menuVisible}>
28+
<Item key={"ap-" + props.ap.id} className="h-16" solid={menuVisible}>
2929
<ItemFieldIcon>
3030
<div
3131
className={
3232
"rounded-full w-3 h-3 text-sm align-middle m-auto " +
33-
(props.isConnected(props.ap.authProviderId) ? "bg-green-500" : "bg-gray-400")
33+
(props.isConnected(props.ap.id) ? "bg-green-500" : "bg-gray-400")
3434
}
3535
>
3636
&nbsp;
3737
</div>
3838
</ItemFieldIcon>
3939
<ItemField className="w-4/12 xl:w-3/12 flex flex-col my-auto">
40-
<span className="my-auto font-medium truncate overflow-ellipsis">{props.ap.authProviderType}</span>
40+
<span className="my-auto font-medium truncate overflow-ellipsis">{props.ap.type}</span>
4141
<span className="text-sm my-auto text-gray-400 truncate overflow-ellipsis dark:text-gray-500">
4242
{props.ap.host}
4343
</span>
4444
</ItemField>
4545
<ItemField className="w-6/12 xl:w-3/12 flex flex-col my-auto">
4646
<span className="my-auto truncate text-gray-500 overflow-ellipsis dark:text-gray-400">
47-
{props.getUsername(props.ap.authProviderId) || "–"}
47+
{props.getUsername(props.ap.id) || "–"}
4848
</span>
4949
<span className="text-sm my-auto text-gray-400 dark:text-gray-500">Username</span>
5050
</ItemField>
5151
<ItemField className="hidden xl:w-1/3 xl:flex xl:flex-col my-auto">
5252
<span className="my-auto truncate text-gray-500 overflow-ellipsis dark:text-gray-400">
53-
{props.getPermissions(props.ap.authProviderId)?.join(", ") || "–"}
53+
{props.getPermissions(props.ap.id)?.join(", ") || "–"}
5454
</span>
5555
<span className="text-sm my-auto text-gray-400 dark:text-gray-500">Permissions</span>
5656
</ItemField>

0 commit comments

Comments
 (0)