|  |  |  | /* global _, Whisper, */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // eslint-disable-next-line func-names
 | 
					
						
							|  |  |  | (function() { | 
					
						
							|  |  |  |   'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   window.Whisper = window.Whisper || {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Whisper.MemberListView = Whisper.View.extend({ | 
					
						
							|  |  |  |     initialize(options) { | 
					
						
							|  |  |  |       this.member_list = []; | 
					
						
							|  |  |  |       this.memberMapping = {}; | 
					
						
							|  |  |  |       this.selected_idx = 0; | 
					
						
							|  |  |  |       this.onClicked = options.onClicked; | 
					
						
							|  |  |  |       this.render(); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     render() { | 
					
						
							|  |  |  |       if (this.memberView) { | 
					
						
							|  |  |  |         this.memberView.remove(); | 
					
						
							|  |  |  |         this.memberView = null; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       this.memberView = new Whisper.ReactWrapperView({ | 
					
						
							|  |  |  |         className: 'member-list', | 
					
						
							|  |  |  |         Component: window.Signal.Components.MemberList, | 
					
						
							|  |  |  |         props: { | 
					
						
							|  |  |  |           members: this.member_list, | 
					
						
							|  |  |  |           selected: this.selectedMember(), | 
					
						
							|  |  |  |           onMemberClicked: this.handleMemberClicked.bind(this), | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       this.$el.append(this.memberView.el); | 
					
						
							|  |  |  |       return this; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     handleMemberClicked(member) { | 
					
						
							|  |  |  |       this.onClicked(member); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     updateMembers(members) { | 
					
						
							|  |  |  |       if (!_.isEqual(this.member_list, members)) { | 
					
						
							|  |  |  |         // Whenever the list is updated, we reset the selection
 | 
					
						
							|  |  |  |         this.selected_idx = 0; | 
					
						
							|  |  |  |         this.member_list = members; | 
					
						
							|  |  |  |         this.render(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     replaceMentions(message) { | 
					
						
							|  |  |  |       let result = message; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Sort keys from long to short, so we don't have to
 | 
					
						
							|  |  |  |       // worry about one key being a substring of another
 | 
					
						
							|  |  |  |       const keys = _.sortBy(_.keys(this.memberMapping), d => -d.length); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       keys.forEach(key => { | 
					
						
							|  |  |  |         const pubkey = this.memberMapping[key]; | 
					
						
							|  |  |  |         result = result.split(key).join(`@${pubkey}`); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       return result; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     pendingMentions() { | 
					
						
							|  |  |  |       return this.memberMapping; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     deleteMention(mention) { | 
					
						
							|  |  |  |       if (mention) { | 
					
						
							|  |  |  |         delete this.memberMapping[mention]; | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         // Delete all mentions if no argument is passed
 | 
					
						
							|  |  |  |         this.memberMapping = {}; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     membersShown() { | 
					
						
							|  |  |  |       return this.member_list.length !== 0; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     selectUp() { | 
					
						
							|  |  |  |       this.selected_idx = Math.max(this.selected_idx - 1, 0); | 
					
						
							|  |  |  |       this.render(); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     selectDown() { | 
					
						
							|  |  |  |       this.selected_idx = Math.min( | 
					
						
							|  |  |  |         this.selected_idx + 1, | 
					
						
							|  |  |  |         this.member_list.length - 1 | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       this.render(); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     selectedMember() { | 
					
						
							|  |  |  |       return this.member_list[this.selected_idx]; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     addPubkeyMapping(name, pubkey) { | 
					
						
							|  |  |  |       let handle = `@${name}`; | 
					
						
							|  |  |  |       let chars = 4; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       while ( | 
					
						
							|  |  |  |         _.has(this.memberMapping, handle) && | 
					
						
							|  |  |  |         this.memberMapping[handle] !== pubkey | 
					
						
							|  |  |  |       ) { | 
					
						
							|  |  |  |         const shortenedPubkey = pubkey.substr(pubkey.length - chars); | 
					
						
							|  |  |  |         handle = `@${name}(..${shortenedPubkey})`; | 
					
						
							|  |  |  |         chars += 1; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       this.memberMapping[handle] = pubkey; | 
					
						
							|  |  |  |       return handle; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | })(); |