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.
session-desktop/js/views/member_list_view.js

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;
},
});
})();