Skip to content

Commit d32f465

Browse files
committed
Org settings partial updates improvements (#20626)
Tool: gitpod/catfood.gitpod.cloud
1 parent c07687f commit d32f465

File tree

14 files changed

+813
-747
lines changed

14 files changed

+813
-747
lines changed

components/dashboard/src/data/organizations/org-settings-query.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,6 @@ export function useOrgSettingsQuery() {
3636
);
3737
}
3838

39-
function getQueryKey(organizationId?: string) {
39+
export function getQueryKey(organizationId?: string) {
4040
return ["getOrganizationSettings", organizationId || "undefined"];
4141
}

components/dashboard/src/data/organizations/suggested-repositories-query.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66

77
import { useQuery, useQueryClient } from "@tanstack/react-query";
88
import { useCallback } from "react";
9-
import { configurationClient, organizationClient } from "../../service/public-api";
9+
import { configurationClient } from "../../service/public-api";
1010
import { useCurrentOrg } from "./orgs-query";
1111
import { SuggestedRepository } from "@gitpod/public-api/lib/gitpod/v1/scm_pb";
1212
import { PlainMessage } from "@bufbuild/protobuf";
1313
import { Configuration } from "@gitpod/public-api/lib/gitpod/v1/configuration_pb";
14+
import { useOrgSettingsQuery } from "./org-settings-query";
1415

1516
export function useOrgRepoSuggestionsInvalidator() {
1617
const organizationId = useCurrentOrg().data?.id;
@@ -27,13 +28,12 @@ export type SuggestedOrgRepository = PlainMessage<SuggestedRepository> & {
2728

2829
export function useOrgSuggestedRepos() {
2930
const organizationId = useCurrentOrg().data?.id;
31+
const orgSettings = useOrgSettingsQuery();
32+
3033
const query = useQuery<SuggestedOrgRepository[], Error>(
3134
getQueryKey(organizationId),
3235
async () => {
33-
const response = await organizationClient.getOrganizationSettings({
34-
organizationId,
35-
});
36-
const repos = response.settings?.onboardingSettings?.recommendedRepositories ?? [];
36+
const repos = orgSettings.data?.onboardingSettings?.recommendedRepositories ?? [];
3737

3838
const suggestions: SuggestedOrgRepository[] = [];
3939
for (const configurationId of repos) {

components/dashboard/src/data/organizations/update-org-settings-mutation.ts

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

7-
import { useMutation } from "@tanstack/react-query";
8-
import { useOrgSettingsQueryInvalidator } from "./org-settings-query";
7+
import { useMutation, useQueryClient } from "@tanstack/react-query";
8+
import { getQueryKey, useOrgSettingsQueryInvalidator } from "./org-settings-query";
99
import { useCurrentOrg } from "./orgs-query";
1010
import { organizationClient } from "../../service/public-api";
1111
import {
@@ -24,6 +24,8 @@ export const useUpdateOrgSettingsMutation = () => {
2424
const invalidateOrgSettings = useOrgSettingsQueryInvalidator();
2525
const invalidateWorkspaceClasses = useOrgWorkspaceClassesQueryInvalidator();
2626
const invalidateOrgRepoSuggestions = useOrgRepoSuggestionsInvalidator();
27+
28+
const queryClient = useQueryClient();
2729
const organizationId = org?.id ?? "";
2830

2931
return useMutation<OrganizationSettings, Error, UpdateOrganizationSettingsArgs>({
@@ -44,13 +46,18 @@ export const useUpdateOrgSettingsMutation = () => {
4446
}
4547
}
4648

47-
const settings = await organizationClient.updateOrganizationSettings(update);
48-
return settings.settings!;
49+
const { settings } = await organizationClient.updateOrganizationSettings(update);
50+
return settings!;
4951
},
50-
onSuccess: () => {
51-
invalidateOrgSettings();
52+
onSuccess: (settings) => {
5253
invalidateWorkspaceClasses();
5354
invalidateOrgRepoSuggestions();
55+
56+
if (settings) {
57+
queryClient.setQueryData(getQueryKey(organizationId), settings);
58+
} else {
59+
invalidateOrgSettings();
60+
}
5461
},
5562
onError: (err) => {
5663
if (!ErrorCode.isUserError((err as any)?.["code"])) {

components/dashboard/src/teams/TeamOnboarding.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,7 @@ export default function TeamOnboardingPage() {
5353
throw new Error("no organization settings change permission");
5454
}
5555
try {
56-
await updateTeamSettings.mutateAsync({
57-
...newSettings,
58-
});
56+
await updateTeamSettings.mutateAsync(newSettings);
5957
toast("Organization settings updated");
6058
} catch (error) {
6159
if (options?.throwMutateError) {

components/dashboard/src/teams/onboarding/OrgMemberAvatarInput.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export const OrgMemberAvatarInput = ({ settings, setFeaturedMemberId }: Props) =
2626
const handleSelectionChange = useCallback(
2727
(selectedId: string) => {
2828
const member = members?.find((m) => m.userId === selectedId);
29-
setFeaturedMemberId(selectedId || undefined);
29+
setFeaturedMemberId(selectedId);
3030
setAvatarUrl(member?.avatarUrl);
3131
},
3232
[members, setFeaturedMemberId],

components/dashboard/src/teams/onboarding/WelcomeMessageConfigurationField.tsx

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

7-
import { PlainMessage } from "@bufbuild/protobuf";
8-
import type { OnboardingSettings_WelcomeMessage } from "@gitpod/public-api/lib/gitpod/v1/organization_pb";
97
import { SwitchInputField } from "@podkit/switch/Switch";
108
import { Heading3, Subheading } from "@podkit/typography/Headings";
119
import { useCallback, useState } from "react";
@@ -40,20 +38,20 @@ export const WelcomeMessageConfigurationField = ({ handleUpdateTeamSettings }: P
4038
const [welcomeMessageEditorOpen, setWelcomeMessageEditorOpen] = useState(false);
4139

4240
const handleUpdateWelcomeMessage = useCallback(
43-
async (newSettings: PlainMessage<OnboardingSettings_WelcomeMessage>, options?: UpdateTeamSettingsOptions) => {
41+
async (
42+
newSettings: NonNullable<UpdateOrganizationSettingsArgs["onboardingSettings"]>["welcomeMessage"],
43+
options?: UpdateTeamSettingsOptions,
44+
) => {
4445
await handleUpdateTeamSettings(
4546
{
4647
onboardingSettings: {
47-
welcomeMessage: {
48-
...settings?.onboardingSettings?.welcomeMessage,
49-
...newSettings,
50-
},
48+
welcomeMessage: newSettings,
5149
},
5250
},
5351
options,
5452
);
5553
},
56-
[handleUpdateTeamSettings, settings?.onboardingSettings?.welcomeMessage],
54+
[handleUpdateTeamSettings],
5755
);
5856

5957
return (

components/dashboard/src/teams/onboarding/WelcomeMessageEditor.tsx

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

7-
import { PlainMessage } from "@bufbuild/protobuf";
87
import type { OnboardingSettings_WelcomeMessage } from "@gitpod/public-api/lib/gitpod/v1/organization_pb";
98
import { Button } from "@podkit/buttons/Button";
109
import { LoadingButton } from "@podkit/buttons/LoadingButton";
@@ -17,14 +16,15 @@ import { TextInput } from "../../components/forms/TextInputField";
1716
import { UpdateTeamSettingsOptions } from "../TeamOnboarding";
1817
import { OrgMemberAvatarInput } from "./OrgMemberAvatarInput";
1918
import { gitpodWelcomeSubheading } from "./WelcomeMessageConfigurationField";
19+
import { UpdateOrganizationSettingsArgs } from "../../data/organizations/update-org-settings-mutation";
2020

2121
type Props = {
2222
settings: OnboardingSettings_WelcomeMessage | undefined;
2323
isLoading: boolean;
2424
isOwner: boolean;
2525
isOpen: boolean;
2626
handleUpdateWelcomeMessage: (
27-
newSettings: PlainMessage<OnboardingSettings_WelcomeMessage>,
27+
newSettings: NonNullable<UpdateOrganizationSettingsArgs["onboardingSettings"]>["welcomeMessage"],
2828
options?: UpdateTeamSettingsOptions,
2929
) => Promise<void>;
3030
setIsOpen: (isOpen: boolean) => void;
@@ -49,7 +49,6 @@ export const WelcomeMessageEditorModal = ({
4949
{
5050
message,
5151
featuredMemberId,
52-
enabled: settings?.enabled ?? false,
5352
},
5453
{
5554
throwMutateError: true,
@@ -61,7 +60,7 @@ export const WelcomeMessageEditorModal = ({
6160
setError(error.message);
6261
}
6362
},
64-
[handleUpdateWelcomeMessage, message, featuredMemberId, settings?.enabled, setIsOpen],
63+
[handleUpdateWelcomeMessage, message, featuredMemberId, setIsOpen],
6564
);
6665

6766
return (

components/public-api/gitpod/v1/organization.proto

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ message RoleRestrictionEntry {
5353
message OnboardingSettings {
5454
message WelcomeMessage {
5555
// enabled specifies whether the welcome message is enabled
56-
bool enabled = 1;
56+
optional bool enabled = 1;
5757

5858
// message is the welcome message for the organization
5959
optional string message = 2;

0 commit comments

Comments
 (0)