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