Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/dashboard/src/teams/onboarding/WelcomeMessageEditor.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 type { OnboardingSettings_WelcomeMessage } from "@gitpod/public-api/lib/gitpod/v1/organization_pb";
8
import { Button } from "@podkit/buttons/Button";
9
import { LoadingButton } from "@podkit/buttons/LoadingButton";
10
import { Textarea } from "@podkit/forms/TextArea";
11
import { FormEvent, useCallback, useState } from "react";
12
import Alert from "../../components/Alert";
13
import { Modal, ModalBody, ModalFooter, ModalHeader } from "../../components/Modal";
14
import { InputField } from "../../components/forms/InputField";
15
import { TextInput } from "../../components/forms/TextInputField";
16
import { UpdateTeamSettingsOptions } from "../TeamOnboarding";
17
import { OrgMemberAvatarInput } from "./OrgMemberAvatarInput";
18
import { gitpodWelcomeSubheading } from "./WelcomeMessageConfigurationField";
19
import { UpdateOrganizationSettingsArgs } from "../../data/organizations/update-org-settings-mutation";
20
21
type Props = {
22
settings: OnboardingSettings_WelcomeMessage | undefined;
23
isLoading: boolean;
24
isOwner: boolean;
25
isOpen: boolean;
26
handleUpdateWelcomeMessage: (
27
newSettings: NonNullable<UpdateOrganizationSettingsArgs["onboardingSettings"]>["welcomeMessage"],
28
options?: UpdateTeamSettingsOptions,
29
) => Promise<void>;
30
setIsOpen: (isOpen: boolean) => void;
31
};
32
export const WelcomeMessageEditorModal = ({
33
isLoading,
34
isOwner,
35
settings,
36
isOpen,
37
handleUpdateWelcomeMessage,
38
setIsOpen,
39
}: Props) => {
40
const [message, setMessage] = useState<string | undefined>(settings?.message);
41
const [featuredMemberId, setFeaturedMemberId] = useState<string | undefined>(settings?.featuredMemberId);
42
const [error, setError] = useState<string | undefined>(undefined);
43
44
const updateWelcomeMessage = useCallback(
45
async (e: FormEvent) => {
46
e.preventDefault();
47
try {
48
await handleUpdateWelcomeMessage(
49
{
50
message,
51
featuredMemberId,
52
},
53
{
54
throwMutateError: true,
55
},
56
);
57
setIsOpen(false);
58
setError(undefined);
59
} catch (error) {
60
setError(error.message);
61
}
62
},
63
[handleUpdateWelcomeMessage, message, featuredMemberId, setIsOpen],
64
);
65
66
return (
67
<Modal onClose={() => setIsOpen(false)} visible={isOpen} containerClassName="min-[576px]:max-w-[650px]">
68
<ModalHeader>Edit welcome message</ModalHeader>
69
<ModalBody>
70
<form id="welcome-message-editor" onSubmit={updateWelcomeMessage} className="space-y-4">
71
<TextInput readOnly value="Welcome to Gitpod" className="cursor-default"></TextInput>
72
<Textarea value={gitpodWelcomeSubheading} readOnly className="cursor-default resize-none" />
73
<div className="w-full flex justify-center">
74
<OrgMemberAvatarInput settings={settings} setFeaturedMemberId={setFeaturedMemberId} />
75
</div>
76
<InputField label="Welcome message" error={undefined} className="mb-4" labelHidden>
77
<Textarea
78
className="bg-pk-surface-secondary text-pk-content-primary w-full p-4 rounded-xl min-h-[150px]"
79
value={message}
80
placeholder="Write a welcome message to your organization members. Markdown formatting is supported."
81
onChange={(e) => setMessage(e.target.value)}
82
/>
83
</InputField>
84
85
{error && (
86
<Alert type={"error"} closable={false}>
87
<p>{error}</p>
88
</Alert>
89
)}
90
</form>
91
</ModalBody>
92
<ModalFooter>
93
<Button variant="secondary" onClick={() => setIsOpen(false)}>
94
Cancel
95
</Button>
96
<LoadingButton type="submit" loading={isLoading} disabled={!isOwner} form="welcome-message-editor">
97
Save
98
</LoadingButton>
99
</ModalFooter>
100
</Modal>
101
);
102
};
103
104