\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