Skip to content

Commit 5009281

Browse files
committed
Improve welcome message configuration with error handling
- Extract UpdateTeamSettingsOptions type for consistent error handling - Move gitpodWelcomeSubheading to WelcomeMessageConfigurationField - Add error state and handling in WelcomeMessageEditor - Refactor update methods to support optional error throwing Tool: gitpod/catfood.gitpod.cloud
1 parent aff357b commit 5009281

File tree

3 files changed

+54
-23
lines changed

3 files changed

+54
-23
lines changed

components/dashboard/src/teams/TeamOnboarding.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,14 @@ import { LoadingState } from "@podkit/loading/LoadingState";
2626
import { Table, TableHeader, TableRow, TableHead, TableBody } from "@podkit/tables/Table";
2727
import { WelcomeMessageConfigurationField } from "./onboarding/WelcomeMessageConfigurationField";
2828

29-
export const gitpodWelcomeSubheading =
30-
`Gitpod’s sandboxed, ephemeral development environments enable you to use your existing tools without worrying about vulnerabilities impacting their local machines.` as const;
29+
export type UpdateTeamSettingsOptions = {
30+
throwMutateError?: boolean;
31+
};
3132

3233
export default function TeamOnboardingPage() {
3334
useDocumentTitle("Organization Settings - Onboarding");
3435
const { toast } = useToast();
35-
const org = useCurrentOrg().data;
36+
const { data: org } = useCurrentOrg();
3637
const isOwner = useIsOwner();
3738

3839
const { data: settings } = useOrgSettingsQuery();
@@ -43,7 +44,7 @@ export default function TeamOnboardingPage() {
4344
const [internalLink, setInternalLink] = useState<string | undefined>(undefined);
4445

4546
const handleUpdateTeamSettings = useCallback(
46-
async (newSettings: Partial<PlainMessage<OrganizationSettings>>, options?: { throwMutateError?: boolean }) => {
47+
async (newSettings: Partial<PlainMessage<OrganizationSettings>>, options?: UpdateTeamSettingsOptions) => {
4748
if (!org?.id) {
4849
throw new Error("no organization selected");
4950
}

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

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,15 @@ import type {
2020
OrganizationSettings,
2121
} from "@gitpod/public-api/lib/gitpod/v1/organization_pb";
2222
import { PlainMessage } from "@bufbuild/protobuf";
23+
import { UpdateTeamSettingsOptions } from "../TeamOnboarding";
24+
25+
export const gitpodWelcomeSubheading =
26+
`Gitpod’s sandboxed, ephemeral development environments enable you to use your existing tools without worrying about vulnerabilities impacting their local machines.` as const;
2327

2428
type Props = {
2529
handleUpdateTeamSettings: (
2630
newSettings: Partial<PlainMessage<OrganizationSettings>>,
27-
options?: { throwMutateError?: boolean },
31+
options?: UpdateTeamSettingsOptions,
2832
) => Promise<void>;
2933
};
3034
export const WelcomeMessageConfigurationField = ({ handleUpdateTeamSettings }: Props) => {
@@ -36,16 +40,19 @@ export const WelcomeMessageConfigurationField = ({ handleUpdateTeamSettings }: P
3640
const [welcomeMessageEditorOpen, setWelcomeMessageEditorOpen] = useState(false);
3741

3842
const handleUpdateWelcomeMessage = useCallback(
39-
async (newSettings: PlainMessage<OnboardingSettings_WelcomeMessage>) => {
40-
await handleUpdateTeamSettings({
41-
onboardingSettings: {
42-
welcomeMessage: {
43-
...settings?.onboardingSettings?.welcomeMessage,
44-
...newSettings,
43+
async (newSettings: PlainMessage<OnboardingSettings_WelcomeMessage>, options?: UpdateTeamSettingsOptions) => {
44+
await handleUpdateTeamSettings(
45+
{
46+
onboardingSettings: {
47+
welcomeMessage: {
48+
...settings?.onboardingSettings?.welcomeMessage,
49+
...newSettings,
50+
},
51+
recommendedRepositories: settings?.onboardingSettings?.recommendedRepositories ?? [],
4552
},
46-
recommendedRepositories: settings?.onboardingSettings?.recommendedRepositories ?? [],
4753
},
48-
});
54+
options,
55+
);
4956
},
5057
[
5158
handleUpdateTeamSettings,

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

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,27 @@
66

77
import { PlainMessage } from "@bufbuild/protobuf";
88
import type { OnboardingSettings_WelcomeMessage } from "@gitpod/public-api/lib/gitpod/v1/organization_pb";
9+
import { Button } from "@podkit/buttons/Button";
10+
import { LoadingButton } from "@podkit/buttons/LoadingButton";
911
import { Textarea } from "@podkit/forms/TextArea";
1012
import { FormEvent, useCallback, useState } from "react";
1113
import { Modal, ModalBody, ModalFooter, ModalHeader } from "../../components/Modal";
1214
import { InputField } from "../../components/forms/InputField";
1315
import { TextInput } from "../../components/forms/TextInputField";
14-
import { gitpodWelcomeSubheading } from "../TeamOnboarding";
15-
import { Button } from "@podkit/buttons/Button";
16-
import { LoadingButton } from "@podkit/buttons/LoadingButton";
1716
import { OrgMemberAvatarInput } from "./OrgMemberAvatarInput";
17+
import { gitpodWelcomeSubheading } from "./WelcomeMessageConfigurationField";
18+
import { UpdateTeamSettingsOptions } from "../TeamOnboarding";
19+
import Alert from "../../components/Alert";
1820

1921
type Props = {
2022
settings: OnboardingSettings_WelcomeMessage | undefined;
2123
isLoading: boolean;
2224
isOwner: boolean;
2325
isOpen: boolean;
24-
handleUpdateWelcomeMessage: (newSettings: PlainMessage<OnboardingSettings_WelcomeMessage>) => Promise<void>;
26+
handleUpdateWelcomeMessage: (
27+
newSettings: PlainMessage<OnboardingSettings_WelcomeMessage>,
28+
options?: UpdateTeamSettingsOptions,
29+
) => Promise<void>;
2530
setIsOpen: (isOpen: boolean) => void;
2631
};
2732
export const WelcomeMessageEditorModal = ({
@@ -34,17 +39,29 @@ export const WelcomeMessageEditorModal = ({
3439
}: Props) => {
3540
const [message, setMessage] = useState<string | undefined>(settings?.message);
3641
const [featuredMemberId, setFeaturedMemberId] = useState<string | undefined>(settings?.featuredMemberId);
42+
const [error, setError] = useState<string | undefined>(undefined);
3743

3844
const updateWelcomeMessage = useCallback(
3945
async (e: FormEvent) => {
4046
e.preventDefault();
41-
await handleUpdateWelcomeMessage({
42-
message,
43-
featuredMemberId,
44-
enabled: settings?.enabled ?? false,
45-
});
47+
try {
48+
await handleUpdateWelcomeMessage(
49+
{
50+
message,
51+
featuredMemberId,
52+
enabled: settings?.enabled ?? false,
53+
},
54+
{
55+
throwMutateError: true,
56+
},
57+
);
58+
setIsOpen(false);
59+
setError(undefined);
60+
} catch (error) {
61+
setError(error.message);
62+
}
4663
},
47-
[handleUpdateWelcomeMessage, message, featuredMemberId, settings?.enabled],
64+
[handleUpdateWelcomeMessage, message, featuredMemberId, settings?.enabled, setIsOpen],
4865
);
4966

5067
return (
@@ -65,6 +82,12 @@ export const WelcomeMessageEditorModal = ({
6582
onChange={(e) => setMessage(e.target.value)}
6683
/>
6784
</InputField>
85+
86+
{error && (
87+
<Alert type={"error"} closable={false}>
88+
<p>{error}</p>
89+
</Alert>
90+
)}
6891
</form>
6992
</ModalBody>
7093
<ModalFooter>

0 commit comments

Comments
 (0)