/* global Whisper: false */ // eslint-disable-next-line func-names (function() { 'use strict'; window.Whisper = window.Whisper || {}; Whisper.MessageView = Whisper.View.extend({ tagName: 'li', id() { return this.model.id; }, initialize() { this.listenTo(this.model, 'change', this.onChange); this.listenTo(this.model, 'destroy', this.onDestroy); this.listenTo(this.model, 'unload', this.onUnload); this.listenTo(this.model, 'expired', this.onExpired); }, onChange() { this.addId(); }, addId() { // The ID is important for other items inserting themselves into the DOM. Because // of ReactWrapperView and this view, there are two layers of DOM elements // between the parent and the elements returned by the React component, so this is // necessary. const { id } = this.model; this.$el.attr('id', id); }, onExpired() { setTimeout(() => this.onUnload(), 1000); }, onUnload() { if (this.childView) { this.childView.remove(); } this.remove(); }, onDestroy() { this.onUnload(); }, getRenderInfo() { const { Components } = window.Signal; if (this.model.propsForTimerNotification) { return { Component: Components.TimerNotification, props: this.model.propsForTimerNotification, }; } else if (this.model.propsForSafetyNumberNotification) { return { Component: Components.SafetyNumberNotification, props: this.model.propsForSafetyNumberNotification, }; } else if (this.model.propsForVerificationNotification) { return { Component: Components.VerificationNotification, props: this.model.propsForVerificationNotification, }; } else if (this.model.propsForResetSessionNotification) { return { Component: Components.ResetSessionNotification, props: this.model.propsForResetSessionNotification, }; } else if (this.model.propsForGroupNotification) { return { Component: Components.GroupNotification, props: this.model.propsForGroupNotification, }; } else if (this.model.isSessionRestoration()) { return { Component: Components.ResetSessionNotification, props: this.model.getPropsForResetSessionNotification(), }; } else if (this.model.propsForFriendRequest) { return { Component: Components.FriendRequest, props: this.model.propsForFriendRequest, }; } else if (this.model.propsForGroupInvitation) { return { Component: Components.GroupInvitation, props: this.model.propsForGroupInvitation, }; } return { Component: Components.Message, props: this.model.propsForMessage, }; }, render() { this.addId(); if (this.childView) { this.childView.remove(); this.childView = null; } const { Component, props } = this.getRenderInfo(); this.childView = new Whisper.ReactWrapperView({ className: 'message-wrapper', Component, props, }); const update = () => { const info = this.getRenderInfo(); this.childView.update(info.props); }; this.listenTo(this.model, 'change', update); this.listenTo(this.model, 'expired', update); const applicableConversationChanges = 'change:color change:name change:number change:profileName change:profileAvatar'; this.conversation = this.model.getConversation(); this.listenTo(this.conversation, applicableConversationChanges, update); this.fromContact = this.model.getIncomingContact(); if (this.fromContact) { this.listenTo(this.fromContact, applicableConversationChanges, update); } this.quotedContact = this.model.getQuoteContact(); if (this.quotedContact) { this.listenTo( this.quotedContact, applicableConversationChanges, update ); } this.$el.append(this.childView.el); return this; }, }); })();