UNPKG

3.44 kBJavaScriptView Raw
1"use strict";
2/* globals socket, app */
3
4
5$(document).ready(function() {
6 let groupList = [];
7 let localUserList = [];
8
9 $(window).on('composer:autocomplete:init chat:autocomplete:init', function(ev, data) {
10 loadTopicUsers(data.element);
11
12 if (!groupList.length) {
13 loadGroupList();
14 }
15
16 let slugify;
17 const strategy = {
18 match: /\B@([^\s\n]*)?$/,
19 search: function (term, callback) {
20 require(['composer', 'helpers', 'slugify'], function (composer, helpers, _slugify) {
21 slugify = _slugify;
22 let mentions = [];
23 if (!term) {
24 mentions = usersToMentions(sortUsers(localUserList), helpers);
25 return callback(mentions);
26 }
27
28 // Get composer metadata
29 const uuid = data.options.className && data.options.className.match(/dropdown-(.+?)\s/)[1];
30 socket.emit('plugins.mentions.userSearch', {
31 query: term,
32 composerObj: composer.posts[uuid],
33 }, function(err, users) {
34 if (err) {
35 return callback([]);
36 }
37
38 mentions = mentions.concat(usersToMentions(sortUsers(users), helpers));
39
40 // Add groups that start with the search term
41 const groupMentions = groupList.filter(function (groupName) {
42 return groupName.toLocaleLowerCase().startsWith(term.toLocaleLowerCase());
43 }).sort(function(a, b) {
44 return a.toLocaleLowerCase() > b.toLocaleLowerCase() ? 1 : -1;
45 });
46 // Add group mentions at the bottom of dropdown
47 mentions = mentions.concat(groupMentions);
48
49 callback(mentions);
50 });
51 });
52 },
53 index: 1,
54 replace: function (mention) {
55 // Strip (fullname) part from mentions
56 mention = mention.replace(/ \(.+\)/, '');
57 mention = $('<div/>').html(mention);
58 // Strip letter avatar
59 mention.find('span').remove();
60 return '@' + slugify(mention.text(), true) + ' ';
61 },
62 cache: true
63 };
64
65 data.strategies.push(strategy);
66 });
67
68 $(window).on('action:composer.loaded', function(e, data) {
69 const composer = $('#cmp-uuid-' + data.post_uuid + ' .write');
70 composer.attr('data-mentions', '1');
71 });
72
73 function sortUsers (users) {
74 return users.sort(function (user1, user2) {
75 return user1.username.toLocaleLowerCase() > user2.username.toLocaleLowerCase() ? 1 : -1;
76 });
77 }
78
79 function usersToMentions (users, helpers) {
80 return users.reduce(function (carry, user) {
81 // Don't add current user to suggestions
82 if (app.user.username && app.user.username === user.username) {
83 return carry;
84 }
85
86 // Format suggestions as 'avatar username (fullname)'
87 const avatar = helpers.buildAvatar(user, 'sm');
88 const fullname = user.fullname ? `(${user.fullname})` : '';
89 carry.push(`${avatar} ${user.username} ${helpers.escape(fullname)}`);
90
91 return carry;
92 }, []);
93 }
94
95 function loadTopicUsers(element) {
96 require(['composer'], function (composer) {
97 const composerEl = element.parents('.composer').get(0);
98 if (!composerEl) {
99 return;
100 }
101
102 const uuid = composerEl.getAttribute('data-uuid');
103 const composerObj = composer.posts[uuid];
104
105 if (!composerObj.tid) {
106 localUserList = [];
107 return;
108 }
109
110 socket.emit('plugins.mentions.getTopicUsers', {
111 tid: composerObj.tid,
112 }, function (err, users) {
113 localUserList = users;
114 });
115 });
116 }
117
118 function loadGroupList() {
119 socket.emit('plugins.mentions.listGroups', function(err, groupNames) {
120 if (err) {
121 return app.alertError(err.message);
122 }
123 groupList = groupNames;
124 });
125 }
126
127});