Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/dashboard/src/teams/onboarding/WelcomeMessageConfigurationField.tsx
2501 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 { useCallback, useState } from "react";
10
import { InputField } from "../../components/forms/InputField";
11
import { useToast } from "../../components/toasts/Toasts";
12
import { useIsOwner } from "../../data/organizations/members-query";
13
import { useOrgSettingsQuery } from "../../data/organizations/org-settings-query";
14
import {
15
UpdateOrganizationSettingsArgs,
16
useUpdateOrgSettingsMutation,
17
} from "../../data/organizations/update-org-settings-mutation";
18
import { ConfigurationSettingsField } from "../../repositories/detail/ConfigurationSettingsField";
19
import { UpdateTeamSettingsOptions } from "../TeamOnboarding";
20
import { WelcomeMessageEditorModal } from "./WelcomeMessageEditor";
21
import { WelcomeMessagePreview } from "./WelcomeMessagePreview";
22
23
export const gitpodWelcomeSubheading =
24
`With Gitpod, you'll start coding instantly in a pre-configured environment that matches your team's setup, giving you the freedom to focus on what matters most: writing great code.` as const;
25
26
type Props = {
27
handleUpdateTeamSettings: (
28
newSettings: UpdateOrganizationSettingsArgs,
29
options?: UpdateTeamSettingsOptions,
30
) => Promise<void>;
31
};
32
export const WelcomeMessageConfigurationField = ({ handleUpdateTeamSettings }: Props) => {
33
const { data: settings } = useOrgSettingsQuery();
34
const { toast } = useToast();
35
const isOwner = useIsOwner();
36
const updateTeamSettings = useUpdateOrgSettingsMutation();
37
38
const [welcomeMessageEditorOpen, setWelcomeMessageEditorOpen] = useState(false);
39
40
const handleUpdateWelcomeMessage = useCallback(
41
async (
42
newSettings: NonNullable<UpdateOrganizationSettingsArgs["onboardingSettings"]>["welcomeMessage"],
43
options?: UpdateTeamSettingsOptions,
44
) => {
45
await handleUpdateTeamSettings(
46
{
47
onboardingSettings: {
48
welcomeMessage: newSettings,
49
},
50
},
51
options,
52
);
53
},
54
[handleUpdateTeamSettings],
55
);
56
57
return (
58
<ConfigurationSettingsField>
59
<Heading3>Welcome message</Heading3>
60
<Subheading>
61
A welcome message to your organization members. This message will be shown to your organization members
62
once they sign up and join your organization.
63
</Subheading>
64
65
<InputField
66
label="Enabled"
67
hint={<>Enable showing the message to new organization members.</>}
68
id="show-welcome-message"
69
>
70
<SwitchInputField
71
id="show-welcome-message"
72
checked={settings?.onboardingSettings?.welcomeMessage?.enabled ?? false}
73
disabled={!isOwner || updateTeamSettings.isLoading}
74
onCheckedChange={(checked) => {
75
if (checked) {
76
if (!settings?.onboardingSettings?.welcomeMessage?.message) {
77
toast("Please set up a welcome message first.");
78
return;
79
}
80
}
81
82
handleUpdateWelcomeMessage({ enabled: checked });
83
}}
84
label=""
85
/>
86
</InputField>
87
88
<WelcomeMessageEditorModal
89
isLoading={updateTeamSettings.isLoading}
90
isOwner={isOwner}
91
isOpen={welcomeMessageEditorOpen}
92
setIsOpen={setWelcomeMessageEditorOpen}
93
handleUpdateWelcomeMessage={handleUpdateWelcomeMessage}
94
settings={settings?.onboardingSettings?.welcomeMessage}
95
/>
96
97
<span className="text-pk-content-secondary text-sm">
98
Here's a preview of the welcome message that will be shown to your organization members:
99
</span>
100
<WelcomeMessagePreview
101
setWelcomeMessageEditorOpen={setWelcomeMessageEditorOpen}
102
disabled={!isOwner || updateTeamSettings.isLoading}
103
/>
104
</ConfigurationSettingsField>
105
);
106
};
107
108