You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			70 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
| import { GroupUtils, UserUtils } from '../../session/utils';
 | |
| import { PubKey } from '../../session/types';
 | |
| import React from 'react';
 | |
| import * as _ from 'lodash';
 | |
| import { getConversationController } from '../../session/conversations';
 | |
| 
 | |
| export type ConversationAvatar = {
 | |
|   avatarPath?: string;
 | |
|   id?: string; // member's pubkey
 | |
|   name?: string;
 | |
| };
 | |
| 
 | |
| type State = {
 | |
|   memberAvatars?: Array<ConversationAvatar>; // this is added by usingClosedConversationDetails
 | |
| };
 | |
| 
 | |
| export function usingClosedConversationDetails(WrappedComponent: any) {
 | |
|   return class extends React.Component<any, State> {
 | |
|     constructor(props: any) {
 | |
|       super(props);
 | |
|       this.state = {
 | |
|         memberAvatars: undefined,
 | |
|       };
 | |
|     }
 | |
| 
 | |
|     public componentDidMount() {
 | |
|       this.fetchClosedConversationDetails();
 | |
|     }
 | |
| 
 | |
|     public componentWillReceiveProps() {
 | |
|       this.fetchClosedConversationDetails();
 | |
|     }
 | |
| 
 | |
|     public render() {
 | |
|       return <WrappedComponent memberAvatars={this.state.memberAvatars} {...this.props} />;
 | |
|     }
 | |
| 
 | |
|     private fetchClosedConversationDetails() {
 | |
|       const { isPublic, type, conversationType, isGroup, phoneNumber, id } = this.props;
 | |
| 
 | |
|       if (!isPublic && (conversationType === 'group' || type === 'group' || isGroup)) {
 | |
|         const groupId = id || phoneNumber;
 | |
|         const ourPrimary = UserUtils.getOurPubKeyFromCache();
 | |
|         let members = GroupUtils.getGroupMembers(PubKey.cast(groupId));
 | |
| 
 | |
|         const ourself = members.find(m => m.key !== ourPrimary.key);
 | |
|         // add ourself back at the back, so it's shown only if only 1 member and we are still a member
 | |
|         members = members.filter(m => m.key !== ourPrimary.key);
 | |
|         members.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
 | |
|         if (ourself) {
 | |
|           members.push(ourPrimary);
 | |
|         }
 | |
|         // no need to forward more than 2 conversations for rendering the group avatar
 | |
|         members = members.slice(0, 2);
 | |
|         const memberConvos = _.compact(members.map(m => getConversationController().get(m.key)));
 | |
|         const memberAvatars = memberConvos.map(m => {
 | |
|           return {
 | |
|             avatarPath: m.getAvatar()?.url || undefined,
 | |
|             id: m.id,
 | |
|             name: m.get('name') || m.get('profileName') || m.id,
 | |
|           };
 | |
|         });
 | |
|         this.setState({ memberAvatars });
 | |
|       } else {
 | |
|         this.setState({ memberAvatars: undefined });
 | |
|       }
 | |
|     }
 | |
|   };
 | |
| }
 |