2017-05-18 20:08:54 +00:00
|
|
|
"use strict";
|
|
|
|
|
|
|
|
const $ = require("jquery");
|
2017-08-28 20:06:28 +00:00
|
|
|
const escape = require("css.escape");
|
2017-05-18 20:08:54 +00:00
|
|
|
const socket = require("../socket");
|
2017-07-10 19:47:03 +00:00
|
|
|
const webpush = require("../webpush");
|
2018-03-06 11:29:28 +00:00
|
|
|
const slideoutMenu = require("../slideout");
|
2017-05-18 20:08:54 +00:00
|
|
|
const sidebar = $("#sidebar");
|
|
|
|
const storage = require("../localStorage");
|
2017-08-28 15:03:27 +00:00
|
|
|
const utils = require("../utils");
|
2018-07-18 18:40:09 +00:00
|
|
|
const {vueApp, initChannel} = require("../vue");
|
2017-05-18 20:08:54 +00:00
|
|
|
|
|
|
|
socket.on("init", function(data) {
|
2017-08-28 15:03:27 +00:00
|
|
|
$("#loading-page-message, #connection-error").text("Rendering…");
|
|
|
|
|
2018-07-17 08:21:08 +00:00
|
|
|
const previousActive = vueApp.activeChannel && vueApp.activeChannel.channel.id;
|
2017-05-18 20:08:54 +00:00
|
|
|
|
2018-07-08 20:08:08 +00:00
|
|
|
const networks = new Set(JSON.parse(storage.get("thelounge.networks.collapsed")));
|
|
|
|
|
|
|
|
for (const network of data.networks) {
|
2018-07-19 17:19:45 +00:00
|
|
|
network.isCollapsed = networks.has(network.uuid);
|
|
|
|
network.channels.forEach(initChannel);
|
|
|
|
|
2018-07-15 20:23:49 +00:00
|
|
|
const currentNetwork = vueApp.networks.find((n) => n.uuid === network.uuid);
|
|
|
|
|
2018-07-19 17:19:45 +00:00
|
|
|
// If we are reconnecting, merge existing state variables because they don't exist on the server
|
|
|
|
if (!currentNetwork) {
|
|
|
|
network.isJoinChannelShown = false;
|
2018-07-15 20:23:49 +00:00
|
|
|
|
2018-07-19 17:19:45 +00:00
|
|
|
continue;
|
|
|
|
}
|
2018-07-15 20:23:49 +00:00
|
|
|
|
2018-07-19 17:19:45 +00:00
|
|
|
network.isJoinChannelShown = currentNetwork.isJoinChannelShown;
|
2018-07-17 08:03:35 +00:00
|
|
|
|
2018-07-19 17:19:45 +00:00
|
|
|
for (const channel of network.channels) {
|
|
|
|
const currentChannel = currentNetwork.channels.find((c) => c.id === channel.id);
|
2018-07-15 20:23:49 +00:00
|
|
|
|
2018-07-19 17:19:45 +00:00
|
|
|
if (!currentChannel) {
|
|
|
|
continue;
|
2018-07-15 20:23:49 +00:00
|
|
|
}
|
2018-07-12 18:33:52 +00:00
|
|
|
|
2018-07-19 17:19:45 +00:00
|
|
|
channel.scrolledToBottom = currentChannel.scrolledToBottom;
|
|
|
|
channel.pendingMessage = currentChannel.pendingMessage;
|
|
|
|
|
|
|
|
// Reconnection only sends new messages, so merge it on the client
|
|
|
|
if (currentChannel.messages) {
|
|
|
|
channel.messages = currentChannel.messages.concat(channel.messages);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (currentChannel.moreHistoryAvailable) {
|
|
|
|
channel.moreHistoryAvailable = true;
|
|
|
|
}
|
|
|
|
}
|
2018-07-08 20:08:08 +00:00
|
|
|
}
|
|
|
|
|
2018-07-06 18:15:15 +00:00
|
|
|
vueApp.networks = data.networks;
|
2018-07-12 18:33:52 +00:00
|
|
|
vueApp.connected = true;
|
2017-05-18 20:08:54 +00:00
|
|
|
|
2018-02-23 19:18:42 +00:00
|
|
|
$("#connection-error").removeClass("shown");
|
2018-07-08 17:53:23 +00:00
|
|
|
|
2018-07-15 20:23:49 +00:00
|
|
|
if (!vueApp.initialized) {
|
|
|
|
vueApp.initialized = true;
|
|
|
|
|
2017-08-28 15:03:27 +00:00
|
|
|
if (data.token) {
|
|
|
|
storage.set("token", data.token);
|
|
|
|
}
|
2017-05-18 20:08:54 +00:00
|
|
|
|
2017-08-28 15:03:27 +00:00
|
|
|
webpush.configurePushNotifications(data.pushSubscription, data.applicationServerKey);
|
2017-07-10 19:47:03 +00:00
|
|
|
|
2018-03-15 13:11:15 +00:00
|
|
|
slideoutMenu.enable();
|
|
|
|
|
|
|
|
const viewport = $("#viewport");
|
2018-06-27 07:05:37 +00:00
|
|
|
const viewportWidth = $(window).outerWidth();
|
|
|
|
let isUserlistOpen = storage.get("thelounge.state.userlist");
|
2018-03-15 13:11:15 +00:00
|
|
|
|
2018-09-18 19:27:35 +00:00
|
|
|
if (viewportWidth > utils.mobileViewportPixels) {
|
2018-06-28 07:45:40 +00:00
|
|
|
slideoutMenu.toggle(storage.get("thelounge.state.sidebar") !== "false");
|
2018-03-15 13:11:15 +00:00
|
|
|
}
|
|
|
|
|
2018-06-27 07:05:37 +00:00
|
|
|
// If The Lounge is opened on a small screen (less than 1024px), and we don't have stored
|
|
|
|
// user list state, close it by default
|
|
|
|
if (viewportWidth >= 1024 && isUserlistOpen !== "true" && isUserlistOpen !== "false") {
|
|
|
|
isUserlistOpen = "true";
|
|
|
|
}
|
|
|
|
|
|
|
|
viewport.toggleClass("userlist-open", isUserlistOpen === "true");
|
|
|
|
|
2018-02-23 19:22:05 +00:00
|
|
|
$(document.body).removeClass("signed-out");
|
2017-08-28 15:03:27 +00:00
|
|
|
$("#loading").remove();
|
|
|
|
$("#sign-in").remove();
|
2017-12-01 18:04:50 +00:00
|
|
|
|
|
|
|
if (window.g_LoungeErrorHandler) {
|
|
|
|
window.removeEventListener("error", window.g_LoungeErrorHandler);
|
|
|
|
window.g_LoungeErrorHandler = null;
|
|
|
|
}
|
2017-08-28 15:03:27 +00:00
|
|
|
}
|
2017-05-18 20:08:54 +00:00
|
|
|
|
2018-07-08 13:42:54 +00:00
|
|
|
vueApp.$nextTick(() => openCorrectChannel(previousActive, data.active));
|
2018-07-12 18:33:52 +00:00
|
|
|
|
|
|
|
utils.confirmExit();
|
|
|
|
|
|
|
|
for (const network of vueApp.networks) {
|
|
|
|
for (const channel of network.channels) {
|
|
|
|
if (channel.highlight > 0) {
|
|
|
|
utils.updateTitle();
|
|
|
|
utils.toggleNotificationMarkers(true);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-05-18 20:08:54 +00:00
|
|
|
});
|
2017-08-28 20:06:28 +00:00
|
|
|
|
|
|
|
function openCorrectChannel(clientActive, serverActive) {
|
2017-09-20 07:44:36 +00:00
|
|
|
let target = $();
|
2017-08-28 20:06:28 +00:00
|
|
|
|
|
|
|
// Open last active channel
|
|
|
|
if (clientActive > 0) {
|
2017-12-23 08:00:16 +00:00
|
|
|
target = sidebar.find(`.chan[data-id="${clientActive}"]`);
|
2017-08-28 20:06:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Open window provided in location.hash
|
2017-09-20 07:44:36 +00:00
|
|
|
if (target.length === 0 && window.location.hash) {
|
2017-12-25 00:17:26 +00:00
|
|
|
target = $(`[data-target="${escape(window.location.hash)}"]`).first();
|
2017-08-28 20:06:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Open last active channel according to the server
|
2017-09-20 07:44:36 +00:00
|
|
|
if (serverActive > 0 && target.length === 0) {
|
2017-12-23 08:00:16 +00:00
|
|
|
target = sidebar.find(`.chan[data-id="${serverActive}"]`);
|
2017-08-28 20:06:28 +00:00
|
|
|
}
|
|
|
|
|
2017-09-20 07:44:36 +00:00
|
|
|
// Open first available channel
|
|
|
|
if (target.length === 0) {
|
|
|
|
target = sidebar.find(".chan").first();
|
|
|
|
}
|
|
|
|
|
2017-08-28 20:06:28 +00:00
|
|
|
// If target channel is found, open it
|
2017-09-20 07:44:36 +00:00
|
|
|
if (target.length > 0) {
|
2017-08-28 20:06:28 +00:00
|
|
|
target.trigger("click", {
|
2017-11-15 06:35:15 +00:00
|
|
|
replaceHistory: true,
|
2017-08-28 20:06:28 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Open the connect window
|
|
|
|
$("#footer .connect").trigger("click", {
|
2017-11-15 06:35:15 +00:00
|
|
|
pushState: false,
|
2017-08-28 20:06:28 +00:00
|
|
|
});
|
|
|
|
}
|