{"version":3,"file":"traffic.b73e7929.js","mappings":"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","sources":["webpack://@finviz/website/./js/main/components/ChipSwitch.tsx","webpack://@finviz/website/./js/main/components/external-link/external-link.tsx","webpack://@finviz/website/./js/main/components/financials-table/FinancialsTableContext.tsx","webpack://@finviz/website/./js/main/components/financials-table/FinancialsTableRow.tsx","webpack://@finviz/website/./js/main/components/financials-table/FinancialsTable.tsx","webpack://@finviz/website/./js/main/components/financials-table/FinancialsWidget.tsx","webpack://@finviz/website/./js/main/components/financials-table/utils.ts","webpack://@finviz/website/./js/main/hooks/use-sticky-shadow.ts","webpack://@finviz/website/./js/main/hooks/use-window-size.tsx","webpack://@finviz/website/./js/main/modules/traffic/TrafficTableBottomContent.tsx","webpack://@finviz/website/./js/main/modules/traffic/TrafficTableHead.tsx","webpack://@finviz/website/./js/main/modules/traffic/types.ts","webpack://@finviz/website/./js/main/modules/traffic/WidgetDomainSettingsSection.tsx","webpack://@finviz/website/./js/main/modules/traffic/constants.ts","webpack://@finviz/website/./js/main/modules/traffic/useMonthlyDataControls.ts","webpack://@finviz/website/./js/main/modules/traffic/useTableColumns.tsx","webpack://@finviz/website/./js/main/modules/traffic/utils.ts","webpack://@finviz/website/./js/main/modules/traffic/Domain.tsx","webpack://@finviz/website/./js/main/modules/traffic/NoDataPlaceholder.tsx","webpack://@finviz/website/./js/main/modules/traffic/WidgetAppSettingsSection.tsx","webpack://@finviz/website/./js/main/modules/traffic/Apps.tsx","webpack://@finviz/website/./js/main/modules/traffic/TrafficDomainSelect.tsx","webpack://@finviz/website/./js/main/modules/traffic/TrafficHeader.tsx","webpack://@finviz/website/./js/main/modules/traffic/TrafficDomainSection.tsx","webpack://@finviz/website/./js/main/modules/traffic/index.tsx","webpack://@finviz/website/./js/main/services/IntersectionObserverContext.tsx"],"sourcesContent":["import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonComponentProps, ButtonProps } from './button'\r\nimport { Paragraph } from './typography'\r\n\r\ninterface Props {\r\n children: (React.ReactElement | null)[]\r\n label: string\r\n size?: ButtonProps['size']\r\n rounding?: ButtonProps['rounding']\r\n}\r\n\r\nexport function ChipSwitch({ children, label, size, rounding }: Props) {\r\n return (\r\n
\r\n {label && (\r\n \r\n {label}\r\n \r\n )}\r\n\r\n {React.Children.map(children, (child: React.ReactElement | null) => {\r\n if (React.isValidElement(child) && child.type === Button) {\r\n return React.cloneElement(child, {\r\n size,\r\n rounding,\r\n theme: child.props.theme ?? 'chipTransparent',\r\n className: classnames(child.props.className, {\r\n // @todo - these style should be applied globally onto all chipTransparent buttons\r\n '!text-gray-600 dark:!text-gray-400': !child.props.active,\r\n '!text-gray-800 dark:!text-white': child.props.active,\r\n }),\r\n })\r\n }\r\n\r\n return child\r\n })}\r\n
\r\n )\r\n}\r\n\r\nexport const ChipSwitchButton = Button\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Button, Icon } from '..'\r\n\r\ninterface Props {\r\n label?: string\r\n href: string | undefined\r\n isBold?: boolean\r\n className?: string\r\n}\r\n\r\nexport function ExternalLink({ label, href, isBold, className }: Props) {\r\n return (\r\n }\r\n size=\"none\"\r\n padding=\"xxsmall\"\r\n theme=\"linkText\"\r\n className={classnames('inline-flex text-2xs leading-none', className)}\r\n target=\"_blank\"\r\n rel=\"nofollow\"\r\n href={href}\r\n onMouseDown={(event: React.MouseEvent) => event.stopPropagation()}\r\n onClick={(event: React.MouseEvent) => event.stopPropagation()}\r\n >\r\n {label && {label}}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { getCookie } from '../../../app/shared/cookie'\r\nimport { setCookieRequest } from '../../services/api'\r\n\r\n/*\r\n * Context.\r\n */\r\nexport type FinancialsTableSettingsType = Record\r\n\r\nexport type FinancialsTableScrollInfo = {\r\n yPosition: number\r\n}\r\n\r\nexport interface FinancialsTableContextProps {\r\n settings: T\r\n setSettings: (settings: T) => void\r\n scrollInfo?: FinancialsTableScrollInfo\r\n}\r\n\r\nexport const FinancialsTableContext = React.createContext>({\r\n settings: {},\r\n setSettings: () => null,\r\n scrollInfo: undefined,\r\n})\r\n\r\n/*\r\n * Hook.\r\n */\r\n\r\nexport function useFinancialsTableContext() {\r\n return React.useContext(FinancialsTableContext) as FinancialsTableContextProps\r\n}\r\n\r\n/*\r\n * Component.\r\n */\r\n\r\ninterface Props {\r\n children: React.ReactNode\r\n defaultSettings: FinancialsTableSettingsType\r\n cookieKey: string\r\n}\r\n\r\nexport const FinancialsTableContextProvider = ({ children, cookieKey, defaultSettings }: Props) => {\r\n const [scrollInfo, setScrollInfo] = React.useState()\r\n const [settings, setSettings] = React.useState(() => {\r\n const cookieValue = decodeURIComponent(getCookie(cookieKey))\r\n if (cookieValue.length === 0) return defaultSettings\r\n\r\n try {\r\n return { ...defaultSettings, ...JSON.parse(cookieValue) } as FinancialsTableSettingsType\r\n } catch {\r\n return defaultSettings\r\n }\r\n })\r\n\r\n const handleSetSettingsChange = (settings: FinancialsTableSettingsType) => {\r\n setScrollInfo({ yPosition: window.scrollY })\r\n setSettings(settings)\r\n setCookieRequest(cookieKey, JSON.stringify(settings))\r\n }\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import classNames from 'classnames'\r\n\r\nimport { TableAlign, TableBody, TableCell, TableRow } from '../Table'\r\nimport { Checkbox } from '../checkbox'\r\nimport {\r\n FinancialsColumnDefinition,\r\n FinancialsRowDataType,\r\n FinancialsSubColumnDefinition,\r\n FinancialsSubRowDataType,\r\n} from './types'\r\n\r\ntype FinancialsTableRowProps<\r\n RowDataType extends FinancialsRowDataType,\r\n ColumnDefinition extends FinancialsColumnDefinition,\r\n SubColumnDefinition extends FinancialsSubRowDataType,\r\n> = {\r\n data: RowDataType\r\n columns: ColumnDefinition[]\r\n subColumns?: Record[]>\r\n onVisibilityChange: (area: string, visibility: boolean) => void\r\n isFirst: boolean\r\n isLast: boolean\r\n}\r\n\r\nexport default function FinancialsTableRow<\r\n RowDataType extends FinancialsRowDataType,\r\n ColumnDefinition extends FinancialsColumnDefinition,\r\n SubColumnDefinition extends FinancialsSubRowDataType,\r\n>({\r\n data,\r\n columns,\r\n subColumns,\r\n onVisibilityChange,\r\n isFirst,\r\n isLast,\r\n}: FinancialsTableRowProps) {\r\n const { id, label, labelElement, labelColumnClassName, isSelected, color, subData, isLabelColumnSticky } = data\r\n\r\n return (\r\n {\r\n onVisibilityChange(id, !isSelected)\r\n }}\r\n >\r\n \r\n \r\n {label}}\r\n className=\"cursor-pointer\"\r\n color={color}\r\n size=\"none\"\r\n />\r\n \r\n\r\n {columns.map((column) => (\r\n \r\n {column.renderColumn(data)}\r\n \r\n ))}\r\n \r\n {subData?.map((item, index, array) => (\r\n \r\n \r\n {item.label}\r\n \r\n {subColumns?.[item.id].map((column) => (\r\n \r\n {column.renderColumn(item as SubColumnDefinition)}\r\n \r\n ))}\r\n \r\n ))}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Table } from '../Table'\r\nimport FinancialsTableRow from './FinancialsTableRow'\r\nimport {\r\n FinancialsColumnDefinition,\r\n FinancialsRowDataType,\r\n FinancialsSubColumnDefinition,\r\n FinancialsSubRowDataType,\r\n} from './types'\r\n\r\ntype FinancialsTableProps<\r\n RowDataType extends FinancialsRowDataType,\r\n ColumnDefinition extends FinancialsColumnDefinition,\r\n SubColumnDefinition extends FinancialsSubRowDataType,\r\n> = {\r\n tableHead?: React.ReactNode\r\n tableFooter?: React.ReactNode\r\n data: RowDataType[]\r\n columns: ColumnDefinition[]\r\n subColumns?: Record[]>\r\n isTableFixed?: boolean\r\n onVisibilityChange: (area: string, visibility: boolean) => void\r\n}\r\n\r\nexport default function FinancialsTable<\r\n RowDataType extends FinancialsRowDataType,\r\n ColumnDefinition extends FinancialsColumnDefinition,\r\n SubColumnDefinition extends FinancialsSubRowDataType,\r\n>({\r\n tableHead,\r\n tableFooter,\r\n columns,\r\n subColumns,\r\n data,\r\n isTableFixed = true,\r\n onVisibilityChange,\r\n}: FinancialsTableProps) {\r\n return (\r\n \r\n {tableHead}\r\n {data.map((row, index) => (\r\n \r\n ))}\r\n {tableFooter}\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { TableStickyColumnWrapper } from '../Table/TableStickyColumnWrapper'\r\nimport FinancialsTable from './FinancialsTable'\r\nimport {\r\n FinancialsColumnDefinition,\r\n FinancialsRowDataType,\r\n FinancialsSubColumnDefinition,\r\n FinancialsSubRowDataType,\r\n} from './types'\r\n\r\ntype FinancialsWidgetProps<\r\n RowDataType extends FinancialsRowDataType,\r\n ColumnDefinition extends FinancialsColumnDefinition,\r\n SubColumnDefinition extends FinancialsSubRowDataType,\r\n> = {\r\n children: React.ReactNode\r\n header?: React.ReactNode\r\n tableHead?: React.ReactNode\r\n tableFooter?: React.ReactNode\r\n data: RowDataType[]\r\n columns: ColumnDefinition[]\r\n hasStickyColumnWrapper?: boolean\r\n subColumns?: Record[]>\r\n isTableFixed?: boolean\r\n onVisibilityChange: (area: string, visibility: boolean) => void\r\n}\r\n\r\nexport function FinancialsWidget<\r\n RowDataType extends FinancialsRowDataType,\r\n ColumnDefinition extends FinancialsColumnDefinition,\r\n SubColumnDefinition extends FinancialsSubRowDataType,\r\n>({\r\n children,\r\n tableHead,\r\n tableFooter,\r\n columns,\r\n subColumns,\r\n header,\r\n data,\r\n isTableFixed,\r\n hasStickyColumnWrapper,\r\n onVisibilityChange,\r\n}: FinancialsWidgetProps) {\r\n const financialsTable = (\r\n \r\n )\r\n return (\r\n
\r\n
\r\n {header}\r\n {children}\r\n
\r\n {hasStickyColumnWrapper ? (\r\n \r\n {financialsTable}\r\n \r\n ) : (\r\n financialsTable\r\n )}\r\n
\r\n )\r\n}\r\n","import { FinancialsRowValue } from './types'\r\n\r\nexport function getYoYData(data: T[]) {\r\n const sortedData = [...data].sort((a, b) => Number.parseInt(a.year) - Number.parseInt(b.year))\r\n return sortedData.reduce<{\r\n change: Record\r\n changePct: Record\r\n }>(\r\n (acc, { year, value }, i) => {\r\n const prev = sortedData[i - 1]?.value ?? null\r\n let change: number | null = null\r\n let changePct: number | null = null\r\n\r\n if (value !== null && prev !== null && value !== 0 && prev !== 0) {\r\n change = value - prev\r\n changePct = ((value - prev) / Math.abs(prev)) * 100\r\n }\r\n\r\n return {\r\n change: {\r\n ...acc.change,\r\n [year]: change,\r\n },\r\n changePct: {\r\n ...acc.changePct,\r\n [year]: changePct,\r\n },\r\n }\r\n },\r\n { change: {}, changePct: {} }\r\n )\r\n}\r\n\r\nexport function getMoMPercentageData(data: T[]) {\r\n const sortedData = [...data].sort((a, b) => Number.parseInt(a.year) - Number.parseInt(b.year))\r\n return sortedData.reduce>((acc, { year, value }, i) => {\r\n const prev = sortedData[i - 1]?.value ?? null\r\n let changePct: number | null = null\r\n\r\n if (value !== null && prev !== null && value !== 0 && prev !== 0) {\r\n changePct = ((value - prev) / Math.abs(prev)) * 100\r\n }\r\n\r\n return {\r\n ...acc,\r\n [year]: changePct,\r\n }\r\n }, {})\r\n}\r\n\r\nexport function getIsCompact(numOfCols: number, barWidth: number) {\r\n // ~1400 is max container width\r\n const maxContainerWidth = Math.min(window.innerWidth, 1400)\r\n\r\n const barsWindowWidthRatio = (barWidth * numOfCols) / maxContainerWidth\r\n return barsWindowWidthRatio > 0.65\r\n}\r\n\r\nexport function getHeatmapClassNames(value: number | null = null) {\r\n if (value === null || value === 0) return 'bg-neutral text-neutral'\r\n\r\n // Negative\r\n if (value < -80) return 'bg-danger-5 text-danger-5'\r\n if (value < -60) return 'bg-danger-4 text-danger-4'\r\n if (value < -40) return 'bg-danger-3 text-danger-3'\r\n if (value < -20) return 'bg-danger-2 text-danger-2'\r\n if (value < 0) return 'bg-danger-1 text-danger-1'\r\n\r\n // Positive\r\n if (value > 80) return 'bg-success-5 text-success-5'\r\n if (value > 60) return 'bg-success-4 text-success-4'\r\n if (value > 40) return 'bg-success-3 text-success-3'\r\n if (value > 20) return 'bg-success-2 text-success-2'\r\n if (value > 0) return 'bg-success-1 text-success-1'\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nexport function useStickyShadow() {\r\n const stickyRef = React.useRef(null)\r\n const [isSticky, setIsSticky] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n if (!stickyRef.current) return\r\n\r\n const onScroll = throttle(function () {\r\n const stickyElement = stickyRef.current\r\n if (!stickyElement) return\r\n\r\n const elementStickyTopOffset = parseFloat(getComputedStyle(stickyElement).top)\r\n const elementCurrentTopOffset = stickyElement.getBoundingClientRect().top\r\n\r\n setIsSticky(elementCurrentTopOffset === elementStickyTopOffset)\r\n }, 100)\r\n\r\n onScroll()\r\n document.addEventListener('scroll', onScroll)\r\n\r\n return () => {\r\n document.removeEventListener('scroll', onScroll)\r\n }\r\n }, [])\r\n\r\n return React.useMemo(\r\n () => ({\r\n stickyRef,\r\n isSticky,\r\n }),\r\n [isSticky]\r\n )\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\ninterface Props {\r\n throttleWaitInMs?: number\r\n isWatching?: boolean\r\n}\r\n\r\nexport function useWindowSize({ throttleWaitInMs = 300, isWatching = true }: Props = {}) {\r\n const [size, setSize] = React.useState({\r\n clientWidth: document.documentElement.clientWidth,\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!isWatching) return\r\n\r\n const handleResize = throttle(() => {\r\n setSize({\r\n clientWidth: document.documentElement.clientWidth,\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n }, throttleWaitInMs)\r\n\r\n window.addEventListener('resize', handleResize)\r\n\r\n return () => {\r\n handleResize.cancel()\r\n window.removeEventListener('resize', handleResize)\r\n }\r\n }, [throttleWaitInMs, isWatching])\r\n\r\n return size\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, Icon } from '../../components'\r\nimport { usePrevious } from '../../hooks/use-previous'\r\n\r\ninterface Props {\r\n showMoreLabel: string\r\n showLessLabel: string\r\n isShowMore: boolean\r\n hasHiddenRows: boolean\r\n onShowMoreToggle: (isShowMore: boolean) => void\r\n}\r\n\r\n// Rating relevancy is going to be done in some follow up\r\nconst TEMP_HIDDEN_RATE_RELEVANCY = true\r\n\r\nexport function TrafficTableBottomContent({\r\n showMoreLabel,\r\n showLessLabel,\r\n isShowMore,\r\n hasHiddenRows,\r\n onShowMoreToggle,\r\n}: Props) {\r\n const wrapperRef = React.useRef(null)\r\n const previousExpandWrapperTopRef = React.useRef(0)\r\n const isShowMorePrevious = usePrevious(isShowMore)\r\n\r\n React.useEffect(() => {\r\n if (isShowMorePrevious && !isShowMore) {\r\n setTimeout(() => {\r\n const currentExpandWrapperTop = wrapperRef.current?.getBoundingClientRect().top ?? 0\r\n window.scrollTo({ top: window.scrollY - (previousExpandWrapperTopRef.current - currentExpandWrapperTop) })\r\n })\r\n }\r\n }, [isShowMorePrevious, isShowMore])\r\n\r\n return (\r\n
\r\n {hasHiddenRows ? (\r\n {\r\n previousExpandWrapperTopRef.current = wrapperRef.current?.getBoundingClientRect().top ?? 0\r\n onShowMoreToggle(!isShowMore)\r\n }}\r\n leftContent={}\r\n className=\"font-normal\"\r\n >\r\n {isShowMore ? showLessLabel : showMoreLabel}\r\n \r\n ) : (\r\n
\r\n )}\r\n\r\n
\r\n Data source: similarweb.com\r\n {!TEMP_HIDDEN_RATE_RELEVANCY && (\r\n <>\r\n \r\n \r\n \r\n )}\r\n
\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TableAlign, TableHead, TableHeader, TableHeaderSortable } from '../../components/Table'\r\nimport { FinancialsColumnDefinition } from '../../components/financials-table/types'\r\nimport { SortByShape } from '../../hooks/use-sort-data'\r\nimport { SortDirection } from '../../types'\r\nimport { TrafficSubRowDataType } from './types'\r\n\r\ntype Props = {\r\n columns: FinancialsColumnDefinition[]\r\n sort: SortByShape | null>\r\n stickyLabelWidthClassName?: string\r\n onSortChange: (column: FinancialsColumnDefinition) => void\r\n}\r\n\r\nexport function TrafficTableHead({ columns, sort, stickyLabelWidthClassName, onSortChange }: Props) {\r\n const handleChangeSort = (column: FinancialsColumnDefinition) => {\r\n const shouldRemoveOrder = sort.direction === SortDirection.Descending && column === sort.column\r\n if (shouldRemoveOrder) {\r\n onSortChange('order' as unknown as FinancialsColumnDefinition)\r\n } else {\r\n onSortChange(column)\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n\r\n {columns.map((column) => (\r\n handleChangeSort(column)}\r\n >\r\n {column.name}\r\n \r\n ))}\r\n \r\n )\r\n}\r\n","import { ColorVariant } from '../../components'\r\nimport { FinancialsSubRowDataType } from '../../components/financials-table/types'\r\nimport { View } from '../../components/line-stacked-bar-chart'\r\n\r\nexport enum TrafficDataViewEnum {\r\n visits = 'visits',\r\n momChangePct = 'momChangePct',\r\n}\r\n\r\nexport enum AppRegion {\r\n us = 'us',\r\n ww = 'ww',\r\n}\r\n\r\nexport enum AppPlatform {\r\n ios = 'ios',\r\n android = 'android',\r\n}\r\n\r\nexport type TrafficSettings = {\r\n trafficDataView: TrafficDataViewEnum\r\n chartView: View\r\n appRegions: AppRegion[]\r\n appPlatforms: AppPlatform[]\r\n}\r\n\r\nexport interface InitialTrafficData {\r\n trafficTickers: string[]\r\n companyName: string\r\n mainDomain?: string | null\r\n trafficsWithPeers: TrafficItem[]\r\n appsWithPeers: AppItem[]\r\n}\r\n\r\nexport interface ParsedTrafficData extends Omit {\r\n trafficsWithPeers: ParsedTrafficItem[]\r\n appsWithPeers: ParsedAppItem[]\r\n}\r\n\r\nexport interface TrafficItem {\r\n domain?: string | null\r\n industry?: string | null\r\n industryGroup?: string | null\r\n heatmapSector?: string | null\r\n heatmapSubSector?: string | null\r\n peers?: string | null\r\n sector?: string | null\r\n ticker: string | null\r\n trafficJson?: string | null\r\n}\r\n\r\nexport type ParsedTrafficItem = Omit & {\r\n traffic: {\r\n d: number[]\r\n v: number[]\r\n } | null\r\n}\r\n\r\nexport interface AppItem {\r\n domain?: string\r\n appId?: string | null\r\n appName?: string | null\r\n os?: string | null\r\n geo?: string | null\r\n mauJson?: string | null\r\n}\r\n\r\nexport type ParsedAppItem = Omit & {\r\n id: string\r\n os: AppPlatform | null\r\n geo: AppRegion | null\r\n mau: {\r\n d: number[]\r\n v: number[]\r\n } | null\r\n}\r\n\r\nexport type TrafficSubRowDataType = Omit & {\r\n values: Array<{ year: string; value: number | null; momValue?: number | null }>\r\n keyValueMap: Record\r\n momKeyValueMap: Record\r\n}\r\n\r\nexport type TrafficRowDataType = TrafficSubRowDataType & {\r\n isSelected: boolean\r\n isHighlighted: boolean\r\n color: ColorVariant\r\n}\r\n","import React from 'react'\r\n\r\nimport { Heading } from '../../components'\r\nimport { ChipSwitch, ChipSwitchButton } from '../../components/ChipSwitch'\r\nimport { useFinancialsTableContext } from '../../components/financials-table'\r\nimport { View } from '../../components/line-stacked-bar-chart'\r\nimport { TrafficDataViewEnum, TrafficSettings } from './types'\r\n\r\nexport function WidgetDomainSettingsSection() {\r\n const { settings, setSettings } = useFinancialsTableContext()\r\n\r\n const toggleSetting = (key: keyof TrafficSettings, value: TrafficSettings[typeof key]) => {\r\n setSettings({\r\n ...settings,\r\n [key]: value,\r\n })\r\n }\r\n\r\n return (\r\n
\r\n \r\n Domains: Monthly Visits\r\n \r\n
\r\n \r\n {\r\n toggleSetting('trafficDataView', TrafficDataViewEnum.visits)\r\n }}\r\n >\r\n Visits\r\n \r\n {\r\n toggleSetting('trafficDataView', TrafficDataViewEnum.momChangePct)\r\n }}\r\n >\r\n MoM Growth %\r\n \r\n \r\n\r\n \r\n {\r\n toggleSetting('chartView', View.bars)\r\n }}\r\n />\r\n {\r\n toggleSetting('chartView', View.lines)\r\n }}\r\n />\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import { ColorVariant } from '../../components'\r\nimport { AppPlatform, AppRegion, TrafficDataViewEnum, TrafficSettings } from './types'\r\n\r\nexport const COOKIE_KEY = 'trafficSettings'\r\n\r\nexport const DEFAULT_SHOW_NUM_OF_APPS = 12\r\n\r\nexport const DEFAULT_SETTINGS: TrafficSettings = {\r\n trafficDataView: TrafficDataViewEnum.visits,\r\n chartView: 1,\r\n appPlatforms: [AppPlatform.android, AppPlatform.ios],\r\n appRegions: [AppRegion.us, AppRegion.ww],\r\n}\r\n\r\nexport const SEGMENT_COLORS = Object.keys(ColorVariant).filter(\r\n (c) => c !== ColorVariant.gray && c !== ColorVariant.default\r\n) as ColorVariant[]\r\n\r\nexport const AppPlatformLabels = {\r\n [AppPlatform.ios]: 'iOS',\r\n [AppPlatform.android]: 'Android',\r\n}\r\n\r\nexport const AppRegionLabels = {\r\n [AppRegion.us]: 'USA',\r\n [AppRegion.ww]: 'Worldwide',\r\n}\r\n\r\nexport const COMMON_COLUMN_CLASS_NAME = 'px-3.5 last:pr-11 w-17 min-w-17 max-w-17 last:w-24.5 relative'\r\n","import * as React from 'react'\r\n\r\nexport type MonthlyDataRowSelectionOverridesType = Record\r\n\r\ninterface Props {\r\n clearInactiveIdsBlacklist?: string[]\r\n}\r\n\r\nexport function useMonthlyDataControls({ clearInactiveIdsBlacklist }: Props) {\r\n const [isShowMore, setIsShowMore] = React.useState(false)\r\n const [monthlyDataRowSelectionOverrides, setMonthlyDataRowSelectionOverrides] =\r\n React.useState({})\r\n\r\n const toggleMonthlyDataRowSelection = React.useCallback((id: string, isSelected: boolean) => {\r\n setMonthlyDataRowSelectionOverrides((prevState) => ({\r\n ...prevState,\r\n [id]: isSelected,\r\n }))\r\n }, [])\r\n\r\n const clearInactiveMonthlyData = React.useCallback(() => {\r\n setMonthlyDataRowSelectionOverrides((prevState) =>\r\n Object.keys(prevState).reduce(\r\n (acc, id) =>\r\n clearInactiveIdsBlacklist?.includes(id)\r\n ? acc\r\n : {\r\n ...acc,\r\n [id]: prevState[id] ? true : undefined,\r\n },\r\n prevState\r\n )\r\n )\r\n }, [clearInactiveIdsBlacklist])\r\n\r\n const toggleIsShowMore = React.useCallback(\r\n (isShowMore: boolean) => {\r\n if (isShowMore) {\r\n clearInactiveMonthlyData()\r\n }\r\n setIsShowMore(isShowMore)\r\n },\r\n [clearInactiveMonthlyData]\r\n )\r\n\r\n return React.useMemo(\r\n () => ({\r\n monthlyDataRowSelectionOverrides,\r\n toggleMonthlyDataRowSelection,\r\n toggleIsShowMore,\r\n isShowMore,\r\n }),\r\n [monthlyDataRowSelectionOverrides, toggleMonthlyDataRowSelection, toggleIsShowMore, isShowMore]\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport { format } from 'date-fns'\r\nimport * as React from 'react'\r\n\r\nimport { TableAlign } from '../../components/Table'\r\nimport { getHeatmapClassNames } from '../../components/financials-table'\r\nimport { FinancialsColumnDefinition } from '../../components/financials-table/types'\r\nimport { shortFormatNumber } from '../../util'\r\nimport { COMMON_COLUMN_CLASS_NAME } from './constants'\r\nimport { TrafficDataViewEnum, TrafficSubRowDataType } from './types'\r\n\r\nconst getColumnsAndValueGetter = (yearKeys: string[], trafficDataView: TrafficDataViewEnum) => {\r\n const isMomChangePct = trafficDataView === TrafficDataViewEnum.momChangePct\r\n const columns: FinancialsColumnDefinition[] = yearKeys.map((yearMonth) => {\r\n const year = yearMonth.slice(0, 4)\r\n const month = yearMonth.slice(4, 6)\r\n const monthIndex = Number.parseInt(month) - 1\r\n const date = new Date(Number.parseInt(year), monthIndex, 1)\r\n return {\r\n id: yearMonth,\r\n name: format(date, monthIndex === 0 ? 'yyyy' : 'MMM'),\r\n align: TableAlign.Right,\r\n className: classnames(COMMON_COLUMN_CLASS_NAME, {\r\n 'is-heatmap': isMomChangePct,\r\n }),\r\n getColumnClassName: (data) => (isMomChangePct ? getHeatmapClassNames(data.momKeyValueMap[yearMonth]) : null),\r\n renderColumn: (data) => {\r\n const value = data[isMomChangePct ? 'momKeyValueMap' : 'keyValueMap'][yearMonth] ?? null\r\n const hasValue = typeof value === 'number'\r\n const shouldShowDecimal = (value ?? 0) >= 1000 || isMomChangePct\r\n return (\r\n \r\n {shortFormatNumber(value, { fractions: shouldShowDecimal ? 1 : 0, defaultValue: '—' })}\r\n {isMomChangePct && hasValue ? '%' : ''}\r\n \r\n )\r\n },\r\n }\r\n })\r\n\r\n return {\r\n columns,\r\n valueGetter: (column: FinancialsColumnDefinition) => (data: TrafficSubRowDataType) =>\r\n data[isMomChangePct ? 'momKeyValueMap' : 'keyValueMap'][column.id] ?? null,\r\n }\r\n}\r\n\r\nconst EMPTY_ARRAY: FinancialsColumnDefinition[] = []\r\n\r\nexport function useTableColumns(yearKeys: string[], trafficDataView: TrafficDataViewEnum, hasBeenInView: boolean) {\r\n return React.useMemo(\r\n () =>\r\n hasBeenInView\r\n ? getColumnsAndValueGetter(yearKeys, trafficDataView)\r\n : { columns: EMPTY_ARRAY, valueGetter: () => () => null },\r\n [yearKeys, trafficDataView, hasBeenInView]\r\n )\r\n}\r\n","import {\r\n AppPlatform,\r\n AppRegion,\r\n InitialTrafficData,\r\n ParsedAppItem,\r\n ParsedTrafficData,\r\n ParsedTrafficItem,\r\n} from './types'\r\n\r\nexport function getParsedDataFromInitial(data: InitialTrafficData): ParsedTrafficData {\r\n const { mainDomain, trafficsWithPeers, appsWithPeers, companyName, trafficTickers } = data\r\n\r\n return {\r\n trafficTickers,\r\n companyName,\r\n mainDomain: trafficsWithPeers.find(({ domain }) => domain && mainDomain?.includes(domain))?.domain ?? null,\r\n trafficsWithPeers: trafficsWithPeers.map(({ trafficJson, ...item }) => ({\r\n ...item,\r\n traffic: trafficJson ? JSON.parse(trafficJson) : null,\r\n })),\r\n appsWithPeers: appsWithPeers.map(({ mauJson, ...item }) => {\r\n let geo: AppRegion | null = null\r\n let os: AppPlatform | null = null\r\n if (item.geo?.toLowerCase() === AppRegion.ww) {\r\n geo = AppRegion.ww\r\n } else if (item.geo?.toLowerCase() === AppRegion.us) {\r\n geo = AppRegion.us\r\n }\r\n if (item.os?.toLowerCase() === AppPlatform.ios) {\r\n os = AppPlatform.ios\r\n } else if (item.os?.toLowerCase() === AppPlatform.android) {\r\n os = AppPlatform.android\r\n }\r\n\r\n return {\r\n ...item,\r\n appName: item.appName ?? 'N/A',\r\n id: `${item.domain}-${item.appName}-${item.appId}-${item.os}-${item.geo}`,\r\n os,\r\n geo,\r\n mau: mauJson ? JSON.parse(mauJson) : null,\r\n }\r\n }),\r\n }\r\n}\r\n\r\nexport function getSortedTickerTrafficsWithPeers(parsedData: ParsedTrafficData) {\r\n const tickerTrafficsWithPeers = parsedData.trafficsWithPeers.filter(\r\n (trafficWithPeers) =>\r\n trafficWithPeers.domain &&\r\n parsedData.trafficTickers.some((ticker) => ticker.toLowerCase() === trafficWithPeers.ticker?.toLowerCase())\r\n )\r\n tickerTrafficsWithPeers.sort((a, b) => {\r\n if (a.domain === parsedData?.mainDomain) return -1\r\n if (b.domain === parsedData?.mainDomain) return 1\r\n const aLastValue = a.traffic?.v[a.traffic.v.length - 1] ?? 0\r\n const bLastValue = b.traffic?.v[b.traffic.v.length - 1] ?? 0\r\n if (aLastValue === bLastValue) return 0\r\n\r\n return aLastValue > bLastValue ? -1 : 1\r\n })\r\n return tickerTrafficsWithPeers\r\n}\r\n\r\nexport function getAppStoreLink(app: ParsedAppItem) {\r\n if (!app.appId) return undefined\r\n\r\n if (app.os === AppPlatform.android) {\r\n return `https://play.google.com/store/apps/details?id=${app.appId}`\r\n }\r\n\r\n return `https://apps.apple.com/app/${app.appId}`\r\n}\r\n\r\nexport function getDomainHref(item: ParsedTrafficItem) {\r\n if (item.domain) {\r\n return `https://${item.domain}`\r\n }\r\n return undefined\r\n}\r\n\r\ninterface GetSelectedAppsArrayProps {\r\n domainApps: ParsedAppItem[]\r\n peerApps: ParsedAppItem[]\r\n industryApps: ParsedAppItem[]\r\n appRegions: AppRegion[]\r\n appPlatforms: AppPlatform[]\r\n}\r\n\r\nexport function getSelectedAppsArray({\r\n domainApps,\r\n peerApps,\r\n industryApps,\r\n appPlatforms,\r\n appRegions,\r\n}: GetSelectedAppsArrayProps) {\r\n if (domainApps.length === 0) {\r\n return []\r\n }\r\n\r\n return [domainApps, peerApps, industryApps]\r\n .flat()\r\n .filter((app) => appPlatforms.includes(app.os!) && appRegions.includes(app.geo!))\r\n}\r\n\r\nexport function sortByMauLastValueDesc(apps: ParsedAppItem[]) {\r\n return [...apps].sort((a, b) => {\r\n const aLastValue = a.mau?.v[a.mau.v.length - 1] ?? 0\r\n const bLastValue = b.mau?.v[b.mau.v.length - 1] ?? 0\r\n if (aLastValue === bLastValue) return 0\r\n\r\n return aLastValue > bLastValue ? -1 : 1\r\n })\r\n}\r\n","import React from 'react'\r\n\r\nimport { useTableSort } from '../../components/Table'\r\nimport { ExternalLink } from '../../components/external-link'\r\nimport { FinancialsWidget, getMoMPercentageData, useFinancialsTableContext } from '../../components/financials-table'\r\nimport { LineStackedBarChart } from '../../components/line-stacked-bar-chart'\r\nimport { TrafficTableBottomContent } from './TrafficTableBottomContent'\r\nimport { TrafficTableHead } from './TrafficTableHead'\r\nimport { WidgetDomainSettingsSection } from './WidgetDomainSettingsSection'\r\nimport { SEGMENT_COLORS } from './constants'\r\nimport { TrafficRowDataType, TrafficSettings, TrafficSubRowDataType } from './types'\r\nimport { ParsedTrafficItem } from './types'\r\nimport { useMonthlyDataControls } from './useMonthlyDataControls'\r\nimport { useTableColumns } from './useTableColumns'\r\nimport { getDomainHref } from './utils'\r\n\r\ninterface MapDataProps {\r\n mainTraffic: ParsedTrafficItem\r\n peerTraffics: ParsedTrafficItem[]\r\n industryTraffics: ParsedTrafficItem[]\r\n isPlaceholder: boolean\r\n}\r\n\r\ninterface Props extends Omit {\r\n hasBeenInView: boolean\r\n isInView: boolean\r\n}\r\n\r\nfunction mapData({\r\n mainTraffic,\r\n peerTraffics,\r\n industryTraffics,\r\n yearKeys,\r\n isPlaceholder,\r\n}: MapDataProps & { yearKeys: number[] }): TrafficRowDataType[] {\r\n const allTraffics = [mainTraffic, ...peerTraffics, ...industryTraffics]\r\n const domainsArray = allTraffics.map((traffic, index) => {\r\n const values = !isPlaceholder\r\n ? yearKeys.map((date) => {\r\n const index = traffic.traffic?.d.findIndex((d) => d === date) ?? -1\r\n return {\r\n year: date.toString(),\r\n value: traffic.traffic?.v[index] ?? null,\r\n }\r\n })\r\n : []\r\n\r\n const valuesWithMomData: TrafficSubRowDataType['values'] = []\r\n const keyValueMap: TrafficSubRowDataType['keyValueMap'] = {}\r\n const momKeyValueMap: TrafficSubRowDataType['momKeyValueMap'] = {}\r\n\r\n if (!isPlaceholder) {\r\n const momData = getMoMPercentageData(values)\r\n values.forEach(({ year, value }) => {\r\n const momValue = momData[year] ?? null\r\n keyValueMap[year] = value\r\n momKeyValueMap[year] = momValue\r\n\r\n valuesWithMomData.push({\r\n year,\r\n value,\r\n momValue,\r\n })\r\n })\r\n }\r\n\r\n const isHighlighted = traffic.domain === mainTraffic.domain\r\n\r\n return {\r\n label: traffic.domain!,\r\n id: traffic.domain!,\r\n labelElement: ,\r\n labelColumnClassName: 'whitespace-nowrap',\r\n isLabelColumnSticky: true,\r\n color: SEGMENT_COLORS[index % SEGMENT_COLORS.length],\r\n isHighlighted,\r\n isSelected: traffic.domain === mainTraffic.domain || !!mainTraffic?.peers?.includes(traffic.domain!),\r\n values: valuesWithMomData,\r\n keyValueMap,\r\n momKeyValueMap,\r\n }\r\n })\r\n\r\n return domainsArray\r\n}\r\n\r\nexport function Domain({\r\n mainTraffic,\r\n peerTraffics,\r\n industryTraffics: industryTrafficsRaw,\r\n hasBeenInView,\r\n isInView,\r\n}: Props) {\r\n const { settings } = useFinancialsTableContext()\r\n const clearInactiveIdsBlacklist = React.useMemo(\r\n () => (mainTraffic ? [mainTraffic, ...peerTraffics].map(({ domain }) => domain ?? '') : ([] as string[])),\r\n [mainTraffic, peerTraffics]\r\n )\r\n const { monthlyDataRowSelectionOverrides, toggleMonthlyDataRowSelection, isShowMore, toggleIsShowMore } =\r\n useMonthlyDataControls({\r\n clearInactiveIdsBlacklist,\r\n })\r\n const industryTraffics = React.useMemo(() => {\r\n if (isShowMore) {\r\n return industryTrafficsRaw\r\n }\r\n return industryTrafficsRaw.filter(({ domain }) => domain && monthlyDataRowSelectionOverrides[domain] !== undefined)\r\n }, [industryTrafficsRaw, monthlyDataRowSelectionOverrides, isShowMore])\r\n\r\n const yearKeys = React.useMemo(() => {\r\n const allTraffics = [mainTraffic, ...peerTraffics, ...industryTraffics]\r\n return allTraffics\r\n .flatMap(({ traffic }) => traffic?.d)\r\n .filter((year, index, arr) => year !== undefined && arr.indexOf(year) === index)\r\n .sort((a, b) => a! - b!) as number[]\r\n }, [mainTraffic, peerTraffics, industryTraffics])\r\n const stringYearKeys = React.useMemo(() => yearKeys.map((y) => y.toString()), [yearKeys])\r\n const [monthlyData, setMonthlyData] = React.useState(() =>\r\n mapData({ peerTraffics, mainTraffic, industryTraffics, yearKeys, isPlaceholder: true })\r\n )\r\n const { columns, valueGetter } = useTableColumns(stringYearKeys, settings.trafficDataView, hasBeenInView)\r\n\r\n const {\r\n data: sortedData,\r\n sort,\r\n changeSort,\r\n } = useTableSort({\r\n data: monthlyData,\r\n columns,\r\n defaultSort: { column: columns[columns.length - 1], direction: -1 },\r\n key: hasBeenInView ? 1 : 0,\r\n valueGetter,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!hasBeenInView) {\r\n return\r\n }\r\n\r\n const newMonthlyData = mapData({\r\n peerTraffics,\r\n mainTraffic,\r\n industryTraffics,\r\n yearKeys,\r\n isPlaceholder: false,\r\n })\r\n setMonthlyData(\r\n newMonthlyData.map((data, index) => ({\r\n ...data,\r\n isSelected: monthlyDataRowSelectionOverrides[data.id] ?? index < [mainTraffic, ...peerTraffics].length,\r\n }))\r\n )\r\n }, [\r\n peerTraffics,\r\n mainTraffic,\r\n industryTraffics,\r\n yearKeys,\r\n monthlyDataRowSelectionOverrides,\r\n hasBeenInView,\r\n settings.trafficDataView,\r\n ])\r\n\r\n return (\r\n
\r\n }\r\n tableHead={}\r\n columns={columns}\r\n hasStickyColumnWrapper={hasBeenInView}\r\n isTableFixed={false}\r\n onVisibilityChange={toggleMonthlyDataRowSelection}\r\n >\r\n \r\n \r\n 0}\r\n isShowMore={isShowMore}\r\n onShowMoreToggle={toggleIsShowMore}\r\n />\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Heading, Paragraph } from '../../components/typography'\r\nimport { Domain } from './Domain'\r\n\r\nconst mainTraffic = {\r\n ticker: 'AAPL',\r\n domain: 'apple.com',\r\n sector: 'Information Technology',\r\n industryGroup: 'Technology Hardware & Equipment',\r\n industry: 'Electronic Equipment, Instruments & Components',\r\n heatmapSector: 'Retail & Ecommerce',\r\n heatmapSubSector: 'Electronics Retail',\r\n peers: 'bestbuy.com bhphotovideo.com dell.com newegg.com gopro.com',\r\n traffic: {\r\n d: [202309, 202310, 202311, 202312, 202401, 202402, 202403, 202404, 202405, 202406, 202407, 202408],\r\n v: [\r\n 540748750, 505229547, 487297621, 488173477, 491135108, 455089483, 469888439, 438799320, 466652151, 447602427,\r\n 460280112, 466004425,\r\n ],\r\n },\r\n}\r\n\r\nconst peerTraffics = [\r\n {\r\n ticker: null,\r\n domain: 'bhphotovideo.com',\r\n heatmapSector: 'Retail & Ecommerce',\r\n heatmapSubSector: 'Electronics Retail',\r\n peers: 'adorama.com bestbuy.com newegg.com crutchfield.com apple.com',\r\n traffic: {\r\n d: [202309, 202310, 202311, 202312, 202401, 202402, 202403, 202404, 202405, 202406, 202407, 202408],\r\n v: [\r\n 16882382, 15587001, 19360737, 17491439, 15626709, 14937833, 15778420, 14048463, 14447505, 13713870, 14458610,\r\n 13244665,\r\n ],\r\n },\r\n },\r\n {\r\n ticker: 'NEGG',\r\n domain: 'newegg.com',\r\n sector: 'Consumer Discretionary',\r\n industryGroup: 'Automobiles & Components',\r\n industry: 'Automobiles',\r\n heatmapSector: 'Retail & Ecommerce',\r\n heatmapSubSector: 'Electronics Retail',\r\n peers: 'bestbuy.com bhphotovideo.com microcenter.com monoprice.com adorama.com',\r\n traffic: {\r\n d: [202309, 202310, 202311, 202312, 202401, 202402, 202403, 202404, 202405, 202406, 202407, 202408],\r\n v: [\r\n 14655543, 14675084, 21299681, 17083935, 14989483, 12606841, 12744555, 11189424, 11204263, 10793083, 12361144,\r\n 10800396,\r\n ],\r\n },\r\n },\r\n {\r\n ticker: 'BBY',\r\n domain: 'bestbuy.com',\r\n sector: 'Consumer Discretionary',\r\n industryGroup: 'Retailing',\r\n industry: 'Specialty Retail',\r\n heatmapSector: 'Retail & Ecommerce',\r\n heatmapSubSector: 'Electronics Retail',\r\n peers: 'bhphotovideo.com newegg.com microcenter.com adorama.com crutchfield.com',\r\n traffic: {\r\n d: [202309, 202310, 202311, 202312, 202401, 202402, 202403, 202404, 202405, 202406, 202407, 202408],\r\n v: [\r\n 103083547, 109511672, 183001509, 145494317, 106208296, 91989808, 89471329, 82107190, 93211500, 95630411,\r\n 107767846, 108331167,\r\n ],\r\n },\r\n },\r\n {\r\n ticker: 'GPRO',\r\n domain: 'gopro.com',\r\n sector: 'Information Technology',\r\n industryGroup: 'Technology Hardware & Equipment',\r\n industry: 'Electronic Equipment, Instruments & Components',\r\n heatmapSector: 'Retail & Ecommerce',\r\n heatmapSubSector: 'Electronics Retail',\r\n peers: 'adorama.com bhphotovideo.com crutchfield.com bestbuy.com newegg.com',\r\n traffic: {\r\n d: [202309, 202310, 202311, 202312, 202401, 202402, 202403, 202404, 202405, 202406, 202407, 202408],\r\n v: [6691953, 5650591, 5848752, 5772722, 5387842, 4922998, 5067003, 4727655, 4848193, 5098999, 5130140, 4867626],\r\n },\r\n },\r\n {\r\n ticker: 'DELL',\r\n domain: 'dell.com',\r\n sector: 'Information Technology',\r\n industryGroup: 'Technology Hardware & Equipment',\r\n industry: 'Technology Hardware, Storage & Peripherals',\r\n heatmapSector: 'Retail & Ecommerce',\r\n heatmapSubSector: 'Electronics Retail',\r\n peers: 'bestbuy.com newegg.com bhphotovideo.com microcenter.com kabum.com.br',\r\n traffic: {\r\n d: [202309, 202310, 202311, 202312, 202401, 202402, 202403, 202404, 202405, 202406, 202407, 202408],\r\n v: [\r\n 45350663, 46275790, 54923594, 43819278, 47816519, 41098872, 45505450, 40775151, 40332786, 39203811, 45198644,\r\n 41075116,\r\n ],\r\n },\r\n },\r\n]\r\n\r\ninterface Props {\r\n companyName: string\r\n}\r\n\r\nexport function NoDataPlaceholder({ companyName }: Props) {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n Data Unavailable for {companyName}\r\n \r\n Currently, we do not have sufficient data to display the{' '}\r\n associated domains and smartphone apps for this company. As soon as the relevant\r\n information becomes available, this view will be updated to provide you with valuable insights.\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Heading } from '../../components'\r\nimport { ChipSwitch, ChipSwitchButton } from '../../components/ChipSwitch'\r\nimport { useFinancialsTableContext } from '../../components/financials-table'\r\nimport { View } from '../../components/line-stacked-bar-chart'\r\nimport { AppPlatformLabels, AppRegionLabels } from './constants'\r\nimport { AppPlatform, AppRegion, TrafficDataViewEnum, TrafficSettings } from './types'\r\n\r\nexport function WidgetAppSettingsSection() {\r\n const { settings, setSettings } = useFinancialsTableContext()\r\n\r\n const toggleSetting = (key: keyof TrafficSettings, value: TrafficSettings[typeof key]) => {\r\n setSettings({\r\n ...settings,\r\n [key]: value,\r\n })\r\n }\r\n\r\n return (\r\n
\r\n \r\n Apps: Monthly Active Users\r\n \r\n
\r\n \r\n {[AppPlatform.ios, AppPlatform.android].map((key) => (\r\n {\r\n const has = settings.appPlatforms.includes(key)\r\n toggleSetting('appPlatforms', [\r\n ...settings.appPlatforms.filter((platform) => platform !== key),\r\n ...(has ? [] : [key]),\r\n ])\r\n }}\r\n >\r\n {AppPlatformLabels[key]}\r\n \r\n ))}\r\n \r\n\r\n \r\n {[AppRegion.ww, AppRegion.us].map((key) => (\r\n {\r\n const has = settings.appRegions.includes(key)\r\n toggleSetting('appRegions', [\r\n ...settings.appRegions.filter((platform) => platform !== key),\r\n ...(has ? [] : [key]),\r\n ])\r\n }}\r\n >\r\n {AppRegionLabels[key]}\r\n \r\n ))}\r\n \r\n\r\n \r\n {\r\n toggleSetting('trafficDataView', TrafficDataViewEnum.visits)\r\n }}\r\n >\r\n MAU\r\n \r\n {\r\n toggleSetting('trafficDataView', TrafficDataViewEnum.momChangePct)\r\n }}\r\n >\r\n MoM Growth %\r\n \r\n \r\n\r\n \r\n {\r\n toggleSetting('chartView', View.bars)\r\n }}\r\n />\r\n {\r\n toggleSetting('chartView', View.lines)\r\n }}\r\n />\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Tag } from '../../components'\r\nimport { useTableSort } from '../../components/Table'\r\nimport { ExternalLink } from '../../components/external-link'\r\nimport { FinancialsWidget, getMoMPercentageData, useFinancialsTableContext } from '../../components/financials-table'\r\nimport { LineStackedBarChart } from '../../components/line-stacked-bar-chart'\r\nimport { TrafficTableBottomContent } from './TrafficTableBottomContent'\r\nimport { TrafficTableHead } from './TrafficTableHead'\r\nimport { WidgetAppSettingsSection } from './WidgetAppSettingsSection'\r\nimport { AppPlatformLabels, AppRegionLabels, DEFAULT_SHOW_NUM_OF_APPS, SEGMENT_COLORS } from './constants'\r\nimport { ParsedAppItem, TrafficRowDataType, TrafficSettings, TrafficSubRowDataType } from './types'\r\nimport { MonthlyDataRowSelectionOverridesType, useMonthlyDataControls } from './useMonthlyDataControls'\r\nimport { useTableColumns } from './useTableColumns'\r\nimport { getAppStoreLink, getSelectedAppsArray } from './utils'\r\n\r\ninterface MapDataProps {\r\n domain: string | null\r\n selectedAppsArray: ParsedAppItem[]\r\n selectionOverrides?: MonthlyDataRowSelectionOverridesType\r\n yearKeys: number[]\r\n isPlaceholder: boolean\r\n}\r\n\r\nfunction mapData({\r\n domain,\r\n selectedAppsArray,\r\n selectionOverrides,\r\n yearKeys,\r\n isPlaceholder,\r\n}: MapDataProps): TrafficRowDataType[] {\r\n return selectedAppsArray.map((app, index) => {\r\n const appName = app.appName ?? 'N/A'\r\n const platformLabel = app.os ? AppPlatformLabels[app.os] : 'N/A'\r\n const geoLabel = app.geo ? AppRegionLabels[app.geo] : 'N/A'\r\n const values = !isPlaceholder\r\n ? yearKeys.map((date) => {\r\n const index = app.mau?.d.findIndex((d) => d === date) ?? -1\r\n return {\r\n year: date.toString(),\r\n value: app.mau?.v[index] ?? null,\r\n }\r\n })\r\n : []\r\n\r\n const valuesWithMomData: TrafficSubRowDataType['values'] = []\r\n const keyValueMap: TrafficSubRowDataType['keyValueMap'] = {}\r\n const momKeyValueMap: TrafficSubRowDataType['momKeyValueMap'] = {}\r\n\r\n if (!isPlaceholder) {\r\n const momData = getMoMPercentageData(values)\r\n values.forEach(({ year, value }) => {\r\n const momValue = momData[year] ?? null\r\n keyValueMap[year] = value\r\n momKeyValueMap[year] = momValue\r\n\r\n valuesWithMomData.push({\r\n year,\r\n value,\r\n momValue,\r\n })\r\n })\r\n }\r\n\r\n const isHighlighted = app.domain === domain\r\n\r\n return {\r\n id: app.id,\r\n label: [appName, platformLabel, geoLabel].join(' - '),\r\n labelColumnClassName: 'whitespace-nowrap',\r\n isLabelColumnSticky: true,\r\n labelElement: (\r\n
\r\n \r\n {platformLabel} {geoLabel}\r\n
\r\n ),\r\n isHighlighted,\r\n geo: app.geo,\r\n os: app.os,\r\n color: SEGMENT_COLORS[index % SEGMENT_COLORS.length],\r\n isSelected: selectionOverrides?.[app.id] ?? index < DEFAULT_SHOW_NUM_OF_APPS,\r\n values: valuesWithMomData,\r\n keyValueMap,\r\n momKeyValueMap,\r\n }\r\n })\r\n}\r\n\r\ninterface Props {\r\n domainApps: ParsedAppItem[]\r\n peerApps: ParsedAppItem[]\r\n industryApps: ParsedAppItem[]\r\n hasBeenInView: boolean\r\n isInView: boolean\r\n}\r\n\r\nexport function Apps({ domainApps, peerApps, industryApps, hasBeenInView, isInView }: Props) {\r\n const { settings } = useFinancialsTableContext()\r\n const { domain, yearKeys, stringYearKeys } = React.useMemo(() => {\r\n const domain = domainApps?.[0].domain ?? null\r\n const domainAppsYears = domainApps?.flatMap(({ mau }) => mau?.d) ?? []\r\n const peerAppsYears = peerApps?.flatMap(({ mau }) => mau?.d) ?? []\r\n const industryAppsYears = industryApps?.flatMap(({ mau }) => mau?.d) ?? []\r\n\r\n const yearKeys = (\r\n [...new Set([...domainAppsYears, ...peerAppsYears, ...industryAppsYears])].filter(Boolean) as number[]\r\n ).sort((a, b) => a - b)\r\n\r\n return {\r\n yearKeys,\r\n stringYearKeys: yearKeys.map((y) => y.toString()),\r\n domain,\r\n }\r\n }, [domainApps, peerApps, industryApps])\r\n\r\n const selectedAppsArray = React.useMemo(\r\n () =>\r\n getSelectedAppsArray({\r\n domainApps,\r\n peerApps,\r\n industryApps,\r\n appPlatforms: settings.appPlatforms,\r\n appRegions: settings.appRegions,\r\n }),\r\n [domainApps, peerApps, industryApps, settings.appRegions, settings.appPlatforms]\r\n )\r\n const clearInactiveIdsBlacklist = React.useMemo(\r\n () => selectedAppsArray.slice(0, DEFAULT_SHOW_NUM_OF_APPS).map(({ id }) => id),\r\n [selectedAppsArray]\r\n )\r\n const { monthlyDataRowSelectionOverrides, toggleMonthlyDataRowSelection, isShowMore, toggleIsShowMore } =\r\n useMonthlyDataControls({ clearInactiveIdsBlacklist })\r\n const [monthlyData, setMonthlyData] = React.useState(() =>\r\n mapData({\r\n domain,\r\n selectedAppsArray: selectedAppsArray.slice(0, DEFAULT_SHOW_NUM_OF_APPS),\r\n yearKeys,\r\n isPlaceholder: true,\r\n })\r\n )\r\n const { columns, valueGetter } = useTableColumns(stringYearKeys, settings.trafficDataView, hasBeenInView)\r\n\r\n const {\r\n data: sortedData,\r\n sort,\r\n changeSort,\r\n } = useTableSort({\r\n data: monthlyData,\r\n columns,\r\n defaultSort: { column: columns[columns.length - 1], direction: -1 },\r\n key: hasBeenInView ? 1 : 0,\r\n valueGetter,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!hasBeenInView) {\r\n return\r\n }\r\n\r\n const newMonthlyData = mapData({\r\n domain,\r\n selectedAppsArray: selectedAppsArray.filter(\r\n ({ id }, index) =>\r\n isShowMore || index < DEFAULT_SHOW_NUM_OF_APPS || monthlyDataRowSelectionOverrides[id] !== undefined\r\n ),\r\n yearKeys,\r\n selectionOverrides: monthlyDataRowSelectionOverrides,\r\n isPlaceholder: false,\r\n })\r\n\r\n setMonthlyData(newMonthlyData)\r\n }, [domain, selectedAppsArray, monthlyDataRowSelectionOverrides, yearKeys, isShowMore, hasBeenInView])\r\n\r\n const isEmpty = monthlyData.length === 0\r\n\r\n return (\r\n
\r\n }\r\n tableHead={\r\n isEmpty ? undefined : (\r\n \r\n )\r\n }\r\n columns={columns}\r\n hasStickyColumnWrapper={hasBeenInView}\r\n onVisibilityChange={toggleMonthlyDataRowSelection}\r\n >\r\n \r\n No matching Apps found.\r\n
\r\n Adjust your filters for more results.\r\n \r\n }\r\n isEmpty={isEmpty}\r\n isInView={isInView}\r\n hasBeenInView={hasBeenInView}\r\n isFullWidth\r\n hasXAxis\r\n />\r\n \r\n {!isEmpty && (\r\n DEFAULT_SHOW_NUM_OF_APPS}\r\n isShowMore={isShowMore}\r\n onShowMoreToggle={toggleIsShowMore}\r\n />\r\n )}\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Icon, Select, SelectItem } from '../../components'\r\n\r\ninterface Props {\r\n domain?: string | null\r\n domainItems: SelectItem[]\r\n isInteractive: boolean\r\n}\r\n\r\nconst TICKER_HEADER_CONTAINER_CLASS_NAME = 'js-ticker-header-container'\r\n\r\nexport default function TrafficDomainSelect({ domain, domainItems, isInteractive }: Props) {\r\n const handleDomainSelect = React.useCallback(({ value }: { value: string }) => {\r\n const tickerHeaderContainer = document.getElementsByClassName(TICKER_HEADER_CONTAINER_CLASS_NAME)?.[0]\r\n const fvHeaderHeightInPx =\r\n Number.parseFloat(window.getComputedStyle(document.body).getPropertyValue('--fv-header-height')) || 0\r\n const element = document.getElementById(value)\r\n const elementTopPosition = element?.getBoundingClientRect().top ?? 0\r\n window.scrollTo({\r\n left: 0,\r\n top: window.scrollY + elementTopPosition - tickerHeaderContainer.clientHeight - fvHeaderHeightInPx - 1, // -1 because if it's not there sticky shadow is applied on domain header\r\n behavior: 'smooth',\r\n })\r\n }, [])\r\n\r\n return (\r\n
\r\n }\r\n items={domainItems}\r\n isInteractive={isInteractive}\r\n onChange={handleDomainSelect}\r\n />\r\n
\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Heading } from '../../components/typography'\r\nimport { useStickyShadow } from '../../hooks/use-sticky-shadow'\r\nimport { shortFormatNumber } from '../../util'\r\n\r\ninterface Props {\r\n domainElement: React.ReactElement | string\r\n sector?: string | null\r\n subSector?: string | null\r\n monthlyVisits: Array\r\n}\r\n\r\nexport default function TrafficHeader({ domainElement, sector, subSector, monthlyVisits }: Props) {\r\n const { stickyRef, isSticky } = useStickyShadow()\r\n\r\n const headerColumns = React.useMemo(() => {\r\n const lastMonthVisits = monthlyVisits[monthlyVisits.length - 1]\r\n const prevMonthVisits = monthlyVisits[monthlyVisits.length - 2]\r\n const visitsChangePercentage =\r\n typeof lastMonthVisits === 'number' && typeof prevMonthVisits === 'number'\r\n ? ((lastMonthVisits - prevMonthVisits) / Math.abs(prevMonthVisits)) * 100\r\n : null\r\n\r\n return [\r\n { label: 'Domain', value: domainElement },\r\n {\r\n label: 'Last Month Visits',\r\n value: `${shortFormatNumber(lastMonthVisits, { fractions: 2 })} ${visitsChangePercentage !== null ? `(${shortFormatNumber(visitsChangePercentage, { fractions: 2, showPlusSign: true })}%)` : ''}`,\r\n },\r\n // Used || intentionally in case sector/subSection is '' (empty string)\r\n { label: 'Sector', value: sector || '—' },\r\n { label: 'Sub Sector', value: subSector || '—' },\r\n ].map(({ label, value }, index) => (\r\n
\r\n {index === 0 && React.isValidElement(value) ? (\r\n value\r\n ) : (\r\n \r\n {value}\r\n \r\n )}\r\n {label}\r\n
\r\n ))\r\n }, [domainElement, monthlyVisits, sector, subSector])\r\n\r\n return (\r\n
\r\n \r\n
\r\n
{headerColumns}
\r\n
\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { useIntersectionObserverContext } from '../../services/IntersectionObserverContext'\r\nimport { Apps } from './Apps'\r\nimport { Domain } from './Domain'\r\nimport TrafficDomainSelect from './TrafficDomainSelect'\r\nimport TrafficHeader from './TrafficHeader'\r\nimport { ParsedTrafficData } from './types'\r\nimport { ParsedTrafficItem } from './types'\r\nimport { sortByMauLastValueDesc } from './utils'\r\n\r\ninterface Props {\r\n parsedTrafficData: ParsedTrafficData\r\n domain: string\r\n index: number\r\n}\r\n\r\nexport function TrafficDomainSection({ parsedTrafficData, domain, index }: Props) {\r\n const { registerIntersectionObservedElement } = useIntersectionObserverContext()\r\n const domainApps = React.useMemo(\r\n () => sortByMauLastValueDesc(parsedTrafficData.appsWithPeers.filter((app) => app.domain === domain)),\r\n [parsedTrafficData, domain]\r\n )\r\n const [isInView, setIsInView] = React.useState(false)\r\n const [hasBeenInView, setHasBeenInView] = React.useState(false)\r\n const { mainTraffic, peerTraffics, industryTraffics, peerApps, industryApps } = React.useMemo(() => {\r\n const peerTraffics: ParsedTrafficItem[] = []\r\n const industryTraffics: ParsedTrafficItem[] = []\r\n\r\n const mainTraffic = parsedTrafficData.trafficsWithPeers.find((traffic) => traffic.domain === domain)!\r\n\r\n parsedTrafficData?.trafficsWithPeers.forEach((traffic) => {\r\n if (traffic.domain === domain) {\r\n return\r\n } else if (mainTraffic.peers?.includes(traffic.domain!)) {\r\n peerTraffics.push(traffic)\r\n } else if (\r\n mainTraffic.heatmapSector &&\r\n mainTraffic.heatmapSubSector &&\r\n mainTraffic.heatmapSector === traffic.heatmapSector &&\r\n mainTraffic.heatmapSubSector === traffic.heatmapSubSector\r\n ) {\r\n industryTraffics.push(traffic)\r\n }\r\n })\r\n\r\n const peerApps = sortByMauLastValueDesc(\r\n parsedTrafficData.appsWithPeers.filter((app) => peerTraffics.some((traffic) => app.domain === traffic.domain))\r\n )\r\n const industryApps = sortByMauLastValueDesc(\r\n parsedTrafficData.appsWithPeers.filter((app) => industryTraffics.some((traffic) => app.domain === traffic.domain))\r\n )\r\n\r\n return {\r\n mainTraffic,\r\n peerTraffics,\r\n industryTraffics,\r\n peerApps,\r\n industryApps,\r\n }\r\n }, [parsedTrafficData, domain])\r\n\r\n const domainItems = React.useMemo(\r\n () =>\r\n parsedTrafficData.trafficsWithPeers\r\n .filter(({ ticker, domain }) => domain && ticker === mainTraffic.ticker)\r\n .map(({ domain }) => ({ value: domain!, label: domain! })),\r\n [parsedTrafficData.trafficsWithPeers, mainTraffic.ticker]\r\n )\r\n\r\n React.useEffect(() => {\r\n if (isInView && !hasBeenInView) {\r\n setHasBeenInView(true)\r\n }\r\n }, [hasBeenInView, isInView])\r\n\r\n React.useEffect(() => {\r\n const unregister = registerIntersectionObservedElement(domain, setIsInView)\r\n\r\n return () => {\r\n unregister?.()\r\n }\r\n }, [domain, registerIntersectionObservedElement])\r\n\r\n return (\r\n
\r\n {index > 0 &&
}\r\n 1 ? (\r\n \r\n ) : (\r\n domain\r\n )\r\n }\r\n sector={mainTraffic.heatmapSector}\r\n subSector={mainTraffic.heatmapSubSector}\r\n monthlyVisits={mainTraffic.traffic?.v ?? []}\r\n />\r\n\r\n \r\n\r\n {domainApps.length > 0 && (\r\n \r\n )}\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { FinancialsTableContextProvider } from '../../components/financials-table'\r\nimport { useWindowSize } from '../../hooks/use-window-size'\r\nimport { useCachedLoaderData } from '../../hooks/useCachedLoaderData'\r\nimport { IntersectionObserverContextProvider } from '../../services/IntersectionObserverContext'\r\nimport { NoDataPlaceholder } from './NoDataPlaceholder'\r\nimport { TrafficDomainSection } from './TrafficDomainSection'\r\nimport { COOKIE_KEY, DEFAULT_SETTINGS } from './constants'\r\nimport { InitialTrafficData, ParsedTrafficData } from './types'\r\nimport { getParsedDataFromInitial, getSortedTickerTrafficsWithPeers } from './utils'\r\n\r\nfunction TrafficComponent() {\r\n const { clientWidth } = useWindowSize()\r\n const { data } = useCachedLoaderData()\r\n\r\n const parsedData = React.useMemo(() => {\r\n if (!data) return null\r\n\r\n return getParsedDataFromInitial(data)\r\n }, [data])\r\n\r\n const tickerTrafficsWithPeers = React.useMemo(() => {\r\n if (!parsedData) return []\r\n\r\n return getSortedTickerTrafficsWithPeers(parsedData)\r\n }, [parsedData])\r\n\r\n React.useEffect(() => {\r\n // Remove min-height from react root element which is set on BE because of CLS\r\n document.getElementById('root')?.style.removeProperty('min-height')\r\n }, [])\r\n\r\n if (!data || data.appsWithPeers.length === 0) {\r\n return \r\n }\r\n\r\n return (\r\n \r\n
\r\n {tickerTrafficsWithPeers.map((trafficWithPeers, index) => (\r\n \r\n ))}\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default function Traffic() {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { ObjectHash } from '../components/types'\r\n\r\ntype IntersectionObservedEntry = ObjectHash<(isIntersecting: boolean) => void>\r\n\r\n/*\r\n * Context.\r\n */\r\n\r\nexport interface IntersectionObserverContextProps {\r\n intersectionObservedElementsRef: React.MutableRefObject\r\n registerIntersectionObservedElement: (\r\n elementId: string,\r\n callback: (isObserving: boolean) => void\r\n ) => (() => void) | null\r\n}\r\n\r\nexport const IntersectionObserverContext = React.createContext({\r\n intersectionObservedElementsRef: { current: {} },\r\n registerIntersectionObservedElement: () => null,\r\n})\r\n\r\n/*\r\n * Hook.\r\n */\r\n\r\nexport function useIntersectionObserverContext(): IntersectionObserverContextProps {\r\n return React.useContext(IntersectionObserverContext)\r\n}\r\n\r\n/*\r\n * Component.\r\n */\r\n\r\ninterface IntersectionObserverContextProviderProps {\r\n children: React.ReactNode\r\n}\r\nexport const IntersectionObserverContextProvider = ({ children }: IntersectionObserverContextProviderProps) => {\r\n const intersectionObservedElementsRef = React.useRef({})\r\n const intersectionObserverRef = React.useRef(\r\n new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n const callback = intersectionObservedElementsRef.current[entry.target.id]\r\n callback?.(entry.isIntersecting)\r\n })\r\n })\r\n )\r\n\r\n React.useEffect(\r\n () => () => {\r\n intersectionObserverRef.current.disconnect()\r\n },\r\n []\r\n )\r\n\r\n const registerIntersectionObservedElement = React.useCallback(\r\n (elementId: string, callback: (isObserving: boolean) => void) => {\r\n const element = document.getElementById(elementId)\r\n if (!element) {\r\n return null\r\n }\r\n intersectionObserverRef.current.observe(element)\r\n intersectionObservedElementsRef.current[elementId] = callback\r\n\r\n return () => {\r\n intersectionObserverRef.current.unobserve(element)\r\n delete intersectionObservedElementsRef.current[elementId]\r\n }\r\n },\r\n []\r\n )\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n"],"names":["ChipSwitch","_ref","children","label","size","rounding","_jsxs","className","_jsx","Paragraph","React","map","child","_child$props$theme","type","Button","theme","props","classnames","active","ChipSwitchButton","ExternalLink","href","isBold","as","rightContent","Icon","name","width","padding","target","rel","onMouseDown","event","stopPropagation","onClick","FinancialsTableContext","settings","setSettings","scrollInfo","undefined","useFinancialsTableContext","FinancialsTableContextProvider","cookieKey","defaultSettings","setScrollInfo","cookieValue","decodeURIComponent","getCookie","length","JSON","parse","Provider","value","yPosition","window","scrollY","setCookieRequest","stringify","FinancialsTableRow","data","columns","subColumns","onVisibilityChange","isFirst","isLast","id","labelElement","labelColumnClassName","isSelected","color","subData","isLabelColumnSticky","TableBody","TableRow","classNames","TableCell","hasLeading","align","TableAlign","Left","isSticky","Checkbox","readOnly","checked","column","_column$getColumnClas","getColumnClassName","call","renderColumn","item","index","array","FinancialsTable","tableHead","tableFooter","isTableFixed","Table","row","_row$id","FinancialsWidget","_data$0$values$length","_data$","header","hasStickyColumnWrapper","financialsTable","TableStickyColumnWrapper","hasBorder","shouldScrollToEnd","values","getYoYData","sortedData","sort","a","b","Number","parseInt","year","reduce","acc","i","_sortedData$value","_sortedData","prev","change","changePct","Math","abs","getMoMPercentageData","_ref2","_sortedData$value2","_sortedData2","getIsCompact","numOfCols","barWidth","min","innerWidth","getHeatmapClassNames","arguments","useStickyShadow","stickyRef","setIsSticky","current","onScroll","throttle","stickyElement","elementStickyTopOffset","parseFloat","getComputedStyle","top","elementCurrentTopOffset","getBoundingClientRect","document","addEventListener","removeEventListener","useWindowSize","throttleWaitInMs","isWatching","setSize","clientWidth","documentElement","innerHeight","handleResize","cancel","TEMP_HIDDEN_RATE_RELEVANCY","TrafficTableBottomContent","showMoreLabel","showLessLabel","isShowMore","hasHiddenRows","onShowMoreToggle","wrapperRef","previousExpandWrapperTopRef","isShowMorePrevious","usePrevious","setTimeout","_wrapperRef$current$g","_wrapperRef$current","currentExpandWrapperTop","scrollTo","ref","_wrapperRef$current$g2","_wrapperRef$current2","leftContent","_Fragment","TrafficTableHead","stickyLabelWidthClassName","onSortChange","TableHead","TableHeader","_sort$column","TableHeaderSortable","isActive","direction","shouldRemoveOrder","SortDirection","Descending","handleChangeSort","TrafficDataViewEnum","AppRegion","AppPlatform","WidgetDomainSettingsSection","toggleSetting","key","Heading","level","trafficDataView","visits","momChangePct","chartView","View","bars","lines","COOKIE_KEY","DEFAULT_SHOW_NUM_OF_APPS","DEFAULT_SETTINGS","appPlatforms","android","ios","appRegions","us","ww","SEGMENT_COLORS","Object","keys","ColorVariant","filter","c","gray","default","AppPlatformLabels","AppRegionLabels","useMonthlyDataControls","clearInactiveIdsBlacklist","setIsShowMore","monthlyDataRowSelectionOverrides","setMonthlyDataRowSelectionOverrides","toggleMonthlyDataRowSelection","prevState","clearInactiveMonthlyData","includes","toggleIsShowMore","getColumnsAndValueGetter","yearKeys","isMomChangePct","yearMonth","slice","month","monthIndex","date","Date","format","Right","momKeyValueMap","_data$yearMonth","hasValue","shouldShowDecimal","shortFormatNumber","fractions","defaultValue","valueGetter","_data$column$id","EMPTY_ARRAY","useTableColumns","hasBeenInView","getAppStoreLink","app","appId","os","getDomainHref","domain","sortByMauLastValueDesc","apps","_a$mau$v","_a$mau","_b$mau$v","_b$mau","aLastValue","mau","v","bLastValue","mapData","mainTraffic","peerTraffics","industryTraffics","isPlaceholder","traffic","_mainTraffic$peers","_traffic$traffic$d$fi","_traffic$traffic","_traffic$traffic$v$in","_traffic$traffic2","d","findIndex","toString","valuesWithMomData","keyValueMap","momData","forEach","_momData$year","momValue","push","isHighlighted","peers","Domain","_ref3","industryTrafficsRaw","isInView","_ref4","_ref5","flatMap","_ref6","arr","indexOf","stringYearKeys","y","monthlyData","setMonthlyData","changeSort","useTableSort","defaultSort","newMonthlyData","_monthlyDataRowSelect","LineStackedBarChart","lineChartTooltipSort","isFullWidth","hasXAxis","ticker","sector","industryGroup","industry","heatmapSector","heatmapSubSector","NoDataPlaceholder","companyName","WidgetAppSettingsSection","has","platform","selectedAppsArray","selectionOverrides","_app$appName","_selectionOverrides$a","appName","platformLabel","geoLabel","geo","_app$mau$d$findIndex","_app$mau","_app$mau$v$index","_app$mau2","join","Tag","Apps","domainApps","peerApps","industryApps","_domainApps$0$domain","_domainApps$flatMap","_peerApps$flatMap","_industryApps$flatMap","domainAppsYears","peerAppsYears","industryAppsYears","Set","Boolean","flat","getSelectedAppsArray","_ref7","_ref8","isEmpty","emptyMessage","TICKER_HEADER_CONTAINER_CLASS_NAME","TrafficDomainSelect","domainItems","isInteractive","handleDomainSelect","_document$getElements","_element$getBoundingC","tickerHeaderContainer","getElementsByClassName","fvHeaderHeightInPx","body","getPropertyValue","element","getElementById","elementTopPosition","left","clientHeight","behavior","Select","contentClass","focusRing","items","onChange","TrafficHeader","domainElement","subSector","monthlyVisits","headerColumns","lastMonthVisits","prevMonthVisits","visitsChangePercentage","showPlusSign","TrafficDomainSection","_mainTraffic$traffic$","_mainTraffic$traffic","parsedTrafficData","registerIntersectionObservedElement","useIntersectionObserverContext","appsWithPeers","setIsInView","setHasBeenInView","trafficsWithPeers","find","some","unregister","TrafficComponent","useCachedLoaderData","parsedData","_trafficsWithPeers$fi","_trafficsWithPeers$fi2","mainDomain","trafficTickers","trafficJson","_item$geo","_item$geo2","_item$os","_item$os2","_item$appName","mauJson","toLowerCase","getParsedDataFromInitial","tickerTrafficsWithPeers","trafficWithPeers","_trafficWithPeers$tic","_a$traffic$v","_a$traffic","_b$traffic$v","_b$traffic","getSortedTickerTrafficsWithPeers","_parsedData$companyNa","_document$getElementB","style","removeProperty","IntersectionObserverContextProvider","maxWidth","max","Traffic","IntersectionObserverContext","intersectionObservedElementsRef","intersectionObserverRef","IntersectionObserver","entries","entry","callback","isIntersecting","disconnect","elementId","observe","unobserve"],"sourceRoot":""}