/* global ConversationController, extension, getInboxCollection, i18n, Whisper, Signal */ // eslint-disable-next-line func-names (function() { 'use strict'; window.Whisper = window.Whisper || {}; Whisper.StickerPackInstallFailedToast = Whisper.ToastView.extend({ render_attributes() { return { toastMessage: i18n('stickers--toast--InstallFailed') }; }, }); Whisper.ConversationStack = Whisper.View.extend({ className: 'conversation-stack', open(conversation) { const id = `conversation-${conversation.cid}`; if (id !== this.el.firstChild.id) { this.$el .first() .find('video, audio') .each(function pauseMedia() { this.pause(); }); let $el = this.$(`#${id}`); if ($el === null || $el.length === 0) { const view = new Whisper.ConversationView({ model: conversation, window: this.model.window, }); // eslint-disable-next-line prefer-destructuring $el = view.$el; } $el.prependTo(this.el); } conversation.trigger('opened'); // Make sure poppers are positioned properly window.dispatchEvent(new Event('resize')); }, }); Whisper.AppLoadingScreen = Whisper.View.extend({ templateName: 'app-loading-screen', className: 'app-loading-screen', updateProgress(count) { if (count > 0) { const message = i18n('loadingMessages', count.toString()); this.$('.message').text(message); } }, render_attributes: { message: i18n('loading'), }, }); Whisper.InboxView = Whisper.View.extend({ templateName: 'two-column', className: 'inbox index', initialize(options = {}) { this.ready = false; this.render(); this.$el.attr('tabindex', '1'); this.conversation_stack = new Whisper.ConversationStack({ el: this.$('.conversation-stack'), model: { window: options.window }, }); if (!options.initialLoadComplete) { this.appLoadingScreen = new Whisper.AppLoadingScreen(); this.appLoadingScreen.render(); this.appLoadingScreen.$el.prependTo(this.el); this.startConnectionListener(); } const inboxCollection = getInboxCollection(); this.listenTo(inboxCollection, 'messageError', () => { if (this.networkStatusView) { this.networkStatusView.update(); } }); this.networkStatusView = new Whisper.NetworkStatusView(); this.$el .find('.network-status-container') .append(this.networkStatusView.render().el); if (extension.expired()) { const banner = new Whisper.ExpiredAlertBanner().render(); banner.$el.prependTo(this.$el); this.$el.addClass('expired'); } Whisper.events.on('pack-install-failed', () => { const toast = new Whisper.StickerPackInstallFailedToast(); toast.$el.appendTo(this.$el); toast.render(); }); this.setupLeftPane(); }, render_attributes: { welcomeToSignal: i18n('welcomeToSignal'), selectAContact: i18n('selectAContact'), }, events: { click: 'onClick', }, setupLeftPane() { this.leftPaneView = new Whisper.ReactWrapperView({ JSX: Signal.State.Roots.createLeftPane(window.reduxStore), className: 'left-pane-wrapper', }); // Finally, add it to the DOM this.$('.left-pane-placeholder').append(this.leftPaneView.el); }, startConnectionListener() { this.interval = setInterval(() => { const status = window.getSocketStatus(); switch (status) { case WebSocket.CONNECTING: break; case WebSocket.OPEN: clearInterval(this.interval); // if we've connected, we can wait for real empty event this.interval = null; break; case WebSocket.CLOSING: case WebSocket.CLOSED: clearInterval(this.interval); this.interval = null; // if we failed to connect, we pretend we got an empty event this.onEmpty(); break; default: // We also replicate empty here this.onEmpty(); break; } }, 1000); }, onEmpty() { const view = this.appLoadingScreen; if (view) { this.appLoadingScreen = null; view.remove(); } }, onProgress(count) { const view = this.appLoadingScreen; if (view) { view.updateProgress(count); } }, focusConversation(e) { if (e && this.$(e.target).closest('.placeholder').length) { return; } this.$('#header, .gutter').addClass('inactive'); this.$('.conversation-stack').removeClass('inactive'); }, focusHeader() { this.$('.conversation-stack').addClass('inactive'); this.$('#header, .gutter').removeClass('inactive'); this.$('.conversation:first .menu').trigger('close'); }, reloadBackgroundPage() { window.location.reload(); }, async openConversation(id, messageId) { const conversation = await ConversationController.getOrCreateAndWait( id, 'private' ); const { openConversationExternal } = window.reduxActions.conversations; if (openConversationExternal) { openConversationExternal(id, messageId); } this.conversation_stack.open(conversation); this.focusConversation(); }, closeRecording(e) { if (e && this.$(e.target).closest('.capture-audio').length > 0) { return; } this.$('.conversation:first .recorder').trigger('close'); }, onClick(e) { this.closeRecording(e); }, }); Whisper.ExpiredAlertBanner = Whisper.View.extend({ templateName: 'expired_alert', className: 'expiredAlert clearfix', render_attributes() { return { expiredWarning: i18n('expiredWarning'), upgrade: i18n('upgrade'), }; }, }); })();