From cc939f9645971b288231616dc929981e67a8dce8 Mon Sep 17 00:00:00 2001
From: Michael Telatynski <7t3chguy@gmail.com>
Date: Wed, 8 Apr 2020 21:41:22 +0100
Subject: [PATCH] extract browser compatibility error handling out of app.js
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---
src/vector/app.js | 64 +++++++++++++++++++--------------------------
src/vector/index.ts | 16 +++++++++---
src/vector/init.tsx | 13 +++++++--
3 files changed, 51 insertions(+), 42 deletions(-)
diff --git a/src/vector/app.js b/src/vector/app.js
index d0acce63..222a76a0 100644
--- a/src/vector/app.js
+++ b/src/vector/app.js
@@ -126,7 +126,7 @@ function onTokenLoginCompleted() {
window.location.href = formatted;
}
-export async function loadApp(fragParams: {}, acceptBrowser: boolean) {
+export async function loadApp(fragParams: {}) {
// XXX: the way we pass the path to the worker script from webpack via html in body's dataset is a hack
// but alternatives seem to require changing the interface to passing Workers to js-sdk
const vectorIndexeddbWorkerScript = document.body.dataset.vectorIndexeddbWorkerScript;
@@ -148,45 +148,35 @@ export async function loadApp(fragParams: {}, acceptBrowser: boolean) {
const urlWithoutQuery = window.location.protocol + '//' + window.location.host + window.location.pathname;
console.log("Vector starting at " + urlWithoutQuery);
- if (acceptBrowser) {
- platform.startUpdater();
- try {
- // Don't bother loading the app until the config is verified
- const config = await verifyServerConfig();
- const MatrixChat = sdk.getComponent('structures.MatrixChat');
- return ;
- } catch (err) {
- console.error(err);
+ platform.startUpdater();
- let errorMessage = err.translatedMessage
- || _t("Unexpected error preparing the app. See console for details.");
- errorMessage = {errorMessage};
+ try {
+ // Don't bother loading the app until the config is verified
+ const config = await verifyServerConfig();
+ const MatrixChat = sdk.getComponent('structures.MatrixChat');
+ return ;
+ } catch (err) {
+ console.error(err);
- // Like the compatibility page, AWOOOOOGA at the user
- const GenericErrorPage = sdk.getComponent("structures.GenericErrorPage");
- return ;
- }
- } else {
- console.error("Browser is missing required features.");
- // take to a different landing page to AWOOOOOGA at the user
- const CompatibilityPage = sdk.getComponent("structures.CompatibilityPage");
- return ;
+ let errorMessage = err.translatedMessage
+ || _t("Unexpected error preparing the app. See console for details.");
+ errorMessage = {errorMessage};
+
+ // Like the compatibility page, AWOOOOOGA at the user
+ const GenericErrorPage = sdk.getComponent("structures.GenericErrorPage");
+ return ;
}
}
diff --git a/src/vector/index.ts b/src/vector/index.ts
index f3c091f5..1436171f 100644
--- a/src/vector/index.ts
+++ b/src/vector/index.ts
@@ -100,6 +100,7 @@ async function start() {
loadTheme,
loadApp,
showError,
+ showIncompatibleBrowser,
_t,
} = await import(
/* webpackChunkName: "init" */
@@ -148,9 +149,18 @@ async function start() {
// ##########################
// error handling begins here
// ##########################
+ console.log("DEBUG", acceptBrowser);
if (!acceptBrowser) {
await new Promise(resolve => {
- // todo
+ console.error("Browser is missing required features.");
+ // take to a different landing page to AWOOOOOGA at the user
+ showIncompatibleBrowser(() => {
+ if (window.localStorage) {
+ window.localStorage.setItem('mx_accepts_unsupported_browser', String(true));
+ }
+ console.log("User accepts the compatibility risks.");
+ resolve();
+ });
});
}
@@ -170,7 +180,7 @@ async function start() {
// ##################################
// app load critical path starts here
- // await things starting successfully
+ // assert things started successfully
// ##################################
await loadOlmPromise;
await loadSkinPromise;
@@ -179,7 +189,7 @@ async function start() {
// Finally, load the app. All of the other react-sdk imports are in this file which causes the skinner to
// run on the components.
- await loadApp(fragparts.params, acceptBrowser);
+ await loadApp(fragparts.params);
} catch (err) {
console.trace(err);
const { showError } = await import(
diff --git a/src/vector/init.tsx b/src/vector/init.tsx
index 583d96a9..c7c9141e 100644
--- a/src/vector/init.tsx
+++ b/src/vector/init.tsx
@@ -135,13 +135,13 @@ export async function loadTheme() {
setTheme();
}
-export async function loadApp(fragParams: {}, acceptBrowser: boolean) {
+export async function loadApp(fragParams: {}) {
// load app.js async so that its code is not executed immediately and we can catch any exceptions
const module = await import(
/* webpackChunkName: "riot-web-app" */
/* webpackPreload: true */
"./app");
- window.matrixChat = ReactDOM.render(await module.loadApp(fragParams, acceptBrowser),
+ window.matrixChat = ReactDOM.render(await module.loadApp(fragParams),
document.getElementById('matrixchat'));
}
@@ -154,4 +154,13 @@ export async function showError(title: string, messages?: string[]) {
document.getElementById('matrixchat'));
}
+export async function showIncompatibleBrowser(onAccept) {
+ const CompatibilityPage = (await import(
+ /* webpackChunkName: "compatibility-page" */
+ /* webpackPreload: true */
+ "matrix-react-sdk/src/components/structures/CompatibilityPage")).default;
+ window.matrixChat = ReactDOM.render(,
+ document.getElementById('matrixchat'));
+}
+
export const _t = languageHandler._t;