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