Path: blob/main/components/dashboard/src/repositories/detail/general/ManageRepoSuggestion.tsx
2502 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 { SwitchInputField } from "@podkit/switch/Switch";7import { Heading3, Subheading } from "@podkit/typography/Headings";8import { FC, useCallback } from "react";9import { InputField } from "../../../components/forms/InputField";10import PillLabel from "../../../components/PillLabel";11import { useToast } from "../../../components/toasts/Toasts";12import { useOrgSettingsQuery } from "../../../data/organizations/org-settings-query";13import { useUpdateOrgSettingsMutation } from "../../../data/organizations/update-org-settings-mutation";14import { useId } from "../../../hooks/useId";15import { ConfigurationSettingsField } from "../ConfigurationSettingsField";16import { Configuration } from "@gitpod/public-api/lib/gitpod/v1/configuration_pb";17import { SquareArrowOutUpRight } from "lucide-react";1819type Props = {20configuration: Configuration;21};22export const ManageRepoSuggestion: FC<Props> = ({ configuration }) => {23const { data: orgSettings } = useOrgSettingsQuery();24const { toast } = useToast();25const updateTeamSettings = useUpdateOrgSettingsMutation();26const updateRecommendedRepository = useCallback(27async (configurationId: string, suggested: boolean) => {28const newRepositories = new Set(orgSettings?.onboardingSettings?.recommendedRepositories ?? []);29if (suggested) {30newRepositories.add(configurationId);31} else {32newRepositories.delete(configurationId);33}3435await updateTeamSettings.mutateAsync(36{37onboardingSettings: {38recommendedRepositories: [...newRepositories],39},40},41{42onError: (error) => {43toast(`Failed to update recommended repositories: ${error.message}`);44},45},46);47},48[orgSettings?.onboardingSettings?.recommendedRepositories, toast, updateTeamSettings],49);5051const isSuggested = orgSettings?.onboardingSettings?.recommendedRepositories?.includes(configuration.id);5253const inputId = useId({ prefix: "suggested-repository" });5455return (56<ConfigurationSettingsField>57<Heading3 className="flex flex-row items-center gap-2">58Mark this repository as{" "}59<PillLabel className="capitalize bg-kumquat-light shrink-0 text-sm hidden xl:block" type="warn">60Suggested61</PillLabel>62</Heading3>63<Subheading className="max-w-lg flex flex-col gap-2">64The Suggested section highlights recommended repositories on the dashboard for new members, making it65easier to find and start working on key projects in Gitpod.66<a67className="gp-link flex flex-row items-center gap-1"68href="https://www.gitpod.io/docs/configure/orgs/onboarding#suggested-repositories"69target="_blank"70rel="noreferrer"71>72Learn about suggestions73<SquareArrowOutUpRight size={12} />74</a>75</Subheading>76<InputField id={inputId}>77<SwitchInputField78id={inputId}79checked={isSuggested}80disabled={updateTeamSettings.isLoading}81onCheckedChange={(checked) => {82updateRecommendedRepository(configuration.id, checked);83}}84label={isSuggested ? "Listed in “Suggested”" : "Not listed in “Suggested”"}85/>86</InputField>87</ConfigurationSettingsField>88);89};909192