Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/dashboard/src/data/organizations/suggested-repositories-query.ts
2501 views
1
/**
2
* Copyright (c) 2025 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 { useQuery, useQueryClient } from "@tanstack/react-query";
8
import { useCallback } from "react";
9
import { configurationClient } from "../../service/public-api";
10
import { useCurrentOrg } from "./orgs-query";
11
import { SuggestedRepository } from "@gitpod/public-api/lib/gitpod/v1/scm_pb";
12
import { PlainMessage } from "@bufbuild/protobuf";
13
import { Configuration } from "@gitpod/public-api/lib/gitpod/v1/configuration_pb";
14
import { useOrgSettingsQuery } from "./org-settings-query";
15
16
export function useOrgRepoSuggestionsInvalidator() {
17
const organizationId = useCurrentOrg().data?.id;
18
const queryClient = useQueryClient();
19
return useCallback(() => {
20
queryClient.invalidateQueries(getQueryKey(organizationId));
21
}, [organizationId, queryClient]);
22
}
23
24
export type SuggestedOrgRepository = PlainMessage<SuggestedRepository> & {
25
orgSuggested: true;
26
configuration: Configuration;
27
};
28
29
export function useOrgSuggestedRepos() {
30
const organizationId = useCurrentOrg().data?.id;
31
const { data: orgSettings, isLoading: isOrgSettingsLoading } = useOrgSettingsQuery();
32
33
const query = useQuery<SuggestedOrgRepository[], Error>(
34
getQueryKey(organizationId),
35
async () => {
36
const repos = orgSettings?.onboardingSettings?.recommendedRepositories ?? [];
37
38
const suggestions: SuggestedOrgRepository[] = [];
39
for (const configurationId of repos) {
40
const { configuration } = await configurationClient.getConfiguration({
41
configurationId: configurationId,
42
});
43
if (!configuration) {
44
continue;
45
}
46
const suggestion: SuggestedOrgRepository = {
47
configurationId: configurationId,
48
configurationName: configuration.name ?? "",
49
repoName: configuration.name ?? "",
50
url: configuration.cloneUrl ?? "",
51
orgSuggested: true,
52
configuration,
53
};
54
55
suggestions.push(suggestion);
56
}
57
58
return suggestions;
59
},
60
{
61
enabled: !!organizationId && !isOrgSettingsLoading,
62
cacheTime: 1000 * 60 * 60 * 24 * 7, // 1 week
63
staleTime: 1000 * 60 * 5, // 5 minutes
64
},
65
);
66
return query;
67
}
68
69
export function getQueryKey(organizationId: string | undefined) {
70
return ["org-suggested-repositories", organizationId ?? "undefined"];
71
}
72
73