import type { IRoom, RoomAdminFieldsType } from '@rocket.chat/core-typings'; import { isRoomFederated } from '@rocket.chat/core-typings'; import { Box, Button, ButtonGroup, TextInput, Field, FieldLabel, FieldRow, FieldHint, ToggleSwitch, TextAreaInput, FieldError, } from '@rocket.chat/fuselage'; import { useStableCallback } from '@rocket.chat/fuselage-hooks'; import { ContextualbarScrollableContent, ContextualbarFooter } from '@rocket.chat/ui-client'; import { useEndpoint, useToastMessageDispatch } from '@rocket.chat/ui-contexts'; import { useId } from 'react'; import { useForm, Controller } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { useEditAdminRoomPermissions } from './useEditAdminRoomPermissions'; import RoomAvatarEditor from '../../../components/avatar/RoomAvatarEditor'; import { getDirtyFields } from '../../../lib/getDirtyFields'; import { roomCoordinator } from '../../../lib/rooms/roomCoordinator'; import { useArchiveRoom } from '../../hooks/roomActions/useArchiveRoom'; import { useDeleteRoom } from '../../hooks/roomActions/useDeleteRoom'; export type EditRoomProps = { room: IRoom; onChange: () => void; onDelete: () => void; onClose: () => void; }; type EditRoomFormData = { roomName: IRoom['name']; roomTopic: string; roomType: IRoom['t']; readOnly: boolean; isDefault: boolean; favorite: boolean; featured: boolean; reactWhenReadOnly: boolean; roomDescription: string; roomAnnouncement: string; roomAvatar: IRoom['avatarETag']; archived: boolean; }; const getInitialValues = (room: Pick): EditRoomFormData => ({ roomName: room.t === 'd' ? room.usernames?.join(' x ') : roomCoordinator.getRoomName(room.t, room), roomType: room.t, readOnly: !!room.ro, archived: !!room.archived, isDefault: !!room.default, favorite: !!room.favorite, featured: !!room.featured, reactWhenReadOnly: !!room.reactWhenReadOnly, roomTopic: room.topic ?? '', roomDescription: room.description ?? '', roomAnnouncement: room.announcement ?? '', roomAvatar: undefined, }); const EditRoom = ({ room, onChange, onDelete, onClose }: EditRoomProps) => { const { t } = useTranslation(); const dispatchToastMessage = useToastMessageDispatch(); const { control, watch, reset, handleSubmit, formState: { isDirty, errors, dirtyFields }, } = useForm({ values: getInitialValues(room) }); const { canViewName, canViewTopic, canViewAnnouncement, canViewArchived, canViewDescription, canViewType, canViewReadOnly, canViewReactWhenReadOnly, } = useEditAdminRoomPermissions(room); const { roomType, readOnly, archived, isDefault } = watch(); const changeArchiving = archived !== !!room.archived; const { handleDelete, canDeleteRoom, isDeleting } = useDeleteRoom(room, { reload: onDelete }); const saveAction = useEndpoint('POST', '/v1/rooms.saveRoomSettings'); const handleArchive = useArchiveRoom(room); const handleUpdateRoomData = useStableCallback(async ({ isDefault, favorite, ...formData }: EditRoomFormData) => { const data = getDirtyFields(formData, dirtyFields); delete data.archived; try { await saveAction({ ...data, rid: room._id, default: isDefault, favorite: { defaultValue: isDefault, favorite }, }); dispatchToastMessage({ type: 'success', message: t('Room_updated_successfully') }); onChange(); onClose(); } catch (error) { dispatchToastMessage({ type: 'error', message: error }); } }); const handleSave = useStableCallback((data: EditRoomFormData) => Promise.all([isDirty && handleUpdateRoomData(data), changeArchiving && handleArchive()].filter(Boolean)), ); const formId = useId(); const roomNameField = useId(); const ownerField = useId(); const roomDescription = useId(); const roomAnnouncement = useId(); const roomTopicField = useId(); const roomTypeField = useId(); const readOnlyField = useId(); const reactWhenReadOnly = useId(); const archivedField = useId(); const isDefaultField = useId(); const favoriteField = useId(); const featuredField = useId(); const roomIsFederated = isRoomFederated(room); return ( <> {room.t !== 'd' && ( ( )} /> )} {t('Name')} ( )} /> {errors?.roomName && ( {errors.roomName.message} )} {room.t !== 'd' && ( <> {room.u && ( {t('Owner')} )} {canViewDescription && ( {t('Description')} ( )} /> )} {canViewAnnouncement && ( {t('Announcement')} ( )} /> )} {canViewTopic && ( {t('Topic')} } /> )} {canViewType && ( {t('Private')} ( onChange(value === 'p' ? 'c' : 'p')} aria-describedby={`${roomTypeField}-hint`} /> )} /> {t('Just_invited_people_can_access_this_channel')} )} {canViewReadOnly && ( {t('Read_only')} ( )} /> {t('Only_authorized_users_can_write_new_messages')} )} {canViewReactWhenReadOnly && readOnly && ( {t('React_when_read_only')} ( )} /> {t('React_when_read_only_changed_successfully')} )} {canViewArchived && ( {t('Room_archivation_state_true')} ( )} /> )} )} {t('Default')} ( )} /> {t('Favorite')} ( )} /> {t('Featured')} ( )} /> ); }; export default EditRoom;