commit
7dcef4ee73
@ -0,0 +1,81 @@
|
||||
/* global , Whisper, storage, ConversationController */
|
||||
/* global textsecure: false */
|
||||
|
||||
/* eslint-disable more/no-then */
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
window.Whisper = window.Whisper || {};
|
||||
|
||||
const blockedNumbers = new Whisper.BlockedNumberCollection();
|
||||
window.getBlockedNumbers = () => blockedNumbers;
|
||||
|
||||
window.BlockedNumberController = {
|
||||
getAll() {
|
||||
try {
|
||||
this.load();
|
||||
} catch (e) {
|
||||
window.log.warn(e);
|
||||
}
|
||||
return blockedNumbers;
|
||||
},
|
||||
reset() {
|
||||
blockedNumbers.reset([]);
|
||||
},
|
||||
load() {
|
||||
window.log.info('BlockedNumberController: starting initial fetch');
|
||||
|
||||
if (blockedNumbers.length) {
|
||||
throw new Error('BlockedNumberController: Already loaded!');
|
||||
}
|
||||
|
||||
if (!storage) {
|
||||
throw new Error('BlockedNumberController: Could not load blocked numbers');
|
||||
}
|
||||
|
||||
// Add the numbers to the collection
|
||||
const numbers = storage.getBlockedNumbers();
|
||||
blockedNumbers.add(
|
||||
numbers.map(number => ({ number }))
|
||||
);
|
||||
},
|
||||
block(number) {
|
||||
const ourNumber = textsecure.storage.user.getNumber();
|
||||
|
||||
// Make sure we don't block ourselves
|
||||
if (ourNumber === number) {
|
||||
window.log.info('BlockedNumberController: Cannot block yourself!');
|
||||
return;
|
||||
}
|
||||
|
||||
storage.addBlockedNumber(number);
|
||||
|
||||
// Make sure we don't add duplicates
|
||||
if (blockedNumbers.getNumber(number))
|
||||
return;
|
||||
|
||||
blockedNumbers.add({ number });
|
||||
},
|
||||
unblock(number) {
|
||||
storage.removeBlockedNumber(number);
|
||||
|
||||
// Make sure we don't add duplicates
|
||||
const model = blockedNumbers.getNumber(number);
|
||||
if (model) {
|
||||
blockedNumbers.remove(model);
|
||||
}
|
||||
},
|
||||
unblockAll() {
|
||||
const all = blockedNumbers.models;
|
||||
all.forEach(number => {
|
||||
storage.removeBlockedNumber(number);
|
||||
blockedNumbers.remove(number);
|
||||
});
|
||||
},
|
||||
isBlocked(number) {
|
||||
return storage.isBlocked(number);
|
||||
},
|
||||
};
|
||||
})();
|
@ -0,0 +1,92 @@
|
||||
/* global BlockedNumberController: false */
|
||||
/* global Whisper: false */
|
||||
/* global storage: false */
|
||||
/* global i18n: false */
|
||||
|
||||
/* eslint-disable no-new */
|
||||
|
||||
// eslint-disable-next-line func-names
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
window.Whisper = window.Whisper || {};
|
||||
|
||||
Whisper.BlockedNumberView = Whisper.View.extend({
|
||||
templateName: 'blockedUserSettings',
|
||||
className: 'blockedUserSettings',
|
||||
events: {
|
||||
'click .unblock-button': 'onUnblock',
|
||||
},
|
||||
initialize() {
|
||||
storage.onready(() => {
|
||||
this.collection = BlockedNumberController.getAll();
|
||||
this.listView = new Whisper.BlockedNumberListView({
|
||||
collection: this.collection,
|
||||
});
|
||||
|
||||
this.listView.render();
|
||||
this.blockedUserSettings = this.$('.blocked-user-settings');
|
||||
this.blockedUserSettings.prepend(this.listView.el);
|
||||
});
|
||||
},
|
||||
render_attributes() {
|
||||
return {
|
||||
blockedHeader: i18n('settingsUnblockHeader'),
|
||||
unblockMessage: i18n('unblockUser'),
|
||||
};
|
||||
},
|
||||
onUnblock() {
|
||||
const number = this.$('select option:selected').val();
|
||||
if (!number) return;
|
||||
|
||||
if (BlockedNumberController.isBlocked(number)) {
|
||||
BlockedNumberController.unblock(number);
|
||||
window.onUnblockNumber(number);
|
||||
this.listView.collection.remove(this.listView.collection.where({ number }));
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
Whisper.BlockedNumberListView = Whisper.View.extend({
|
||||
tagName: 'select',
|
||||
initialize(options) {
|
||||
this.options = options || {};
|
||||
this.listenTo(this.collection, 'add', this.addOne);
|
||||
this.listenTo(this.collection, 'reset', this.addAll);
|
||||
this.listenTo(this.collection, 'remove', this.addAll);
|
||||
},
|
||||
addOne(model) {
|
||||
const number = model.get('number');
|
||||
if (number) {
|
||||
this.$el.append(`<option value="${number}">${this.truncate(number, 25)}</option>`);
|
||||
}
|
||||
},
|
||||
addAll() {
|
||||
this.$el.html('');
|
||||
this.collection.each(this.addOne, this);
|
||||
},
|
||||
truncate(string, limit) {
|
||||
// Make sure an element and number of items to truncate is provided
|
||||
if (!string || !limit) return string;
|
||||
|
||||
// Get the inner content of the element
|
||||
let content = string.trim();
|
||||
|
||||
// Convert the content into an array of words
|
||||
// Remove any words above the limit
|
||||
content = content.slice(0, limit);
|
||||
|
||||
// Convert the array of words back into a string
|
||||
// If there's content to add after it, add it
|
||||
if (string.length > limit)
|
||||
content = `${content}...`;
|
||||
|
||||
return content;
|
||||
},
|
||||
render() {
|
||||
this.addAll();
|
||||
return this;
|
||||
},
|
||||
});
|
||||
})();
|
Loading…
Reference in New Issue