/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ import React from "react"; import ReactDOM from "react-dom"; import { MultiStageAboutWelcome } from "./components/MultiStageAboutWelcome"; import { SimpleAboutWelcome } from "./components/SimpleAboutWelcome"; import { ReturnToAMO } from "./components/ReturnToAMO"; import { AboutWelcomeUtils, DEFAULT_WELCOME_CONTENT, } from "../lib/aboutwelcome-utils"; class AboutWelcome extends React.PureComponent { constructor(props) { super(props); this.state = { metricsFlowUri: null }; this.fetchFxAFlowUri = this.fetchFxAFlowUri.bind(this); this.handleStartBtnClick = this.handleStartBtnClick.bind(this); } async fetchFxAFlowUri() { this.setState({ metricsFlowUri: await window.AWGetFxAMetricsFlowURI() }); } componentDidMount() { this.fetchFxAFlowUri(); // Record impression with performance data after allowing the page to load const recordImpression = domState => { const { domComplete, domInteractive } = performance .getEntriesByType("navigation") .pop(); window.AWSendEventTelemetry({ event: "IMPRESSION", event_context: { domComplete, domInteractive, mountStart: performance.getEntriesByName("mount").pop().startTime, domState, source: this.props.UTMTerm, page: "about:welcome", }, message_id: this.props.messageId, }); }; if (document.readyState === "complete") { // Page might have already triggered a load event because it waited for async data, // e.g., attribution, so the dom load timing could be of a empty content // with domState in telemetry captured as 'complete' recordImpression(document.readyState); } else { window.addEventListener("load", () => recordImpression("load"), { once: true, }); } // Captures user has seen about:welcome by setting // firstrun.didSeeAboutWelcome pref to true and capturing welcome UI unique messageId window.AWSendToParent("SET_WELCOME_MESSAGE_SEEN", this.props.messageId); } handleStartBtnClick() { AboutWelcomeUtils.handleUserAction(this.props.startButton.action); const ping = { event: "CLICK_BUTTON", event_context: { source: this.props.startButton.message_id, page: "about:welcome", }, message_id: this.props.messageId, id: "ABOUT_WELCOME", }; window.AWSendEventTelemetry(ping); } render() { const { props } = this; if (props.template === "simplified") { return ( ); } else if (props.template === "return_to_amo") { return ( ); } return ( ); } } AboutWelcome.defaultProps = DEFAULT_WELCOME_CONTENT; // Computes messageId and UTMTerm info used in telemetry function ComputeTelemetryInfo(welcomeContent, experimentId, branchId) { let messageId = welcomeContent.template === "return_to_amo" ? "RTAMO_DEFAULT_WELCOME" : "DEFAULT_ABOUTWELCOME"; let UTMTerm = "default"; if (welcomeContent.id) { messageId = welcomeContent.id.toUpperCase(); } if (experimentId && branchId) { UTMTerm = `${experimentId}-${branchId}`.toLowerCase(); } return { messageId, UTMTerm, }; } async function retrieveRenderContent() { // Check for override content in pref browser.aboutwelcome.overrideContent let aboutWelcomeProps = await window.AWGetWelcomeOverrideContent(); if (aboutWelcomeProps?.template) { let { messageId, UTMTerm } = ComputeTelemetryInfo(aboutWelcomeProps); return { aboutWelcomeProps, messageId, UTMTerm }; } // Check for experiment and retrieve content const { slug, branch } = await window.AWGetExperimentData(); aboutWelcomeProps = branch?.feature ? branch.feature.value : {}; // Check if there is any attribution data, this could take a while to await in series // especially when there is an add-on that requires remote lookup // Moving RTAMO as part of another screen of multistage is one option to fix the delay // as it will allow the initial page to be fast while we fetch attribution data in parallel for a later screen. const attribution = await window.AWGetAttributionData(); if (attribution?.template) { aboutWelcomeProps = { ...aboutWelcomeProps, // If part of an experiment, render experiment template template: aboutWelcomeProps?.template ? aboutWelcomeProps.template : attribution.template, ...attribution.extraProps, }; } let { messageId, UTMTerm } = ComputeTelemetryInfo( aboutWelcomeProps, slug, branch && branch.slug ); return { aboutWelcomeProps, messageId, UTMTerm }; } async function mount() { let { aboutWelcomeProps, messageId, UTMTerm } = await retrieveRenderContent(); ReactDOM.render( , document.getElementById("root") ); } performance.mark("mount"); mount();