diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 68b24d2b6..6be052d18 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -290,6 +290,14 @@ onInviteFriends: () => { window.Whisper.events.trigger('inviteFriends', this.model); }, + + onShowUserDetails: (pubkey) => { + if (this.model.isPrivate()) { + window.Whisper.events.trigger('onShowUserDetails', { + userPubKey: pubkey, + }); + } + }, }; }; this.titleView = new Whisper.ReactWrapperView({ diff --git a/ts/components/Avatar.tsx b/ts/components/Avatar.tsx index a400af605..18fe80757 100644 --- a/ts/components/Avatar.tsx +++ b/ts/components/Avatar.tsx @@ -17,6 +17,7 @@ interface Props { size: number; borderColor?: string; borderWidth?: number; + onAvatarClick?: () => void; } interface State { @@ -25,11 +26,13 @@ interface State { export class Avatar extends React.PureComponent { public handleImageErrorBound: () => void; + public onAvatarClickBound: () => void; public constructor(props: Props) { super(props); this.handleImageErrorBound = this.handleImageError.bind(this); + this.onAvatarClickBound = this.onAvatarClick.bind(this); this.state = { imageBroken: false, @@ -171,12 +174,19 @@ export class Avatar extends React.PureComponent { hasImage ? 'module-avatar--with-image' : 'module-avatar--no-image', !hasImage ? `module-avatar--${color}` : null )} + onClick={this.onAvatarClickBound} > {hasImage ? this.renderAvatarOrIdenticon() : this.renderNoImage()} ); } + private onAvatarClick() { + if (this.props.onAvatarClick) { + this.props.onAvatarClick() + } + } + private renderAvatarOrIdenticon() { const { avatarPath, conversationType } = this.props; diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 062e0aee2..cff3383f5 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -68,12 +68,14 @@ interface Props { onLeaveGroup: () => void; onInviteFriends: () => void; + onShowUserDetails?: (userPubKey: string) => void; i18n: LocalizerType; } export class ConversationHeader extends React.Component { public showMenuBound: (event: React.MouseEvent) => void; + public onShowUserDetailsBound: (userPubKey: string) => void; public menuTriggerRef: React.RefObject; public constructor(props: Props) { @@ -81,6 +83,7 @@ export class ConversationHeader extends React.Component { this.menuTriggerRef = React.createRef(); this.showMenuBound = this.showMenu.bind(this); + this.onShowUserDetailsBound = this.onShowUserDetails.bind(this); } public showMenu(event: React.MouseEvent) { @@ -180,6 +183,9 @@ export class ConversationHeader extends React.Component { size={28} borderColor={borderColor} borderWidth={2} + onAvatarClick={() => { + this.onShowUserDetailsBound(phoneNumber); + }} /> ); @@ -397,4 +403,9 @@ export class ConversationHeader extends React.Component { ); } + + public onShowUserDetails(userPubKey: string) { + if (this.props.onShowUserDetails) + this.props.onShowUserDetails(userPubKey); + } } diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index 29d901be8..bbff200c1 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -674,12 +674,7 @@ export class Message extends React.PureComponent { return (
{ - onShowUserDetails(authorPhoneNumber); - }} - > + className="module-message__author-avatar"> { phoneNumber={authorPhoneNumber} profileName={authorProfileName} size={36} + onAvatarClick={() => { + onShowUserDetails(authorPhoneNumber); + }} /> {isModerator && (