Path: blob/main/components/dashboard/src/teams/onboarding/WelcomeMessageEditor.tsx
2501 views
/**1* Copyright (c) 2025 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56import type { OnboardingSettings_WelcomeMessage } from "@gitpod/public-api/lib/gitpod/v1/organization_pb";7import { Button } from "@podkit/buttons/Button";8import { LoadingButton } from "@podkit/buttons/LoadingButton";9import { Textarea } from "@podkit/forms/TextArea";10import { FormEvent, useCallback, useState } from "react";11import Alert from "../../components/Alert";12import { Modal, ModalBody, ModalFooter, ModalHeader } from "../../components/Modal";13import { InputField } from "../../components/forms/InputField";14import { TextInput } from "../../components/forms/TextInputField";15import { UpdateTeamSettingsOptions } from "../TeamOnboarding";16import { OrgMemberAvatarInput } from "./OrgMemberAvatarInput";17import { gitpodWelcomeSubheading } from "./WelcomeMessageConfigurationField";18import { UpdateOrganizationSettingsArgs } from "../../data/organizations/update-org-settings-mutation";1920type Props = {21settings: OnboardingSettings_WelcomeMessage | undefined;22isLoading: boolean;23isOwner: boolean;24isOpen: boolean;25handleUpdateWelcomeMessage: (26newSettings: NonNullable<UpdateOrganizationSettingsArgs["onboardingSettings"]>["welcomeMessage"],27options?: UpdateTeamSettingsOptions,28) => Promise<void>;29setIsOpen: (isOpen: boolean) => void;30};31export const WelcomeMessageEditorModal = ({32isLoading,33isOwner,34settings,35isOpen,36handleUpdateWelcomeMessage,37setIsOpen,38}: Props) => {39const [message, setMessage] = useState<string | undefined>(settings?.message);40const [featuredMemberId, setFeaturedMemberId] = useState<string | undefined>(settings?.featuredMemberId);41const [error, setError] = useState<string | undefined>(undefined);4243const updateWelcomeMessage = useCallback(44async (e: FormEvent) => {45e.preventDefault();46try {47await handleUpdateWelcomeMessage(48{49message,50featuredMemberId,51},52{53throwMutateError: true,54},55);56setIsOpen(false);57setError(undefined);58} catch (error) {59setError(error.message);60}61},62[handleUpdateWelcomeMessage, message, featuredMemberId, setIsOpen],63);6465return (66<Modal onClose={() => setIsOpen(false)} visible={isOpen} containerClassName="min-[576px]:max-w-[650px]">67<ModalHeader>Edit welcome message</ModalHeader>68<ModalBody>69<form id="welcome-message-editor" onSubmit={updateWelcomeMessage} className="space-y-4">70<TextInput readOnly value="Welcome to Gitpod" className="cursor-default"></TextInput>71<Textarea value={gitpodWelcomeSubheading} readOnly className="cursor-default resize-none" />72<div className="w-full flex justify-center">73<OrgMemberAvatarInput settings={settings} setFeaturedMemberId={setFeaturedMemberId} />74</div>75<InputField label="Welcome message" error={undefined} className="mb-4" labelHidden>76<Textarea77className="bg-pk-surface-secondary text-pk-content-primary w-full p-4 rounded-xl min-h-[150px]"78value={message}79placeholder="Write a welcome message to your organization members. Markdown formatting is supported."80onChange={(e) => setMessage(e.target.value)}81/>82</InputField>8384{error && (85<Alert type={"error"} closable={false}>86<p>{error}</p>87</Alert>88)}89</form>90</ModalBody>91<ModalFooter>92<Button variant="secondary" onClick={() => setIsOpen(false)}>93Cancel94</Button>95<LoadingButton type="submit" loading={isLoading} disabled={!isOwner} form="welcome-message-editor">96Save97</LoadingButton>98</ModalFooter>99</Modal>100);101};102103104