import type { IMessage, IRoom, IUser } from '@rocket.chat/core-typings'; import { Modal, Field, FieldGroup, ToggleSwitch, TextInput, TextAreaInput, Button, Icon, Box, FieldHint, FieldLabel, FieldRow, FieldError, ModalHeader, ModalTitle, ModalClose, ModalContent, ModalFooter, ModalFooterControllers, } from '@rocket.chat/fuselage'; import { useTranslation, useEndpoint } from '@rocket.chat/ui-contexts'; import { useMutation } from '@tanstack/react-query'; import { useId } from 'react'; import type { ReactElement } from 'react'; import { useForm, Controller } from 'react-hook-form'; import { goToRoomById } from '../../lib/utils/goToRoomById'; import { useEncryptedRoomDescription } from '../../navbar/NavBarPagesGroup/actions/useEncryptedRoomDescription'; import RoomAutoComplete from '../RoomAutoComplete'; import UserAutoCompleteMultiple from '../UserAutoCompleteMultiple'; import DefaultParentRoomField from './DefaultParentRoomField'; type CreateDiscussionFormValues = { name: string; parentRoom: IRoom['_id']; encrypted: boolean; usernames: Array; firstMessage: string; topic: string; }; type CreateDiscussionProps = { parentMessageId?: IMessage['_id']; onClose: () => void; defaultParentRoom?: IRoom['_id']; nameSuggestion?: string; }; // TODO: Replace `Modal` in favor of `GenericModal` const CreateDiscussion = ({ onClose, defaultParentRoom, parentMessageId, nameSuggestion }: CreateDiscussionProps): ReactElement => { const t = useTranslation(); const { formState: { errors }, handleSubmit, control, watch, } = useForm({ mode: 'onBlur', defaultValues: { name: nameSuggestion || '', parentRoom: '', encrypted: false, usernames: [], firstMessage: '', topic: '', }, }); const { encrypted } = watch(); const createDiscussion = useEndpoint('POST', '/v1/rooms.createDiscussion'); const createDiscussionMutation = useMutation({ mutationFn: createDiscussion, onSuccess: ({ discussion }) => { goToRoomById(discussion._id); onClose(); }, }); const handleCreate = async ({ name, parentRoom, encrypted, usernames, firstMessage, topic }: CreateDiscussionFormValues) => { createDiscussionMutation.mutate({ prid: defaultParentRoom || parentRoom, t_name: name, users: usernames, reply: encrypted ? undefined : firstMessage, topic, ...(parentMessageId && { pmid: parentMessageId }), }); }; const getEncryptedHint = useEncryptedRoomDescription('discussion'); const parentRoomId = useId(); const encryptedId = useId(); const discussionNameId = useId(); const membersId = useId(); const firstMessageId = useId(); const topicId = useId(); const modalId = useId(); return ( } > {t('Discussion_title')} {t('Discussion_description')} {t('Discussion_target_channel')} {defaultParentRoom && ( } /> )} {!defaultParentRoom && ( ( )} /> )} {errors.parentRoom && ( {errors.parentRoom.message} )} {t('Name')} ( } /> )} /> {errors.name && ( {errors.name.message} )} {t('Topic')} } /> {t('Displayed_next_to_name')} {t('Members')} ( )} /> {t('Discussion_first_message_title')} ( )} /> {encrypted ? ( {t('Discussion_first_message_disabled_due_to_e2e')} ) : ( {t('First_message_hint')} )} {t('Encrypted')} } /> {getEncryptedHint({ isPrivate: true, encrypted })} ); }; export default CreateDiscussion;