@mx-cartographer/experiences 9.1.4-alpha.al6 → 9.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/CHANGELOG.md +2 -1
  2. package/dist/{AccountDetailsDrawer-Dae8eUXt.mjs → AccountDetailsDrawer-Cq4kiiKD.mjs} +10 -10
  3. package/dist/{AccountDetailsDrawer-Dae8eUXt.mjs.map → AccountDetailsDrawer-Cq4kiiKD.mjs.map} +1 -1
  4. package/dist/{AccountDetailsHeader-D_UjMD99.mjs → AccountDetailsHeader-BliEZhz7.mjs} +4 -4
  5. package/dist/{AccountDetailsHeader-D_UjMD99.mjs.map → AccountDetailsHeader-BliEZhz7.mjs.map} +1 -1
  6. package/dist/{Analytics-fWQ36-fb.mjs → Analytics-CkYXKvco.mjs} +2 -2
  7. package/dist/{Analytics-fWQ36-fb.mjs.map → Analytics-CkYXKvco.mjs.map} +1 -1
  8. package/dist/{CategorySelectorDrawer-k8AZYC8I.mjs → CategorySelectorDrawer-NJsFsKP1.mjs} +2 -2
  9. package/dist/{CategorySelectorDrawer-k8AZYC8I.mjs.map → CategorySelectorDrawer-NJsFsKP1.mjs.map} +1 -1
  10. package/dist/{Connect-tID_S_5e.mjs → Connect-BH0Pt6zc.mjs} +2 -2
  11. package/dist/{Connect-tID_S_5e.mjs.map → Connect-BH0Pt6zc.mjs.map} +1 -1
  12. package/dist/{ConnectCard-DcM6tUOX.mjs → ConnectCard-D7uxoH5Y.mjs} +2 -2
  13. package/dist/{ConnectCard-DcM6tUOX.mjs.map → ConnectCard-D7uxoH5Y.mjs.map} +1 -1
  14. package/dist/{ConnectDrawer-BQy4YYuc.mjs → ConnectDrawer-CW4LA3H3.mjs} +3 -3
  15. package/dist/{ConnectDrawer-BQy4YYuc.mjs.map → ConnectDrawer-CW4LA3H3.mjs.map} +1 -1
  16. package/dist/{ConnectionsDrawer-C73ASLMj.mjs → ConnectionsDrawer-CZU9ku-k.mjs} +3 -3
  17. package/dist/{ConnectionsDrawer-C73ASLMj.mjs.map → ConnectionsDrawer-CZU9ku-k.mjs.map} +1 -1
  18. package/dist/{CurrencyInput-CABYmqBh.mjs → CurrencyInput-DaGEQaLW.mjs} +2 -2
  19. package/dist/{CurrencyInput-CABYmqBh.mjs.map → CurrencyInput-DaGEQaLW.mjs.map} +1 -1
  20. package/dist/{EmbeddedCard-BwfkCsUN.mjs → EmbeddedCard-DCOQnTz-.mjs} +3 -3
  21. package/dist/{EmbeddedCard-BwfkCsUN.mjs.map → EmbeddedCard-DCOQnTz-.mjs.map} +1 -1
  22. package/dist/{Error-BFJ3BnfS.mjs → Error-Dtw6yxkf.mjs} +2 -2
  23. package/dist/{Error-BFJ3BnfS.mjs.map → Error-Dtw6yxkf.mjs.map} +1 -1
  24. package/dist/ErrorBoundary-CsdOcnJ9.mjs +24 -0
  25. package/dist/ErrorBoundary-CsdOcnJ9.mjs.map +1 -0
  26. package/dist/{ExportCsvAction-B1257a3M.mjs → ExportCsvAction-C-IisDcv.mjs} +3 -3
  27. package/dist/{ExportCsvAction-B1257a3M.mjs.map → ExportCsvAction-C-IisDcv.mjs.map} +1 -1
  28. package/dist/{GlobalAccountFilter-DEEc3Bc5.mjs → GlobalAccountFilter-BhzR5Vb1.mjs} +2 -2
  29. package/dist/{GlobalAccountFilter-DEEc3Bc5.mjs.map → GlobalAccountFilter-BhzR5Vb1.mjs.map} +1 -1
  30. package/dist/{GlobalCopyApi-DoJLovk7.mjs → GlobalCopyApi-wcnDUzMV.mjs} +56 -54
  31. package/dist/GlobalCopyApi-wcnDUzMV.mjs.map +1 -0
  32. package/dist/{Help-C3rQ0Cyu.mjs → Help-zVZdcmlk.mjs} +3 -3
  33. package/dist/{Help-C3rQ0Cyu.mjs.map → Help-zVZdcmlk.mjs.map} +1 -1
  34. package/dist/{LineChart-BxEIZHht.mjs → LineChart-CUfiH86G.mjs} +2 -2
  35. package/dist/{LineChart-BxEIZHht.mjs.map → LineChart-CUfiH86G.mjs.map} +1 -1
  36. package/dist/{ListItemAction-GDU5z4BN.mjs → ListItemAction-BqUCLj_w.mjs} +2 -2
  37. package/dist/{ListItemAction-GDU5z4BN.mjs.map → ListItemAction-BqUCLj_w.mjs.map} +1 -1
  38. package/dist/{ListItemWrapper-D6b-6m4t.mjs → ListItemWrapper-DRse79Iu.mjs} +2 -2
  39. package/dist/{ListItemWrapper-D6b-6m4t.mjs.map → ListItemWrapper-DRse79Iu.mjs.map} +1 -1
  40. package/dist/{ManageIncome-BJWVPAly.mjs → ManageIncome-B_8i71mE.mjs} +32 -32
  41. package/dist/{ManageIncome-BJWVPAly.mjs.map → ManageIncome-B_8i71mE.mjs.map} +1 -1
  42. package/dist/{MicroWidgetContainer-IUZQlml1.mjs → MicroWidgetContainer-B2NnKBgW.mjs} +2 -2
  43. package/dist/{MicroWidgetContainer-IUZQlml1.mjs.map → MicroWidgetContainer-B2NnKBgW.mjs.map} +1 -1
  44. package/dist/{MiniWidgetContainer-CIswJui8.mjs → MiniWidgetContainer-Bmv_WeUd.mjs} +2 -2
  45. package/dist/{MiniWidgetContainer-CIswJui8.mjs.map → MiniWidgetContainer-Bmv_WeUd.mjs.map} +1 -1
  46. package/dist/{NotificationSettings-DltXMrnb.mjs → NotificationSettings-CW7okUrk.mjs} +33 -33
  47. package/dist/{NotificationSettings-DltXMrnb.mjs.map → NotificationSettings-CW7okUrk.mjs.map} +1 -1
  48. package/dist/{OriginalBalanceAction-KuJSsZCA.mjs → OriginalBalanceAction-YrvxBYAl.mjs} +4 -4
  49. package/dist/{OriginalBalanceAction-KuJSsZCA.mjs.map → OriginalBalanceAction-YrvxBYAl.mjs.map} +1 -1
  50. package/dist/{RecurringSettings-D2Aaqz7d.mjs → RecurringSettings-hs0YUp83.mjs} +3 -3
  51. package/dist/{RecurringSettings-D2Aaqz7d.mjs.map → RecurringSettings-hs0YUp83.mjs.map} +1 -1
  52. package/dist/{SpendingLegend-C_dMdqbe.mjs → SpendingLegend-CxvNOg3c.mjs} +2 -2
  53. package/dist/{SpendingLegend-C_dMdqbe.mjs.map → SpendingLegend-CxvNOg3c.mjs.map} +1 -1
  54. package/dist/{TransactionDetails-CDZNsKv7.mjs → TransactionDetails-DT-MQqOB.mjs} +5 -5
  55. package/dist/{TransactionDetails-CDZNsKv7.mjs.map → TransactionDetails-DT-MQqOB.mjs.map} +1 -1
  56. package/dist/{UserStore-B__9hQOS.mjs → UserStore-_QQpkbw9.mjs} +67 -69
  57. package/dist/UserStore-_QQpkbw9.mjs.map +1 -0
  58. package/dist/{ViewMoreMicroCard-CxGhzbRP.mjs → ViewMoreMicroCard-fnwE0hqd.mjs} +4 -4
  59. package/dist/{ViewMoreMicroCard-CxGhzbRP.mjs.map → ViewMoreMicroCard-fnwE0hqd.mjs.map} +1 -1
  60. package/dist/{WidgetContainer-5O6N88mr.mjs → WidgetContainer-CjdCY4sj.mjs} +3 -3
  61. package/dist/{WidgetContainer-5O6N88mr.mjs.map → WidgetContainer-CjdCY4sj.mjs.map} +1 -1
  62. package/dist/accounts/index.es.js +11 -11
  63. package/dist/analytics/index.es.js +2 -2
  64. package/dist/budgets/index.es.js +10 -10
  65. package/dist/cashflow/index.es.js +70 -70
  66. package/dist/categories/index.es.js +1 -1
  67. package/dist/common/components/ErrorBoundary.d.ts +0 -2
  68. package/dist/common/components/index.d.ts +0 -1
  69. package/dist/common/context/GlobalDataProvider.d.ts +1 -2
  70. package/dist/common/context/hooks.d.ts +0 -3
  71. package/dist/common/context/index.d.ts +1 -1
  72. package/dist/common/index.es.js +219 -275
  73. package/dist/common/index.es.js.map +1 -1
  74. package/dist/core/index.es.js +3 -3
  75. package/dist/core/stores/GlobalStore.d.ts +2 -4
  76. package/dist/core/types/Handlers.d.ts +0 -1
  77. package/dist/core/types/index.d.ts +1 -1
  78. package/dist/dashboard/index.es.js +4 -4
  79. package/dist/debts/index.es.js +8 -8
  80. package/dist/finstrong/index.es.js +12 -12
  81. package/dist/goals/index.es.js +9 -9
  82. package/dist/help/index.es.js +4 -4
  83. package/dist/hooks-97sNJ_lf.mjs +78 -0
  84. package/dist/hooks-97sNJ_lf.mjs.map +1 -0
  85. package/dist/insights/index.es.js +4 -4
  86. package/dist/investments/index.es.js +4 -4
  87. package/dist/merchants/index.es.js +1 -1
  88. package/dist/microinsights/index.es.js +1 -1
  89. package/dist/networth/index.es.js +6 -6
  90. package/dist/notifications/index.es.js +8 -8
  91. package/dist/recurringtransactions/index.es.js +38 -38
  92. package/dist/settings/index.es.js +27 -27
  93. package/dist/spending/index.es.js +33 -33
  94. package/dist/spending/index.es.js.map +1 -1
  95. package/dist/transactions/index.es.js +11 -11
  96. package/dist/trends/index.es.js +12 -12
  97. package/dist/{useAccountDisplayName-DHXXCFYZ.mjs → useAccountDisplayName-BsiXA0qf.mjs} +2 -2
  98. package/dist/{useAccountDisplayName-DHXXCFYZ.mjs.map → useAccountDisplayName-BsiXA0qf.mjs.map} +1 -1
  99. package/dist/{useInsightsEnabled-B_UpjpE6.mjs → useInsightsEnabled-D5Sdm0TJ.mjs} +2 -2
  100. package/dist/{useInsightsEnabled-B_UpjpE6.mjs.map → useInsightsEnabled-D5Sdm0TJ.mjs.map} +1 -1
  101. package/dist/{useWidgetLoadTimer-C0Mr0eRf.mjs → useWidgetLoadTimer-B0tB-yzL.mjs} +2 -2
  102. package/dist/{useWidgetLoadTimer-C0Mr0eRf.mjs.map → useWidgetLoadTimer-B0tB-yzL.mjs.map} +1 -1
  103. package/package.json +1 -1
  104. package/dist/ErrorBoundary-C7BlHx04.mjs +0 -27
  105. package/dist/ErrorBoundary-C7BlHx04.mjs.map +0 -1
  106. package/dist/GlobalCopyApi-DoJLovk7.mjs.map +0 -1
  107. package/dist/UserStore-B__9hQOS.mjs.map +0 -1
  108. package/dist/common/components/ErrorTestButtons.d.ts +0 -7
  109. package/dist/hooks-DWOrMnfZ.mjs +0 -83
  110. package/dist/hooks-DWOrMnfZ.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../../src/spending/components/SpendingTabLabel.tsx","../../src/spending/components/MiniSpendingChart.tsx","../../src/spending/SpendingMiniWidget.tsx","../../src/spending/components/SpendingList.tsx","../../src/spending/components/SpendingChart.tsx","../../src/spending/components/Spending.tsx","../../src/spending/SpendingWidget.tsx"],"sourcesContent":["import React from 'react'\n\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@mxenabled/mxui'\nimport { formatCurrency } from '../../core/utils/NumberFormatting'\n\ninterface SpendingTabLabelProps {\n amount: number\n label: string\n variant?: 'mini' | 'full'\n}\n\nconst SpendingTabLabel: React.FC<SpendingTabLabelProps> = ({ amount, label, variant = 'full' }) => {\n return (\n <Stack direction=\"column\">\n <Text bold={true} sx={{ textTransform: 'none' }} variant=\"body1\">\n {label}\n </Text>\n <Text variant=\"caption\">{formatCurrency(amount, variant === 'mini' ? '0,0' : '0,0.00')}</Text>\n </Stack>\n )\n}\n\nexport default SpendingTabLabel\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\nimport { useTheme } from '@mui/material/styles'\n\nimport { useCategoryStore, useGlobalCopyStore } from '../../common'\nimport { getIncomeData, getSpendingData } from '../utils/SpendingData'\n\nimport SpendingTabLabel from './SpendingTabLabel'\nimport SpendingDonut from './SpendingDonut'\nimport SpendingLegend from './SpendingLegend'\n\nconst MiniSpendingChart = () => {\n const theme = useTheme()\n const { goals: goalsCopy, spending: spendingCopy } = useGlobalCopyStore()\n const { categories, dateRangeCategoryTotals } = useCategoryStore()\n\n const incomeColors = React.useMemo(\n () => [\n theme.palette.chartMono.chartMono5,\n theme.palette.chartMono.chartMono4,\n theme.palette.chartMono.chartMono3,\n theme.palette.chartMono.chartMono2,\n theme.palette.chartMono.chartMono1,\n theme.palette.chartMono.chartMono6,\n ],\n [theme],\n ) as string[]\n\n const [selectedId, setSelectedId] = React.useState('')\n const [selectedTab, setSelectedTab] = React.useState(0)\n\n const spendingData = React.useMemo(\n () => getSpendingData(categories, goalsCopy, theme, dateRangeCategoryTotals),\n [categories, dateRangeCategoryTotals],\n )\n\n const incomeData = React.useMemo(\n () => getIncomeData(categories, dateRangeCategoryTotals, incomeColors),\n [categories, dateRangeCategoryTotals, incomeColors],\n )\n\n const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => {\n setSelectedTab(newValue)\n setSelectedId('')\n }\n\n const handleSelected = (id: string) => {\n setSelectedId(selectedId === id ? '' : id)\n }\n\n return (\n <Box width=\"100%\">\n <Tabs\n aria-label={spendingCopy.mini_title}\n onChange={handleTabChange}\n sx={{ touchAction: 'manipulation' }}\n value={selectedTab}\n variant=\"fullWidth\"\n >\n <Tab\n aria-controls=\"spending-tabpanel\"\n id=\"spending-tab\"\n label={\n <SpendingTabLabel\n amount={spendingData.totalAmount}\n label={spendingCopy.spend_tab_title}\n variant=\"mini\"\n />\n }\n tabIndex={selectedTab === 0 ? 0 : -1}\n />\n <Tab\n aria-controls=\"income-tabpanel\"\n id=\"income-tab\"\n label={\n <SpendingTabLabel\n amount={incomeData.totalAmount}\n label={spendingCopy.income_tab_title}\n variant=\"mini\"\n />\n }\n tabIndex={selectedTab === 1 ? 0 : -1}\n />\n </Tabs>\n <Box\n aria-labelledby=\"spending-tab\"\n hidden={selectedTab !== 0}\n id=\"spending-tabpanel\"\n role=\"tabpanel\"\n >\n <Stack direction=\"row\" gap={16} justifyContent={'center'} p={24}>\n <SpendingDonut\n data={spendingData}\n onSelected={handleSelected}\n selectedId={selectedId}\n totalLabel={spendingCopy.total_spending}\n />\n\n <SpendingLegend data={spendingData} onSelected={handleSelected} selectedId={selectedId} />\n </Stack>\n </Box>\n <Box\n aria-labelledby=\"income-tab\"\n hidden={selectedTab !== 1}\n id=\"income-tabpanel\"\n role=\"tabpanel\"\n >\n <Stack direction=\"row\" gap={16} justifyContent={'center'} p={24}>\n <SpendingDonut\n data={incomeData}\n isIncome={true}\n onSelected={handleSelected}\n selectedId={selectedId}\n totalLabel={spendingCopy.total_income}\n />\n\n <SpendingLegend data={incomeData} onSelected={handleSelected} selectedId={selectedId} />\n </Stack>\n </Box>\n </Box>\n )\n}\n\nexport default observer(MiniSpendingChart)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { endOfMonth } from 'date-fns/endOfMonth'\n\nimport {\n Loader,\n MiniWidgetContainer,\n useAccountStore,\n useCategoryStore,\n useGlobalCopyStore,\n useGlobalUiStore,\n useWidgetLoadTimer,\n} from '../common'\nimport { MiniWidgetProps } from '../core'\n\nimport MiniSpendingChart from './components/MiniSpendingChart'\n\nconst SpendingMiniWidget: React.FC<MiniWidgetProps> = ({ onPrimaryCtaClick, sx = {} }) => {\n const { isAccountDataLoaded, loadAccountData } = useAccountStore()\n const { dateRangeTotalsLoaded, categoriesLoaded, loadCategories, loadDateRangeCategoryTotals } =\n useCategoryStore()\n const { spending: spendingCopy } = useGlobalCopyStore()\n const { isInitialized, selectedAccounts } = useGlobalUiStore()\n\n useWidgetLoadTimer({\n widgetName: 'SpendingMiniWidget',\n isLoaded: dateRangeTotalsLoaded,\n })\n\n React.useEffect(() => {\n if (!isAccountDataLoaded) {\n loadAccountData().finally()\n }\n if (!categoriesLoaded) {\n loadCategories().finally()\n }\n }, [])\n\n React.useEffect(() => {\n loadDateRangeCategoryTotals(\n selectedAccounts,\n startOfMonth(new Date()),\n endOfMonth(new Date()),\n ).finally()\n }, [selectedAccounts])\n\n if (!isInitialized) {\n return <Loader />\n }\n\n return (\n <MiniWidgetContainer\n className=\"mx-exp-spending-miniwidget\"\n onPrimaryCtaClick={onPrimaryCtaClick}\n primaryCtaLabel={spendingCopy.primary_cta}\n primaryCtaLabelAria={spendingCopy.primary_cta_aria}\n sx={{ height: '100%', ...sx }}\n title={spendingCopy.mini_title}\n >\n <MiniSpendingChart />\n </MiniWidgetContainer>\n )\n}\n\nexport default observer(SpendingMiniWidget)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Collapse from '@mui/material/Collapse'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport { useGlobalCopyStore } from '../../common'\nimport { SpendingData } from '../utils/SpendingData'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport { formatCurrency } from '../../core/utils/NumberFormatting'\n\ninterface SpendingListProps {\n data: SpendingData\n onSelected: (id: string, isSubcategory?: boolean) => void\n selectedId?: string\n title: string\n}\n\nconst SpendingList: React.FC<SpendingListProps> = ({\n data,\n onSelected,\n selectedId = '',\n title,\n}) => {\n const { spending: spendingCopy } = useGlobalCopyStore()\n const selectedCategory = data.categoryData.find((parent) => parent.guid === selectedId)\n\n return (\n <Stack direction=\"column\" justifyContent=\"center\" maxWidth={400} minWidth={275} width=\"100%\">\n <Text bold={true} id=\"spending-list-title\" sx={{ py: 12 }} variant=\"h3\">\n {`${title} ${spendingCopy.by_category}`}\n </Text>\n\n <Divider aria-hidden=\"true\" />\n\n <List aria-labelledby=\"spending-list-title\">\n {data.categoryData.map((item) => (\n <React.Fragment key={item.guid}>\n <ListItem\n disableGutters={true}\n disablePadding={true}\n sx={{\n borderBottom: 1,\n borderColor: 'divider',\n minHeight: 44,\n }}\n >\n <ListItemButton\n aria-expanded={Boolean(selectedCategory?.guid === item.guid)}\n id={`spending-list-category-${item.guid}`}\n onClick={() => onSelected(item.guid)}\n sx={{ minHeight: 44, px: 8, py: 0 }}\n >\n <Box\n aria-hidden=\"true\"\n borderRadius={4}\n flexShrink={0}\n height={8}\n role=\"presentation\"\n sx={{ backgroundColor: item.color, mr: 8 }}\n width={8}\n />\n <Stack\n alignItems=\"center\"\n direction=\"row\"\n justifyContent=\"space-between\"\n width=\"100%\"\n >\n <Text bold={selectedId === item.guid}>{item.name}</Text>\n <Text bold={selectedId === item.guid} variant=\"body1\">\n {formatCurrency(item.amount, '0,0.00')}\n </Text>\n </Stack>\n </ListItemButton>\n </ListItem>\n\n {item.categoryTotals && item.categoryTotals.length > 0 && (\n <Collapse in={Boolean(selectedCategory?.guid === item.guid)} unmountOnExit={true}>\n <List sx={{ borderBottom: 1, borderColor: 'divider' }}>\n {selectedCategory?.categoryTotals?.map((subItem) => (\n <ListItem\n key={subItem.guid}\n sx={{\n pl: 12,\n py: 0,\n }}\n >\n <ListItemButton\n id={`spending-list-subcategory-${subItem.guid}`}\n onClick={() => onSelected(subItem.guid, true)}\n sx={{ minHeight: 44, px: 8, py: 0 }}\n >\n <Stack direction=\"row\" justifyContent=\"space-between\" width=\"100%\">\n <Text>{subItem.name} </Text>\n <Text>{formatCurrency(subItem.amount, '0,0.00')}</Text>\n </Stack>\n </ListItemButton>\n </ListItem>\n ))}\n </List>\n </Collapse>\n )}\n </React.Fragment>\n ))}\n </List>\n\n <Text bold={true} sx={{ mt: 12, pr: 8, textAlign: 'right' }}>\n {`${spendingCopy.total}: ${formatCurrency(data.totalAmount, '0,0.00')}`}\n </Text>\n </Stack>\n )\n}\n\nexport default observer(SpendingList)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\n\nimport { useCategoryStore, useGlobalCopyStore, useScreenSize } from '../../common'\n\nimport { SpendingData } from '../utils/SpendingData'\nimport SpendingDonut from './SpendingDonut'\nimport SpendingList from './SpendingList'\n\ninterface SpendingChartProps {\n data: SpendingData\n title: string\n onSelected: (id: string, isSubcategory?: boolean) => void\n onViewTransactions: (id: string) => void\n selectedId: string\n}\n\nconst SpendingChart: React.FC<SpendingChartProps> = ({\n data,\n onSelected,\n onViewTransactions,\n selectedId,\n title,\n}) => {\n const { isDesktop, isMobile } = useScreenSize()\n const { dateRangeTotalsLoading } = useCategoryStore()\n const { spending: spendingCopy } = useGlobalCopyStore()\n\n const handleDonutSelected = (id: string) => {\n onSelected(id)\n setTimeout(() => document.getElementById(`spending-list-category-${id}`)?.focus(), 0)\n }\n\n const loadingDonut = (\n <SpendingDonut\n data={{\n categoryData: [],\n donutData: [],\n totalAmount: 0,\n }}\n onSelected={() => {}}\n selectedId={''}\n size={isDesktop ? 400 : 300}\n totalLabel={'Loading ...'}\n variant=\"full\"\n />\n )\n\n return (\n <Stack\n alignItems={isMobile ? 'center' : 'flex-start'}\n direction={isMobile ? 'column' : 'row'}\n gap={{ xs: 16, md: 64, xl: 100 }}\n justifyContent=\"center\"\n pt={50}\n px={8}\n >\n {dateRangeTotalsLoading && loadingDonut}\n {/* Not using a ternary here because it doesn't show the animation */}\n {!dateRangeTotalsLoading && (\n <SpendingDonut\n data={data}\n onSelected={handleDonutSelected}\n onViewTransactions={onViewTransactions}\n selectedId={selectedId}\n size={isDesktop ? 400 : 300}\n totalLabel={spendingCopy.total_amount}\n variant=\"full\"\n />\n )}\n\n <SpendingList data={data} onSelected={onSelected} selectedId={selectedId} title={title} />\n </Stack>\n )\n}\n\nexport default observer(SpendingChart)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\nimport { useTheme } from '@mui/material'\nimport type { Theme } from '@mui/system'\n\nimport { Icon } from '@mxenabled/mxui'\n\nimport {\n Drawer,\n useAppConfig,\n useCategoryStore,\n useGlobalCopyStore,\n useGlobalUiStore,\n useTransactionStore,\n} from '../../common'\nimport { CategoryGuids } from '../../core/constants'\nimport { Transaction } from '../../core'\nimport { exportTransactionsToCSV } from '../../core/utils/TransactionUtils'\n\nimport { TransactionDetails, TransactionList } from '../../transactions'\nimport { getIncomeData, getSpendingData } from '../utils/SpendingData'\nimport SpendingChart from './SpendingChart'\nimport SpendingTabLabel from './SpendingTabLabel'\n\nconst getIncomeColors = (theme: Theme) => {\n return [\n theme.palette.chartMono.chartMono5,\n theme.palette.chartMono.chartMono4,\n theme.palette.chartMono.chartMono3,\n theme.palette.chartMono.chartMono2,\n theme.palette.chartMono.chartMono1,\n theme.palette.chartMono.chartMono6,\n ]\n}\n\nconst Spending = () => {\n const theme = useTheme()\n const { is_mobile_webview } = useAppConfig()\n\n const { clientConfig } = useAppConfig()\n const { categories, dateRangeCategoryTotals } = useCategoryStore()\n\n const {\n goals: goalsCopy,\n spending: spendingCopy,\n transactions: transactionCopy,\n } = useGlobalCopyStore()\n const { displayedDateRange, selectedAccountGuids } = useGlobalUiStore()\n const {\n setFilter,\n sortedTransactions: transactions,\n sortedTransactionsWithSplits,\n tags,\n } = useTransactionStore()\n\n const accountGuids = clientConfig?.master?.deep_link_params?.account_guids\n const view = clientConfig?.master?.deep_link_params?.view\n\n const [selectedId, setSelectedId] = React.useState('')\n const [selectedTab, setSelectedTab] = React.useState(view === 'income' ? 1 : 0)\n const [transactionGuid, setTransactionGuid] = React.useState('')\n const [transactionsOpen, setTransactionsOpen] = React.useState(false)\n\n const spendingData = React.useMemo(\n () => getSpendingData(categories, goalsCopy, theme, dateRangeCategoryTotals),\n [categories, dateRangeCategoryTotals],\n )\n\n const incomeData = React.useMemo(\n () => getIncomeData(categories, dateRangeCategoryTotals, getIncomeColors(theme)),\n [categories, dateRangeCategoryTotals],\n )\n\n const transaction = React.useMemo(\n () => transactions.find((t) => t.guid === transactionGuid),\n [transactionGuid, transactions],\n )\n\n const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => {\n setSelectedTab(newValue)\n setSelectedId('')\n }\n\n const handleSelected = (id: string, isSubcategory: boolean = false) => {\n if (isSubcategory) {\n handleSelectedSubcategory(id)\n } else {\n setSelectedId(selectedId === id || id === '0' ? '' : id)\n }\n }\n\n const handleSelectedSubcategory = (id: string) => {\n const transactionFilter = {\n accounts: accountGuids ? accountGuids : selectedAccountGuids,\n dateRange: displayedDateRange,\n }\n\n setFilter({\n ...transactionFilter,\n custom: (t: Transaction) =>\n selectedId === 'other' ? t.top_level_category_guid === id : t.category_guid === id,\n showSplits: true,\n })\n\n setTransactionsOpen(true)\n }\n\n const handleViewTransactions = (id: string) => {\n const transactionFilter = {\n accounts: accountGuids ? accountGuids : selectedAccountGuids,\n dateRange: displayedDateRange,\n }\n\n if (selectedTab === 0) {\n // Spending\n if (id === 'other') {\n const other = spendingData.categoryData.find((c) => c.guid === 'other')\n setFilter({\n ...transactionFilter,\n custom: (t: Transaction) =>\n Boolean(other?.categoryTotals?.find((ct) => ct.guid === t.top_level_category_guid)),\n })\n } else {\n setFilter({\n ...transactionFilter,\n custom: (t: Transaction) =>\n id\n ? t.top_level_category_guid === id\n : t.top_level_category_guid !== CategoryGuids.INCOME &&\n t.category_guid !== CategoryGuids.INCOME &&\n t.top_level_category_guid !== CategoryGuids.INVESTMENTS &&\n t.top_level_category_guid !== CategoryGuids.TRANSFER,\n showSplits: Boolean(id),\n })\n }\n } else {\n // Income\n setFilter({\n ...transactionFilter,\n custom: (t: Transaction) =>\n id\n ? t.category_guid === id\n : t.category_guid === CategoryGuids.INCOME ||\n t.top_level_category_guid === CategoryGuids.INCOME,\n })\n }\n\n setTransactionsOpen(true)\n }\n\n const handleExportToCsv = () => {\n exportTransactionsToCSV(sortedTransactionsWithSplits, tags)\n }\n\n return (\n <Box>\n <Tabs onChange={handleTabChange} value={selectedTab} variant=\"fullWidth\">\n <Tab\n label={\n <SpendingTabLabel\n amount={spendingData.totalAmount}\n label={spendingCopy.spend_tab_title}\n />\n }\n />\n <Tab\n label={\n <SpendingTabLabel\n amount={incomeData.totalAmount}\n label={spendingCopy.income_tab_title}\n />\n }\n />\n </Tabs>\n {selectedTab === 0 && (\n <SpendingChart\n data={spendingData}\n onSelected={handleSelected}\n onViewTransactions={handleViewTransactions}\n selectedId={selectedId}\n title={spendingCopy.spend_tab_title}\n />\n )}\n {selectedTab === 1 && (\n <SpendingChart\n data={incomeData}\n onSelected={handleSelected}\n onViewTransactions={handleViewTransactions}\n selectedId={selectedId}\n title={spendingCopy.income_tab_title}\n />\n )}\n <Drawer\n ariaLabelClose={spendingCopy.close_drawer_aria}\n isOpen={transactionsOpen}\n onClose={() => setTransactionsOpen(false)}\n title={spendingCopy.transactions_drawer_title}\n >\n <Stack>\n {!is_mobile_webview && transactions.length > 0 && (\n <Stack direction=\"row\" justifyContent=\"right\" mb={-24} mr={8} mt={8} zIndex={1}>\n <Button\n onClick={handleExportToCsv}\n startIcon={<Icon name=\"ios_share\" />}\n variant=\"text\"\n >\n {transactionCopy.export_csv_btn}\n </Button>\n </Stack>\n )}\n <TransactionList onClick={setTransactionGuid} />\n </Stack>\n </Drawer>\n <Drawer\n ariaLabelClose={spendingCopy.close_drawer_aria}\n isOpen={Boolean(transaction)}\n onClose={() => setTransactionGuid('')}\n title={spendingCopy.transaction_details_drawer_title}\n >\n {transaction && <TransactionDetails transaction={transaction} />}\n </Drawer>\n </Box>\n )\n}\n\nexport default observer(Spending)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { endOfMonth } from 'date-fns/endOfMonth'\n\nimport Box from '@mui/material/Box'\n\nimport type { DateRange } from '@mui/x-date-pickers-pro'\n\nimport {\n Loader,\n useAccountStore,\n useGlobalUiStore,\n WidgetContainer,\n useEvent,\n ANALYTICS_EVENTS,\n useGlobalCopyStore,\n useAppConfig,\n useCategoryStore,\n useTransactionStore,\n useWidgetLoadTimer,\n} from '../common'\n\nimport type { WidgetProps } from '../core'\n\nimport Spending from './components/Spending'\nimport { parseISO } from 'date-fns/parseISO'\n\ninterface RSpendingWidgetProps extends WidgetProps {\n onBackClick?: () => void\n}\n\nconst SpendingWidget: React.FC<RSpendingWidgetProps> = ({ onBackClick, onMenuClick, sx = {} }) => {\n const { isAccountDataLoaded, loadAccountData } = useAccountStore()\n const { categoriesLoaded, dateRangeTotalsLoaded, loadCategories, loadDateRangeCategoryTotals } =\n useCategoryStore()\n const { isTransactionDataLoaded, loadTransactionData } = useTransactionStore()\n const { spending: spendingCopy } = useGlobalCopyStore()\n const { displayedDateRange, isInitialized, setDisplayedDate, selectedAccounts } =\n useGlobalUiStore()\n const { onEvent } = useEvent()\n\n const { clientConfig } = useAppConfig()\n\n useWidgetLoadTimer({\n widgetName: 'SpendingWidget',\n isLoaded: dateRangeTotalsLoaded,\n })\n\n React.useEffect(() => {\n const dlp = clientConfig?.master?.deep_link_params\n\n const date_range = dlp?.date_range\n ? ([parseISO(dlp.date_range.from), parseISO(dlp.date_range.to)] as DateRange<Date>)\n : ([startOfMonth(startOfToday()), endOfMonth(startOfToday())] as DateRange<Date>)\n\n const startDate = date_range[0] as Date\n const endDate = date_range[1] as Date\n\n setDisplayedDate(startDate, endDate)\n\n if (!isAccountDataLoaded) {\n loadAccountData().finally()\n }\n if (!categoriesLoaded) {\n loadCategories().finally()\n }\n if (!isTransactionDataLoaded) {\n loadTransactionData().finally()\n }\n\n // Load with the dates we just computed rather than reading from the store,\n // which may still hold a stale range set by a previously visited widget.\n if (isInitialized) {\n loadDateRangeCategoryTotals(selectedAccounts, startDate, endDate).finally()\n }\n\n onEvent(ANALYTICS_EVENTS.SPENDING_VIEW)\n }, [])\n\n React.useEffect(() => {\n if (isInitialized) {\n loadDateRangeCategoryTotals(\n selectedAccounts,\n displayedDateRange.start,\n displayedDateRange.end,\n ).finally()\n }\n }, [displayedDateRange, isInitialized, selectedAccounts])\n\n const handleDateChanged = (range: DateRange<Date>) => {\n setDisplayedDate(range[0] as Date, range[1] as Date)\n }\n\n if (!isInitialized) {\n return <Loader />\n }\n\n return (\n <WidgetContainer\n calendarActions={{ onRangeChanged: handleDateChanged }}\n onAccountsFilterClick={() => onEvent(ANALYTICS_EVENTS.SPENDING_CLICK_FILTER)}\n onBackClick={onBackClick}\n onMenuClick={onMenuClick}\n sx={sx}\n title={spendingCopy.title}\n >\n <Box width=\"100%\">\n <Spending />\n </Box>\n </WidgetContainer>\n )\n}\n\nexport default observer(SpendingWidget)\n"],"names":["SpendingTabLabel","amount","label","variant","jsxs","Stack","jsx","Text","formatCurrency","MiniSpendingChart","theme","useTheme","goalsCopy","spendingCopy","useGlobalCopyStore","categories","dateRangeCategoryTotals","useCategoryStore","incomeColors","React","selectedId","setSelectedId","selectedTab","setSelectedTab","spendingData","getSpendingData","incomeData","getIncomeData","handleTabChange","_event","newValue","handleSelected","id","Box","Tabs","Tab","SpendingDonut","SpendingLegend","MiniSpendingChart$1","observer","SpendingMiniWidget","onPrimaryCtaClick","sx","isAccountDataLoaded","loadAccountData","useAccountStore","dateRangeTotalsLoaded","categoriesLoaded","loadCategories","loadDateRangeCategoryTotals","isInitialized","selectedAccounts","useGlobalUiStore","useWidgetLoadTimer","startOfMonth","endOfMonth","MiniWidgetContainer","Loader","SpendingMiniWidget_default","SpendingList","data","onSelected","title","selectedCategory","parent","Divider","List","item","ListItem","ListItemButton","Collapse","subItem","SpendingList$1","SpendingChart","onViewTransactions","isDesktop","isMobile","useScreenSize","dateRangeTotalsLoading","SpendingChart$1","getIncomeColors","Spending","is_mobile_webview","useAppConfig","clientConfig","transactionCopy","displayedDateRange","selectedAccountGuids","setFilter","transactions","sortedTransactionsWithSplits","tags","useTransactionStore","accountGuids","view","transactionGuid","setTransactionGuid","transactionsOpen","setTransactionsOpen","transaction","t","isSubcategory","handleSelectedSubcategory","handleViewTransactions","transactionFilter","other","c","ct","CategoryGuids","handleExportToCsv","exportTransactionsToCSV","Drawer","Button","Icon","TransactionList","TransactionDetails","Spending$1","SpendingWidget","onBackClick","onMenuClick","isTransactionDataLoaded","loadTransactionData","setDisplayedDate","onEvent","useEvent","dlp","date_range","parseISO","startOfToday","startDate","endDate","ANALYTICS_EVENTS","handleDateChanged","range","WidgetContainer","SpendingWidget_default"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../../src/spending/components/SpendingTabLabel.tsx","../../src/spending/components/MiniSpendingChart.tsx","../../src/spending/SpendingMiniWidget.tsx","../../src/spending/components/SpendingList.tsx","../../src/spending/components/SpendingChart.tsx","../../src/spending/components/Spending.tsx","../../src/spending/SpendingWidget.tsx"],"sourcesContent":["import React from 'react'\n\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@mxenabled/mxui'\nimport { formatCurrency } from '../../core/utils/NumberFormatting'\n\ninterface SpendingTabLabelProps {\n amount: number\n label: string\n variant?: 'mini' | 'full'\n}\n\nconst SpendingTabLabel: React.FC<SpendingTabLabelProps> = ({ amount, label, variant = 'full' }) => {\n return (\n <Stack direction=\"column\">\n <Text bold={true} sx={{ textTransform: 'none' }} variant=\"body1\">\n {label}\n </Text>\n <Text variant=\"caption\">{formatCurrency(amount, variant === 'mini' ? '0,0' : '0,0.00')}</Text>\n </Stack>\n )\n}\n\nexport default SpendingTabLabel\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\nimport { useTheme } from '@mui/material/styles'\n\nimport { useCategoryStore, useGlobalCopyStore } from '../../common'\nimport { getIncomeData, getSpendingData } from '../utils/SpendingData'\n\nimport SpendingTabLabel from './SpendingTabLabel'\nimport SpendingDonut from './SpendingDonut'\nimport SpendingLegend from './SpendingLegend'\n\nconst MiniSpendingChart = () => {\n const theme = useTheme()\n const { goals: goalsCopy, spending: spendingCopy } = useGlobalCopyStore()\n const { categories, dateRangeCategoryTotals } = useCategoryStore()\n\n const incomeColors = React.useMemo(\n () => [\n theme.palette.chartMono.chartMono5,\n theme.palette.chartMono.chartMono4,\n theme.palette.chartMono.chartMono3,\n theme.palette.chartMono.chartMono2,\n theme.palette.chartMono.chartMono1,\n theme.palette.chartMono.chartMono6,\n ],\n [theme],\n ) as string[]\n\n const [selectedId, setSelectedId] = React.useState('')\n const [selectedTab, setSelectedTab] = React.useState(0)\n\n const spendingData = React.useMemo(\n () => getSpendingData(categories, goalsCopy, theme, dateRangeCategoryTotals),\n [categories, dateRangeCategoryTotals],\n )\n\n const incomeData = React.useMemo(\n () => getIncomeData(categories, dateRangeCategoryTotals, incomeColors),\n [categories, dateRangeCategoryTotals, incomeColors],\n )\n\n const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => {\n setSelectedTab(newValue)\n setSelectedId('')\n }\n\n const handleSelected = (id: string) => {\n setSelectedId(selectedId === id ? '' : id)\n }\n\n return (\n <Box width=\"100%\">\n <Tabs\n aria-label={spendingCopy.mini_title}\n onChange={handleTabChange}\n sx={{ touchAction: 'manipulation' }}\n value={selectedTab}\n variant=\"fullWidth\"\n >\n <Tab\n aria-controls=\"spending-tabpanel\"\n id=\"spending-tab\"\n label={\n <SpendingTabLabel\n amount={spendingData.totalAmount}\n label={spendingCopy.spend_tab_title}\n variant=\"mini\"\n />\n }\n tabIndex={selectedTab === 0 ? 0 : -1}\n />\n <Tab\n aria-controls=\"income-tabpanel\"\n id=\"income-tab\"\n label={\n <SpendingTabLabel\n amount={incomeData.totalAmount}\n label={spendingCopy.income_tab_title}\n variant=\"mini\"\n />\n }\n tabIndex={selectedTab === 1 ? 0 : -1}\n />\n </Tabs>\n <Box\n aria-labelledby=\"spending-tab\"\n hidden={selectedTab !== 0}\n id=\"spending-tabpanel\"\n role=\"tabpanel\"\n >\n <Stack direction=\"row\" gap={16} justifyContent={'center'} p={24}>\n <SpendingDonut\n data={spendingData}\n onSelected={handleSelected}\n selectedId={selectedId}\n totalLabel={spendingCopy.total_spending}\n />\n\n <SpendingLegend data={spendingData} onSelected={handleSelected} selectedId={selectedId} />\n </Stack>\n </Box>\n <Box\n aria-labelledby=\"income-tab\"\n hidden={selectedTab !== 1}\n id=\"income-tabpanel\"\n role=\"tabpanel\"\n >\n <Stack direction=\"row\" gap={16} justifyContent={'center'} p={24}>\n <SpendingDonut\n data={incomeData}\n isIncome={true}\n onSelected={handleSelected}\n selectedId={selectedId}\n totalLabel={spendingCopy.total_income}\n />\n\n <SpendingLegend data={incomeData} onSelected={handleSelected} selectedId={selectedId} />\n </Stack>\n </Box>\n </Box>\n )\n}\n\nexport default observer(MiniSpendingChart)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { endOfMonth } from 'date-fns/endOfMonth'\n\nimport {\n Loader,\n MiniWidgetContainer,\n useAccountStore,\n useCategoryStore,\n useGlobalCopyStore,\n useGlobalUiStore,\n useWidgetLoadTimer,\n} from '../common'\nimport { MiniWidgetProps } from '../core'\n\nimport MiniSpendingChart from './components/MiniSpendingChart'\n\nconst SpendingMiniWidget: React.FC<MiniWidgetProps> = ({ onPrimaryCtaClick, sx = {} }) => {\n const { isAccountDataLoaded, loadAccountData } = useAccountStore()\n const { dateRangeTotalsLoaded, categoriesLoaded, loadCategories, loadDateRangeCategoryTotals } =\n useCategoryStore()\n const { spending: spendingCopy } = useGlobalCopyStore()\n const { isInitialized, selectedAccounts } = useGlobalUiStore()\n\n useWidgetLoadTimer({\n widgetName: 'SpendingMiniWidget',\n isLoaded: dateRangeTotalsLoaded,\n })\n\n React.useEffect(() => {\n if (!isAccountDataLoaded) {\n loadAccountData().finally()\n }\n if (!categoriesLoaded) {\n loadCategories().finally()\n }\n }, [])\n\n React.useEffect(() => {\n if (!isInitialized || !isAccountDataLoaded) return\n\n loadDateRangeCategoryTotals(\n selectedAccounts,\n startOfMonth(new Date()),\n endOfMonth(new Date()),\n ).finally()\n }, [isInitialized, isAccountDataLoaded, selectedAccounts])\n\n // Keep spinning until account data and the date-range totals have loaded.\n // Rendering before then would show a misleading $0 while accounts/totals are\n // still in flight. (MEW-3538)\n if (!isInitialized || !isAccountDataLoaded || !dateRangeTotalsLoaded) {\n return <Loader />\n }\n\n return (\n <MiniWidgetContainer\n className=\"mx-exp-spending-miniwidget\"\n onPrimaryCtaClick={onPrimaryCtaClick}\n primaryCtaLabel={spendingCopy.primary_cta}\n primaryCtaLabelAria={spendingCopy.primary_cta_aria}\n sx={{ height: '100%', ...sx }}\n title={spendingCopy.mini_title}\n >\n <MiniSpendingChart />\n </MiniWidgetContainer>\n )\n}\n\nexport default observer(SpendingMiniWidget)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Collapse from '@mui/material/Collapse'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport { useGlobalCopyStore } from '../../common'\nimport { SpendingData } from '../utils/SpendingData'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport { formatCurrency } from '../../core/utils/NumberFormatting'\n\ninterface SpendingListProps {\n data: SpendingData\n onSelected: (id: string, isSubcategory?: boolean) => void\n selectedId?: string\n title: string\n}\n\nconst SpendingList: React.FC<SpendingListProps> = ({\n data,\n onSelected,\n selectedId = '',\n title,\n}) => {\n const { spending: spendingCopy } = useGlobalCopyStore()\n const selectedCategory = data.categoryData.find((parent) => parent.guid === selectedId)\n\n return (\n <Stack direction=\"column\" justifyContent=\"center\" maxWidth={400} minWidth={275} width=\"100%\">\n <Text bold={true} id=\"spending-list-title\" sx={{ py: 12 }} variant=\"h3\">\n {`${title} ${spendingCopy.by_category}`}\n </Text>\n\n <Divider aria-hidden=\"true\" />\n\n <List aria-labelledby=\"spending-list-title\">\n {data.categoryData.map((item) => (\n <React.Fragment key={item.guid}>\n <ListItem\n disableGutters={true}\n disablePadding={true}\n sx={{\n borderBottom: 1,\n borderColor: 'divider',\n minHeight: 44,\n }}\n >\n <ListItemButton\n aria-expanded={Boolean(selectedCategory?.guid === item.guid)}\n id={`spending-list-category-${item.guid}`}\n onClick={() => onSelected(item.guid)}\n sx={{ minHeight: 44, px: 8, py: 0 }}\n >\n <Box\n aria-hidden=\"true\"\n borderRadius={4}\n flexShrink={0}\n height={8}\n role=\"presentation\"\n sx={{ backgroundColor: item.color, mr: 8 }}\n width={8}\n />\n <Stack\n alignItems=\"center\"\n direction=\"row\"\n justifyContent=\"space-between\"\n width=\"100%\"\n >\n <Text bold={selectedId === item.guid}>{item.name}</Text>\n <Text bold={selectedId === item.guid} variant=\"body1\">\n {formatCurrency(item.amount, '0,0.00')}\n </Text>\n </Stack>\n </ListItemButton>\n </ListItem>\n\n {item.categoryTotals && item.categoryTotals.length > 0 && (\n <Collapse in={Boolean(selectedCategory?.guid === item.guid)} unmountOnExit={true}>\n <List sx={{ borderBottom: 1, borderColor: 'divider' }}>\n {selectedCategory?.categoryTotals?.map((subItem) => (\n <ListItem\n key={subItem.guid}\n sx={{\n pl: 12,\n py: 0,\n }}\n >\n <ListItemButton\n id={`spending-list-subcategory-${subItem.guid}`}\n onClick={() => onSelected(subItem.guid, true)}\n sx={{ minHeight: 44, px: 8, py: 0 }}\n >\n <Stack direction=\"row\" justifyContent=\"space-between\" width=\"100%\">\n <Text>{subItem.name} </Text>\n <Text>{formatCurrency(subItem.amount, '0,0.00')}</Text>\n </Stack>\n </ListItemButton>\n </ListItem>\n ))}\n </List>\n </Collapse>\n )}\n </React.Fragment>\n ))}\n </List>\n\n <Text bold={true} sx={{ mt: 12, pr: 8, textAlign: 'right' }}>\n {`${spendingCopy.total}: ${formatCurrency(data.totalAmount, '0,0.00')}`}\n </Text>\n </Stack>\n )\n}\n\nexport default observer(SpendingList)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\n\nimport { useCategoryStore, useGlobalCopyStore, useScreenSize } from '../../common'\n\nimport { SpendingData } from '../utils/SpendingData'\nimport SpendingDonut from './SpendingDonut'\nimport SpendingList from './SpendingList'\n\ninterface SpendingChartProps {\n data: SpendingData\n title: string\n onSelected: (id: string, isSubcategory?: boolean) => void\n onViewTransactions: (id: string) => void\n selectedId: string\n}\n\nconst SpendingChart: React.FC<SpendingChartProps> = ({\n data,\n onSelected,\n onViewTransactions,\n selectedId,\n title,\n}) => {\n const { isDesktop, isMobile } = useScreenSize()\n const { dateRangeTotalsLoading } = useCategoryStore()\n const { spending: spendingCopy } = useGlobalCopyStore()\n\n const handleDonutSelected = (id: string) => {\n onSelected(id)\n setTimeout(() => document.getElementById(`spending-list-category-${id}`)?.focus(), 0)\n }\n\n const loadingDonut = (\n <SpendingDonut\n data={{\n categoryData: [],\n donutData: [],\n totalAmount: 0,\n }}\n onSelected={() => {}}\n selectedId={''}\n size={isDesktop ? 400 : 300}\n totalLabel={'Loading ...'}\n variant=\"full\"\n />\n )\n\n return (\n <Stack\n alignItems={isMobile ? 'center' : 'flex-start'}\n direction={isMobile ? 'column' : 'row'}\n gap={{ xs: 16, md: 64, xl: 100 }}\n justifyContent=\"center\"\n pt={50}\n px={8}\n >\n {dateRangeTotalsLoading && loadingDonut}\n {/* Not using a ternary here because it doesn't show the animation */}\n {!dateRangeTotalsLoading && (\n <SpendingDonut\n data={data}\n onSelected={handleDonutSelected}\n onViewTransactions={onViewTransactions}\n selectedId={selectedId}\n size={isDesktop ? 400 : 300}\n totalLabel={spendingCopy.total_amount}\n variant=\"full\"\n />\n )}\n\n <SpendingList data={data} onSelected={onSelected} selectedId={selectedId} title={title} />\n </Stack>\n )\n}\n\nexport default observer(SpendingChart)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\nimport { useTheme } from '@mui/material'\nimport type { Theme } from '@mui/system'\n\nimport { Icon } from '@mxenabled/mxui'\n\nimport {\n Drawer,\n useAppConfig,\n useCategoryStore,\n useGlobalCopyStore,\n useGlobalUiStore,\n useTransactionStore,\n} from '../../common'\nimport { CategoryGuids } from '../../core/constants'\nimport { Transaction } from '../../core'\nimport { exportTransactionsToCSV } from '../../core/utils/TransactionUtils'\n\nimport { TransactionDetails, TransactionList } from '../../transactions'\nimport { getIncomeData, getSpendingData } from '../utils/SpendingData'\nimport SpendingChart from './SpendingChart'\nimport SpendingTabLabel from './SpendingTabLabel'\n\nconst getIncomeColors = (theme: Theme) => {\n return [\n theme.palette.chartMono.chartMono5,\n theme.palette.chartMono.chartMono4,\n theme.palette.chartMono.chartMono3,\n theme.palette.chartMono.chartMono2,\n theme.palette.chartMono.chartMono1,\n theme.palette.chartMono.chartMono6,\n ]\n}\n\nconst Spending = () => {\n const theme = useTheme()\n const { is_mobile_webview } = useAppConfig()\n\n const { clientConfig } = useAppConfig()\n const { categories, dateRangeCategoryTotals } = useCategoryStore()\n\n const {\n goals: goalsCopy,\n spending: spendingCopy,\n transactions: transactionCopy,\n } = useGlobalCopyStore()\n const { displayedDateRange, selectedAccountGuids } = useGlobalUiStore()\n const {\n setFilter,\n sortedTransactions: transactions,\n sortedTransactionsWithSplits,\n tags,\n } = useTransactionStore()\n\n const accountGuids = clientConfig?.master?.deep_link_params?.account_guids\n const view = clientConfig?.master?.deep_link_params?.view\n\n const [selectedId, setSelectedId] = React.useState('')\n const [selectedTab, setSelectedTab] = React.useState(view === 'income' ? 1 : 0)\n const [transactionGuid, setTransactionGuid] = React.useState('')\n const [transactionsOpen, setTransactionsOpen] = React.useState(false)\n\n const spendingData = React.useMemo(\n () => getSpendingData(categories, goalsCopy, theme, dateRangeCategoryTotals),\n [categories, dateRangeCategoryTotals],\n )\n\n const incomeData = React.useMemo(\n () => getIncomeData(categories, dateRangeCategoryTotals, getIncomeColors(theme)),\n [categories, dateRangeCategoryTotals],\n )\n\n const transaction = React.useMemo(\n () => transactions.find((t) => t.guid === transactionGuid),\n [transactionGuid, transactions],\n )\n\n const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => {\n setSelectedTab(newValue)\n setSelectedId('')\n }\n\n const handleSelected = (id: string, isSubcategory: boolean = false) => {\n if (isSubcategory) {\n handleSelectedSubcategory(id)\n } else {\n setSelectedId(selectedId === id || id === '0' ? '' : id)\n }\n }\n\n const handleSelectedSubcategory = (id: string) => {\n const transactionFilter = {\n accounts: accountGuids ? accountGuids : selectedAccountGuids,\n dateRange: displayedDateRange,\n }\n\n setFilter({\n ...transactionFilter,\n custom: (t: Transaction) =>\n selectedId === 'other' ? t.top_level_category_guid === id : t.category_guid === id,\n showSplits: true,\n })\n\n setTransactionsOpen(true)\n }\n\n const handleViewTransactions = (id: string) => {\n const transactionFilter = {\n accounts: accountGuids ? accountGuids : selectedAccountGuids,\n dateRange: displayedDateRange,\n }\n\n if (selectedTab === 0) {\n // Spending\n if (id === 'other') {\n const other = spendingData.categoryData.find((c) => c.guid === 'other')\n setFilter({\n ...transactionFilter,\n custom: (t: Transaction) =>\n Boolean(other?.categoryTotals?.find((ct) => ct.guid === t.top_level_category_guid)),\n })\n } else {\n setFilter({\n ...transactionFilter,\n custom: (t: Transaction) =>\n id\n ? t.top_level_category_guid === id\n : t.top_level_category_guid !== CategoryGuids.INCOME &&\n t.category_guid !== CategoryGuids.INCOME &&\n t.top_level_category_guid !== CategoryGuids.INVESTMENTS &&\n t.top_level_category_guid !== CategoryGuids.TRANSFER,\n showSplits: Boolean(id),\n })\n }\n } else {\n // Income\n setFilter({\n ...transactionFilter,\n custom: (t: Transaction) =>\n id\n ? t.category_guid === id\n : t.category_guid === CategoryGuids.INCOME ||\n t.top_level_category_guid === CategoryGuids.INCOME,\n })\n }\n\n setTransactionsOpen(true)\n }\n\n const handleExportToCsv = () => {\n exportTransactionsToCSV(sortedTransactionsWithSplits, tags)\n }\n\n return (\n <Box>\n <Tabs onChange={handleTabChange} value={selectedTab} variant=\"fullWidth\">\n <Tab\n label={\n <SpendingTabLabel\n amount={spendingData.totalAmount}\n label={spendingCopy.spend_tab_title}\n />\n }\n />\n <Tab\n label={\n <SpendingTabLabel\n amount={incomeData.totalAmount}\n label={spendingCopy.income_tab_title}\n />\n }\n />\n </Tabs>\n {selectedTab === 0 && (\n <SpendingChart\n data={spendingData}\n onSelected={handleSelected}\n onViewTransactions={handleViewTransactions}\n selectedId={selectedId}\n title={spendingCopy.spend_tab_title}\n />\n )}\n {selectedTab === 1 && (\n <SpendingChart\n data={incomeData}\n onSelected={handleSelected}\n onViewTransactions={handleViewTransactions}\n selectedId={selectedId}\n title={spendingCopy.income_tab_title}\n />\n )}\n <Drawer\n ariaLabelClose={spendingCopy.close_drawer_aria}\n isOpen={transactionsOpen}\n onClose={() => setTransactionsOpen(false)}\n title={spendingCopy.transactions_drawer_title}\n >\n <Stack>\n {!is_mobile_webview && transactions.length > 0 && (\n <Stack direction=\"row\" justifyContent=\"right\" mb={-24} mr={8} mt={8} zIndex={1}>\n <Button\n onClick={handleExportToCsv}\n startIcon={<Icon name=\"ios_share\" />}\n variant=\"text\"\n >\n {transactionCopy.export_csv_btn}\n </Button>\n </Stack>\n )}\n <TransactionList onClick={setTransactionGuid} />\n </Stack>\n </Drawer>\n <Drawer\n ariaLabelClose={spendingCopy.close_drawer_aria}\n isOpen={Boolean(transaction)}\n onClose={() => setTransactionGuid('')}\n title={spendingCopy.transaction_details_drawer_title}\n >\n {transaction && <TransactionDetails transaction={transaction} />}\n </Drawer>\n </Box>\n )\n}\n\nexport default observer(Spending)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { endOfMonth } from 'date-fns/endOfMonth'\n\nimport Box from '@mui/material/Box'\n\nimport type { DateRange } from '@mui/x-date-pickers-pro'\n\nimport {\n Loader,\n useAccountStore,\n useGlobalUiStore,\n WidgetContainer,\n useEvent,\n ANALYTICS_EVENTS,\n useGlobalCopyStore,\n useAppConfig,\n useCategoryStore,\n useTransactionStore,\n useWidgetLoadTimer,\n} from '../common'\n\nimport type { WidgetProps } from '../core'\n\nimport Spending from './components/Spending'\nimport { parseISO } from 'date-fns/parseISO'\n\ninterface RSpendingWidgetProps extends WidgetProps {\n onBackClick?: () => void\n}\n\nconst SpendingWidget: React.FC<RSpendingWidgetProps> = ({ onBackClick, onMenuClick, sx = {} }) => {\n const { isAccountDataLoaded, loadAccountData } = useAccountStore()\n const { categoriesLoaded, dateRangeTotalsLoaded, loadCategories, loadDateRangeCategoryTotals } =\n useCategoryStore()\n const { isTransactionDataLoaded, loadTransactionData } = useTransactionStore()\n const { spending: spendingCopy } = useGlobalCopyStore()\n const { displayedDateRange, isInitialized, setDisplayedDate, selectedAccounts } =\n useGlobalUiStore()\n const { onEvent } = useEvent()\n\n const { clientConfig } = useAppConfig()\n\n useWidgetLoadTimer({\n widgetName: 'SpendingWidget',\n isLoaded: dateRangeTotalsLoaded,\n })\n\n React.useEffect(() => {\n const dlp = clientConfig?.master?.deep_link_params\n\n const date_range = dlp?.date_range\n ? ([parseISO(dlp.date_range.from), parseISO(dlp.date_range.to)] as DateRange<Date>)\n : ([startOfMonth(startOfToday()), endOfMonth(startOfToday())] as DateRange<Date>)\n\n const startDate = date_range[0] as Date\n const endDate = date_range[1] as Date\n\n setDisplayedDate(startDate, endDate)\n\n if (!isAccountDataLoaded) {\n loadAccountData().finally()\n }\n if (!categoriesLoaded) {\n loadCategories().finally()\n }\n if (!isTransactionDataLoaded) {\n loadTransactionData().finally()\n }\n\n // Load with the dates we just computed rather than reading from the store,\n // which may still hold a stale range set by a previously visited widget.\n if (isInitialized && isAccountDataLoaded) {\n loadDateRangeCategoryTotals(selectedAccounts, startDate, endDate).finally()\n }\n\n onEvent(ANALYTICS_EVENTS.SPENDING_VIEW)\n }, [])\n\n React.useEffect(() => {\n if (isInitialized && isAccountDataLoaded) {\n loadDateRangeCategoryTotals(\n selectedAccounts,\n displayedDateRange.start,\n displayedDateRange.end,\n ).finally()\n }\n }, [displayedDateRange, isInitialized, isAccountDataLoaded, selectedAccounts])\n\n const handleDateChanged = (range: DateRange<Date>) => {\n setDisplayedDate(range[0] as Date, range[1] as Date)\n }\n\n if (!isInitialized || !isAccountDataLoaded || !dateRangeTotalsLoaded) {\n return <Loader />\n }\n\n return (\n <WidgetContainer\n calendarActions={{ onRangeChanged: handleDateChanged }}\n onAccountsFilterClick={() => onEvent(ANALYTICS_EVENTS.SPENDING_CLICK_FILTER)}\n onBackClick={onBackClick}\n onMenuClick={onMenuClick}\n sx={sx}\n title={spendingCopy.title}\n >\n <Box width=\"100%\">\n <Spending />\n </Box>\n </WidgetContainer>\n )\n}\n\nexport default observer(SpendingWidget)\n"],"names":["SpendingTabLabel","amount","label","variant","jsxs","Stack","jsx","Text","formatCurrency","MiniSpendingChart","theme","useTheme","goalsCopy","spendingCopy","useGlobalCopyStore","categories","dateRangeCategoryTotals","useCategoryStore","incomeColors","React","selectedId","setSelectedId","selectedTab","setSelectedTab","spendingData","getSpendingData","incomeData","getIncomeData","handleTabChange","_event","newValue","handleSelected","id","Box","Tabs","Tab","SpendingDonut","SpendingLegend","MiniSpendingChart$1","observer","SpendingMiniWidget","onPrimaryCtaClick","sx","isAccountDataLoaded","loadAccountData","useAccountStore","dateRangeTotalsLoaded","categoriesLoaded","loadCategories","loadDateRangeCategoryTotals","isInitialized","selectedAccounts","useGlobalUiStore","useWidgetLoadTimer","startOfMonth","endOfMonth","Loader","MiniWidgetContainer","SpendingMiniWidget_default","SpendingList","data","onSelected","title","selectedCategory","parent","Divider","List","item","ListItem","ListItemButton","Collapse","subItem","SpendingList$1","SpendingChart","onViewTransactions","isDesktop","isMobile","useScreenSize","dateRangeTotalsLoading","SpendingChart$1","getIncomeColors","Spending","is_mobile_webview","useAppConfig","clientConfig","transactionCopy","displayedDateRange","selectedAccountGuids","setFilter","transactions","sortedTransactionsWithSplits","tags","useTransactionStore","accountGuids","view","transactionGuid","setTransactionGuid","transactionsOpen","setTransactionsOpen","transaction","t","isSubcategory","handleSelectedSubcategory","handleViewTransactions","transactionFilter","other","c","ct","CategoryGuids","handleExportToCsv","exportTransactionsToCSV","Drawer","Button","Icon","TransactionList","TransactionDetails","Spending$1","SpendingWidget","onBackClick","onMenuClick","isTransactionDataLoaded","loadTransactionData","setDisplayedDate","onEvent","useEvent","dlp","date_range","parseISO","startOfToday","startDate","endDate","ANALYTICS_EVENTS","handleDateChanged","range","WidgetContainer","SpendingWidget_default"],"mappings":"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"}
@@ -1,14 +1,14 @@
1
- import { C as Be, D as He, M as Pe, a as We, T as $e } from "../TransactionDetails-CDZNsKv7.mjs";
2
- import { B as xa, b as Aa } from "../TransactionDetails-CDZNsKv7.mjs";
3
- import { u as B, T as Ge } from "../EmbeddedCard-BwfkCsUN.mjs";
4
- import { a as Sa } from "../EmbeddedCard-BwfkCsUN.mjs";
5
- import { E as va } from "../ExportCsvAction-B1257a3M.mjs";
1
+ import { C as Be, D as He, M as Pe, a as We, T as $e } from "../TransactionDetails-DT-MQqOB.mjs";
2
+ import { B as xa, b as Aa } from "../TransactionDetails-DT-MQqOB.mjs";
3
+ import { u as B, T as Ge } from "../EmbeddedCard-DCOQnTz-.mjs";
4
+ import { a as Sa } from "../EmbeddedCard-DCOQnTz-.mjs";
5
+ import { E as va } from "../ExportCsvAction-C-IisDcv.mjs";
6
6
  import { jsxs as m, jsx as e } from "react/jsx-runtime";
7
7
  import u from "react";
8
8
  import { observer as D } from "mobx-react-lite";
9
9
  import Ve from "@mui/material/Paper";
10
10
  import { DataGridPro as Fe } from "@mui/x-data-grid-pro";
11
- import { g as H, u as v, f as ne, a as K, c as oe, l as Ue, i as Ke, D as ze } from "../hooks-DWOrMnfZ.mjs";
11
+ import { g as H, u as v, f as ne, a as K, c as oe, l as Ue, i as Ke, C as ze } from "../hooks-97sNJ_lf.mjs";
12
12
  import { L as z } from "../Loader-CxeBwuPG.mjs";
13
13
  import { Text as y, Icon as R, MerchantLogo as qe, TextField as Z, P as Ye } from "@mxenabled/mxui";
14
14
  import w from "@mui/material/Stack";
@@ -24,20 +24,20 @@ import { getUnixTime as tt } from "date-fns/getUnixTime";
24
24
  import { startOfMonth as at } from "date-fns/startOfMonth";
25
25
  import { startOfToday as F } from "date-fns/startOfToday";
26
26
  import { b as U } from "../Localization-DnoVyBNK.mjs";
27
- import { C as nt } from "../ConnectDrawer-BQy4YYuc.mjs";
27
+ import { C as nt } from "../ConnectDrawer-CW4LA3H3.mjs";
28
28
  import ot from "@mui/material/Divider";
29
29
  import rt from "@mui/material/MenuItem";
30
30
  import it from "@mui/material/RadioGroup";
31
31
  import { ExpandMore as st } from "@mxenabled/mx-icons";
32
- import { C as ct } from "../CurrencyInput-CABYmqBh.mjs";
32
+ import { C as ct } from "../CurrencyInput-DaGEQaLW.mjs";
33
33
  import { S as ee } from "../SelectionBox-B4xELRgp.mjs";
34
34
  import { D as se } from "../Dialog-Bvd2n8hz.mjs";
35
- import { b as lt, u as dt } from "../CategorySelectorDrawer-k8AZYC8I.mjs";
35
+ import { b as lt, u as dt } from "../CategorySelectorDrawer-NJsFsKP1.mjs";
36
36
  import { u as ut } from "../useAriaLive-MkYebyUR.mjs";
37
37
  import { S as mt } from "../SkeletonLoader-BaNboJjD.mjs";
38
38
  import { u as _t } from "../useScreenSize-mWpmnh5w.mjs";
39
- import { u as pt } from "../useWidgetLoadTimer-C0Mr0eRf.mjs";
40
- import { W as gt } from "../WidgetContainer-5O6N88mr.mjs";
39
+ import { u as pt } from "../useWidgetLoadTimer-B0tB-yzL.mjs";
40
+ import { W as gt } from "../WidgetContainer-CjdCY4sj.mjs";
41
41
  import { S as ht } from "../SearchBox-Cpgu_gdO.mjs";
42
42
  import { D as te } from "../Drawer-DsnW2o0v.mjs";
43
43
  const ft = (t) => /* @__PURE__ */ m(y, { tabIndex: t.tabIndex, variant: "body2", children: [
@@ -18,7 +18,7 @@ import ot from "@mui/material/CardContent";
18
18
  import Ne from "@mui/material/Divider";
19
19
  import Fe from "@mui/material/Grid";
20
20
  import { b as nt } from "../Localization-DnoVyBNK.mjs";
21
- import { u as R, l as q, f as $, a as fe, g as we, c as De, C as ye, E as st, e as Be, i as rt } from "../hooks-DWOrMnfZ.mjs";
21
+ import { u as R, l as q, f as $, a as fe, g as we, c as De, B as ye, D as st, e as Be, i as rt } from "../hooks-97sNJ_lf.mjs";
22
22
  import { C as xe } from "../CurrencyText-CCbE6MmF.mjs";
23
23
  import { a as Re, C as $e, b as Nt } from "../Category-DEKZGLYe.mjs";
24
24
  import { f as X, D as G } from "../DateFormats-HudZ3Bjs.mjs";
@@ -29,22 +29,22 @@ import Ft from "@mui/material/ToggleButton";
29
29
  import $t from "@mui/material/ToggleButtonGroup";
30
30
  import { parseISO as lt } from "date-fns/parseISO";
31
31
  import { H as ke } from "../HeaderCell-P8w6CmfO.mjs";
32
- import { T as W, a as Kt } from "../ViewMoreMicroCard-CxGhzbRP.mjs";
32
+ import { T as W, a as Kt } from "../ViewMoreMicroCard-fnwE0hqd.mjs";
33
33
  import { useGridApiContext as Yt, useGridRootProps as jt, DataGridPro as Ut } from "@mui/x-data-grid-pro";
34
34
  import Xt from "@mui/material/Badge";
35
35
  import Zt from "@mui/material/IconButton";
36
36
  import { A as w } from "../Analytics-D-jdcL72.mjs";
37
- import { T as ct } from "../EmbeddedCard-BwfkCsUN.mjs";
38
- import { T as dt } from "../TransactionDetails-CDZNsKv7.mjs";
37
+ import { T as ct } from "../EmbeddedCard-DCOQnTz-.mjs";
38
+ import { T as dt } from "../TransactionDetails-DT-MQqOB.mjs";
39
39
  import { D as Pe } from "../Drawer-DsnW2o0v.mjs";
40
- import { u as Ie } from "../useWidgetLoadTimer-C0Mr0eRf.mjs";
40
+ import { u as Ie } from "../useWidgetLoadTimer-B0tB-yzL.mjs";
41
41
  import { L as Le } from "../Loader-CxeBwuPG.mjs";
42
- import { W as ut } from "../WidgetContainer-5O6N88mr.mjs";
43
- import { L as Ve } from "../LineChart-BxEIZHht.mjs";
44
- import { M as Qt } from "../MiniWidgetContainer-CIswJui8.mjs";
42
+ import { W as ut } from "../WidgetContainer-CjdCY4sj.mjs";
43
+ import { L as Ve } from "../LineChart-CUfiH86G.mjs";
44
+ import { M as Qt } from "../MiniWidgetContainer-Bmv_WeUd.mjs";
45
45
  import { subMonths as qt } from "date-fns";
46
46
  import { TrendingUp as Jt, TrendingDown as eo, MultilineChart as to, ExpandLess as oo, ExpandMore as no, ChevronRight as so, ArrowBack as ro } from "@mxenabled/mx-icons";
47
- import { M as ao } from "../MicroWidgetContainer-IUZQlml1.mjs";
47
+ import { M as ao } from "../MicroWidgetContainer-B2NnKBgW.mjs";
48
48
  import io from "@mui/material/Collapse";
49
49
  import We from "@mui/material/List";
50
50
  import mt from "@mui/material/ListItem";
@@ -55,10 +55,10 @@ import { g as Oe } from "../TransactionUtils-BphBJBbU.mjs";
55
55
  import { L as uo } from "../ListItemRow-kH1rn8Xu.mjs";
56
56
  import { Stack as mo } from "@mui/material";
57
57
  import ho from "@mui/material/ListItemAvatar";
58
- import { E as go } from "../ExportCsvAction-B1257a3M.mjs";
59
- import { u as po } from "../useInsightsEnabled-B_UpjpE6.mjs";
58
+ import { E as go } from "../ExportCsvAction-C-IisDcv.mjs";
59
+ import { u as po } from "../useInsightsEnabled-D5Sdm0TJ.mjs";
60
60
  import { E as fo } from "../EmptyState-CJUDc3kD.mjs";
61
- import { C as yo } from "../ConnectDrawer-BQy4YYuc.mjs";
61
+ import { C as yo } from "../ConnectDrawer-CW4LA3H3.mjs";
62
62
  const gt = ({ categoryGuid: t, topLevelCategoryGuid: n }) => {
63
63
  const { categories: s } = R(), { getCategoryName: o } = q(), r = o(t);
64
64
  return /* @__PURE__ */ C(S, { alignItems: "center", direction: "column", gap: "8", justifyContent: "center", mb: 4, children: [
@@ -1,5 +1,5 @@
1
1
  import t from "react";
2
- import { i } from "./hooks-DWOrMnfZ.mjs";
2
+ import { i } from "./hooks-97sNJ_lf.mjs";
3
3
  function o(e, n) {
4
4
  if (n?.allowNickname === !0) {
5
5
  const m = e.nickname?.trim();
@@ -21,4 +21,4 @@ export {
21
21
  o as g,
22
22
  f as u
23
23
  };
24
- //# sourceMappingURL=useAccountDisplayName-DHXXCFYZ.mjs.map
24
+ //# sourceMappingURL=useAccountDisplayName-BsiXA0qf.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAccountDisplayName-DHXXCFYZ.mjs","sources":["../src/common/utils/AccountDisplayName.ts","../src/common/hooks/useAccountDisplayName.tsx"],"sourcesContent":["import type { Account } from '../../core/types/Account'\n\nexport interface AccountDisplayNameOptions {\n allowNickname?: boolean\n}\n\nexport function getAccountDisplayName(\n account: Account,\n options?: AccountDisplayNameOptions,\n): string {\n if (options?.allowNickname === true) {\n const nickName = account.nickname?.trim()\n if (nickName) return nickName\n }\n\n const name = account.name?.trim()\n if (name) return name\n\n const feedName = account.feed_name?.trim()\n return feedName || ''\n}\n\nexport default getAccountDisplayName\n","import React from 'react'\nimport { useAppConfig } from '../'\nimport type { Account } from '../../core'\nimport getAccountDisplayName from '../utils/AccountDisplayName'\n\nexport const useAccountDisplayName = (account: Account) => {\n const { config } = useAppConfig()\n return React.useMemo(\n () =>\n getAccountDisplayName(account, {\n allowNickname: config?.show_account_nicknames_in_master,\n }),\n [account, config?.show_account_nicknames_in_master],\n )\n}\n\nexport default useAccountDisplayName\n"],"names":["getAccountDisplayName","account","options","nickName","name","useAccountDisplayName","config","useAppConfig","React"],"mappings":";;AAMO,SAASA,EACdC,GACAC,GACQ;AACR,MAAIA,GAAS,kBAAkB,IAAM;AACnC,UAAMC,IAAWF,EAAQ,UAAU,KAAA;AACnC,QAAIE,EAAU,QAAOA;AAAA,EACvB;AAEA,QAAMC,IAAOH,EAAQ,MAAM,KAAA;AAC3B,SAAIG,KAEaH,EAAQ,WAAW,KAAA,KACjB;AACrB;ACfO,MAAMI,IAAwB,CAACJ,MAAqB;AACzD,QAAM,EAAE,QAAAK,EAAA,IAAWC,EAAA;AACnB,SAAOC,EAAM;AAAA,IACX,MACER,EAAsBC,GAAS;AAAA,MAC7B,eAAeK,GAAQ;AAAA,IAAA,CACxB;AAAA,IACH,CAACL,GAASK,GAAQ,gCAAgC;AAAA,EAAA;AAEtD;"}
1
+ {"version":3,"file":"useAccountDisplayName-BsiXA0qf.mjs","sources":["../src/common/utils/AccountDisplayName.ts","../src/common/hooks/useAccountDisplayName.tsx"],"sourcesContent":["import type { Account } from '../../core/types/Account'\n\nexport interface AccountDisplayNameOptions {\n allowNickname?: boolean\n}\n\nexport function getAccountDisplayName(\n account: Account,\n options?: AccountDisplayNameOptions,\n): string {\n if (options?.allowNickname === true) {\n const nickName = account.nickname?.trim()\n if (nickName) return nickName\n }\n\n const name = account.name?.trim()\n if (name) return name\n\n const feedName = account.feed_name?.trim()\n return feedName || ''\n}\n\nexport default getAccountDisplayName\n","import React from 'react'\nimport { useAppConfig } from '../'\nimport type { Account } from '../../core'\nimport getAccountDisplayName from '../utils/AccountDisplayName'\n\nexport const useAccountDisplayName = (account: Account) => {\n const { config } = useAppConfig()\n return React.useMemo(\n () =>\n getAccountDisplayName(account, {\n allowNickname: config?.show_account_nicknames_in_master,\n }),\n [account, config?.show_account_nicknames_in_master],\n )\n}\n\nexport default useAccountDisplayName\n"],"names":["getAccountDisplayName","account","options","nickName","name","useAccountDisplayName","config","useAppConfig","React"],"mappings":";;AAMO,SAASA,EACdC,GACAC,GACQ;AACR,MAAIA,GAAS,kBAAkB,IAAM;AACnC,UAAMC,IAAWF,EAAQ,UAAU,KAAA;AACnC,QAAIE,EAAU,QAAOA;AAAA,EACvB;AAEA,QAAMC,IAAOH,EAAQ,MAAM,KAAA;AAC3B,SAAIG,KAEaH,EAAQ,WAAW,KAAA,KACjB;AACrB;ACfO,MAAMI,IAAwB,CAACJ,MAAqB;AACzD,QAAM,EAAE,QAAAK,EAAA,IAAWC,EAAA;AACnB,SAAOC,EAAM;AAAA,IACX,MACER,EAAsBC,GAAS;AAAA,MAC7B,eAAeK,GAAQ;AAAA,IAAA,CACxB;AAAA,IACH,CAACL,GAASK,GAAQ,gCAAgC;AAAA,EAAA;AAEtD;"}
@@ -1,5 +1,5 @@
1
1
  import { useState as n, useEffect as a } from "react";
2
- import { e as o } from "./hooks-DWOrMnfZ.mjs";
2
+ import { e as o } from "./hooks-97sNJ_lf.mjs";
3
3
  const f = () => {
4
4
  const { isInitialized: e, appDataStore: t } = o(), [s, i] = n(!1);
5
5
  return a(() => {
@@ -9,4 +9,4 @@ const f = () => {
9
9
  export {
10
10
  f as u
11
11
  };
12
- //# sourceMappingURL=useInsightsEnabled-B_UpjpE6.mjs.map
12
+ //# sourceMappingURL=useInsightsEnabled-D5Sdm0TJ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useInsightsEnabled-B_UpjpE6.mjs","sources":["../src/common/hooks/useInsightsEnabled.tsx"],"sourcesContent":["import { useState, useEffect } from 'react'\nimport { useGlobalStore } from '../context'\n\nexport const useInsightsEnabled = () => {\n const { isInitialized, appDataStore } = useGlobalStore()\n const [insightsEnabled, setInsightsEnabled] = useState(false)\n\n useEffect(() => {\n if (isInitialized && appDataStore.clientInsightProfile?.is_enabled) {\n setInsightsEnabled(true)\n }\n }, [isInitialized, appDataStore.clientInsightProfile])\n\n return insightsEnabled\n}\n"],"names":["useInsightsEnabled","isInitialized","appDataStore","useGlobalStore","insightsEnabled","setInsightsEnabled","useState","useEffect"],"mappings":";;AAGO,MAAMA,IAAqB,MAAM;AACtC,QAAM,EAAE,eAAAC,GAAe,cAAAC,EAAA,IAAiBC,EAAA,GAClC,CAACC,GAAiBC,CAAkB,IAAIC,EAAS,EAAK;AAE5D,SAAAC,EAAU,MAAM;AACd,IAAIN,KAAiBC,EAAa,sBAAsB,cACtDG,EAAmB,EAAI;AAAA,EAE3B,GAAG,CAACJ,GAAeC,EAAa,oBAAoB,CAAC,GAE9CE;AACT;"}
1
+ {"version":3,"file":"useInsightsEnabled-D5Sdm0TJ.mjs","sources":["../src/common/hooks/useInsightsEnabled.tsx"],"sourcesContent":["import { useState, useEffect } from 'react'\nimport { useGlobalStore } from '../context'\n\nexport const useInsightsEnabled = () => {\n const { isInitialized, appDataStore } = useGlobalStore()\n const [insightsEnabled, setInsightsEnabled] = useState(false)\n\n useEffect(() => {\n if (isInitialized && appDataStore.clientInsightProfile?.is_enabled) {\n setInsightsEnabled(true)\n }\n }, [isInitialized, appDataStore.clientInsightProfile])\n\n return insightsEnabled\n}\n"],"names":["useInsightsEnabled","isInitialized","appDataStore","useGlobalStore","insightsEnabled","setInsightsEnabled","useState","useEffect"],"mappings":";;AAGO,MAAMA,IAAqB,MAAM;AACtC,QAAM,EAAE,eAAAC,GAAe,cAAAC,EAAA,IAAiBC,EAAA,GAClC,CAACC,GAAiBC,CAAkB,IAAIC,EAAS,EAAK;AAE5D,SAAAC,EAAU,MAAM;AACd,IAAIN,KAAiBC,EAAa,sBAAsB,cACtDG,EAAmB,EAAI;AAAA,EAE3B,GAAG,CAACJ,GAAeC,EAAa,oBAAoB,CAAC,GAE9CE;AACT;"}
@@ -1,5 +1,5 @@
1
1
  import { useRef as r, useEffect as c } from "react";
2
- import { f as l } from "./hooks-DWOrMnfZ.mjs";
2
+ import { f as l } from "./hooks-97sNJ_lf.mjs";
3
3
  let n = !0;
4
4
  const d = ({ widgetName: i, isLoaded: u = !0 }) => {
5
5
  const { onEvent: o } = l(), t = r(null), s = r(!1), e = r(!1);
@@ -17,4 +17,4 @@ const d = ({ widgetName: i, isLoaded: u = !0 }) => {
17
17
  export {
18
18
  d as u
19
19
  };
20
- //# sourceMappingURL=useWidgetLoadTimer-C0Mr0eRf.mjs.map
20
+ //# sourceMappingURL=useWidgetLoadTimer-B0tB-yzL.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useWidgetLoadTimer-C0Mr0eRf.mjs","sources":["../src/common/hooks/useWidgetLoadTimer.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react'\nimport { useEvent } from '../context'\n\n// Module-level to track if it's the initial page navigation for the app\nlet isInitialNavigation = true\n\ninterface UseWidgetLoadTimerOptions {\n widgetName: string\n isLoaded?: boolean\n}\n\nexport const useWidgetLoadTimer = ({ widgetName, isLoaded = true }: UseWidgetLoadTimerOptions) => {\n const { onEvent } = useEvent()\n const startTime = useRef<number | null>(null)\n const hasLoaded = useRef(false)\n const isInitialLoad = useRef<boolean>(false)\n\n if (startTime.current === null) {\n isInitialLoad.current = isInitialNavigation\n startTime.current = isInitialNavigation ? performance.timeOrigin : Date.now()\n }\n\n useEffect(() => {\n if (isLoaded && !hasLoaded.current && startTime.current !== null) {\n const loadTimeMs = Date.now() - startTime.current\n\n onEvent('WidgetLoad', {\n widgetName,\n loadTimeMs,\n isInitialLoad: isInitialLoad.current,\n })\n\n hasLoaded.current = true\n startTime.current = null\n\n // Mark initial navigation complete AFTER first widget reports\n // This ensures all widgets on initial page/dashboard are isInitialLoad\n if (isInitialLoad.current) {\n isInitialNavigation = false\n }\n }\n }, [isLoaded, widgetName, onEvent])\n}\n"],"names":["isInitialNavigation","useWidgetLoadTimer","widgetName","isLoaded","onEvent","useEvent","startTime","useRef","hasLoaded","isInitialLoad","useEffect","loadTimeMs"],"mappings":";;AAIA,IAAIA,IAAsB;AAOnB,MAAMC,IAAqB,CAAC,EAAE,YAAAC,GAAY,UAAAC,IAAW,SAAsC;AAChG,QAAM,EAAE,SAAAC,EAAA,IAAYC,EAAA,GACdC,IAAYC,EAAsB,IAAI,GACtCC,IAAYD,EAAO,EAAK,GACxBE,IAAgBF,EAAgB,EAAK;AAE3C,EAAID,EAAU,YAAY,SACxBG,EAAc,UAAUT,GACxBM,EAAU,UAAUN,IAAsB,YAAY,aAAa,KAAK,IAAA,IAG1EU,EAAU,MAAM;AACd,QAAIP,KAAY,CAACK,EAAU,WAAWF,EAAU,YAAY,MAAM;AAChE,YAAMK,IAAa,KAAK,IAAA,IAAQL,EAAU;AAE1C,MAAAF,EAAQ,cAAc;AAAA,QACpB,YAAAF;AAAA,QACA,YAAAS;AAAA,QACA,eAAeF,EAAc;AAAA,MAAA,CAC9B,GAEDD,EAAU,UAAU,IACpBF,EAAU,UAAU,MAIhBG,EAAc,YAChBT,IAAsB;AAAA,IAE1B;AAAA,EACF,GAAG,CAACG,GAAUD,GAAYE,CAAO,CAAC;AACpC;"}
1
+ {"version":3,"file":"useWidgetLoadTimer-B0tB-yzL.mjs","sources":["../src/common/hooks/useWidgetLoadTimer.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react'\nimport { useEvent } from '../context'\n\n// Module-level to track if it's the initial page navigation for the app\nlet isInitialNavigation = true\n\ninterface UseWidgetLoadTimerOptions {\n widgetName: string\n isLoaded?: boolean\n}\n\nexport const useWidgetLoadTimer = ({ widgetName, isLoaded = true }: UseWidgetLoadTimerOptions) => {\n const { onEvent } = useEvent()\n const startTime = useRef<number | null>(null)\n const hasLoaded = useRef(false)\n const isInitialLoad = useRef<boolean>(false)\n\n if (startTime.current === null) {\n isInitialLoad.current = isInitialNavigation\n startTime.current = isInitialNavigation ? performance.timeOrigin : Date.now()\n }\n\n useEffect(() => {\n if (isLoaded && !hasLoaded.current && startTime.current !== null) {\n const loadTimeMs = Date.now() - startTime.current\n\n onEvent('WidgetLoad', {\n widgetName,\n loadTimeMs,\n isInitialLoad: isInitialLoad.current,\n })\n\n hasLoaded.current = true\n startTime.current = null\n\n // Mark initial navigation complete AFTER first widget reports\n // This ensures all widgets on initial page/dashboard are isInitialLoad\n if (isInitialLoad.current) {\n isInitialNavigation = false\n }\n }\n }, [isLoaded, widgetName, onEvent])\n}\n"],"names":["isInitialNavigation","useWidgetLoadTimer","widgetName","isLoaded","onEvent","useEvent","startTime","useRef","hasLoaded","isInitialLoad","useEffect","loadTimeMs"],"mappings":";;AAIA,IAAIA,IAAsB;AAOnB,MAAMC,IAAqB,CAAC,EAAE,YAAAC,GAAY,UAAAC,IAAW,SAAsC;AAChG,QAAM,EAAE,SAAAC,EAAA,IAAYC,EAAA,GACdC,IAAYC,EAAsB,IAAI,GACtCC,IAAYD,EAAO,EAAK,GACxBE,IAAgBF,EAAgB,EAAK;AAE3C,EAAID,EAAU,YAAY,SACxBG,EAAc,UAAUT,GACxBM,EAAU,UAAUN,IAAsB,YAAY,aAAa,KAAK,IAAA,IAG1EU,EAAU,MAAM;AACd,QAAIP,KAAY,CAACK,EAAU,WAAWF,EAAU,YAAY,MAAM;AAChE,YAAMK,IAAa,KAAK,IAAA,IAAQL,EAAU;AAE1C,MAAAF,EAAQ,cAAc;AAAA,QACpB,YAAAF;AAAA,QACA,YAAAS;AAAA,QACA,eAAeF,EAAc;AAAA,MAAA,CAC9B,GAEDD,EAAU,UAAU,IACpBF,EAAU,UAAU,MAIhBG,EAAc,YAChBT,IAAsB;AAAA,IAE1B;AAAA,EACF,GAAG,CAACG,GAAUD,GAAYE,CAAO,CAAC;AACpC;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mx-cartographer/experiences",
3
- "version": "9.1.4-alpha.al6",
3
+ "version": "9.1.4",
4
4
  "description": "Library containing experience widgets",
5
5
  "author": "MX",
6
6
  "license": "MIT",
@@ -1,27 +0,0 @@
1
- import { jsx as o } from "react/jsx-runtime";
2
- import e from "react";
3
- import { H3 as n } from "@mxenabled/mxui";
4
- const s = {
5
- text: "Oops! Something went wrong."
6
- };
7
- class m extends e.Component {
8
- state = {
9
- hasError: !1
10
- };
11
- componentDidCatch(r, t) {
12
- console.error("Uncaught error:", r, t), this.props.onCaptureException?.(r, {
13
- component: "ErrorBoundary",
14
- componentStack: t.componentStack ?? ""
15
- });
16
- }
17
- static getDerivedStateFromError() {
18
- return { hasError: !0 };
19
- }
20
- render() {
21
- return this.state.hasError ? /* @__PURE__ */ o(n, { sx: { pt: 24 }, children: s.text }) : this.props.children;
22
- }
23
- }
24
- export {
25
- m as E
26
- };
27
- //# sourceMappingURL=ErrorBoundary-C7BlHx04.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ErrorBoundary-C7BlHx04.mjs","sources":["../src/common/components/ErrorBoundary.tsx"],"sourcesContent":["import React from 'react'\n\nimport { H3 } from '@mxenabled/mxui'\n\nimport type { GlobalCaptureException } from '../../core'\n\nexport interface ErrorProps {\n children?: React.ReactNode\n onCaptureException?: GlobalCaptureException\n}\n\nexport interface ErrorState {\n hasError: boolean\n}\n\nconst copy = {\n text: 'Oops! Something went wrong.',\n}\n\nclass ErrorBoundary extends React.Component<ErrorProps, ErrorState> {\n state: ErrorState = {\n hasError: false,\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error('Uncaught error:', error, errorInfo)\n this.props.onCaptureException?.(error, {\n component: 'ErrorBoundary',\n componentStack: errorInfo.componentStack ?? '',\n })\n }\n\n static getDerivedStateFromError(): ErrorState {\n return { hasError: true }\n }\n\n render() {\n if (this.state.hasError) return <H3 sx={{ pt: 24 }}>{copy.text}</H3>\n\n return this.props.children\n }\n}\n\nexport default ErrorBoundary\n"],"names":["copy","ErrorBoundary","React","error","errorInfo","jsx","H3"],"mappings":";;;AAeA,MAAMA,IAAO;AAAA,EACX,MAAM;AACR;AAEA,MAAMC,UAAsBC,EAAM,UAAkC;AAAA,EAClE,QAAoB;AAAA,IAClB,UAAU;AAAA,EAAA;AAAA,EAGZ,kBAAkBC,GAAcC,GAA4B;AAC1D,YAAQ,MAAM,mBAAmBD,GAAOC,CAAS,GACjD,KAAK,MAAM,qBAAqBD,GAAO;AAAA,MACrC,WAAW;AAAA,MACX,gBAAgBC,EAAU,kBAAkB;AAAA,IAAA,CAC7C;AAAA,EACH;AAAA,EAEA,OAAO,2BAAuC;AAC5C,WAAO,EAAE,UAAU,GAAA;AAAA,EACrB;AAAA,EAEA,SAAS;AACP,WAAI,KAAK,MAAM,WAAiB,gBAAAC,EAACC,GAAA,EAAG,IAAI,EAAE,IAAI,GAAA,GAAO,UAAAN,EAAK,KAAA,CAAK,IAExD,KAAK,MAAM;AAAA,EACpB;AACF;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"GlobalCopyApi-DoJLovk7.mjs","sources":["../src/core/utils/Fetch.ts","../src/core/api/AnalyticsApi.ts","../src/core/api/BeatApi.ts","../src/core/api/GlobalCopyApi.ts"],"sourcesContent":["import { type GlobalErrorHandler } from '../types'\nimport { getLocale } from './Localization'\n\nexport class Fetch {\n endpoint = '/'\n headers: Record<string, string>\n onError?: GlobalErrorHandler\n\n constructor(\n endpoint: string,\n token: string,\n headers?: Record<string, string>,\n onError?: GlobalErrorHandler,\n ) {\n this.endpoint = endpoint\n const defaultHeaders = {\n Accept: 'application/json',\n 'Accept-Language': getLocale(),\n 'Content-Type': 'application/json',\n 'MD-Session-Token': token,\n }\n this.headers = headers || defaultHeaders\n this.onError = onError\n }\n\n get = async (url: string) => {\n const options = {\n method: 'GET',\n headers: this.headers,\n }\n\n return fetch(`${this.endpoint}${url}`, options)\n .then((response) => {\n if (!response.ok) {\n throw new Error(`ApiGetRequestError: ${response.status} ${response.statusText}`)\n }\n return response.text()\n })\n .then((text) => (text.length ? JSON.parse(text) : {}))\n .then((data) => data)\n .catch((err) => {\n this.onError?.(err, undefined, 'ApiGetRequestError')\n throw err\n })\n }\n\n post = async (url: string, data?: any) => {\n const body = data ? JSON.stringify(data) : undefined\n const options = {\n method: 'POST',\n headers: this.headers,\n body,\n }\n\n return fetch(`${this.endpoint}${url}`, options)\n .then((response) => {\n if (!response.ok) {\n throw new Error(`ApiPostRequestError: ${response.status} ${response.statusText}`)\n }\n\n return response.text()\n })\n .then((text) => (text.length ? JSON.parse(text) : {}))\n .then((data) => data)\n }\n\n put = async (url: string, data: any) => {\n const body = JSON.stringify(data)\n const options = {\n method: 'PUT',\n headers: this.headers,\n body,\n }\n\n return fetch(`${this.endpoint}${url}`, options)\n .then((response) => {\n if (!response.ok) {\n throw new Error(`ApiPutRequestError: ${response.status} ${response.statusText}`)\n }\n return response.text()\n })\n .then((text) => (text.length ? JSON.parse(text) : {}))\n .then((data) => data)\n .catch((err) => {\n if (window?.app?.config?.type === 'pulse') {\n this.onError?.(err.message)\n }\n throw err\n })\n }\n\n delete = async (url: string) => {\n const options = {\n method: 'DELETE',\n headers: this.headers,\n }\n\n return fetch(`${this.endpoint}${url}`, options)\n .then((response) => {\n if (!response.ok) {\n throw new Error(`ApiDeleteRequestError: ${response.status} ${response.statusText}`)\n }\n return response.text()\n })\n .then((text) => (text.length ? JSON.parse(text) : {}))\n .then((data) => data)\n }\n}\n\nexport default Fetch\n","import Bowser from 'bowser'\n\nimport { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport type { AnalyticsEvent, GlobalErrorHandler } from '..'\n\nexport class AnalyticsApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n initializeAnalyticsSession = async (version: string, featureName?: string) => {\n const browser = Bowser.getParser(window.navigator.userAgent)\n\n const { analytics_session } = await this.fetchInstance.post(ApiEndpoints.ANALYTICS_SESSION, {\n browser_name: browser.getBrowserName() || 'Unknown',\n browser_version: browser.getBrowserVersion() || '0.0.0',\n is_first_visit: false,\n product_name: 'Individual Widget',\n product_version: version,\n })\n if (!analytics_session) {\n return { analytics_session: null }\n }\n this.fetchInstance.post(ApiEndpoints.ANALYTICS_FEATURE_VISITS, {\n feature_visit: {\n analytics_session_guid: analytics_session.guid,\n feature_name: featureName ? featureName : 'Experiences',\n is_first_visit: analytics_session.is_first_visit,\n },\n })\n return { analytics_session }\n }\n\n sendAnalyticEvent = async (event: AnalyticsEvent) => {\n return this.fetchInstance.post(ApiEndpoints.ANALYTICS_EVENTS, event).catch((err) => {\n throw err\n })\n }\n\n sendAnalyticsPageview = async (event: any) => {\n return this.fetchInstance.post(ApiEndpoints.ANALYTICS_PAGEVIEWS, event).catch((err) => {\n throw err\n })\n }\n}\n","import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport type { Beat, GlobalErrorHandler } from '..'\n\nexport class BeatApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n getBeats = async (pageNum?: number, perPage?: number) => {\n const beatParams = `page=${pageNum ? pageNum : 1}&per_page=${perPage ? perPage : 5}`\n\n return this.fetchInstance.get(`${ApiEndpoints.BEATS}?${beatParams}`).then((data) => data.beats)\n }\n\n getBeatsWithAssociatedTransaction = async (fromDate?: string) => {\n let beatParams = 'has_associated_transaction_guid=true'\n beatParams += fromDate ? `&from_date=${fromDate}` : ''\n\n return this.fetchInstance.get(`${ApiEndpoints.BEATS}?${beatParams}`).then((data) => data.beats)\n }\n\n getOffers = async () => {\n return this.fetchInstance\n .get(`${ApiEndpoints.OFFERS}/${ApiEndpoints.PULSE_COMMUNICATIONS}`)\n .then((data) => data.pulse_communications)\n }\n\n updateBeat = async (beat: Beat) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.BEATS}/${beat.guid}`, beat)\n .then((data) => data.beat)\n }\n\n updateOffer = async (beat: Beat) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.OFFERS}/${beat.guid}`, beat)\n .then((data) => data.beat)\n }\n}\n","import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport type { GlobalErrorHandler } from '..'\n\nexport class GlobalCopyApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n getGlobalCopy = async (namespace: string, translationKey: string) => {\n return this.fetchInstance\n .post(`${ApiEndpoints.LOCALIZED_CONTENT}/${namespace}`, { translation_key: translationKey })\n .then((data) => data)\n }\n}\n"],"names":["Fetch","endpoint","token","headers","onError","defaultHeaders","getLocale","url","options","response","text","data","err","body","AnalyticsApi","version","featureName","browser","Bowser","analytics_session","ApiEndpoints","event","BeatApi","pageNum","perPage","beatParams","fromDate","beat","GlobalCopyApi","namespace","translationKey"],"mappings":"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"}