Path: blob/main/components/dashboard/src/data/organizations/suggested-repositories-query.ts
2501 views
/**1* Copyright (c) 2025 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, useQueryClient } from "@tanstack/react-query";7import { useCallback } from "react";8import { configurationClient } from "../../service/public-api";9import { useCurrentOrg } from "./orgs-query";10import { SuggestedRepository } from "@gitpod/public-api/lib/gitpod/v1/scm_pb";11import { PlainMessage } from "@bufbuild/protobuf";12import { Configuration } from "@gitpod/public-api/lib/gitpod/v1/configuration_pb";13import { useOrgSettingsQuery } from "./org-settings-query";1415export function useOrgRepoSuggestionsInvalidator() {16const organizationId = useCurrentOrg().data?.id;17const queryClient = useQueryClient();18return useCallback(() => {19queryClient.invalidateQueries(getQueryKey(organizationId));20}, [organizationId, queryClient]);21}2223export type SuggestedOrgRepository = PlainMessage<SuggestedRepository> & {24orgSuggested: true;25configuration: Configuration;26};2728export function useOrgSuggestedRepos() {29const organizationId = useCurrentOrg().data?.id;30const { data: orgSettings, isLoading: isOrgSettingsLoading } = useOrgSettingsQuery();3132const query = useQuery<SuggestedOrgRepository[], Error>(33getQueryKey(organizationId),34async () => {35const repos = orgSettings?.onboardingSettings?.recommendedRepositories ?? [];3637const suggestions: SuggestedOrgRepository[] = [];38for (const configurationId of repos) {39const { configuration } = await configurationClient.getConfiguration({40configurationId: configurationId,41});42if (!configuration) {43continue;44}45const suggestion: SuggestedOrgRepository = {46configurationId: configurationId,47configurationName: configuration.name ?? "",48repoName: configuration.name ?? "",49url: configuration.cloneUrl ?? "",50orgSuggested: true,51configuration,52};5354suggestions.push(suggestion);55}5657return suggestions;58},59{60enabled: !!organizationId && !isOrgSettingsLoading,61cacheTime: 1000 * 60 * 60 * 24 * 7, // 1 week62staleTime: 1000 * 60 * 5, // 5 minutes63},64);65return query;66}6768export function getQueryKey(organizationId: string | undefined) {69return ["org-suggested-repositories", organizationId ?? "undefined"];70}717273