import React from 'react'; import classNames from 'classnames'; import { SessionModal } from '../session/SessionModal'; import { SessionButton, SessionButtonColor } from '../session/SessionButton'; import { Avatar, AvatarSize } from '../Avatar'; import { DefaultTheme, withTheme } from 'styled-components'; import { SessionWrapperModal } from '../session/SessionWrapperModal'; interface Props { titleText: string; pubkey: string; isPublic: boolean; groupName: string; okText: string; cancelText: string; isAdmin: boolean; i18n: any; onSubmit: any; onClose: any; // avatar stuff avatarPath: string; theme: DefaultTheme; } interface State { groupName: string; errorDisplayed: boolean; errorMessage: string; avatar: string; } class UpdateGroupNameDialogInner extends React.Component { private readonly inputEl: any; constructor(props: any) { super(props); this.onClickOK = this.onClickOK.bind(this); this.onKeyUp = this.onKeyUp.bind(this); this.closeDialog = this.closeDialog.bind(this); this.onFileSelected = this.onFileSelected.bind(this); this.onGroupNameChanged = this.onGroupNameChanged.bind(this); this.state = { groupName: this.props.groupName, errorDisplayed: false, errorMessage: 'placeholder', avatar: this.props.avatarPath, }; this.inputEl = React.createRef(); window.addEventListener('keyup', this.onKeyUp); } public onClickOK() { const { i18n, onSubmit } = this.props; if (!this.state.groupName.trim()) { this.onShowError(i18n('emptyGroupNameError')); return; } const avatar = this?.inputEl?.current?.files?.length > 0 ? this.inputEl.current.files[0] : null; // otherwise use the current avatar onSubmit(this.state.groupName, avatar); this.closeDialog(); } public render() { const { okText, cancelText } = this.props; const titleText = `${this.props.titleText}`; const errorMsg = this.state.errorMessage; const errorMessageClasses = classNames( 'error-message', this.state.errorDisplayed ? 'error-shown' : 'error-faded' ); return ( this.closeDialog()} theme={this.props.theme} >

{errorMsg}

{this.renderAvatar()}
); } 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); this.props.onClose(); } private onGroupNameChanged(event: any) { const groupName = event.target.value; this.setState(state => { return { ...state, groupName, }; }); } private renderAvatar() { const avatarPath = this.state.avatar; const isPublic = this.props.isPublic; if (!isPublic) { return undefined; } 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, }); } } export const UpdateGroupNameDialog = withTheme(UpdateGroupNameDialogInner);