outdated-browser-rework
Version:
Detects outdated browsers and asks users to upgrade to a new version. Handles mobile devices!
185 lines (154 loc) • 5.6 kB
JavaScript
var evaluateBrowser = require("./evaluateBrowser")
var languageMessages = require("./languages.json")
var deepExtend = require("./extend")
var UserAgentParser = require("ua-parser-js")
var COLORS = {
salmon: "#f25648",
white: "white"
}
module.exports = function(options) {
var main = function() {
// Despite the docs, UA needs to be provided to constructor explicitly:
// https://github.com/faisalman/ua-parser-js/issues/90
var parsedUserAgent = new UserAgentParser(navigator.userAgent).getResult()
// Variable definition (before ajax)
var outdatedUI = document.getElementById("outdated")
// Set default options
options = options || {}
var browserLocale = window.navigator.language || window.navigator.userLanguage // Everyone else, IE
// CSS property to check for. You may also like 'borderSpacing', 'boxShadow', 'transform', 'borderImage';
var backgroundColor = options.backgroundColor || COLORS.salmon
var textColor = options.textColor || COLORS.white
var fullscreen = options.fullscreen || false
var language = options.language || browserLocale.slice(0, 2) // Language code
var updateSource = "web" // Other possible values are 'googlePlay' or 'appStore'. Determines where we tell users to go for upgrades.
// Chrome mobile is still Chrome (unlike Safari which is 'Mobile Safari')
var isAndroid = parsedUserAgent.os.name === "Android"
if (isAndroid) {
updateSource = "googlePlay"
} else if (parsedUserAgent.os.name === "iOS") {
updateSource = "appStore"
}
var isBrowserUnsupported = false // set later after browser evaluation
var done = true
var changeOpacity = function (opacityValue) {
outdatedUI.style.opacity = opacityValue / 100
outdatedUI.style.filter = "alpha(opacity=" + opacityValue + ")"
}
var fadeIn = function (opacityValue) {
changeOpacity(opacityValue)
if (opacityValue === 1) {
outdatedUI.style.display = "table"
}
if (opacityValue === 100) {
done = true
}
}
var makeFadeInFunction = function (opacityValue) {
return function () {
fadeIn(opacityValue)
}
}
// Style element explicitly - TODO: investigate and delete if not needed
var startStylesAndEvents = function () {
var buttonClose = document.getElementById("buttonCloseUpdateBrowser")
var buttonUpdate = document.getElementById("buttonUpdateBrowser")
//check settings attributes
outdatedUI.style.backgroundColor = backgroundColor
//way too hard to put !important on IE6
outdatedUI.style.color = textColor
outdatedUI.children[0].children[0].style.color = textColor
outdatedUI.children[0].children[1].style.color = textColor
// Update button is desktop only
if (buttonUpdate) {
buttonUpdate.style.color = textColor
if (buttonUpdate.style.borderColor) {
buttonUpdate.style.borderColor = textColor
}
// Override the update button color to match the background color
buttonUpdate.onmouseover = function () {
this.style.color = backgroundColor
this.style.backgroundColor = textColor
}
buttonUpdate.onmouseout = function () {
this.style.color = textColor
this.style.backgroundColor = backgroundColor
}
}
buttonClose.style.color = textColor
buttonClose.onmousedown = function () {
outdatedUI.style.display = "none"
return false
}
}
var getMessage = function (lang) {
var defaultMessages = languageMessages[lang] || languageMessages.en
var customMessages = options.messages && options.messages[lang]
var messages = deepExtend({}, defaultMessages, customMessages)
var updateMessages = {
web:
"<p>" +
messages.update.web +
(messages.url ? (
'<a id="buttonUpdateBrowser" rel="nofollow" href="' +
messages.url +
'">' +
messages.callToAction +
"</a>"
) : '') +
"</p>",
googlePlay:
"<p>" +
messages.update.googlePlay +
'<a id="buttonUpdateBrowser" rel="nofollow" href="https://play.google.com/store/apps/details?id=com.android.chrome">' +
messages.callToAction +
"</a></p>",
appStore: "<p>" + messages.update[updateSource] + "</p>"
}
var updateMessage = updateMessages[updateSource]
var browserSupportMessage = messages.outOfDate;
if (isBrowserUnsupported && messages.unsupported) {
browserSupportMessage = messages.unsupported;
}
return (
'<div class="vertical-center"><h6>' +
browserSupportMessage +
"</h6>" +
updateMessage +
'<p class="last"><a href="#" id="buttonCloseUpdateBrowser" title="' +
messages.close +
'">×</a></p></div>'
)
}
var result = evaluateBrowser(parsedUserAgent, options);
if (result.isAndroidButNotChrome || result.isBrowserOutOfDate || !result.isPropertySupported) {
// This is an outdated browser and the banner needs to show
// Set this flag with the result for `getMessage`
isBrowserUnsupported = result.isBrowserUnsupported
if (done && outdatedUI.style.opacity !== "1") {
done = false
for (var opacity = 1; opacity <= 100; opacity++) {
setTimeout(makeFadeInFunction(opacity), opacity * 8)
}
}
var insertContentHere = document.getElementById("outdated")
if (fullscreen) {
insertContentHere.classList.add("fullscreen")
}
insertContentHere.innerHTML = getMessage(language)
startStylesAndEvents()
}
}
// Load main when DOM ready.
var oldOnload = window.onload
if (typeof window.onload !== "function") {
window.onload = main
} else {
window.onload = function() {
if (oldOnload) {
oldOnload()
}
main()
}
}
}