From c61249e5e02ce68bf7530aadfd847e89df617c94 Mon Sep 17 00:00:00 2001
From: Audric Ackermann <audric.ackermann@smile.fr>
Date: Thu, 28 Nov 2019 10:00:24 +1100
Subject: [PATCH] put event in the avatar element and trigger it in
 conversation header

---
 js/views/conversation_view.js                     |  8 ++++++++
 ts/components/Avatar.tsx                          | 10 ++++++++++
 ts/components/conversation/ConversationHeader.tsx | 11 +++++++++++
 ts/components/conversation/Message.tsx            | 10 ++++------
 4 files changed, 33 insertions(+), 6 deletions(-)

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<Props, State> {
   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<Props, State> {
           hasImage ? 'module-avatar--with-image' : 'module-avatar--no-image',
           !hasImage ? `module-avatar--${color}` : null
         )}
+        onClick={this.onAvatarClickBound}
       >
         {hasImage ? this.renderAvatarOrIdenticon() : this.renderNoImage()}
       </div>
     );
   }
 
+  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<Props> {
   public showMenuBound: (event: React.MouseEvent<HTMLDivElement>) => void;
+  public onShowUserDetailsBound: (userPubKey: string) => void;
   public menuTriggerRef: React.RefObject<any>;
 
   public constructor(props: Props) {
@@ -81,6 +83,7 @@ export class ConversationHeader extends React.Component<Props> {
 
     this.menuTriggerRef = React.createRef();
     this.showMenuBound = this.showMenu.bind(this);
+    this.onShowUserDetailsBound = this.onShowUserDetails.bind(this);
   }
 
   public showMenu(event: React.MouseEvent<HTMLDivElement>) {
@@ -180,6 +183,9 @@ export class ConversationHeader extends React.Component<Props> {
           size={28}
           borderColor={borderColor}
           borderWidth={2}
+          onAvatarClick={() => {
+            this.onShowUserDetailsBound(phoneNumber);
+          }}
         />
       </span>
     );
@@ -397,4 +403,9 @@ export class ConversationHeader extends React.Component<Props> {
       </React.Fragment>
     );
   }
+
+  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<Props, State> {
 
     return (
       <div
-        className="module-message__author-avatar"
-        role="button"
-        onClick={() => {
-          onShowUserDetails(authorPhoneNumber);
-        }}
-      >
+        className="module-message__author-avatar">
         <Avatar
           avatarPath={authorAvatarPath}
           color={authorColor}
@@ -689,6 +684,9 @@ export class Message extends React.PureComponent<Props, State> {
           phoneNumber={authorPhoneNumber}
           profileName={authorProfileName}
           size={36}
+          onAvatarClick={() => {
+            onShowUserDetails(authorPhoneNumber);
+          }}
         />
         {isModerator && (
           <div className="module-avatar__icon--crown-wrapper">