61a57a753b
While typing a number, the new contact element is faded out. When the number becomes valid it is opaque. If the element is clicked while invalid, it displays 'Invalid number' and waits for the input to change again. A new conversation is only opened if the number is valid. // FREEBIE
159 lines
5.4 KiB
JavaScript
159 lines
5.4 KiB
JavaScript
/*
|
|
* vim: ts=4:sw=4:expandtab
|
|
*/
|
|
(function () {
|
|
'use strict';
|
|
window.Whisper = window.Whisper || {};
|
|
|
|
Whisper.NewContactView = Whisper.View.extend({
|
|
templateName: 'new-contact',
|
|
className: 'conversation-list-item contact',
|
|
events: {
|
|
'click': 'validate'
|
|
},
|
|
initialize: function() {
|
|
this.listenTo(this.model, 'change', this.render); // auto update
|
|
},
|
|
render_attributes: function() {
|
|
return {
|
|
number: 'Click to create new contact',
|
|
title: this.model.getNumber(),
|
|
avatar: this.model.getAvatar(),
|
|
};
|
|
},
|
|
validate: function() {
|
|
if (this.model.isValid()) {
|
|
this.$el.addClass('valid');
|
|
} else {
|
|
this.$el.removeClass('valid');
|
|
}
|
|
},
|
|
});
|
|
|
|
Whisper.ConversationSearchView = Whisper.View.extend({
|
|
className: 'conversation-search',
|
|
initialize: function(options) {
|
|
this.$input = options.input;
|
|
this.$new_contact = this.$('.new-contact');
|
|
|
|
this.typeahead = new Whisper.ConversationCollection();
|
|
// View to display the matched contacts from typeahead
|
|
this.typeahead_view = new Whisper.ConversationListView({
|
|
collection : new Whisper.ConversationCollection([], {
|
|
comparator: function(m) { return m.getTitle().toLowerCase(); }
|
|
})
|
|
});
|
|
this.$el.append(this.typeahead_view.el);
|
|
this.initNewContact();
|
|
//this.listenTo(this.collection, 'reset', this.filterContacts);
|
|
this.pending = Promise.resolve();
|
|
},
|
|
|
|
events: {
|
|
'click .new-contact': 'createConversation',
|
|
},
|
|
|
|
filterContacts: function(e) {
|
|
var query = this.$input.val().trim();
|
|
if (query.length) {
|
|
if (this.maybeNumber(query)) {
|
|
this.new_contact_view.model.set('id', query);
|
|
this.new_contact_view.render().$el.show();
|
|
this.new_contact_view.validate();
|
|
this.hideHints();
|
|
|
|
} else {
|
|
this.new_contact_view.$el.hide();
|
|
}
|
|
this.pending = this.pending.then(function() {
|
|
return this.typeahead.search(query).then(function() {
|
|
this.typeahead_view.collection.reset(this.typeahead.models);
|
|
}.bind(this));
|
|
}.bind(this));
|
|
this.trigger('show');
|
|
} else {
|
|
this.resetTypeahead();
|
|
}
|
|
},
|
|
|
|
initNewContact: function() {
|
|
if (this.new_contact_view) {
|
|
this.new_contact_view.undelegateEvents();
|
|
this.new_contact_view.$el.hide();
|
|
}
|
|
// Creates a view to display a new contact
|
|
this.new_contact_view = new Whisper.NewContactView({
|
|
el: this.$new_contact,
|
|
model: ConversationController.create({
|
|
type: 'private',
|
|
newContact: true
|
|
})
|
|
}).render();
|
|
},
|
|
|
|
createConversation: function() {
|
|
var conversation = this.new_contact_view.model;
|
|
if (this.new_contact_view.model.isValid()) {
|
|
ConversationController.findOrCreatePrivateById(
|
|
this.new_contact_view.model.id
|
|
).then(function(conversation) {
|
|
this.trigger('open', conversation);
|
|
this.initNewContact();
|
|
this.resetTypeahead();
|
|
}.bind(this));
|
|
} else {
|
|
this.new_contact_view.$('.number').text("Invalid number");
|
|
this.$input.focus();
|
|
}
|
|
},
|
|
|
|
reset: function() {
|
|
this.delegateEvents();
|
|
this.typeahead_view.delegateEvents();
|
|
this.new_contact_view.delegateEvents();
|
|
this.resetTypeahead();
|
|
},
|
|
|
|
resetTypeahead: function() {
|
|
this.hideHints();
|
|
this.new_contact_view.$el.hide();
|
|
this.$input.val('').focus();
|
|
if (this.showAllContacts) {
|
|
this.typeahead.fetchAlphabetical().then(function() {
|
|
if (this.typeahead.length > 0) {
|
|
this.typeahead_view.collection.reset(this.typeahead.models);
|
|
} else {
|
|
this.showHints();
|
|
}
|
|
}.bind(this));
|
|
this.trigger('show');
|
|
} else {
|
|
this.typeahead_view.collection.reset([]);
|
|
this.trigger('hide');
|
|
}
|
|
},
|
|
|
|
showHints: function() {
|
|
if (!this.hintView) {
|
|
this.hintView = new Whisper.HintView({
|
|
className: 'contact placeholder',
|
|
content: "Enter a phone number to add a contact."
|
|
}).render();
|
|
this.hintView.$el.insertAfter(this.$input);
|
|
}
|
|
this.hintView.$el.show();
|
|
},
|
|
|
|
hideHints: function() {
|
|
if (this.hintView) {
|
|
this.hintView.remove();
|
|
this.hintView = null;
|
|
}
|
|
},
|
|
|
|
maybeNumber: function(number) {
|
|
return number.replace(/[\s-.\(\)]*/g,'').match(/^\+?[0-9]*$/);
|
|
}
|
|
});
|
|
|
|
})();
|