vpn-card.mjs (3319B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 export default class VPNCard { 6 constructor(doc) { 7 this.doc = doc; 8 } 9 10 init() { 11 const vpnLink = this.doc.getElementById("get-vpn-link"); 12 const vpnBannerLink = this.doc.getElementById("vpn-banner-link"); 13 vpnLink.href = RPMGetStringPref( 14 "browser.contentblocking.report.vpn.url", 15 "" 16 ); 17 vpnBannerLink.href = RPMGetStringPref( 18 "browser.contentblocking.report.vpn-promo.url", 19 "" 20 ); 21 22 vpnLink.addEventListener("click", () => { 23 this.doc.sendTelemetryEvent("clickVpnCardLink"); 24 }); 25 let androidVPNAppLink = document.getElementById( 26 "vpn-google-playstore-link" 27 ); 28 androidVPNAppLink.href = RPMGetStringPref( 29 "browser.contentblocking.report.vpn-android.url" 30 ); 31 androidVPNAppLink.addEventListener("click", () => { 32 document.sendTelemetryEvent("clickVpnAppLinkAndroid"); 33 }); 34 let iosVPNAppLink = document.getElementById("vpn-app-store-link"); 35 iosVPNAppLink.href = RPMGetStringPref( 36 "browser.contentblocking.report.vpn-ios.url" 37 ); 38 iosVPNAppLink.addEventListener("click", () => { 39 document.sendTelemetryEvent("clickVpnAppLinkIos"); 40 }); 41 42 const vpnBanner = this.doc.querySelector(".vpn-banner"); 43 const exitIcon = vpnBanner.querySelector(".exit-icon"); 44 vpnBannerLink.addEventListener("click", () => { 45 this.doc.sendTelemetryEvent("clickVpnBannerLink"); 46 }); 47 // User has closed the vpn banner, hide it. 48 exitIcon.addEventListener("click", () => { 49 vpnBanner.classList.add("hidden"); 50 this.doc.sendTelemetryEvent("clickVpnBannerClose"); 51 }); 52 53 this.showVPNCard(); 54 } 55 56 // Show the VPN card if user is located in areas, and on platforms, it serves 57 async showVPNCard() { 58 const showVPNBanner = this.showVPNBanner.bind(this); 59 RPMSendQuery("FetchShowVPNCard", {}).then(shouldShow => { 60 if (!shouldShow) { 61 return; 62 } 63 const vpnCard = this.doc.querySelector(".vpn-card"); 64 65 // add 'subscribed' class if user is subscribed to vpn 66 RPMSendQuery("FetchVPNSubStatus", {}).then(async hasVPN => { 67 if (hasVPN) { 68 vpnCard.classList.add("subscribed"); 69 document.l10n.setAttributes( 70 vpnCard.querySelector(".card-title"), 71 "vpn-title-subscribed" 72 ); 73 74 // hide the promo banner if the user is already subscribed to vpn 75 await RPMSetPref( 76 "browser.contentblocking.report.hide_vpn_banner", 77 true 78 ); 79 } 80 81 vpnCard.classList.remove("hidden"); 82 showVPNBanner(); 83 }); 84 }); 85 } 86 87 showVPNBanner() { 88 if ( 89 RPMGetBoolPref("browser.contentblocking.report.hide_vpn_banner", false) || 90 !RPMGetBoolPref("browser.vpn_promo.enabled", false) 91 ) { 92 return; 93 } 94 95 const vpnBanner = this.doc.querySelector(".vpn-banner"); 96 vpnBanner.classList.remove("hidden"); 97 this.doc.sendTelemetryEvent("showVpnBanner"); 98 // VPN banner only shows on the first visit, flip a pref so it does not show again. 99 RPMSetPref("browser.contentblocking.report.hide_vpn_banner", true); 100 } 101 }