UNPKG

matrix-react-sdk

Version:
114 lines (109 loc) 16.4 kB
"use strict"; 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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