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.
		
		
		
		
		
			
		
			
				
	
	
		
			107 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
| /* 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;
 | |
|     },
 | |
|   });
 | |
| })();
 |