import React from 'react'; import classNames from 'classnames'; import { SessionButton, SessionButtonColor } from '../session/SessionButton'; import { Avatar, AvatarSize } from '../Avatar'; import { SessionWrapperModal } from '../session/SessionWrapperModal'; import { SpacerMD } from '../basic/Text'; import { updateGroupNameModal } from '../../state/ducks/modalDialog'; import autoBind from 'auto-bind'; import { ConversationModel } from '../../models/conversation'; import { getConversationController } from '../../session/conversations'; import { ClosedGroup } from '../../session'; type Props = { conversationId: string; }; interface State { groupName: string; errorDisplayed: boolean; errorMessage: string; avatar: string | null; } export class UpdateGroupNameDialog extends React.Component { private readonly inputEl: any; private readonly convo: ConversationModel; constructor(props: Props) { super(props); autoBind(this); this.convo = getConversationController().get(props.conversationId); this.state = { groupName: this.convo.getName(), errorDisplayed: false, errorMessage: 'placeholder', avatar: this.convo.getAvatarPath(), }; this.inputEl = React.createRef(); } public componentDidMount() { window.addEventListener('keyup', this.onKeyUp); } public componentWillUnmount() { window.removeEventListener('keyup', this.onKeyUp); } public onClickOK() { if (!this.state.groupName.trim()) { this.onShowError(window.i18n('emptyGroupNameError')); return; } const newAvatarPath = this?.inputEl?.current?.files?.length > 0 ? this.inputEl.current.files[0] : null; // otherwise use the current avatar if (this.state.groupName !== this.convo.getName() || newAvatarPath !== this.state.avatar) { const members = this.convo.get('members') || []; void ClosedGroup.initiateGroupUpdate( this.convo.id, this.state.groupName, members, newAvatarPath ); } this.closeDialog(); } public render() { const okText = window.i18n('ok'); const cancelText = window.i18n('cancel'); const titleText = window.i18n('updateGroupDialogTitle', this.convo.getName()); const errorMsg = this.state.errorMessage; const errorMessageClasses = classNames( 'error-message', this.state.errorDisplayed ? 'error-shown' : 'error-faded' ); const isAdmin = this.convo.isPublic() ? false // disable editing of opengroup rooms as we don't handle them for now : true; return ( this.closeDialog()} additionalClassName="update-group-dialog" > {this.state.errorDisplayed ? ( <>

{errorMsg}

) : null} {this.renderAvatar()} {isAdmin ? ( ) : null}
); } private onShowError(msg: string) { if (this.state.errorDisplayed) { return; } this.setState({ errorDisplayed: true, errorMessage: msg, }); setTimeout(() => { this.setState({ errorDisplayed: false, }); }, 3000); } private onKeyUp(event: any) { switch (event.key) { case 'Enter': this.onClickOK(); break; case 'Esc': case 'Escape': this.closeDialog(); break; default: } } private closeDialog() { window.removeEventListener('keyup', this.onKeyUp); window.inboxStore?.dispatch(updateGroupNameModal(null)); } private onGroupNameChanged(event: any) { const groupName = event.target.value; this.setState(state => { return { ...state, groupName, }; }); } private renderAvatar() { const isPublic = this.convo.isPublic(); const pubkey = this.convo.id; if (!isPublic) { return undefined; } // tslint:disable: use-simple-attributes return (
{ const el = this.inputEl.current; if (el) { el.click(); } }} />
); } private onFileSelected() { const file = this.inputEl.current.files[0]; const url = window.URL.createObjectURL(file); this.setState({ avatar: url, }); } }