{"version":3,"file":"js/55226-8a40c303bd981be3f7be.js","mappings":"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","sources":["webpack://StravaModern/./app/javascript/apps/Microfrontend/styles.scss?dd46","webpack://StravaModern/./app/javascript/apps/Microfrontend/Microfrontend.js","webpack://StravaModern/./app/javascript/globalLibraries.js","webpack://StravaModern/./app/javascript/components/shared/FormattedHTMLMessage/index.js","webpack://StravaModern/./app/javascript/utils/I18n.js","webpack://StravaModern/./app/javascript/utils/devUtils.js","webpack://StravaModern/./app/javascript/utils/networking-client.js","webpack://StravaModern/./app/javascript/utils/public-service-env.js","webpack://StravaModern/./app/javascript/utils/react-component-mounter.js","webpack://StravaModern/./app/javascript/utils/sentry.helper.js","webpack://StravaModern/./app/javascript/utils/sentry.js"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"mfcontainer\":\"Microfrontend--mfcontainer--Sw1H-\"};","import React from 'react';\nimport {\n TranslationContext,\n AnalyticsContext,\n ErrorLoggingContext\n} from '@strava/container-context';\nimport { logError } from '../../utils/sentry';\nimport I18n from '../../utils/I18n';\nimport styles from './styles.scss';\n\n// We want to track each url that we use to load a remote entry,\n// because we want to check if we've already downloaded and avoid\n// downloading the same remote multiple times.\nconst remoteUrls = {};\n\n// We want to initialize the 'scope' (remote entry code) a single time,\n// and not many times for many different components.\n// Specifically, we only want to call this line once:\n// `containerResolve(window[scope].init(legacyShareScope));`\nconst initializedScopes = {};\n\nconst cleanup = (scriptElement) => {\n if (scriptElement.parentNode) {\n scriptElement.parentNode.removeChild(scriptElement);\n }\n};\n\nconst loadDynamicScript = (url) => {\n if (remoteUrls[url] == null) {\n remoteUrls[url] = new Promise((resolve, reject) => {\n // insert remote script into document and add\n // onerror and onload listeners that will finalize\n // installation\n const element = document.createElement('script');\n element.src = url;\n element.type = 'text/javascript';\n element.async = true;\n\n element.onload = () => {\n console.log(`Dynamic Script Loaded: ${url}`);\n resolve(element);\n };\n\n element.onerror = () => {\n console.error(`Dynamic Script Error: ${url}`);\n reject(element);\n };\n\n document.head.appendChild(element);\n });\n }\n\n return remoteUrls[url];\n};\n\nconst cleanupScript = (url) => {\n if (remoteUrls[url]) {\n remoteUrls[url].then(cleanup, cleanup);\n }\n};\n\n// TODO: remove once we've upgraded to webpacker 6 (webpack 5)\n// The code here only supports consumption of federated modules\n// and does not allow hosting federated modules\n// copied from\n// https://github.com/module-federation/practical-module-federation/blob/master/chapter7/packages/home-wp4/src/App.jsx\nconst useDynamicScript = (url) => {\n const [isLoading, setIsLoading] = React.useState(true);\n const [failed, setFailed] = React.useState(false);\n\n React.useEffect(() => {\n if (!url) {\n return;\n }\n\n const promise = loadDynamicScript(url);\n\n setIsLoading(true);\n setFailed(false);\n\n promise.then(\n () => {\n console.log(`Dynamic Script Loaded: ${url}`);\n setIsLoading(false);\n },\n () => {\n console.error(`Dynamic Script Error: ${url}`);\n setIsLoading(false);\n setFailed(true);\n }\n );\n\n // eslint-disable-next-line consistent-return\n return () => {\n // cleanup code to remove script added as part of loading\n // the remote federated module. This code is ran before\n // another execution of this useEffect is ran before\n // rendering and when the component unmounts\n console.log(`Dynamic Script Removed: ${url}`);\n cleanupScript(url);\n };\n }, [url]);\n\n return {\n isLoading,\n failed\n };\n};\n\n// eslint-disable-next-line react/prop-types\nconst DynamicWidget = ({ url, scope, component, appContext }) => {\n const { isLoading, failed } = useDynamicScript(url);\n\n if (isLoading) {\n return null;\n }\n\n if (failed) {\n return

Failed to load dynamic script: {url}

;\n }\n\n const Component = React.lazy(\n () =>\n // moduleResolve is the reference to use to mark this\n // promise as completed/resolved.\n new Promise((moduleResolve) => {\n // signal webpacker to load the pages react\n // and create a share scope to initialize with\n // the component.\n // eslint-disable-next-line global-require\n const react = require('react');\n\n // eslint-disable-next-line global-require\n const translationscontext = require('@strava/container-context');\n\n const legacyShareScope = {\n react: {\n [react.version]: {\n get: () => {\n return () => react;\n },\n singleton: true,\n loaded: true,\n from: 'webpack4'\n }\n },\n // the context provider needs to be a singleton for the\n // shared info to be the same between container and MFE\n '@strava/container-context': {\n [translationscontext.version]: {\n get: () => {\n return () => translationscontext;\n },\n singleton: true,\n loaded: true,\n from: 'webpack4'\n }\n }\n };\n new Promise((containerResolve) => {\n // when we load the remoteEntry.js, it creates the scope\n // defined in the remote exposed components. We use the\n // pages shared scope to compare the react version on the\n // page vs the one of the remote component\n\n // Initialize a remote once even when multiple components use it\n if (initializedScopes[scope]) {\n containerResolve();\n } else {\n initializedScopes[scope] = true;\n containerResolve(window[scope].init(legacyShareScope));\n }\n }).then(() => {\n // finally, load the component/module and resolve\n // topmost promise\n window[scope].get(component).then((factory) => {\n moduleResolve(factory());\n });\n });\n })\n );\n\n return (\n \n \n \n );\n};\n\n// eslint-disable-next-line no-unused-vars,react/prop-types\nconst Microfrontend = ({ url, scope, component, appContext }) => (\n
\n {\n return window.Strava.ExternalAnalytics.trackV2(data);\n }\n }}\n >\n {\n return I18n.t(key, props);\n },\n getLanguage: () => {\n return I18n.language();\n }\n }}\n >\n \n \n \n \n \n
\n);\n\nexport default Microfrontend;\n","// This file is deprecated and only used to move node_modules accessed in the\n// sprockets asset pipeline to webpack entry points\n// adding random string to force recompile:\n// A998D3152224818D225A880A9B627F1FB4484DD7E408EACA1B243326ED4AA01B\n\n// importing jquery using script-loader to mimic adding jQuery via a script tag\n/* eslint-disable no-unused-vars,import/extensions */\nimport 'jquery/dist/jquery.min.js';\nimport 'leaflet/dist/leaflet.js';\nimport 'dexie/dist/dexie.min.js';\nimport 'intersection-observer/intersection-observer.js';\nimport '@strava/clio/dist/strava_analytics.min.js';\nimport '@strava/autotrack/autotrack.js';\nimport 'dropzone/dist/dropzone.js';\nimport 'blueimp-load-image/js/load-image.all.min.js';\nimport 'dropzone/dist/min/dropzone.min.css';\n\nimport { setPublicServiceEnv } from './utils/public-service-env';\nimport { devLog } from './utils/devUtils';\n\n// Expose method on global scope that sets public keys that are commonly passed\n// to 3rd party libs or tooling.\nif (window.stravaPublicServiceEnv === undefined) {\n window.stravaPublicServiceEnv = setPublicServiceEnv;\n}\n\ndevLog('loading global libraries');\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst FormattedHTMLMessage = ({ tagName, message, className, onLinkClick }) => {\n const handleLinkClick = (e) => {\n if (e.target.nodeName === 'A' && !!onLinkClick) {\n onLinkClick(e);\n }\n };\n\n return React.createElement(tagName, {\n className,\n dangerouslySetInnerHTML: {\n __html: message\n },\n onClick: handleLinkClick\n });\n};\n\nFormattedHTMLMessage.propTypes = {\n message: PropTypes.string.isRequired,\n tagName: PropTypes.string,\n className: PropTypes.string,\n onLinkClick: PropTypes.func\n};\n\nFormattedHTMLMessage.defaultProps = {\n tagName: 'span',\n className: null,\n onLinkClick: null\n};\n\nexport default FormattedHTMLMessage;\n","import React from 'react';\n\nimport FormattedHTMLMessage from '../components/shared/FormattedHTMLMessage';\n\nfunction t(key, props = {}) {\n return window.Strava.I18n.Locale.t(key, props);\n}\n\nfunction elevationFormatter(unitSystem) {\n return new window.Strava.I18n.ElevationFormatter(unitSystem);\n}\n\nfunction elevationLabelFormatter(unitSystem) {\n return new window.Strava.I18n.ChartLabelElevationFormatter(unitSystem);\n}\n\nfunction distanceFormatter(unitSystem) {\n return new window.Strava.I18n.DistanceFormatter(unitSystem);\n}\n\nfunction distanceLabelFormatter(unitSystem) {\n return new window.Strava.I18n.ChartLabelDistanceFormatter(unitSystem);\n}\n\nfunction distancePerTimeFormatter(unitSystem) {\n return new window.Strava.I18n.DistancePerTimeFormatter(unitSystem);\n}\n\nfunction distancePerTimeLabelFormatter(unitSystem) {\n return new window.Strava.I18n.ChartLabelDistancePerTimeFormatter(unitSystem);\n}\n\nfunction percentFormatter() {\n return new window.Strava.I18n.PercentFormatter();\n}\n\nfunction timespanFormatter() {\n return new window.Strava.I18n.TimespanFormatter();\n}\n\nexport default {\n t,\n t_html(key, props = {}, options = {}) {\n return ;\n },\n elevationFormatter,\n elevationLabelFormatter,\n distanceFormatter,\n distanceLabelFormatter,\n distancePerTimeFormatter,\n distancePerTimeLabelFormatter,\n percentFormatter,\n timespanFormatter,\n language() {\n return window.Strava.I18n.Locales.LANGUAGE_CODE;\n },\n measurementUnits() {\n return window.Strava.I18n.UnitSystem.get();\n }\n};\n","/**\n * dev utils to make local development easier (dynamically-imported mock data,\n * dev-only console logs, etc.)\n */\n\nexport const isDev = () => {\n return process.env.NODE_ENV === 'development';\n};\n\nexport const isTest = () => process.env.NODE_ENV === 'test';\n\nexport const devLog = (string) => {\n if (isDev() || window?.StravaDevTools?.enabled) {\n // eslint-disable-next-line no-console\n console.log(string);\n }\n};\n\nexport const timeout = (ms) => {\n return new Promise((resolve) => setTimeout(resolve, ms));\n};\n\nexport default { isDev, devLog, timeout };\n","import axios from 'axios';\n\nfunction baseUrl() {\n const port = window.location.port === '' ? '' : `:${window.location.port}`;\n\n return `${window.location.protocol}//${window.location.hostname}${port}`;\n}\n\nexport function csrfToken() {\n return document\n .querySelector('meta[name=\"csrf-token\"]')\n .getAttribute('content');\n}\n\nexport default function createNetworkingClient(options = {}) {\n return axios.create({\n baseUrl: baseUrl(),\n timeout: 5000,\n headers: {\n 'X-Requested-With': 'XMLHttpRequest',\n 'X-CSRF-TOKEN': csrfToken()\n },\n ...options\n });\n}\n","// Object containing no secret key value pairs that are expected to be seen and\n// used in the browser. This keys are commonly passed to 3rd party libs or tooling.\n//\n// Data that gets set to this object is set in the following file:\n// app/views/common/_react_public_service_env.haml\n//\n// Do not set values directly into this object here as that is not intended use\nconst publicServiceEnv = {};\n\n/**\n * Sets data to an object and freezes it on the initial call.\n * @param {Object} envData Object containing key value pairs that are not nested objects\n */\nfunction setPublicServiceEnv(envData) {\n // Only update the object if it's empty as we do not want to allow any updated\n // after the initial call to this method\n if (Object.keys(publicServiceEnv).length === 0) {\n const keys = Object.keys(envData);\n\n if (keys.length > 0) {\n keys.forEach((value) => {\n publicServiceEnv[value] = envData[value];\n });\n\n // Freeze object so that it can not be updated or changed\n Object.freeze(publicServiceEnv);\n }\n }\n}\n\nexport { publicServiceEnv, setPublicServiceEnv };\n","import React from 'react';\nimport ReactDOM from 'react-dom';\n\n// Object that stores references to all the registered components\nlet registeredComponents = {};\n\n// Track a single component that should be mounted after the DOM content has loaded\nfunction register(components) {\n // Registered components are passed in as Hash keys (as opposed to individual arguments)\n // in order to preserve their names during JavaScript minification.\n //\n // For example:\n // ReactComponentMounter.register({ Hello });\n\n registeredComponents = { ...registeredComponents, ...components };\n}\n\nfunction mountComponent({ node, component, props }) {\n const className = component || node.getAttribute('data-react-class');\n const reactComponent = registeredComponents[className];\n\n if (!reactComponent) {\n console.error(\n `Cannot find a component registered with the name ${className}`\n );\n return;\n }\n\n const propsJson = node.getAttribute('data-react-props');\n try {\n const reactProps = {\n ...(propsJson && JSON.parse(propsJson)),\n ...props\n };\n\n const reactElement = React.createElement(reactComponent, reactProps);\n ReactDOM.render(reactElement, node);\n } catch (e) {\n console.error(\n `Could not parse props for component registered with the name ${className}`\n );\n }\n}\n\n// Allows a page to mount a component right away rather than\n// wait for the DOMContentLoaded event\nfunction inlineMount(node, component) {\n mountComponent({ node, component });\n}\n\n// Search the DOM for all react components to be mounted,\n// and mount them into the DOM\nfunction mountComponents() {\n const nodesToMount = document.querySelectorAll('[data-react-class]');\n // IE does not support NodeList.forEach, so we need to do it the old fashion way\n /* eslint-disable-next-line no-plusplus */\n for (let i = 0; i < nodesToMount.length; ++i) {\n mountComponent({ node: nodesToMount[i] });\n }\n}\n\n// Ensure pages can mount components more specifically\nif (window.stravaInlineMount === undefined) {\n window.stravaInlineMount = inlineMount;\n}\n\n// Add this listener only once, when the module is first imported\ndocument.addEventListener('DOMContentLoaded', mountComponents);\n\n/**\n * Also added once, this listener can be used to render react components\n * that were created after the DOM was loaded via the ruby `react_component` helper\n *\n * example usage:\n *\n * document.dispatchEvent(new CustomEvent('JSCreatedReactNode', {detail: {node: $('#my-react-component')}}))\n * document.dispatchEvent(new CustomEvent('JSCreatedReactNode', {detail: {node: $('#my-react-component')[index]}}))\n */\nfunction mountJSCreatedComponent(e) {\n const { node, component, props } = e.detail;\n if (!node) {\n return;\n }\n\n const unwrappedNode = node.length ? node[0] : node;\n if (!unwrappedNode) {\n return;\n }\n\n mountComponent({ node: unwrappedNode, component, props });\n}\n\ndocument.addEventListener('JSCreatedReactNode', mountJSCreatedComponent);\n\n/**\n * Components mounted using certain erb - jquery setup do not go through their whole\n * lifecyle so they are left unmounted as the athlete interacts on the page.\n *\n * For examples, see interval.js.rb, graph_data_range.js.rb and interval_type.js.rb\n */\ndocument.addEventListener('JSUnmountReactNode', (e) => {\n ReactDOM.unmountComponentAtNode(e.detail.node);\n});\n\nexport default { register, mountComponent };\n","const BROWSER_EXTENSION = '-extension://';\nconst ANONYMOUS = '';\n\nexport const hasExtensionReferenceInHintErrorStack = (hint) =>\n hint?.originalException?.stack?.includes(BROWSER_EXTENSION);\n\nexport const hasExtensionReferenceInBreadCrumbs = (event) =>\n !!event?.breadcrumbs?.find((entry) =>\n entry.data?.url?.includes(BROWSER_EXTENSION)\n );\n\nexport const hasExtensionReferenceInEventErrorStack = (event) => {\n return !!event?.exception?.values?.find((entry) => {\n return !!entry.stacktrace?.frames?.find(\n (frame) =>\n frame?.filename?.includes(BROWSER_EXTENSION) ||\n frame?.abs_path?.includes(BROWSER_EXTENSION) ||\n frame?.filename?.includes(ANONYMOUS) ||\n frame?.abs_path?.includes(ANONYMOUS)\n );\n });\n};\n\nexport default {\n hasExtensionReferenceInHintErrorStack,\n hasExtensionReferenceInBreadCrumbs,\n hasExtensionReferenceInEventErrorStack\n};\n","import * as Sentry from '@sentry/browser';\nimport { BrowserTracing } from '@sentry/tracing';\nimport { isDev } from './devUtils';\nimport {\n hasExtensionReferenceInBreadCrumbs,\n hasExtensionReferenceInHintErrorStack,\n hasExtensionReferenceInEventErrorStack\n} from './sentry.helper';\n\n// List of pages that have the same pathname but different variants controlled with\n// search params. Pages added to this list will have the search param added to the name\n// during tracing (performance tracking)\nconst PAGES_WITH_VARIANTS = ['/onboarding/continue', '/'];\n\nif (!window.StravaSentryDsn) {\n window.StravaSentryDsn = {};\n}\nif (!window.StravaSentryDsn.deferred) {\n window.StravaSentryDsn.deferred = {};\n const promise = new Promise(\n function _(resolve, reject) {\n this.doResolve = resolve;\n this.doReject = reject;\n }.bind(window.StravaSentryDsn.deferred)\n );\n window.StravaSentryDsn.deferred.then = promise.then.bind(promise);\n}\n\nconst { enabled, environment, release, userId, dsn, sampleRate, debug } =\n window.StravaSentry || {};\n\nwindow.StravaSentryDsn.deferred.doResolve(dsn);\n\nwindow.StravaSentryDsn.deferred.then((_dsn) => {\n // configure sentry_frontend.yml to enable sentry on local\n if (enabled) {\n Sentry.init({\n dsn: _dsn,\n maxBreadcrumbs: 50,\n integrations: [\n new BrowserTracing({\n tracingOrigins: [\n 'https://www.staging.strava.com',\n 'https://www.strava.com',\n 'localhost',\n /^\\//\n ],\n beforeNavigate: (context) => {\n const { pathname, search } = window.location;\n const includeSearchParam = PAGES_WITH_VARIANTS.includes(pathname);\n return {\n ...context,\n name: includeSearchParam ? pathname.concat(search) : pathname\n };\n }\n })\n ],\n denyUrls: [\n // Chrome extensions\n /extensions\\//i,\n /^chrome:\\/\\//i\n ],\n tracesSampleRate: sampleRate,\n debug,\n attachStacktrace: true,\n release,\n initialScope: {\n user: { id: userId }\n },\n environment,\n beforeSend: (event, hint) => {\n if (\n hasExtensionReferenceInHintErrorStack(hint) ||\n hasExtensionReferenceInBreadCrumbs(event) ||\n hasExtensionReferenceInEventErrorStack(event)\n ) {\n return null;\n }\n return event;\n }\n });\n }\n});\n\nexport const logError = (err) => {\n if (isDev()) {\n // eslint-disable-next-line no-console\n console.error('logError :::', err);\n return;\n }\n Sentry.captureException(err);\n};\n\nexport const logMessage = (message) => {\n if (isDev()) {\n // eslint-disable-next-line no-console\n console.log('logMessage :::', message);\n return;\n }\n Sentry.captureMessage(message);\n};\n\nexport default { logError, logMessage };\n"],"names":["remoteUrls","initializedScopes","cleanup","scriptElement","parentNode","removeChild","useDynamicScript","url","React","isLoading","setIsLoading","failed","setFailed","promise","Promise","resolve","reject","element","document","createElement","src","type","async","onload","console","log","onerror","error","head","appendChild","loadDynamicScript","then","cleanupScript","DynamicWidget","scope","component","appContext","Component","moduleResolve","react","require","translationscontext","legacyShareScope","version","get","singleton","loaded","from","containerResolve","window","init","factory","fallback","className","styles","AnalyticsContext","value","track","data","Strava","ExternalAnalytics","trackV2","TranslationContext","t","key","props","I18n","getLanguage","ErrorLoggingContext","logError","undefined","stravaPublicServiceEnv","setPublicServiceEnv","devLog","FormattedHTMLMessage","tagName","message","onLinkClick","dangerouslySetInnerHTML","__html","onClick","e","target","nodeName","defaultProps","Locale","t_html","options","elevationFormatter","unitSystem","ElevationFormatter","elevationLabelFormatter","ChartLabelElevationFormatter","distanceFormatter","DistanceFormatter","distanceLabelFormatter","ChartLabelDistanceFormatter","distancePerTimeFormatter","DistancePerTimeFormatter","distancePerTimeLabelFormatter","ChartLabelDistancePerTimeFormatter","percentFormatter","PercentFormatter","timespanFormatter","TimespanFormatter","language","Locales","LANGUAGE_CODE","measurementUnits","UnitSystem","isDev","process","string","StravaDevTools","enabled","timeout","ms","setTimeout","csrfToken","querySelector","getAttribute","createNetworkingClient","axios","baseUrl","port","location","protocol","hostname","headers","publicServiceEnv","envData","Object","keys","length","forEach","freeze","registeredComponents","mountComponent","node","reactComponent","propsJson","reactProps","JSON","parse","reactElement","ReactDOM","stravaInlineMount","addEventListener","nodesToMount","querySelectorAll","i","detail","unwrappedNode","register","components","BROWSER_EXTENSION","ANONYMOUS","hasExtensionReferenceInHintErrorStack","hint","originalException","stack","includes","hasExtensionReferenceInBreadCrumbs","event","breadcrumbs","find","entry","hasExtensionReferenceInEventErrorStack","exception","values","stacktrace","frames","frame","filename","abs_path","PAGES_WITH_VARIANTS","StravaSentryDsn","deferred","this","doResolve","doReject","bind","StravaSentry","environment","release","userId","dsn","sampleRate","debug","_dsn","Sentry","maxBreadcrumbs","integrations","BrowserTracing","tracingOrigins","beforeNavigate","context","pathname","search","includeSearchParam","name","concat","denyUrls","tracesSampleRate","attachStacktrace","initialScope","user","id","beforeSend","err","logMessage"],"sourceRoot":""}