matrix-react-sdk
Version:
SDK for matrix.org using React
114 lines (109 loc) • 16.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.LOCAL_STORAGE_KEY = void 0;
exports.checkBrowserSupport = checkBrowserSupport;
exports.getBrowserSupport = getBrowserSupport;
var _logger = require("matrix-js-sdk/src/logger");
var _browserslist = _interopRequireDefault(require("browserslist"));
var _popOut = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/pop-out"));
var _parseUserAgent = require("./utils/device/parseUserAgent");
var _ToastStore = _interopRequireDefault(require("./stores/ToastStore"));
var _GenericToast = _interopRequireDefault(require("./components/views/toasts/GenericToast"));
var _languageHandler = require("./languageHandler");
var _SdkConfig = _interopRequireDefault(require("./SdkConfig"));
/*
Copyright 2024 New Vector Ltd.
Copyright 2024 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
const LOCAL_STORAGE_KEY = exports.LOCAL_STORAGE_KEY = "mx_accepts_unsupported_browser";
const TOAST_KEY = "unsupportedbrowser";
const SUPPORTED_DEVICE_TYPES = [_parseUserAgent.DeviceType.Web, _parseUserAgent.DeviceType.Desktop];
const SUPPORTED_BROWSER_QUERY = "last 2 Chrome versions, last 2 Firefox versions, last 2 Safari versions, last 2 Edge versions";
const LEARN_MORE_URL = "https://github.com/element-hq/element-web#supported-environments";
function onLearnMoreClick() {
onDismissClick();
window.open(LEARN_MORE_URL, "_blank", "noopener,noreferrer");
}
function onDismissClick() {
localStorage.setItem(LOCAL_STORAGE_KEY, String(true));
_ToastStore.default.sharedInstance().dismissToast(TOAST_KEY);
}
function getBrowserNameVersion(browser) {
const [browserName, browserVersion] = browser.split(" ");
const browserNameLc = browserName.toLowerCase();
return [browserNameLc, parseInt(browserVersion, 10)];
}
/**
* Function to check if the current browser is considered supported by our support policy.
* Based on user agent parsing so may be inaccurate if the user has fingerprint prevention turned up to 11.
*/
function getBrowserSupport() {
const browsers = (0, _browserslist.default)(SUPPORTED_BROWSER_QUERY).sort();
const minimumBrowserVersions = new Map();
for (const browser of browsers) {
const [browserName, browserVersion] = getBrowserNameVersion(browser);
// We sorted the browsers so will encounter the minimum version first
if (minimumBrowserVersions.has(browserName)) continue;
minimumBrowserVersions.set(browserName, browserVersion);
}
const details = (0, _parseUserAgent.parseUserAgent)(navigator.userAgent);
let supported = true;
if (!SUPPORTED_DEVICE_TYPES.includes(details.deviceType)) {
_logger.logger.warn("Browser unsupported, unsupported device type", details.deviceType);
supported = false;
}
if (details.client) {
// We don't care about the browser version for desktop devices
// We ship our own browser (electron) for desktop devices
if (details.deviceType === _parseUserAgent.DeviceType.Desktop) {
return supported;
}
const [browserName, browserVersion] = getBrowserNameVersion(details.client);
const minimumVersion = minimumBrowserVersions.get(browserName);
// Check both with the sub-version cut off and without as some browsers have less granular versioning e.g. Safari
if (!minimumVersion || browserVersion < minimumVersion) {
_logger.logger.warn("Browser unsupported, unsupported user agent", details.client);
supported = false;
}
} else {
_logger.logger.warn("Browser unsupported, unknown client", navigator.userAgent);
supported = false;
}
return supported;
}
/**
* Shows a user warning toast if the user's browser is not supported.
*/
function checkBrowserSupport() {
const supported = getBrowserSupport();
if (supported) return;
if (localStorage.getItem(LOCAL_STORAGE_KEY)) {
_logger.logger.warn("Browser unsupported, but user has previously accepted");
return;
}
const brand = _SdkConfig.default.get().brand;
_ToastStore.default.sharedInstance().addOrReplaceToast({
key: TOAST_KEY,
title: (0, _languageHandler._t)("unsupported_browser|title", {
brand
}),
props: {
description: (0, _languageHandler._t)("unsupported_browser|description", {
brand
}),
secondaryLabel: (0, _languageHandler._t)("action|learn_more"),
SecondaryIcon: _popOut.default,
onSecondaryClick: onLearnMoreClick,
primaryLabel: (0, _languageHandler._t)("action|dismiss"),
onPrimaryClick: onDismissClick
},
component: _GenericToast.default,
priority: 40
});
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIl9icm93c2Vyc2xpc3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3BvcE91dCIsIl9wYXJzZVVzZXJBZ2VudCIsIl9Ub2FzdFN0b3JlIiwiX0dlbmVyaWNUb2FzdCIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfU2RrQ29uZmlnIiwiTE9DQUxfU1RPUkFHRV9LRVkiLCJleHBvcnRzIiwiVE9BU1RfS0VZIiwiU1VQUE9SVEVEX0RFVklDRV9UWVBFUyIsIkRldmljZVR5cGUiLCJXZWIiLCJEZXNrdG9wIiwiU1VQUE9SVEVEX0JST1dTRVJfUVVFUlkiLCJMRUFSTl9NT1JFX1VSTCIsIm9uTGVhcm5Nb3JlQ2xpY2siLCJvbkRpc21pc3NDbGljayIsIndpbmRvdyIsIm9wZW4iLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwiU3RyaW5nIiwiVG9hc3RTdG9yZSIsInNoYXJlZEluc3RhbmNlIiwiZGlzbWlzc1RvYXN0IiwiZ2V0QnJvd3Nlck5hbWVWZXJzaW9uIiwiYnJvd3NlciIsImJyb3dzZXJOYW1lIiwiYnJvd3NlclZlcnNpb24iLCJzcGxpdCIsImJyb3dzZXJOYW1lTGMiLCJ0b0xvd2VyQ2FzZSIsInBhcnNlSW50IiwiZ2V0QnJvd3NlclN1cHBvcnQiLCJicm93c2VycyIsImJyb3dzZXJsaXN0Iiwic29ydCIsIm1pbmltdW1Ccm93c2VyVmVyc2lvbnMiLCJNYXAiLCJoYXMiLCJzZXQiLCJkZXRhaWxzIiwicGFyc2VVc2VyQWdlbnQiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJzdXBwb3J0ZWQiLCJpbmNsdWRlcyIsImRldmljZVR5cGUiLCJsb2dnZXIiLCJ3YXJuIiwiY2xpZW50IiwibWluaW11bVZlcnNpb24iLCJnZXQiLCJjaGVja0Jyb3dzZXJTdXBwb3J0IiwiZ2V0SXRlbSIsImJyYW5kIiwiU2RrQ29uZmlnIiwiYWRkT3JSZXBsYWNlVG9hc3QiLCJrZXkiLCJ0aXRsZSIsIl90IiwicHJvcHMiLCJkZXNjcmlwdGlvbiIsInNlY29uZGFyeUxhYmVsIiwiU2Vjb25kYXJ5SWNvbiIsIlBvcE91dEljb24iLCJvblNlY29uZGFyeUNsaWNrIiwicHJpbWFyeUxhYmVsIiwib25QcmltYXJ5Q2xpY2siLCJjb21wb25lbnQiLCJHZW5lcmljVG9hc3QiLCJwcmlvcml0eSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9TdXBwb3J0ZWRCcm93c2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDI0IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcbmltcG9ydCBicm93c2VybGlzdCBmcm9tIFwiYnJvd3NlcnNsaXN0XCI7XG5pbXBvcnQgUG9wT3V0SWNvbiBmcm9tIFwiQHZlY3Rvci1pbS9jb21wb3VuZC1kZXNpZ24tdG9rZW5zL2Fzc2V0cy93ZWIvaWNvbnMvcG9wLW91dFwiO1xuXG5pbXBvcnQgeyBEZXZpY2VUeXBlLCBwYXJzZVVzZXJBZ2VudCB9IGZyb20gXCIuL3V0aWxzL2RldmljZS9wYXJzZVVzZXJBZ2VudFwiO1xuaW1wb3J0IFRvYXN0U3RvcmUgZnJvbSBcIi4vc3RvcmVzL1RvYXN0U3RvcmVcIjtcbmltcG9ydCBHZW5lcmljVG9hc3QgZnJvbSBcIi4vY29tcG9uZW50cy92aWV3cy90b2FzdHMvR2VuZXJpY1RvYXN0XCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IFNka0NvbmZpZyBmcm9tIFwiLi9TZGtDb25maWdcIjtcblxuZXhwb3J0IGNvbnN0IExPQ0FMX1NUT1JBR0VfS0VZID0gXCJteF9hY2NlcHRzX3Vuc3VwcG9ydGVkX2Jyb3dzZXJcIjtcbmNvbnN0IFRPQVNUX0tFWSA9IFwidW5zdXBwb3J0ZWRicm93c2VyXCI7XG5cbmNvbnN0IFNVUFBPUlRFRF9ERVZJQ0VfVFlQRVMgPSBbRGV2aWNlVHlwZS5XZWIsIERldmljZVR5cGUuRGVza3RvcF07XG5jb25zdCBTVVBQT1JURURfQlJPV1NFUl9RVUVSWSA9XG4gICAgXCJsYXN0IDIgQ2hyb21lIHZlcnNpb25zLCBsYXN0IDIgRmlyZWZveCB2ZXJzaW9ucywgbGFzdCAyIFNhZmFyaSB2ZXJzaW9ucywgbGFzdCAyIEVkZ2UgdmVyc2lvbnNcIjtcbmNvbnN0IExFQVJOX01PUkVfVVJMID0gXCJodHRwczovL2dpdGh1Yi5jb20vZWxlbWVudC1ocS9lbGVtZW50LXdlYiNzdXBwb3J0ZWQtZW52aXJvbm1lbnRzXCI7XG5cbmZ1bmN0aW9uIG9uTGVhcm5Nb3JlQ2xpY2soKTogdm9pZCB7XG4gICAgb25EaXNtaXNzQ2xpY2soKTtcbiAgICB3aW5kb3cub3BlbihMRUFSTl9NT1JFX1VSTCwgXCJfYmxhbmtcIiwgXCJub29wZW5lcixub3JlZmVycmVyXCIpO1xufVxuXG5mdW5jdGlvbiBvbkRpc21pc3NDbGljaygpOiB2b2lkIHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMT0NBTF9TVE9SQUdFX0tFWSwgU3RyaW5nKHRydWUpKTtcbiAgICBUb2FzdFN0b3JlLnNoYXJlZEluc3RhbmNlKCkuZGlzbWlzc1RvYXN0KFRPQVNUX0tFWSk7XG59XG5cbmZ1bmN0aW9uIGdldEJyb3dzZXJOYW1lVmVyc2lvbihicm93c2VyOiBzdHJpbmcpOiBbbmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBudW1iZXJdIHtcbiAgICBjb25zdCBbYnJvd3Nlck5hbWUsIGJyb3dzZXJWZXJzaW9uXSA9IGJyb3dzZXIuc3BsaXQoXCIgXCIpO1xuICAgIGNvbnN0IGJyb3dzZXJOYW1lTGMgPSBicm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBbYnJvd3Nlck5hbWVMYywgcGFyc2VJbnQoYnJvd3NlclZlcnNpb24sIDEwKV07XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgYnJvd3NlciBpcyBjb25zaWRlcmVkIHN1cHBvcnRlZCBieSBvdXIgc3VwcG9ydCBwb2xpY3kuXG4gKiBCYXNlZCBvbiB1c2VyIGFnZW50IHBhcnNpbmcgc28gbWF5IGJlIGluYWNjdXJhdGUgaWYgdGhlIHVzZXIgaGFzIGZpbmdlcnByaW50IHByZXZlbnRpb24gdHVybmVkIHVwIHRvIDExLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnJvd3NlclN1cHBvcnQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYnJvd3NlcnMgPSBicm93c2VybGlzdChTVVBQT1JURURfQlJPV1NFUl9RVUVSWSkuc29ydCgpO1xuICAgIGNvbnN0IG1pbmltdW1Ccm93c2VyVmVyc2lvbnMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgYnJvd3NlciBvZiBicm93c2Vycykge1xuICAgICAgICBjb25zdCBbYnJvd3Nlck5hbWUsIGJyb3dzZXJWZXJzaW9uXSA9IGdldEJyb3dzZXJOYW1lVmVyc2lvbihicm93c2VyKTtcbiAgICAgICAgLy8gV2Ugc29ydGVkIHRoZSBicm93c2VycyBzbyB3aWxsIGVuY291bnRlciB0aGUgbWluaW11bSB2ZXJzaW9uIGZpcnN0XG4gICAgICAgIGlmIChtaW5pbXVtQnJvd3NlclZlcnNpb25zLmhhcyhicm93c2VyTmFtZSkpIGNvbnRpbnVlO1xuICAgICAgICBtaW5pbXVtQnJvd3NlclZlcnNpb25zLnNldChicm93c2VyTmFtZSwgYnJvd3NlclZlcnNpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IGRldGFpbHMgPSBwYXJzZVVzZXJBZ2VudChuYXZpZ2F0b3IudXNlckFnZW50KTtcblxuICAgIGxldCBzdXBwb3J0ZWQgPSB0cnVlO1xuICAgIGlmICghU1VQUE9SVEVEX0RFVklDRV9UWVBFUy5pbmNsdWRlcyhkZXRhaWxzLmRldmljZVR5cGUpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiQnJvd3NlciB1bnN1cHBvcnRlZCwgdW5zdXBwb3J0ZWQgZGV2aWNlIHR5cGVcIiwgZGV0YWlscy5kZXZpY2VUeXBlKTtcbiAgICAgICAgc3VwcG9ydGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGRldGFpbHMuY2xpZW50KSB7XG4gICAgICAgIC8vIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGJyb3dzZXIgdmVyc2lvbiBmb3IgZGVza3RvcCBkZXZpY2VzXG4gICAgICAgIC8vIFdlIHNoaXAgb3VyIG93biBicm93c2VyIChlbGVjdHJvbikgZm9yIGRlc2t0b3AgZGV2aWNlc1xuICAgICAgICBpZiAoZGV0YWlscy5kZXZpY2VUeXBlID09PSBEZXZpY2VUeXBlLkRlc2t0b3ApIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBwb3J0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbYnJvd3Nlck5hbWUsIGJyb3dzZXJWZXJzaW9uXSA9IGdldEJyb3dzZXJOYW1lVmVyc2lvbihkZXRhaWxzLmNsaWVudCk7XG4gICAgICAgIGNvbnN0IG1pbmltdW1WZXJzaW9uID0gbWluaW11bUJyb3dzZXJWZXJzaW9ucy5nZXQoYnJvd3Nlck5hbWUpO1xuICAgICAgICAvLyBDaGVjayBib3RoIHdpdGggdGhlIHN1Yi12ZXJzaW9uIGN1dCBvZmYgYW5kIHdpdGhvdXQgYXMgc29tZSBicm93c2VycyBoYXZlIGxlc3MgZ3JhbnVsYXIgdmVyc2lvbmluZyBlLmcuIFNhZmFyaVxuICAgICAgICBpZiAoIW1pbmltdW1WZXJzaW9uIHx8IGJyb3dzZXJWZXJzaW9uIDwgbWluaW11bVZlcnNpb24pIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiQnJvd3NlciB1bnN1cHBvcnRlZCwgdW5zdXBwb3J0ZWQgdXNlciBhZ2VudFwiLCBkZXRhaWxzLmNsaWVudCk7XG4gICAgICAgICAgICBzdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiQnJvd3NlciB1bnN1cHBvcnRlZCwgdW5rbm93biBjbGllbnRcIiwgbmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICAgIHN1cHBvcnRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBwb3J0ZWQ7XG59XG5cbi8qKlxuICogU2hvd3MgYSB1c2VyIHdhcm5pbmcgdG9hc3QgaWYgdGhlIHVzZXIncyBicm93c2VyIGlzIG5vdCBzdXBwb3J0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0Jyb3dzZXJTdXBwb3J0KCk6IHZvaWQge1xuICAgIGNvbnN0IHN1cHBvcnRlZCA9IGdldEJyb3dzZXJTdXBwb3J0KCk7XG4gICAgaWYgKHN1cHBvcnRlZCkgcmV0dXJuO1xuXG4gICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExPQ0FMX1NUT1JBR0VfS0VZKSkge1xuICAgICAgICBsb2dnZXIud2FybihcIkJyb3dzZXIgdW5zdXBwb3J0ZWQsIGJ1dCB1c2VyIGhhcyBwcmV2aW91c2x5IGFjY2VwdGVkXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnJhbmQgPSBTZGtDb25maWcuZ2V0KCkuYnJhbmQ7XG4gICAgVG9hc3RTdG9yZS5zaGFyZWRJbnN0YW5jZSgpLmFkZE9yUmVwbGFjZVRvYXN0KHtcbiAgICAgICAga2V5OiBUT0FTVF9LRVksXG4gICAgICAgIHRpdGxlOiBfdChcInVuc3VwcG9ydGVkX2Jyb3dzZXJ8dGl0bGVcIiwgeyBicmFuZCB9KSxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdChcInVuc3VwcG9ydGVkX2Jyb3dzZXJ8ZGVzY3JpcHRpb25cIiwgeyBicmFuZCB9KSxcbiAgICAgICAgICAgIHNlY29uZGFyeUxhYmVsOiBfdChcImFjdGlvbnxsZWFybl9tb3JlXCIpLFxuICAgICAgICAgICAgU2Vjb25kYXJ5SWNvbjogUG9wT3V0SWNvbixcbiAgICAgICAgICAgIG9uU2Vjb25kYXJ5Q2xpY2s6IG9uTGVhcm5Nb3JlQ2xpY2ssXG4gICAgICAgICAgICBwcmltYXJ5TGFiZWw6IF90KFwiYWN0aW9ufGRpc21pc3NcIiksXG4gICAgICAgICAgICBvblByaW1hcnlDbGljazogb25EaXNtaXNzQ2xpY2ssXG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBvbmVudDogR2VuZXJpY1RvYXN0LFxuICAgICAgICBwcmlvcml0eTogNDAsXG4gICAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLGFBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFJLGVBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFdBQUEsR0FBQUgsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFNLGFBQUEsR0FBQUosc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFPLGdCQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxVQUFBLEdBQUFOLHNCQUFBLENBQUFGLE9BQUE7QUFoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBWU8sTUFBTVMsaUJBQWlCLEdBQUFDLE9BQUEsQ0FBQUQsaUJBQUEsR0FBRyxnQ0FBZ0M7QUFDakUsTUFBTUUsU0FBUyxHQUFHLG9CQUFvQjtBQUV0QyxNQUFNQyxzQkFBc0IsR0FBRyxDQUFDQywwQkFBVSxDQUFDQyxHQUFHLEVBQUVELDBCQUFVLENBQUNFLE9BQU8sQ0FBQztBQUNuRSxNQUFNQyx1QkFBdUIsR0FDekIsK0ZBQStGO0FBQ25HLE1BQU1DLGNBQWMsR0FBRyxrRUFBa0U7QUFFekYsU0FBU0MsZ0JBQWdCQSxDQUFBLEVBQVM7RUFDOUJDLGNBQWMsQ0FBQyxDQUFDO0VBQ2hCQyxNQUFNLENBQUNDLElBQUksQ0FBQ0osY0FBYyxFQUFFLFFBQVEsRUFBRSxx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