Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
148 lines
No EOL
53 KiB
JavaScript
148 lines
No EOL
53 KiB
JavaScript
;(function(exports){'use strict';const SECOND=1000;const MINUTE=60*SECOND;const HOUR=60*MINUTE;const DAY=24*HOUR;const MONTH=30*DAY;var attachmentMap=new WeakMap();function conv_mmsAttachmentClick(target){var attachment=attachmentMap.get(target);if(!attachment){return false;}
|
|
attachment.view({allowSave:true});return true;}
|
|
function conv_generateSmilSlides(slides,content){var length=slides.length;if(typeof content==='string'){if(!length||slides[length-1].text){slides.push({text:content});}else{slides[length-1].text=content;}}else{slides.push({blob:content.blob,name:content.name});}
|
|
return slides;}
|
|
var ConversationView={FIRST_CHUNK_SIZE:10,CHUNK_SIZE:50,CONVERTED_MESSAGE_DURATION:3000,IMAGE_RESIZE_DURATION:3000,BANNER_DURATION:2000,ANOTHER_SMS_TOAST_DURATION:3000,LEAVE_ACTIVITY_DELAY:3000,THROTTLE_DELAY:300,THROTTLE_OPTS:{preventFirstCall:true,preventLastCall:false},LATE_NOTICE_LOWER_LIMITS:{NO_NOTICE:5*MINUTE,IN_HOURS:1*HOUR,IN_DAYS:1*DAY,IN_MONTHS:1*MONTH},draft:null,recipients:null,inEditMode:false,isNewMessageNoticeShown:false,shouldChangePanelNextEvent:false,showErrorInFailedEvent:'',previousSegment:0,buildingMessages:{},_isReady:false,timeouts:{update:null,subjectLengthNotice:null},multiSimActionButton:null,init:function conv_init(){var templateIds=['message','message-sim-information','message-status','late-arrival-notice','not-downloaded','recipient','date-group','header','group-header'];['container','to-field','recipients-list','compose-form','header','edit-header','check-uncheck-all-button','contact-pick-button','send-button','delete-button','call-number-button','options-button','new-message-notice','edit-mode','edit-form','header-text','max-length-notice','convert-notice','resize-notice','new-message-notice','subject-max-length-notice','sms-counter-notice','recipient-suggestions'].forEach(function(id){this[Utils.camelCase(id)]=document.getElementById('messages-'+id);},this);this.mainWrapper=document.getElementById('main-wrapper');this.threadMessages=document.querySelector('.panel-ConversationView');window.addEventListener('resize',this.resizeHandler.bind(this));this.onVisibilityChange=this.onVisibilityChange.bind(this);document.addEventListener('visibilitychange',this.onVisibilityChange);this.toField.addEventListener('keypress',Utils.throttle(this.toFieldKeypress.bind(this),this.THROTTLE_DELAY,this.THROTTLE_OPTS),true);this.toField.addEventListener('input',Utils.throttle(this.toFieldInput.bind(this),this.THROTTLE_DELAY,this.THROTTLE_OPTS),true);this.toField.addEventListener('focus',Utils.throttle(this.toFieldInput.bind(this),this.THROTTLE_DELAY,this.THROTTLE_OPTS),true);this.sendButton.addEventListener('click',this.onSendClick.bind(this));this.sendButton.addEventListener('contextmenu',this.onSendClick.bind(this));this.container.addEventListener('scroll',this.manageScroll.bind(this));this.editHeader.addEventListener('action',this.cancelEdit.bind(this));this.header.addEventListener('action',this.backOrClose.bind(this));this.optionsButton.addEventListener('click',this.showOptions.bind(this));this.callNumberButton.addEventListener('click',()=>{ActivityPicker.dial(this.activeThread.participants[0]);});this.deleteButton.addEventListener('click',this.delete.bind(this));this.headerText.addEventListener('click',this.onHeaderActivation.bind(this));this.newMessageNotice.addEventListener('click',this.onNewMessageNoticeClick.bind(this));this.container.addEventListener('click',this);this.container.addEventListener('contextmenu',this);this.editForm.addEventListener('submit',this);this.composeForm.addEventListener('submit',this);this.contactPickButton.addEventListener('mousedown',this.requestContact.bind(this));this.contactPickButton.addEventListener('click',function onClick(event){event.stopPropagation();});navigator.mozContacts.addEventListener('contactchange',this.updateHeaderData.bind(this));this.recipientSuggestions.addEventListener('click',this.onRecipientSuggestionClick.bind(this));MessageManager.on('message-sending',this.onMessageSending.bind(this));MessageManager.on('message-sent',this.onMessageSent.bind(this));MessageManager.on('message-received',this.onMessageReceived.bind(this));MessageManager.on('message-failed-to-send',this.onMessageFailed.bind(this));MessageManager.on('message-delivered',this.onDeliverySuccess.bind(this));MessageManager.on('message-read',this.onReadSuccess.bind(this));this.tmpl=templateIds.reduce(function(tmpls,name){tmpls[Utils.camelCase(name)]=Template('messages-'+name+'-tmpl');return tmpls;},{});Compose.init('messages-compose-form');Compose.on('input',this.onMessageContentChange.bind(this));Compose.on('subject-change',this.onSubjectChange.bind(this));Compose.on('segmentinfochange',this.onSegmentInfoChange.bind(this));Compose.on('interact',this.assimilateRecipients.bind(this));this.container.addEventListener('click',this.assimilateRecipients.bind(this));this.multiSimActionButton=null;this.timeouts.update=null;this.shouldChangePanelNextEvent=false;this.showErrorInFailedEvent='';this.onMessageTypeChange=this.onMessageTypeChange.bind(this);this._isReady=true;},isReady(){return this._isReady;},onVisibilityChange:function conv_onVisibilityChange(){var isDraftUpdateNeeded=document.hidden&&(Navigation.isCurrentPanel('composer')||Navigation.isCurrentPanel('thread'));if(isDraftUpdateNeeded){this.updateDraft();}},backOrClose:function conv_backOrClose(){this.stopRendering();var backOrClosePromise;if(ActivityClient.hasPendingRequest()){backOrClosePromise=this.updateDraft().then(()=>ActivityClient.postResult());}else{backOrClosePromise=this._ensureKeyboardIsHidden().then(()=>Navigation.toPanel('thread-list'));}
|
|
return backOrClosePromise.catch((e)=>{console.error('Unexpected error while navigating back: ',e);return Promise.reject(e);});},initRecipients:function conv_initRecipients(){var recipientsChanged=(function recipientsChanged(length,record){if(this.draft){this.draft.isEdited=true;}
|
|
var isOk=true;var strategy;if(record&&(record.isQuestionable||record.isLookupable)){if(record.isQuestionable){isOk=false;}
|
|
strategy=record.isLookupable?'searchContact':'exactContact';this[strategy](record.number).then((contacts)=>this.validateContact(record,record.number,contacts));}
|
|
this.toggleRecipientSuggestions();if(isOk){this.updateComposerHeader();Compose.refresh();}}).bind(this);if(this.recipients){this.recipients.length=0;this.recipients.visible('singleline');this.recipients.focus();}else{this.recipients=new Recipients({outer:'messages-to-field',inner:'messages-recipients-list',template:this.tmpl.recipient});this.recipients.on('add',recipientsChanged);this.recipients.on('remove',recipientsChanged);this.recipients.on('modechange',function(mode){this.threadMessages.classList.toggle('multiline-recipients-mode',mode==='multiline-mode');}.bind(this));}
|
|
this.toggleRecipientSuggestions();},hasValidRecipients(){if(this.recipients.numbers.length){return true;}
|
|
var notValidatedNumber=this.recipients.inputValue;return!!notValidatedNumber&&isFinite(notValidatedNumber);},hasEmailRecipients(){if(!Settings.supportEmailRecipient){return false;}
|
|
return this.recipients.numbers.some(Utils.isEmailAddress);},initSentAudio:function conv_initSentAudio(){if(this.sentAudio){return;}
|
|
this.sentAudio=new Audio();this.sentAudio.preload='none';this.sentAudio.src='/sounds/firefox_msg_sent.opus';this.sentAudio.mozAudioChannelType='notification';this.sentAudioKey='message.sent-sound.enabled';this.sentAudioEnabled=false;if(navigator.mozSettings){try{var req=navigator.mozSettings.createLock().get(this.sentAudioKey);req.onsuccess=(function onsuccess(){this.sentAudioEnabled=req.result[this.sentAudioKey];}).bind(this);navigator.mozSettings.addObserver(this.sentAudioKey,(function(e){this.sentAudioEnabled=e.settingValue;}).bind(this));}catch(e){this.sentAudioEnabled=false;}}},getIdIterator:function conv_getIdIterator(){return this.activeThread.messages.keys();},setHeaderAction:function conv_setHeaderAction(icon){this.header.setAttribute('action',icon);},onMessageContentChange(){if(this.draft){this.draft.isEdited=true;}
|
|
if(Compose.type==='sms'){this.hideMaxLengthNotice();return;}
|
|
if(Compose.isResizing){this.resizeNotice.classList.remove('hide');if(this._resizeNoticeTimeout){clearTimeout(this._resizeNoticeTimeout);this._resizeNoticeTimeout=null;}}else{this.checkMessageSize();if(this.resizeNotice.classList.contains('hide')||this._resizeNoticeTimeout){return;}
|
|
this._resizeNoticeTimeout=setTimeout(function hideResizeNotice(){this.resizeNotice.classList.add('hide');this._resizeNoticeTimeout=null;}.bind(this),this.IMAGE_RESIZE_DURATION);}},showMaxLengthNotice:function conv_showMaxLengthNotice(opts){document.l10n.setAttributes(this.maxLengthNotice.querySelector('p'),opts.l10nId,opts.l10nArgs);this.maxLengthNotice.classList.remove('hide');},hideMaxLengthNotice:function conv_hideMaxLengthNotice(){this.maxLengthNotice.classList.add('hide');},showSubjectMaxLengthNotice:function conv_showSubjectMaxLengthNotice(){this.subjectMaxLengthNotice.classList.remove('hide');if(this.timeouts.subjectLengthNotice){clearTimeout(this.timeouts.subjectLengthNotice);}
|
|
this.timeouts.subjectLengthNotice=setTimeout(this.hideSubjectMaxLengthNotice.bind(this),this.BANNER_DURATION);},hideSubjectMaxLengthNotice:function conv_hideSubjectMaxLengthNotice(){this.subjectMaxLengthNotice.classList.add('hide');this.timeouts.subjectLengthNotice&&clearTimeout(this.timeouts.subjectLengthNotice);},beforeEnter:function conv_beforeEnter(args){this.clearConvertNoticeBanners();this.setHeaderAction(ActivityClient.hasPendingRequest()?'close':'back');this.header.removeAttribute('no-font-fit');if(!this.multiSimActionButton){var gaiaSimPicker=document.getElementById('sim-picker');gaiaSimPicker.classList.remove('hide');this.multiSimActionButton=new MultiSimActionButton(this.sendButton,this.simSelectedCallback.bind(this),Settings.SERVICE_ID_KEYS.smsServiceId);this.initSentAudio();}
|
|
var next=args.meta.next.panel;switch(next){case'composer':return this.beforeEnterComposer(args);case'thread':return this.beforeEnterThread(args);default:console.error('preEnter was called with an unexpected panel name:',next);return Promise.reject();}},beforeEnterThread:function conv_beforeEnterThread(args){var threadId=+args.id;return MessageManager.ensureThreadRegistered(threadId).then(()=>{this.activeThread=Threads.get(threadId);var prevPanel=args.meta.prev;var emailThread=Settings.supportEmailRecipient&&this.activeThread.participants.some(Utils.isEmailAddress);Compose.setupLock({forceType:()=>emailThread?'mms':null});if(!prevPanel||prevPanel.panel!=='composer'){this.enableConvertNoticeBanners();}
|
|
if(!this.isConversationPanel(threadId,prevPanel)){this.initializeRendering();}
|
|
if(this.activeThread.participants.length===1&&!emailThread){this.callNumberButton.classList.remove('hide');}
|
|
return this.updateHeaderData();});},afterEnter:function conv_afterEnter(args){var next=args.meta.next.panel;switch(next){case'composer':return this.afterEnterComposer(args);case'thread':return this.afterEnterThread(args);default:console.error('afterEnter was called with an unexpected panel name:',next);return Promise.reject();}},afterEnterComposer:function conv_afterEnterComposer(args){var draftPromise=args.draftId?this.handleDraft(+args.draftId):Promise.resolve();return draftPromise.then(()=>{switch(args.focus){case'composer':Compose.focus();break;case'recipients':this.recipients.focus();break;default:if(this.hasValidRecipients()){Compose.focus();}else{this.recipients.focus();}
|
|
break;}
|
|
this.emit('visually-loaded');});},afterEnterThread:function conv_afterEnterThread(args){var threadId=+args.id;var prevPanel=args.meta.prev;if(!this.isConversationPanel(threadId,prevPanel)){this.renderMessages(threadId);Drafts.request().then(()=>{this.draft=Threads.get(threadId).getDraft();if(this.draft){Compose.fromDraft(this.draft);Compose.focus();this.draft.isEdited=false;}});}
|
|
App.whenReady().then(function(){setTimeout(()=>InboxView.markReadUnread([threadId],true));});if(prevPanel&&prevPanel.panel==='composer'){this.enableConvertNoticeBanners();}
|
|
if(args.focus==='composer'){Compose.focus();}
|
|
return Utils.closeNotificationsForThread(threadId);},beforeLeave:function conv_beforeLeave(args){this.disableConvertNoticeBanners();var nextPanel=args.meta.next;this.cancelEdit();if(Navigation.isCurrentPanel('thread')){this.activeThread.unreadCount=0;}
|
|
this.updateDraft();if(!this.activeThread||!this.isConversationPanel(this.activeThread.id,nextPanel)){this.draft=null;this.activeThread=null;this.cleanFields();}},afterLeave:function conv_afterLeave(args){if(Navigation.isCurrentPanel('thread-list')){this.clearContainer();this.cleanFields();}
|
|
if(!Navigation.isCurrentPanel('composer')){this.threadMessages.classList.remove('new');if(this.recipients){this.recipients.length=0;}
|
|
this.toggleRecipientSuggestions();}
|
|
if(!Navigation.isCurrentPanel('thread')){this.threadMessages.classList.remove('has-carrier');this.callNumberButton.classList.add('hide');}},handleDraft:function conv_handleDraft(draftId){return Drafts.request().then(()=>{this.draft=Drafts.byDraftId(draftId);if(!this.draft){return;}
|
|
Compose.fromDraft(this.draft);this.draft.isEdited=false;return Promise.all(this.draft.recipients.map((number)=>{return Contacts.findByAddress(number).then((contacts)=>{var recipient;if(contacts.length){recipient=Utils.basicContact(number,contacts[0]);recipient.source='contacts';}else{recipient={number:number,source:'manual'};}
|
|
this.recipients.add(recipient);this.draft.isEdited=false;});}));});},beforeEnterComposer(){Recipients.View.isFocusable=true;this.enableConvertNoticeBanners();this.clearContainer();this.cleanFields();this.initRecipients();this.updateComposerHeader();Compose.setupLock({canSend:()=>this.hasValidRecipients(),forceType:()=>this.hasEmailRecipients()?'mms':null});this.threadMessages.classList.add('new');return Promise.resolve();},assimilateRecipients:function conv_assimilateRecipients(){var isNew=Navigation.isCurrentPanel('composer');var node=this.recipientsList.lastChild;var typed;if(!isNew||node===null){return;}
|
|
Recipients.View.isFocusable=false;this.recipients.visible('singleline');do{if(node.isPlaceholder){typed=node.textContent.trim();if(typed===';'){node.textContent='';break;}
|
|
if(typed){this.recipients.add({name:typed,number:typed,source:'manual'});break;}}}while((node=node.previousSibling));},onMessage:function onMessage(message){Threads.registerMessage(message);return this.appendMessage(message).then(()=>TimeHeaders.updateAll('header[data-time-update]'));},isCurrentConversation:function conv_isCurrentConversation(conversationId){return Navigation.isCurrentPanel('thread',{id:conversationId})||Navigation.isCurrentPanel('report-view',{threadId:conversationId})||Navigation.isCurrentPanel('group-view',{id:conversationId});},isConversationPanel(id,panel){if(!panel){return false;}
|
|
id=+id;return panel.panel==='thread'&&+panel.args.id===id||panel.panel==='report-view'&&+panel.args.threadId===id||panel.panel==='group-view'&&+panel.args.id===id;},onMessageReceived:function conv_onMessageReceived(e){var message=e.message;if(!this.isCurrentConversation(message.threadId)){return;}
|
|
MessageManager.markMessagesRead([message.id]);this.onMessage(message);this.scrollViewToBottom();if(this.isScrolledManually){this.showNewMessageNotice(message);}},onMessageSending:function conv_onMessageReceived(e){var message=e.message;if(this.isCurrentConversation(message.threadId)){this.onMessage(message);this.forceScrollViewToBottom();}else{if(this.shouldChangePanelNextEvent){Navigation.toPanel('thread',{id:message.threadId});this.shouldChangePanelNextEvent=false;}}},onNewMessageNoticeClick:function conv_onNewMessageNoticeClick(event){event.preventDefault();this.hideNewMessageNotice();this.forceScrollViewToBottom();},onRecipientSuggestionClick:function(event){event.stopPropagation();event.preventDefault();this.recipients.add(event.target.dataset).focus();},onMessageTypeChange:function conv_onMessageTypeChange(){var message='converted-to-'+Compose.type;var messageContainer=this.convertNotice.querySelector('p');messageContainer.setAttribute('data-l10n-id',message);this.convertNotice.classList.remove('hide');if(this._convertNoticeTimeout){clearTimeout(this._convertNoticeTimeout);}
|
|
this._convertNoticeTimeout=setTimeout(this.clearConvertNoticeBanners.bind(this),this.CONVERTED_MESSAGE_DURATION);},clearConvertNoticeBanners:function conv_clearConvertNoticeBanner(){this.convertNotice.classList.add('hide');},enableConvertNoticeBanners:function conv_enableConvertNoticeBanner(){Compose.on('type',this.onMessageTypeChange);},disableConvertNoticeBanners:function conv_disableConvertNoticeBanner(){Compose.off('type',this.onMessageTypeChange);},onSubjectChange:function conv_onSubjectChange(){if(this.draft){this.draft.isEdited=true;}
|
|
if(Compose.isSubjectVisible&&Compose.isSubjectMaxLength()){this.showSubjectMaxLengthNotice();}else{this.hideSubjectMaxLengthNotice();}},resizeHandler:function conv_resizeHandler(){this.scrollViewToBottom();Compose.scrollMessageContent();},requestContact:function conv_requestContact(){this.assimilateRecipients();if(typeof MozActivity==='undefined'){console.log('MozActivity unavailable');return;}
|
|
Recipients.View.isFocusable=false;var contactProperties=['tel'];if(Settings.supportEmailRecipient){contactProperties.push('email');}
|
|
var activity=new MozActivity({name:'pick',data:{type:'webcontacts/select',contactProperties:contactProperties}});activity.onsuccess=(function(){if(!activity.result||!activity.result.select||!activity.result.select.length||!activity.result.select[0].value){console.error('The pick activity result is invalid.');return;}
|
|
Recipients.View.isFocusable=true;var data=Utils.basicContact(activity.result.select[0].value,activity.result.contact);data.source='contacts';this.recipients.add(data);}).bind(this);activity.onerror=(function(e){Recipients.View.isFocusable=true;console.log('WebActivities unavailable? : '+e);}).bind(this);},updateComposerHeader:function conv_updateComposerHeader(){var recipientCount=this.recipients.numbers.length;if(recipientCount>0){this.setHeaderContent({id:'recipient',args:{n:recipientCount}});}else{this.setHeaderContent('newMessage');}},isScrolledManually:false,manageScroll:function conv_manageScroll(oEvent){var scrollTop=this.container.scrollTop;var scrollHeight=this.container.scrollHeight;var clientHeight=this.container.clientHeight;this.isScrolledManually=((scrollTop+clientHeight)<scrollHeight);if(!this.isScrolledManually&&this.isNewMessageNoticeShown){this.hideNewMessageNotice();}
|
|
var kEdge=30;if(scrollTop<kEdge){this.showChunkOfMessages(this.CHUNK_SIZE);this.container.scrollTop=(this.container.scrollHeight-scrollHeight)+scrollTop;}},scrollViewToBottom:function conv_scrollViewToBottom(){if(!this.isScrolledManually&&this.container.lastElementChild&&Navigation.isCurrentPanel('thread')){this.container.lastElementChild.scrollIntoView(false);}},forceScrollViewToBottom:function conv_forceScrollViewToBottom(){this.isScrolledManually=false;this.scrollViewToBottom();},showNewMessageNotice:function conv_showNewMessageNotice(message){Contacts.findByPhoneNumber(message.sender).then((contacts)=>{var sender=message.sender;if(contacts.length){var details=Utils.getContactDetails(sender,contacts[0]);sender=details.title||sender;var index=sender.indexOf(' ');if(index!==-1){sender=sender.slice(0,index);}}
|
|
var notice=this.newMessageNotice;var newMessageContactNode=notice.querySelector('.contact');newMessageContactNode.textContent=sender;this.isNewMessageNoticeShown=true;notice.classList.remove('hide');});},hideNewMessageNotice:function conv_hideNewMessageNotice(){this.isNewMessageNoticeShown=false;this.newMessageNotice.classList.add('hide');},initiateNewMessage:function(parameters){var navigateToComposer=()=>{var draftCreatePromise;var draft;if(parameters.messageId){draftCreatePromise=this.storeDraftFromMessage(parameters.messageId);}else if(parameters.number){draft=new Draft({recipients:[parameters.number],type:Utils.isEmailAddress(parameters.number)?'mms':'sms'});draftCreatePromise=Drafts.add(draft).store().then(()=>draft.id);}else if(parameters.content){draft=new Draft(parameters.content);draftCreatePromise=Drafts.add(draft).store().then(()=>draft.id);}else{throw new TypeError('Unknown parameter');}
|
|
return draftCreatePromise.then((draftId)=>Navigation.toPanel('composer',{draftId}));};var threadExistingPromise=parameters&¶meters.number?MessageManager.findThreadFromNumber(parameters.number):Promise.reject();return threadExistingPromise.then((id)=>Navigation.toPanel('thread',{id:id,focus:'composer'}),navigateToComposer);},isKeyboardDisplayed:function conv_isKeyboardDisplayed(){return((window.screen.height-window.innerHeight)>150);},_ensureKeyboardIsHidden:function(){if(this.isKeyboardDisplayed()){return new Promise(function(resolve){var setTimer=window.setTimeout(resolve,400);window.addEventListener('resize',function keyboardHidden(){window.clearTimeout(setTimer);window.removeEventListener('resize',keyboardHidden);resolve();});});}
|
|
return Promise.resolve();},onSegmentInfoChange:function conv_onSegmentInfoChange(){var currentSegment=Compose.segmentInfo.segments;var isValidSegment=currentSegment>0;var isSegmentChanged=this.previousSegment!==currentSegment;var isStartingFirstSegment=this.previousSegment===0&¤tSegment===1;if(Compose.type==='sms'&&isValidSegment&&isSegmentChanged&&!isStartingFirstSegment){this.previousSegment=currentSegment;document.l10n.setAttributes(this.smsCounterNotice.querySelector('p'),'sms-counter-notice-label',{number:currentSegment});this.smsCounterNotice.classList.remove('hide');window.setTimeout(function(){this.smsCounterNotice.classList.add('hide');}.bind(this),this.ANOTHER_SMS_TOAST_DURATION);}},checkMessageSize:function conv_checkMessageSize(){if(Compose.isResizing){return false;}
|
|
if(Settings.mmsSizeLimitation){if(Compose.size>Settings.mmsSizeLimitation){this.showMaxLengthNotice({l10nId:'multimedia-message-exceeded-max-length',l10nArgs:{mmsSize:(Settings.mmsSizeLimitation/1024).toFixed(0)}});return false;}else if(Compose.size===Settings.mmsSizeLimitation){this.showMaxLengthNotice({l10nId:'messages-max-length-text'});return true;}}
|
|
this.hideMaxLengthNotice();return true;},getMessageContainer:function conv_getMessageContainer(messageTimestamp,hidden){var startOfDayTimestamp=Utils.getDayDate(messageTimestamp);var messageDateGroup=document.getElementById('mc_'+startOfDayTimestamp);var header,messageContainer;if(messageDateGroup){header=messageDateGroup.firstElementChild;messageContainer=messageDateGroup.lastElementChild;if(messageTimestamp<header.dataset.time){header.dataset.time=messageTimestamp;}
|
|
return messageContainer;}
|
|
messageDateGroup=this.tmpl.dateGroup.prepare({id:'mc_'+startOfDayTimestamp,timestamp:startOfDayTimestamp.toString(),headerTimeUpdate:'repeat',headerTime:messageTimestamp.toString(),headerDateOnly:'true'}).toDocumentFragment().firstElementChild;header=messageDateGroup.firstElementChild;messageContainer=messageDateGroup.lastElementChild;if(hidden){header.classList.add('hidden');}else{TimeHeaders.update(header);}
|
|
this._insertTimestampedNodeToContainer(messageDateGroup,this.container);return messageContainer;},updateCarrier:function conv_updateCarrier(thread,contacts){var carrierTag=document.getElementById('contact-carrier');var threadMessages=this.threadMessages;var number=thread.participants[0];var phoneDetails;var address;if(thread.participants.length===1&&contacts.length){address=Settings.supportEmailRecipient&&Utils.isEmailAddress(number)?contacts[0].email:contacts[0].tel;phoneDetails=Utils.getPhoneDetails(number,address);if(phoneDetails){carrierTag.innerHTML=SharedComponents.phoneDetails(phoneDetails).toString();threadMessages.classList.add('has-carrier');}else{threadMessages.classList.remove('has-carrier');}}else{threadMessages.classList.remove('has-carrier');}},updateHeaderData:function conv_updateHeaderData(){var thread,number;thread=this.activeThread;if(!thread){return Promise.resolve();}
|
|
number=thread.participants[0];this.headerText.dataset.number=number;return Contacts.findByAddress(number).then((contacts)=>{var details=Utils.getContactDetails(number,contacts);var contactName=details.title||number;this.headerText.dataset.isContact=!!details.isContact;this.headerText.dataset.title=contactName;var headerContentTemplate=thread.participants.length>1?this.tmpl.groupHeader:this.tmpl.header;this.setHeaderContent({html:headerContentTemplate.interpolate({name:contactName,participantCount:(thread.participants.length-1).toString()})});this.updateCarrier(thread,contacts);});},setHeaderContent:function conv_setHeaderContent(contentL10n){if(typeof contentL10n==='string'){contentL10n={id:contentL10n};}
|
|
if(contentL10n.id){this.headerText.firstElementChild&&(this.headerText.textContent='');document.l10n.setAttributes(this.headerText,contentL10n.id,contentL10n.args);return;}
|
|
if(contentL10n.html){this.headerText.removeAttribute('data-l10n-id');this.headerText.innerHTML=contentL10n.html;return;}},clearContainer(){var nodes=this.container.querySelectorAll('.attachment-container[data-thumbnail]');Array.from(nodes).forEach((node)=>window.URL.revokeObjectURL(node.dataset.thumbnail));this.container.textContent='';},initializeRendering:function conv_initializeRendering(){this.clearContainer();this.cleanFields();this.messageIndex=0;this._stopRenderingNextStep=false;},stopRendering:function conv_stopRendering(){this._stopRenderingNextStep=true;},shouldRenderForThreadId(threadId){return!this._stopRenderingNextStep&&this.activeThread&&this.activeThread.id===threadId;},showFirstChunk:function conv_showFirstChunk(){this.showChunkOfMessages(this.FIRST_CHUNK_SIZE);TimeHeaders.updateAll('header[data-time-update]');this.scrollViewToBottom();this.emit('visually-loaded');},createMmsContent:function conv_createMmsContent(dataArray){var container=document.createDocumentFragment();dataArray.forEach(function(messageData){if(messageData.blob){var attachment=new Attachment(messageData.blob,{name:messageData.name});var mediaElement=attachment.render();container.appendChild(mediaElement);attachmentMap.set(mediaElement,attachment);}
|
|
if(messageData.text){var textElement=document.createElement('span');var text=Template.escape(messageData.text);text=LinkHelper.searchAndLinkClickableData(text);textElement.innerHTML=text;container.appendChild(textElement);}});return container;},renderMessages:function conv_renderMessages(threadId){var taskQueue=new TaskRunner();var onMessagesRendered=(function messagesRendered(){if(this.messageIndex<this.FIRST_CHUNK_SIZE){taskQueue.push(this.showFirstChunk.bind(this));}}).bind(this);var onRenderMessage=(function renderMessage(message){if(!this.shouldRenderForThreadId(threadId)){taskQueue=null;return false;}
|
|
taskQueue.push(()=>{if(this.shouldRenderForThreadId(threadId)){Threads.registerMessage(message);return this.appendMessage(message,true);}
|
|
return false;});this.messageIndex++;if(this.messageIndex===this.FIRST_CHUNK_SIZE){taskQueue.push(this.showFirstChunk.bind(this));}
|
|
return true;}).bind(this);if(!this.shouldRenderForThreadId(threadId)){return;}
|
|
var filter={threadId:threadId};var renderingOptions={each:onRenderMessage,filter:filter,invert:false,end:onMessagesRendered};MessageManager.getMessages(renderingOptions);this.isScrolledManually=false;},_createNotDownloadedHTML:function conv_createNotDownloadedHTML(message,classNames){var messageL10nId='tobedownloaded-attachment';var downloadL10nId='download-attachment';var status=message.deliveryInfo[0].deliveryStatus;var dateTimeOptions={weekday:'long',month:'short',day:'2-digit'};var formatter=new Intl.DateTimeFormat(navigator.languages,dateTimeOptions);var expireFormatted=formatter.format(new Date(+message.expiryDate));var expired=+message.expiryDate<Date.now();if(expired){classNames.push('expired');messageL10nId='expired-attachment';}
|
|
if(status==='error'){classNames.push('error');}
|
|
if(status==='pending'){downloadL10nId='downloading-attachment';classNames.push('pending');}
|
|
return this.tmpl.notDownloaded.interpolate({messageL10nId:messageL10nId,messageL10nArgs:JSON.stringify({date:expireFormatted}),messageL10nDate:message.expiryDate.toString(),messageL10nDateFormat:JSON.stringify(dateTimeOptions),downloadL10nId:downloadL10nId});},shouldShowDeliveryStatus:function conv_shouldShowDeliveryStatus(message){if(message.delivery!=='sent'){return false;}
|
|
if(message.type==='mms'){return message.deliveryInfo.every(function(info){return info.deliveryStatus==='success';});}else{return message.deliveryStatus==='success';}},shouldShowReadStatus:function conv_shouldShowReadStatus(message){if(message.delivery!=='sent'||message.type==='sms'||!message.deliveryInfo){return false;}
|
|
return message.deliveryInfo.every(function(info){return info.readStatus==='success';});},buildMessageDOM:function conv_buildMessageDOM(message,hidden){var messageDOM=document.createElement('li'),bodyHTML='';var messageStatus=message.delivery,isNotDownloaded=messageStatus==='not-downloaded',isIncoming=messageStatus==='received'||isNotDownloaded;var noAttachment=(message.type==='mms'&&!isNotDownloaded&&(!message.attachments||message.attachments.length===0));var invalidEmptyContent=(noAttachment&&!message.subject);if(this.shouldShowReadStatus(message)){messageStatus='read';}else if(this.shouldShowDeliveryStatus(message)){messageStatus='delivered';}
|
|
var classNames=['message',message.type,messageStatus,isIncoming?'incoming':'outgoing'];if(hidden){classNames.push('hidden');}
|
|
if(message.type&&message.type==='mms'&&message.subject){classNames.push('has-subject');}
|
|
if(message.type&&message.type==='sms'){var escapedBody=Template.escape(message.body||'');bodyHTML=LinkHelper.searchAndLinkClickableData(escapedBody);}
|
|
if(isNotDownloaded){bodyHTML=this._createNotDownloadedHTML(message,classNames);}
|
|
if(invalidEmptyContent){classNames=classNames.concat(['error','invalid-empty-content']);}else if(noAttachment){classNames.push('no-attachment');}
|
|
if(classNames.indexOf('error')>=0){messageStatus='error';}else if(classNames.indexOf('pending')>=0){messageStatus='pending';}
|
|
messageDOM.className=classNames.join(' ');messageDOM.id='message-'+message.id;messageDOM.dataset.messageId=message.id;messageDOM.dataset.iccId=message.iccId;var simServiceId=Settings.getServiceIdByIccId(message.iccId);var showSimInformation=Settings.hasSeveralSim()&&simServiceId!==null;var simInformationHTML='';if(showSimInformation){simInformationHTML=this.tmpl.messageSimInformation.interpolate({simNumberL10nArgs:JSON.stringify({id:simServiceId+1})});}
|
|
messageDOM.innerHTML=this.tmpl.message.interpolate({id:String(message.id),bodyHTML:bodyHTML,timestamp:String(+message.timestamp),subject:String(message.subject),simInformationHTML:simInformationHTML,messageStatusHTML:this.getMessageStatusMarkup(messageStatus).toString()},{safe:['bodyHTML','simInformationHTML','messageStatusHTML']});TimeHeaders.update(messageDOM.querySelector('time'));var pElement=messageDOM.querySelector('p');if(invalidEmptyContent){pElement.setAttribute('data-l10n-id','no-attachment-text');}
|
|
var lateArrivalInfos=this.computeLateArrivalInfos(message,messageStatus);if(lateArrivalInfos){var lateArrivalNoticeDOM=this.tmpl.lateArrivalNotice.prepare().toDocumentFragment();document.l10n.setAttributes(lateArrivalNoticeDOM.querySelector('.late-arrival-notice'),lateArrivalInfos.l10nId,lateArrivalInfos.l10nArgs);messageDOM.querySelector('.message-details').appendChild(lateArrivalNoticeDOM);}
|
|
var result;if(message.type==='mms'&&!isNotDownloaded&&!noAttachment){this.buildingMessages[message.id]=messageDOM;result=SMIL.parse(message).then((slideArray)=>this.createMmsContent(slideArray)).then((mmsContent)=>{pElement.appendChild(mmsContent);delete this.buildingMessages[message.id];}).then(()=>messageDOM);}else{result=Promise.resolve(messageDOM);}
|
|
return result;},getMessageStatusMarkup:function(status){return['read','delivered','sending','error'].indexOf(status)>=0?this.tmpl.messageStatus.prepare({statusL10nId:'message-delivery-status-'+status}):'';},computeLateArrivalInfos:function(message,messageStatus){var limits=this.LATE_NOTICE_LOWER_LIMITS;var sent=message.sentTimestamp;var received=message.timestamp;var lateness=received-sent;var doNotDisplayNotice=!sent||!received||messageStatus==='error'||lateness<limits.NO_NOTICE;if(doNotDisplayNotice){return null;}
|
|
var unit=MONTH;var noticeL10nIds={[MONTH]:'late-arrival-notice-in-months',[DAY]:'late-arrival-notice-in-days',[HOUR]:'late-arrival-notice-in-hours',[MINUTE]:'late-arrival-notice-in-minutes'};if(lateness<limits.IN_HOURS){unit=MINUTE;}
|
|
else if(lateness<limits.IN_DAYS){unit=HOUR;}
|
|
else if(lateness<limits.IN_MONTHS){unit=DAY;}
|
|
lateness=Math.floor(lateness/unit);return{l10nId:noticeL10nIds[unit],l10nArgs:{lateness}};},appendMessage:function conv_appendMessage(message,hidden){var timestamp=+message.timestamp;var messageDOM=document.getElementById('message-'+message.id);if(messageDOM){this.removeMessageDOM(messageDOM);}
|
|
return this.buildMessageDOM(message,hidden).then((messageDOM)=>{if(!this.shouldRenderForThreadId(message.threadId)){return;}
|
|
messageDOM.dataset.timestamp=timestamp;var messageContainer=this.getMessageContainer(timestamp,hidden);this._insertTimestampedNodeToContainer(messageDOM,messageContainer);if(this.inEditMode){this.updateSelectionStatus();}
|
|
if(!hidden){this.scrollViewToBottom();}});},_insertTimestampedNodeToContainer:function(nodeToInsert,container){var currentNode=container.firstElementChild,nodeTimestamp=nodeToInsert.dataset.timestamp;while(currentNode&&nodeTimestamp>+currentNode.dataset.timestamp){currentNode=currentNode.nextElementSibling;}
|
|
container.insertBefore(nodeToInsert,currentNode||null);},showChunkOfMessages:function conv_showChunkOfMessages(number){var elements=this.container.getElementsByClassName('hidden');Array.slice(elements,-number).forEach((element)=>{element.classList.remove('hidden');if(element.tagName==='HEADER'){TimeHeaders.update(element);}});},showOptions:function conv_showOptions(){var params={header:{l10nId:'message'},items:[]};var subjectItem;if(Compose.isSubjectVisible){subjectItem={l10nId:'remove-subject',method:Compose.hideSubject};}else{subjectItem={l10nId:'add-subject',method:Compose.showSubject};}
|
|
params.items.push(subjectItem);if(Navigation.isCurrentPanel('thread')){params.items.push({l10nId:'includeSomeoneElse-label',method:this.includeSomeoneElse.bind(this)});params.items.push({l10nId:'selectMessages-label',method:this.startEdit.bind(this)});}
|
|
params.items.push({l10nId:'cancel',incomplete:true});new OptionMenu(params).show();},includeSomeoneElse:function(){var content={recipients:this.activeThread.participants,content:Compose.getContent(),subject:Compose.getSubject(),type:Compose.getType()};this.initiateNewMessage({content});Compose.clear();},startEdit:function conv_edit(){function editModeSetup(){this.inEditMode=true;this.selectionHandler.cleanForm();this.mainWrapper.classList.toggle('edit');}
|
|
this.editHeader.removeAttribute('no-font-fit');if(!this.selectionHandler){LazyLoader.load(['/views/shared/js/selection_handler.js','/shared/style/edit_mode.css','/shared/style/switches.css','/shared/style/tabs.css','/views/shared/style/edit-mode.css','/views/conversation/style/edit-mode.css'],()=>{this.selectionHandler=new SelectionHandler({container:this.container,checkUncheckAllButton:this.checkUncheckAllButton,updateSelectionStatus:this.updateSelectionStatus.bind(this),getIdIterator:this.getIdIterator.bind(this),isInEditMode:this.isInEditMode.bind(this)});this.editForm.classList.remove('hide');editModeSetup.call(this);});}else{editModeSetup.call(this);}},isInEditMode:function conv_isInEditMode(){return this.inEditMode;},deleteMessages:function conv_deleteMessages(messageIdList){return MessageManager.deleteMessages(messageIdList).then(()=>{messageIdList.forEach((messageId)=>{Threads.unregisterMessage(messageId);this.removeMessageDOM(document.getElementById('message-'+messageId));});if(!this.activeThread.messages.size){return this.backOrClose();}
|
|
var lastDateGroup=this.container.lastElementChild;var lastMessageNode=lastDateGroup.querySelector('li:last-child');return MessageManager.getMessage(+lastMessageNode.dataset.messageId).then((lastMessage)=>InboxView.updateThread(lastMessage,{deleted:true}));}).catch((e)=>console.error('Error when updating the list of threads',e));},delete:function conv_delete(){return Utils.confirm({id:'deleteMessages-confirmation-message',args:{n:this.selectionHandler.selectedCount}},null,{text:'delete',className:'danger'}).then(()=>{WaitingScreen.show();var messageIdsToDelete=this.selectionHandler.selectedList.map((item)=>+item);return this.deleteMessages(messageIdsToDelete);}).then(()=>{ConversationView.cancelEdit();WaitingScreen.hide();});},cancelEdit:function conv_cancelEdit(){if(this.inEditMode){this.inEditMode=false;this.mainWrapper.classList.remove('edit');}},updateSelectionStatus:function conv_updateSelectionStatus(){var selected=this.selectionHandler.selectedCount;if(this.selectionHandler.allSelected()){this.checkUncheckAllButton.setAttribute('data-l10n-id','deselect-all');}else{this.checkUncheckAllButton.setAttribute('data-l10n-id','select-all');}
|
|
if(selected>0){this.deleteButton.disabled=false;document.l10n.setAttributes(this.editMode,'selected-messages',{n:selected});}else{this.deleteButton.disabled=true;document.l10n.setAttributes(this.editMode,'deleteMessages-title');}},handleMessageClick:function conv_handleMessageClick(evt){var currentNode=evt.target;var elems={};while(currentNode&¤tNode.classList){if(currentNode.classList.contains('bubble')){elems.bubble=currentNode;}else if(currentNode.classList.contains('message')){elems.message=currentNode;}else if(currentNode.classList.contains('message-status')){elems.messageStatus=currentNode;}
|
|
currentNode=currentNode.parentNode;}
|
|
if(!(elems.message&&elems.bubble)){return;}
|
|
if(elems.message.classList.contains('not-downloaded')){if(elems.message.classList.contains('expired')||elems.message.classList.contains('pending')){return;}
|
|
this.retrieveMMS(elems.message);return;}
|
|
if(elems.message.classList.contains('invalid-empty-content')){return;}
|
|
if(elems.message.classList.contains('error')&&elems.messageStatus){Utils.confirm('resend-confirmation').then(()=>{this.resendMessage(elems.message.dataset.messageId);});}},getMessageBubble:function conv_getMessageContainer(element){var node=element;var bubble;do{if(!node.classList){continue;}
|
|
if(node.classList.contains('bubble')){bubble=node;}
|
|
if(bubble){if(node.dataset&&node.dataset.messageId){return{id:+node.dataset.messageId,node:bubble};}}
|
|
if(node.classList.contains('panel-ConversationView')){return null;}}while((node=node.parentNode));return null;},handleEvent:function conv_handleEvent(evt){switch(evt.type){case'click':if(this.inEditMode){return;}
|
|
if(!conv_mmsAttachmentClick(evt.target)){this.handleMessageClick(evt);LinkActionHandler.onClick(evt);}
|
|
return;case'contextmenu':evt.preventDefault();evt.stopPropagation();var messageBubble=this.getMessageBubble(evt.target);if(!messageBubble){return;}
|
|
var lineClassList=messageBubble.node.parentNode.classList;var messageId=messageBubble.id;var params={type:'action',header:{l10nId:'message-options'},items:[]};if(!lineClassList.contains('not-downloaded')){params.items.push({l10nId:'forward',method:()=>{this.initiateNewMessage({messageId});}});}
|
|
params.items.push({l10nId:'select-text',method:(node)=>{this.enableBubbleSelection(node.querySelector('.message-content-body'));},params:[messageBubble.node]},{l10nId:'view-message-report',method:(messageId)=>{Navigation.toPanel('report-view',{id:messageId,threadId:this.activeThread.id});},params:[messageId]},{l10nId:'delete',method:(messageId)=>{Utils.confirm('deleteMessage-confirmation',null,{text:'delete',className:'danger'}).then(()=>this.deleteMessages([messageId]));},params:[messageId]});if(lineClassList.contains('error')&&lineClassList.contains('outgoing')){params.items.push({l10nId:'resend-message',method:this.resendMessage.bind(this,messageId),params:[messageId]});}
|
|
params.items.push({l10nId:'cancel'});var options=new OptionMenu(params);options.show();break;case'submit':evt.preventDefault();break;}},cleanFields:function conv_cleanFields(){this.previousSegment=0;if(this.recipients){this.recipients.length=0;}
|
|
Compose.clear();},onSendClick:function conv_onSendClick(){if(Compose.isEmpty()){return;}
|
|
this.assimilateRecipients();this.container.classList.remove('hide');},simSelectedCallback:function conv_simSelected(phoneNumber,cardIndex){if(Compose.isEmpty()){return;}
|
|
cardIndex=+cardIndex;if(isNaN(cardIndex)){cardIndex=0;}
|
|
this.sendMessage({serviceId:cardIndex});},sendMessage:function conv_sendMessage(opts){var content=Compose.getContent(),subject=Compose.getSubject(),messageType=Compose.type,serviceId=opts.serviceId===undefined?null:opts.serviceId,recipients;var inComposer=Navigation.isCurrentPanel('composer');if(inComposer){if(!this.recipients.length){console.error('The user tried to send the message but no recipients '+'are entered. This should not happen because we should disable '+'the send button in that case');return;}
|
|
recipients=this.recipients.numbers;}else{recipients=this.activeThread.participants;}
|
|
this.disableConvertNoticeBanners();this.cleanFields();this.enableConvertNoticeBanners();this.updateDraft();this.updateHeaderData();this.shouldChangePanelNextEvent=inComposer;if(messageType==='sms'){MessageManager.sendSMS({recipients:recipients,content:content[0],serviceId:serviceId,oncomplete:function onComplete(requestResult){if(!requestResult.hasError){this.onMessageSendRequestCompleted();return;}
|
|
var errors={};requestResult.return.forEach(function(result){if(result.success){return;}
|
|
if(errors[result.code.name]===undefined){errors[result.code.name]=[result.recipient];}else{errors[result.code.name].push(result.recipient);}});for(var key in errors){this.showMessageSendingError(key,{recipients:errors[key]});}}.bind(this)});if(recipients.length>1){this.shouldChangePanelNextEvent=false;Navigation.toPanel('thread-list');if(ActivityClient.hasPendingRequest()){setTimeout(this.backOrClose.bind(this),this.LEAVE_ACTIVITY_DELAY);}
|
|
return;}}else{var smilSlides=content.reduce(conv_generateSmilSlides,[]);var mmsOpts={recipients:recipients,subject:subject,content:smilSlides,serviceId:serviceId,onsuccess:function(){this.onMessageSendRequestCompleted();}.bind(this),onerror:function onError(error){var errorName=error.name;this.showMessageSendingError(errorName);}.bind(this)};MessageManager.sendMMS(mmsOpts);}
|
|
Compose.focus();},onMessageSent:function conv_onMessageSent(e){this.setMessageStatus(e.message.id,'sent');},onMessageSendRequestCompleted:function conv_onMessageSendRequestCompleted(){if(this.sentAudioEnabled){this.sentAudio.play();}},onMessageFailed:function conv_onMessageFailed(e){var message=e.message;this.setMessageStatus(message.id,'error');if(this.showErrorInFailedEvent==='NonActiveSimCardError'){this.showErrorInFailedEvent='';this.showMessageError('NonActiveSimCardToSendError',{confirmHandler:function(){this.setMessageStatus(message.id,'sending');MozMobileConnectionsClient.switchMmsSimHandler(message.iccId).then(this.resendMessage.bind(this,message.id)).catch(function(err){err&&console.error('Unexpected error while resending the MMS message',err);});}.bind(this)});}},onDeliverySuccess:function conv_onDeliverySuccess(e){var message=e.message;if(!this.shouldShowDeliveryStatus(message)){return;}
|
|
this.setMessageStatus(message.id,'delivered');},onReadSuccess:function conv_onReadSuccess(e){var message=e.message;if(!this.shouldShowReadStatus(message)){return;}
|
|
this.setMessageStatus(message.id,'read');},showMessageSendingError:function conv_showMsgSendingError(errorName,opts){if(errorName==='NonActiveSimCardError'){this.showErrorInFailedEvent=errorName;return;}
|
|
if(errorName==='NotFoundError'){console.info('The message was deleted or is no longer available.');return;}
|
|
this.showMessageError(errorName,opts);},showMessageError:function conv_showMessageOnError(errorCode,opts){var dialog=new ErrorDialog(Errors.get(errorCode),opts);dialog.show();},removeMessageDOM:function conv_removeMessageDOM(messageDOM){var messagesContainer=messageDOM.parentNode;messageDOM.remove();if(!messagesContainer.firstElementChild){messagesContainer.parentNode.remove();}},setMessageStatus:function(id,status){var messageDOM=document.getElementById('message-'+id)||this.buildingMessages[id];if(!messageDOM||messageDOM.classList.contains(status)){return;}
|
|
var newStatusMarkup=this.getMessageStatusMarkup(status),oldStatusNode=messageDOM.querySelector('.message-status');messageDOM.classList.remove('sending','pending','sent','received','delivered','read','error');messageDOM.classList.add(status);if(oldStatusNode){oldStatusNode.remove();}
|
|
if(newStatusMarkup){messageDOM.querySelector('.message-details').appendChild(newStatusMarkup.toDocumentFragment());}},retrieveMMS:function conv_retrieveMMS(messageDOM){var id=+messageDOM.dataset.messageId;var iccId=messageDOM.dataset.iccId;var button=messageDOM.querySelector('button');var setMessageStatus=this.setMessageStatus.bind(this);function setMessageButtonStatus(status){var btnL10n=status==='pending'?'downloading-attachment':'download-attachment';setMessageStatus(id,status);button.setAttribute('data-l10n-id',btnL10n);}
|
|
setMessageButtonStatus('pending');MessagingClient.retrieveMMS(id).then(()=>{Threads.unregisterMessage(id);this.removeMessageDOM(messageDOM);},(error)=>{setMessageButtonStatus('error');var errorCode=error&&error.name||null;if(!navigator.mozSettings){console.error('Settings unavailable');return;}
|
|
if(errorCode==='RadioDisabledError'){errorCode='RadioDisabledToDownloadError';}
|
|
if(errorCode){this.showMessageError(errorCode,{confirmHandler:()=>{setMessageButtonStatus('pending');return MozMobileConnectionsClient.switchMmsSimHandler(iccId).then(this.retrieveMMS.bind(this,messageDOM)).catch((err)=>{setMessageButtonStatus('error');if(err==='NoSimCardError'){this.showMessageError(err);return;}
|
|
console.error('Unexpected error while retrieving the MMS message',err||'UnknownError');});}});}});},resendMessage:function conv_resendMessage(id){id=+id;var request=MessageManager.getMessage(id);request.onsuccess=(function(){var message=request.result;var messageDOM=document.getElementById('message-'+id);var resendOpts={message:message,onerror:function onError(error){var errorName=error.name;this.showMessageSendingError(errorName,{recipients:error.data.receivers||[error.data.receiver]});}.bind(this),onsuccess:function(){this.onMessageSendRequestCompleted();}.bind(this)};Threads.unregisterMessage(id);this.removeMessageDOM(messageDOM);MessageManager.resendMessage(resendOpts);}).bind(this);},toFieldKeypress:function(event){if(event.keyCode===13||event.keyCode===event.DOM_VK_ENTER){this.toggleRecipientSuggestions();}},toFieldInput:function(event){var typed;if(event.target.isPlaceholder){typed=event.target.textContent.trim();this.searchContact(typed).then((contacts)=>this.listContacts(typed,contacts));}
|
|
Compose.refresh();},exactContact:function conv_exactContact(fValue){return Contacts.findExact(fValue);},searchContact:function conv_searchContact(fValue){if(!fValue){return Promise.resolve([]);}
|
|
return Contacts.findByString(fValue);},validateContact:function conv_validateContact(source,fValue,contacts){var isInvalid=true;var index=this.recipients.length-1;var last=this.recipientsList.lastElementChild;var typed=last&&last.textContent.trim();var isContact=false;var record,length,number,contact;if(index<0){index=0;}
|
|
var props=['tel'];if(Settings.supportEmailRecipient){props.push('email');}
|
|
if(contacts.length){isInvalid=false;record=contacts[0];var values=props.reduce((values,prop)=>{var propValue=record[prop];if(propValue&&propValue.length){return values.concat(propValue);}
|
|
return values;},[]);length=values.length;if(source.isLookupable&&!source.isQuestionable&&length===1){if(Utils.probablyMatches(values[0].value,fValue)){isContact=true;number=values[0].value;}}else{for(var i=0;i<length;i++){var propValue=values[i].value;if(this.recipients.numbers.indexOf(propValue)===-1){number=propValue;break;}}
|
|
if(typeof number!=='undefined'){isContact=true;}else{isInvalid=true;}}}
|
|
if(isContact){this.recipients.remove(index);contact=Utils.basicContact(number,record);contact.source='contacts';this.recipients.add(contact).focus();return;}
|
|
if(isInvalid&&contacts.length>1){this.validateContact(source,fValue,contacts.slice(1));return;}
|
|
if(!source.isQuestionable&&!length){isInvalid=false;}
|
|
source.isInvalid=isInvalid;if(!typed){this.recipients.update(index,source).focus();}},listContacts:function conv_listContacts(fValue,contacts){this.toggleRecipientSuggestions();if(!this.recipients.inputValue){return;}
|
|
if(!contacts.length){return;}
|
|
var suggestionList=document.createDocumentFragment();var renderer=ContactRenderer.flavor('suggestion');var unknownContactsRenderer=ContactRenderer.flavor('suggestionUnknown');contacts.forEach(function(contact){var rendererArg={contact:contact,input:fValue,target:suggestionList,skip:this.recipients.numbers};if(contact.source!='unknown'){renderer.render(rendererArg);}
|
|
else{unknownContactsRenderer.render(rendererArg);}},this);this.toggleRecipientSuggestions(suggestionList);},onHeaderActivation:function conv_onHeaderActivation(){var participants=this.activeThread&&this.activeThread.participants;if(participants&&participants.length>1){Navigation.toPanel('group-view',{id:this.activeThread.id});return;}
|
|
var number=this.headerText.dataset.number;var tel,email;if(Settings.supportEmailRecipient&&Utils.isEmailAddress(number)){email=number;}else{tel=number;}
|
|
if(this.headerText.dataset.isContact==='true'){this.promptContact({number:number});}else{this.prompt({number:tel,email:email,isContact:false});}},promptContact:function conv_promptContact(opts){opts=opts||{};var number=opts.number||'';var tel,email;if(Settings.supportEmailRecipient&&Utils.isEmailAddress(number)){email=number||'';}else{tel=number||'';}
|
|
return Contacts.findByAddress(number).then((contacts)=>{var isContact=contacts.length;var contact=contacts[0];var id;var fragment;if(isContact){id=contact.id;fragment=document.createDocumentFragment();ContactRenderer.flavor('prompt').render({contact:contact,input:number,target:fragment});}
|
|
return this.prompt({number:tel,email,header:fragment,contactId:id,isContact,inMessage:opts.inMessage});});},prompt:function conv_prompt(opt){var defer=Utils.Promise.defer();var thread=this.activeThread;var number=opt.number||'';var email=opt.email||'';var isContact=opt.isContact||false;var inMessage=opt.inMessage||false;var header=opt.header;var items=[];var params;if(!header&&(number||email)){header=document.createElement('bdi');header.className='unknown-contact-header';header.textContent=number||email;}
|
|
params={classes:['contact-prompt'],complete:defer.resolve,header:header||'',items:null};if(email){items.push({l10nId:'sendEmail',method:function oEmail(param){ActivityPicker.email(param);},params:[email]});if(Settings.supportEmailRecipient){items.push({l10nId:'sendMMSToEmail',method:()=>{this.initiateNewMessage({number:email});},incomplete:true});}}else{if((thread&&thread.participants.length>1)||inMessage){items.push({l10nId:'call',method:function(){ActivityPicker.dial(number);}});items.push({l10nId:'sendMessage',method:()=>{this.initiateNewMessage({number:number});},incomplete:true});}}
|
|
params.items=items;if(!isContact){var newContactInfo=number?{tel:number}:{email:email};params.items.push({l10nId:'createNewContact',method:()=>ActivityPicker.createNewContact(newContactInfo)},{l10nId:'addToExistingContact',method:()=>ActivityPicker.addToExistingContact(newContactInfo)});}
|
|
if(opt.contactId&&!ActivityClient.hasPendingRequest()){params.items.push({l10nId:'viewContact',method:()=>ActivityPicker.viewContact({id:opt.contactId})});}
|
|
if(params.items.length===0){return;}
|
|
params.items.push({l10nId:'cancel',incomplete:true});new OptionMenu(params).show();return defer.promise;},updateDraft(){var conversation=this.activeThread;this.assimilateRecipients();var hasDraftToSave=!Compose.isEmpty()||(!conversation&&this.recipients.numbers.length);var isConversationRemoved=conversation&&!conversation.messages.size;var shouldStoreDrafts=false;if(this.draft&&(!hasDraftToSave||isConversationRemoved)){Drafts.delete(this.draft);this.draft=null;shouldStoreDrafts=true;}
|
|
if(hasDraftToSave&&(!this.draft||this.draft.isEdited)){this.draft=new Draft({id:this.draft&&this.draft.id,threadId:!isConversationRemoved?conversation&&conversation.id:null,recipients:conversation?conversation.participants:this.recipients.numbers,content:Compose.getContent(),subject:Compose.getSubject(),type:Compose.type});Drafts.add(this.draft);shouldStoreDrafts=true;}
|
|
return shouldStoreDrafts?Drafts.store():Promise.resolve();},storeDraftFromMessage(messageId){var message=Threads.Messages.get(messageId);var contentPromise;if(message.type==='sms'){contentPromise=Promise.resolve([message.body]);}else{contentPromise=SMIL.parse(message).then((elements)=>elements.reduce((result,element)=>{if(element.blob){result.push(new Attachment(element.blob,{name:element.name,isDraft:true}));}
|
|
if(element.text){result.push(element.text);}
|
|
return result;},[]));}
|
|
return contentPromise.then((content)=>{var draft=new Draft({subject:message.subject,type:message.type,content});return Drafts.add(draft).store().then(()=>draft.id);});},toggleRecipientSuggestions:function(suggestions){var contactList=this.recipientSuggestions.querySelector('.contact-list');this.recipientSuggestions.classList.toggle('hide',!suggestions);if(!suggestions){contactList.textContent='';}else{contactList.appendChild(suggestions);this.recipientSuggestions.scrollTop=0;}},enableBubbleSelection:function(node){var threadMessagesClass=this.threadMessages.classList;var disable=()=>{this.container.addEventListener('contextmenu',this);node.removeEventListener('blur',disable);threadMessagesClass.add('editable-select-mode');window.getSelection().removeAllRanges();};node.addEventListener('blur',disable);this.container.removeEventListener('contextmenu',this);threadMessagesClass.remove('editable-select-mode');node.focus();window.getSelection().selectAllChildren(node);}};Object.defineProperty(exports,'ConversationView',{get:function(){delete exports.ConversationView;var allowedEvents=['visually-loaded'];return(exports.ConversationView=EventDispatcher.mixin(ConversationView,allowedEvents));},configurable:true,enumerable:true});}(this)); |