@mx-cartographer/experiences 4.0.14-alpha.JB0 → 4.0.14-alpha.JB2
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.
- package/dist/AccountStore-B23-oV1B.mjs +244 -0
- package/dist/AccountStore-B23-oV1B.mjs.map +1 -0
- package/dist/BeatApi-BxXgbSJY.mjs +99 -0
- package/dist/BeatApi-BxXgbSJY.mjs.map +1 -0
- package/dist/BudgetUtil-BSn9Zr71.mjs +208 -0
- package/dist/BudgetUtil-BSn9Zr71.mjs.map +1 -0
- package/dist/CashflowApi-zcebgnO1.mjs +103 -0
- package/dist/CashflowApi-zcebgnO1.mjs.map +1 -0
- package/dist/CashflowStore-gPEEBiXo.mjs +53 -0
- package/dist/CashflowStore-gPEEBiXo.mjs.map +1 -0
- package/dist/Categories-XVFviD23.mjs +117 -0
- package/dist/Categories-XVFviD23.mjs.map +1 -0
- package/dist/CategoryStore-CSNSMNA6.mjs +298 -0
- package/dist/CategoryStore-CSNSMNA6.mjs.map +1 -0
- package/dist/ConnectMiniWidget-Ep65CtHH.mjs +10854 -0
- package/dist/ConnectMiniWidget-Ep65CtHH.mjs.map +1 -0
- package/dist/DebtsStore-Duf3n1vZ.mjs +127 -0
- package/dist/DebtsStore-Duf3n1vZ.mjs.map +1 -0
- package/dist/Donut-DgMeKScZ.mjs +53 -0
- package/dist/Donut-DgMeKScZ.mjs.map +1 -0
- package/dist/Fetch-DpUi1_Dx.mjs +99 -0
- package/dist/Fetch-DpUi1_Dx.mjs.map +1 -0
- package/dist/GoalStore-BYoRLx99.mjs +128 -0
- package/dist/GoalStore-BYoRLx99.mjs.map +1 -0
- package/dist/MerchantStore-RhLvDvX-.mjs +118 -0
- package/dist/MerchantStore-RhLvDvX-.mjs.map +1 -0
- package/dist/NetWorthStore-syD1VnxE.mjs +66 -0
- package/dist/NetWorthStore-syD1VnxE.mjs.map +1 -0
- package/dist/NotificationStore-CqTYHfJC.mjs +141 -0
- package/dist/NotificationStore-CqTYHfJC.mjs.map +1 -0
- package/dist/RecurringActivityStore-B_COvGWG.mjs +304 -0
- package/dist/RecurringActivityStore-B_COvGWG.mjs.map +1 -0
- package/dist/StackedLineChart-CCqGRwvs.mjs +342 -0
- package/dist/StackedLineChart-CCqGRwvs.mjs.map +1 -0
- package/dist/TransactionStore-BUrjBWkk.mjs +478 -0
- package/dist/TransactionStore-BUrjBWkk.mjs.map +1 -0
- package/dist/index.es.js +12 -17869
- package/dist/index.es.js.map +1 -1
- package/dist/index.es10.js +107 -0
- package/dist/index.es10.js.map +1 -0
- package/dist/index.es11.js +159 -0
- package/dist/index.es11.js.map +1 -0
- package/dist/index.es12.js +483 -0
- package/dist/index.es12.js.map +1 -0
- package/dist/index.es13.js +620 -0
- package/dist/index.es13.js.map +1 -0
- package/dist/index.es14.js +788 -0
- package/dist/index.es14.js.map +1 -0
- package/dist/index.es15.js +891 -0
- package/dist/index.es15.js.map +1 -0
- package/dist/index.es16.js +962 -0
- package/dist/index.es16.js.map +1 -0
- package/dist/index.es17.js +1904 -0
- package/dist/index.es17.js.map +1 -0
- package/dist/index.es2.js +11 -0
- package/dist/index.es2.js.map +1 -0
- package/dist/index.es3.js +10 -0
- package/dist/index.es3.js.map +1 -0
- package/dist/index.es4.js +9 -0
- package/dist/index.es4.js.map +1 -0
- package/dist/index.es5.js +7 -0
- package/dist/index.es5.js.map +1 -0
- package/dist/index.es6.js +7 -0
- package/dist/index.es6.js.map +1 -0
- package/dist/index.es7.js +10 -0
- package/dist/index.es7.js.map +1 -0
- package/dist/index.es8.js +10 -0
- package/dist/index.es8.js.map +1 -0
- package/dist/index.es9.js +18 -0
- package/dist/index.es9.js.map +1 -0
- package/dist/useCombineEvents-CZUDHE96.mjs +170 -0
- package/dist/useCombineEvents-CZUDHE96.mjs.map +1 -0
- package/dist/usePrevious-BLb3umpI.mjs +11 -0
- package/dist/usePrevious-BLb3umpI.mjs.map +1 -0
- package/package.json +1 -1
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/common/utils/Analytics.ts","../src/common/constants/ApiEndpoints.ts","../src/common/constants/Analytics.ts","../src/common/constants/DateFormats.ts","../src/common/types/Account.ts","../src/common/constants/Account.ts","../src/common/constants/Category.ts","../src/common/constants/Numbers.ts","../src/common/constants/ScheduledPayment.ts","../src/common/constants/SpendingPlan.ts","../src/common/constants/Donut.ts","../src/common/constants/Sizes.ts","../src/common/utils/Categories.ts","../src/common/utils/Localization.ts","../src/common/utils/Fetch.ts","../src/common/utils/NumberFormatting.ts","../src/common/utils/DateUtil.ts","../src/common/api/AnalyticsApi.ts","../src/common/api/BeatApi.ts","../src/common/api/CategoryApi.ts","../src/common/api/GlobalCopyApi.ts","../src/common/api/LocalizedCopyApi.ts","../src/common/api/NotificationApi.ts","../src/common/api/ScheduledPaymentsApi.ts","../src/common/api/UserApi.ts","../src/common/api/WidgetApi.ts","../src/common/utils/AccountFilter.ts","../src/common/components/accountfilter/AccountFilterOptions.tsx","../src/common/hooks/useCombineEvents.tsx","../src/common/hooks/useScreenSize.tsx","../src/common/hooks/usePrevious.tsx","../src/common/components/accountfilter/AccountFilter.tsx","../src/common/components/barchart/Legend.tsx","../src/common/components/barchart/Bar.tsx","../src/common/components/barchart/BarColumn.tsx","../src/common/components/barchart/Util.ts","../src/common/components/barchart/BarChart.tsx","../src/common/components/calendar/Header.tsx","../src/common/components/calendar/Day.tsx","../src/common/components/calendar/Calendar.tsx","../src/common/components/charts/Donut.tsx","../src/common/components/charts/linechart/CustomMark.tsx","../src/common/components/charts/linechart/CustomLine.tsx","../src/common/components/charts/linechart/CustomLegend.tsx","../src/common/components/charts/LineChart.tsx","../src/common/context/GlobalDataProvider.tsx","../src/common/context/WidgetContainerProvider.tsx","../src/common/context/hooks.tsx","../src/common/components/charts/stackedlinechart/CategoryIconLabel.tsx","../src/common/components/CurrencyText.tsx","../src/common/components/charts/stackedlinechart/CustomAreaTooltip.tsx","../src/common/components/charts/stackedlinechart/CustomPointTooltip.tsx","../src/common/components/charts/stackedlinechart/CustomLegend.tsx","../src/common/components/charts/StackedLineChart.tsx","../src/common/components/charts/StatusBar.tsx","../src/common/components/dialog/Dialog.tsx","../src/common/components/drawer/Header.tsx","../src/common/components/drawer/Drawer.tsx","../src/common/components/daterangeselector/DateRangeSelector.tsx","../src/common/components/donuts/MultiSegmentDonut.tsx","../src/common/components/donuts/SingleSegmentDonut.tsx","../src/common/hooks/useDimensions.tsx","../src/common/components/MiniWidgetContainer.tsx","../src/common/components/WidgetContainer.tsx","../src/accounts/components/ConnectStatus.tsx","../src/accounts/constants/Accounts.ts","../src/common/constants/Connect.ts","../src/common/components/ConnectDrawer.tsx","../src/common/components/CurrencyInput.tsx","../src/common/components/Loader.tsx","../src/common/components/ResponsiveButton.tsx","../src/common/components/SearchBox.tsx","../src/common/components/SelectionBox.tsx","../src/common/components/TabContentContainer.tsx","../src/common/components/IconBacking.tsx","../src/common/components/DataRow.tsx","../src/common/components/InformationTooltip.tsx","../src/common/components/ListItemWrapper.tsx","../src/common/stores/GlobalCopyStore.ts","../src/insights/store/BeatStore.ts","../src/budgets/api/BudgetsApi.ts","../src/budgets/utils/BudgetUtil.ts","../src/budgets/store/BudgetsStore.ts","../src/cashflow/context/hooks.tsx","../src/cashflow/components/RemainingCash.tsx","../src/cashflow/components/CashflowWidgetContent.tsx","../src/cashflow/CashflowMiniWidget.tsx","../src/transactions/api/TransactionApi.ts","../src/transactions/constants/Actions.ts","../src/transactions/constants/OnClickEvents.ts","../src/common/constants/Table.ts","../src/transactions/utils/buildDetailedTransactions.ts","../src/transactions/constants/Analytics.ts","../src/transactions/analytics.ts","../src/transactions/constants/TransactionsTable.ts","../src/transactions/utils/sortAndFilterTransactions.ts","../src/common/types/Activity.ts","../src/common/types/Beat.ts","../src/common/types/Expense.ts","../src/common/types/Goal.ts","../src/common/types/Transaction.ts","../src/common/types/ScreenSize.tsx","../src/transactions/constants/Transaction.ts","../src/transactions/stores/UiStore.ts","../src/transactions/stores/TransactionStore.ts","../src/transactions/context/hooks.tsx","../src/transactions/utils/exportTransactionsToCSV.ts","../src/transactions/components/shared/transactionlist/TransactionRow.tsx","../src/common/components/SubheaderRow.tsx","../src/transactions/components/shared/transactionlist/ZeroState.tsx","../src/transactions/utils/Transactions.ts","../src/transactions/components/shared/TransactionList.tsx","../src/transactions/components/shared/transactiontable/cells/AccountCell.tsx","../src/transactions/components/shared/transactiontable/cells/AmountCell.tsx","../src/transactions/components/shared/transactiontable/cells/CategoryCell.tsx","../src/transactions/components/shared/transactiontable/cells/DateCell.tsx","../src/transactions/components/shared/transactiontable/cells/FlagCell.tsx","../src/transactions/components/shared/transactiontable/cells/HeaderCell.tsx","../src/transactions/components/shared/transactiontable/cells/PayeeCell.tsx","../src/transactions/components/shared/TransactionTable.tsx","../src/categories/context/hooks.ts","../src/categories/constants/OnClickEvents.ts","../src/categories/components/CustomCategories/CustomCategoryModal.tsx","../src/categories/components/CustomCategories/AddSubcategory.tsx","../src/categories/components/CustomCategories/RenameSubcategory.tsx","../src/categories/components/CustomCategories/DeleteSubcategory.tsx","../src/categories/components/SubcategoryRow.tsx","../src/categories/components/SubcategoryList.tsx","../src/categories/components/CategoryRow.tsx","../src/categories/components/CategoryList.tsx","../src/categories/components/CategorySelector.tsx","../src/categories/components/CategorySelectorDrawer.tsx","../src/categories/util/CategoryUtil.ts","../src/categories/stores/UiStore.ts","../src/categories/stores/CategoryStore.ts","../src/transactions/components/shared/transactiondetails/actions/CategoryAction.tsx","../src/transactions/components/shared/transactiondetails/actions/DateAction.tsx","../src/transactions/components/shared/transactiondetails/actions/DeleteAction.tsx","../src/transactions/components/shared/transactiondetails/actions/DeleteLogoAction.tsx","../src/transactions/components/shared/transactiondetails/actions/HideAction.tsx","../src/transactions/components/shared/transactiondetails/TransactionAmountHeader.tsx","../src/transactions/components/shared/transactiondetails/actions/MemoAction.tsx","../src/transactions/components/splitmanager/SplitRow.tsx","../src/transactions/components/splitmanager/SplitManager.tsx","../src/transactions/components/shared/transactiondetails/actions/SplitAction.tsx","../src/transactions/components/tagmanager/Header.tsx","../src/transactions/components/tagmanager/SearchBox.tsx","../src/transactions/components/tagmanager/TagRow.tsx","../src/transactions/components/tagmanager/TagManager.tsx","../src/transactions/components/shared/transactiondetails/actions/TagsAction.tsx","../src/transactions/components/shared/transactiondetails/Description.tsx","../src/transactions/components/shared/transactiondetails/FlagTransaction.tsx","../src/transactions/components/shared/TransactionDetails.tsx","../src/transactions/components/transactionwidget/AddAccountModal.tsx","../src/transactions/components/shared/transactiondetails/ManualTransactionDetails.tsx","../src/transactions/components/transactionwidget/actions/EditCategoryAction.tsx","../src/transactions/TransactionWidget.tsx","../src/recurringactivity/util/updateActivity.ts","../src/recurringactivity/components/actions/FrequencyAction.tsx","../src/recurringactivity/components/actions/PaymentDateAction.tsx","../src/recurringactivity/components/ActivityDetails.tsx","../src/recurringactivity/components/ActivityBadges.tsx","../src/recurringactivity/util/getRecurrence.ts","../src/recurringactivity/util/getStatus.ts","../src/recurringactivity/components/ActivityRow.tsx","../src/recurringactivity/util/buildNewActivity.ts","../src/recurringactivity/components/shared/activitysettings/SelectTransaction.tsx","../src/recurringactivity/components/shared/activitysettings/AddActivityDetails.tsx","../src/transactions/utils/Filters.ts","../src/recurringactivity/components/shared/activitysettings/AddActivity.tsx","../src/recurringactivity/components/shared/activitysettings/ManageExpenses.tsx","../src/recurringactivity/util/buildActivities.ts","../src/recurringactivity/components/shared/activitysettings/ManageIncome.tsx","../src/recurringactivity/components/shared/ActivitySettings.tsx","../src/recurringactivity/util/RecurringActivityUtils.ts","../src/recurringactivity/components/activitycalendar/ActivityDay.tsx","../src/recurringactivity/components/activitycalendar/Legend.tsx","../src/recurringactivity/components/activitycalendar/ActivityCalendar.tsx","../src/recurringactivity/components/ActivityList.tsx","../src/recurringactivity/components/ActivityStatus.tsx","../src/recurringactivity/components/RecurringActivity.tsx","../src/recurringactivity/RecurringActivityWidget.tsx","../src/recurringactivity/components/MiniWidgetContent.tsx","../src/recurringactivity/RecurringActivityMiniWidget.tsx","../src/recurringactivity/stores/RecurringActivityStore.ts","../src/accounts/components/ConnectionStatusIcons.tsx","../src/accounts/utils/Accounts.ts","../src/accounts/utils/AccountFields.tsx","../src/accounts/components/AccountListItem.tsx","../src/cashflow/components/DetailsFooter.tsx","../src/cashflow/components/DetailsExpenseRow.tsx","../src/cashflow/components/DetailsExpenseHeader.tsx","../src/cashflow/util/Filters.ts","../src/cashflow/components/DetailsTab.tsx","../src/cashflow/components/SummaryTab.tsx","../src/cashflow/components/CashflowContent.tsx","../src/cashflow/components/CashflowAmountHeading.tsx","../src/cashflow/components/CashflowHeading.tsx","../src/cashflow/components/onboarding/StepOne.tsx","../src/cashflow/images/loading-animation.gif","../src/cashflow/components/onboarding/StepTwo.tsx","../src/cashflow/images/cashflow-onboarding.png","../src/cashflow/CashflowOnboarding.tsx","../src/cashflow/CashflowWidget.tsx","../src/cashflow/api/CashflowApi.ts","../src/cashflow/stores/UiStore.ts","../src/cashflow/stores/CashflowStore.ts","../src/common/stores/ConnectStore.ts","../src/debts/utils/SnowballCard.tsx","../src/debts/components/SnowballCard.tsx","../src/debts/components/SnowballDrawer.tsx","../src/debts/components/DebtsChart.tsx","../src/trends/components/trendstable/HeaderCell.tsx","../src/debts/components/debtstable/PriorityCell.tsx","../src/debts/components/debtstable/AccountCell.tsx","../src/debts/components/DebtsTable.tsx","../src/debts/utils/DebtsWidget.ts","../src/debts/DebtsWidget.tsx","../src/debts/utils/DebtStore.ts","../src/debts/store/DebtsStore.ts","../src/common/stores/GlobalUiStore.ts","../src/goals/components/TabTitle.tsx","../src/goals/util/GoalsUtil.ts","../src/goals/components/GoalStatusCard.tsx","../src/goals/components/GoalList.tsx","../src/goals/components/GoalDetails.tsx","../src/goals/GoalsWidget.tsx","../src/goals/api/GoalApi.ts","../src/goals/stores/GoalStore.ts","../src/merchants/components/MerchantLookup.tsx","../src/merchants/api/MerchantApi.ts","../src/merchants/stores/MerchantStore.ts","../src/networth/utils/NetWorthUtils.ts","../src/networth/stores/NetWorthStore.ts","../src/networth/components/NetWorthChart.tsx","../src/networth/components/NetWorthListItem.tsx","../src/networth/components/NetWorthList.tsx","../src/networth/components/NetWorthChange.tsx","../src/networth/components/NetWorthSummary.tsx","../src/networth/components/AssetsLiabilitiesDetail.tsx","../src/networth/components/GainsLossesDetail.tsx","../src/networth/NetWorthWidget.tsx","../src/notifications/constants/NotificationConstants.ts","../src/notifications/stores/NotificationStore.ts","../src/notifications/utils/NotificationUtils.ts","../src/notifications/components/NotificationBadge.tsx","../src/notifications/components/NotificationCard.tsx","../src/notifications/components/DateRow.tsx","../src/notifications/components/NotificationList.tsx","../src/common/stores/UserStore.ts","../src/common/stores/GlobalStore.ts","../src/accounts/components/detailsdrawer/Accounts/AccountActionsRow.tsx","../src/accounts/hooks/useUiStore.ts","../src/accounts/hooks/useGetMergeableAccounts.tsx","../src/accounts/components/detailsdrawer/Accounts/AccountActions.tsx","../src/accounts/utils/getConnectionMessages.tsx","../src/accounts/components/detailsdrawer/Accounts/AccountConnection.tsx","../src/accounts/components/detailsdrawer/Accounts/AccountDetailEdit.tsx","../src/accounts/components/detailsdrawer/Accounts/AccountDetails.tsx","../src/accounts/components/detailsdrawer/Accounts/AccountDetailsTab.tsx","../src/accounts/components/detailsdrawer/Accounts/ConnectionErrorMessage.tsx","../src/accounts/components/detailsdrawer/Transactions/TransactionsTab.tsx","../src/accounts/components/detailsdrawer/Accounts/AccountDetailsContent.tsx","../src/trends/utils/shared.ts","../src/trends/utils/SpendingData.ts","../src/trends/components/TrendsChart.tsx","../src/accounts/components/detailsdrawer/Accounts/AccountDetailsChart.tsx","../src/accounts/components/detailsdrawer/Accounts/AccountDetailsHeader.tsx","../src/accounts/components/AccountsList.tsx","../src/accounts/components/ConnectionsDrawer.tsx","../src/accounts/AccountsWidget.tsx","../src/accounts/AccountsMiniWidget.tsx","../src/accounts/components/ConnectImage.tsx","../src/accounts/components/ConnectMiniWidgetCard.tsx","../src/accounts/ConnectMiniWidget.tsx","../src/accounts/api/AccountApi.ts","../src/accounts/stores/UiStore.ts","../src/accounts/stores/AccountStore.ts","../src/budgets/utils/BubblesSVG.ts","../src/budgets/components/bubblechart/Mercury.tsx","../src/budgets/components/bubblechart/Bubble.tsx","../src/budgets/components/BubbleChart.tsx","../src/budgets/components/ZeroState.tsx","../src/budgets/components/BubbleBudgets.tsx","../src/budgets/BubbleBudgetsMiniWidget.tsx","../src/budgets/components/budgetlist/BudgetRow.tsx","../src/budgets/components/BudgetList.tsx","../src/budgets/components/Overview.tsx","../src/budgets/components/addbudget/Header.tsx","../src/budgets/components/addbudget/RecalculateBudgetRow.tsx","../src/budgets/components/addbudget/RecalculateBudgets.tsx","../src/budgets/components/shared/BudgetAmount.tsx","../src/budgets/components/addbudget/UnbudgetedRow.tsx","../src/budgets/components/AddBudgets.tsx","../src/budgets/components/budgetdetails/Header.tsx","../src/budgets/components/budgetlist/SubBudgetZeroState.tsx","../src/budgets/components/budgetlist/SubBudgetRow.tsx","../src/budgets/components/budgetdetails/AddSubBudget.tsx","../src/budgets/components/budgetdetails/SubBudgetList.tsx","../src/budgets/components/budgetdetails/BudgetDetails.tsx","../src/budgets/components/BudgetDetailsDrawer.tsx","../src/budgets/BubbleBudgetsWidget.tsx","../src/dashboard/constants/Dashboard.ts","../src/dashboard/Greeting.tsx","../src/dashboard/Dashboard.tsx","../src/insights/settings/components/PulseSubheaderRow.tsx","../src/insights/settings/manageaccounts/components/AccountGroup.tsx","../src/insights/settings/components/SettingsItem.tsx","../src/insights/settings/manageaccounts/components/ManageAccountsDrawer.tsx","../src/insights/contexts/ToastContext.tsx","../src/insights/settings/components/Toast.tsx","../src/insights/settings/hiddeninsights/images/no-insights.png","../src/insights/settings/hiddeninsights/components/CategoryEmptyState.tsx","../src/insights/settings/hiddeninsights/components/SubCategoryDrawer.tsx","../src/insights/utils/beatTemplateCategories.ts","../src/insights/settings/hiddeninsights/components/HiddenInsightsDrawer.tsx","../src/insights/settings/hiddeninsights/components/HiddenInsightsDrawerWrapper.tsx","../src/insights/settings/SettingsDrawer.tsx","../src/microinsights/stores/CopyStore.ts","../src/microinsights/constants/Analytics.ts","../src/microinsights/analytics.ts","../src/microinsights/stores/InsightsMicroWidgetStore.ts","../src/microinsights/stores/AppStore.ts","../src/microinsights/context/InsightsMicroWidgetDataProvider.tsx","../src/microinsights/components/beaticons/BeatCategoryIcon.tsx","../src/microinsights/components/beaticons/BeatMerchantLogo.tsx","../src/microinsights/components/beaticons/ChartFilledIcon.tsx","../src/microinsights/utils/DataSeries.ts","../src/microinsights/components/beaticons/MonthlySpendComparisonIcon.tsx","../src/microinsights/components/beaticons/ZeroStateIcon.tsx","../src/microinsights/components/beaticons/BeatIcon.tsx","../src/microinsights/constants/App.ts","../src/microinsights/context/hooks.tsx","../src/microinsights/components/beatCard/BeatCard.tsx","../src/microinsights/components/microBeatCarousel/CarouselControls.tsx","../src/microinsights/components/microBeatCarousel/MicroBeatCarousel.tsx","../src/microinsights/components/microInsightCard/MicroInsightCard.tsx","../src/microinsights/components/carouselheader/CarouselHeader.tsx","../src/microinsights/components/spinner/Spinner.tsx","../src/microinsights/components/insightsmicrowidget/InsightsMicroWidget.tsx","../src/microinsights/components/noRelevantInsightsCard/NoRelevantInsightsCard.tsx","../src/microinsights/components/viewMoreMicroCard/ViewMoreMicroCard.tsx","../src/microinsights/components/zeroStateCard/ZeroStateCard.tsx","../src/spending/utils/SpendingData.ts","../src/spending/components/SpendingTabLabel.tsx","../src/spending/components/SpendingDonut.tsx","../src/spending/components/SpendingLegend.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","../src/trends/utils/TrendsData.ts","../src/trends/components/trendstable/AmountCell.tsx","../src/trends/components/trendstable/CategoryCell.tsx","../src/trends/components/TrendsTable.tsx","../src/trends/components/TrendsDrawer.tsx","../src/trends/TrendsFullWidget.tsx","../src/trends/components/SpendingChart.tsx","../src/trends/TrendsMiniWidget.tsx"],"sourcesContent":["import { getUnixTime } from 'date-fns/getUnixTime'\n\nimport { AnalyticsApi } from '../api'\nimport { BasicAnalyticsEvent, AnalyticsSession, BasicAnalyticsPageview } from '../types'\n\nexport const analyticsSession = async (\n endpoint: string,\n token: string,\n version = '1.0.0',\n featureName = 'Experiences',\n) => {\n const analyticsApi = new AnalyticsApi(endpoint, token)\n const { analytics_session } = (await analyticsApi.initializeAnalyticsSession(\n version,\n featureName,\n )) as {\n analytics_session: AnalyticsSession\n }\n\n const host = window.location.hostname\n\n return {\n sendAnalyticEvent: async (event: BasicAnalyticsEvent) => {\n return await analyticsApi.sendAnalyticEvent({\n analytics_event: {\n ...event,\n app_version: 'widgets-v2',\n created_at: getUnixTime(new Date()).toString(),\n host,\n name: event?.label || '',\n session_id: analytics_session.guid,\n user_agent: navigator.userAgent || '',\n version: 2,\n },\n })\n },\n sendAnalyticsPageview: async (pageview: BasicAnalyticsPageview) => {\n return await analyticsApi.sendAnalyticsPageview({\n analytics_pageview: {\n ...pageview,\n app_version: 'widgets-v2',\n created_at: getUnixTime(new Date()).toString(),\n host,\n name: pageview.name,\n session_id: analytics_session.guid,\n user_agent: navigator.userAgent || '',\n },\n })\n },\n }\n}\n","export const ApiEndpoints = {\n ACCOUNTS: 'accounts',\n ANALYTICS_EVENTS: 'analytics_events',\n ANALYTICS_FEATURE_VISITS: 'feature_visits',\n ANALYTICS_PAGEVIEWS: 'analytics_pageviews',\n ANALYTICS_SESSION: 'analytics_sessions',\n APP_DATA: 'raja/data?type=master',\n BEATS: 'beats',\n BUDGETS: 'budgets',\n CASHFLOW_EVENTS: 'cashflow_events',\n CASHFLOW_SEQUENCES: 'cashflow_sequences',\n CATEGORIES: 'categories',\n DATE_RANGE_CATEGORY_TOTALS: 'date_range_category_totals',\n GOALS: 'goals',\n INSTITUTIONS: 'institutions',\n LOCALIZED_COPY: 'localized_copies',\n LOCALIZED_CONTENT: 'localized_content',\n MEMBERS: 'members',\n MERCHANTS: 'merchants',\n MONTHLY_CATEGORY_TOTALS: 'monthly_category_totals',\n NOTIFICATIONS: 'notifications',\n SCHEDULED_PAYMENTS: 'scheduled_payments',\n SPENDING_PLANS: 'spending_plans',\n TAGGINGS: 'taggings',\n TAGS: 'tags',\n TRANSACTION_RULES: 'transaction_rules',\n TRANSACTIONS: 'transactions',\n USER_PROFILES: 'user_profiles',\n WIDGET_URLS: 'widget_urls',\n}\n","export const ANALYTICS_EVENTS = {\n ACCOUNTS_CLICK_SYNC: 'accounts_widget_click_sync',\n ACCOUNTS_CLICK_CONNECT: 'accounts_widget_click_connect_accounts',\n ACCOUNTS_CLICK_FILTER: 'accounts_widget_click_filter_accounts',\n ACCOUNTS_CLICK_ACCOUNT: 'accounts_widget_click_account',\n ACCOUNT_DETAILS_CLICK_HIDE: 'account_details_click_hide_account',\n ACCOUNT_DETAILS_CLICK_MARK_CLOSED: 'account_details_click_mark_as_closed',\n ACCOUNT_DETAILS_CLICK_MARK_DUPLICATE: 'account_details_click_mark_as_duplicate',\n ACCOUNT_DETAILS_CLICK_TRANSACTION: 'account_details_click_transaction',\n ACCOUNT_DETAILS_VIEW: 'account_details',\n ACCOUNT_DETAILS_VIEW_TRANSACTIONS: 'account_details_transactions',\n BUDGETS_CLICK_FILTER: 'budgets_widget_click_filter_accounts',\n BUDGETS_CLICK_ADD: 'budgets_widget_click_add_budget',\n BUDGETS_CLICK_EDIT_INCOME: 'budgets_widget_click_edit_income',\n BUDGETS_CLICK_BUDGET_CATEGORY: 'budgets_widget_click_budget_category',\n BUDGETS_VIEW: 'budgets',\n CASH_FLOW_CLICK_SETTINGS: 'cash_flow_widget_click_settings',\n CASH_FLOW_CLICK_FILTER: 'cash_flow_widget_click_filter_accounts',\n DEBTS_CLICK_TABLE_SORT: 'debts_widget_click_table_sort',\n DEBTS_CLICK_TABLE_ROW: 'debts_widget_click_table_row',\n GOALS_VIEW: 'goals',\n GOALS_CLICK_FILTER: 'goals_widget_click_filter_accounts',\n GOALS_CLICK_ADD: 'goals_widget_click_add',\n NET_WORTH_VIEW: 'net_worth',\n NET_WORTH_WIDGET_CLICK_ASSETS_LIABILITIES: 'net_worth_widget_click_view_assets_liabilities',\n NET_WORTH_WIDGET_CLICK_FILTER: 'net_worth_widget_click_filter_accounts',\n NET_WORTH_WIDGET_CLICK_TIMEFRAME: 'net_worth_widget_click_time_period',\n RECURRING_ACTIVITY_CLICK_SETTINGS: 'recurring_transactions_widget_click_settings',\n RECURRING_ACTIVITY_CLICK_FILTER: 'recurring_transactions_widget_click_filter_accounts',\n RECURRING_ACTIVITY_CLICK_UPCOMING: 'recurring_transactions_widget_click_upcoming_transaction',\n RECURRING_ACTIVITY_CLICK_PAID: 'recurring_transactions_widget_click_paid_expense',\n RECURRING_ACTIVITY_CLICK_CALENDAR_RIGHT: 'recurring_transactions_widget_click_calendar_right',\n RECURRING_ACTIVITY_CLICK_EXPENSE: 'recurring_transactions_widget_manage_expenses_click_expense',\n RECURRING_ACTIVITY_CLICK_ADD_EXPENSE:\n 'recurring_transactions_widget_manage_expenses_click_add_expense',\n RECURRING_ACTIVITY_CLICK_INCOME: 'recurring_transactions_widget_click_income',\n RECURRING_ACTIVITY_CLICK_ADD_INCOME:\n 'recurring_transactions_widget_income_details_click_add_income',\n SPENDING_VIEW: 'spending',\n SPENDING_CLICK_FILTER: 'spending_widget_click_filter_accounts',\n TRANSACTIONS_VIEW: 'transactions',\n TRANSACTIONS_ADD_MANUAL_ACCOUNT_MODAL: 'transactions_add_manual_account_modal',\n TRANSACTIONS_CLICK_SEARCH: 'transactions_click_search',\n TRANSACTIONS_CLICK_FILTER: 'transactions_click_filter_accounts',\n TRANSACTIONS_CLICK_EXPORT: 'transactions_click_export_csv',\n TRANSACTIONS_CLICK_ADD: 'transactions_click_add_transaction',\n TRANSACTIONS_CLICK_DETAILS: 'transactions_click_transaction_details',\n TRANSACTION_DETAILS_VIEW: 'transaction_details',\n TRANSACTION_DETAILS_CLICK_DESCRIPTION: 'transaction_details_click_edit_description',\n TRANSACTION_DETAILS_CLICK_FLAG: 'transaction_details_click_flag_transaction',\n TRANSACTION_DETAILS_CLICK_CATEGORY: 'transaction_details_click_category',\n TRANSACTION_DETAILS_CLICK_DATE: 'transaction_details_click_date',\n TRANSACTION_DETAILS_CLICK_DELETE_LOGO: 'transaction_details_click_delete_merchant_logo',\n TRANSACTION_DETAILS_CLICK_MEMO: 'transaction_details_click_memo',\n TRANSACTION_DETAILS_CLICK_SPLIT: 'transaction_details_click_split_transaction',\n TRANSACTION_DETAILS_CLICK_UNSPLIT: 'transaction_details_click_unsplit_transaction',\n TRANSACTION_DETAILS_CLICK_TAGS: 'transaction_details_click_tags',\n TRANSACTION_DETAILS_CLICK_AMOUNT: 'transaction_details_click_transaction_amount',\n TRENDS_CLICK_FILTER: 'trends_widget_click_filter_accounts',\n TRENDS_CLICK_TOGGLE: 'trends_widget_toggle_chart_table',\n TRENDS_CLICK_DATE: 'trends_widget_click_date_range',\n TRENDS_CLICK_TABLE_SORT: 'trends_widget_click_table_sort',\n TRENDS_CLICK_TABLE_ROW: 'trends_widget_click_table_row',\n TRENDS_CLICK_LEGEND: 'trends_widget_click_legend',\n TRENDS_HOVER_LEGEND: 'trends_widget_hover_legend',\n TRENDS_HOVER_AREA: 'trends_widget_hover_chart_area',\n TRENDS_HOVER_POINT: 'trends_widget_hover_chart_point',\n TRENDS_VIEW_TRANSACTIONS: 'trends_widget_view_transactions',\n WIDGET_BACK_CLICK: 'widget_back_button_click',\n}\n","import { intlFormat } from 'date-fns/intlFormat'\nimport { getLocale } from '../utils'\n\nexport const ORDINAL_DATE_FORMAT = 'do'\nexport const ORDINAL_MONTH_DAY_YEAR_FORMAT = 'MMM do, yyyy'\n\n// Documentation on the options for formatting int'l dates\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat\nexport const DATE_FORMATS_INTL = {\n TIME_STAMP_HOUR_MINUTE: {\n hour: 'numeric',\n minute: 'numeric',\n },\n DAY: {\n day: 'numeric',\n },\n DAY_OF_WEEK: {\n weekday: 'long',\n },\n DAY_OF_WEEK_MONTH_DAY: {\n day: 'numeric',\n month: 'long',\n weekday: 'long',\n },\n FULL_MONTH_DAY: {\n day: 'numeric',\n month: 'long',\n },\n MONTH: {\n month: 'short',\n },\n MONTH_DAY: {\n day: 'numeric',\n month: 'short',\n },\n MONTH_LONG: {\n month: 'long',\n },\n MONTH_SHORT: {\n month: 'short',\n },\n MONTH_SHORT_YEAR: {\n month: 'short',\n year: 'numeric',\n },\n MONTH_YEAR: {\n month: 'long',\n year: 'numeric',\n },\n YEAR_MONTH_DAY: {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n },\n MONTH_DAY_YEAR: {\n month: 'short',\n day: '2-digit',\n year: 'numeric',\n },\n MED_MONTH_SHORT_DAY_FULL_YEAR: {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n },\n}\n\nexport interface Day {\n day: string\n}\n\nexport interface DayOfWeek {\n weekday: string\n}\n\nexport interface DayOfWeekMonthDay {\n day: string\n month: string\n weekday: string\n}\n\nexport interface MonthDay {\n day: string\n month: string\n}\n\nexport interface MonthLong {\n month: string\n}\n\nexport interface MonthShort {\n month: string\n}\n\nexport interface MonthYear {\n month: string\n year: string\n}\n\nexport interface TimeStamp {\n hour: string\n minute: string\n}\n\nexport interface YearMonthDay {\n day: string\n month: string\n year: string\n}\n\nexport const formatDate = (\n date: string | Date,\n dFormat:\n | Day\n | DayOfWeek\n | DayOfWeekMonthDay\n | MonthDay\n | MonthLong\n | MonthShort\n | MonthYear\n | TimeStamp\n | YearMonthDay,\n) => intlFormat(new Date(date), Object.assign(dFormat), { locale: getLocale() })\n","export interface Account {\n account_number?: string\n account_subtype?: AccountSubType\n account_type: AccountType\n apr?: number\n apy?: number\n available_balance?: number\n balance?: number\n balance_updated_at?: number\n cash_balance?: number\n credit_limit?: number\n current_balance?: number\n currency_code?: string\n day_payment_is_due?: number\n display_order?: number\n external_guid?: string\n feed_account_type?: number\n feed_apr?: number\n feed_apy?: number\n feed_credit_limit?: number\n feed_day_payment_is_due?: number\n feed_interest_rate?: number\n feed_is_closed?: boolean\n feed_localized_name?: string\n feed_name?: string\n feed_nickname?: string\n feed_original_balance?: number\n flags?: number\n guid: string\n institution_guid?: string\n interest_rate?: number\n interest_rate_set_by?: number\n interestRate?: number\n is_closed: boolean\n is_deleted: boolean\n is_excluded_from_accounts: boolean\n is_excluded_from_budgets: boolean\n is_excluded_from_cash_flow: boolean\n is_excluded_from_debts: boolean\n is_excluded_from_goals: boolean\n is_excluded_from_investments: boolean\n is_excluded_from_net_worth: boolean\n is_excluded_from_spending: boolean\n is_excluded_from_transactions: boolean\n is_excluded_from_trends: boolean\n is_hidden: boolean\n is_manual: boolean\n is_personal: boolean\n localized_name?: string\n member_guid?: string\n member_is_managed_by_user: boolean\n metadata?: string\n minimum_payment?: number\n name?: string\n nickname?: string\n original_balance?: number\n payment_due_at?: number\n pending_balance?: number\n property_type?: PropertyType\n revision?: number\n updated_at?: number\n user_guid?: string\n user_name?: string\n\n // UI Added fields\n memberName?: string\n connectionStatus?: ConnectionStatus\n\n // UI Added fields from Pulse\n displayName?: string\n truncatedDisplayName?: string\n institutionName?: string\n}\n\nexport interface DetailedAccount extends Account {\n institution_name: string\n isEnabled: boolean\n name: string\n}\n\nexport interface Member {\n aggregation_status: number\n connection_status: number\n guid: string\n institution_guid: string\n institution_name?: string\n institution_url?: string\n is_being_aggregated: boolean\n is_manual: boolean\n is_managed_by_user: boolean\n is_oauth: boolean\n last_job_guid?: string\n last_job_status?: string\n last_update_time?: number\n metadata?: string\n mfa: any\n most_recent_job_guid?: string\n needs_updated_credentials: boolean\n name: string\n process_status?: number\n revision: number\n user_guid: string\n oauth_window_uri?: string\n verification_is_enabled: boolean\n tax_statement_is_enabled: boolean\n successfully_aggregated_at?: number\n\n // UI Added fields\n connectionStatus?: ConnectionStatus\n}\n\nexport interface MonthlyAccountBalance {\n account_guid: string\n balance: number\n credit_transaction_total: number\n debit_transaction_total: number\n id: string\n month: number\n transaction_total: number\n user_guid: string\n year: number\n year_month: number\n}\n\nexport enum AccountType {\n ANY = 0,\n CHECKING = 1,\n SAVINGS = 2,\n LOAN = 3,\n CREDIT_CARD = 4,\n INVESTMENT = 5,\n LINE_OF_CREDIT = 6,\n MORTGAGE = 7,\n PROPERTY = 8,\n CASH = 9,\n INSURANCE = 10,\n PREPAID = 11,\n CHECKING_LINE_OF_CREDIT = 12,\n DIGITAL_WALLET = 13,\n}\n\nexport enum AccountSubType {\n NONE = 0,\n MONEY_MARKET = 1,\n CERTIFICATE_OF_DEPOSIT = 2,\n AUTO = 3,\n STUDENT = 4,\n SMALL_BUSINESS = 5,\n PERSONAL = 6,\n PERSONAL_WITH_COLLATERAL = 7,\n HOME_EQUITY = 8,\n PLAN_401_K = 9,\n PLAN_403_B = 10,\n PLAN_529 = 11,\n IRA = 12,\n ROLLOVER_IRA = 13,\n ROTH_IRA = 14,\n TAXABLE = 15,\n NON_TAXABLE = 16,\n BROKERAGE = 17,\n TRUST = 18,\n UNIFORM_GIFTS_TO_MINORS_ACT = 19,\n PLAN_457 = 20,\n PENSION = 21,\n EMPLOYEE_STOCK_OWNERSHIP_PLAN = 22,\n SIMPLIFIED_EMPLOYEE_PENSION = 23,\n SIMPLE_IRA = 24,\n BOAT = 25,\n POWERSPORTS = 26,\n RV = 27,\n HELOC = 28,\n PLAN_ROTH_401_K = 29,\n FIXED_ANNUITY = 30,\n VARIABLE_ANNUITY = 31,\n VEHICLE_INSURANCE = 32,\n DISABILITY = 33,\n HEALTH = 34,\n LONG_TERM_CARE = 35,\n PROPERTY_AND_CASUALTY = 36,\n UNIVERSAL_LIFE = 37,\n TERM_LIFE = 38,\n WHOLE_LIFE = 39,\n ACCIDENTAL_DEATH_AND_DISMEMBERMENT = 40,\n VARIABLE_UNIVERSAL_LIFE = 41,\n HSA = 42,\n TAX_FREE_SAVINGS_ACCOUNT = 43,\n INDIVIDUAL = 44,\n REGISTERED_RETIREMENT_INCOME_FUND = 45,\n CASH_MANAGEMENT_ACCOUNT = 46,\n EMPLOYEE_STOCK_PURCHASE_PLAN = 47,\n REGISTERED_EDUCATION_SAVINGS_PLAN = 48,\n PROFIT_SHARING_PLAN = 49,\n UNIFORM_TRANSFER_TO_MINORS_ACT = 50,\n PLAN_401_A = 51,\n SARSEP_IRA = 52,\n FIXED_ANNUITY_TRADITIONAL_IRA = 53,\n VARIABLE_ANNUITY_TRADITIONAL_IRA = 54,\n SEPP_IRA = 55,\n INHERITED_TRADITIONAL_IRA = 56,\n FIXED_ANNUITY_ROTH_IRA = 57,\n VARIABLE_ANNUITY_ROTH_IRA = 58,\n INHERITED_ROTH_IRA = 59,\n COVERDELL = 60,\n ADVISORY_ACCOUNT = 61,\n BROKERAGE_MARGIN = 62,\n CHARITABLE_GIFT_ACCOUNT = 63,\n CHURCH_ACCOUNT = 64,\n CONSERVATORSHIP = 65,\n CUSTODIAL = 66,\n DEFINED_BENEFIT_PLAN = 67,\n DEFINED_CONTRIBUTION_PLAN = 68,\n EDUCATIONAL = 69,\n ESTATE = 70,\n EXECUTOR = 71,\n GROUP_RETIREMENT_SAVINGS_PLAN = 72,\n GUARANTEED_INVESTMENT_CERTIFICATE = 73,\n HRA = 74,\n INDEXED_ANNUITY = 75,\n INVESTMENT_CLUB = 76,\n IRREVOCABLE_TRUST = 77,\n JOINT_TENANTS_BY_ENTIRITY = 78,\n JOINT_TENANTS_COMMUNITY_PROPERTY = 79,\n JOINT_TENANTS_IN_COMMON = 80,\n JOINT_TENANTS_WITH_RIGHTS_OF_SURVIVORSHIP = 81,\n KEOUGH_PLAN = 82,\n LIFE_INCOME_FUND = 83,\n LIVING_TRUST = 84,\n LOCKED_IN_RETIREMENT_ACCOUNT = 85,\n LOCKED_IN_RETIREMENT_INVESTMENT_FUND = 86,\n LOCKED_IN_RETIREMENT_SAVINGS_ACCOUNT = 87,\n MONEY_PURCHASE_PLAN = 88,\n PARTNERSHIP = 89,\n PLAN_409_A = 90,\n PLAN_ROTH_403_B = 91,\n REGISTERED_DISABILITY_SAVINGS_PLAN = 92,\n REGISTERED_LOCKED_IN_SAVINGS_PLAN = 93,\n REGISTERED_PENSION_PLAN = 94,\n REGISTERED_RETIREMENT_SAVINGS_PLAN = 95,\n REVOCABLE_TRUST = 96,\n ROTH_CONVERSION = 97,\n SOLE_PROPRIETORSHIP = 98,\n SPOUSAL_IRA = 99,\n SPOUSAL_ROTH_IRA = 100,\n TESTAMENTARY_TRUST = 101,\n THRIFT_SAVINGS_PLAN = 102,\n INHERITED_ANNUITY = 103,\n CORPORATE_ACCOUNT = 104,\n LIMITED_LIABILITY_ACCOUNT = 105,\n HSA_SAVINGS = 106,\n HSA_CHECKING = 107,\n}\n\nexport enum PropertyType {\n REAL_ESTATE = 0,\n VEHICLE = 1,\n ART = 2,\n JEWELRY = 3,\n FURNITURE = 4,\n APPLIANCES = 5,\n COMPUTER = 6,\n ELECTRONICS = 7,\n SPORTS_EQUIPMENT = 8,\n MISCELLANEOUS = 9,\n}\n\nexport enum ConnectionStatusEnums {\n CREATED = 0, // The member is new and has not aggregated yet\n PREVENTED = 1, // MX preventing aggregation until credentials are updated\n DENIED = 2, // Invalid credentials\n CHALLENGED = 3, // MFA presented\n REJECTED = 4, // MFA answered incorrectly\n LOCKED = 5, // Institution is preventing authentication, user must contact FI\n CONNECTED = 6, // Successfully authenticated and aggregating data\n IMPEDED = 7, // User attention is needed in online banking (marketing message, terms and conditions etc.)\n RECONNECTED = 8, // The connection has been migrated, we will not aggregate until user interacts with UI\n DEGRADED = 9, // Aggregation has failed for a short period with a minimum number of attempts\n DISCONNECTED = 10, // Aggregation has failed for an extended period of time with a minimum number of attempts\n DISCONTINUED = 11, // The connection to this institution is no longer available\n CLOSED = 12, // The user, MX, the client or partner have marked the account as closed\n DELAYED = 13, // Aggregation has taken longer than expected without being CONNECTED\n FAILED = 14, // Aggregation failed without being CONNECTED\n UPDATED = 15, // Credenitals have been updated, but the member has not yet been CONNECTED\n DISABLED = 16, // Aggregation has been momentarily paused, but the member is still CONNECTED\n IMPORTED = 17, // Member was imported from another provider using the MDX Migration API\n RESUMED = 18, // MFA has been answered and has not yet been CONNECTED\n EXPIRED = 19, // MFA has not been answered before job timed out\n IMPAIRED = 20, // Memeber is missing some or all credentials needed to connect\n PENDING = 21, // OAuth member created but waiting for authentication redirect // Not visible to user\n}\n\nexport const ProcessingStatuses = [\n ConnectionStatusEnums.CREATED,\n ConnectionStatusEnums.UPDATED,\n ConnectionStatusEnums.RESUMED,\n]\n\nexport const MfaStatuses = [ConnectionStatusEnums.CHALLENGED, ConnectionStatusEnums.REJECTED]\n\nexport const ErrorStatuses = [\n ConnectionStatusEnums.PREVENTED,\n ConnectionStatusEnums.DENIED,\n ConnectionStatusEnums.LOCKED,\n ConnectionStatusEnums.IMPEDED,\n ConnectionStatusEnums.DEGRADED,\n ConnectionStatusEnums.DISCONNECTED,\n ConnectionStatusEnums.DISCONTINUED,\n ConnectionStatusEnums.CLOSED,\n ConnectionStatusEnums.DELAYED,\n ConnectionStatusEnums.FAILED,\n ConnectionStatusEnums.DISABLED,\n ConnectionStatusEnums.IMPORTED,\n ConnectionStatusEnums.EXPIRED,\n ConnectionStatusEnums.IMPAIRED,\n]\n\nexport const NonConnectedStatuses = [...ErrorStatuses, ...MfaStatuses]\n\nexport enum ConnectionStatus {\n Connected = 'Connected',\n Error = 'Error',\n Processing = 'Processing',\n RequiresMfa = 'RequiresMfa',\n}\n\nexport const StatusName: any = {\n [ConnectionStatusEnums.CHALLENGED]: 'Challenged',\n [ConnectionStatusEnums.CLOSED]: 'Closed',\n [ConnectionStatusEnums.DEGRADED]: 'Degraded',\n [ConnectionStatusEnums.DELAYED]: 'Delayed',\n [ConnectionStatusEnums.DENIED]: 'Denied',\n [ConnectionStatusEnums.DISABLED]: 'Disabled',\n [ConnectionStatusEnums.DISCONNECTED]: 'Disconnected',\n [ConnectionStatusEnums.DISCONTINUED]: 'Discontinued',\n [ConnectionStatusEnums.EXPIRED]: 'Expired',\n [ConnectionStatusEnums.FAILED]: 'Failed',\n [ConnectionStatusEnums.IMPAIRED]: 'Impaired',\n [ConnectionStatusEnums.IMPEDED]: 'Impeded',\n [ConnectionStatusEnums.IMPORTED]: 'Imported',\n [ConnectionStatusEnums.LOCKED]: 'Locked',\n [ConnectionStatusEnums.PREVENTED]: 'Prevented',\n [ConnectionStatusEnums.REJECTED]: 'Rejected',\n}\n\nexport const AccountTypeName: any = {\n [AccountType.ANY]: 'Any',\n [AccountType.CASH]: 'Cash',\n [AccountType.CHECKING]: 'Checking',\n [AccountType.CHECKING_LINE_OF_CREDIT]: 'Checking Line of Credit',\n [AccountType.CREDIT_CARD]: 'Credit Card',\n [AccountType.DIGITAL_WALLET]: 'Digital Wallet',\n [AccountType.INSURANCE]: 'Insurance',\n [AccountType.INVESTMENT]: 'Investment',\n [AccountType.LINE_OF_CREDIT]: 'Line of Credit',\n [AccountType.LOAN]: 'Loan',\n [AccountType.MORTGAGE]: 'Mortgage',\n [AccountType.PREPAID]: 'Prepaid',\n [AccountType.PROPERTY]: 'Property',\n [AccountType.SAVINGS]: 'Savings',\n}\n\nexport const AccountIcon: any = {\n [AccountType.ANY]: 'account_balance',\n [AccountType.CASH]: 'monetization_on',\n [AccountType.CHECKING]: 'checkbook',\n [AccountType.CHECKING_LINE_OF_CREDIT]: 'checkbook', // Checking line of credit has the same icon as checking\n [AccountType.CREDIT_CARD]: 'credit_card',\n [AccountType.DIGITAL_WALLET]: 'wallet',\n [AccountType.INSURANCE]: 'monitor_heart',\n [AccountType.INVESTMENT]: 'trending_up',\n [AccountType.LINE_OF_CREDIT]: 'add_credit',\n [AccountType.LOAN]: 'loans',\n [AccountType.MORTGAGE]: 'house',\n [AccountType.PREPAID]: 'credit_card',\n [AccountType.PROPERTY]: 'key',\n [AccountType.SAVINGS]: 'savings',\n}\n\nexport const AccountIconVariants: any = {\n [AccountType.INVESTMENT]: 'bid_landscape',\n}\n\nexport const PropertyTypeName: any = {\n [PropertyType.REAL_ESTATE]: 'Real Estate',\n [PropertyType.VEHICLE]: 'Vehicle',\n [PropertyType.ART]: 'Art',\n [PropertyType.JEWELRY]: 'Jewelry',\n [PropertyType.FURNITURE]: 'Furniture',\n [PropertyType.APPLIANCES]: 'Appliances',\n [PropertyType.COMPUTER]: 'Computer',\n [PropertyType.ELECTRONICS]: 'Electronics',\n [PropertyType.SPORTS_EQUIPMENT]: 'Sports Equipment',\n [PropertyType.MISCELLANEOUS]: 'Miscellaneous',\n}\n\nexport const PropertyIcon: any = {\n [PropertyType.REAL_ESTATE]: 'home_work',\n [PropertyType.VEHICLE]: 'directions_car',\n [PropertyType.ART]: 'insert_photo',\n [PropertyType.JEWELRY]: 'diamond',\n [PropertyType.FURNITURE]: 'chair',\n [PropertyType.APPLIANCES]: 'kitchen',\n [PropertyType.COMPUTER]: 'computer',\n [PropertyType.ELECTRONICS]: 'camera_alt',\n [PropertyType.SPORTS_EQUIPMENT]: 'sports_baseball',\n [PropertyType.MISCELLANEOUS]: 'monetization_on',\n}\n","import { AccountType } from '../types/Account'\n\nexport const INCOME_ACCOUNT_TYPES = [\n AccountType.ANY,\n AccountType.CASH,\n AccountType.CHECKING,\n AccountType.DIGITAL_WALLET,\n AccountType.PREPAID,\n AccountType.SAVINGS,\n]\n\nexport const PAYMENT_ACCOUNT_TYPES = [\n AccountType.CHECKING_LINE_OF_CREDIT,\n AccountType.CREDIT_CARD,\n AccountType.LINE_OF_CREDIT,\n AccountType.LOAN,\n AccountType.MORTGAGE,\n]\n\nexport const SPENDING_ACCOUNT_TYPES = [\n AccountType.ANY,\n AccountType.CASH,\n AccountType.CHECKING,\n AccountType.CHECKING_LINE_OF_CREDIT,\n AccountType.CREDIT_CARD,\n AccountType.DIGITAL_WALLET,\n AccountType.LINE_OF_CREDIT,\n AccountType.PREPAID,\n AccountType.SAVINGS,\n]\n","export const CategoryGuids = {\n // Top-level categories\n AUTO_AND_TRANSPORT: 'CAT-7829f71c-2e8c-afa5-2f55-fa3634b89874',\n BILLS_AND_UTILITIES: 'CAT-79b02f2f-2adc-88f0-ac2b-4e71ead9cfc8',\n BUSINESS_SERVICES: 'CAT-94b11142-e97b-941a-f67f-6e18d246a23f',\n EDUCATION: 'CAT-bf5c9cca-c96b-b50d-440d-38d9adfda5b0',\n ENTERTAINMENT: 'CAT-e04e9d1e-e041-c315-2e50-094143ab3f73',\n FEES_AND_CHARGES: 'CAT-d73ee74b-13a4-ac3e-4015-fc4ba9a62b2a',\n FINANCIAL: 'CAT-6c7de3f8-de6c-7061-1dd2-b093044014bf',\n FOOD_AND_DINING: 'CAT-bd56d35a-a9a7-6e10-66c1-5b9cc1b6c81a',\n GIFTS_AND_DONATIONS: 'CAT-8edf9663-623e-4735-490e-31288f0a70b0',\n HEALTH_AND_FITNESS: 'CAT-52fa4693-c088-afb2-2a99-7bc39bb23a0f',\n HOME: 'CAT-b709172b-4eb7-318e-3b5d-e0f0500b32ac',\n INCOME: 'CAT-bf9f3294-4c40-1677-d269-54fbc189faf3',\n INVESTMENTS: 'CAT-ccd42390-9e8c-3fb6-a5d9-6c31182d9c5c',\n KIDS: 'CAT-0cb1d99d-f558-99e3-2282-b31f359b411a',\n PERSONAL_CARE: 'CAT-e5154228-fe45-790d-a280-f6bf5ae5ac9f',\n PETS: 'CAT-7cccbafa-87d7-c9a6-661b-8b3402fe9e78',\n SHOPPING: 'CAT-aad51b46-d6f7-3da5-fd6e-492328b3023f',\n TAXES: 'CAT-d00fc539-aa14-009b-4ffb-7e8c7b839954',\n TRANSFER: 'CAT-bce48142-fea4-ff45-20d9-0a642d44de83',\n TRAVEL: 'CAT-ea23d844-cbd1-eb10-f6ac-0df9610e59ae',\n UNCATEGORIZED: 'CAT-d7851c65-3353-e490-1953-fb9235e681e4',\n // Subcategories\n LOCAL_TAX: 'CAT-0bbdacce-ba14-3e73-e1aa-cc64e671575c',\n WITHDRAWAL: 'CAT-00c762a2-be42-c735-2d3f-b14a1e58453f',\n TRADE_COMMISSIONS: 'CAT-1a01ddd4-9a37-b96b-33dc-6c68457e7806',\n BABYSITTER_DAYCARE: 'CAT-2ba97a5c-a371-3b4f-d018-cba64bb9767a',\n CHILD_SUPPORT: 'CAT-2cb0a3a8-3f05-9325-1203-27ed2d619dce',\n CREDIT_CARD_PAYMENT: 'CAT-2cc9b500-e09d-88be-e3e0-0a8a82a54586',\n STUDENT_LOAN: 'CAT-2ce4972e-5620-57be-8475-d084edf88888',\n LIFE_INSURANCE: 'CAT-2cf64b94-e966-0949-0d07-b211080ddaa6',\n PRINTING: 'CAT-3b09fb0b-3296-c76c-2bbd-a2bce0012d83',\n FINANCIAL_ADVISOR: 'CAT-3db5697d-5dce-6bd9-c08f-5065b25e96c8',\n INTEREST_INCOME: 'CAT-5aa555dc-a071-c727-8d04-cb337832d342',\n LATE_FEE: 'CAT-5bfddc95-a506-b1d2-0f73-63b1afeddb91',\n LAWN_GARDEN: 'CAT-5cc7f5e2-3f2e-61ce-52e7-4acf366c2ee3',\n FINANCE_CHARGE: 'CAT-5dab8347-e0b4-daf9-0a65-f2be80feb8ad',\n FRAUD_PROTECTION: 'CAT-5f7f2084-6f8a-d927-6fa7-8e699912432a',\n MOVIES_DVDS: 'CAT-6ab65efd-36e4-69ca-969a-a7304d05240a',\n HOME_INSURANCE: 'CAT-6cb40bc6-0c0d-6fae-db3b-62a6bc4bb1a2',\n CASH: 'CAT-08a5d861-2890-686e-ebaf-d7632ec88540',\n TUITION: 'CAT-8b01fafd-9bf5-7999-49c9-cb67da50b14d',\n HEALTH_INSURANCE: 'CAT-8faa2a11-f393-9c13-2885-e7d11fa6a51a',\n DIVIDEND_CAP_GAINS: 'CAT-9b21122f-bd17-97ce-ef5c-3f034e75fd6c',\n ALCOHOL_BARS: 'CAT-9d58b17b-0982-18b5-5a6e-8a76337c4f88',\n LEGAL: 'CAT-13c1e57c-3749-41b4-3bc4-b1b334adab85',\n PUBLIC_TRANSPORTATION: 'CAT-19e6ec13-83ed-5511-7f75-3688d3f97a8e',\n MORTGAGE_RENT: 'CAT-23b4b4c6-5fbb-9299-b887-4b56196e6fb4',\n HOTEL: 'CAT-28be9904-9f4c-c4af-d2b7-bb24763ae0ae',\n TRANSFER_FOR_CASH_SPENDING: 'CAT-28d5fc92-cb41-8daa-3ab7-6f7bbde118fb',\n UTILITIES: 'CAT-56a2979d-d6df-25da-f357-06282f08208e',\n DEPOSIT: 'CAT-58aced66-6d70-4024-7667-77e98b6e5805',\n HOME_PHONE: 'CAT-60d81dd3-8ac1-a6fb-b181-b736dbb42be3',\n SERVICE_PARTS: 'CAT-67a20fb1-1a61-dc27-3fff-f28fa904025f',\n INTERNET: 'CAT-78d29c63-54db-197d-9851-feeb94cf6e10',\n BOOKS: 'CAT-80a40aa1-9f7e-2393-0dfe-b222dc8099a2',\n NEWSPAPERS_MAGAZINES: 'CAT-84f5a582-f620-bea1-fb2c-a746094e9955',\n FAST_FOOD: 'CAT-88cbb033-0fc1-ff06-6532-0f357c0f5081',\n COFFEE_SHOPS: 'CAT-93ebd80b-4801-cf52-e844-91594ed4c217',\n SELL: 'CAT-095e8e70-f5fa-9e68-8187-6cac76d14f85',\n OFFICE_SUPPLIES: 'CAT-97a2b899-5a32-4196-b87c-a8e65d8a9849',\n PET_GROOMING: 'CAT-99b03e0f-c678-268b-a97c-81092e68efab',\n AMUSEMENT: 'CAT-163c92ab-5ac1-3125-6a0b-c3aff5cdbb59',\n BOOKS_SUPPLIES: 'CAT-167d816f-c68e-9988-e064-173dc6417a90',\n VACATION: 'CAT-206fbc35-a569-c89a-30be-a3b65d0fbea7',\n SERVICE_FEE: 'CAT-386e01dd-8cc0-a433-f4a9-b3a2d153abbf',\n GIFT: 'CAT-465a2e70-099b-dc43-4422-913c21311002',\n CHARITY: 'CAT-583f1ede-3608-3ec6-b39b-0874198626ed',\n PARKING: 'CAT-726da718-d572-1e4d-7c3f-0b8b5370fe71',\n SHIPPING: 'CAT-748efd05-e27a-5c79-1217-681a0ec5cc67',\n ARTS: 'CAT-967a9441-5694-9419-6b40-67f15cd55fe4',\n PAYCHECK: 'CAT-982ea9e6-3f0e-0c5b-611b-6657a10ba819',\n FURNISHINGS: 'CAT-2910e436-7fed-f922-184c-60bc1b6c5417',\n RESTAURANTS: 'CAT-006862be-64a0-e778-f035-0936445b9c16',\n SPA_MASSAGE: 'CAT-8008cdab-ba5c-26e9-310d-a3ff4afeeb62',\n RENTAL_CAR_TAXI: 'CAT-9588eaad-90a4-bb5c-66c8-1812503d0db8',\n ALLOWANCE: 'CAT-9961e379-d9e9-490c-1c4b-bfa233899167',\n BANKING_FEE: 'CAT-30283e5b-f0fb-d8ab-a9fd-de992b508eac',\n BUY: 'CAT-70215a5e-bd15-e0ac-3842-058b5e8e99b7',\n STATE_TAX: 'CAT-7248227b-303e-ee19-e30c-c4f389da169b',\n TOYS: 'CAT-7524310a-da68-ac09-2312-71ca60a40ec0',\n KIDS_ACTIVITIES: 'CAT-32012156-b11d-a1db-9697-b15432e18215',\n RENTAL_INCOME: 'CAT-67070667-8b54-b450-4e84-5f8da2d70d85',\n VETERINARY: 'CAT-71380790-762a-6e2a-d79e-d7f47689af25',\n SPORTING_GOODS: 'CAT-a9abd9b1-2e2c-4236-040d-fb414d334419',\n LAUNDRY: 'CAT-a9fb2085-ce57-a196-4cbd-338c85bae0b0',\n CLOTHING: 'CAT-a96c2e17-f69a-9805-34aa-633276a42cec',\n PHARMACY: 'CAT-a5600b35-c9b1-347d-f678-781597851104',\n HOME_SERVICES: 'CAT-a64154ee-d5e9-09c7-d5f1-59b3273c6e3c',\n ATM_FEE: 'CAT-ac2eba3a-100a-30ac-09c3-d7d88415ca1a',\n HAIR: 'CAT-af671119-50a2-636c-ddfe-c794c38e8181',\n GROCERIES: 'CAT-b1de2a04-db08-b6ed-f6fe-ca2f5b11c2d0',\n GAS: 'CAT-b6d63a19-30a7-e852-2703-bdfb4072289e',\n FEDERAL_TAX: 'CAT-b8cc4011-cdc9-10b0-b79d-bf1d534296dc',\n HOSTING: 'CAT-b74fdd98-4391-8015-eafa-e9ca0fad3bee',\n TELEVISION: 'CAT-b316e683-c898-6497-a476-6bc48d12e51d',\n MOBILE_PHONE: 'CAT-b4789667-6acc-a112-975e-15746003ed61',\n BABY_SUPPLIES: 'CAT-c9c99041-e009-4a45-4b1d-fa92daeb5dd4',\n MUSIC: 'CAT-c874ccff-d069-40df-d7c5-ddba6fbdd225',\n MORTGAGE_PAYMENT: 'CAT-c94442a5-a762-8830-4c80-2a2f6a79e627',\n SPORTS: 'CAT-cb3de962-ea82-27a9-d096-c232caeb96bd',\n AUTO_PAYMENT: 'CAT-cb93691a-684d-b326-4c32-f8abaecfde90',\n GYM: 'CAT-cd9f9f60-622d-0488-d203-044c8726a7eb',\n REIMBURSEMENT: 'CAT-ce7b7bc8-71b7-9f41-af10-b8c2d5bafc37',\n AIR_TRAVEL: 'CAT-cf82d772-fbe2-4658-303a-f4cd13d9c3c2',\n EYECARE: 'CAT-cf183729-fb60-d16a-32d0-2e1d21ff21cd',\n HOBBIES: 'CAT-d1e54c52-80cc-01ba-3907-5bbdaa0ff521',\n SALES_TAX: 'CAT-d1244982-f8d0-09b8-77bb-6495c6e0c12a',\n ELECTRONICS_SOFTWARE: 'CAT-db5d480c-5130-b42e-def4-f6dabf9c1d10',\n DOCTOR: 'CAT-db6391b3-c218-fbe5-e496-139dca993645',\n RETURNED_PURCHASE: 'CAT-dc201021-6aa2-636b-f041-8577e6f1bc73',\n HOME_IMPROVEMENT: 'CAT-ddc9b8e0-a9a1-e31e-a467-2c33e553afd9',\n AUTO_INSURANCE: 'CAT-de7c2dc7-90e6-85a2-6509-5ec10942e887',\n PROPERTY_TAX: 'CAT-dfdf9324-3c48-589d-8886-bb21bb73b5d6',\n DOMAIN_NAMES: 'CAT-e7c5ebc7-f73d-955a-db06-3724bbcf6faa',\n HOME_SUPPLIES: 'CAT-e671e3a1-b7cb-f0a9-ac6e-bc4632245c31',\n ADVERTISING: 'CAT-e6682ebe-f239-c654-8233-0970b94cc162',\n CHECK: 'CAT-ea6db36f-3985-719d-1304-ccb7eeef5ecc',\n DENTIST: 'CAT-ee48b740-c981-778b-3c02-04540dec0262',\n BONUS: 'CAT-f52f2a88-2cb6-04e4-e36a-58f7b7c6a798',\n PET_FOOD_SUPPLIES: 'CAT-fbcdb437-2533-2857-1d1a-0624c9d9e1dc',\n}\n\nexport const PaymentCategories = [\n CategoryGuids.CREDIT_CARD_PAYMENT,\n CategoryGuids.MORTGAGE_PAYMENT,\n CategoryGuids.AUTO_PAYMENT,\n]\n\nexport const CategoryGuidToName = {\n // Top-level categories\n [CategoryGuids.AUTO_AND_TRANSPORT]: 'Auto & Transport',\n [CategoryGuids.BILLS_AND_UTILITIES]: 'Bills & Utilities',\n [CategoryGuids.BUSINESS_SERVICES]: 'Business Services',\n [CategoryGuids.EDUCATION]: 'Education',\n [CategoryGuids.ENTERTAINMENT]: 'Entertainment',\n [CategoryGuids.FEES_AND_CHARGES]: 'Fees & Charges',\n [CategoryGuids.FINANCIAL]: 'Financial',\n [CategoryGuids.FOOD_AND_DINING]: 'Food & Dining',\n [CategoryGuids.GIFTS_AND_DONATIONS]: 'Gifts & Donations',\n [CategoryGuids.HEALTH_AND_FITNESS]: 'Health & Fitness',\n [CategoryGuids.HOME]: 'Home',\n [CategoryGuids.INCOME]: 'Income',\n [CategoryGuids.INVESTMENTS]: 'Investments',\n [CategoryGuids.KIDS]: 'Kids',\n [CategoryGuids.PERSONAL_CARE]: 'Personal Care',\n [CategoryGuids.PETS]: 'Pets',\n [CategoryGuids.SHOPPING]: 'Shopping',\n [CategoryGuids.TAXES]: 'Taxes',\n [CategoryGuids.TRANSFER]: 'Transfer',\n [CategoryGuids.TRAVEL]: 'Travel',\n [CategoryGuids.UNCATEGORIZED]: 'Uncategorized',\n // Subcategories\n [CategoryGuids.LOCAL_TAX]: 'Local Tax',\n [CategoryGuids.WITHDRAWAL]: 'Withdrawal',\n [CategoryGuids.TRADE_COMMISSIONS]: 'Trade Commissions',\n [CategoryGuids.BABYSITTER_DAYCARE]: 'Babysitter & Daycare',\n [CategoryGuids.CHILD_SUPPORT]: 'Child Support',\n [CategoryGuids.CREDIT_CARD_PAYMENT]: 'Credit Card Payment',\n [CategoryGuids.STUDENT_LOAN]: 'Student Loan',\n [CategoryGuids.LIFE_INSURANCE]: 'Life Insurance',\n [CategoryGuids.PRINTING]: 'Printing',\n [CategoryGuids.FINANCIAL_ADVISOR]: 'Financial Advisor',\n [CategoryGuids.INTEREST_INCOME]: 'Interest Income',\n [CategoryGuids.LATE_FEE]: 'Late Fee',\n [CategoryGuids.LAWN_GARDEN]: 'Lawn & Garden',\n [CategoryGuids.FINANCE_CHARGE]: 'Finance Charge',\n [CategoryGuids.FRAUD_PROTECTION]: 'Fraud Protection',\n [CategoryGuids.MOVIES_DVDS]: 'Movies & DVDs',\n [CategoryGuids.HOME_INSURANCE]: 'Home Insurance',\n [CategoryGuids.CASH]: 'Cash',\n [CategoryGuids.TUITION]: 'Tuition',\n [CategoryGuids.HEALTH_INSURANCE]: 'Health Insurance',\n [CategoryGuids.DIVIDEND_CAP_GAINS]: 'Dividend & Cap Gains',\n [CategoryGuids.ALCOHOL_BARS]: 'Alcohol & Bars',\n [CategoryGuids.LEGAL]: 'Legal',\n [CategoryGuids.PUBLIC_TRANSPORTATION]: 'Public Transportation',\n [CategoryGuids.MORTGAGE_RENT]: 'Mortgage & Rent',\n [CategoryGuids.HOTEL]: 'Hotel',\n [CategoryGuids.TRANSFER_FOR_CASH_SPENDING]: 'Transfer for Cash Spending',\n [CategoryGuids.UTILITIES]: 'Utilities',\n [CategoryGuids.DEPOSIT]: 'Deposit',\n [CategoryGuids.HOME_PHONE]: 'Home Phone',\n [CategoryGuids.SERVICE_PARTS]: 'Service Parts',\n [CategoryGuids.INTERNET]: 'Internet',\n [CategoryGuids.BOOKS]: 'Books',\n [CategoryGuids.NEWSPAPERS_MAGAZINES]: 'Newspapers & Magazines',\n [CategoryGuids.FAST_FOOD]: 'Fast Food',\n [CategoryGuids.COFFEE_SHOPS]: 'Coffee Shops',\n [CategoryGuids.SELL]: 'Sell',\n [CategoryGuids.OFFICE_SUPPLIES]: 'Office Supplies',\n [CategoryGuids.PET_GROOMING]: 'Pet Grooming',\n [CategoryGuids.AMUSEMENT]: 'Amusement',\n [CategoryGuids.BOOKS_SUPPLIES]: 'Books & Supplies',\n [CategoryGuids.VACATION]: 'Vacation',\n [CategoryGuids.SERVICE_FEE]: 'Service Fee',\n [CategoryGuids.GIFT]: 'Gift',\n [CategoryGuids.CHARITY]: 'Charity',\n [CategoryGuids.PARKING]: 'Parking',\n [CategoryGuids.SHIPPING]: 'Shipping',\n [CategoryGuids.ARTS]: 'Arts',\n [CategoryGuids.PAYCHECK]: 'Paycheck',\n [CategoryGuids.FURNISHINGS]: 'Furnishings',\n [CategoryGuids.RESTAURANTS]: 'Restaurants',\n [CategoryGuids.SPA_MASSAGE]: 'Spa & Massage',\n [CategoryGuids.RENTAL_CAR_TAXI]: 'Rental Car & Taxi',\n [CategoryGuids.ALLOWANCE]: 'Allowance',\n [CategoryGuids.BANKING_FEE]: 'Banking Fee',\n [CategoryGuids.BUY]: 'Buy',\n [CategoryGuids.STATE_TAX]: 'State Tax',\n [CategoryGuids.TOYS]: 'Toys',\n [CategoryGuids.KIDS_ACTIVITIES]: 'Kids Activities',\n [CategoryGuids.RENTAL_INCOME]: 'Rental Income',\n [CategoryGuids.VETERINARY]: 'Veterinary',\n [CategoryGuids.SPORTING_GOODS]: 'Sporting Goods',\n [CategoryGuids.LAUNDRY]: 'Laundry',\n [CategoryGuids.CLOTHING]: 'Clothing',\n [CategoryGuids.PHARMACY]: 'Pharmacy',\n [CategoryGuids.HOME_SERVICES]: 'Home Services',\n [CategoryGuids.ATM_FEE]: 'ATM Fee',\n [CategoryGuids.HAIR]: 'Hair',\n [CategoryGuids.GROCERIES]: 'Groceries',\n [CategoryGuids.GAS]: 'Gas',\n [CategoryGuids.FEDERAL_TAX]: 'Federal Tax',\n [CategoryGuids.HOSTING]: 'Hosting',\n [CategoryGuids.TELEVISION]: 'Television',\n [CategoryGuids.MOBILE_PHONE]: 'Mobile Phone',\n [CategoryGuids.BABY_SUPPLIES]: 'Baby Supplies',\n [CategoryGuids.MUSIC]: 'Music',\n [CategoryGuids.MORTGAGE_PAYMENT]: 'Mortgage Payment',\n [CategoryGuids.SPORTS]: 'Sports',\n [CategoryGuids.AUTO_PAYMENT]: 'Auto Payment',\n [CategoryGuids.GYM]: 'Gym',\n [CategoryGuids.REIMBURSEMENT]: 'Reimbursement',\n [CategoryGuids.AIR_TRAVEL]: 'Air Travel',\n [CategoryGuids.EYECARE]: 'Eyecare',\n [CategoryGuids.HOBBIES]: 'Hobbies',\n [CategoryGuids.SALES_TAX]: 'Sales Tax',\n [CategoryGuids.ELECTRONICS_SOFTWARE]: 'Electronics & Software',\n [CategoryGuids.DOCTOR]: 'Doctor',\n [CategoryGuids.RETURNED_PURCHASE]: 'Returned Purchase',\n [CategoryGuids.HOME_IMPROVEMENT]: 'Home Improvement',\n [CategoryGuids.AUTO_INSURANCE]: 'Auto Insurance',\n [CategoryGuids.PROPERTY_TAX]: 'Property Tax',\n [CategoryGuids.DOMAIN_NAMES]: 'Domain Names',\n [CategoryGuids.HOME_SUPPLIES]: 'Home Supplies',\n [CategoryGuids.ADVERTISING]: 'Advertising',\n [CategoryGuids.CHECK]: 'Check',\n [CategoryGuids.DENTIST]: 'Dentist',\n [CategoryGuids.BONUS]: 'Bonus',\n [CategoryGuids.PET_FOOD_SUPPLIES]: 'Pet Food & Supplies',\n}\n\nexport const CategoryColors = {\n [CategoryGuids.AUTO_AND_TRANSPORT]: '#4B9DBC',\n [CategoryGuids.BILLS_AND_UTILITIES]: '#EF9B2C',\n [CategoryGuids.BUSINESS_SERVICES]: '#B3DE8C',\n [CategoryGuids.EDUCATION]: '#F8AB3A',\n [CategoryGuids.ENTERTAINMENT]: '#AB5B89',\n [CategoryGuids.FEES_AND_CHARGES]: '#FF9696',\n [CategoryGuids.FINANCIAL]: '#6BCDDB',\n [CategoryGuids.FOOD_AND_DINING]: '#58AC7B',\n [CategoryGuids.GIFTS_AND_DONATIONS]: '#347AA5',\n [CategoryGuids.HEALTH_AND_FITNESS]: '#5C446E',\n [CategoryGuids.HOME]: '#FFD84D',\n [CategoryGuids.INCOME]: '#133F49',\n [CategoryGuids.INVESTMENTS]: '#FF7070',\n [CategoryGuids.KIDS]: '#82D196',\n [CategoryGuids.PERSONAL_CARE]: '#338B7A',\n [CategoryGuids.PETS]: '#615BAB',\n [CategoryGuids.SHOPPING]: '#CF5F84',\n [CategoryGuids.TAXES]: '#32588D',\n [CategoryGuids.TRANSFER]: '#959CA6',\n [CategoryGuids.TRAVEL]: '#E37434',\n [CategoryGuids.UNCATEGORIZED]: '#FA5555',\n}\n\nexport const CategoryIcon = {\n [CategoryGuids.AUTO_AND_TRANSPORT]: 'directions_car',\n [CategoryGuids.BILLS_AND_UTILITIES]: 'electrical_services',\n [CategoryGuids.BUSINESS_SERVICES]: 'business_center',\n [CategoryGuids.EDUCATION]: 'school',\n [CategoryGuids.ENTERTAINMENT]: 'stadium',\n [CategoryGuids.FEES_AND_CHARGES]: 'problem',\n [CategoryGuids.FINANCIAL]: 'price_check',\n [CategoryGuids.FOOD_AND_DINING]: 'grocery',\n [CategoryGuids.GIFTS_AND_DONATIONS]: 'featured_seasonal_and_gifts',\n [CategoryGuids.HEALTH_AND_FITNESS]: 'ecg_heart',\n [CategoryGuids.HOME]: 'cottage',\n [CategoryGuids.INCOME]: 'monetization_on',\n [CategoryGuids.INVESTMENTS]: 'bid_landscape',\n [CategoryGuids.KIDS]: 'face',\n [CategoryGuids.PERSONAL_CARE]: 'volunteer_activism',\n [CategoryGuids.PETS]: 'pet_supplies',\n [CategoryGuids.SHOPPING]: 'shopping_cart',\n [CategoryGuids.TAXES]: 'heap_snapshot_large',\n [CategoryGuids.TRANSFER]: 'compare_arrows',\n [CategoryGuids.TRAVEL]: 'airplane_ticket',\n [CategoryGuids.UNCATEGORIZED]: 'category',\n UNKNOWN: 'help',\n}\n","export const MAX_MONEY_INPUT = 99999999.99\n\nexport enum CurrencyCodes {\n CAD = 'CAD',\n USD = 'USD',\n}\n","export enum RecurrenceTypes {\n Unknown = 0,\n EveryWeek = 1,\n EveryOtherWeek = 2,\n EveryMonth = 3,\n EveryOtherMonth = 4,\n EveryQuarter = 5,\n EveryOtherQuarter = 6,\n EveryYear = 7,\n}\n\nexport const RECURRENCE_COPY = [\n { id: RecurrenceTypes.Unknown, copy: 'frequency_unknown' },\n { id: RecurrenceTypes.EveryWeek, copy: 'frequency_every_week' },\n { id: RecurrenceTypes.EveryOtherWeek, copy: 'frequency_every_other_week' },\n { id: RecurrenceTypes.EveryMonth, copy: 'frequency_every_month' },\n { id: RecurrenceTypes.EveryOtherMonth, copy: 'frequency_every_other_month' },\n { id: RecurrenceTypes.EveryQuarter, copy: 'frequency_every_quarter' },\n { id: RecurrenceTypes.EveryOtherQuarter, copy: 'frequency_every_other_quarter' },\n { id: RecurrenceTypes.EveryYear, copy: 'frequency_every_year' },\n]\n","export const LOADING_STATUS = {\n ERROR: 'ERROR',\n LOADING: 'LOADING',\n SUCCESS: 'SUCCESS',\n}\n\nexport enum PlanTypes {\n SpendingPlan = 0,\n Budgets = 1,\n}\n\nexport enum IterationItemTypes {\n RecurringExpense = 0,\n PlannedExpense = 1,\n Other = 2,\n Income = 3,\n}\n","export const DEFAULT_DONUT_SIZE = 48\nexport const DEFAULT_STROKE_WIDTH = 4\n","export const enum Sizes {\n Small = 'small',\n Medium = 'medium',\n Large = 'large',\n}\n\nexport const TOUCH_TARGET = 44\n","import type { Category, CategoryTotal, DateRangeCategoryTotals, DetailedCategory } from '../types'\nimport { CategoryGuids } from '../constants'\n\nexport const getCategory = (\n categories: Category[],\n categoryGuid: string | undefined,\n): Category | undefined => {\n return categories.find((c) => c.guid === categoryGuid)\n}\n\nexport const getDetailedCategory = (\n detailedCategories: DetailedCategory[],\n guid: string | undefined,\n): DetailedCategory | undefined => {\n return detailedCategories.find((dc) => dc.guid === guid)\n}\n\nexport const getDetailedSubCategory = (\n detailedCategories: DetailedCategory[],\n guid: string | undefined,\n): DetailedCategory | undefined => {\n const parent = detailedCategories.find((dc) => dc.subCategories.find((sc) => sc.guid === guid))\n if (!parent) return undefined\n\n return parent.subCategories.find((sc) => sc.guid === guid)\n}\n\nexport const getCategoryTotalsByParent = (\n categories: Category[],\n dateRangeTotals: DateRangeCategoryTotals[],\n): CategoryTotal[] => {\n const categoryTotals = [] as CategoryTotal[]\n\n // Iterate over the category data from BE and roll up all categories into parent categories\n // acc is the accumulated category totals of type CategoryTotal that is initialized as an empty []\n // curr is the current DateRangeCategoryTotal\n\n for (const dateRangeTotal of dateRangeTotals) {\n const category = getCategory(categories, dateRangeTotal.category_guid)\n if (!category) continue\n\n const parentGuid = category.parent_guid ?? category.guid\n const parentCategory = getCategory(categories, parentGuid)\n if (!parentCategory) continue\n\n const categoryTotal = {\n amount: dateRangeTotal.total,\n category,\n guid: category.guid,\n subCategoryTotals: [],\n }\n\n const parentCategoryTotal = categoryTotals.find((ct) => ct.guid === parentGuid)\n if (parentCategoryTotal) {\n parentCategoryTotal.amount += dateRangeTotal.total\n parentCategoryTotal.subCategoryTotals.push(categoryTotal)\n } else {\n categoryTotals.push({\n amount: dateRangeTotal.total,\n category: parentCategory,\n guid: parentGuid,\n subCategoryTotals: [categoryTotal],\n })\n }\n }\n\n return categoryTotals\n}\n\nexport const isIncome = (categories: Category[], guid: string) => {\n const category = categories.find((c) => c.guid === guid)\n if (!category) return false\n\n return category.guid === CategoryGuids.INCOME || category.parent_guid === CategoryGuids.INCOME\n}\n","import React from 'react'\nimport { DynamicCopyElement } from '../types'\n\n// matches a pattern like \"static text _1{category_name} and _2{amount} more static text\"\nconst copyPattern = /(?<static>.*?)(?<dynamic>(?:_\\d+{(?:.*?)}))|(?<staticEnd>.+)/g\n\nexport const buildDynamicCopy = (str: string, ...args: DynamicCopyElement[]) => {\n if (!str) return ''\n\n const hasFormattedElement = args.some((arg) => typeof arg !== 'string')\n\n // finds all instances of matching pattern in given string\n const regexMatches = [...str.matchAll(copyPattern)]\n const matches = regexMatches.reduce(\n (acc: DynamicCopyElement[], match: RegExpMatchArray, matchIndex) => {\n const temp = [...acc]\n const groups = match.groups\n if (groups?.static) {\n temp.push(groups.static)\n }\n\n if (groups?.dynamic) {\n const curlyIndex = groups.dynamic.indexOf('{')\n const variableName = groups.dynamic.substring(curlyIndex + 1, groups.dynamic.length - 1)\n const index = Number(groups.dynamic.substring(1, curlyIndex))\n if (React.isValidElement(args[index - 1])) {\n const element = args[index - 1] as React.ReactElement\n const clonedElement = React.cloneElement(element, {\n key: `${variableName}-${matchIndex}`,\n })\n temp.push(clonedElement)\n } else {\n temp.push(args[index - 1])\n }\n }\n\n if (groups?.staticEnd) {\n temp.push(groups.staticEnd)\n }\n\n return temp\n },\n [],\n )\n\n return hasFormattedElement ? (matches as DynamicCopyElement[]) : (matches.join('') as string)\n}\n\nexport const buildPluralCopy = (\n strOne: string,\n strMulti: string,\n count: number,\n ...args: DynamicCopyElement[]\n) => {\n if (!strOne || !strMulti) return ''\n const str = count === 1 ? strOne : strMulti\n\n return buildDynamicCopy(str, ...args)\n}\n\nexport const getLocale = () => {\n return (\n (window as any)?.app?.options?.language ||\n document.querySelector('html')?.getAttribute('lang') ||\n 'en-US'\n ).toLowerCase()\n}\n","import { getLocale } from './Localization'\nimport { Honeybadger } from '@honeybadger-io/react'\n\nexport class Fetch {\n endpoint = '/'\n headers = {}\n\n constructor(endpoint: string, token: string) {\n this.endpoint = endpoint\n this.headers = {\n Accept: 'application/json',\n 'Accept-Language': getLocale(),\n 'Content-Type': 'application/json',\n 'MD-Session-Token': token,\n }\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 return response.text()\n } else {\n throw response\n }\n })\n .then((text) => (text.length ? JSON.parse(text) : {}))\n .then((data) => data)\n .catch((err) => {\n Honeybadger.notify(err)\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 response\n }\n\n return response.text()\n })\n .then((text) => (text.length ? JSON.parse(text) : {}))\n .then((data) => data)\n .catch((error) => {\n Honeybadger.notify(error)\n throw error\n })\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 return response.text()\n } else {\n return response.text().then((text) => {\n throw new Error(text)\n })\n }\n })\n .then((text) => (text.length ? JSON.parse(text) : {}))\n .then((data) => data)\n .catch((err) => {\n Honeybadger.notify(err)\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 return response.text()\n } else {\n return response.text().then((text) => {\n throw new Error(text)\n })\n }\n })\n .then((text) => (text.length ? JSON.parse(text) : {}))\n .then((data) => data)\n .catch((err) => {\n Honeybadger.notify(err)\n throw err\n })\n }\n}\n\nexport default Fetch\n","import numeral from 'numeral'\nimport type { RoundingFunction } from 'numeral'\nimport { getLocale } from './Localization'\nimport { CurrencyCodes } from '../constants'\n\n// enhances numeral's localization functionality by puting the $ in the correct place\nexport const formatCurrency = (\n amount: number | undefined,\n formatting: string,\n roundingFunction?: RoundingFunction,\n) => {\n switch (getLocale()) {\n case 'fr-ca': {\n return numeral(amount).format(`${formatting} $`, roundingFunction)\n }\n default: {\n return numeral(amount).format(`$${formatting}`, roundingFunction)\n }\n }\n}\n\nexport const getCurrencyCodes = () => {\n switch (getLocale()) {\n case 'fr-ca':\n return CurrencyCodes.CAD\n default:\n return CurrencyCodes.USD\n }\n}\n\n// will return `true` if value is a string number, like '99', which matches Serenity logic\nexport const isValidNumber = (value: any) =>\n value !== undefined && value !== null && value !== '' && isFinite(value)\n\nconst defaultPercentStyle = {\n style: 'percent',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n} as Intl.NumberFormatOptions\n\nexport const formatPercentage = (\n amount: number | string | undefined,\n options: Intl.NumberFormatOptions = defaultPercentStyle,\n) =>\n isValidNumber(amount)\n ? new Intl.NumberFormat(getLocale(), options).format(Number(amount))\n : amount\n\nexport const getPluralRules = (options: Intl.PluralRulesOptions) =>\n new Intl.PluralRules(getLocale(), options)\n\nexport const formatOrdinal = (\n number: number,\n options: Intl.PluralRulesOptions = { type: 'ordinal' },\n copy = {\n one: 'st',\n two: 'nd',\n few: 'rd',\n other: 'th',\n } as const,\n) => {\n const rule = getPluralRules(options).select(number)\n\n return `${number}${copy[rule as keyof typeof copy]}`\n}\n","import { addMonths } from 'date-fns/addMonths'\nimport { addQuarters } from 'date-fns/addQuarters'\nimport { addWeeks } from 'date-fns/addWeeks'\nimport { addYears } from 'date-fns/addYears'\nimport { getDay } from 'date-fns/getDay'\nimport { isBefore } from 'date-fns/isBefore'\nimport { nextDay } from 'date-fns/nextDay'\nimport { setDate } from 'date-fns/setDate'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { type Day } from 'date-fns/types'\nimport { DATE_FORMATS_INTL, formatDate } from '../constants'\n\nexport const getNextWeeklyDate = (date: Date): Date => {\n const dayOfWeek = getDay(date)\n let nextDate = nextDay(date, dayOfWeek as Day)\n while (isBefore(nextDate, startOfToday())) {\n nextDate = addWeeks(nextDate, 1)\n }\n return nextDate\n}\n\nexport const getNextBiWeeklyDate = (date: Date): Date => {\n const nextWeeklyday = getNextWeeklyDate(date)\n return addWeeks(nextWeeklyday, 1)\n}\n\nexport const getNextMonthlyDate = (date: Date): Date => {\n let nextDate = setDate(startOfToday(), date.getDate())\n while (isBefore(nextDate, startOfToday())) {\n nextDate = addMonths(nextDate, 1)\n }\n return nextDate\n}\n\nexport const getNextBiMonthlyDate = (date: Date): Date => {\n const nextMonthlyDate = getNextWeeklyDate(date)\n return addMonths(nextMonthlyDate, 1)\n}\n\nexport const getNextQuarterlyDate = (date: Date): Date => {\n let nextDate = addQuarters(date, 1)\n while (isBefore(nextDate, startOfToday())) {\n nextDate = addQuarters(nextDate, 1)\n }\n return nextDate\n}\n\nexport const getNextBiQuarterlyDate = (date: Date): Date => {\n const nextQuarterlyDate = getNextQuarterlyDate(date)\n return addQuarters(nextQuarterlyDate, 1)\n}\n\nexport const getNextYearlyDate = (date: Date): Date => {\n return addYears(date, 1)\n}\n\nexport const fromUnixUTC = (utcTime: number) => {\n const date = fromUnixTime(utcTime)\n return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate())\n}\n\nexport const fromUnixToDayOfWeekAndDate = (date: number) =>\n formatDate(fromUnixTime(date), DATE_FORMATS_INTL.DAY_OF_WEEK_MONTH_DAY)\n\nexport const fromTimestampToMonthYear = (timestamp?: number) =>\n timestamp ? formatDate(fromUnixTime(timestamp), DATE_FORMATS_INTL.MONTH_YEAR) : ''\n","import Bowser from 'bowser'\n\nimport { Fetch } from '../utils'\n\nimport { ApiEndpoints } from '../constants'\nimport { AnalyticsEvent } from '../types'\n\nexport class AnalyticsApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\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/Fetch'\n\nimport { ApiEndpoints } from '../constants'\n\nimport type { Beat } from '../types'\n\nexport class BeatApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\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 updateBeat = async (beat: Beat) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.BEATS}/${beat.guid}`, beat)\n .then((data) => data.beat)\n }\n}\n","import Fetch from '../utils/Fetch'\n\nimport { ApiEndpoints } from '../constants/ApiEndpoints'\n\nimport type { Account } from '../types/Account'\nimport type { Category } from '../types/Category'\n\nexport class CategoryApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\n }\n\n addCategory = async (category: Category) => {\n return this.fetchInstance.post(ApiEndpoints.CATEGORIES, category).then((data) => data.category)\n }\n\n getCategories = async () => {\n return this.fetchInstance.get(ApiEndpoints.CATEGORIES).then((data) => data.categories)\n }\n\n getDateRangeCategoryTotals = async (startDate: number, endDate: number, accounts: Account[]) => {\n return this.fetchInstance\n .post(`${ApiEndpoints.DATE_RANGE_CATEGORY_TOTALS}/from/${startDate}/to/${endDate}`, {\n account_guid: accounts.map((account) => account.guid),\n })\n .then((data) => data.date_range_category_totals)\n }\n\n getMonthlyCategoryTotals = async (startDate: number, endDate: number, accounts?: Account[]) => {\n return accounts\n ? this.fetchInstance\n .post(`${ApiEndpoints.MONTHLY_CATEGORY_TOTALS}/from/${startDate}/to/${endDate}`, {\n account_guid: accounts.length === 0 ? [''] : accounts.map((account) => account.guid),\n })\n .then((data) => data.monthly_category_totals)\n : this.fetchInstance\n .get(`${ApiEndpoints.MONTHLY_CATEGORY_TOTALS}/from/${startDate}/to/${endDate}`)\n .then((data) => data.monthly_category_totals)\n }\n\n removeCategory = async (guid: string) => {\n return this.fetchInstance.delete(`${ApiEndpoints.CATEGORIES}/${guid}`)\n }\n\n updateCategory = async (category: Category) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.CATEGORIES}/${category.guid}`, category)\n .then((data) => data.category)\n }\n}\n","import Fetch from '../utils/Fetch'\n\nimport { ApiEndpoints } from '../constants/ApiEndpoints'\n\nexport class GlobalCopyApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\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","import Fetch from '../utils/Fetch'\n\nimport { ApiEndpoints } from '../constants/ApiEndpoints'\n\nexport class LocalizedCopyApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\n }\n\n getLocalizedCopy = async (req: any) => {\n return this.fetchInstance.post(ApiEndpoints.LOCALIZED_COPY, req).then((data) => data)\n }\n\n getLocalizedContent = async (namespace: string) => {\n return this.fetchInstance\n .post(`${ApiEndpoints.LOCALIZED_CONTENT}/${namespace}`)\n .then((data) => data)\n }\n}\n","import Fetch from '../utils/Fetch'\n\nimport { ApiEndpoints } from '../constants'\n\nimport type { Notification } from '../types'\n\nexport class NotificationApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\n }\n\n getNotifications = () => {\n return this.fetchInstance\n .get(ApiEndpoints.NOTIFICATIONS)\n .then((data) =>\n data.notifications.map((obj: { notification: Notification }) => obj.notification),\n )\n .finally()\n }\n\n updateNotification = (notification: Notification) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.NOTIFICATIONS}/${notification.guid}`, {\n guid: notification.guid,\n has_been_viewed: notification.has_been_viewed,\n })\n .then((data) => data.notification)\n .finally()\n }\n\n // Note: The notifications/mark_all_as_viewed endpoint is broken, but still returns 202.\n // A bug ticket has been filed to fix it, but should not require any changes here.\n markAllAsViewed = (channel?: number) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.NOTIFICATIONS}/mark_all_as_viewed`, { channel })\n .finally()\n }\n}\n","import { ApiEndpoints, Fetch, type ScheduledPayment, TransactionType } from '../index'\n\nexport class ScheduledPaymentsApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\n }\n\n addScheduledPayment = async (scheduledPayment: ScheduledPayment) => {\n return this.fetchInstance\n .post(ApiEndpoints.SCHEDULED_PAYMENTS, {\n ...scheduledPayment,\n is_recurring: 'true',\n transaction_type: TransactionType.DEBIT,\n })\n .then((data) => data.scheduled_payment)\n }\n\n getScheduledPayments = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.SCHEDULED_PAYMENTS)\n .then((data) => data.scheduled_payments)\n }\n\n updateScheduledPayment = async (scheduledPayment: ScheduledPayment) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.SCHEDULED_PAYMENTS}/${scheduledPayment.guid}`, scheduledPayment)\n .then((data) => data.scheduled_payment)\n }\n\n deleteScheduledPayment = async (guid: string) => {\n return this.fetchInstance\n .delete(`${ApiEndpoints.SCHEDULED_PAYMENTS}/${guid}`)\n .then((data) => data)\n }\n}\n","import Fetch from '../utils/Fetch'\n\nimport { ApiEndpoints } from '../constants'\n\nimport type { UserProfile } from '../types'\n\nexport class UserApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\n }\n\n getUserProfile = async () => {\n return this.fetchInstance.get(ApiEndpoints.APP_DATA).then((data) => data.user_profile)\n }\n\n updateUserProfile = async (userProfile: UserProfile) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.USER_PROFILES}/${userProfile.guid}`, userProfile)\n .then((data) => data.user_profile)\n }\n}\n","import Fetch from '../utils/Fetch'\n\nimport { ApiEndpoints } from '../constants'\n\nexport class WidgetApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\n }\n\n requestWidgetUrl = async (req: any) => {\n return this.fetchInstance.post(ApiEndpoints.WIDGET_URLS, req).then((data) => data.widget_url)\n }\n}\n","import { AccountTypeName } from '../'\n\nimport type { Account } from '../types'\n\nexport interface MappedAccounts {\n [key: string]: MappedAccount[]\n}\n\nexport interface MappedAccount {\n accountNumber: string\n name: string\n guid: string\n}\n\nexport interface MappedOptions {\n [key: string]: boolean\n}\n\n// Sets up the collection of selected account guids into a mapped object\nexport const setupMappedSelectedOptions = (accounts: Account[], selectedAccountGuids: string[]) => {\n return accounts.reduce((accumulator: MappedOptions, account) => {\n accumulator[account.guid] = selectedAccountGuids?.includes(account.guid)\n return accumulator\n }, {})\n}\n\n// Creates a mapped collection of accounts that are grouped together by the account type\nexport const setupMappedAccounts = (accounts: Account[]) => {\n return accounts.reduce((accumulator: MappedAccounts, account) => {\n const accountType = AccountTypeName[account.account_type]\n const newAccount = {\n accountNumber: account.account_number,\n name: account.name || account.feed_name,\n guid: account.guid,\n } as MappedAccount\n\n if (Object.prototype.hasOwnProperty.call(accumulator, accountType)) {\n accumulator[accountType] = accumulator[accountType].concat(newAccount)\n } else {\n accumulator[accountType] = [newAccount]\n }\n\n return accumulator\n }, {})\n}\n","import React, { useMemo } from 'react'\n\nimport Button from '@mui/material/Button'\nimport FormControlLabel from '@mui/material/FormControlLabel'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListSubheader from '@mui/material/ListSubheader'\nimport ListItemText from '@mui/material/ListItemText'\nimport Popover from '@mui/material/Popover'\nimport Stack from '@mui/material/Stack'\nimport CheckBox from '@mui/material/Checkbox'\nimport { AccountsIcon, P } from '@kyper/mui'\nimport { setupMappedAccounts } from '../../utils/AccountFilter'\nimport type { Account } from '../../types/Account'\nimport type { MappedAccount, MappedAccounts, MappedOptions } from '../../utils/AccountFilter'\nimport { buildDynamicCopy } from '../../utils'\n\nexport type AccountFilterOptionsCopy = {\n accountTypeAccounts: string\n cancelButton: string\n filterButton: string\n filterButtonAria: string\n selectAllAccounts: string\n toggleAccountTypeAccounts: string\n unselectAllAccounts: string\n zeroStateButton: string\n zeroStateDescription: string\n zeroStateTitle: string\n}\n\ninterface AccountFilterOptionsProps {\n accounts: Account[]\n copy: AccountFilterOptionsCopy\n accountFilterButtonEl: HTMLButtonElement | null\n onAccountClick: (account: MappedAccount) => void\n onAccountGroupClick: (\n accountType: string,\n mappedAccounts: MappedAccounts,\n allGroupedAccountsSelected: boolean,\n ) => void\n onCancelClick: () => void\n onConnectAccountClick: () => void\n onFilterClick: () => void\n selectedOptions: MappedOptions\n setSelectedOptions: (value: React.SetStateAction<MappedOptions>) => void\n handleClose: () => void\n showAccountNumbers: boolean\n}\n\nexport const AccountFilterOptions: React.FC<AccountFilterOptionsProps> = ({\n accounts,\n accountFilterButtonEl,\n copy,\n onAccountClick,\n onAccountGroupClick,\n onCancelClick,\n onConnectAccountClick,\n onFilterClick,\n selectedOptions,\n setSelectedOptions,\n handleClose,\n showAccountNumbers,\n}) => {\n const mappedAccounts = useMemo(() => setupMappedAccounts(accounts), [accounts])\n const shouldShowZeroState = accounts.length < 1\n const isOpen = Boolean(accountFilterButtonEl)\n\n const isAllChecked = Object.values(selectedOptions).every((value) => Boolean(value))\n\n return (\n <Popover\n anchorEl={accountFilterButtonEl}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n onClose={handleClose}\n open={isOpen}\n sx={{ maxHeight: 400, maxWidth: shouldShowZeroState ? '100%' : 300 }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'left',\n }}\n >\n {shouldShowZeroState ? (\n <Stack\n sx={{\n alignItems: 'center',\n flexDirection: 'column',\n padding: 16,\n textAlign: 'center',\n width: 320,\n maxWidth: '100%',\n }}\n >\n <AccountsIcon size={32} />\n <P bold={true} mt={12}>\n {copy.zeroStateTitle}\n </P>\n <P mt={12}>{copy.zeroStateDescription}</P>\n <Button onClick={onConnectAccountClick}>{copy.zeroStateButton}</Button>\n </Stack>\n ) : (\n <form onSubmit={handleClose}>\n <List\n className=\"mx-cmn-account-options\"\n dense={true}\n id=\"filter_accounts\"\n sx={{\n overflow: 'auto',\n maxHeight: 300,\n minWidth: 268,\n '& .MuiFormControlLabel-root': {\n m: 4,\n borderRadius: 1,\n width: '100%',\n '&:hover': {\n bgcolor: 'background.default',\n },\n '&:focus-within': {\n outline: '2px solid rgba(82, 138, 224, 0.8)',\n outlineOffset: '2px',\n },\n '& .MuiFormControlLabel-label': {\n fontSize: 13,\n },\n },\n }}\n >\n <ListItem disableGutters={true} disablePadding={true}>\n <FormControlLabel\n control={\n <CheckBox\n checked={isAllChecked}\n data-ui-test={`checked-${isAllChecked}`}\n disableRipple={true}\n onChange={() => {\n const updatedOptions: MappedOptions = {}\n\n Object.keys(selectedOptions).forEach((key) => {\n updatedOptions[key] = !isAllChecked\n })\n setSelectedOptions(updatedOptions)\n }}\n size=\"small\"\n sx={{\n '&.Mui-focusVisible': {\n outline: 'none',\n boxShadow: 'none',\n },\n }}\n />\n }\n label={isAllChecked ? copy.unselectAllAccounts : copy.selectAllAccounts}\n />\n </ListItem>\n {Object.keys(mappedAccounts).map((accountType) => {\n const groupedAccounts = mappedAccounts[accountType]\n const allGroupedAccountsSelected = groupedAccounts.every(\n (account: MappedAccount) => selectedOptions[account.guid],\n )\n\n return (\n <ListItem disableGutters={true} disablePadding={true} key={accountType}>\n <List\n aria-label={buildDynamicCopy(copy.accountTypeAccounts, accountType) as string}\n className=\"mx-cmn-account-options-group\"\n dense={true}\n subheader={\n <ListSubheader disableGutters={true}>\n <ListItemButton\n aria-label={\n buildDynamicCopy(copy.toggleAccountTypeAccounts, accountType) as string\n }\n aria-pressed={allGroupedAccountsSelected}\n disableGutters={true}\n onClick={() =>\n onAccountGroupClick(\n accountType,\n mappedAccounts,\n allGroupedAccountsSelected,\n )\n }\n sx={{\n paddingLeft: 12,\n minHeight: 40,\n justifyContent: 'left',\n }}\n >\n <ListItemText\n primary={accountType}\n primaryTypographyProps={{ variant: 'XSmall', fontWeight: 'bold' }}\n />\n </ListItemButton>\n </ListSubheader>\n }\n sx={{ overflow: 'auto', width: '100%' }}\n >\n {groupedAccounts.map((account: MappedAccount) => {\n const isSelected = selectedOptions[account.guid]\n const label = `${account.name}${\n showAccountNumbers && account.accountNumber\n ? ` *${account.accountNumber.slice(-4)}`\n : ''\n }`\n\n return (\n <ListItem\n className=\"mx-cmn-account-options-container\"\n disableGutters={true}\n disablePadding={true}\n key={account.guid}\n >\n <FormControlLabel\n control={\n <CheckBox\n checked={isSelected}\n data-ui-test={`checked-${isSelected}`}\n disableRipple={true}\n id={account.guid}\n onChange={() => {\n onAccountClick(account)\n }}\n size=\"small\"\n sx={{\n '&.Mui-focusVisible': {\n outline: 'none',\n boxShadow: 'none',\n },\n }}\n />\n }\n label={label}\n />\n </ListItem>\n )\n })}\n </List>\n </ListItem>\n )\n })}\n </List>\n <Stack direction=\"row\" justifyContent=\"flex-end\" padding={12} spacing={16} width=\"100%\">\n <Button onClick={onCancelClick} variant=\"outlined\">\n {copy.cancelButton}\n </Button>\n <Button\n aria-label={copy.filterButtonAria}\n color=\"primary\"\n onClick={onFilterClick}\n variant=\"contained\"\n >\n {copy.filterButton}\n </Button>\n </Stack>\n </form>\n )}\n </Popover>\n )\n}\n\nAccountFilterOptions.displayName = 'AccountFilterOptions'\n","import React from 'react'\n\nimport { AnalyticEventFunction, AnalyticPageviewFunction } from '../types'\n\nexport const useCombineEvents = (events: AnalyticEventFunction[], store: any) => {\n const { session } = store\n\n const storeEvents = Object.values(store).reduce((acc: AnalyticEventFunction[], curr: any) => {\n if (session && curr?.onAnalyticEvent && typeof curr?.onAnalyticEvent === 'function') {\n return [...acc, curr.onAnalyticEvent]\n }\n\n return acc\n }, [])\n const eventFunctions = [...events, ...storeEvents]\n\n return React.useMemo(() => {\n return (event: string) => {\n eventFunctions.forEach((e) => {\n if (!session) {\n e(event)\n } else {\n e(event, session)\n }\n })\n }\n }, [events, session])\n}\n\nexport const useCombinePageviews = (pages: AnalyticPageviewFunction[], store: any) => {\n const { session } = store\n\n const storeEvents = Object.values(store).reduce((acc: AnalyticPageviewFunction[], curr: any) => {\n if (session && curr?.onAnalyticPageView && typeof curr?.onAnalyticPageView === 'function') {\n return [...acc, curr.onAnalyticPageView]\n }\n\n return acc\n }, [])\n const eventFunctions = [...pages, ...storeEvents]\n\n return React.useMemo(() => {\n return (event: string) => {\n eventFunctions.forEach((e) => {\n if (!session) {\n e(event)\n } else {\n e(event, session)\n }\n })\n }\n }, [pages, session])\n}\n","import useTheme from '@mui/material/styles/useTheme'\nimport useMediaQuery from '@mui/material/useMediaQuery'\n\nexport const useScreenSize = () => {\n return {\n // Larger than 1200\n isDesktop: useMediaQuery(useTheme().breakpoints.up('xl')),\n // Smaller than 768\n isMobile: useMediaQuery(useTheme().breakpoints.down('md')),\n // Between 768 and 992\n isSmallTablet: useMediaQuery(useTheme().breakpoints.between('md', 'lg')),\n // Between 768 and 1200\n isTablet: useMediaQuery(useTheme().breakpoints.between('md', 'xl')),\n }\n}\n","import { useEffect, useRef } from 'react'\n\nexport const usePrevious = (value: any) => {\n const ref = useRef()\n useEffect(() => {\n ref.current = value\n }, [value])\n return ref.current\n}\nexport default usePrevious\n","import React, { FC } from 'react'\n\nimport Button from '@mui/material/Button'\nimport { Icon } from '@kyper/mui'\nimport Tooltip from '@mui/material/Tooltip'\nimport Box from '@mui/material/Box'\nimport IconButton from '@mui/material/IconButton'\nimport { type SxProps } from '@mui/material/styles'\n\nimport { AccountFilterOptions } from './AccountFilterOptions'\nimport { setupMappedSelectedOptions } from '../../utils/AccountFilter'\n\nimport type { Account } from '../../types'\nimport type { AccountFilterOptionsCopy } from './AccountFilterOptions'\nimport type { MappedAccount, MappedOptions } from '../../utils/AccountFilter'\nimport { useScreenSize } from '../../hooks'\n\nexport type AccountFilterCopy = {\n accountFilterOptionsCopy: AccountFilterOptionsCopy\n title: string\n}\n\n// TODO: pass in copy to account filter like this when refactored\n// const accountFilterCopy = {\n// ...copy.account_filter,\n// accounts_type: copy.full_view.accounts_type,\n// title: copy.full_view.account_filter_title,\n// }\n\nexport interface AccountFilterProps {\n accounts: Account[]\n copy: AccountFilterCopy\n onFilterClick: (selected: string[]) => void\n onConnectAccountClick?: () => void\n selectedAccountGuids: string[]\n showAccountNumbers: boolean\n sx?: SxProps\n variant?: 'outlined' | 'text'\n}\n\nconst AccountFilter: FC<AccountFilterProps> = ({\n accounts,\n copy,\n onFilterClick,\n onConnectAccountClick = () => {},\n selectedAccountGuids,\n showAccountNumbers,\n sx = {},\n variant = 'outlined',\n}) => {\n const { isMobile } = useScreenSize()\n\n const [accountFilterButtonEl, setAccountFilterButtonEl] =\n React.useState<HTMLButtonElement | null>(null)\n\n const [selectedOptions, setSelectedOptions] = React.useState<MappedOptions>(\n setupMappedSelectedOptions(accounts, selectedAccountGuids),\n )\n\n React.useEffect(() => {\n setSelectedOptions(setupMappedSelectedOptions(accounts, selectedAccountGuids))\n }, [accounts, selectedAccountGuids])\n\n const onClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setAccountFilterButtonEl(event.currentTarget)\n }\n\n const handleClose = () => {\n setAccountFilterButtonEl(null)\n }\n\n return (\n <Box className=\"mx-cmn-account-filter\" m={4} sx={{ ...sx }}>\n {isMobile ? (\n <Tooltip id=\"filter-accounts\" placement=\"bottom\" title={copy.title}>\n <IconButton\n aria-controls=\"filter_accounts\"\n aria-describedby=\"filter-accounts\"\n aria-haspopup={true}\n aria-label={copy.title}\n onClick={onClick}\n >\n <Icon name=\"filter_alt\" />\n </IconButton>\n </Tooltip>\n ) : (\n <Button\n aria-controls=\"filter_accounts\"\n aria-haspopup={true}\n aria-label={copy.title}\n onClick={onClick}\n startIcon={<Icon name=\"filter_alt\" />}\n variant={variant}\n >\n {copy.title}\n </Button>\n )}\n\n <AccountFilterOptions\n accountFilterButtonEl={accountFilterButtonEl}\n accounts={accounts}\n copy={copy.accountFilterOptionsCopy}\n handleClose={handleClose}\n onAccountClick={(account) => {\n setSelectedOptions({ ...selectedOptions, [account.guid]: !selectedOptions[account.guid] })\n }}\n onAccountGroupClick={(accountType, mappedAccounts, allSelected) => {\n const selectedOptionsClone = { ...selectedOptions }\n\n mappedAccounts[accountType].forEach((account: MappedAccount) => {\n selectedOptionsClone[account.guid] = !allSelected\n })\n\n setSelectedOptions(selectedOptionsClone)\n }}\n onCancelClick={() => {\n setSelectedOptions(setupMappedSelectedOptions(accounts, selectedAccountGuids))\n handleClose()\n }}\n onConnectAccountClick={onConnectAccountClick}\n onFilterClick={() => {\n onFilterClick(Object.keys(selectedOptions).filter((guid) => selectedOptions[guid]))\n handleClose()\n }}\n selectedOptions={selectedOptions}\n setSelectedOptions={setSelectedOptions}\n showAccountNumbers={showAccountNumbers}\n />\n </Box>\n )\n}\n\nexport default AccountFilter\n","import React from 'react'\nimport { css } from '@mxenabled/cssinjs'\n\nimport { Text, useTokens } from '@kyper/mui'\n\ninterface BarChartLegendProps {\n color: string\n labelAverage: string\n labelMain: string\n}\n\nconst Legend: React.FC<BarChartLegendProps> = ({ color, labelAverage, labelMain }) => {\n const tokens = useTokens()\n const styles = getStyles(tokens, color)\n\n return (\n <div className={`mx-cmn-bar-chart-legend ${styles}`}>\n <div aria-label={labelMain} className=\"mx-cmn-color-square\" role=\"img\" />\n <Text variant=\"XSmall\">{labelMain}</Text>\n\n <div aria-label={labelAverage} className=\"mx-cmn-triple-dot\" role=\"img\">\n <div className=\"mx-cmn-dot\" />\n <div className=\"mx-cmn-dot\" />\n <div className=\"mx-cmn-dot\" />\n </div>\n <Text variant=\"XSmall\">{labelAverage}</Text>\n </div>\n )\n}\n\nconst getStyles = (tokens: any, color: string) =>\n css({\n alignItems: 'center',\n display: 'flex',\n gap: tokens.Spacing.XSmall,\n justifyContent: 'flex-end',\n marginRight: tokens.Spacing.XLarge,\n paddingBottom: tokens.Spacing.XSmall,\n width: '100%',\n '& .mx-cmn-color-square': {\n backgroundColor: color,\n height: 6,\n width: 6,\n },\n '& .mx-cmn-triple-dot': {\n display: 'flex',\n gap: 1,\n },\n '& .mx-cmn-dot': {\n backgroundColor: tokens.Color.Neutral500,\n height: 3,\n width: 3,\n borderRadius: 1.5,\n },\n '& > .kyper-text': {\n marginRight: tokens.Spacing.XSmall,\n },\n })\n\nexport default Legend\n","import React from 'react'\nimport { css, keyframes } from '@mxenabled/cssinjs'\n\nimport { Text, useTokens } from '@kyper/mui'\n\ninterface BarProps {\n ariaLabel?: string\n color: string\n height: number\n index: number\n label: string\n onClick?: (index: number) => void\n selectedIndex?: number\n value: number\n}\n\n/**\n * The Bar component is what displays the colored (optionally clickable) bar\n *\n * @param ariaLabel OPTIONAL aria label used on the bar\n * @param color The color of the bar\n * @param height The pixel height of the bar\n * @param index The index of the bar\n * @param label The label to use above (on positive bars) or below (on negative bars)\n * @param onClick OPTIONAL function to call if the bar is clicked\n * @param selectedIndex OPTIONAL indicates the selected bar\n * @param value Value representing the bar\n */\nconst Bar: React.FC<BarProps> = ({\n ariaLabel,\n color,\n height,\n index,\n label,\n onClick,\n selectedIndex,\n value,\n}) => {\n const tokens = useTokens()\n const styles = getStyles(tokens, color, height)\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (onClick && (event.key === ' ' || event.key === 'Enter')) {\n onClick(index)\n }\n }\n\n const labelColor =\n selectedIndex === undefined || selectedIndex === index ? 'primary' : 'secondary'\n\n const BarLabel = () => (\n <Text\n aria-hidden={true}\n bold={selectedIndex === index}\n className=\"mx-cmn-bar-text\"\n color={labelColor}\n component=\"div\"\n variant=\"Small\"\n >\n {label}\n </Text>\n )\n\n return (\n <div className={`mx-cmn-bar-container ${styles} ${value < 0 ? 'mx-cmn-negative' : ''}`}>\n {/* Display the value on top for positive values */}\n {value >= 0 && <BarLabel />}\n\n <div\n aria-label={ariaLabel}\n className={`mx-cmn-bar ${onClick ? 'mx-cmn-clickable' : ''} ${\n value < 0 ? 'mx-cmn-bar-negative' : ''\n }`}\n onClick={onClick ? () => onClick?.(index) : undefined}\n onKeyDown={handleKeyDown}\n role={ariaLabel ? 'button' : undefined}\n tabIndex={ariaLabel ? 0 : undefined}\n />\n\n {/* Display the value on bottom for negative values */}\n {value < 0 && <BarLabel />}\n </div>\n )\n}\n\nconst getStyles = (tokens: any, color: string, height: number) => {\n const frameName = `expandBar-${Math.round(height)}`\n const expandAnimation = keyframes(frameName, { from: { height: 0 }, to: { height } })\n\n return css({\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'flex-end',\n height: '100%',\n '&.mx-cmn-negative': {\n justifyContent: 'flex-start',\n },\n '& .mx-cmn-bar': {\n animationDelay: '.5s',\n animationDuration: '1s',\n animationFillMode: 'forwards',\n animationName: expandAnimation,\n animationTimingFunction: tokens.Easing.Default,\n backgroundColor: color,\n borderRadius: `${tokens.BorderRadius.Medium}px ${tokens.BorderRadius.Medium}px 0 0`,\n maxHeight: height,\n },\n '& .mx-cmn-bar-negative': {\n borderRadius: `0 0 ${tokens.BorderRadius.Medium}px ${tokens.BorderRadius.Medium}px`,\n marginTop: -tokens.Spacing.XTiny,\n },\n '& .mx-cmn-bar-text': {\n display: 'flex',\n justifyContent: 'center',\n marginBottom: tokens.Spacing.Tiny,\n marginTop: tokens.Spacing.Tiny,\n whiteSpace: 'nowrap',\n width: '100%',\n },\n })\n}\n\nexport default Bar\n","import React from 'react'\nimport { css } from '@mxenabled/cssinjs'\n\nimport { Text, useTokens } from '@kyper/mui'\n\nimport Bar from './Bar'\n\ninterface BarColumnProps {\n ariaLabel?: string\n averageLineHeight: number\n bottomHeight: number\n color: string\n index?: number\n onClick?: (index: number) => void\n range: number\n selectedIndex?: number\n topHeight: number\n value: number\n valueLabel?: string\n width?: number | string\n xAxisLabel?: string\n}\n\n/**\n * The BarColumn component represents a single vertical slice of the bar chart. It contains from top to bottom\n * the positive section, which will only display a bar if value > 0, the zero line, the average line, negative\n * section, which will only display a bar if value < 0 and the X-Axis label.\n *\n * @param ariaLabel OPTIONAL aria label used to label the bar\n * @param averageLineHeight the pixel height above/below the zero line for the dashed average line\n * @param bottomHeight the height of the bottom (negative) section\n * @param color the color of the bar\n * @param index OPTIONAL index of the bar (Only used when bar is clickable)\n * @param onClick OPTIONAL function to call if the bar is clicked\n * @param range\n * @param selectedIndex OPTIONAL indicates the selected bar\n * @param topHeight the pixel height of the top (positvie section)\n * @param value the value for the bar\n * @param valueLabel OPTIONAL string value to use for the bar\n * @param width OPTIONAL pixel or percentage width of the bar\n * @param xAxisLabel label for the X-Axis\n */\nconst BarColumn: React.FC<BarColumnProps> = ({\n ariaLabel,\n averageLineHeight,\n bottomHeight,\n color,\n index = -1,\n onClick,\n range,\n selectedIndex,\n topHeight,\n value,\n valueLabel = '',\n width,\n xAxisLabel = '',\n}) => {\n const tokens = useTokens()\n const styles = getStyles(tokens, width)\n\n const topBarHeight = (value / range) * topHeight\n const bottomBarHeight = (Math.abs(value) / range) * bottomHeight\n const xAxisColor =\n selectedIndex === undefined || selectedIndex === index ? 'primary' : 'secondary'\n\n return (\n <div className={`mx-cmn-barchart-bar-column ${styles}`}>\n {/* Top (Positive) Chart Area */}\n <div style={{ height: topHeight }}>\n {/* Only display the bar here if it has a positive value */}\n {value >= 0 && (\n <Bar\n ariaLabel={ariaLabel}\n color={color}\n height={topBarHeight}\n index={index}\n label={valueLabel}\n onClick={onClick}\n selectedIndex={selectedIndex}\n value={value}\n />\n )}\n </div>\n\n {/* Zero Line */}\n <div className=\"mx-cmn-zero-line\" />\n\n {/* Average Line - Only display if average is not 0 */}\n {averageLineHeight !== 0 && (\n <div className=\"mx-cmn-chart-average\" style={{ bottom: averageLineHeight }} />\n )}\n\n {/* Bottom (Negative) Chart Area */}\n <div style={{ height: bottomHeight }}>\n {/* Only display the bar here if it has a negative value */}\n {value < 0 && (\n <Bar\n ariaLabel={ariaLabel}\n color={color}\n height={bottomBarHeight}\n index={index}\n label={valueLabel}\n onClick={onClick}\n value={value}\n />\n )}\n </div>\n\n {/* X-Axis label */}\n <div\n className={`mx-cmn-bar-label ${onClick ? 'mx-cmn-clickable' : ''}`}\n onClick={onClick ? () => onClick(index) : undefined}\n >\n <Text bold={selectedIndex === index} color={xAxisColor} variant=\"Small\">\n {xAxisLabel}\n </Text>\n </div>\n </div>\n )\n}\n\nconst getStyles = (tokens: any, width: number | string | undefined) =>\n css({\n display: 'flex',\n flexDirection: 'column',\n flexGrow: width === undefined ? 1 : 0,\n width,\n '& .mx-cmn-chart-average': {\n borderTop: `${tokens.Spacing.XTiny}px dotted ${tokens.Color.Neutral500}`,\n position: 'relative',\n marginRight: tokens.Spacing.XTiny,\n },\n '& .mx-cmn-zero-line': {\n borderBottom: '1px solid text.primary',\n width: '100%',\n },\n '& .mx-cmn-bar-label': {\n minHeight: tokens.Spacing.Medium,\n maxHeight: tokens.Spacing.Medium,\n marginBottom: tokens.Spacing.XSmall,\n marginTop: tokens.Spacing.XSmall,\n textAlign: 'center',\n width: '100%',\n },\n '& .mx-cmn-clickable': {\n cursor: 'pointer',\n },\n })\n\nexport default BarColumn\n","/**\n * Returns a sum\n *\n * @param acc accumulator\n * @param value current value\n */\nexport const sumReducer = (acc: number, value: number) => acc + value\n\n/**\n * Returns the max range\n *\n * @param acc accumulator\n * @param value current value\n */\nexport const rangeReducer = (acc: number, value: number) =>\n Math.abs(value) > acc ? Math.abs(value) : acc\n\n/**\n * Returns an array with the value of an object added\n *\n * @param acc accumulator\n * @param value current value\n */\nexport const valueReducer = (acc: number[], value: { value: number }) => [...acc, value.value]\n\n/**\n * Returns full height if only the first section is visible, half height if both sections\n * are visible and 0 if the first section is not visible\n *\n * @param hasSection1 If the first section is visible\n * @param hasSection2 If the second section is visible\n * @param fullHeight The full height\n */\nexport const getSectionHeight = (\n hasSection1: boolean,\n hasSection2: boolean,\n fullHeight: number,\n) => {\n const height = hasSection1 && hasSection2 ? fullHeight / 2 : fullHeight\n return !hasSection1 ? 0 : height\n}\n\n/**\n * Returns the +/- pixel height of the average line. This is calcluated using the percentange of average\n * to max value multiplied by the height. If the max value is less than 0, then we use negative min value.\n *\n * @param average The average value\n * @param max The maximum value\n * @param min The minimum value\n * @param height The height of the container the average line displays in.\n */\nexport const getAverageLineHeight = (average: number, max: number, min: number, height: number) => {\n return (average / (max < 0 ? -min : max)) * height || 0\n}\n","import React from 'react'\nimport { css } from '@mxenabled/cssinjs'\n\nimport { useTokens } from '@kyper/mui'\n\nimport Legend from './Legend'\nimport BarColumn from './BarColumn'\nimport {\n getAverageLineHeight,\n getSectionHeight,\n rangeReducer,\n sumReducer,\n valueReducer,\n} from './Util'\n\nexport type BarChartData = {\n ariaLabel: string\n label: string\n value: number\n}\n\nexport interface BarChartProps {\n average?: number\n barWidth?: number | string\n color: string\n data: BarChartData[]\n height: number\n legendLabelAverage: string\n legendLabelMain: string\n onBarClick?: (index: number) => void\n selectedIndex?: number\n valueFormatter?: (value: number) => string\n}\n\n/**\n * BarChart component to display a vertical bar chart given an array of data\n *\n * @param average OPTIONAL custom average not based on average or all value\n * @param barWidth OPTIONAL pixel or percentage width of bars\n * @param color Color of the bars\n * @param data An array of chart data. Chart data must contain and aria label, label and value.\n * @param height Height in pixels of the chart\n * @param legendLabelAverage Label to use on legend for the average value\n * @param legendLabelMain Label to use on the legend for the data\n * @param onBarClick OPTIONAL function to call if bar is clicked\n * @param selectedIndex OPTIONAL indicates the selected bar\n * @param valueFormatter OPTIONAL function to call to format the value displayed with the bars\n */\nconst BarChart: React.FC<BarChartProps> = ({\n average,\n barWidth = '8%',\n color,\n data,\n height,\n legendLabelAverage,\n legendLabelMain,\n onBarClick,\n selectedIndex,\n valueFormatter = (value: number) => `${value}`,\n}) => {\n const tokens = useTokens()\n const styles = getStyles(tokens)\n\n const values = data.reduce(valueReducer, [])\n const avg = average !== undefined ? average : values.reduce(sumReducer, 0) / values.length\n const max = Math.max(...values)\n const min = Math.min(...values)\n const range = values.reduce(rangeReducer, 0)\n\n const hasTop = max >= 0\n const hasBottom = min < 0\n const topHeight = getSectionHeight(hasTop, hasBottom, height)\n const bottomHeight = getSectionHeight(hasBottom, hasTop, height)\n const averageLineHeight = getAverageLineHeight(avg, max, min, topHeight || bottomHeight)\n\n const getBarColor = (index: number) => {\n if (selectedIndex === undefined || index === selectedIndex) {\n return color\n }\n return `${color}80`\n }\n\n const EmptyColumn = () => (\n <BarColumn\n averageLineHeight={averageLineHeight}\n bottomHeight={bottomHeight}\n color={''}\n range={range}\n topHeight={topHeight}\n value={0}\n width={undefined}\n />\n )\n\n return (\n <div className={`mx-cmn-bar-chart ${styles}`}>\n <div className=\"mx-cmn-chart-container\">\n <EmptyColumn />\n {data.map((d, index) => (\n <React.Fragment key={`column-${index}`}>\n <BarColumn\n ariaLabel={d.ariaLabel}\n averageLineHeight={averageLineHeight}\n bottomHeight={bottomHeight}\n color={getBarColor(index)}\n index={index}\n onClick={onBarClick}\n range={range}\n selectedIndex={selectedIndex}\n topHeight={topHeight}\n value={d.value}\n valueLabel={valueFormatter(d.value)}\n width={barWidth}\n xAxisLabel={d.label}\n />\n <EmptyColumn />\n </React.Fragment>\n ))}\n </div>\n <Legend color={color} labelAverage={legendLabelAverage} labelMain={legendLabelMain} />\n </div>\n )\n}\n\nconst getStyles = (tokens: any) =>\n css({\n '& .mx-cmn-chart-container': {\n alignItems: 'flex-end',\n display: 'flex',\n justifyContent: 'space-evenly',\n marginTop: tokens.Spacing.Large,\n marginBottom: tokens.Spacing.Medium,\n },\n })\n\nexport default BarChart\n","import React from 'react'\nimport { css } from '@mxenabled/cssinjs'\n\nimport KeyboardArrowLeftRoundedIcon from '@mui/icons-material/KeyboardArrowLeftRounded'\nimport KeyboardArrowRightRoundedIcon from '@mui/icons-material/KeyboardArrowRightRounded'\n\nimport Button from '@mui/material/Button'\n\nimport { H2, useTokens } from '@kyper/mui'\n\nimport { DATE_FORMATS_INTL, formatDate } from '../../constants/DateFormats'\nimport type { CalendarCopy } from './Calendar'\n\ninterface HeaderProps {\n copy: CalendarCopy\n date: Date\n onNextClick: () => void\n onPreviousClick: () => void\n}\n\nconst Header: React.FC<HeaderProps> = ({ copy, date, onNextClick, onPreviousClick }) => {\n const tokens = useTokens()\n const styles = getStyles(tokens)\n\n return (\n <div className={`mx-cmn-calendar-header ${styles}`}>\n <H2 className=\"mx-cmn-calendar-header-title\" variant=\"H3\">\n {formatDate(date, DATE_FORMATS_INTL.MONTH_YEAR)}\n </H2>\n <div className=\"mx-cmn-calendar-header-button-container\">\n <Button aria-label={copy.prevAria} onClick={onPreviousClick}>\n <KeyboardArrowLeftRoundedIcon />\n </Button>\n <Button aria-label={copy.nextAria} onClick={onNextClick}>\n <KeyboardArrowRightRoundedIcon />\n </Button>\n </div>\n </div>\n )\n}\n\nconst getStyles = (tokens: any) =>\n css({\n alignItems: 'center',\n display: 'flex',\n marginBottom: tokens.Spacing.Medium,\n marginRight: -tokens.Spacing.Medium,\n paddingLeft: tokens.Spacing.XSmall,\n '& .mx-cmn-calendar-header-title': {\n flexGrow: 1,\n },\n '& .mx-cmn-calendar-header-button-container': {\n display: 'flex',\n gap: 4,\n },\n })\n\nexport default Header\n","import React from 'react'\nimport { css } from '@mxenabled/cssinjs'\nimport { format } from 'date-fns/format'\nimport { isSameDay } from 'date-fns/isSameDay'\nimport { isWithinInterval } from 'date-fns/isWithinInterval'\nimport { startOfToday } from 'date-fns/startOfToday'\n\nimport Button from '@mui/material/Button'\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { Text, useTokens } from '@kyper/mui'\n\nimport { DATE_SIZE } from './Calendar'\n\ninterface DayProps {\n beginDate: Date | undefined\n date: Date\n endDate: Date | undefined\n isInMonth: boolean\n onClick: (date: Date) => void\n}\n\nconst Day: React.FC<DayProps> = ({ beginDate, date, endDate, isInMonth, onClick }) => {\n const theme = useTheme()\n const tokens = useTokens()\n const styles = getStyles(tokens, theme)\n\n const isInRange =\n beginDate &&\n endDate &&\n isWithinInterval(date, { start: beginDate, end: endDate }) &&\n !isSameDay(date, beginDate) &&\n !isSameDay(date, endDate)\n\n const isRangeStart =\n beginDate && endDate && isSameDay(beginDate, date) && !isSameDay(beginDate, endDate)\n\n const isRangeEnd =\n endDate && beginDate && isSameDay(endDate, date) && !isSameDay(beginDate, endDate)\n\n const isSelected =\n (beginDate && isSameDay(beginDate, date)) || (endDate && isSameDay(endDate, date))\n\n const isToday = isSameDay(date, startOfToday())\n\n return (\n <div\n className={`\n mx-cmn-calendar-day\n ${styles}\n ${!isInMonth ? 'mx-cmn-out-of-month' : ''}\n ${isInRange ? 'mx-cmn-date-interval' : ''}\n `}\n >\n <Button\n className={`\n mx-cmn-calendar-day-button\n ${isRangeStart ? 'mx-cmn-range-start' : ''}\n ${isRangeEnd ? 'mx-cmn-range-end' : ''}\n `}\n color={isSelected ? 'primary' : 'secondary'}\n onClick={() => onClick(date)}\n variant={isSelected ? 'contained' : 'text'}\n >\n <Text\n className={`\n mx-cmn-calendar-day-text\n ${isSelected ? 'mx-cmn-day-selected' : ''}\n ${isToday ? 'mx-cmn-today' : ''}`}\n variant=\"Small\"\n >\n {format(date, 'd')}\n </Text>\n </Button>\n </div>\n )\n}\n\nconst getStyles = (tokens: any, theme: any) =>\n css({\n height: DATE_SIZE,\n width: DATE_SIZE,\n display: 'flex',\n justifyContent: 'center',\n '&.mx-cmn-out-of-month': {\n backgroundColor: theme.palette.background.default,\n },\n '&.mx-cmn-date-interval': {\n backgroundColor: theme.palette.secondary.light,\n },\n '& .MuiButton-root': {\n maxWidth: 44,\n minWidth: 44,\n height: 44,\n padding: 0,\n width: 44,\n '&.mx-cmn-range-start': {\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0,\n '&:focus': {\n boxShadow: 'none',\n },\n },\n '&.mx-cmn-range-end': {\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n '&:focus': {\n boxShadow: 'none',\n },\n },\n },\n '& .mx-cmn-calendar-day-text': {\n '&.mx-cmn-day-selected': {\n color: theme.palette.primary,\n '&.mx-cmn-day-selected': {\n borderColor: theme.palette.common.white,\n },\n },\n '&.mx-cmn-today': {\n borderBottom: `solid 2px ${tokens.Color.Brand300}`,\n marginBottom: -6,\n paddingBottom: 5,\n },\n },\n })\n\nexport default Day\n","import React from 'react'\nimport { css } from '@mxenabled/cssinjs'\nimport { addDays } from 'date-fns/addDays'\nimport { addMonths } from 'date-fns/addMonths'\nimport { eachDayOfInterval } from 'date-fns/eachDayOfInterval'\nimport { eachWeekOfInterval } from 'date-fns/eachWeekOfInterval'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { format } from 'date-fns/format'\nimport { isBefore } from 'date-fns/isBefore'\nimport { isSameMonth } from 'date-fns/isSameMonth'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subMonths } from 'date-fns/subMonths'\n\nimport Button from '@mui/material/Button'\nimport Paper from '@mui/material/Paper'\n\nimport { Text, useTokens } from '@kyper/mui'\n\nimport Header from './Header'\nimport Day from './Day'\n\nexport const CALENDAR_WIDTH = 340\nexport const DATE_SIZE = 44\nexport const enum CalendarSelectionTypes {\n None = 'None',\n Single = 'Single',\n Range = 'Range',\n}\n\nexport type CalendarCopy = {\n nextAria: string\n prevAria: string\n today: string\n}\n\nexport interface CalendarProps {\n copy: CalendarCopy\n beginDate?: Date\n endDate?: Date\n onDateSelected?: (date: Date) => void\n onRangeSelected?: (beginDate: Date, endDate: Date) => void\n selectionType?: CalendarSelectionTypes\n}\n\nconst Calendar: React.FC<CalendarProps> = ({\n copy,\n beginDate: beginDateProp = undefined,\n endDate: endDateProp = undefined,\n onDateSelected,\n onRangeSelected,\n selectionType = CalendarSelectionTypes.Single,\n}) => {\n const tokens = useTokens()\n const styles = getStyles(tokens)\n\n const [date, setDate] = React.useState(startOfToday)\n\n const [beginDate, setBeginDate] = React.useState<Date | undefined>(beginDateProp)\n const [endDate, setEndDate] = React.useState<Date | undefined>(endDateProp)\n\n React.useEffect(() => {\n setBeginDate(beginDateProp)\n setEndDate(endDateProp)\n if (beginDateProp) {\n setDate(beginDateProp)\n }\n }, [beginDateProp, endDateProp])\n\n const weeks = React.useMemo(() => {\n const weeksInInterval = eachWeekOfInterval({ start: startOfMonth(date), end: endOfMonth(date) })\n\n const weeks = [] as Date[][]\n for (let i = 0; i < weeksInInterval.length; i++) {\n const weekStart = weeksInInterval[i]\n const days = eachDayOfInterval({ start: weekStart, end: addDays(weekStart, 6) })\n\n const week = [] as Date[]\n for (let j = 0; j < days.length; j++) {\n week.push(days[j])\n }\n weeks.push(week)\n }\n\n return weeks\n }, [date])\n\n const handleSelection = (date: Date) => {\n if (selectionType === CalendarSelectionTypes.None) return\n\n if (selectionType === CalendarSelectionTypes.Single) {\n setBeginDate(date)\n onDateSelected?.(date)\n return\n }\n\n if (!beginDate || endDate) {\n setBeginDate(date)\n setEndDate(undefined)\n } else if (isBefore(date, beginDate)) {\n setEndDate(beginDate)\n setBeginDate(date)\n onRangeSelected?.(date, beginDate)\n } else {\n setEndDate(date)\n onRangeSelected?.(beginDate, date)\n }\n }\n\n const handleTodayClick = () => {\n const today = startOfToday()\n setDate(today)\n\n if (selectionType === CalendarSelectionTypes.None) return\n\n setBeginDate(today)\n\n if (selectionType === CalendarSelectionTypes.Single) {\n onDateSelected?.(today)\n } else {\n setEndDate(today)\n onRangeSelected?.(today, today)\n }\n }\n\n const handleNextMonthClick = () => {\n setDate(addMonths(date, 1))\n }\n\n const handlePreviousMonthClick = () => {\n setDate(subMonths(date, 1))\n }\n\n return (\n <div className={`mx-cmn-calendar ${styles}`}>\n <Paper sx={{ boxShadow: 'none' }}>\n <Header\n copy={copy}\n date={date}\n onNextClick={handleNextMonthClick}\n onPreviousClick={handlePreviousMonthClick}\n />\n\n <div className=\"mx-cmn-calendar-header-row\">\n {weeks[0].map((day, index) => (\n <div className=\"mx-cmn-calendar-header-cell\" key={index}>\n <Text bold={true} variant=\"Small\">\n {format(day, 'EEEEE')}\n </Text>\n </div>\n ))}\n </div>\n\n {weeks.map((week, index) => (\n <div className=\"mx-cmn-calendar-week\" key={`w-${index}`}>\n {week.map((day, index) => (\n <Day\n beginDate={beginDate}\n date={day}\n endDate={endDate}\n isInMonth={isSameMonth(day, date)}\n key={index}\n onClick={handleSelection}\n />\n ))}\n </div>\n ))}\n\n <div className=\"mx-cmn-calendar-today-container\">\n <Button onClick={handleTodayClick} size=\"small\" variant=\"text\">\n {copy.today}\n </Button>\n </div>\n </Paper>\n </div>\n )\n}\n\nconst getStyles = (tokens: any) =>\n css({\n width: CALENDAR_WIDTH,\n '& .MuiPaper-root': {\n paddingLeft: 24,\n paddingRight: 24,\n paddingTop: 4,\n paddingBottom: 4,\n },\n '& .mx-cmn-calendar-header-row': {\n display: 'flex',\n justifyContent: 'center',\n textAlign: 'center',\n '& .mx-cmn-calendar-header-cell': {\n height: DATE_SIZE,\n width: DATE_SIZE,\n minWidth: DATE_SIZE,\n '& .kmui-text': {\n alignItems: 'center',\n display: 'flex',\n height: '100%',\n justifyContent: 'center',\n width: '100%',\n },\n },\n },\n '& .mx-cmn-calendar-week': {\n display: 'flex',\n justifyContent: 'center',\n textAlign: 'center',\n },\n '& .mx-cmn-calendar-today-container': {\n display: 'block',\n marginTop: tokens.Spacing.Medium,\n textAlign: 'center',\n width: '100%',\n '& > .MuiButton-root': {\n display: 'inline-block',\n marginLeft: 'auto',\n marginRight: 'auto',\n },\n },\n })\n\nexport default Calendar\n","import React from 'react'\nimport { arc, selectAll, interpolateString } from 'd3'\n\nimport Box from '@mui/material/Box'\n\nconst INNER_RADIUS = 100\nconst OUT_RADIUS = 140\nconst SELECTION_RADIUS = 10\n\nexport interface DonutData {\n id: string\n label?: string\n color: string\n value: number\n}\n\nexport interface DonutProps {\n data: DonutData[]\n onClick?: (id: string) => void\n selectedId?: string\n size?: number\n}\n\nconst Donut: React.FC<React.PropsWithChildren<DonutProps>> = ({\n data,\n onClick,\n selectedId,\n size = 300,\n children,\n}) => {\n let offset = 0\n\n React.useEffect(() => {\n selectAll('.arc-outer')\n .transition('roll')\n .duration(500)\n .attrTween('transform', () => interpolateString('rotate(0)', 'rotate(360)'))\n }, [])\n\n return (\n <Box height={size} position=\"relative\" width={size}>\n <Box height=\"100%\" padding={size / 3.75} width=\"100%\">\n {children}\n </Box>\n <svg\n height={size}\n style={{ position: 'absolute', top: 0, left: 0 }}\n viewBox={`-150 -150 300 300`}\n width={size}\n >\n <g>\n {data.map((item) => {\n const startAngle = offset\n offset = offset + 2 * Math.PI * (item.value / 100)\n const endAngle = offset\n\n const segment = arc().cornerRadius(4)({\n innerRadius: INNER_RADIUS,\n outerRadius: OUT_RADIUS + (item.id === selectedId ? SELECTION_RADIUS : 0),\n startAngle,\n endAngle,\n padAngle: 0.025,\n }) as string\n\n return (\n <path\n className=\"arc-outer\"\n d={segment}\n fill={item.color}\n key={item.id}\n onClick={() => onClick?.(item.id)}\n style={{ cursor: 'pointer' }}\n />\n )\n })}\n </g>\n </svg>\n </Box>\n )\n}\n\nexport default Donut\n","import React from 'react'\n\nimport { useTheme } from '@mui/material/styles'\nimport { MarkElementProps } from '@mui/x-charts'\n\nimport { formatCurrency } from '../../../utils'\n\nexport type MarkHandlers = {\n onMarkClick?: (event: React.MouseEvent<SVGPathElement, MouseEvent>, dataIndex: number) => void\n onMouseEnter?: (dataIndex: number) => void\n onMouseLeave?: () => void\n}\n\ninterface CustomMarkProps extends MarkElementProps {\n handlers?: MarkHandlers\n showLabel: boolean\n yData: number[]\n}\n\nexport const CustomMark: React.FC<CustomMarkProps> = (props) => {\n const theme = useTheme()\n const showLabel = props.showLabel\n const styles = props.style\n const xNumber = Number(props.x)\n const yNumber = Number(props.y)\n\n const handleMarkClick = props.handlers?.onMarkClick\n const handleMouseEnter = props.handlers?.onMouseEnter\n const handleMouseLeave = props.handlers?.onMouseLeave\n\n return (\n <>\n {showLabel && (\n <text\n fill={theme.palette.text.primary}\n style={{ fontSize: theme.typography.Small?.fontSize }}\n x={xNumber - 5}\n y={yNumber - 15}\n >\n {formatCurrency(props.yData[props.dataIndex], '0,0')}\n </text>\n )}\n <path\n cursor={handleMarkClick ? 'pointer' : 'unset'}\n d=\"M4.514,0A4.514,4.514,0,1,1,-4.514,0A4.514,4.514,0,1,1,4.514,0\"\n height=\"20px\"\n onClick={(event) => {\n handleMarkClick?.(event, props.dataIndex)\n }}\n onMouseEnter={() => {\n handleMouseEnter?.(props.dataIndex)\n }}\n onMouseLeave={() => {\n handleMouseLeave?.()\n }}\n style={{\n fill: styles?.fill ? styles.fill : theme.palette.background.paper,\n stroke: styles?.stroke ? styles.stroke : theme.palette.primary.main,\n strokeWidth: 2,\n transform: `translate(${props.x}px, ${props.y}px)`,\n transformOrigin: `${props.x}px, ${props.y}px`,\n filter: styles?.filter ? styles.filter : 'none',\n }}\n width=\"20px\"\n />\n </>\n )\n}\n","import React from 'react'\n\nimport { AnimatedLineProps } from '@mui/x-charts'\n\ninterface CustomLineProps extends AnimatedLineProps {\n lineColor?: string\n}\n\nexport const CustomLine: React.FC<CustomLineProps> = (props) => {\n return (\n <>\n <clipPath id={props.id}>\n <rect height={props.height} width={props.width} x=\"0\" y=\"0\" />\n </clipPath>\n <g>\n <path\n cursor=\"unset\"\n d={props.d}\n style={{\n strokeWidth: 2,\n strokeLinejoin: 'round',\n fill: 'none',\n stroke: props.lineColor ? props.lineColor : props.stroke,\n transition: 'opacity 0.2s ease-in, stroke 0.2s ease-in',\n opacity: 1,\n }}\n />\n </g>\n </>\n )\n}\n","import { observer } from 'mobx-react-lite'\n\nimport { Box, Stack } from '@mui/material'\nimport { Text } from '@kyper/mui'\n\nimport { formatCurrency } from '../../../utils'\nimport { useGlobalCopyStore } from '../../../../common'\n\nconst CustomLegend = ({\n series,\n average,\n style,\n}: {\n average: number\n series: any[]\n style: any\n}) => {\n const { common: commonCopy } = useGlobalCopyStore()\n return (\n <Stack style={{ flexDirection: 'row', gap: 25, ...style }}>\n {series.map((s, index) => (\n <Stack key={index} style={{ alignItems: 'center', flexDirection: 'row' }}>\n <Box\n sx={{\n width: 10,\n height: 10,\n backgroundColor: s.color,\n marginRight: 8,\n }}\n />\n <Text variant=\"Small\">{s.label}</Text>\n </Stack>\n ))}\n <Stack sx={{ alignItems: 'center', flexDirection: 'row' }}>\n <Text bold={true} sx={{ marginRight: 8 }} variant=\"Small\">\n – –\n </Text>\n <Text variant=\"Small\">\n {commonCopy.average}{' '}\n <Text bold={true} variant=\"Small\">\n {formatCurrency(average, '0,0')}\n </Text>\n </Text>\n </Stack>\n </Stack>\n )\n}\n\nexport default observer(CustomLegend)\n","import React, { CSSProperties } from 'react'\n\nimport { useTheme } from '@mui/material/styles'\n\nimport {\n AllSeriesType,\n AreaPlot,\n BarPlot,\n ChartsLegend,\n ChartsReferenceLine,\n ChartsXAxis,\n ChartsYAxis,\n LinePlot,\n MarkPlot,\n ResponsiveChartContainer,\n} from '@mui/x-charts'\n\nimport { formatCurrency } from '../../utils'\n\nimport { CustomMark, MarkHandlers } from './linechart/CustomMark'\nimport { CustomLine } from './linechart/CustomLine'\nimport CustomLegend from './linechart/CustomLegend'\n\ninterface LineChartProps {\n baseline?: string\n // Because theme chart colors are typed string|undefined\n colors: (string | undefined)[]\n datasets: { x: string; y: number }[][]\n height?: number\n labels: string[]\n margin?: { top?: number; right?: number; bottom?: number; left?: number }\n markHandlers?: MarkHandlers\n markStyles?: (markIndex: number) => CSSProperties\n showArea?: boolean\n showAverage?: boolean\n showBars?: boolean\n showMarkLabel?: boolean\n useCustomMark?: boolean\n valueFormatterString?: string\n width?: number\n}\n\nexport const LineChart: React.FC<LineChartProps> = ({\n baseline = 'max',\n colors,\n datasets,\n height,\n labels,\n margin,\n markHandlers,\n markStyles,\n showBars = false,\n showArea = false,\n showAverage = false,\n showMarkLabel = false,\n useCustomMark = false,\n valueFormatterString = '0,0',\n width,\n}) => {\n const theme = useTheme()\n\n // Data for the X axis\n const xData = datasets.flat().map((item) => item.x)\n const yData = datasets.flat().map((item) => item.y)\n\n const average = Math.round(yData.reduce((value, total) => total + value, 0) / yData.length)\n\n // Used for the min and max Y axis values\n const yMin = Math.floor(Math.min(...yData) / 100) * 100\n const yMax = Math.ceil(Math.max(...yData) / 100) * 100\n\n const series = datasets.map((data, index) => {\n return {\n type: showBars ? 'bar' : 'line',\n curve: 'linear',\n color: showBars ? theme.palette.chart?.chart6 : (colors[index] ?? theme.palette.primary.main),\n data: data.map((item) => item.y),\n area: showArea,\n baseline: baseline,\n showMark: true,\n label: labels[index],\n valueFormatter: (value: number) => formatCurrency(value || 0, valueFormatterString),\n }\n })\n\n return (\n <div style={{ position: 'relative' }}>\n <ResponsiveChartContainer\n height={height}\n margin={margin}\n series={series as AllSeriesType[]}\n sx={{\n p: 4,\n '& .MuiBarLabel-root': {\n fontSize: 10,\n fontWeight: 600,\n },\n '& .MuiAreaElement-root': {\n opacity: 0.15,\n },\n }}\n width={width}\n xAxis={[{ data: xData, scaleType: showBars ? 'band' : 'point' }]}\n yAxis={[\n {\n min: yMin,\n max: yMax || 100,\n colorMap: showArea\n ? {\n type: 'continuous',\n min: yMin,\n max: yMax,\n color: [theme.palette.background.paper, colors[0] ?? theme.palette.primary.main],\n }\n : undefined,\n valueFormatter: (value) => formatCurrency(value, valueFormatterString),\n },\n ]}\n >\n {/** Area plot provides gradiant below the line **/}\n {/* Note: Must be above the LinePlot for some style rules to work */}\n <AreaPlot />\n\n {/** Line plot provides the data line **/}\n <LinePlot\n slots={\n showArea && series.length < 2\n ? {\n line: (props) => (\n <CustomLine {...props} lineColor={colors[0] ?? theme.palette.primary.main} />\n ),\n }\n : undefined\n }\n />\n\n {/** Mark plot provides the circles **/}\n <MarkPlot\n slots={\n useCustomMark\n ? {\n mark: (props) => {\n return (\n <CustomMark\n handlers={markHandlers}\n showLabel={showMarkLabel}\n style={markStyles?.(props.dataIndex) ?? {}}\n yData={yData}\n {...props}\n />\n )\n },\n }\n : undefined\n }\n />\n\n <BarPlot\n barLabel={(item) => (Number(item.value) > 0 ? `$${item.value}` : null)}\n borderRadius={10}\n />\n\n {/** Provides the X axis line and values **/}\n <ChartsXAxis disableLine={true} disableTicks={true} />\n\n {/** Provides the Y axis values **/}\n <ChartsYAxis disableLine={true} disableTicks={true} />\n\n {/** Provides the average line **/}\n {showAverage && (\n <ChartsReferenceLine\n lineStyle={{\n stroke: theme.palette.grey[700],\n strokeDasharray: '10, 8',\n strokeWidth: 2,\n }}\n y={average}\n />\n )}\n\n {/** Provides the legend for the chart **/}\n {!showAverage && (\n <ChartsLegend\n position={{ horizontal: 'left', vertical: 'top' }}\n slotProps={{\n legend: {\n labelStyle: { fontSize: 12 },\n itemMarkHeight: 10,\n itemMarkWidth: 10,\n },\n }}\n />\n )}\n </ResponsiveChartContainer>\n {showAverage && (\n <CustomLegend\n average={average}\n series={series}\n style={{ position: 'absolute', top: 16, left: 16 }}\n />\n )}\n </div>\n )\n}\n","import React from 'react'\n\nimport { GlobalStore } from '..'\n\nexport interface GlobalStoreContextTypes {\n children: React.ReactNode\n onEvent: (event: string, props?: object) => void\n onPageView: (pageViewEvent: string) => void\n globalStore: GlobalStore\n}\nexport const GlobalDataContext = React.createContext<GlobalStoreContextTypes | null>(null)\n\nexport const GlobalDataProvider: React.FC<React.PropsWithChildren<GlobalStoreContextTypes>> = ({\n children,\n globalStore,\n onEvent,\n onPageView,\n}) => {\n return (\n <GlobalDataContext.Provider\n value={{\n globalStore,\n onEvent,\n onPageView,\n children,\n }}\n >\n {children}\n </GlobalDataContext.Provider>\n )\n}\n","import React from 'react'\n\nexport interface WidgetContainerContextTypes {\n children: React.ReactNode\n availableHeight: number\n availableWidth: number\n}\nexport const WidgetContainerContext = React.createContext<WidgetContainerContextTypes | null>(null)\n\nexport const WidgetContainerProvider: React.FC<\n React.PropsWithChildren<WidgetContainerContextTypes>\n> = ({ children, availableHeight, availableWidth }) => {\n return (\n <WidgetContainerContext.Provider\n value={{\n availableHeight,\n availableWidth,\n children,\n }}\n >\n {children}\n </WidgetContainerContext.Provider>\n )\n}\n","import React from 'react'\nimport { GlobalDataContext } from './GlobalDataProvider'\nimport { WidgetContainerContext } from './WidgetContainerProvider'\n\nexport const useGlobalDataContext = (providerName = 'useGlobalStore') => {\n const context = React.useContext(GlobalDataContext)\n\n if (!context) {\n throw new Error(`${providerName}() must be used within the GlobalDataContext`)\n }\n\n return context\n}\n\nexport const useAccountStore = () =>\n useGlobalDataContext('useAccountStore').globalStore.accountStore\nexport const useBudgetsStore = () =>\n useGlobalDataContext('useBudgetsStore').globalStore.budgetsStore\nexport const useCashflowStore = () =>\n useGlobalDataContext('useCashflowStore').globalStore.cashflowStore\nexport const useCategoryStore = () =>\n useGlobalDataContext('useCategoryStore').globalStore.categoryStore\nexport const useConnectStore = () =>\n useGlobalDataContext('useConnectStore').globalStore.connectStore\nexport const useDebtStore = () => useGlobalDataContext('useDebtsStore').globalStore.debtsStore\nexport const useGlobalStore = () => useGlobalDataContext('useGlobalStore').globalStore\nexport const useGlobalUiStore = () =>\n useGlobalDataContext('useGlobalUiStore').globalStore.globalUiStore\nexport const useGlobalCopyStore = () =>\n useGlobalDataContext('globalCopyStore').globalStore.copyStore.copy\nexport const useGoalStore = () => useGlobalDataContext('useGoalStore').globalStore.goalStore\nexport const useMerchantStore = () =>\n useGlobalDataContext('useMerchantStore').globalStore.merchantStore\nexport const useNetWorthStore = () =>\n useGlobalDataContext('useNetWorthStore').globalStore.netWorthStore\nexport const useNotificationStore = () =>\n useGlobalDataContext('useNotificationStore').globalStore.notificationStore\nexport const useRecurringActivityStore = () =>\n useGlobalDataContext('useRecurringActivityStore').globalStore.recurringActivityStore\nexport const useTransactionStore = () =>\n useGlobalDataContext('useTransactionStore').globalStore.transactionStore\nexport const useUserStore = () => useGlobalDataContext('useUserStore').globalStore.userStore\n\nexport const useEvent = () => ({ onEvent: useGlobalDataContext().onEvent })\nexport const usePageView = () => ({ onPageView: useGlobalDataContext().onPageView })\n\nexport const useWidgetContainerContext = (providerName = 'useWidgetContainerContext') => {\n const context = React.useContext(WidgetContainerContext)\n\n if (!context) {\n throw new Error(`${providerName}() must be used within the WidgetContainerContext`)\n }\n\n return context\n}\n\nexport const useWidgetContainerProvider = () => useWidgetContainerContext()\n","import React from 'react'\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\nimport { CategoryIcon, Text } from '@kyper/mui'\n\nimport { buildDynamicCopy } from '../../../utils'\nimport { useCategoryStore, useGlobalCopyStore } from '../../../context'\n\nexport const CategoryIconLabel: React.FC<{\n categoryGuid: string\n topLevelCategoryGuid: string\n}> = ({ categoryGuid, topLevelCategoryGuid }) => {\n const { categories: copy } = useGlobalCopyStore()\n const { getCategoryName } = useCategoryStore()\n const categoryName = getCategoryName(categoryGuid)\n\n return (\n <Stack alignItems=\"center\" direction=\"column\" gap=\"8\" justifyContent=\"center\" mb={4}>\n <Box\n aria-label={buildDynamicCopy(copy.category_icon_label_aria, categoryName) as string}\n mb={4}\n role=\"img\"\n >\n <CategoryIcon categoryGuid={topLevelCategoryGuid} />\n </Box>\n <Text variant=\"Body\">{categoryName}</Text>\n </Stack>\n )\n}\n","import React from 'react'\nimport { SxProps } from '@mui/material/styles'\nimport { Text } from '@kyper/mui'\nimport { TypographyProps } from '@mui/material/Typography'\n\nimport { formatCurrency } from '../utils'\n\ninterface CurrencyTextProps extends TypographyProps {\n isIncome?: boolean\n amount: number | string\n bold?: boolean\n color?: string\n formatString?: string\n sx?: SxProps\n symbol?: string\n variant?: TypographyProps['variant']\n}\n\nexport const CurrencyText: React.FC<CurrencyTextProps> = ({\n isIncome = false,\n amount = 0,\n bold,\n color,\n formatString,\n sx,\n symbol,\n variant,\n ...rest\n}) => {\n const textColor = () => {\n if (color) {\n return color\n } else {\n return isIncome ? 'success.main' : 'text.primary'\n }\n }\n\n return (\n <Text bold={bold} color={textColor()} sx={sx} variant={variant} {...rest}>\n {symbol && symbol}\n {formatCurrency(Number(amount), formatString ?? '0,0.00')}\n </Text>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Card from '@mui/material/Card'\nimport CardContent from '@mui/material/CardContent'\nimport Divider from '@mui/material/Divider'\nimport Grid from '@mui/material/Grid'\nimport { Text } from '@kyper/mui'\nimport { useTheme } from '@mui/material/styles'\n\nimport { CategoryIconLabel } from './CategoryIconLabel'\nimport { CurrencyText } from '../../CurrencyText'\n\ntype DataPoint = { x: string | number; y: number }\n\nconst CustomAreaTooltip: React.FC<{\n categoryGuids: { guid: string; topLevelGuid: string }\n hoveredAreaData: DataPoint[]\n cursorPosition: { x: number; y: number }\n chartContainerRef: React.RefObject<HTMLDivElement>\n}> = ({\n categoryGuids: { guid, topLevelGuid },\n hoveredAreaData,\n cursorPosition,\n chartContainerRef,\n}) => {\n const theme = useTheme()\n const tooltipRef = useRef<HTMLDivElement>(null)\n const [adjustedPos, setAdjustedPos] = useState({ x: cursorPosition.x, y: cursorPosition.y })\n\n useEffect(() => {\n const adjustTooltipPosition = () => {\n const tooltipEl = tooltipRef.current\n const chartEl = chartContainerRef.current\n\n if (!tooltipEl || !chartEl) return\n\n const tooltipRect = tooltipEl.getBoundingClientRect()\n const containerRect = chartEl.getBoundingClientRect()\n\n let newX = cursorPosition.x\n let newY = cursorPosition.y\n\n // If the tooltip overflows the right or left edge\n if (newX + tooltipRect.width * 2 > containerRect.right) {\n // Move the tooltip to the left of the cursor\n newX = cursorPosition.x - tooltipRect.width\n } else if (newX - tooltipRect.width < containerRect.left) {\n // Move the tooltip to the right of the cursor\n newX = cursorPosition.x\n }\n\n // If the tooltip overflows the bottom edge\n if (newY + tooltipRect.height * 2 > containerRect.bottom) {\n // Move the tooltip to the top of the cursor\n newY = cursorPosition.y - tooltipRect.height\n }\n\n setAdjustedPos({ x: newX, y: newY })\n }\n\n adjustTooltipPosition()\n }, [cursorPosition, chartContainerRef])\n\n if (!hoveredAreaData) return null\n\n const seriesSum = hoveredAreaData.reduce((sum, dataPoint) => sum + dataPoint.y, 0)\n\n return (\n <Card\n ref={tooltipRef}\n sx={{\n position: 'absolute',\n top: adjustedPos.y,\n left: adjustedPos.x,\n width: 250,\n pointerEvents: 'none',\n }}\n >\n <CardContent>\n <Box alignItems=\"center\" display=\"flex\" flexDirection=\"column\">\n <CategoryIconLabel categoryGuid={guid} topLevelCategoryGuid={topLevelGuid} />\n <Text variant=\"Small\">{`${hoveredAreaData.length}-month total`}</Text>\n <CurrencyText amount={seriesSum} bold={true} formatString=\"0,0\" variant=\"body2\" />\n </Box>\n\n <Divider sx={{ my: 16, width: '100%' }} />\n\n <Grid container={true}>\n {hoveredAreaData.map((dataPoint, index) => (\n <React.Fragment key={index}>\n {index > 0 && index % 3 === 0 && <Divider sx={{ my: 16, width: '100%' }} />}\n <Grid item={true} xs={4}>\n <Box alignItems=\"center\" display=\"flex\" flexDirection=\"column\">\n <Text color={theme.palette.text.secondary} variant=\"XSmall\">\n {dataPoint.x}\n </Text>\n <CurrencyText\n amount={dataPoint.y}\n bold={true}\n formatString=\"0,0\"\n variant=\"Body\"\n />\n </Box>\n </Grid>\n </React.Fragment>\n ))}\n </Grid>\n </CardContent>\n </Card>\n )\n}\n\nexport default observer(CustomAreaTooltip)\n","import React from 'react'\nimport { Box, Card, CardContent, useTheme } from '@mui/material'\nimport { ChartsItemContentProps } from '@mui/x-charts'\nimport { Text } from '@kyper/mui'\n\nimport { CategoryIconLabel } from './CategoryIconLabel'\nimport { CurrencyText } from '../../CurrencyText'\nimport { DATE_FORMATS_INTL, formatDate } from '../../../constants'\n\ninterface CustomPointTooltipProps extends ChartsItemContentProps<'line'> {\n categoryGuids: { guid: string; topLevelGuid: string }\n xData: Date[]\n}\n\n// Custom tooltip for hovering on line points\nexport const CustomPointTooltip: React.FC<CustomPointTooltipProps> = ({\n categoryGuids: { guid, topLevelGuid },\n itemData: { dataIndex },\n series,\n xData,\n}) => {\n const theme = useTheme()\n const dataValue = series.data[dataIndex as number]\n const dataDate = xData[dataIndex as number]\n\n if (dataValue === undefined || !dataDate) return null\n\n return (\n <Card sx={{ pt: 4, px: 8 }}>\n <CardContent>\n <Box alignItems=\"center\" display=\"flex\" flexDirection=\"column\">\n <CategoryIconLabel categoryGuid={guid} topLevelCategoryGuid={topLevelGuid} />\n <Text color={theme.palette.text.secondary} variant=\"Small\">\n {formatDate(dataDate, DATE_FORMATS_INTL.MONTH_SHORT_YEAR)}\n </Text>\n <CurrencyText amount={String(dataValue)} bold={true} formatString=\"0,0\" variant=\"Body\" />\n </Box>\n </CardContent>\n </Card>\n )\n}\n","import React from 'react'\nimport Box from '@mui/material/Box'\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport { Text } from '@kyper/mui'\n\nimport { useScreenSize } from '../../../hooks'\nimport { CategoryColors } from '../../../constants'\nimport { useCategoryStore } from '../../../context'\n\ninterface CustomLegendProps {\n sx?: object\n categoryGuids: { guid: string; top_level_guid: string }[]\n hoveredLegend: string | null\n onHoverLegend: (label: string | null) => void\n onClickLegend: (label: string | null) => void\n}\n\nexport const CustomLegend: React.FC<CustomLegendProps> = ({\n sx,\n categoryGuids,\n hoveredLegend,\n onHoverLegend,\n onClickLegend,\n}) => {\n const { isMobile } = useScreenSize()\n const { getCategoryName } = useCategoryStore()\n\n return (\n <Stack direction=\"row\" flexWrap=\"wrap\" gap={isMobile ? 2 : 6} justifyContent=\"start\" sx={sx}>\n {categoryGuids.map(({ guid, top_level_guid }) => {\n const isHovered = hoveredLegend === guid\n const categoryColor = CategoryColors[guid]\n const topLevelCategoryColor = CategoryColors[top_level_guid]\n const baseBackground = categoryColor ?? topLevelCategoryColor ?? CategoryColors.default\n const transparentBackground = baseBackground + '33'\n const hoveredBackground = isHovered ? baseBackground : transparentBackground\n const backgroundColor = hoveredLegend ? hoveredBackground : baseBackground\n\n return (\n <Button\n key={guid}\n onClick={() => onClickLegend(guid)}\n onMouseEnter={() => onHoverLegend(guid)}\n onMouseLeave={() => onHoverLegend(null)}\n sx={{\n color: 'text.primary',\n fontWeight: 'normal',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n paddingX: 8,\n paddingY: 4,\n borderRadius: 1,\n opacity: isHovered ? 1 : 0.7,\n }}\n >\n <Box\n sx={{\n width: 16,\n height: 16,\n marginRight: isMobile ? 5 : 10,\n borderRadius: '2px',\n backgroundColor,\n }}\n />\n <Text variant=\"Body\">{getCategoryName(guid)}</Text>\n </Button>\n )\n })}\n </Stack>\n )\n}\n","import React from 'react'\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\nimport { useTheme } from '@mui/material/styles'\nimport { LineSeriesType, LineChart, HighlightItemData } from '@mui/x-charts'\n\nimport { DATE_FORMATS_INTL, formatDate } from '../../constants'\nimport { formatCurrency } from '../../utils'\nimport { useScreenSize } from '../../hooks'\n\nimport CustomAreaTooltip from './stackedlinechart/CustomAreaTooltip'\nimport { CustomPointTooltip } from './stackedlinechart/CustomPointTooltip'\nimport { CustomLegend } from './stackedlinechart/CustomLegend'\n\ntype DataPoint = { x: Date; y: number }\ntype Dataset = DataPoint[]\n\ninterface StackedLineChartData {\n top_level_category_guid: string\n category_guid: string\n category_name: string\n category_color: string\n dataset: Dataset\n}\n\ninterface StackedLineChartProps {\n stackedDatasets: StackedLineChartData[]\n unstackedDatasets?: StackedLineChartData[]\n onHoverArea?: (category: string) => void\n onHoverPoint?: (category: string) => void\n onHoverLegend?: (category: string) => void\n onClickLegend?: (category: string) => void\n height?: number\n width?: number\n}\n\nexport const StackedLineChart: React.FC<StackedLineChartProps> = ({\n onHoverArea,\n onHoverPoint,\n onHoverLegend,\n onClickLegend,\n stackedDatasets,\n unstackedDatasets = [],\n height,\n width,\n}) => {\n const theme = useTheme()\n const { isMobile } = useScreenSize()\n const chartContainerRef = React.useRef<HTMLDivElement>(null)\n\n const [hoveredLegend, setHoveredLegend] = React.useState<string | null>(null)\n const [hoverState, setHoverState] = React.useState({\n hoveredSeriesId: null as string | null,\n hoveredAreaData: null as DataPoint[] | null,\n isAreaHovered: false,\n cursorPos: { x: 0, y: 0 },\n })\n\n const { hoveredSeriesId, hoveredAreaData, isAreaHovered, cursorPos } = hoverState\n const showAreaTooltip = isAreaHovered && hoveredSeriesId && hoveredAreaData\n const showPointTooltip = !showAreaTooltip\n\n const datasets = [...stackedDatasets, ...unstackedDatasets]\n const xTicks = datasets[0]?.dataset.length ?? 0\n const xData = datasets.flatMap((data) => data.dataset.map((d) => d.x))\n const yData = datasets.flatMap((data) => data.dataset.map((d) => d.y))\n\n // Calculate max cumulative heights for stacked datasets\n const cumulativeHeights = stackedDatasets[0]?.dataset?.map((_, i) =>\n stackedDatasets.reduce((sum, dataset) => sum + dataset.dataset[i]?.y || 0, 0),\n ) ?? [0]\n const stackedMax = Math.max(...cumulativeHeights)\n const unstackedMax = Math.max(\n ...unstackedDatasets.flatMap((data) => data.dataset.map((d) => d.y)),\n )\n\n const yMin = Math.floor(Math.min(...yData) / 100) * 100\n const yMax = Math.ceil(Math.max(stackedMax, unstackedMax) / 100) * 100\n\n const stackedSeries = stackedDatasets.map((data, index) => ({\n id: `stacked-${index}`,\n guid: data.category_guid,\n top_level_guid: data.top_level_category_guid,\n area: true,\n color: stackedDatasets[index].category_color ?? theme.palette.primary.main,\n data: data.dataset.map((d) => d.y),\n label: stackedDatasets[index].category_name,\n stack: 'total',\n type: 'line',\n highlightScope: { highlight: 'item' },\n valueFormatter: (value: number) => formatCurrency(value, '0,0'),\n }))\n\n const unstackedSeries = unstackedDatasets.map((data, index) => ({\n id: `unstacked-${index}`,\n guid: data.category_guid,\n top_level_guid: data.top_level_category_guid,\n area: false,\n color: data.category_color,\n data: data.dataset.map((d) => d.y),\n label: data.category_name,\n type: 'line',\n valueFormatter: (value: number) => formatCurrency(value, '0,0'),\n }))\n\n const series = [...stackedSeries, ...unstackedSeries]\n const guids = [\n ...stackedSeries.map(({ guid, top_level_guid }) => ({\n guid,\n top_level_guid,\n })),\n ...unstackedSeries.map(({ guid, top_level_guid }) => ({\n guid,\n top_level_guid,\n })),\n ]\n\n const getSeriesCategoryGuids = (seriesId: string) => {\n const isStacked = seriesId.startsWith('stacked-')\n const dataset = isStacked\n ? stackedDatasets[parseInt(seriesId.split('-')[1])]\n : unstackedDatasets[parseInt(seriesId.split('-')[1])]\n return {\n guid: dataset?.category_guid,\n topLevelGuid: dataset?.top_level_category_guid,\n }\n }\n\n const handleHoverLegend = (guid: string | null) => {\n setHoveredLegend(guid)\n onHoverLegend?.(guid ?? '')\n }\n\n const handleClickLegend = (guid: string | null) => {\n onClickLegend?.(guid ?? '')\n }\n\n const handleClickArea = () => {\n const clickedSeriesGuid = getSeriesCategoryGuids(String(hoveredSeriesId)).guid\n if (clickedSeriesGuid) onClickLegend?.(clickedSeriesGuid)\n }\n\n const handleHighlightChange = (highlightedItem: HighlightItemData | null) => {\n const hoveredSeriesId = String(highlightedItem?.seriesId)\n const hoveredSeriesGuid = getSeriesCategoryGuids(hoveredSeriesId).guid\n const hoveredSeries = series.find((s) => s.id === hoveredSeriesId)\n const isPointHovered = hoveredSeries && highlightedItem?.dataIndex !== undefined\n const isAreaHovered = hoveredSeries && highlightedItem?.dataIndex === undefined\n\n if (isPointHovered) {\n setHoverState({\n hoveredSeriesId: hoveredSeriesId,\n hoveredAreaData: null,\n isAreaHovered: false,\n cursorPos,\n })\n onHoverPoint?.(hoveredSeriesGuid)\n } else if (isAreaHovered) {\n const hoveredDataPoints =\n hoveredSeries?.data.map((yValue, index) => ({\n x: xData[index],\n y: yValue,\n })) ?? []\n\n setHoverState({\n hoveredSeriesId: hoveredSeriesId,\n hoveredAreaData: hoveredDataPoints,\n isAreaHovered: true,\n cursorPos,\n })\n onHoverArea?.(hoveredSeriesGuid)\n } else {\n setHoverState({\n hoveredSeriesId: null,\n hoveredAreaData: null,\n isAreaHovered: false,\n cursorPos,\n })\n }\n }\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const rect = event.currentTarget.getBoundingClientRect()\n setHoverState((prev) => ({\n ...prev,\n cursorPos: {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n },\n }))\n }\n\n const customStyles = {\n p: 4,\n '& .MuiBarLabel-root': {\n fontSize: 10,\n fontWeight: 600,\n },\n '& .MuiAreaElement-root': {\n opacity: 0.4,\n transition: 'opacity 0.3s ease',\n },\n '& .MuiAreaElement-root:hover': {\n opacity: 1,\n },\n '& [class*=\"MuiLineElement-series-unstacked-\"]': {\n strokeWidth: 3,\n },\n ...(hoveredLegend &&\n stackedSeries.reduce<Record<string, any>>((acc, _, index) => {\n const selector = `.MuiAreaElement-series-stacked-${index}`\n acc[selector] = {\n opacity: stackedSeries[index].guid === hoveredLegend ? 0.9 : 0.2,\n }\n return acc\n }, {})),\n }\n\n return (\n <Box onMouseMove={handleMouseMove} ref={chartContainerRef} style={{ position: 'relative' }}>\n <Stack\n direction={{ xs: 'column', md: 'column' }}\n spacing={{ xs: 0, md: 4 }}\n sx={{ width: '100%', position: 'relative' }}\n >\n <LineChart\n height={height || 400}\n margin={{ bottom: 50 }}\n onAreaClick={handleClickArea}\n onHighlightChange={handleHighlightChange}\n series={series as LineSeriesType[]}\n skipAnimation={true}\n slotProps={{\n legend: {\n hidden: true,\n },\n }}\n slots={{\n itemContent: (props) => {\n return showPointTooltip && hoveredSeriesId ? (\n <CustomPointTooltip\n categoryGuids={getSeriesCategoryGuids(hoveredSeriesId)}\n xData={xData}\n {...props}\n />\n ) : null\n },\n }}\n sx={customStyles}\n tooltip={{\n trigger: showPointTooltip ? 'item' : 'none',\n }}\n width={width}\n xAxis={[\n {\n data: xData,\n scaleType: 'time',\n valueFormatter: (value: Date) =>\n formatDate(value, DATE_FORMATS_INTL.MONTH_SHORT_YEAR),\n tickNumber: xTicks, // How many ticks to show on the x-axis\n },\n ]}\n yAxis={[\n {\n min: yMin,\n max: yMax || 100,\n },\n ]}\n />\n <CustomLegend\n categoryGuids={guids}\n hoveredLegend={hoveredLegend}\n onClickLegend={handleClickLegend}\n onHoverLegend={handleHoverLegend}\n sx={{ px: isMobile ? 0 : 24 }}\n />\n\n {showAreaTooltip && (\n <CustomAreaTooltip\n categoryGuids={getSeriesCategoryGuids(hoveredSeriesId)}\n chartContainerRef={chartContainerRef}\n cursorPosition={cursorPos}\n hoveredAreaData={hoveredAreaData.map((point) => ({\n ...point,\n x: formatDate(point.x, DATE_FORMATS_INTL.MONTH_SHORT_YEAR),\n }))}\n />\n )}\n </Stack>\n </Box>\n )\n}\n","import React from 'react'\n\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\n\nexport type StatusBarData = {\n color: string\n percentage: string\n}\n\ninterface StatusBarProps {\n data: StatusBarData[]\n height?: number\n}\n\nconst StatusBar: React.FC<StatusBarProps> = ({ data, height = 8 }) => {\n const borderRadius = `${height / 4}px`\n\n return (\n <Stack\n bgcolor=\"grey.300\"\n borderRadius={borderRadius}\n direction=\"row\"\n gap={2}\n height={height}\n width=\"100%\"\n >\n {data.map((item, index) => (\n <Box\n bgcolor={item.color}\n borderRadius={borderRadius}\n height={height}\n key={index}\n width={item.percentage}\n />\n ))}\n </Stack>\n )\n}\n\nexport default StatusBar\n","import React from 'react'\nimport MuiDialog from '@mui/material/Dialog'\nimport DialogContent from '@mui/material/DialogContent'\nimport { DialogFooter, DialogHeader } from '@kyper/mui'\nimport { DialogProps as MuiDialogProps } from '@mui/material/Dialog'\n\nexport type CopyObject = {\n close_aria?: string\n title: string\n}\n\nexport interface DialogProps extends Omit<MuiDialogProps, 'open'> {\n className?: string\n copy: CopyObject\n disablePrimaryButton?: boolean\n isOpen: boolean\n onClose: () => void\n onPrimaryAction?: () => void\n onSecondaryAction?: () => void\n primaryColor?: 'primary' | 'inherit' | 'secondary' | 'success' | 'error' | 'info' | 'warning'\n primaryText?: string\n secondaryColor?: 'primary' | 'inherit' | 'secondary' | 'success' | 'error' | 'info' | 'warning'\n secondaryText?: string\n}\n\nconst Dialog: React.FC<React.PropsWithChildren<DialogProps>> = ({\n className,\n copy = {\n title: '',\n close_aria: 'Close',\n },\n disablePrimaryButton = false,\n isOpen = false,\n onClose,\n onPrimaryAction,\n primaryColor = 'primary',\n primaryText = 'Confirm',\n onSecondaryAction,\n secondaryColor = 'primary',\n secondaryText = 'Cancel',\n children,\n ...rest\n}) => {\n const handlePrimaryAction = () => {\n onPrimaryAction?.()\n onClose()\n }\n\n const handleSecondaryAction = () => {\n if (onSecondaryAction) {\n onSecondaryAction()\n }\n onClose()\n }\n\n return (\n <div className={`mx-cmn-dialog ${className}`}>\n <MuiDialog\n onClose={onClose}\n open={isOpen}\n sx={{\n '& .MuiDialog-paperScrollPaper': {\n backgroundColor: 'background.default',\n },\n height: '100%',\n }}\n {...rest}\n >\n <DialogHeader\n copy={{ title: copy.title, close_aria: copy.close_aria }}\n onClose={onClose}\n style={{ boxSizing: 'border-box' }}\n />\n\n <DialogContent sx={{ lineHeight: 1.5 }}>{children}</DialogContent>\n\n <DialogFooter\n isPrimaryDisabled={disablePrimaryButton}\n onPrimaryAction={handlePrimaryAction}\n onSecondaryAction={handleSecondaryAction}\n primaryColor={primaryColor}\n primaryText={primaryText}\n secondaryColor={secondaryColor}\n secondaryText={secondaryText}\n style={{ boxSizing: 'border-box' }}\n />\n </MuiDialog>\n </div>\n )\n}\n\nexport default Dialog\n","import React from 'react'\n\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\nimport IconButton from '@mui/material/IconButton'\nimport ArrowBackOutlinedIcon from '@mui/icons-material/ArrowBackOutlined'\n\nimport { H2 } from '@kyper/mui'\n\ninterface DrawerHeaderProps {\n ariaLabelClose: string\n onClose: () => void\n shouldShowBorders: boolean\n shouldShowShadow?: boolean\n title: string\n}\n\nconst DrawerHeader: React.FC<DrawerHeaderProps> = ({\n ariaLabelClose,\n onClose,\n shouldShowBorders,\n shouldShowShadow,\n title,\n}) => {\n return (\n <Stack\n aria-level={1}\n direction=\"row\"\n role=\"heading\"\n sx={{\n alignItems: 'center',\n backgroundColor: 'background.paper',\n ...(shouldShowBorders && {\n borderBottom: 1,\n borderTop: 1,\n borderColor: 'border.light',\n }),\n ...(shouldShowShadow && {\n boxShadow: '0px 2px 8px 0px #6A73811F',\n }),\n padding: '8px 8px 8px 8px',\n }}\n >\n <IconButton aria-label={ariaLabelClose} color=\"primary\" onClick={onClose}>\n <ArrowBackOutlinedIcon color=\"primary\" sx={{ fontSize: 22 }} />\n </IconButton>\n <Box\n sx={{\n flexGrow: 1,\n margin: 'auto',\n textAlign: 'center',\n }}\n >\n <H2 bold={true} variant=\"Body\">\n {title}\n </H2>\n </Box>\n {/* placeholder for when we add a button here, this also ensures the title text is centered */}\n <Box width=\"44px\" />\n </Stack>\n )\n}\n\nexport default DrawerHeader\n","import React from 'react'\n\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\nimport type { SxProps } from '@mui/material/styles'\n\nimport { Drawer as KMuiDrawer, Footer } from '@kyper/mui'\n\nimport Header from './Header'\n\nexport type CopyObject = {\n close_drawer_aria: string\n}\n\ninterface DrawerProps {\n ariaLabelClose?: string\n className?: string\n id?: string\n isOpen: boolean\n isPrimaryDisabled?: boolean\n onClose: () => void\n onPrimaryAction?: () => void\n onSecondaryAction?: () => void\n primaryColor?: 'primary' | 'inherit' | 'secondary' | 'success' | 'error' | 'info' | 'warning'\n primaryText?: string\n secondaryColor?: 'primary' | 'inherit' | 'secondary' | 'success' | 'error' | 'info' | 'warning'\n secondaryText?: string\n shouldShowHeaderBorders?: boolean\n shouldShowHeaderShadow?: boolean\n sx?: SxProps\n title: string\n}\n\nconst Drawer: React.FC<React.PropsWithChildren<DrawerProps>> = ({\n ariaLabelClose = 'Close',\n children,\n id,\n isOpen,\n isPrimaryDisabled,\n onClose,\n onPrimaryAction,\n onSecondaryAction,\n primaryColor = 'primary',\n primaryText,\n secondaryColor = 'secondary',\n secondaryText,\n shouldShowHeaderBorders = true,\n shouldShowHeaderShadow = false,\n title,\n ...rest\n}) => {\n return (\n <KMuiDrawer\n id={id}\n isOpen={isOpen}\n onClose={onClose}\n sx={{\n '& .MuiDrawer-paper': {\n backgroundColor: 'background.default',\n },\n height: '100%',\n '& .MuiToolbar-root': {\n backgroundColor: 'background.paper',\n },\n }}\n {...rest}\n >\n <Stack height=\"100%\" justifyContent=\"space-between\">\n <Header\n ariaLabelClose={ariaLabelClose}\n onClose={onClose}\n shouldShowBorders={shouldShowHeaderBorders}\n shouldShowShadow={shouldShowHeaderShadow}\n title={title}\n />\n\n <Box height=\"100%\" overflow=\"auto\">\n {children}\n </Box>\n\n {onPrimaryAction && (\n <Footer\n isPrimaryDisabled={isPrimaryDisabled}\n onPrimaryAction={onPrimaryAction}\n onSecondaryAction={onSecondaryAction ?? onClose}\n primaryColor={primaryColor}\n primaryText={primaryText}\n secondaryColor={secondaryColor}\n secondaryText={secondaryText}\n />\n )}\n </Stack>\n </KMuiDrawer>\n )\n}\n\nexport default Drawer\n","import React from 'react'\nimport { addMonths } from 'date-fns/addMonths'\nimport { addDays } from 'date-fns/addDays'\nimport { addYears } from 'date-fns/addYears'\nimport { differenceInCalendarDays } from 'date-fns/differenceInCalendarDays'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { endOfToday } from 'date-fns/endOfToday'\nimport { endOfYear } from 'date-fns/endOfYear'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { startOfYear } from 'date-fns/startOfYear'\nimport { subMonths } from 'date-fns/subMonths'\nimport { subDays } from 'date-fns/subDays'\nimport { subYears } from 'date-fns/subYears'\n\nimport Box from '@mui/material/Box'\nimport Button from '@mui/material/Button'\nimport ButtonGroup from '@mui/material/ButtonGroup'\nimport IconButton from '@mui/material/IconButton'\nimport Stack from '@mui/material/Stack'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\nimport ToggleButton from '@mui/material/ToggleButton'\nimport ToggleButtonGroup from '@mui/material/ToggleButtonGroup'\nimport Tooltip from '@mui/material/Tooltip'\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { DateRange } from '@mui/x-date-pickers-pro'\n\nimport { DateRangePicker, DateRangePickerCopy, Icon, Text } from '@kyper/mui'\n\nimport { DATE_FORMATS_INTL, formatDate } from '../../constants'\nimport { useScreenSize } from '../../hooks'\nimport Dialog from '../dialog/Dialog'\nimport Drawer from '../drawer/Drawer'\n\nexport type DateRangeSelectorCopy = {\n dateRangePickerCopy: DateRangePickerCopy\n dateRangeEditApply: string\n dateRangeEditTitle: string\n dateRangeNextAria: string\n dateRangePreviousAria: string\n dateRangeCloseAria: string\n}\n\nexport type CalendarActions = {\n shouldDisableNext?: boolean\n shouldDisablePrevious?: boolean\n shouldDisablePicker?: boolean\n onRangeChanged: (dateRange: DateRange<Date>) => void\n}\n\nexport interface DateRangeSelectorProps {\n calendarActions: CalendarActions\n color?: 'primary' | 'secondary'\n copy: DateRangeSelectorCopy\n range?: DateRange<Date>\n shouldShrinkToIcon?: boolean\n toolTipContent?: string\n variant?: 'outlined' | 'text' | 'readonly' | 'timeframebuttons' | 'timeframetabs'\n}\n\nexport type Timeframe = {\n label: string\n value: number\n}\n\nconst DateRangeSelector: React.FC<DateRangeSelectorProps> = ({\n calendarActions,\n color = 'primary',\n copy,\n range = [startOfMonth(startOfToday()), endOfMonth(endOfToday())],\n shouldShrinkToIcon = true,\n toolTipContent = '',\n variant = 'outlined',\n}) => {\n const theme = useTheme()\n const isDark = theme.palette.mode === 'dark'\n const { isDesktop, isMobile } = useScreenSize()\n\n const [dateRange, setDateRange] = React.useState<DateRange<Date>>(range)\n const [shortcut, setShortcut] = React.useState(copy.dateRangePickerCopy.dateRangeThisMonth)\n const [pickerDateRange, setPickerDateRange] = React.useState(dateRange)\n const [isPickerOpen, setIsPickerOpen] = React.useState(false)\n const [isMonthFormat, setIsMonthFormat] = React.useState(true)\n const [timeframe, setTimeframe] = React.useState(6)\n\n // TODO: put labels in mrs content and use as copy\n const timeframes = {\n buttons: [\n { label: '3M', value: 3 },\n { label: '6M', value: 6 },\n { label: '9M', value: 9 },\n { label: '1Y', value: 12 },\n ],\n tabs: [\n { label: '3 Months', value: 3 },\n { label: '6 Months', value: 6 },\n { label: '9 Months', value: 9 },\n { label: '1 Year', value: 12 },\n ],\n }\n\n React.useEffect(() => {\n setPickerDateRange(range)\n }, [range])\n\n // dates for timeframe buttons\n // using today's date as the end date, looks back 3, 6, 9, or 12 months\n React.useEffect(() => {\n if (variant === 'timeframebuttons' || variant === 'timeframetabs') {\n calendarActions.onRangeChanged(getTimeFrameDates())\n }\n }, [timeframe])\n\n const getTimeFrameDates = () => {\n const timeframeEndDate = endOfMonth(endOfToday()) as Date\n const timeframeBeginDate = endOfMonth(subMonths(timeframeEndDate, timeframe))\n return [timeframeBeginDate, timeframeEndDate] as DateRange<Date>\n }\n\n const handlePrevNextClick = (direction: 'previous' | 'next') => {\n const newRange = [...dateRange] as DateRange<Date>\n const beginDate = dateRange[0] as Date\n const endDate = dateRange[1] as Date\n const isPrev = direction === 'previous'\n\n if (shortcut === copy.dateRangePickerCopy.dateRangeThisMonth) {\n newRange[0] = isPrev ? subMonths(beginDate, 1) : addMonths(beginDate, 1)\n newRange[1] = endOfMonth(isPrev ? subMonths(endDate, 1) : addMonths(endDate, 1))\n } else if (\n shortcut === copy.dateRangePickerCopy.dateRangeYTD ||\n shortcut === copy.dateRangePickerCopy.dateRangeLastYear\n ) {\n newRange[0] = isPrev\n ? subYears(startOfYear(beginDate), 1)\n : addYears(startOfYear(beginDate), 1)\n newRange[1] = isPrev ? subYears(endOfYear(beginDate), 1) : addYears(endOfYear(beginDate), 1)\n } else {\n const numDays = differenceInCalendarDays(endDate, beginDate)\n newRange[0] =\n direction === 'previous' ? subDays(beginDate, numDays) : addDays(beginDate, numDays)\n newRange[1] = direction === 'previous' ? subDays(endDate, numDays) : addDays(endDate, numDays)\n }\n\n setDateRange(newRange)\n calendarActions.onRangeChanged(newRange)\n }\n\n const handleRangeChanged = () => {\n setDateRange(pickerDateRange)\n setIsMonthFormat(\n shortcut === copy.dateRangePickerCopy.dateRangeThisMonth ||\n shortcut === copy.dateRangePickerCopy.dateRangeLastMonth,\n )\n calendarActions.onRangeChanged(pickerDateRange)\n }\n\n const handleTimeframeChanged = (timeframe: number) => {\n setTimeframe(timeframe)\n }\n\n return (\n <Box className=\"mx-cmn-date-range-selector\" m={4}>\n <Tooltip\n id=\"select-date\"\n placement=\"bottom\"\n sx={{ display: { xs: shouldShrinkToIcon ? 'inline-flex' : 'none', sm: 'none' } }}\n title={toolTipContent}\n >\n <IconButton\n aria-describedby=\"select-date\"\n aria-label=\"Select a date\"\n onClick={() => setIsPickerOpen(true)}\n >\n <Icon name=\"calendar_month\" />\n </IconButton>\n </Tooltip>\n\n <Box\n sx={{\n [theme.breakpoints.down('sm')]: {\n display: shouldShrinkToIcon ? 'none' : 'flex',\n justifyContent: 'center',\n },\n [theme.breakpoints.up('sm')]: { display: 'inline-flex' },\n }}\n >\n {variant === 'readonly' && (\n <Stack alignItems=\"center\" direction=\"row\" gap={8}>\n <Icon name=\"calendar_month\" size={24} />\n <Text bold={true}>\n {formatDate(pickerDateRange[0] as Date, DATE_FORMATS_INTL.MONTH_DAY)}\n </Text>\n <Icon name=\"remove\" />\n <Text bold={true}>\n {formatDate(pickerDateRange[1] as Date, DATE_FORMATS_INTL.MONTH_DAY_YEAR)}\n </Text>\n </Stack>\n )}\n\n {variant !== 'readonly' &&\n variant !== 'timeframebuttons' &&\n variant !== 'timeframetabs' && (\n <ButtonGroup\n color={color}\n sx={{\n '& .MuiButtonGroup-grouped': {\n padding: isMobile ? 0 : 'inherit',\n },\n height: 44,\n }}\n variant={variant}\n >\n <Button\n aria-disabled={calendarActions.shouldDisablePrevious}\n aria-label={copy.dateRangePreviousAria}\n color={calendarActions.shouldDisablePrevious ? 'secondary' : 'primary'}\n onClick={() =>\n calendarActions.shouldDisablePrevious ? null : handlePrevNextClick('previous')\n }\n >\n <Icon name=\"chevron_left\" size={28} />\n </Button>\n <Button\n aria-disabled={calendarActions.shouldDisablePicker}\n color={color}\n onClick={() => (calendarActions.shouldDisablePicker ? null : setIsPickerOpen(true))}\n startIcon={<Icon name=\"calendar_month\" size={20} />}\n sx={{\n p: isMobile ? 0 : 8,\n width: isDesktop ? 280 : 232,\n }}\n >\n {isMonthFormat ? (\n formatDate(dateRange[0] as Date, DATE_FORMATS_INTL.MONTH_YEAR)\n ) : (\n <span>\n {formatDate(dateRange[0] as Date, DATE_FORMATS_INTL.MONTH_DAY_YEAR)} -{' '}\n {formatDate(dateRange[1] as Date, DATE_FORMATS_INTL.MONTH_DAY_YEAR)}\n </span>\n )}\n </Button>\n <Button\n aria-disabled={calendarActions.shouldDisableNext}\n aria-label={copy.dateRangeNextAria}\n color={calendarActions.shouldDisableNext ? 'secondary' : 'primary'}\n onClick={() =>\n calendarActions.shouldDisableNext ? null : handlePrevNextClick('next')\n }\n >\n <Icon name=\"chevron_right\" size={28} />\n </Button>\n </ButtonGroup>\n )}\n\n {variant === 'timeframebuttons' && (\n <ToggleButtonGroup\n color={color}\n exclusive={true}\n orientation=\"horizontal\"\n value={timeframe}\n >\n {timeframes.buttons.map((timeframe: Timeframe) => (\n <ToggleButton\n key={timeframe.label}\n onClick={() => handleTimeframeChanged(timeframe.value)}\n sx={{\n fontSize: 15,\n fontWeight: 600,\n height: 44,\n width: 56,\n color: isDark ? theme.palette.grey[200] : theme.palette.grey[600],\n borderColor: isDark ? theme.palette.grey[600] : theme.palette.grey[400],\n '&:hover': {\n backgroundColor: isDark ? `${theme.palette.primary.darker}25` : 'inherit', // with 25% opacity\n borderColor: isDark ? theme.palette.grey[500] : theme.palette.primary.main,\n color: isDark ? theme.palette.primary.light : theme.palette.primary.dark,\n },\n '&.Mui-selected': {\n backgroundColor: isDark\n ? theme.palette.primary.darker\n : theme.palette.primary.lighter,\n borderColor: isDark ? theme.palette.primary.light : theme.palette.primary.main,\n color: isDark ? theme.palette.common.white : theme.palette.primary.dark,\n },\n '&.Mui-disabled': {\n borderColor: isDark ? theme.palette.grey[700] : theme.palette.grey[400],\n color: theme.palette.grey[500],\n },\n }}\n value={timeframe.value}\n >\n {timeframe.label}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n )}\n\n {variant === 'timeframetabs' && (\n <Tabs\n indicatorColor=\"primary\"\n onChange={(_, newValue) => handleTimeframeChanged(newValue)}\n textColor=\"primary\"\n value={timeframe}\n variant=\"fullWidth\"\n >\n {timeframes.tabs.map((timeframe: Timeframe) => (\n <Tab\n key={timeframe.label}\n label={\n <Text bold={true} variant=\"Body\">\n {timeframe.label}\n </Text>\n }\n sx={{ minWidth: 80 }}\n value={timeframe.value}\n />\n ))}\n </Tabs>\n )}\n </Box>\n\n {isPickerOpen && isMobile && (\n <Drawer\n ariaLabelClose={copy.dateRangeCloseAria}\n isOpen={isPickerOpen}\n onClose={() => setIsPickerOpen(false)}\n onPrimaryAction={() => {\n handleRangeChanged()\n setIsPickerOpen(false)\n }}\n primaryText={copy.dateRangeEditApply}\n title={copy.dateRangeEditTitle}\n >\n <DateRangePicker\n copy={copy.dateRangePickerCopy}\n dateRange={pickerDateRange}\n onRangeChanged={(range, shortcut) => {\n setPickerDateRange(range)\n setShortcut(shortcut)\n }}\n selectedShortcut={shortcut}\n sx={{ p: 16 }}\n />\n </Drawer>\n )}\n\n {isPickerOpen && !isMobile && (\n <Dialog\n copy={{ title: copy.dateRangeEditTitle }}\n isOpen={true}\n onClose={() => setIsPickerOpen(false)}\n onPrimaryAction={() => handleRangeChanged()}\n primaryText={copy.dateRangeEditApply}\n sx={{\n '& .MuiDialogContent-root': {\n padding: 0,\n },\n }}\n >\n <DateRangePicker\n copy={copy.dateRangePickerCopy}\n dateRange={pickerDateRange}\n onRangeChanged={(range, shortcut) => {\n setPickerDateRange(range)\n setShortcut(shortcut)\n }}\n selectedShortcut={shortcut}\n sx={{\n pt: 0,\n '& .MuiPickersLayout-toolbar': {\n gridColumn: '1/4',\n },\n }}\n />\n </Dialog>\n )}\n </Box>\n )\n}\n\nexport default DateRangeSelector\n","import React from 'react'\nimport { css } from '@mxenabled/cssinjs'\n\nimport { useTokens } from '@kyper/mui'\n\nimport { DEFAULT_DONUT_SIZE, DEFAULT_STROKE_WIDTH } from '../../constants/Donut'\n\nexport interface Segment {\n percent: number\n color: string\n}\n\nexport interface MultiSegmentDonutProps {\n children: React.ReactNode\n hasGap?: boolean\n segments: Segment[]\n size?: number\n strokeWidth?: number\n}\n\nconst MultiSegmentDonut: React.FC<MultiSegmentDonutProps> = ({\n hasGap = false,\n segments,\n size = DEFAULT_DONUT_SIZE,\n strokeWidth = DEFAULT_STROKE_WIDTH,\n children,\n}) => {\n const tokens = useTokens()\n const styles = getStyles(tokens, size)\n\n const radius = (size - strokeWidth) / 2\n const halfSize = size / 2\n\n let offset = -90 - (hasGap ? 1 : 0)\n\n let length = 0\n\n return (\n <div className={`mx-cmn-multi-segment-donut ${styles}`}>\n <svg height={size} width={size}>\n <circle\n cx={halfSize}\n cy={halfSize}\n fill=\"none\"\n r={radius}\n stroke={tokens.Color.Neutral300}\n strokeWidth={strokeWidth}\n />\n {segments.map((segment, index) => {\n offset += 360 * length + (hasGap ? 1 : 0)\n length = (segment.percent - (hasGap ? 0.3 : 0)) / 100\n\n return (\n <circle\n cx={halfSize}\n cy={halfSize}\n fill=\"none\"\n key={index}\n r={radius}\n stroke={segment.color}\n strokeDasharray={2 * Math.PI * radius}\n strokeDashoffset={2 * Math.PI * radius * (1 - length)}\n strokeWidth={strokeWidth}\n transform={`rotate(${offset}, ${halfSize}, ${halfSize})`}\n />\n )\n })}\n </svg>\n <div className=\"mx-cmn-multi-segment-donut-children\">{children}</div>\n </div>\n )\n}\n\nconst getStyles = (tokens: any, size: number) =>\n css({\n height: size,\n marginTop: `-${tokens.Spacing.XSmall}px`,\n position: 'relative',\n width: size,\n '& .mx-cmn-multi-segment-donut-children': {\n left: '50%',\n position: 'absolute',\n textAlign: 'center',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n },\n })\n\nexport default MultiSegmentDonut\n","import React from 'react'\n\nimport Box from '@mui/material/Box'\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { DEFAULT_DONUT_SIZE, DEFAULT_STROKE_WIDTH } from '../../constants'\n\nexport interface SingleSegmentDonutProps {\n children: React.ReactNode\n color: string\n percent: number\n size?: number\n strokeWidth?: number\n}\n\nconst SingleSegmentDonut: React.FC<SingleSegmentDonutProps> = ({\n color = '',\n percent = 0,\n size = DEFAULT_DONUT_SIZE,\n strokeWidth = DEFAULT_STROKE_WIDTH,\n children,\n}) => {\n const theme = useTheme()\n\n const radius = (size - strokeWidth) / 2\n const offset = -90\n const limitedPercent = percent > 100 ? 100 : percent\n const length = 2 * Math.PI * radius * (1 - limitedPercent / 100)\n const halfSize = size / 2\n\n return (\n <Box\n className=\"mx-cmn-single-segment-donut\"\n height={size}\n mt={-8}\n position=\"relative\"\n width={size}\n >\n <svg height={size} width={size}>\n <circle\n cx={halfSize}\n cy={halfSize}\n fill=\"none\"\n r={radius}\n stroke={theme.palette.grey[300]}\n strokeWidth={strokeWidth}\n />\n\n <circle\n cx={halfSize}\n cy={halfSize}\n fill=\"none\"\n r={radius}\n stroke={color}\n strokeDasharray={2 * Math.PI * radius}\n strokeDashoffset={length}\n strokeWidth={strokeWidth}\n transform={`rotate(${offset}, ${halfSize}, ${halfSize})`}\n />\n </svg>\n <Box\n className=\"mx-cmn-single-segment-donut-children\"\n left=\"50%\"\n position=\"absolute\"\n sx={{ transform: 'translate(-50%, -50%)' }}\n textAlign=\"center\"\n top=\"50%\"\n >\n {children}\n </Box>\n </Box>\n )\n}\n\nexport default SingleSegmentDonut\n","// Based off the useMeasure hook from useHooks.com/usemeasure(ui.dev). Converted to typescript and added a debounce. https://github.com/uidotdev/usehooks/blob/main/index.js\n\nimport React from 'react'\n\ntype Dimensions = {\n width: number\n height: number\n}\n\n// Memoized debounce function\nconst useDebounce = <T extends (...args: any[]) => void>(func: T, delay: number) => {\n return React.useMemo(() => {\n let timeoutId: NodeJS.Timeout | null = null\n return (...args: Parameters<T>) => {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n timeoutId = setTimeout(() => {\n func(...args)\n }, delay)\n }\n }, [func, delay])\n}\n\nexport function useDimensions(\n debounceDelay: number = 100,\n): [React.RefCallback<HTMLElement>, Dimensions] {\n const [dimensions, setDimensions] = React.useState<Dimensions>({\n width: 0,\n height: 0,\n })\n\n const observerRef = React.useRef<ResizeObserver | null>(null)\n const previousDimensions = React.useRef<Dimensions>(dimensions)\n\n const debouncedSetDimensions = useDebounce((width: number, height: number) => {\n if (\n width !== previousDimensions.current.width ||\n height !== previousDimensions.current.height\n ) {\n setDimensions({ width, height })\n previousDimensions.current = { width, height }\n }\n }, debounceDelay)\n\n const customRef = React.useCallback(\n (node: HTMLElement | null) => {\n if (observerRef.current) {\n observerRef.current.disconnect()\n observerRef.current = null\n }\n\n if (node?.nodeType === Node.ELEMENT_NODE) {\n const observer = new ResizeObserver(([entry]) => {\n if (entry && entry.borderBoxSize) {\n const { inlineSize: width, blockSize: height } = entry.borderBoxSize[0]\n debouncedSetDimensions(width, height)\n }\n })\n\n observer.observe(node)\n observerRef.current = observer\n }\n },\n [debouncedSetDimensions],\n )\n\n // Add cleanup effect\n React.useEffect(() => {\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect()\n }\n }\n }, [])\n\n return [customRef, dimensions]\n}\n","import React from 'react'\n\nimport Button from '@mui/material/Button'\nimport Card from '@mui/material/Card'\nimport CardHeader from '@mui/material/CardHeader'\nimport CardContent from '@mui/material/CardContent'\nimport type { SxProps } from '@mui/material/styles'\n\nimport { H3, Icon, Text } from '@kyper/mui'\n\nimport { WidgetContainerProvider } from '../context'\nimport { useDimensions } from '../hooks/useDimensions'\n\ninterface CardContainerProps {\n className?: string\n onPrimaryCtaClick?: () => void\n primaryCtaLabel?: string\n subTitle?: string\n sx?: SxProps\n title?: string\n}\n\nconst MiniWidgetContainer: React.FC<React.PropsWithChildren<CardContainerProps>> = ({\n className = 'mx-cmn-mini-widget',\n children,\n onPrimaryCtaClick,\n primaryCtaLabel = '',\n subTitle = '',\n sx = {},\n title = '',\n}) => {\n const [containerRef, { height, width }] = useDimensions()\n\n return (\n <Card className={className} sx={{ borderRadius: '8px', ...sx }}>\n <CardHeader\n action={\n onPrimaryCtaClick && (\n <Button\n endIcon={<Icon name=\"keyboard_arrow_right_rounded\" />}\n onClick={onPrimaryCtaClick}\n >\n <Text bold={true} variant=\"Small\">\n {primaryCtaLabel}\n </Text>\n </Button>\n )\n }\n subheader={subTitle ? subTitle : null}\n subheaderTypographyProps={{ variant: 'Small' }}\n sx={{ pb: 4 }}\n title={title ? <H3 sx={{ pb: 4 }}>{title}</H3> : null}\n />\n\n <CardContent ref={containerRef} sx={{ p: 0 }}>\n <WidgetContainerProvider availableHeight={height} availableWidth={width}>\n {children}\n </WidgetContainerProvider>\n </CardContent>\n </Card>\n )\n}\n\nexport default MiniWidgetContainer\n","import React, { PropsWithChildren } from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Button from '@mui/material/Button'\nimport Box from '@mui/material/Box'\nimport Card from '@mui/material/Card'\nimport CardHeader from '@mui/material/CardHeader'\nimport CardContent from '@mui/material/CardContent'\nimport Divider from '@mui/material/Divider'\nimport IconButton from '@mui/material/IconButton'\nimport Stack from '@mui/material/Stack'\nimport type { SxProps } from '@mui/material/styles'\n\nimport { H1, H3, Icon } from '@kyper/mui'\n\nimport { AccountFilter } from './accountfilter'\nimport { DateRangeSelector } from './daterangeselector'\nimport { ANALYTICS_EVENTS, useEvent } from '../../common'\nimport { useGlobalCopyStore, useGlobalUiStore } from '../context'\nimport { useScreenSize } from '../hooks'\nimport { Account } from '../types'\nimport { CalendarActions, DateRangeSelectorCopy } from './daterangeselector/DateRangeSelector'\n\nimport { WidgetContainerProvider } from '../context'\nimport { useDimensions } from '../hooks/useDimensions'\n\ntype Action = {\n label: string\n iconName: string\n onClick: () => void\n}\n\ninterface WidgetContainerProps {\n accountOptions?: Account[]\n actions?: Action[]\n calendarActions?: CalendarActions\n className?: string\n dateRange?: { start: Date; end: Date }\n dateRangeVariant?: 'outlined' | 'text' | 'readonly' | 'timeframebuttons' | 'timeframetabs'\n hasDivider?: boolean\n onBackClick?: () => void\n onAccountsFilterClick?: () => void\n showDividerAboveDateSelector?: boolean\n sx?: SxProps\n title?: string\n}\n\nconst WidgetContainer: React.FC<PropsWithChildren<WidgetContainerProps>> = ({\n accountOptions,\n actions = [],\n calendarActions,\n children,\n dateRange,\n dateRangeVariant,\n className = 'mx-cmn-widget',\n hasDivider = false,\n onBackClick,\n onAccountsFilterClick,\n showDividerAboveDateSelector = true,\n sx = {},\n title = '',\n}) => {\n const [containerRef, { height, width }] = useDimensions()\n const { onEvent } = useEvent()\n\n const { isDesktop, isMobile, isTablet } = useScreenSize()\n const { displayedDateRange, selectedAccountGuids, setSelectedAccountGuids } = useGlobalUiStore()\n const { common: commonCopy } = useGlobalCopyStore()\n\n const handleBackClick = () => {\n if (onBackClick) {\n onBackClick()\n onEvent(ANALYTICS_EVENTS.WIDGET_BACK_CLICK)\n }\n }\n\n const accountFilterCopy = {\n accountFilterOptionsCopy: {\n accountTypeAccounts: commonCopy.account_filter.account_type_accounts,\n cancelButton: commonCopy.cancel_button,\n filterButton: commonCopy.filter_button,\n filterButtonAria: commonCopy.account_filter.filter_button_generic_aria,\n selectAllAccounts: commonCopy.account_filter.select_all_accounts,\n toggleAccountTypeAccounts: commonCopy.account_filter.toggle_account_type_accounts,\n unselectAllAccounts: commonCopy.account_filter.unselect_all_accounts,\n zeroStateButton: commonCopy.account_filter.zero_state_button,\n zeroStateDescription: commonCopy.account_filter.zero_state_description,\n zeroStateTitle: commonCopy.account_filter.zero_state_title,\n },\n title: commonCopy.account_filter.title,\n }\n\n const dateRangeSelectorCopy = {\n dateRangePickerCopy: {\n dateRangeFrom: commonCopy.date_range_picker.from,\n dateRangeTo: commonCopy.date_range_picker.to,\n dateRangeCustom: commonCopy.date_range_picker.custom,\n dateRangeSelectARange: commonCopy.date_range_picker.select_range,\n dateRangeThisMonth: commonCopy.date_range_picker.this_month,\n dateRangeLastMonth: commonCopy.date_range_picker.last_month,\n dateRangeLast30Days: commonCopy.date_range_picker.last_30_days,\n dateRangeLast90Days: commonCopy.date_range_picker.last_90_days,\n dateRangeYTD: commonCopy.date_range_picker.ytd,\n dateRangeLastYear: commonCopy.date_range_picker.last_year,\n dateRangeSelect: commonCopy.date_range_picker.select,\n },\n dateRangeEditApply: commonCopy.date_range_picker.edit_apply,\n dateRangeEditTitle: commonCopy.date_range_picker.edit_title,\n dateRangeNextAria: commonCopy.date_range_picker.next_aria,\n dateRangePreviousAria: commonCopy.date_range_picker.previous_aria,\n } as DateRangeSelectorCopy\n\n const startDate = dateRange ? dateRange.start : displayedDateRange.start\n const endDate = dateRange ? dateRange.end : displayedDateRange.end\n\n return (\n <Card\n className={className}\n sx={{\n borderRadius: '8px',\n ...(isMobile && {\n px: 4,\n }),\n '& .mx-cmn-date-range-selector': {\n ...((isMobile || isTablet) && {\n textAlign: 'center',\n }),\n },\n ...sx,\n }}\n >\n <CardHeader\n action={\n <Stack alignItems=\"center\" flexDirection=\"row\">\n {isDesktop && calendarActions && (\n <Box sx={{ flexGrow: 1 }}>\n <DateRangeSelector\n calendarActions={calendarActions}\n copy={dateRangeSelectorCopy}\n range={[startDate, endDate]}\n shouldShrinkToIcon={false}\n variant={dateRangeVariant}\n />\n </Box>\n )}\n {accountOptions && (\n <AccountFilter\n accounts={accountOptions}\n copy={accountFilterCopy}\n onFilterClick={(guids) => {\n const selAcctGuids = accountOptions\n .filter((account) => guids.includes(account.guid))\n .map((account) => account.guid)\n\n setSelectedAccountGuids(selAcctGuids)\n onAccountsFilterClick?.()\n }}\n selectedAccountGuids={selectedAccountGuids}\n showAccountNumbers={false}\n sx={{ '& .mx-cmn-account-filter-title': { fontSize: 15 }, mx: 4 }}\n variant=\"text\"\n />\n )}\n {actions.map((action) =>\n isDesktop || isTablet ? (\n <Button\n key={action.iconName}\n onClick={action.onClick}\n startIcon={<Icon name={action.iconName} />}\n sx={{ mx: 4 }}\n >\n {action.label}\n </Button>\n ) : (\n <IconButton\n aria-label={action.label}\n key={action.iconName}\n onClick={action.onClick}\n >\n <Icon name={action.iconName} />\n </IconButton>\n ),\n )}\n </Stack>\n }\n sx={{\n '& .MuiCardHeader-action': {\n ...(calendarActions && isDesktop && { flexGrow: 1 }),\n ...((isMobile || isTablet) && {\n alignSelf: 'center',\n }),\n },\n p: isDesktop ? 48 : 24,\n pb: 0,\n }}\n title={\n isDesktop || isTablet ? (\n <H1>{title}</H1>\n ) : (\n <Stack alignItems=\"center\" flexDirection=\"row\">\n {isMobile && onBackClick && (\n <IconButton\n aria-label={commonCopy.back_to_dashboard}\n onClick={handleBackClick}\n sx={{ ml: -16, mr: 16 }}\n >\n <Icon name=\"arrow_back\" />\n </IconButton>\n )}\n <H3>{title}</H3>\n </Stack>\n )\n }\n />\n\n {hasDivider && <Divider sx={{ mt: isDesktop ? 48 : 24 }} />}\n\n {calendarActions && (isMobile || isTablet) && (\n <Stack gap={24} justifyContent=\"center\" sx={{ mt: 16 }}>\n {showDividerAboveDateSelector && <Divider />}\n <DateRangeSelector\n calendarActions={calendarActions}\n copy={dateRangeSelectorCopy}\n range={[startDate, endDate]}\n shouldShrinkToIcon={false}\n variant={dateRangeVariant}\n />\n </Stack>\n )}\n <CardContent ref={containerRef} sx={{ p: 0 }}>\n <WidgetContainerProvider availableHeight={height} availableWidth={width}>\n {children}\n </WidgetContainerProvider>\n </CardContent>\n </Card>\n )\n}\n\nexport default observer(WidgetContainer)\n","import { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport CircularProgress from '@mui/material/CircularProgress'\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@kyper/mui'\n\nimport { MemberConnectionStatus } from '../../accounts'\nimport { useGlobalCopyStore } from '../../common'\n\ninterface ConnectStatus {\n status?: MemberConnectionStatus\n}\n\nconst ConnectStatus: React.FC<ConnectStatus> = ({ status = MemberConnectionStatus.Loading }) => {\n const { connect: connectCopy } = useGlobalCopyStore()\n\n return (\n <Box\n sx={{\n height: 'calc(100% - 62px)',\n position: 'absolute',\n width: '100%',\n }}\n >\n <Stack alignItems=\"center\" direction=\"column\" justifyContent=\"center\" sx={{ height: '100%' }}>\n {status === MemberConnectionStatus.Loading && (\n <CircularProgress color=\"primary\" size={48} />\n )}\n <Text\n sx={{\n color: 'grey.600',\n marginTop: '16px',\n }}\n >\n {status === MemberConnectionStatus.Error ? connectCopy.oops : connectCopy.loading}\n </Text>\n </Stack>\n </Box>\n )\n}\n\nexport default observer(ConnectStatus)\n","export enum MemberConnectionStatus {\n Loading = 'loading',\n Error = 'error',\n}\n\nexport enum FieldType {\n Currency = 'currency',\n Date = 'date',\n Input = 'input',\n Select = 'select',\n}\n","export const CONNECT_WIDGET_ID = 'connect_widget'\nexport const CONNECTIONS_WIDGET_ID = 'connections_widget'\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport useTheme from '@mui/material/styles/useTheme'\nimport { ConnectWidget } from '@mxenabled/web-widget-sdk'\n\nimport ConnectStatus from '../../accounts/components/ConnectStatus'\nimport { Drawer, useAccountStore, useGlobalCopyStore } from '../../common'\nimport { MemberConnectionStatus } from '../../accounts/constants/Accounts'\nimport { CONNECT_WIDGET_ID } from '../constants/Connect'\nimport { useConnectStore } from '../context/hooks'\n\ninterface ConnectDrawerProps {\n loadWidgetProps?: object\n onClose: () => void\n showConnectWidget: boolean\n title: string\n}\n\nconst ConnectDrawer: React.FC<ConnectDrawerProps> = ({\n loadWidgetProps,\n onClose,\n showConnectWidget,\n title,\n}) => {\n let connectWidget: ConnectWidget\n\n const { refreshAccounts } = useAccountStore()\n const { loadWidget } = useConnectStore()\n const { connect: connectCopy } = useGlobalCopyStore()\n const [isLoading, setIsLoading] = React.useState(false)\n const [hasError, setHasError] = React.useState(false)\n const {\n palette: { mode },\n } = useTheme()\n\n React.useEffect(() => {\n if (showConnectWidget) {\n setIsLoading(true)\n loadWidget({ mode: mode, ...loadWidgetProps }).then((res) => {\n connectWidget = new ConnectWidget({\n container: `#${CONNECT_WIDGET_ID}`,\n style: {\n height: 'calc(100% - 62px)',\n maxWidth: '450px',\n position: 'absolute',\n width: '100%',\n },\n url: res.url,\n onSsoUrlLoadError: () => {\n setIsLoading(false)\n setHasError(true)\n },\n onLoad: () => {\n setIsLoading(false)\n setHasError(false)\n },\n })\n })\n } else {\n setIsLoading(false)\n setHasError(false)\n }\n\n return () => {\n connectWidget?.unmount()\n }\n }, [showConnectWidget])\n\n return (\n <Drawer\n ariaLabelClose={connectCopy.close_manage_connection_aria}\n isOpen={showConnectWidget}\n onClose={() => {\n onClose()\n refreshAccounts()\n }}\n title={title}\n >\n <div id={CONNECT_WIDGET_ID}>\n {hasError && <ConnectStatus status={MemberConnectionStatus.Error} />}\n {isLoading && <ConnectStatus status={MemberConnectionStatus.Loading} />}\n </div>\n </Drawer>\n )\n}\n\nexport default observer(ConnectDrawer)\n","import React from 'react'\nimport { css } from '@mxenabled/cssinjs'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport type { TextFieldProps as MuiTextFieldProps } from '@mui/material/TextField'\n\nimport { P, TextField, useTokens } from '@kyper/mui'\n\nimport { buildDynamicCopy, getLocale } from '../utils/Localization'\nimport { formatCurrency, getCurrencyCodes } from '../utils/NumberFormatting'\nimport { CurrencyCodes, MAX_MONEY_INPUT } from '../constants/Numbers'\nimport { CurrencyInputCopy } from '../types'\nimport { useGlobalCopyStore } from '../../common'\n\ntype CurrencyInputProps = {\n allowDecimals?: boolean\n amountIsRequired?: boolean\n ariaLabel?: string\n amount: string | number\n copy?: CurrencyInputCopy\n customValidate?: () => boolean\n errorText?: string\n label?: string\n minAmount?: number\n setAmount: (s: string) => void\n setHasValidInput?: (b: boolean) => void\n} & MuiTextFieldProps\n\nconst CurrencyInput: React.FC<CurrencyInputProps> = ({\n allowDecimals = true,\n ariaLabel,\n amount,\n amountIsRequired = true,\n copy,\n customValidate = () => true,\n errorText = '',\n label,\n minAmount = 1,\n setAmount,\n setHasValidInput,\n ...rest\n}) => {\n const [errorMsg, setErrorMsg] = React.useState('')\n const { common: commonCopy } = useGlobalCopyStore()\n const customCopy = copy ? copy : commonCopy.currency_input\n\n const tokens = useTokens()\n const styles = getStyles(tokens)\n\n const numbersOnly = /^[0-9]*$/\n // disabling this lint rule because this \"useless\" escape is not useless and breaks functionality if removed\n // eslint-disable-next-line no-useless-escape\n const numbersWithComma = /^(\\d)*(\\,)?([0-9]{1,2})?$/\n const numbersWithDecimal = /^(\\d)*(\\.)?([0-9]{1,2})?$/\n let pattern: RegExp\n\n const nameRef = React.useRef(uuidv4())\n\n if (allowDecimals) {\n switch (getCurrencyCodes()) {\n case CurrencyCodes.CAD:\n pattern = numbersWithComma\n break\n default:\n pattern = numbersWithDecimal\n break\n }\n } else {\n pattern = numbersOnly\n }\n\n React.useEffect(() => {\n handleValidation(amount)\n }, [amount])\n\n const handleValidation = (value: string | number) => {\n if (!amountIsRequired && (value === '' || value === '.' || value === ',')) {\n // don't display error in these instances, but indicate the input isn't valid\n setErrorMsg('')\n setHasValidInput?.(false)\n } else if (Number(value) < minAmount) {\n // display error if number is negative\n setErrorMsg(\n buildDynamicCopy(\n customCopy.error_amount_must_be_equal_to,\n formatCurrency(minAmount, '0'),\n ) as string,\n )\n setHasValidInput?.(false)\n } else if (Number(value) > MAX_MONEY_INPUT) {\n // display error if number is greater than max amount allowed\n setErrorMsg(\n buildDynamicCopy(\n customCopy.error_amount_must_be_less_than_or_equal_to,\n formatCurrency(MAX_MONEY_INPUT, allowDecimals ? '0,0.00' : '0,0', Math.floor),\n ) as string,\n )\n setHasValidInput?.(false)\n } else if (!value.toString().match(pattern)) {\n // check that input is valid and display error on special characters, etc\n setErrorMsg(customCopy.error_amount_is_invalid)\n setHasValidInput?.(false)\n } else if (!customValidate()) {\n // if custom error validation returns false, error passed in by parent is displayed\n setErrorMsg(errorText)\n setHasValidInput?.(false)\n } else {\n // input is valid!\n setErrorMsg('')\n setHasValidInput?.(true)\n }\n\n setAmount(value.toString())\n }\n\n return (\n <TextField\n InputProps={{\n endAdornment: getLocale().includes('fr-ca') ? <P>$</P> : undefined,\n startAdornment: !getLocale().includes('fr-ca') ? <P>$</P> : undefined,\n }}\n aria-label={ariaLabel || customCopy.enter_amount}\n className={`mx-cmn-currency-input ${styles}`}\n error={Boolean(errorMsg)}\n helperText={errorMsg}\n inputMode={allowDecimals ? 'decimal' : 'numeric'}\n inputProps={{\n noValidate: true,\n pattern: '[0-9]*',\n }}\n label={label}\n name={`currency-input-${nameRef.current}`}\n onChange={(e: any) => handleValidation(e.target.value)}\n value={amount}\n {...rest}\n />\n )\n}\n\nconst getStyles = (tokens: any) =>\n css({\n '& .MuiInputBase-adornedStart > .p': {\n marginRight: tokens.Spacing.Tiny,\n },\n })\n\nexport default CurrencyInput\n","import React from 'react'\n\nimport CircularProgress from '@mui/material/CircularProgress'\nimport Stack from '@mui/material/Stack'\n\nimport { Text, useTokens } from '@kyper/mui'\n\ninterface LoaderProps {\n label?: string\n size?: number\n}\n\nconst Loader: React.FC<LoaderProps> = ({ label = '', size = 32 }) => {\n const tokens = useTokens()\n\n return (\n <Stack alignItems=\"center\" gap={tokens.Spacing.XLarge} height={450} justifyContent=\"center\">\n <CircularProgress size={size} />\n {label && <Text>{label}</Text>}\n </Stack>\n )\n}\n\nexport default Loader\n","import React from 'react'\n\nimport Button from '@mui/material/Button'\nimport IconButton from '@mui/material/IconButton'\nimport Tooltip from '@mui/material/Tooltip'\nimport useTheme from '@mui/material/styles/useTheme'\n\ninterface ResponsiveButtonProps {\n icon: React.ReactElement\n label: string\n onClick?: () => void\n placement?:\n | 'bottom-end'\n | 'bottom-start'\n | 'bottom'\n | 'left-end'\n | 'left-start'\n | 'left'\n | 'right-end'\n | 'right-start'\n | 'right'\n | 'top-end'\n | 'top-start'\n | 'top'\n tooltipText: string\n variant?: 'contained' | 'outlined' | 'text'\n}\n\nconst ResponsiveButton: React.FC<ResponsiveButtonProps> = ({\n icon,\n label,\n onClick,\n placement = 'bottom',\n tooltipText,\n variant = 'text',\n}) => {\n const theme = useTheme()\n\n return (\n <React.Fragment>\n <Button\n onClick={onClick}\n startIcon={icon}\n sx={{\n [theme.breakpoints.down('lg')]: { display: 'none' },\n [theme.breakpoints.up('lg')]: { display: 'inline-flex' },\n }}\n title={tooltipText}\n variant={variant}\n >\n {label}\n </Button>\n <Tooltip\n describeChild={true}\n placement={placement}\n sx={{ display: { xs: 'inline-flex', lg: 'none' } }}\n title={tooltipText}\n >\n <IconButton onClick={onClick}>{icon}</IconButton>\n </Tooltip>\n </React.Fragment>\n )\n}\n\nexport default ResponsiveButton\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport IconButton from '@mui/material/IconButton'\nimport InputAdornment from '@mui/material/InputAdornment'\n\nimport { Icon, TextField, useTokens } from '@kyper/mui'\n\nexport interface SearchBoxProps {\n ariaLabel?: string\n cancelAriaLabel?: string\n onChange: (value: string) => void\n placeholder?: string\n searchValue: string\n}\n\nconst SearchBox: React.FC<SearchBoxProps> = ({\n ariaLabel = 'Search',\n cancelAriaLabel = 'Cancel Search',\n onChange,\n placeholder = 'Search',\n searchValue,\n}) => {\n const tokens = useTokens()\n\n const cancelButton = (\n <IconButton\n aria-label={cancelAriaLabel}\n className=\"mx-cat-cancel-search-button\"\n onClick={() => onChange('')}\n >\n <Icon name=\"cancel\" size={24} />\n </IconButton>\n )\n\n return (\n <Box className=\"mx-cmn-search-box\" px={tokens.Spacing.Large} py={tokens.Spacing.Medium}>\n <TextField\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <Icon color=\"disabled\" name=\"search\" size={26} />\n </InputAdornment>\n ),\n endAdornment: (\n <InputAdornment position=\"end\" sx={{ p: 0 }}>\n {searchValue ? cancelButton : null}\n </InputAdornment>\n ),\n }}\n aria-label={ariaLabel}\n name=\"search\"\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => onChange(e.target.value)}\n placeholder={placeholder}\n // TODO: Theme needs to have the background color defaulted to paper for TextField\n sx={{ bgcolor: 'background.paper', width: '100%' }}\n value={searchValue}\n />\n </Box>\n )\n}\n\nexport default observer(SearchBox)\n","import React from 'react'\n\nimport Box from '@mui/material/Box'\nimport FormControlLabel from '@mui/material/FormControlLabel'\nimport Radio from '@mui/material/Radio'\nimport type { SxProps } from '@mui/material/styles'\nimport useTheme from '@mui/material/styles/useTheme'\nimport Tooltip from '@mui/material/Tooltip'\n\ninterface SelectionBoxProps {\n checked?: boolean\n label: string\n sx?: SxProps\n tooltip?: string\n value: string | number\n}\n\n/** TODO: Move this component to KyperMUI **/\nconst SelectionBox: React.FC<SelectionBoxProps> = ({\n checked = false,\n label,\n sx = {},\n tooltip = '',\n value,\n}) => {\n const theme = useTheme()\n\n /** TODO: Add new theme color to handle this color and remove the mode check **/\n const greyColor =\n theme.palette.mode === 'light' ? theme.palette.grey[400] : theme.palette.grey[700]\n const borderColor = checked ? theme.palette.action.active : greyColor\n const borderSize = checked ? 3 : 1\n\n return (\n <Box\n bgcolor=\"background.paper\"\n border={`${borderSize}px solid`}\n borderColor={borderColor}\n borderRadius={2}\n mt={-2}\n mx={8}\n pr={8}\n py={4}\n sx={{ '&:hover': { borderColor: theme.palette.action.active }, ...sx }}\n >\n <Tooltip title={tooltip}>\n <FormControlLabel\n control={\n <Radio\n disableRipple={true}\n sx={{ '&.Mui-checked': { color: theme.palette.action.active } }}\n />\n }\n label={label}\n labelPlacement=\"start\"\n sx={{ ml: 0, pl: 8 }}\n value={value}\n />\n </Tooltip>\n </Box>\n )\n}\n\nexport default SelectionBox\n","interface TabContentProps {\n children?: React.ReactNode\n index: number\n name: string\n value: number\n}\n\nconst TabContentContainer: React.FC<TabContentProps> = ({\n children,\n index,\n name,\n value,\n ...rest\n}) => {\n return (\n <div\n aria-labelledby={`${name}-tab-${index}`}\n hidden={value !== index}\n id={`${name}-tabpanel-${index}`}\n role=\"tabpanel\"\n {...rest}\n >\n {value === index && children}\n </div>\n )\n}\n\nexport default TabContentContainer\n","import Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\nimport type { SxProps } from '@mui/material/styles'\n\ninterface IconProps {\n backingSx?: SxProps\n size: number\n sx?: SxProps\n}\n\nconst IconBacking: React.FC<React.PropsWithChildren<IconProps>> = ({\n backingSx,\n children,\n size,\n sx,\n}) => (\n <Stack\n sx={{\n display: 'grid',\n placeItems: 'center',\n zIndex: 3,\n ...sx,\n }}\n >\n {children}\n\n <Box\n sx={{\n backgroundColor: 'common.white',\n borderRadius: '50%',\n height: size,\n width: size,\n gridRow: 1,\n gridColumn: 1,\n ...backingSx,\n }}\n />\n </Stack>\n)\n\nexport default IconBacking\n","import React from 'react'\n\nimport Avatar from '@mui/material/Avatar'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { Icon, IconWeight } from '@kyper/mui'\nimport ListItemIcon from '@mui/material/ListItemIcon'\n\ninterface DataRowProps {\n iconName: string\n label: string\n onClick?: () => void\n value: string\n}\n\nconst DataRow: React.FC<DataRowProps> = ({ iconName, label, onClick, value }) => {\n const rowContents = (\n <>\n <ListItemAvatar>\n <Avatar sx={{ bgcolor: 'border.light' }} variant=\"rounded\">\n <Icon name={iconName} sx={{ color: 'text.primary' }} weight={IconWeight.Dark} />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary={label}\n primaryTypographyProps={{ variant: 'XSmall' }}\n secondary={value}\n secondaryTypographyProps={{ color: 'text.default', variant: 'Body', fontWeight: 600 }}\n />\n </>\n )\n\n return onClick ? (\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton onClick={onClick}>\n {rowContents}\n <ListItemIcon>\n <Icon name=\"chevron_right\" size={24} />\n </ListItemIcon>\n </ListItemButton>\n </ListItem>\n ) : (\n <ListItem disableGutters={false} disablePadding={false}>\n {rowContents}\n </ListItem>\n )\n}\n\nexport default DataRow\n","import React from 'react'\n\nimport IconButton from '@mui/material/IconButton'\nimport Stack from '@mui/material/Stack'\nimport Tooltip from '@mui/material/Tooltip'\n\nimport { Icon, IconWeight, Text } from '@kyper/mui'\n\ninterface InformationTooltipProps {\n body: string\n iconName?: string\n title: string\n}\n\nconst InformationTooltip: React.FC<InformationTooltipProps> = ({\n body,\n iconName = 'info',\n title,\n}) => {\n return (\n <Tooltip\n enterTouchDelay={500}\n title={\n <Stack gap={2} p={12} sx={{ textOverflow: 'none' }}>\n <Text bold={true} variant=\"Body\">\n {title}\n </Text>\n <Text sx={{ whiteSpace: 'unset' }} variant=\"Small\">\n {body}\n </Text>\n </Stack>\n }\n >\n <IconButton\n aria-label={title}\n sx={{\n minHeight: 0,\n minWidth: 0,\n p: 0,\n }}\n >\n <Icon\n name={iconName}\n sx={{ color: 'action.active', fontSize: 16 }}\n weight={IconWeight.Dark}\n />\n </IconButton>\n </Tooltip>\n )\n}\n\nexport default InformationTooltip\n","import React from 'react'\n\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport { SxProps } from '@mui/material/styles'\n\nimport { useEvent } from '../context'\n\ninterface ListItemWrapperProps {\n clickEventName?: string\n onClick?: () => void\n sx?: SxProps\n}\n\nexport const ListItemWrapper: React.FC<React.PropsWithChildren<ListItemWrapperProps>> = ({\n children,\n clickEventName,\n onClick,\n sx = {},\n}) => {\n const { onEvent } = useEvent()\n\n if (onClick) {\n return (\n <ListItem sx={{ bgcolor: 'background.paper', ...sx }}>\n <ListItemButton\n onClick={() => {\n if (clickEventName) {\n onEvent(clickEventName)\n }\n onClick()\n }}\n >\n {children}\n </ListItemButton>\n </ListItem>\n )\n } else {\n return (\n <ListItem\n disableGutters={false}\n disablePadding={false}\n sx={{ bgcolor: 'background.paper', ...sx }}\n >\n {children}\n </ListItem>\n )\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\nimport { GlobalCopyApi } from '../api/GlobalCopyApi'\nimport { GlobalCopy } from '../types'\n\nexport class GlobalCopyStore {\n copy: GlobalCopy = {} as GlobalCopy\n featureNamespace = 'experiences'\n\n api: GlobalCopyApi = new GlobalCopyApi('/', '')\n isInitialized = false\n\n constructor() {\n makeAutoObservable(this)\n }\n\n initialize = async (endpoint: string, token: string) => {\n this.api = new GlobalCopyApi(endpoint, token)\n\n await this.getCopy(this.featureNamespace)\n runInAction(() => {\n this.isInitialized = true\n })\n }\n\n getCopy = async (namespace: string, translationKey: string = '') => {\n try {\n const newCopy = await this.api.getGlobalCopy(namespace, translationKey)\n\n runInAction(() => {\n this.copy = newCopy[namespace]\n })\n } catch (error) {\n console.error(`Error occurred while fetching ${this.featureNamespace} copy: ${error}`)\n }\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\n\nimport { Beat, BeatApi } from '../../common'\n\nexport class BeatStore {\n beats: Beat[] = []\n api: BeatApi = new BeatApi('/', '')\n\n constructor() {\n makeAutoObservable(this)\n }\n\n initialize = async (endpoint: string, token: string) => {\n this.api = new BeatApi(endpoint, token)\n await this.loadBeats()\n }\n\n loadBeats = async () => {\n const beats = await this.api.getBeats()\n\n runInAction(() => {\n this.beats = beats\n })\n }\n}\n","import { ApiEndpoints, type Budget, Category, Fetch } from '../../common'\n\nexport class BudgetsApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\n }\n\n addBudget = async (category: Category, amount: number, parentGuid: string | null = null) => {\n return this.fetchInstance\n .post(ApiEndpoints.BUDGETS, {\n amount,\n category_guid: category.guid,\n category_name: category.name,\n parent_guid: parentGuid,\n })\n .then((data) => data.budget)\n .catch((error) => error)\n }\n\n deleteBudget = async (guid: string) => {\n return this.fetchInstance.delete(`${ApiEndpoints.BUDGETS}/${guid}`).then((data) => data)\n }\n\n generateBudgets = async () => {\n return this.fetchInstance.post(`${ApiEndpoints.BUDGETS}/generate`).then((data) => data)\n }\n\n getBudgets = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.BUDGETS)\n .then((data) => data.budgets)\n .catch((error) => error)\n }\n\n updateBudget = async (budget: Budget) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.BUDGETS}/${budget.guid}`, budget)\n .then((data) => data.budget)\n .catch((error) => error)\n }\n}\n","import type { Theme } from '@mui/system'\n\nimport {\n type Budget,\n type BudgetColors,\n type BudgetsCopy,\n type DetailedCategory,\n type DetailedBudget,\n buildDynamicCopy,\n formatCurrency,\n getDetailedCategory,\n getDetailedSubCategory,\n useBudgetsStore,\n} from '../../common'\n\nexport const getBudgetPercentage = (budgetAmount: number, totalAmount: number) => {\n // No budget amount and nothing spent results in zero percent and green bubble\n if (!budgetAmount && !totalAmount) {\n return 0\n }\n\n // No budget amount and money spent results in 101 percent and red bubble\n if (!budgetAmount && totalAmount) {\n return 101\n }\n\n // Budget amount and money spent results in calculating percentage for color\n return (totalAmount / budgetAmount) * 100\n}\n\nexport const getBudgetColors = (percentage: number, theme: Theme) => {\n const budgetColors: BudgetColors = {\n background: theme.palette.success.main,\n description: percentage <= 100 ? theme.palette.text.secondary : theme.palette.error.main,\n text: theme.palette.common.white,\n mercury: theme.palette.success.lighter,\n }\n\n if (percentage > 100) {\n budgetColors.background = theme.palette.error.main\n budgetColors.mercury = theme.palette.error.lighter\n } else if (percentage > 80) {\n budgetColors.background = theme.palette.warning.main\n budgetColors.text = theme.palette.grey['900']\n budgetColors.mercury = theme.palette.warning.lighter\n }\n\n return budgetColors\n}\n\nexport const useGetBudgetDifference = () => {\n const { budgets } = useBudgetsStore()\n\n const differences = budgets.map((budget) => {\n const currentAmount = budget.transaction_total\n const totalAmount = budget.amount\n return totalAmount - currentAmount\n })\n\n return differences.reduce((total, difference) => total + difference, 0)\n}\n\nexport const augmentBudgets = (\n budgets: Budget[],\n categories: DetailedCategory[],\n copy: BudgetsCopy,\n theme: Theme,\n): DetailedBudget[] => {\n const detailedBudgets = [] as DetailedBudget[]\n\n // Top-level Categories\n for (const budget of budgets) {\n const category = getDetailedCategory(categories, budget.category_guid)\n if (!category) continue\n\n const spent = category.totalAmount\n\n const percentage = getBudgetPercentage(budget.amount, spent)\n const difference = budget.amount - spent\n\n detailedBudgets.push({\n ...budget,\n budgetColors: getBudgetColors(percentage, theme),\n category,\n description: buildDynamicCopy(\n difference < 0 ? copy.budget_remaining_over : copy.budget_remaining_left,\n formatCurrency(Math.abs(difference), '0,0'),\n ) as string,\n percentage,\n subBudgets: [],\n transaction_total: spent,\n })\n }\n\n // Sub categories\n for (const budget of budgets) {\n const category = getDetailedSubCategory(categories, budget.category_guid)\n if (!category) continue\n\n const spent = category.currentAmount\n\n const parentBudget = detailedBudgets.find((b) => b.category_guid === category.parent_guid)\n if (!parentBudget) continue\n\n const difference = budget.amount - spent\n const percentage = getBudgetPercentage(budget.amount, spent)\n\n if (parentBudget) {\n parentBudget.subBudgets.push({\n ...budget,\n budgetColors: getBudgetColors(percentage, theme),\n category,\n description: buildDynamicCopy(\n difference < 0 ? copy.budget_remaining_over : copy.budget_remaining_left,\n formatCurrency(Math.abs(difference), '0,0'),\n ) as string,\n percentage,\n subBudgets: [],\n transaction_total: spent,\n })\n }\n }\n\n return detailedBudgets\n}\n\nexport const findBudget = (budgets: DetailedBudget[], guid: string): DetailedBudget | undefined => {\n return budgets.find((budget) => budget.guid === guid)\n}\n\nexport const findSubBudget = (\n budgets: DetailedBudget[],\n guid: string,\n parentGuid: string,\n): DetailedBudget | undefined => {\n const parent = findBudget(budgets, parentGuid)\n if (!parent) return undefined\n\n return findBudget(parent.subBudgets, guid)\n}\n","import { makeAutoObservable, reaction, runInAction } from 'mobx'\n\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\n\nimport { Theme } from '@mui/system'\n\nimport {\n type Budget,\n type Category,\n type DateRange,\n type DetailedBudget,\n type DetailedCategory,\n CategoryApi,\n CategoryGuids,\n GlobalStore,\n} from '../../common'\n\nimport { BudgetsApi } from '../api/BudgetsApi'\nimport { augmentBudgets, findBudget, findSubBudget } from '../utils/BudgetUtil'\n\nexport class BudgetsStore {\n api: BudgetsApi = new BudgetsApi('/', '')\n categoryApi: CategoryApi = new CategoryApi('/', '')\n\n globalStore: GlobalStore\n\n alert: string = ''\n dateRange: DateRange = { start: startOfMonth(startOfToday()), end: endOfMonth(startOfToday()) }\n budgets: Budget[] = []\n selectedBudget: DetailedBudget | undefined\n selectedSubBudget: DetailedBudget | undefined\n\n theme = {} as Theme\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n makeAutoObservable(this)\n }\n\n initialize = async (endpoint: string, token: string) => {\n this.api = new BudgetsApi(endpoint, token)\n this.categoryApi = new CategoryApi(endpoint, token)\n\n /** Reaction to update the selected budget/sub-budget if detailedBudgets is updated **/\n reaction(\n () => this.detailedBudgets,\n (detailedBudgets) => {\n if (detailedBudgets) {\n const budget = this.selectedBudget\n if (budget) {\n this.selectedBudget = findBudget(detailedBudgets, budget.guid)\n }\n\n const subBudget = this.selectedSubBudget\n if (subBudget && subBudget.parent_guid) {\n this.selectedSubBudget = findSubBudget(\n detailedBudgets,\n subBudget.guid,\n subBudget.parent_guid,\n )\n }\n }\n },\n )\n }\n\n get detailedBudgets(): DetailedBudget[] {\n return augmentBudgets(\n this.budgets.filter(\n (budget: Budget) =>\n budget.category_guid !== CategoryGuids.INCOME &&\n budget.category_guid !== CategoryGuids.TRANSFER &&\n budget.category_guid !== CategoryGuids.INVESTMENTS,\n ),\n this.globalStore.categoryStore.detailedCategories,\n this.globalStore.copyStore.copy.budgets,\n this.theme,\n ).sort((a, b) => {\n if (a.percentage > b.percentage) return -1\n if (a.percentage < b.percentage) return 1\n return 0\n })\n }\n\n get unbudgetedCategories(): DetailedCategory[] {\n return this.globalStore.categoryStore.spendCategories.filter(\n (category) => !this.detailedBudgets.find((budget) => budget.category_guid === category.guid),\n )\n }\n\n get totalBudgeted(): number {\n return this.detailedBudgets.reduce((total, budget) => total + budget.amount, 0)\n }\n\n addBudget = async (category: Category, amount: number, parentGuid: string | null = null) => {\n try {\n const budget = await this.api.addBudget(category, amount, parentGuid)\n runInAction(() => {\n this.budgets.push(budget)\n })\n } catch (error) {\n console.error(`Error adding budget: ${error}`)\n }\n }\n\n deleteBudget = async (guid: string) => {\n try {\n await this.api.deleteBudget(guid)\n\n runInAction(() => {\n const index = this.budgets.findIndex((budget) => budget.guid === guid)\n if (index >= 0) {\n this.budgets.splice(index, 1)\n }\n })\n } catch (error) {\n console.error(`Error deleting budget: ${error}`)\n }\n }\n\n loadBudgets = async () => {\n try {\n const budgets = (await this.api.getBudgets()) as Budget[]\n\n runInAction(() => {\n this.budgets = budgets\n })\n } catch (error) {\n console.error(`Error occurred while loading budgets: ${error}`)\n }\n }\n\n setAlert = (alert: string) => (this.alert = alert)\n\n setDateRange = (dateRange: DateRange) => (this.dateRange = dateRange)\n\n setSelectedBudget = (budget: DetailedBudget | undefined) => (this.selectedBudget = budget)\n\n setSelectedSubBudget = (budget: DetailedBudget | undefined) => (this.selectedSubBudget = budget)\n\n setTheme = (theme: Theme) => (this.theme = theme)\n\n /**\n * Recalculate budget by using the average amount from top-level categories\n * @param categories Detailed categories\n */\n recalculateBudgets = async (categories: DetailedCategory[]) => {\n for (const category of categories) {\n const budget = this.budgets.find((budget) => budget.category_guid === category.guid)\n if (budget) {\n await this.api.updateBudget({ ...budget, amount: category.totalAverageAmount })\n } else {\n await this.api.addBudget(category, category.totalAverageAmount)\n }\n }\n\n const budgetsToDelete = this.budgets.filter(\n (budget) => !categories.find((c) => c.guid === budget.category_guid),\n )\n\n for (const budgetToDelete of budgetsToDelete) {\n await this.api.deleteBudget(budgetToDelete.guid)\n }\n await this.loadBudgets()\n }\n\n updateBudget = async (budget: Budget) => {\n try {\n const updatedBudget = await this.api.updateBudget(budget)\n\n runInAction(() => {\n const index = this.budgets.findIndex((b) => b.guid === budget.guid)\n if (index >= 0) {\n this.budgets[index] = updatedBudget\n }\n })\n } catch (error) {\n console.error(`Error updating budget: ${error}`)\n }\n }\n}\n","import React from 'react'\nimport { GlobalDataContext, useCashflowStore } from '../../common'\n\nexport const useCashflowUiStore = () => {\n const context = React.useContext(GlobalDataContext)\n\n if (!context) {\n throw new Error('useCashflowUiStore() must be used within the GlobalDataContext')\n }\n\n return useCashflowStore().uiStore\n}\n","import { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\n\nimport { Text } from '@kyper/mui'\nimport { useGlobalCopyStore } from '../../common'\nimport { CurrencyText } from '../../common/components/CurrencyText'\n\ninterface RemainingCashProps {\n remaining: number\n}\n\nconst RemainingCash: React.FC<RemainingCashProps> = ({ remaining }) => {\n const { cashflow: customCopy } = useGlobalCopyStore()\n\n const getRemainingCashColor = () => {\n if (remaining < 0) {\n return 'error.main'\n }\n if (remaining > 0) {\n return 'success.main'\n }\n return 'warning.main'\n }\n\n return (\n <>\n <Box\n sx={{\n borderRadius: '1px',\n backgroundColor: getRemainingCashColor(),\n height: 6,\n width: 6,\n }}\n />\n <Text bold={true} sx={{ flexGrow: 1, fontSize: 12 }}>\n {customCopy.remaining_cash}\n </Text>\n <CurrencyText amount={remaining} bold={true} sx={{ fontSize: 12 }} />\n </>\n )\n}\n\nexport default observer(RemainingCash)\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 Divider from '@mui/material/Divider'\nimport Stack from '@mui/material/Stack'\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { Icon, P, Text } from '@kyper/mui'\n\nimport {\n buildDynamicCopy,\n InformationTooltip,\n useAccountStore,\n useGlobalCopyStore,\n useGlobalUiStore,\n useRecurringActivityStore,\n useUserStore,\n useWidgetContainerProvider,\n} from '../../common'\n\nimport { useCashflowUiStore } from '../context/hooks'\nimport { CurrencyText } from '../../common/components/CurrencyText'\nimport RemainingCash from './RemainingCash'\n\ninterface CashflowWidgetContentProps {\n onAddIncomeClick?: () => void\n}\n\nconst CashflowWidgetContent: React.FC<CashflowWidgetContentProps> = ({ onAddIncomeClick }) => {\n const theme = useTheme()\n const { availableWidth } = useWidgetContainerProvider()\n\n const { cashAccounts, cashBalance } = useAccountStore()\n const { selectedAccountGuids } = useGlobalUiStore()\n const { cashflow: customCopy } = useGlobalCopyStore()\n const { userProfile } = useUserStore()\n const {\n daysUntilNextIncome,\n expensesTilNextIncome,\n selectedCashAccounts,\n setNextIncome,\n setSelectedCashAccounts,\n setUpcomingExpenses,\n } = useCashflowUiStore()\n const { nextIncomeActivity, upcomingExpenses } = useRecurringActivityStore()\n\n React.useEffect(() => {\n setSelectedCashAccounts(\n cashAccounts.filter((account) => selectedAccountGuids.includes(account.guid)),\n )\n }, [cashAccounts, selectedAccountGuids])\n\n React.useEffect(() => {\n if (nextIncomeActivity) {\n setNextIncome(nextIncomeActivity)\n }\n setUpcomingExpenses(upcomingExpenses)\n }, [nextIncomeActivity, upcomingExpenses])\n\n const filteredCashBalance = React.useMemo(\n () =>\n cashAccounts\n .filter((account) => selectedAccountGuids.includes(account.guid))\n .reduce((total, account) => total + (account?.balance || 0), 0),\n [selectedAccountGuids, upcomingExpenses],\n )\n\n const filteredExpenseTotal = React.useMemo(\n () =>\n expensesTilNextIncome\n .filter((expense) => selectedAccountGuids.includes(expense.accountGuid || ''))\n .reduce((acc, curr) => acc + curr.amount, 0),\n [selectedAccountGuids, expensesTilNextIncome],\n )\n\n const availableToSpend = React.useMemo(\n () => filteredCashBalance - filteredExpenseTotal,\n [filteredCashBalance, filteredExpenseTotal],\n )\n\n const hasCompletedCashflowOnboarding =\n userProfile?.has_completed_cash_flow_onboarding && !!onAddIncomeClick\n\n return (\n <Box className=\"mx-cashflow\" pl={16} pr={16} pt={16}>\n {availableWidth > 610 ? (\n <Stack\n border={`1px solid ${theme.palette.border.light}`}\n borderRadius={1}\n direction=\"row\"\n justifyContent=\"space-between\"\n px={24}\n >\n <Stack pb={14} pt={12}>\n <CurrencyText amount={filteredCashBalance} variant=\"H2\" />\n <P variant=\"XSmall\" whiteSpace=\"nowrap\">\n {\n buildDynamicCopy(\n customCopy.total_cash_accounts,\n selectedCashAccounts.length,\n ) as string\n }\n </P>\n </Stack>\n\n <Stack pt={18}>\n <Icon name=\"remove\" />\n </Stack>\n\n <Stack pb={14} pt={12}>\n <CurrencyText amount={filteredExpenseTotal} variant=\"H2\" />\n <P variant=\"XSmall\" whiteSpace=\"nowrap\">\n {buildDynamicCopy(customCopy.expenses_due, expensesTilNextIncome.length) as string}\n </P>\n </Stack>\n\n <Stack pt={18}>\n <Icon name=\"equals\" />\n </Stack>\n\n <Stack pb={14} pr={24} pt={12}>\n <CurrencyText amount={availableToSpend} variant=\"H2\" />\n <Stack alignItems=\"center\" direction=\"row\" gap={8}>\n <P variant=\"XSmall\" whiteSpace=\"nowrap\">\n {customCopy.available_to_spend}\n </P>\n <InformationTooltip body={customCopy.tooltip_body} title={customCopy.tooltip_title} />\n </Stack>\n </Stack>\n\n <Stack borderLeft={`1px solid ${theme.palette.border.light}`} pb={12} pl={24} pt={12}>\n {!hasCompletedCashflowOnboarding ? (\n <Button\n onClick={onAddIncomeClick}\n startIcon={<Icon name=\"add\" />}\n sx={{ fontSize: 13, lineHeight: 'initial' }}\n >\n {customCopy.add_income}\n </Button>\n ) : (\n <>\n <Text variant=\"H2\">\n {buildDynamicCopy(customCopy.days, daysUntilNextIncome) as string}\n </Text>\n <P variant=\"XSmall\" whiteSpace=\"nowrap\">\n {customCopy.next_paycheck}\n </P>\n </>\n )}\n </Stack>\n </Stack>\n ) : (\n <Stack border={`1px solid ${theme.palette.border.light}`} borderRadius={1}>\n <Stack direction=\"row\" justifyContent=\"space-between\" p={16}>\n <Text variant=\"Small\">\n {\n buildDynamicCopy(\n customCopy.total_cash_accounts,\n selectedCashAccounts.length,\n ) as string\n }\n </Text>\n <CurrencyText amount={cashBalance} bold={true} variant=\"XSmall\" />\n </Stack>\n\n <Divider />\n\n <Stack direction=\"row\" justifyContent=\"space-between\" p={16}>\n <Text variant=\"Small\">\n {buildDynamicCopy(customCopy.expenses_due, expensesTilNextIncome.length) as string}\n </Text>\n <CurrencyText amount={filteredExpenseTotal} bold={true} symbol=\"-\" variant=\"XSmall\" />\n </Stack>\n\n <Divider />\n\n <Stack\n alignItems=\"center\"\n bgcolor=\"background.default\"\n direction=\"row\"\n gap={8}\n height={48}\n justifyContent=\"space-between\"\n px={16}\n sx={{ borderBottomLeftRadius: 4, borderBottomRightRadius: 4 }}\n >\n <RemainingCash remaining={availableToSpend} />\n </Stack>\n <Divider />\n\n {!hasCompletedCashflowOnboarding ? (\n <Stack\n alignItems=\"center\"\n direction=\"row\"\n justifyContent=\"space-between\"\n pl={16}\n pr={2}\n py={2}\n >\n <Text variant=\"Small\">{customCopy.next_paycheck}</Text>\n <Button\n onClick={onAddIncomeClick}\n startIcon={<Icon name=\"add\" />}\n sx={{ fontSize: 13 }}\n >\n {customCopy.add_income}\n </Button>\n </Stack>\n ) : (\n <Stack direction=\"row\" justifyContent=\"space-between\" p={16}>\n <Text variant=\"Small\">{customCopy.next_paycheck}</Text>\n <Text bold={true} variant=\"XSmall\">\n {buildDynamicCopy(customCopy.days, daysUntilNextIncome) as string}\n </Text>\n </Stack>\n )}\n </Stack>\n )}\n </Box>\n )\n}\n\nexport default observer(CashflowWidgetContent)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport { MiniWidgetContainer, MiniWidgetProps, useGlobalCopyStore } from '../common'\n\nimport CashflowWidgetContent from './components/CashflowWidgetContent'\n\nconst CashflowMiniWidget: React.FC<MiniWidgetProps> = ({ onPrimaryCtaClick, sx = {} }) => {\n const { cashflow: customCopy } = useGlobalCopyStore()\n\n return (\n <MiniWidgetContainer\n className=\"mx-exp-cashflow-miniwidget\"\n onPrimaryCtaClick={onPrimaryCtaClick}\n primaryCtaLabel={customCopy.primary_cta}\n subTitle={customCopy.sub_title}\n sx={sx}\n title={customCopy.title}\n >\n <CashflowWidgetContent onAddIncomeClick={onPrimaryCtaClick} />\n </MiniWidgetContainer>\n )\n}\n\nexport default observer(CashflowMiniWidget)\n","import { Fetch } from '../../common'\nimport { ApiEndpoints } from '../../common'\n\nimport type { Tag, Tagging, Transaction, TransactionRule } from '../../common'\n\nexport class TransactionApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\n }\n\n addTag = async (tag: Tag) => {\n return this.fetchInstance.post(ApiEndpoints.TAGS, tag).then((data) => data.tag)\n }\n\n addTagging = async (tagging: Tagging) => {\n return this.fetchInstance.post(ApiEndpoints.TAGGINGS, tagging).then((data) => data.tagging)\n }\n\n addTransaction = async (transaction: Transaction) => {\n return this.fetchInstance\n .post(ApiEndpoints.TRANSACTIONS, transaction)\n .then((data) => data.transaction)\n }\n\n addTransactionRule = async (rule: TransactionRule) => {\n return this.fetchInstance.post(ApiEndpoints.TRANSACTION_RULES, rule).then((data) => data)\n }\n\n getTaggings = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.TAGGINGS)\n .then((data) => data.map((item: { tagging: Tagging }) => item.tagging))\n }\n\n getTags = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.TAGS)\n .then((data) => data.map((item: { tag: Tag }) => item.tag))\n }\n\n getTransactionRules = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.TRANSACTION_RULES)\n .then((data) => data.transaction_rules)\n }\n\n getTransactionsByDateRange = async (startDate: number, endDate: number) => {\n return this.fetchInstance\n .get(`${ApiEndpoints.TRANSACTIONS}/by_date/${startDate}/${endDate}`)\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n // DEPRECATED\n getTransactionsByAccountsAndDateRange = async (\n accountGuids: string[],\n beginDate: number,\n endDate: number,\n ) => {\n console.warn('DEPRECATED: getTransactionsByAccountsAndDateRange will be removed')\n const accountsList = accountGuids.reduce(\n (acc: string, guid: string, i: number) =>\n `${acc}account_guids[]=${guid}${i !== accountGuids.length - 1 ? '&' : ''}`,\n '',\n )\n\n return this.fetchInstance\n .get(`${ApiEndpoints.TRANSACTIONS}/by_date/${beginDate}/${endDate}?${accountsList}`)\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n // DEPRECATED\n getTransactionsByGuids = async (guids: string[]) => {\n console.warn('DEPRECATED: getTransactionsByGuids will be removed')\n return this.fetchInstance\n .post(`${ApiEndpoints.TRANSACTIONS}/by_guids`, { guids: guids.join('+') })\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n // DEPRECATED\n getTransactionsByCategoryAndDate = async (\n categoryGuid: string,\n beginDate: number,\n endDate: number,\n ) => {\n console.warn('DEPRECATED: getTransactionsByCategoryAndDate will be removed')\n return this.fetchInstance\n .get(\n `${ApiEndpoints.TRANSACTIONS}/by_category_guid/${categoryGuid}/by_date/${beginDate}/${endDate}`,\n )\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n // DEPRECATED\n getTransactionsByCategoryDateAndAccounts = async (\n categoryGuid: string,\n beginDate: number,\n endDate: number,\n accountGuids: string[],\n ) => {\n console.warn('DEPRECATED: getTransactionsByCategoryDateAndAccounts will be removed')\n const accountsList = accountGuids.reduce(\n (acc: string, guid: string, i: number) =>\n `${acc}account_guids[]=${guid}${i !== accountGuids.length - 1 ? '&' : ''}`,\n '',\n )\n\n return this.fetchInstance\n .get(\n `${ApiEndpoints.TRANSACTIONS}/by_category_guid/${categoryGuid}/by_date/${beginDate}/${endDate}?${accountsList}`,\n )\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n // DEPRECATED\n getTransactionsByCategoriesDateAndAccounts = async (\n categoryGuids: string[],\n beginDate: number,\n endDate: number,\n accountGuids: string[],\n ) => {\n console.warn('DEPRECATED: getTransactionsByCategoriesDateAndAccounts will be removed')\n const accountsList = accountGuids.reduce(\n (acc: string, guid: string, i: number) =>\n `${acc}account_guids[]=${guid}${i !== accountGuids.length - 1 ? '&' : ''}`,\n '',\n )\n\n return this.fetchInstance\n .get(\n `${ApiEndpoints.TRANSACTIONS}/by_category_guids/${categoryGuids.join(\n '+',\n )}/by_date/${beginDate}/${endDate}?${accountsList}`,\n )\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n /**\n * DEPRECATED\n * Get all transactions by the top level category, between begin date and end date, and optionally\n * filtered by accounts\n * @param categoryGuid The top level category guid\n * @param beginDate the start date\n * @param endDate the end date\n * @param accountGuids an optional list of account guids\n */\n getTransactionsByTopLevelCategoryAndDate = async (\n categoryGuid: string,\n beginDate: number,\n endDate: number,\n accountGuids: string[] = [],\n ) => {\n console.warn('DEPRECATED: getTransactionsByTopLevelCategoryAndDate will be removed')\n let url = `${ApiEndpoints.TRANSACTIONS}/by_top_level_category_guid/${categoryGuid}/by_date/${beginDate}/${endDate}`\n\n if (accountGuids.length > 0) {\n const accountsList = accountGuids.reduce(\n (acc: string, guid: string, i: number) =>\n `${acc}account_guids[]=${guid}${i !== accountGuids.length - 1 ? '&' : ''}`,\n '',\n )\n url += `?${accountsList}`\n }\n\n return this.fetchInstance\n .get(url)\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n removeTag = async (guid: string) => {\n return this.fetchInstance.delete(`${ApiEndpoints.TAGS}/${guid}`).then((data) => data)\n }\n\n removeTagging = async (guid: string) => {\n return this.fetchInstance.delete(`${ApiEndpoints.TAGGINGS}/${guid}`).then((data) => data)\n }\n\n removeTransaction = async (guid: string) => {\n return this.fetchInstance.delete(`${ApiEndpoints.TRANSACTIONS}/${guid}`).then((data) => data)\n }\n\n removeTransactionSplit = async (guid: string) => {\n return this.fetchInstance\n .delete(`${ApiEndpoints.TRANSACTIONS}/${guid}/unsplit`)\n .then((data) => data)\n }\n\n updateTransactionRule = async (rule: TransactionRule) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.TRANSACTION_RULES}/${rule.guid}`, rule)\n .then((data) => data)\n }\n\n updateTag = async (tag: Tag) => {\n return this.fetchInstance.put(`${ApiEndpoints.TAGS}/${tag.guid}`, tag).then((data) => data.tag)\n }\n\n updateTransaction = async (transaction: Transaction) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.TRANSACTIONS}/${transaction.guid}`, transaction)\n .then((data) => data.transaction)\n }\n}\n","export enum TopActions {\n Category,\n Date,\n Memo,\n Tags,\n}\n\nexport enum BottomActions {\n SplitTransaction,\n HideTransaction,\n MerchantLogo,\n}\n\nexport const DEFAULT_TOP_ACTIONS = [\n TopActions.Category,\n TopActions.Date,\n TopActions.Memo,\n TopActions.Tags,\n] as TopActions[]\n\nexport const DEFAULT_BOTTOM_ACTIONS = [\n BottomActions.SplitTransaction,\n BottomActions.HideTransaction,\n BottomActions.MerchantLogo,\n] as BottomActions[]\n\nexport const CHEVRON_ICON_SIZE = 20\nexport const ICON_SIZE = 28\n","export const ON_CLICK_EVENTS = {\n ON_TRANSACTION_CATEGORY_CLICK: 'onTransactionCategoryClick',\n ON_TRANSACTION_CATEGORY_CHANGED: 'onTransactionCategoryChanged',\n ON_TRANSACTION_MANUAL_ADD_CLICK: 'onTransactionManualAddClick',\n ON_TRANSACTION_MANUAL_ADD_ADDED: 'onTransactionManualAddAdded',\n ON_TRANSACTION_DATE_CHANGED: 'onTransactionDateChanged',\n ON_TRANSACTION_DATE_CLICK: 'onTransactionDateClick',\n ON_TRANSACTION_DELETE_CANCEL: 'onTransactionDeleteCancel',\n ON_TRANSACTION_DELETE_CLICK: 'onTransactionDeleteClick',\n ON_TRANSACTION_DELETE_DELETED: 'onTransactionDeleted',\n ON_TRANSACTION_DELETE_LOGO_CANCEL: 'onTransactionDeleteLogoCancel',\n ON_TRANSACTION_DELETE_LOGO_CLICK: 'onTransactionDeleteLogoClick',\n ON_TRANSACTION_DELETE_LOGO_DELETED: 'onTransactionDeletedLogo',\n ON_TRANSACTION_DESCRIPTION_EDIT_CLICK: 'onTransactionDescriptionEditClick',\n ON_TRANSACTION_DESCRIPTION_SAVE_CLICK: 'onTransactionDescriptionSaveClick',\n ON_TRANSACTION_EXPORT_CSV_CLICK: 'onTransactionExportCsvClick',\n ON_TRANSACTION_HIDDEN: 'onTransactionHidden',\n ON_TRANSACTION_HIDE_CLICK: 'onTransactionHideClick',\n ON_TRANSACTION_HIDE_CANCEL_CLICK: 'onTransactionHideCancelClick',\n ON_TRANSACTION_LIST_ITEM_CLICK: 'onTransactionListItemClick',\n ON_TRANSACTION_MEMO_CHANGED: 'onTransactionMemoChanged',\n ON_TRANSACTION_MEMO_CLICK: 'onTransactionMemoClick',\n ON_TRANSACTION_SPLIT_ADD_CLICK: 'onTransactionSplitAddClick',\n ON_TRANSACTION_SPLIT_CANCEL_CLICK: 'onTransactionSplitCancelClick',\n ON_TRANSACTION_SPLIT_CATEGORY_CLICK: 'onTransactionSplitCategoryClick',\n ON_TRANSACTION_SPLIT_CLICK: 'onTransactionSplitClick',\n ON_TRANSACTION_SPLIT_DELETE_CLICK: 'onTransactionSplitDeleteClick',\n ON_TRANSACTION_SPLIT_SAVE_CLICK: 'onTransactionSplitSaveClick',\n ON_TRANSACTION_TAGS_CHANGED: 'onTransactionTagsChanged',\n ON_TRANSACTION_TAGS_CLICK: 'onTransactionTagsClick',\n ON_TRANSACTION_TAGS_TAG_ADD_CANCEL_CLICK: 'onTransactionTagsTagAddCancelClick',\n ON_TRANSACTION_TAGS_TAG_ADD_CLICK: 'onTransactionTagsTagAddClick',\n ON_TRANSACTION_TAGS_TAG_ADDED: 'onTransactionTagsTagAdded',\n ON_TRANSACTION_TAGS_TAG_DELETE_CLICK: 'onTransactionTagsTagDeleteClick',\n ON_TRANSACTION_TAGS_TAG_DELETE_CANCEL_CLICK: 'onTransactionTagsTagDeleteCancelClick',\n ON_TRANSACTION_TAGS_TAG_DELETED: 'onTransactionTagsTagDeleted',\n ON_TRANSACTION_TAGS_TAG_EDIT_CLICK: 'onTransactionTagsTagEditClick',\n ON_TRANSACTION_TAGS_TAG_EDIT_SAVED: 'onTransactionTagsTagEditSavedClick',\n ON_TRANSACTION_TOGGLE_FLAG_CLICK: 'onTransactionToggleFlagClick',\n ON_TRANSACTION_UNHIDDEN: 'onTransactionUnHidden',\n ON_TRANSACTION_UNHIDE_CLICK: 'onTransactionUnHideClick',\n ON_TRANSACTION_UNHIDE_CANCEL_CLICK: 'onTransactionUnHideCancelClick',\n ON_TRANSACTION_UNSPLIT: 'onTransactionUnsplit',\n ON_TRANSACTION_UNSPLIT_CANCEL: 'onTransactionUnsplitCancel',\n}\n","export const TABLE_CONST = {\n ASC: 'ASC',\n DESC: 'DESC',\n DIRECTION: {\n ASC: 'ascending',\n DESC: 'descending',\n },\n ALIGN: {\n center: 'center',\n left: 'flex-start',\n right: 'flex-end',\n },\n}\n","import { CategoryGuids, TransactionStatus } from '../../common'\n\nimport type { Account, Category, Tagging, Transaction } from '../../common'\n\ninterface AccountsMap {\n [key: string]: Account\n}\n\ninterface CategoriesMap {\n [key: string]: Category\n}\n\ninterface TaggingsMap {\n [key: string]: string[]\n}\n\nexport const buildDetailedTransactions = (\n transactions: Transaction[],\n accounts: Account[],\n categories: Category[],\n taggings: Tagging[] = [],\n) => {\n const accountsMap = accounts.reduce((acc: AccountsMap, account: Account) => {\n return { ...acc, [account.guid]: account }\n }, {})\n\n const categoriesMap = categories.reduce((acc: CategoriesMap, category: Category) => {\n return { ...acc, [category.guid]: category }\n }, {})\n\n const taggingsMap = taggings.reduce((acc: TaggingsMap, tagging: Tagging) => {\n const { transaction_guid, tag_guid } = tagging\n\n if (!acc[transaction_guid]) {\n return {\n ...acc,\n [transaction_guid]: [tag_guid],\n }\n }\n const tags = [...acc[transaction_guid], tag_guid] as string[]\n\n return {\n ...acc,\n [transaction_guid]: tags,\n }\n }, {})\n\n return transactions.map((transaction: Transaction) => {\n const account = accountsMap[transaction.account_guid]\n const category = transaction.category_guid ? categoriesMap[transaction.category_guid] : null\n const tags = taggingsMap[transaction.guid] ?? []\n\n return {\n ...transaction,\n account: account?.user_name || 'Unknown',\n accountIsClosed: account?.is_closed,\n accountIsHidden: account?.is_hidden,\n category: category?.name || 'Uncategorized',\n isIncome: transaction.top_level_category_guid === CategoryGuids.INCOME,\n isPending: transaction.feed_status === TransactionStatus.PENDING,\n number: account?.account_number || '',\n payee: transaction.description,\n tags,\n }\n })\n}\n","import { ON_CLICK_EVENTS } from './OnClickEvents'\n\nexport const ANALYTICS_ACTIONS = {\n ADD: 'Add',\n ADD_CATEGORY: 'Add Category',\n CHANGE_CATEGORY: 'Change Category',\n CHANGE_DATE: 'Change Date',\n CLOSE: 'Close',\n DELETE: 'Delete',\n EDIT: 'Edit',\n HIDE: 'Hide',\n SAVE: 'Save',\n SPLIT: 'Split',\n SELECT: 'Select',\n UNHIDE: 'Unhide',\n UNSPLIT: 'Unsplit',\n}\n\nexport const ANALYTICS_CATEGORIES = {\n TRANSACTION_DETAILS: 'Transaction Details',\n TRANSACTIONS_LIST: 'Transactions List',\n TRANSACTIONS_WIDGET: 'Transactions Widget',\n}\n\nexport const ANALYTICS_LABELS = {\n ADD_TRANSACTION: 'Manual Transaction',\n CATEGORY: 'Category',\n DATE: 'Date',\n DELETE_MERCHANT_LOGO: 'Merchant Logo',\n DELETE_TRANSACTION: 'Delete Transaction',\n DESCRIPTION: 'Description',\n EXPORT_CSV: 'Export CSV',\n FLAG: 'Flag',\n HIDE_TRANSACTION: 'Hide Transaction',\n MEMO: 'Memo',\n SPLITS: 'Split Transactions',\n TAGS: 'Tags',\n TAG_ADD: 'Add Tag',\n TAG_DELETE: 'Delete Tag',\n TAG_EDIT: 'Edit Tag',\n TRANSACTION: 'Transaction',\n TRANSACTIONS_LIST: 'Transactions List',\n UNHIDE_TRANSACTION: 'Unhide Transaction',\n}\n\nexport const ANALYTICS_EVENTS = {\n // splits\n [ON_CLICK_EVENTS.ON_TRANSACTION_SPLIT_CLICK]: {\n action: ANALYTICS_ACTIONS.SELECT,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.SPLITS,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_SPLIT_CATEGORY_CLICK]: {\n action: ANALYTICS_ACTIONS.ADD_CATEGORY,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.SPLITS,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_SPLIT_DELETE_CLICK]: {\n action: ANALYTICS_ACTIONS.DELETE,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.SPLITS,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_SPLIT_SAVE_CLICK]: {\n action: ANALYTICS_ACTIONS.SPLIT,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.SPLITS,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_UNSPLIT]: {\n action: ANALYTICS_ACTIONS.UNSPLIT,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.SPLITS,\n },\n\n // category\n [ON_CLICK_EVENTS.ON_TRANSACTION_CATEGORY_CLICK]: {\n action: ANALYTICS_ACTIONS.SELECT,\n category: ANALYTICS_CATEGORIES.TRANSACTIONS_LIST,\n label: ANALYTICS_LABELS.CATEGORY,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_CATEGORY_CHANGED]: {\n action: ANALYTICS_ACTIONS.CHANGE_CATEGORY,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.CATEGORY,\n },\n\n // date\n [ON_CLICK_EVENTS.ON_TRANSACTION_DATE_CHANGED]: {\n action: ANALYTICS_ACTIONS.SAVE,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.DATE,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_DATE_CLICK]: {\n action: ANALYTICS_ACTIONS.SELECT,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.DATE,\n },\n\n // merchant logo\n [ON_CLICK_EVENTS.ON_TRANSACTION_DELETE_LOGO_CANCEL]: {\n action: ANALYTICS_ACTIONS.CLOSE,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.DELETE_MERCHANT_LOGO,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_DELETE_LOGO_CLICK]: {\n action: ANALYTICS_ACTIONS.SELECT,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.DELETE_MERCHANT_LOGO,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_DELETE_LOGO_DELETED]: {\n action: ANALYTICS_ACTIONS.DELETE,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.DELETE_MERCHANT_LOGO,\n },\n\n // description\n [ON_CLICK_EVENTS.ON_TRANSACTION_DESCRIPTION_EDIT_CLICK]: {\n action: ANALYTICS_ACTIONS.EDIT,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.DESCRIPTION,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_DESCRIPTION_SAVE_CLICK]: {\n action: ANALYTICS_ACTIONS.SAVE,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.DESCRIPTION,\n },\n\n // hide transactions\n [ON_CLICK_EVENTS.ON_TRANSACTION_HIDDEN]: {\n action: ANALYTICS_ACTIONS.SAVE,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.HIDE_TRANSACTION,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_HIDE_CLICK]: {\n action: ANALYTICS_ACTIONS.SELECT,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.HIDE_TRANSACTION,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_HIDE_CANCEL_CLICK]: {\n action: ANALYTICS_ACTIONS.CLOSE,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.HIDE_TRANSACTION,\n },\n\n // transaction list\n [ON_CLICK_EVENTS.ON_TRANSACTION_LIST_ITEM_CLICK]: {\n action: ANALYTICS_ACTIONS.SELECT,\n category: ANALYTICS_CATEGORIES.TRANSACTIONS_LIST,\n label: ANALYTICS_LABELS.TRANSACTION,\n },\n\n // memo\n [ON_CLICK_EVENTS.ON_TRANSACTION_MEMO_CHANGED]: {\n action: ANALYTICS_ACTIONS.SAVE,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.MEMO,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_MEMO_CLICK]: {\n action: ANALYTICS_ACTIONS.SELECT,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.MEMO,\n },\n\n // tags\n [ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_CHANGED]: {\n action: ANALYTICS_ACTIONS.SAVE,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.TAGS,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_CLICK]: {\n action: ANALYTICS_ACTIONS.SELECT,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.TAGS,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_TAG_ADD_CANCEL_CLICK]: {\n action: ANALYTICS_ACTIONS.CLOSE,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.TAGS,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_TAG_ADD_CLICK]: {\n action: ANALYTICS_ACTIONS.ADD,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.TAG_ADD,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_TAG_ADDED]: {\n action: ANALYTICS_ACTIONS.SAVE,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.TAG_ADD,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_TAG_DELETE_CLICK]: {\n action: ANALYTICS_ACTIONS.SELECT,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.TAG_DELETE,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_TAG_DELETE_CANCEL_CLICK]: {\n action: ANALYTICS_ACTIONS.CLOSE,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.TAG_DELETE,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_TAG_DELETED]: {\n action: ANALYTICS_ACTIONS.SAVE,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.TAG_DELETE,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_TAG_EDIT_CLICK]: {\n action: ANALYTICS_ACTIONS.EDIT,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.TAG_EDIT,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_TAG_EDIT_SAVED]: {\n action: ANALYTICS_ACTIONS.SAVE,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.TAG_EDIT,\n },\n\n // flag\n [ON_CLICK_EVENTS.ON_TRANSACTION_TOGGLE_FLAG_CLICK]: {\n action: ANALYTICS_ACTIONS.SELECT,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.FLAG,\n },\n\n // hide\n [ON_CLICK_EVENTS.ON_TRANSACTION_UNHIDDEN]: {\n action: ANALYTICS_ACTIONS.SAVE,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.UNHIDE_TRANSACTION,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_UNHIDE_CLICK]: {\n action: ANALYTICS_ACTIONS.SELECT,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.UNHIDE_TRANSACTION,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_UNHIDE_CANCEL_CLICK]: {\n action: ANALYTICS_ACTIONS.CLOSE,\n category: ANALYTICS_CATEGORIES.TRANSACTION_DETAILS,\n label: ANALYTICS_LABELS.UNHIDE_TRANSACTION,\n },\n\n // export CSV\n [ON_CLICK_EVENTS.ON_TRANSACTION_EXPORT_CSV_CLICK]: {\n action: ANALYTICS_ACTIONS.SELECT,\n category: ANALYTICS_CATEGORIES.TRANSACTIONS_WIDGET,\n label: ANALYTICS_LABELS.EXPORT_CSV,\n },\n\n // add transaction\n [ON_CLICK_EVENTS.ON_TRANSACTION_MANUAL_ADD_CLICK]: {\n action: ANALYTICS_ACTIONS.SELECT,\n category: ANALYTICS_CATEGORIES.TRANSACTIONS_WIDGET,\n label: ANALYTICS_LABELS.ADD_TRANSACTION,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_MANUAL_ADD_ADDED]: {\n action: ANALYTICS_ACTIONS.ADD,\n category: ANALYTICS_CATEGORIES.TRANSACTIONS_WIDGET,\n label: ANALYTICS_LABELS.ADD_TRANSACTION,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_DELETE_CLICK]: {\n action: ANALYTICS_ACTIONS.SELECT,\n category: ANALYTICS_CATEGORIES.TRANSACTIONS_WIDGET,\n label: ANALYTICS_LABELS.DELETE_TRANSACTION,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_DELETE_CANCEL]: {\n action: ANALYTICS_ACTIONS.CLOSE,\n category: ANALYTICS_CATEGORIES.TRANSACTIONS_WIDGET,\n label: ANALYTICS_LABELS.DELETE_TRANSACTION,\n },\n [ON_CLICK_EVENTS.ON_TRANSACTION_DELETE_DELETED]: {\n action: ANALYTICS_ACTIONS.DELETE,\n category: ANALYTICS_CATEGORIES.TRANSACTIONS_WIDGET,\n label: ANALYTICS_LABELS.DELETE_TRANSACTION,\n },\n}\n","import { analyticsSession } from '../common'\nimport { AnalyticsEventsObjectType } from '../common/types/Analytics'\n\nimport { ANALYTICS_EVENTS } from './constants/Analytics'\n\nexport type AnalyticSession = Awaited<ReturnType<typeof analyticsSession>>\n\nexport const onAnalyticEvent = async (event: string, session: AnalyticSession | null) => {\n if (!session || !ANALYTICS_EVENTS[event]) return null\n\n return session.sendAnalyticEvent(ANALYTICS_EVENTS[event] as AnalyticsEventsObjectType)\n}\n","export const ROW_HEIGHT = 48\n\nconst FLAG_COLUMN_WIDTH = 24\nconst DATE_COLUMN_WIDTH = 64\nconst AMOUNT_COLUMN_WIDTH = 112\nconst VARIABLE_COLUMN_WIDTH = `calc((100% - ${\n FLAG_COLUMN_WIDTH + DATE_COLUMN_WIDTH + AMOUNT_COLUMN_WIDTH\n}px) / 3)`\n\nexport const COLUMN_WIDTH = {\n FLAG: FLAG_COLUMN_WIDTH, // Fixed width\n DATE: DATE_COLUMN_WIDTH, // Fixed width\n PAYEE: VARIABLE_COLUMN_WIDTH, // 1/3 of remaining width\n CATEGORY: VARIABLE_COLUMN_WIDTH, // 1/3 of remaining width\n ACCOUNT: VARIABLE_COLUMN_WIDTH, // 1/3 of remaining width\n AMOUNT: AMOUNT_COLUMN_WIDTH, // Fixed width\n}\n\nexport const COLUMN_NAMES = {\n FLAG: 'flag',\n DATE: 'date',\n PAYEE: 'payee',\n CATEGORY: 'category',\n ACCOUNT: 'account',\n AMOUNT: 'amount',\n}\n","import { endOfToday } from 'date-fns/endOfToday'\nimport { format } from 'date-fns/format'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\n\nimport { TABLE_CONST } from '../../common/constants/Table'\nimport { DATE_FORMATS_INTL, formatDate, ORDINAL_DATE_FORMAT, Tag, Transaction } from '../../common'\n\nimport { COLUMN_NAMES } from '../constants/TransactionsTable'\nimport { type TransactionFilter } from '../stores/TransactionStore'\n\nconst UNCATEGORIZED_TERM = 'uncategorized'\n\nexport const sortAndFilterTransactions = (\n filter: TransactionFilter,\n expandedSplits: string[],\n sortColumn: string,\n sortDirection: string,\n tags: Tag[],\n transactions: Transaction[],\n) => {\n const filteredTransactions = filterTransactions(filter, tags, transactions)\n\n const sortedTransactions = sortTransactions(filteredTransactions, sortColumn, sortDirection)\n\n expandedSplits.forEach((guid) => {\n const index = sortedTransactions.findIndex((t) => t.guid === guid)\n const children = transactions.filter((t) => t.parent_guid === guid)\n sortedTransactions.splice(index + 1, 0, ...children)\n })\n return sortedTransactions\n}\n\nconst filterTransactions = (\n filter: TransactionFilter,\n tags: Tag[],\n transactions: Transaction[],\n) => {\n const {\n accounts = [],\n dateRange = { start: startOfMonth(startOfToday()), end: endOfToday() },\n custom = () => true,\n searchTerm: searchFilter = '',\n } = filter\n\n return (\n transactions\n // Filters out Split transaction children\n .filter((t) => !t.parent_guid)\n // Filter for selected accounts\n .filter((t) => Boolean(accounts.find((guid) => guid === t.account_guid)))\n // Filter for Date Range\n .filter((t) => t.date > getUnixTime(dateRange.start) && t.date < getUnixTime(dateRange.end))\n // Custom filter\n .filter(custom)\n // Search filter\n .filter((transaction) => {\n // Don't return uncategorized split transactions\n if (searchFilter === UNCATEGORIZED_TERM && transaction.has_been_split) {\n return false\n }\n\n // Split check - When searching for \"Splits\" and transaction is a split or is a parent of a split(s)\n const splitPattern = /^spl/i\n if (\n splitPattern.test(searchFilter) &&\n (transaction.has_been_split || Boolean(transaction.parent_guid))\n ) {\n return true\n }\n\n // Check transactions tags\n const isTagIncludedInSearch = transaction.tags.some((guid) =>\n isIncludedInSearch(searchFilter, tags.find((tag) => tag.guid === guid)?.name),\n )\n\n const date = fromUnixTime(transaction.date)\n return (\n isIncludedInSearch(searchFilter, transaction.payee) ||\n isIncludedInSearch(searchFilter, transaction.feed_description) ||\n isIncludedInSearch(searchFilter, transaction.category) ||\n isIncludedInSearch(searchFilter, formatDate(date, DATE_FORMATS_INTL.MONTH)) ||\n isIncludedInSearch(searchFilter, formatDate(date, DATE_FORMATS_INTL.DAY)) ||\n isIncludedInSearch(searchFilter, formatDate(date, DATE_FORMATS_INTL.FULL_MONTH_DAY)) ||\n isIncludedInSearch(searchFilter, formatDate(date, DATE_FORMATS_INTL.MONTH_DAY_YEAR)) ||\n isIncludedInSearch(searchFilter, format(date, ORDINAL_DATE_FORMAT)) ||\n isIncludedInSearch(searchFilter, transaction.account) ||\n isIncludedInSearch(searchFilter, `${transaction.amount}`) ||\n isIncludedInSearch(searchFilter, transaction.memo) ||\n isTagIncludedInSearch\n )\n })\n )\n}\n\nconst sortTransactions = (\n transactions: Transaction[],\n sortColumn: string,\n sortDirection: string,\n) => {\n return [...transactions].sort((a: Transaction, b: Transaction) => {\n const column = sortColumn as keyof Transaction\n const sortCompare = (a[column] || '') > (b[column] || '')\n\n let sortASC = sortCompare ? -1 : 1\n let sortDESC = sortCompare ? 1 : -1\n\n if (sortColumn === COLUMN_NAMES.DATE || sortColumn === COLUMN_NAMES.AMOUNT) {\n sortASC = sortCompare ? 1 : -1\n sortDESC = sortCompare ? -1 : 1\n }\n\n return sortDirection === TABLE_CONST.ASC ? sortASC : sortDESC\n })\n}\n\n/**\n * Determines if a value is included within the terms set in the search bar\n */\nconst isIncludedInSearch = (searchFilter: string, value: string | null | undefined) => {\n const lowerCasedTerms = searchFilter.toLowerCase().split(' ')\n const lowerCasedValue = value?.toString().toLowerCase() ?? ''\n\n return lowerCasedTerms.every((filter) => lowerCasedValue.indexOf(filter) > -1)\n}\n","import { RecurrenceTypes } from '../constants'\n\nexport enum ActivityType {\n Expense = 0,\n Income = 1,\n}\n\nexport enum ActivityStatus {\n Paid = 0,\n Missed = 1,\n Upcoming = 2,\n}\n\nexport interface Activity {\n accountGuid?: string\n activityStatus: ActivityStatus\n activityType: ActivityType\n amount: number\n categoryGuid?: string\n expectedDate: Date\n occurredOnDate?: Date\n name: string\n institution?: string\n institutionGuid?: string\n merchantGuid?: string\n recurrenceType: RecurrenceTypes\n recurrenceDay?: number\n scheduledPaymentGuid?: string\n sequenceGuid?: string\n transactionGuid?: string\n}\n","import { Account } from './Account'\nimport { Transaction } from './Transaction'\n\nexport interface Beat {\n account_guids: string[] | []\n active_at?: string | number\n associated_transaction_guid?: string | null\n call_to_action?: string | null\n category_guids?: string[] | []\n created_at?: string | number\n cta_clicked_at?: number | null\n data_series: DataSeries\n description?: string\n digest?: string\n dismissed_at?: number | null\n displayed_at?: string | null\n errors?: any\n guid: string\n has_been_displayed: boolean\n html_description?: string\n html_in_description_cta?: string\n html_micro_call_to_action?: string\n html_micro_description?: string\n html_micro_title?: string\n html_short_title?: string\n html_title: string\n icon_color?: string | null\n icon_type?: number | null\n in_description_cta?: string | null\n is_dismissed: boolean\n is_obsolete: boolean\n is_refreshable: boolean\n is_sampled: boolean\n merchant_guids: string[] | []\n metadata?: string | null\n micro_call_to_action?: string | null\n micro_description?: string | null\n micro_title?: string | null\n payload: any\n primary_account?: Account\n primary_account_guid?: string | null\n primary_category_guid?: string | null\n primary_goal_guid?: string | null\n primary_merchant_guid?: string | null\n primary_scheduled_payment_guid?: string | null\n primary_transaction?: Transaction\n primary_transaction_guid?: string | null\n power_action_completed_at?: string | null\n power_action_has_been_completed?: boolean\n scheduled_payment_guids: string[] | []\n short_title?: string | null\n supporting_action?: string | null\n template: string\n title: string\n transaction_guids: string[] | []\n transactions?: Transaction[]\n user_guid: string\n user_verification: UserVerification\n}\n\nexport interface DataSeries {\n names?: string[]\n types?: string[]\n data?: any[]\n}\n\nexport enum UserVerification {\n UNKNOWN = 0,\n CORRECT = 1,\n INCORRECT = 2,\n}\n","import { ScheduledPayment, Transaction } from '../index'\n\nexport enum ExpenseStatus {\n Missed = 'Missed',\n Paid = 'Paid',\n Upcoming = 'Upcoming expense',\n Income = 'Income',\n}\n\nexport interface Expense extends ScheduledPayment {\n status: ExpenseStatus\n payments: Transaction[]\n transactions: Transaction[]\n}\n\nexport enum ScheduledPaymentTypes {\n Unknown = 0,\n Subscription = 1,\n Bill = 2,\n}\n","export interface Goal {\n guid: string\n account_guid: string\n account_is_excluded_from_debts: boolean\n amount: number\n budget_guid: string\n completed_at?: number\n created_at: number\n created_by: number\n current_amount: number\n goal_type: GoalType\n has_been_spent: boolean\n initial_amount: number\n interest_rate?: number\n is_complete: boolean\n is_spendable: boolean\n meta_type: MetaType\n metadata?: string\n monthly_payment?: number\n name: string\n payment_due_at?: number\n position: number\n projected_to_complete_at?: number\n revision: number\n track_type?: TrackType\n updated_at: number\n user_guid: string\n}\n\nexport enum TrackType {\n DEBT_TRACK = 1,\n SAVINGS_TRACK = 2,\n RETIREMENT_TRACK = 3,\n EMERGENCY_FUND_TRACK = 4,\n}\n\nexport enum GoalType {\n SAVE_AMOUNT = 1,\n KEEP_BALANCE_BELOW = 2,\n KEEP_BALANCE_ABOVE = 3,\n ACTION = 4,\n}\n\nexport enum MetaType {\n AUTOMOBILE = 1,\n COLLEGE = 2,\n HOUSE = 3,\n RECREATIONAL_VEHICLE = 4,\n VACATION = 5,\n ELECTRONIC = 6,\n OTHER = 7,\n RETIREMENT = 8,\n EMERGENCY_FUND = 9,\n SETUP_BUDGETS = 10,\n START_MONEY_MANAGEMENT = 11,\n CREDIT_CARD = 12,\n LINE_OF_CREDIT = 13,\n LOANS = 14,\n}\n","export interface Transaction {\n guid: string\n account_guid: string\n amount: number\n attachment_guid?: string | null\n category_guid?: string\n check_number?: string | null\n currency_code: string | null\n date: number\n description: string\n duplicate: boolean\n external_guid?: string | null\n feed_attachment_guid?: string | null\n feed_description: string\n feed_localized_description?: string | null\n feed_posted_date?: number | null\n feed_status: TransactionStatus | null\n feed_transaction_date: number | null\n flags?: number | null\n has_been_split: boolean\n has_been_viewed: boolean\n is_cleared: boolean\n is_flagged: boolean\n is_hidden: boolean\n is_international?: boolean | null\n is_manual: boolean\n is_personal: boolean\n is_reimbursable: boolean\n is_subscription: boolean\n is_void: boolean\n localized_description?: string | null\n localized_memo?: string | null\n memo?: string | null\n metadata?: string | null\n merchant_guid?: string | null\n parent_guid?: string | null\n posted_date?: number | null\n reference?: string | null\n revision: number\n scheduled_payment_guid?: string | null\n top_level_category_guid?: string\n transaction_type: TransactionType\n user_date?: number | null\n user_guid: string\n user_transaction_rule_guid?: string | null\n is_duplicate: boolean\n tags: string[]\n feed_transacted_at: number | null\n\n // Detailed Transaction fields\n account?: string\n accountIsClosed?: boolean\n accountIsHidden?: boolean\n category?: string\n isIncome?: boolean\n isPending?: boolean\n number?: string\n payee?: string\n}\n\nexport enum TransactionType {\n CREDIT = 1,\n DEBIT = 2,\n}\n\nexport enum TransactionStatus {\n POSTED = 1,\n PENDING = 2,\n}\n\nexport interface Tag {\n guid: string\n is_default_tag: boolean\n name: string\n user_guid: string\n}\n\nexport interface Tagging {\n guid: string\n user_guid: string\n tag_guid: string\n transaction_guid: string\n}\n\nexport interface TransactionRule {\n guid: string\n user_guid: string\n category_guid: string\n match_description: string\n description: string\n}\n","export enum ScreenSize {\n Desktop = 'Desktop',\n Mobile = 'Mobile',\n}\n","import type { Transaction } from '../../common/types'\nimport { TransactionStatus, TransactionType } from '../../common/types'\n\nexport const DEFAULT_TRANSACTION = {\n account_guid: '',\n amount: 0,\n currency_code: '',\n date: 0,\n description: '',\n duplicate: false,\n feed_description: '',\n feed_status: TransactionStatus.POSTED,\n feed_transaction_date: 0,\n has_been_split: false,\n has_been_viewed: false,\n is_cleared: false,\n is_flagged: false,\n is_hidden: false,\n is_manual: true,\n is_personal: true,\n is_reimbursable: false,\n is_subscription: false,\n is_void: false,\n revision: 1,\n transaction_type: TransactionType.DEBIT,\n user_guid: '',\n is_duplicate: false,\n feed_transacted_at: 0,\n guid: '',\n memo: undefined,\n tags: [],\n} as Transaction\n","import { makeAutoObservable } from 'mobx'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { endOfMonth } from 'date-fns/endOfMonth'\n\nimport type { Transaction } from '../../common'\n\nimport { DEFAULT_TRANSACTION } from '../constants/Transaction'\n\nexport class UiStore {\n beginDate = startOfMonth(new Date())\n endDate = endOfMonth(new Date())\n\n expandedSplits = [] as string[]\n isInitialized = false\n height = 550\n width = 1000\n shouldDisableDrawerScroll = false\n\n searchValue = ''\n selectedAccountGuids = [] as string[]\n\n manualTransaction: Transaction = DEFAULT_TRANSACTION\n isAmountValid = false\n\n showInsights = false\n\n constructor() {\n makeAutoObservable(this)\n }\n\n setDateRange = (beginDate: Date, endDate: Date) => {\n this.beginDate = beginDate\n this.endDate = endDate\n }\n\n setIsInitialized = (isInitialized: boolean) => (this.isInitialized = isInitialized)\n\n setIsAmountValid = (valid: boolean) => (this.isAmountValid = valid)\n\n setSearchValue = (searchValue: string) => (this.searchValue = searchValue)\n\n setSelectedAccountGuids = (accountGuids: string[]) => (this.selectedAccountGuids = accountGuids)\n\n setShouldDisableDrawerScroll = (shouldDisable: boolean) =>\n (this.shouldDisableDrawerScroll = shouldDisable)\n\n setShowInsights = (showInsights: boolean) => {\n this.showInsights = showInsights\n }\n\n setSize = (height: number, width: number) => {\n this.height = height\n this.width = width\n }\n\n toggleSplit = (guid: string) => {\n const expandedSplits = [...this.expandedSplits]\n const index = this.expandedSplits.findIndex((splitGuid) => splitGuid === guid)\n\n if (index >= 0) {\n expandedSplits.splice(index, 1)\n } else {\n expandedSplits.push(guid)\n }\n\n this.expandedSplits = expandedSplits\n }\n\n updateManualTransaction = (manualTransaction: Transaction) => {\n this.manualTransaction = manualTransaction\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { endOfToday } from 'date-fns/endOfToday'\nimport { formatISO } from 'date-fns/formatISO'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { isBefore } from 'date-fns/isBefore'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subDays } from 'date-fns/subDays'\n\nimport { TABLE_CONST } from '../../common/constants/Table'\n\nimport { BeatApi } from '../../common'\nimport type { Beat, GlobalStore, Tag, Tagging, Transaction, TransactionRule } from '../../common'\n\nimport { buildDetailedTransactions } from '../utils/buildDetailedTransactions'\nimport { onAnalyticEvent } from '../analytics'\nimport { TransactionApi } from '../api/TransactionApi'\nimport { COLUMN_NAMES } from '../constants/TransactionsTable'\nimport { sortAndFilterTransactions } from '../utils/sortAndFilterTransactions'\nimport { UiStore } from './UiStore'\n\nexport type TransactionFilter = {\n accounts?: string[]\n dateRange?: { start: Date; end: Date }\n custom?: (value: Transaction) => boolean\n searchTerm?: string\n}\n\nexport class TransactionStore {\n api = new TransactionApi('/', '')\n beatApi = new BeatApi('/', '')\n\n globalStore: GlobalStore\n uiStore: UiStore\n\n isLoading = true\n taggings: Tagging[] = []\n tags: Tag[] = []\n transactionRules: TransactionRule[] = []\n transactions: Transaction[] = []\n\n associatedBeats: Beat[] = []\n\n cachedStartDate: Date = subDays(startOfToday(), 90)\n\n onAnalyticEvent = onAnalyticEvent\n sortColumn = COLUMN_NAMES.DATE\n sortDirection = TABLE_CONST.DESC\n\n filter: TransactionFilter = {}\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.uiStore = new UiStore()\n\n makeAutoObservable(this)\n }\n\n initialize = async (endpoint: string, token: string) => {\n this.api = new TransactionApi(endpoint, token)\n this.beatApi = new BeatApi(endpoint, token)\n\n Promise.all([\n this.loadAssociatedBeats(startOfMonth(new Date())),\n this.loadTags(),\n this.loadTaggings(),\n this.loadTransactionRules(),\n // By default loads 90 days of transactions\n this.loadTransactions(),\n ]).then(() => this.uiStore.setIsInitialized(true))\n }\n\n get sortedTransactions(): Transaction[] {\n return sortAndFilterTransactions(\n this.filter,\n this.uiStore.expandedSplits,\n this.sortColumn,\n this.sortDirection,\n this.tags,\n this.transactions,\n )\n }\n\n addTag = async (name: string) => {\n await this.api.addTag({ name } as Tag)\n await this.loadTags()\n }\n\n addTagging = async (tagGuid: string, transactionGuid: string) => {\n await this.api.addTagging({\n tag_guid: tagGuid,\n transaction_guid: transactionGuid,\n } as Tagging)\n }\n\n addOrUpdateTransactionRule = async (categoryGuid: string, transaction: Transaction) => {\n const existingRule = this.transactionRules.find(\n (rule: TransactionRule) => rule.guid === transaction.user_transaction_rule_guid,\n ) as TransactionRule | undefined\n\n if (existingRule) {\n await this.api.updateTransactionRule({\n ...existingRule,\n category_guid: categoryGuid,\n description: transaction.description,\n } as TransactionRule)\n } else {\n await this.api.addTransactionRule({\n category_guid: categoryGuid,\n description: transaction.description,\n match_description: transaction.description,\n } as TransactionRule)\n }\n await this.loadTransactionRules()\n }\n\n addTransaction = async (transaction: Transaction) => {\n const newTransaction = await this.api.addTransaction(transaction)\n\n if (newTransaction) {\n runInAction(\n () =>\n (this.transactions = this.augmentTransactions([newTransaction, ...this.transactions])),\n )\n }\n }\n\n augmentTransactions = (transactions: Transaction[]) => {\n return buildDetailedTransactions(\n transactions,\n this.globalStore.accountStore.accounts,\n this.globalStore.categoryStore.categories,\n this.taggings,\n )\n }\n\n loadAssociatedBeats = async (fromDate?: Date) => {\n const fromDateISO = fromDate ? formatISO(fromDate, { representation: 'date' }) : undefined\n const beats = await this.beatApi.getBeatsWithAssociatedTransaction(fromDateISO)\n runInAction(() => (this.associatedBeats = beats))\n }\n\n loadTags = async () => {\n const tags = await this.api.getTags()\n runInAction(() => (this.tags = tags))\n }\n\n loadTaggings = async () => {\n const taggings = await this.api.getTaggings()\n runInAction(() => (this.taggings = taggings))\n }\n\n loadTransactionRules = async () => {\n const transactionRules = await this.api.getTransactionRules()\n runInAction(() => (this.transactionRules = transactionRules))\n }\n\n loadTransactions = async (\n startDate: Date = this.cachedStartDate,\n endDate: Date = endOfToday(),\n ) => {\n this.setIsLoading(true)\n this.transactions = []\n\n try {\n const transactions = await this.api.getTransactionsByDateRange(\n getUnixTime(startDate),\n getUnixTime(endDate),\n )\n runInAction(() => {\n this.transactions = this.augmentTransactions(transactions)\n })\n } catch (error) {\n console.error(`Error occurred while loading transactions: ${error}`)\n }\n this.setIsLoading(false)\n }\n\n // DEPRECATED\n loadTransactionsByDateRange = async (endDate: number, startDate: number) => {\n console.warn('DEPRECATED: loadTransactionsByDateRange will be removed')\n this.setFilter({\n ...this.filter,\n dateRange: { start: fromUnixTime(startDate), end: fromUnixTime(endDate) },\n })\n }\n\n removeTag = async (tagGuid: string) => {\n await this.api.removeTag(tagGuid)\n await this.loadTags()\n }\n\n removeTagging = async (taggingGuid: string) => {\n await this.api.removeTagging(taggingGuid)\n }\n\n removeTransaction = async (transactionGuid: string) => {\n await this.api.removeTransaction(transactionGuid)\n\n const index = this.transactions.findIndex((t: Transaction) => t.guid === transactionGuid)\n\n if (index >= 0) {\n const updatedTransactions = [...this.transactions]\n updatedTransactions.splice(index, 1)\n runInAction(() => (this.transactions = updatedTransactions))\n }\n }\n\n setFilter = (filter: TransactionFilter) => {\n this.filter = filter\n\n // Only reload transactions if new start date is prior to the current cached start date\n // Cached date range end date is always today\n if (filter.dateRange && isBefore(filter.dateRange.start, this.cachedStartDate)) {\n this.loadTransactions(filter.dateRange.start, endOfToday()).then(() => {\n if (filter.dateRange) {\n this.cachedStartDate = filter.dateRange.start\n }\n })\n }\n }\n\n setIsLoading = (isLoading: boolean) => (this.isLoading = isLoading)\n\n setSortData = (sortColumn: string, sortDirection: string) => {\n this.sortColumn = sortColumn\n this.sortDirection = sortDirection\n }\n\n splitTransaction = async (transaction: Transaction, splits: Transaction[]) => {\n const updatedTransaction = await this.api.updateTransaction(transaction)\n const children = [] as Transaction[]\n\n for (let i = 0; i < splits.length; i++) {\n const child = await this.api.addTransaction(splits[i])\n children.push(child)\n }\n\n const index = this.transactions.findIndex((t: Transaction) => t.guid === transaction.guid)\n\n if (index >= 0) {\n runInAction(\n () =>\n (this.transactions = this.augmentTransactions([\n ...this.transactions.slice(0, index),\n updatedTransaction,\n ...this.transactions.slice(index + 1),\n ...children,\n ])),\n )\n }\n }\n\n unSplitTransaction = async (guid: string) => {\n const children = this.transactions.filter((t) => t.parent_guid === guid)\n\n await this.api.removeTransactionSplit(guid)\n\n // Remove children\n const transactions = [...this.transactions]\n children.forEach((child) => {\n const index = transactions.findIndex((t) => t.guid === child.guid)\n\n if (index >= 0) {\n transactions.splice(index, 1)\n }\n })\n\n // Update parent\n const index = transactions.findIndex((t) => t.guid === guid)\n const transaction = transactions[index]\n transaction.has_been_split = false\n if (index >= 0) {\n runInAction(\n () =>\n (this.transactions = [\n ...transactions.slice(0, index),\n transaction,\n ...transactions.slice(index + 1),\n ]),\n )\n }\n }\n\n updateTaggings = async (tagGuids: string[], transactionGuid: string) => {\n // Add tags that don't current exist in taggings\n for (let i = 0; i < tagGuids.length; i++) {\n const tagGuid = tagGuids[i]\n if (!this.taggings.some((tagging: Tagging) => tagging.tag_guid === tagGuid)) {\n await this.addTagging(tagGuid, transactionGuid)\n }\n }\n\n // Remove tags that are in taggings but not in tagGuids\n for (let i = 0; i < this.taggings.length; i++) {\n const tagging = this.taggings[i]\n if (!tagGuids.includes(tagging.tag_guid)) {\n await this.removeTagging(tagging.guid)\n }\n }\n\n await this.loadTaggings()\n }\n\n updateTag = async (tag: Tag) => {\n await this.api.updateTag(tag)\n await this.loadTags()\n }\n\n updateTransaction = async (transaction: Transaction) => {\n const updatedTransaction = await this.api.updateTransaction(transaction)\n\n const index = this.transactions.findIndex((t: Transaction) => t.guid === transaction.guid)\n\n if (index >= 0) {\n runInAction(\n () =>\n (this.transactions = this.augmentTransactions([\n ...this.transactions.slice(0, index),\n updatedTransaction,\n ...this.transactions.slice(index + 1),\n ])),\n )\n }\n }\n}\n","import React from 'react'\nimport { GlobalDataContext, useTransactionStore } from '../../common'\n\nexport const useTransactionsUiStore = () => {\n const context = React.useContext(GlobalDataContext)\n\n if (!context) {\n throw new Error('useTransactionsUiStore() must be used within the GlobalDataContext')\n }\n\n return useTransactionStore().uiStore\n}\n","import { format } from 'date-fns/format'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\n\nimport { CategoryGuidToName } from '../../common'\nimport type { Tag, Transaction } from '../../common'\n\n// TODO: Change the way formatting data is exported in order to handle localization\ntype FormattedTransaction = {\n Date: string\n Description: string\n 'Original Description': string\n Amount: string\n 'Parent Category': string\n Category: string\n Account: string\n Tags: string\n Memo: string\n}\n\nexport const exportTransactionsToCSV = (transactions: Transaction[], tags: Tag[]) => {\n const csvContent = structureCSVData(formatTransactions(transactions, tags))\n const uriEncodedData = encodeURIComponent(csvContent)\n const link = document.createElement('a')\n\n link.href = `data:attachment/csv;charset=utf-8,${uriEncodedData}`\n link.download = 'transactions.csv'\n\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n}\n\n/**\n * Formats a list of transactions into a list that will be used when\n * downloaded to a CSV file.\n */\nconst formatTransactions = (transactions: Transaction[], tags: Tag[]) => {\n return transactions.map((transaction) => ({\n // TODO: Data format should be localized\n Date: format(fromUnixTime(transaction.date), 'MM/dd/yy'),\n Description: getDescription(transaction),\n 'Original Description': transaction.feed_description,\n Amount: `${transaction.amount}`,\n 'Parent Category': CategoryGuidToName[transaction.top_level_category_guid || ''],\n Category: transaction.category,\n Account: transaction.account,\n Tags: getTags(transaction, tags),\n Memo: transaction.memo,\n })) as FormattedTransaction[]\n}\n\n/**\n * Structures the CSV file data using the formatted transactions\n */\nconst structureCSVData = (formattedTransactions: FormattedTransaction[]) => {\n const csvHeader = Object.keys(formattedTransactions[0]).join(',').concat('\\r\\n')\n const csvRows = formattedTransactions\n .map((transaction) => Object.values(transaction).join(','))\n .join('\\r\\n')\n\n return csvHeader + csvRows\n}\n\n/**\n * Get the description for a transaction that will be used within the CSV copy.\n * We want to highlight that split transactions are a split as well as\n * hidden transactions are hidden.\n */\nconst getDescription = (transaction: Transaction) => {\n let description = transaction.parent_guid ? 'Split: ' : ''\n description += transaction.is_hidden ? '(Excluded) ' : ''\n description += transaction.description\n\n return description\n}\n\nconst getTags = (transaction: Transaction, tags: Tag[]) => {\n return transaction.tags\n .map((tagGuid) => {\n const tag = tags.filter((t) => t.guid === tagGuid)[0]\n\n return tag?.name ?? ''\n })\n .join(' ')\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { Icon, MerchantLogo, Text } from '@kyper/mui'\n\nimport {\n formatCurrency,\n ListItemWrapper,\n Transaction,\n TransactionType,\n useGlobalCopyStore,\n useTransactionStore,\n} from '../../../../common'\n\nimport { ON_CLICK_EVENTS } from '../../../constants/OnClickEvents'\nimport { useTransactionsUiStore } from '../../../context/hooks'\n\ninterface TransactionRowProps {\n onClick?: (guid: string) => void\n transaction: Transaction\n}\n\nconst TransactionRow: React.FC<TransactionRowProps> = ({ transaction, onClick }) => {\n const { associatedBeats } = useTransactionStore()\n const { transactions: copy } = useGlobalCopyStore()\n const { showInsights } = useTransactionsUiStore()\n\n const isCredit = transaction.transaction_type === TransactionType.CREDIT\n\n const beat = React.useMemo(() => {\n return associatedBeats.find((beat) => beat.associated_transaction_guid === transaction.guid)\n }, [associatedBeats, transaction])\n\n return (\n <ListItemWrapper\n clickEventName={ON_CLICK_EVENTS.ON_TRANSACTION_LIST_ITEM_CLICK}\n onClick={onClick ? () => onClick(transaction.guid) : undefined}\n >\n <ListItemAvatar>\n {transaction.parent_guid ? (\n <React.Fragment />\n ) : (\n <MerchantLogo\n categoryGuid={transaction.top_level_category_guid || ''}\n merchantGuid={transaction.merchant_guid || ''}\n />\n )}\n </ListItemAvatar>\n <ListItemText\n disableTypography={true}\n secondary={\n <Stack direction=\"row\" justifyContent=\"space-between\">\n <Stack alignItems=\"center\" direction=\"row\" gap={4}>\n {transaction.is_flagged && (\n <Icon fill={true} name=\"flag\" size={16} sx={{ color: 'warning.dark' }} />\n )}\n {transaction.is_hidden && <Icon name=\"visibility_off\" size={16} />}\n {transaction.has_been_split && <Icon name=\"call_split\" size={16} />}\n <Text variant=\"XSmall\">\n {transaction.has_been_split\n ? copy.split_transaction_category_label\n : transaction.category}\n </Text>\n </Stack>\n {beat && showInsights && (\n <Text bold={true} color=\"action.active\" variant=\"XSmall\">\n {beat.short_title}\n </Text>\n )}\n </Stack>\n }\n >\n <Stack direction=\"row\" justifyContent=\"space-between\">\n <Text bold={true} variant=\"Body\">\n {transaction.is_hidden && copy.hide_trnx_cancel_hidden_note}\n {transaction.payee || transaction.description || transaction.feed_description}\n </Text>\n <Text bold={true} color={isCredit ? 'success.main' : 'text.primary'} variant=\"Body\">\n {isCredit ? '+' : ''}\n {formatCurrency(transaction.amount, '0,0.00')}\n </Text>\n </Stack>\n </ListItemText>\n </ListItemWrapper>\n )\n}\n\nexport default observer(TransactionRow)\n","import React, { PropsWithChildren } from 'react'\n\nimport Box from '@mui/material/Box'\n\nimport { Text } from '@kyper/mui'\n\ninterface SubheaderRowProps {\n bgcolor?: string\n}\n\nconst SubheaderRow: React.FC<PropsWithChildren<SubheaderRowProps>> = ({\n bgcolor = 'background.default',\n children,\n}) => (\n <Box display=\"inline-block\" pb={4} pl={24} pt={4} sx={{ bgcolor, width: '100%' }}>\n <Text bold={true} variant=\"XSmall\">\n {children}\n </Text>\n </Box>\n)\n\nexport default SubheaderRow\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport ReceiptOutlinedIcon from '@mui/icons-material/ReceiptOutlined'\n\nimport Stack from '@mui/material/Stack'\n\nimport { Text, useTokens } from '@kyper/mui'\n\nimport { useGlobalCopyStore } from '../../../../common'\n\ninterface ZeroStateProps {\n showIcon?: boolean\n showSubtitle?: boolean\n}\n\nconst ZeroState: React.FC<ZeroStateProps> = ({ showIcon = true, showSubtitle = true }) => {\n const tokens = useTokens()\n const { transactions: copy } = useGlobalCopyStore()\n\n return (\n <Stack alignItems=\"center\" gap={tokens.Spacing.Small} height=\"auto\" mt={tokens.Spacing.Large}>\n {showIcon && <ReceiptOutlinedIcon color=\"secondary\" sx={{ fontSize: 32 }} />}\n <Text bold={true} color=\"secondary\" variant=\"Small\">\n {copy.zero_state_no_transactions}\n </Text>\n {showSubtitle && (\n <Text color=\"secondary\" variant=\"XSmall\">\n {copy.zero_state_there_are_no_transactions}\n </Text>\n )}\n </Stack>\n )\n}\n\nexport default observer(ZeroState)\n","import { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { isSameDay } from 'date-fns/isSameDay'\n\nimport { Transaction } from '../../common'\n\nexport const sortByDate = (a: Transaction, b: Transaction) => {\n return b.date - a.date\n}\n\nexport const shouldShowDate = (index: number, transactions: Transaction[]) => {\n const currentDate = fromUnixTime(transactions[index].date)\n const previousDate = fromUnixTime(transactions[index - 1]?.date)\n\n return !isSameDay(currentDate, previousDate)\n}\n\nexport const hasInsetBorder = (index: number, transactions: Transaction[]) => {\n const currentDate = fromUnixTime(transactions[index].date)\n const nextDate = fromUnixTime(transactions[index + 1]?.date)\n\n return isSameDay(currentDate, nextDate)\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { useVirtualizer } from '@tanstack/react-virtual'\n\nimport Box from '@mui/material/Box'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\n\nimport { ANALYTICS_EVENTS, Loader, useEvent } from '../../../common'\n\nimport { useTransactionsUiStore } from '../../context/hooks'\nimport { useTransactionStore } from '../../../common'\n\nimport SubheaderRow from '../../../common/components/SubheaderRow'\nimport TransactionRow from './transactionlist/TransactionRow'\nimport ZeroState from './transactionlist/ZeroState'\n\nimport { hasInsetBorder, shouldShowDate } from '../../utils/Transactions'\nimport { fromUnixToDayOfWeekAndDate } from '../../../common/utils/DateUtil'\n\nconst ROW_HEIGHT = 65\nconst DATE_ROW_HEIGHT = 34\n\nexport interface TransactionListProps {\n bgcolor?: string\n height?: number | string\n loader?: JSX.Element\n onClick?: (guid: string) => void\n showInsights?: boolean\n showLoader?: boolean\n width?: number | string\n zeroState?: JSX.Element\n}\n\nconst TransactionList: React.FC<TransactionListProps> = ({\n bgcolor,\n height = 'calc(100dvh - 36px)',\n loader = <Loader label=\"Loading\" size={40} />,\n onClick,\n showInsights = false,\n showLoader = false,\n width = '100%',\n zeroState = <ZeroState />,\n}) => {\n const { isLoading, sortedTransactions: transactions } = useTransactionStore()\n\n const { setShowInsights, toggleSplit } = useTransactionsUiStore()\n const { onEvent } = useEvent()\n\n const handleClick = (guid: string) => {\n const transaction = transactions.find((t) => t.guid === guid)\n\n if (transaction?.has_been_split) {\n toggleSplit(transaction.guid)\n return\n }\n\n onEvent(ANALYTICS_EVENTS.ACCOUNT_DETAILS_CLICK_TRANSACTION, {\n account_guid: transaction?.account_guid,\n transaction_guid: guid,\n })\n onClick?.(guid)\n }\n\n const parentRef = React.useRef<HTMLDivElement>(null)\n const rowVirtualizer = useVirtualizer({\n count: transactions.length,\n getScrollElement: () => parentRef.current,\n estimateSize: (i) => ROW_HEIGHT + (shouldShowDate(i, transactions) ? DATE_ROW_HEIGHT : 0),\n overscan: 5,\n })\n\n React.useEffect(() => rowVirtualizer.measure(), [transactions])\n React.useEffect(() => setShowInsights(showInsights), [showInsights])\n\n return (\n <List>\n <Box height={height} overflow=\"auto\" ref={parentRef} width={width}>\n <Box\n height={\n // set the height to auto when there are no transactions so the zero state isn't set to 0\n rowVirtualizer.getVirtualItems().length === 0 ? 'auto' : rowVirtualizer.getTotalSize()\n }\n position=\"relative\"\n width=\"100%\"\n >\n {(isLoading || showLoader) && loader}\n {!isLoading && !showLoader && rowVirtualizer.getVirtualItems().length === 0 && zeroState}\n {!isLoading &&\n !showLoader &&\n rowVirtualizer.getVirtualItems().length > 0 &&\n rowVirtualizer.getVirtualItems().map((row) => {\n const transaction = transactions[row.index]\n const showDate = shouldShowDate(row.index, transactions)\n const isInset = hasInsetBorder(row.index, transactions)\n const rowHeight = ROW_HEIGHT + (showDate ? DATE_ROW_HEIGHT : 0)\n\n return (\n <Box\n key={transaction.guid}\n sx={{\n height: rowHeight,\n position: 'absolute',\n transform: `translateY(${row.start}px)`,\n width: '100%',\n }}\n >\n {showDate && (\n <SubheaderRow bgcolor={bgcolor}>\n {fromUnixToDayOfWeekAndDate(transaction.date)}\n </SubheaderRow>\n )}\n <TransactionRow onClick={handleClick} transaction={transaction} />\n <Divider sx={{ ml: isInset ? 24 : 0 }} />\n </Box>\n )\n })}\n </Box>\n </Box>\n </List>\n )\n}\n\nexport default observer(TransactionList)\n","import { GridCellParams } from '@mui/x-data-grid'\n\nimport { Text } from '@kyper/mui'\n\nconst AccountCell = (params: GridCellParams) => (\n <Text tabIndex={params.tabIndex} variant=\"Small\">\n {`${params.row.account}`}\n {params.row.number && ` | ${params.row.number}`}\n </Text>\n)\n\nexport default AccountCell\n","import Stack from '@mui/material/Stack'\n\nimport { GridCellParams } from '@mui/x-data-grid'\n\nimport { Text } from '@kyper/mui'\n\nimport { formatCurrency, TransactionType, useTransactionStore } from '../../../../../common'\n\nimport { useTransactionsUiStore } from '../../../../context/hooks'\n\nconst AmountCell = (params: GridCellParams) => {\n const { associatedBeats } = useTransactionStore()\n const { showInsights } = useTransactionsUiStore()\n\n const { amount, transaction_type } = params.row\n const beat = associatedBeats.find((beat) => beat.associated_transaction_guid === params.row.guid)\n\n const isCredit = transaction_type === TransactionType.CREDIT\n\n return (\n <Stack alignItems=\"flex-end\" tabIndex={params.tabIndex}>\n <Text color={isCredit ? 'success.main' : 'text.primary'} variant=\"Small\">\n {isCredit ? '+' : ''}\n {formatCurrency(amount, '0,0.00')}\n </Text>\n {beat && showInsights && (\n <Text bold={true} color=\"action.active\" variant=\"XSmall\">\n {beat.short_title}\n </Text>\n )}\n </Stack>\n )\n}\n\nexport default AmountCell\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\n\nimport { GridCellParams } from '@mui/x-data-grid-pro'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport { useGlobalCopyStore } from '../../../../../common'\n\nconst CategoryCell = (params: GridCellParams) => {\n const { transactions: copy } = useGlobalCopyStore()\n const [isHover, setIsHover] = React.useState(false)\n\n return (\n <Stack\n alignItems=\"center\"\n direction=\"row\"\n gap={8}\n height=\"100%\"\n onMouseEnter={() => setIsHover(true)}\n onMouseLeave={() => setIsHover(false)}\n width=\"100%\"\n >\n {params.row.has_been_split && <Icon name=\"call_split\" size={16} />}\n <Text tabIndex={params.tabIndex} variant=\"Small\">\n {params.row.has_been_split ? copy.split_transaction_category_label : params.row.category}\n </Text>\n {!params.row.has_been_split && isHover && (\n <Icon name=\"edit\" sx={{ color: 'action.active' }} />\n )}\n </Stack>\n )\n}\n\nexport default observer(CategoryCell)\n","import { fromUnixTime } from 'date-fns/fromUnixTime'\n\nimport { GridCellParams } from '@mui/x-data-grid'\n\nimport { Text } from '@kyper/mui'\n\nimport { DATE_FORMATS_INTL, formatDate } from '../../../../../common'\n\nconst DateCell = (params: GridCellParams) => {\n return (\n <Text tabIndex={params.tabIndex} variant=\"Small\">\n {formatDate(fromUnixTime(params.row.date), DATE_FORMATS_INTL.MONTH_DAY)}\n </Text>\n )\n}\n\nexport default DateCell\n","import Box from '@mui/material/Box'\nimport { observer } from 'mobx-react-lite'\n\nimport { useTheme } from '@mui/material/styles'\nimport { GridRenderCellParams } from '@mui/x-data-grid-pro'\nimport { Icon } from '@kyper/mui'\n\nimport { useGlobalCopyStore } from '../../../../../common'\n\nconst FlagCell = (params: GridRenderCellParams) => {\n const theme = useTheme()\n const { transactions: transactionsCopy } = useGlobalCopyStore()\n const { is_flagged, is_hidden, has_been_viewed, parent_guid } = params.row\n const isChildOfSplit = !!parent_guid\n const hasNotBeenViewed = !has_been_viewed && !isChildOfSplit\n\n return (\n <Box\n aria-label={is_hidden ? transactionsCopy.is_hidden : transactionsCopy.is_flagged}\n tabIndex={params.tabIndex}\n >\n {is_flagged && <Icon fill={true} name=\"flag\" size={16} sx={{ color: 'warning.dark' }} />}\n {!is_flagged && is_hidden && <Icon name=\"visibility_off\" size={16} />}\n {hasNotBeenViewed && (\n <svg\n data-testid=\"svg\"\n style={{\n display: 'inline-block',\n height: 16,\n fill: theme.palette.primary.light,\n verticalAlign: 'middle',\n width: 16,\n }}\n viewBox=\"0 0 512 512\"\n >\n <circle cx=\"256\" cy=\"256\" r=\"60\" />\n </svg>\n )}\n </Box>\n )\n}\n\nexport default observer(FlagCell)\n","import { Text } from '@kyper/mui'\n\nimport { GridColumnHeaderParams } from '@mui/x-data-grid'\n\nconst HeaderCell = (params: GridColumnHeaderParams) => (\n <Text fontWeight={600} variant=\"Small\">\n {params.colDef.headerName}\n </Text>\n)\n\nexport default HeaderCell\n","import Stack from '@mui/material/Stack'\n\nimport { GridCellParams } from '@mui/x-data-grid'\n\nimport { MerchantLogo, Text } from '@kyper/mui'\n\nconst PayeeCell = (params: GridCellParams) => {\n return (\n <Stack alignItems=\"center\" direction=\"row\" gap={8}>\n <MerchantLogo\n categoryGuid={params.row.top_level_category_guid || ''}\n merchantGuid={params.row.merchant_guid || ''}\n />\n <Text tabIndex={params.tabIndex} variant=\"Small\">\n {params.row.payee}\n </Text>\n </Stack>\n )\n}\n\nexport default PayeeCell\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Paper from '@mui/material/Paper'\nimport { DataGridPro, GridCellParams, GridColDef } from '@mui/x-data-grid-pro'\n\nimport { useGlobalCopyStore, useTransactionStore } from '../../../common'\n\nimport {\n AccountCell,\n AmountCell,\n CategoryCell,\n DateCell,\n FlagCell,\n HeaderCell,\n PayeeCell,\n} from './transactiontable/cells'\n\ninterface TransactionTableProps {\n height?: number | string\n onCategoryClick?: (guid: string) => void\n onRowClick?: (guid: string) => void\n}\n\nconst TransactionTable: React.FC<TransactionTableProps> = ({\n height = '100dvh',\n onCategoryClick,\n onRowClick,\n}) => {\n const { isLoading, sortedTransactions } = useTransactionStore()\n const { transactions: copy } = useGlobalCopyStore()\n\n const columns: GridColDef[] = [\n {\n field: 'flag',\n headerName: '',\n minWidth: 32,\n width: 32,\n sortable: false,\n renderCell: (params) => <FlagCell {...params} />,\n renderHeader: () => <span aria-label={copy.transaction_status} role=\"presentation\" />,\n },\n {\n field: 'date',\n headerName: copy.date_title,\n width: 103,\n renderHeader: HeaderCell,\n renderCell: DateCell,\n sortingOrder: ['desc', 'asc'],\n },\n {\n cellClassName: 'vertical-align-center',\n field: 'payee',\n headerName: copy.payee_title,\n flex: 0.33,\n renderHeader: HeaderCell,\n renderCell: PayeeCell,\n sortingOrder: ['asc', 'desc'],\n },\n {\n field: 'category',\n headerName: copy.category_title,\n flex: 0.25,\n renderHeader: HeaderCell,\n renderCell: (params) => <CategoryCell {...params} />,\n sortingOrder: ['asc', 'desc'],\n },\n {\n field: 'account',\n headerName: copy.account_title,\n flex: 0.33,\n renderHeader: HeaderCell,\n renderCell: AccountCell,\n sortingOrder: ['asc', 'desc'],\n },\n {\n field: 'amount',\n headerName: copy.amount_title,\n flex: 0.25,\n renderHeader: HeaderCell,\n renderCell: AmountCell,\n align: 'right',\n headerAlign: 'right',\n sortingOrder: ['asc', 'desc'],\n },\n ]\n\n const rows = React.useMemo(\n () =>\n sortedTransactions.map((transaction) => ({\n id: transaction.guid,\n isHovering: false,\n ...transaction,\n })),\n [sortedTransactions],\n )\n\n const handleCellClick = (params: GridCellParams) => {\n if (params.field === 'category') {\n onCategoryClick?.(params.row.guid)\n } else {\n onRowClick?.(params.row.guid)\n }\n }\n\n return (\n <Paper sx={{ height: height, px: 24, width: '100%', boxShadow: 'none' }}>\n <DataGridPro\n columns={columns}\n disableColumnFilter={true}\n disableColumnMenu={true}\n hideFooter={true}\n initialState={{ sorting: { sortModel: [{ field: 'date', sort: 'desc' }] } }}\n loading={isLoading}\n onCellClick={handleCellClick}\n rows={rows}\n slotProps={{ baseIconButton: { color: 'secondary', sx: { ml: 8 } } }}\n />\n </Paper>\n )\n}\n\nexport default observer(TransactionTable)\n","import React from 'react'\nimport { GlobalDataContext, useCategoryStore } from '../../common'\n\nexport const useCategoryUiStore = () => {\n const context = React.useContext(GlobalDataContext)\n\n if (!context) {\n throw new Error('useCategoryUiStore() must be used within the GlobalDataContext')\n }\n\n return useCategoryStore().uiStore\n}\n","export const ON_CLICK_EVENTS = {\n ON_CATEGORY_EXPANDED: 'onCategoryExpanded',\n ON_CATEGORY_COLLAPSED: 'onCategoryCollapsed',\n ON_CATEGORY_SELECTED: 'onCategorySelected',\n ON_SUBCATEGORY_ADD_CLICK: 'onSubcategoryAddClick',\n ON_SUBCATEGORY_ADD_CANCEL_CLICK: 'onSubcategoryAddCancelClick',\n ON_SUBCATEGORY_ADDED: 'onSubcategoryAdded',\n ON_SUBCATEGORY_EDIT_CLICK: 'onSubcategoryEditClick',\n ON_SUBCATEGORY_EDIT_CANCEL_CLICK: 'onSubcategoryEditCancelClick',\n ON_SUBCATEGORY_DELETE_CLICK: 'onSubcategoryDeleteClick',\n ON_SUBCATEGORY_DELETED: 'onSubcategoryDeleted',\n ON_SUBCATEGORY_SAVED: 'onSubcategorySaved',\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { Text } from '@kyper/mui'\nimport { TextField } from '@kyper/mui'\n\nimport { Dialog, useGlobalCopyStore } from '../../../common'\nimport { buildDynamicCopy } from '../../../common/utils'\nimport type { DynamicCopyElement } from '../../../common/types'\nimport DialogContent from '@mui/material/DialogContent'\n\nimport { useCategoryUiStore } from '../../context/hooks'\n\nexport enum CustomCategoryModalType {\n ADD = 'add',\n EDIT = 'edit',\n DELETE = 'delete',\n}\n\ninterface CustomCategoryModalProps {\n categoryName?: string\n onClose: () => void\n onSave: (name: string) => void\n isOpen: boolean\n type: CustomCategoryModalType\n}\n\nconst CustomCategoryModal: React.FC<CustomCategoryModalProps> = ({\n categoryName = '',\n onClose,\n onSave,\n isOpen,\n type,\n}) => {\n const [name, setName] = React.useState(categoryName)\n const { categories: copy } = useGlobalCopyStore()\n const { setShouldDisableDrawerScroll } = useCategoryUiStore()\n\n let headingText = ''\n let primaryText: DynamicCopyElement = []\n\n const isDeleteType = type === CustomCategoryModalType.DELETE\n\n switch (type) {\n case CustomCategoryModalType.ADD:\n headingText = copy.add_subcategory_title\n break\n case CustomCategoryModalType.EDIT:\n headingText = buildDynamicCopy(copy.edit_subcategory_title, categoryName) as string\n break\n case CustomCategoryModalType.DELETE:\n headingText = copy.delete_subcategory_heading\n primaryText = buildDynamicCopy(\n copy.all_transactions_in_this_subcategory,\n <Text bold={true}>\n {buildDynamicCopy(copy.all_parent_category, categoryName) as string}\n </Text>,\n ) as DynamicCopyElement\n break\n }\n\n return (\n <Dialog\n copy={{\n title: headingText,\n }}\n disablePrimaryButton={!name}\n isOpen={isOpen}\n onClose={() => {\n setShouldDisableDrawerScroll(false)\n onClose()\n }}\n onPrimaryAction={() => {\n setShouldDisableDrawerScroll(false)\n onSave(name)\n }}\n >\n <DialogContent>\n {isDeleteType ? (\n <Text>{primaryText as string}</Text>\n ) : (\n <TextField\n aria-label={\n type === CustomCategoryModalType.EDIT\n ? copy.edit_subcategory_aria\n : copy.add_subcategory_aria\n }\n name=\"modify-subcategory\"\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setName(e.target.value)}\n placeholder={copy.input_placeholder}\n sx={{ width: '100%' }}\n value={name}\n />\n )}\n </DialogContent>\n </Dialog>\n )\n}\n\nexport default observer(CustomCategoryModal)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport type { Category } from '../../../common/types'\n\nimport CustomCategoryModal, { CustomCategoryModalType } from './CustomCategoryModal'\n\nimport { ON_CLICK_EVENTS } from '../../constants/OnClickEvents'\nimport { useCategoryStore, useEvent, useGlobalCopyStore } from '../../../common'\nimport { useCategoryUiStore } from '../../context/hooks'\n\ninterface AddSubcategoryProps {\n parentCategory: Category\n}\n\nconst AddSubcategory: React.FC<AddSubcategoryProps> = ({ parentCategory }) => {\n const [showAdd, setShowAdd] = React.useState(false)\n const { addCategory } = useCategoryStore()\n const { categories: copy } = useGlobalCopyStore()\n const { onEvent } = useEvent()\n const { setShouldDisableDrawerScroll } = useCategoryUiStore()\n\n const handleAdd = async (name: string) => {\n await addCategory(name.trim(), parentCategory.guid)\n onEvent(ON_CLICK_EVENTS.ON_SUBCATEGORY_ADDED)\n setShowAdd(false)\n }\n\n const handleAdding = async () => {\n onEvent(ON_CLICK_EVENTS.ON_SUBCATEGORY_ADD_CLICK)\n setShouldDisableDrawerScroll(true)\n setShowAdd(true)\n }\n\n const handleModalClose = () => {\n setShowAdd(false)\n onEvent(ON_CLICK_EVENTS.ON_SUBCATEGORY_ADD_CANCEL_CLICK)\n }\n\n return (\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton onClick={handleAdding} sx={{ ml: 60 }}>\n <ListItemText\n primary={copy.add_subcategory_button}\n primaryTypographyProps={{ color: 'primary', fontWeight: 'normal', variant: 'Body' }}\n />\n </ListItemButton>\n\n {showAdd && (\n <CustomCategoryModal\n isOpen={showAdd}\n onClose={handleModalClose}\n onSave={handleAdd}\n type={CustomCategoryModalType.ADD}\n />\n )}\n </ListItem>\n )\n}\n\nexport default observer(AddSubcategory)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport type { Category } from '../../../common/types'\n\nimport CustomCategoryModal from './CustomCategoryModal'\n\nimport { CustomCategoryModalType } from './CustomCategoryModal'\nimport { ON_CLICK_EVENTS } from '../../constants/OnClickEvents'\nimport { useCategoryStore, useEvent } from '../../../common'\n\ninterface RenameSubcategoryProps {\n setShowRename: (show: boolean) => void\n subCategory: Category\n showRename: boolean\n}\n\nconst RenameSubcategory: React.FC<RenameSubcategoryProps> = ({\n setShowRename,\n subCategory,\n showRename,\n}) => {\n const { updateCategory } = useCategoryStore()\n const { onEvent } = useEvent()\n\n const handleRename = async (name: string) => {\n await updateCategory({ ...subCategory, name })\n onEvent(ON_CLICK_EVENTS.ON_SUBCATEGORY_SAVED)\n setShowRename(false)\n }\n\n const handleModalClose = () => {\n setShowRename(false)\n onEvent(ON_CLICK_EVENTS.ON_SUBCATEGORY_EDIT_CANCEL_CLICK)\n }\n\n return (\n <CustomCategoryModal\n categoryName={subCategory.name}\n isOpen={showRename}\n onClose={handleModalClose}\n onSave={handleRename}\n type={CustomCategoryModalType.EDIT}\n />\n )\n}\n\nexport default observer(RenameSubcategory)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport CustomCategoryModal, { CustomCategoryModalType } from './CustomCategoryModal'\n\nimport { useCategoryStore, useEvent } from '../../../common'\nimport type { Category } from '../../../common'\n\nimport { ON_CLICK_EVENTS } from '../../constants/OnClickEvents'\n\ninterface DeleteSubcategoryProps {\n parentCategory: Category\n showDelete: boolean\n setShowDelete: (isOpen: boolean) => void\n subCategory: Category\n}\n\nconst DeleteSubcategory: React.FC<DeleteSubcategoryProps> = ({\n parentCategory,\n showDelete,\n setShowDelete,\n subCategory,\n}) => {\n const { onEvent } = useEvent()\n const { removeCategory } = useCategoryStore()\n\n const handleClose = () => {\n setShowDelete(false)\n onEvent(ON_CLICK_EVENTS.ON_SUBCATEGORY_DELETE_CLICK)\n }\n\n const handleDelete = async () => {\n onEvent(ON_CLICK_EVENTS.ON_SUBCATEGORY_DELETED)\n await removeCategory(subCategory.guid)\n setShowDelete(false)\n }\n\n return (\n <CustomCategoryModal\n categoryName={parentCategory.name}\n isOpen={showDelete}\n onClose={handleClose}\n onSave={handleDelete}\n type={CustomCategoryModalType.DELETE}\n />\n )\n}\n\nexport default observer(DeleteSubcategory)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Chip from '@mui/material/Chip'\nimport IconButton from '@mui/material/IconButton'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle'\nimport DeleteOutlinedIcon from '@mui/icons-material/DeleteOutlined'\nimport EditOutlinedIcon from '@mui/icons-material/EditOutlined'\n\nimport { buildDynamicCopy } from '../../common/utils'\nimport type { Category } from '../../common/types'\n\nimport RenameSubcategory from './CustomCategories/RenameSubcategory'\nimport DeleteSubcategory from './CustomCategories/DeleteSubcategory'\n\nimport { useEvent, useGlobalCopyStore } from '../../common'\nimport { useCategoryUiStore } from '../context/hooks'\nimport { ON_CLICK_EVENTS } from '../constants/OnClickEvents'\n\ninterface SubcategoryRowProps {\n parentCategory: Category\n subCategory: Category\n}\n\nconst SubcategoryRow: React.FC<SubcategoryRowProps> = ({ parentCategory, subCategory }) => {\n const {\n onSelect,\n selectedGuid,\n setSelectedGuid,\n setShouldDisableDrawerScroll,\n showSelected,\n unselectable,\n unselectableText,\n } = useCategoryUiStore()\n const { categories: copy } = useGlobalCopyStore()\n const { onEvent } = useEvent()\n\n const [showRename, setShowRename] = React.useState(false)\n const [showDelete, setShowDelete] = React.useState(false)\n\n const isCustom = Boolean(subCategory.revision)\n const isSelected = subCategory.guid === selectedGuid\n const isSelectable = !unselectable.some((item) => item === subCategory.guid)\n const handleClick = () => {\n if (isSelectable) {\n // Internal state\n setSelectedGuid(subCategory.guid)\n // External notification\n onSelect(subCategory.guid)\n onEvent(ON_CLICK_EVENTS.ON_CATEGORY_SELECTED)\n }\n }\n\n return (\n <ListItem\n className=\"mx-cat-subcategory-row\"\n disableGutters={true}\n disablePadding={true}\n sx={{ pl: 58 }}\n >\n <ListItemButton\n aria-pressed={isSelected}\n color=\"secondary\"\n onClick={handleClick}\n sx={{ height: 44 }}\n >\n <ListItemText\n primary={subCategory.name}\n primaryTypographyProps={{ fontWeight: 'normal', variant: 'Body' }}\n />\n {showSelected && isSelected && <CheckCircleIcon fontSize=\"small\" />}\n {!isSelectable && <Chip label={unselectableText} />}\n </ListItemButton>\n {isCustom && (\n <Box className={`mx-cat-subcategory-edit-container`} sx={{ marginRight: 24 }}>\n <IconButton\n aria-label={buildDynamicCopy(copy.edit_subcategory_aria, subCategory.name) as string}\n onClick={() => {\n setShowRename(true)\n setShouldDisableDrawerScroll(true)\n onEvent(ON_CLICK_EVENTS.ON_SUBCATEGORY_EDIT_CLICK)\n }}\n >\n <EditOutlinedIcon color=\"secondary\" />\n </IconButton>\n <IconButton\n aria-label={buildDynamicCopy(copy.delete_subcategory_aria, subCategory.name) as string}\n edge=\"end\"\n onClick={() => {\n setShowDelete(true)\n setShouldDisableDrawerScroll(true)\n onEvent(ON_CLICK_EVENTS.ON_SUBCATEGORY_DELETE_CLICK)\n }}\n >\n <DeleteOutlinedIcon color=\"secondary\" />\n </IconButton>\n </Box>\n )}\n {showDelete && (\n <DeleteSubcategory\n parentCategory={parentCategory}\n setShowDelete={setShowDelete}\n showDelete={showDelete}\n subCategory={subCategory}\n />\n )}\n {showRename && (\n <RenameSubcategory\n setShowRename={setShowRename}\n showRename={showRename}\n subCategory={subCategory}\n />\n )}\n </ListItem>\n )\n}\n\nexport default observer(SubcategoryRow)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Collapse from '@mui/material/Collapse'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\n\nimport type { Category } from '../../common/types'\nimport AddSubcategory from './CustomCategories/AddSubcategory'\nimport SubcategoryRow from './SubcategoryRow'\nimport { useCategoryUiStore } from '../context/hooks'\n\ninterface SubcategoryListProps {\n categories: Category[]\n parentCategory: Category\n}\n\nconst SubcategoryList: React.FC<SubcategoryListProps> = ({ categories, parentCategory }) => {\n const { expandedGuid, searchValue } = useCategoryUiStore()\n const isExpanded = parentCategory.guid === expandedGuid\n const isFiltered = Boolean(searchValue)\n\n return (\n <Collapse\n in={isExpanded || isFiltered}\n sx={{ backgroundColor: 'background.default' }}\n timeout=\"auto\"\n unmountOnExit={true}\n >\n <List\n aria-labelledby={`category-${parentCategory.guid}`}\n className=\"mx-cat-subcategory-list\"\n id={`subcategories-${parentCategory.guid}`}\n >\n {categories.map((category) => (\n <React.Fragment key={category.guid}>\n <SubcategoryRow parentCategory={parentCategory} subCategory={category} />\n <Divider sx={{ ml: 58 }} />\n </React.Fragment>\n ))}\n {!isFiltered && <AddSubcategory parentCategory={parentCategory} />}\n </List>\n </Collapse>\n )\n}\n\nexport default observer(SubcategoryList)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemIcon from '@mui/material/ListItemIcon'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight'\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore'\n\nimport { CategoryIcon } from '@kyper/mui'\n\nimport { useEvent } from '../../common'\nimport type { Category } from '../../common'\n\nimport { useCategoryUiStore } from '../context/hooks'\nimport { ON_CLICK_EVENTS } from '../constants/OnClickEvents'\nimport SubcategoryList from './SubcategoryList'\n\ninterface CategoryRowProps {\n category: Category\n subCategories: Category[]\n}\n\nconst CategoryRow: React.FC<CategoryRowProps> = ({ category, subCategories }) => {\n const { expandedGuid, searchValue, setExpandedGuid } = useCategoryUiStore()\n const { onEvent } = useEvent()\n const isExpanded = category.guid === expandedGuid\n\n const handleExpanderClick = () => {\n const guid = category.guid !== expandedGuid ? category.guid : null\n setExpandedGuid(guid)\n onEvent(guid ? ON_CLICK_EVENTS.ON_CATEGORY_EXPANDED : ON_CLICK_EVENTS.ON_CATEGORY_COLLAPSED)\n }\n\n return (\n <React.Fragment>\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton\n aria-controls={`subcategories-${category.guid}`}\n aria-expanded={category.guid === expandedGuid}\n aria-label={category.name}\n id={`category-${category.guid}`}\n key={category.guid}\n onClick={handleExpanderClick}\n >\n <ListItemAvatar>\n <CategoryIcon categoryGuid={category.guid} />\n </ListItemAvatar>\n <ListItemText\n primary={category.name}\n primaryTypographyProps={{ fontWeight: 'normal', variant: 'Body' }}\n />\n <ListItemIcon>\n {isExpanded || searchValue ? <ExpandMoreIcon /> : <ChevronRightIcon />}\n </ListItemIcon>\n </ListItemButton>\n </ListItem>\n <Divider sx={{ ml: 58 }} />\n <SubcategoryList categories={subCategories} parentCategory={category} />\n </React.Fragment>\n )\n}\n\nexport default observer(CategoryRow)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport List from '@mui/material/List'\nimport Paper from '@mui/material/Paper'\n\nimport { buildDynamicCopy, useCategoryStore, useGlobalCopyStore } from '../../common'\nimport type { Category } from '../../common/types'\n\nimport { useCategoryUiStore } from '../context/hooks'\nimport CategoryRow from './CategoryRow'\n\ninterface NestedCategory {\n category: Category\n children: Category[]\n}\n\nconst CategoryList: React.FC = () => {\n const { categories } = useCategoryStore()\n const { searchValue } = useCategoryUiStore()\n const { categories: copy } = useGlobalCopyStore()\n\n const buildNestedCategories = (categories: Category[], filter = ''): NestedCategory[] => {\n return categories.reduce((acc, currCategory) => {\n if (currCategory.parent_guid === null) {\n const categoriesWithParent = [\n {\n ...currCategory,\n name: buildDynamicCopy(copy.all_parent_category, currCategory.name) as string,\n parent_guid: currCategory.guid,\n },\n ...categories,\n ]\n const children = categoriesWithParent.filter(\n (category) =>\n category.parent_guid === currCategory.guid &&\n category.name.toLowerCase().includes(filter.toLowerCase()),\n )\n\n if (currCategory.name.toLowerCase().includes(filter.toLowerCase()) || children.length > 0) {\n return [...acc, { category: { ...currCategory }, children }]\n }\n }\n return acc\n }, [] as NestedCategory[])\n }\n\n const nestedCategories = buildNestedCategories(categories, searchValue)\n\n return (\n <Paper className=\"mx-cat-category-list\" sx={{ boxShadow: 'none' }}>\n <List>\n {nestedCategories.map((nested: NestedCategory) => (\n <CategoryRow\n category={nested.category}\n key={nested.category.guid}\n subCategories={nested.children}\n />\n ))}\n </List>\n </Paper>\n )\n}\n\nexport default observer(CategoryList)\n","import React from 'react'\nimport { css } from '@mxenabled/cssinjs'\nimport { observer } from 'mobx-react-lite'\n\nimport CategoryList from './CategoryList'\nimport { SearchBox, useCategoryStore, useGlobalCopyStore } from '../../common'\nimport { useCategoryUiStore } from '../context/hooks'\n\nexport interface CategorySelectorProps {\n initialSelected?: string\n onSelect: (guid: string) => void\n showSelected?: boolean\n unselectable?: string[]\n unselectableText?: string\n}\n\nconst CategorySelector: React.FC<CategorySelectorProps> = ({\n initialSelected,\n onSelect = undefined,\n showSelected = true,\n unselectable = [],\n unselectableText = 'Unselectable',\n}) => {\n const styles = getStyles()\n const { categories, loadCategories } = useCategoryStore()\n const { common: copy } = useGlobalCopyStore()\n\n const {\n searchValue,\n setOnSelect,\n setSearchValue,\n setSelectedGuid,\n setShowSelected,\n setUnselectable,\n setUnselectableText,\n } = useCategoryUiStore()\n\n React.useEffect(() => {\n if (onSelect) {\n setOnSelect(onSelect)\n }\n })\n\n React.useEffect(() => {\n if (!categories.length) {\n loadCategories()\n }\n }, [])\n\n React.useEffect(() => {\n if (initialSelected) {\n setSelectedGuid(initialSelected)\n }\n setShowSelected(showSelected)\n setUnselectable(unselectable)\n setUnselectableText(unselectableText)\n }, [initialSelected, showSelected, unselectable, unselectableText])\n\n return (\n <div className={`mx-cat-category-selector ${styles}`}>\n <SearchBox\n ariaLabel={copy.search_aria}\n cancelAriaLabel={copy.cancel_search_aria}\n onChange={(value) => setSearchValue(value)}\n placeholder={copy.search_placeholder}\n searchValue={searchValue}\n />\n <CategoryList />\n </div>\n )\n}\n\nconst getStyles = () =>\n css({\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n })\n\nexport default observer(CategorySelector)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport { Drawer, useGlobalCopyStore } from '../../common'\n\nimport CategorySelector from './CategorySelector'\n\nimport type { CategorySelectorProps } from './CategorySelector'\n\nexport interface CategorySelectorDrawerProps extends CategorySelectorProps {\n disableScroll?: boolean\n id?: string\n onClose: () => void\n title: string\n showDrawer: boolean\n}\n\nconst CategorySelectorDrawer: React.FC<CategorySelectorDrawerProps> = ({\n id,\n onClose,\n title,\n showDrawer,\n ...categorySelectorProps\n}) => {\n const { common: commonCopy } = useGlobalCopyStore()\n\n return (\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n className=\"mx-cat-category-selector-drawer\"\n id={id}\n isOpen={showDrawer}\n onClose={onClose}\n title={title}\n >\n <CategorySelector {...categorySelectorProps} />\n </Drawer>\n )\n}\n\nexport default observer(CategorySelectorDrawer)\n","import { format } from 'date-fns/format'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subMonths } from 'date-fns/subMonths'\n\nimport {\n type Category,\n type DateRangeCategoryTotals,\n type DetailedCategory,\n type MonthlyAmount,\n type MonthlyCategoryTotals,\n CategoryColors,\n CategoryGuids,\n CategoryIcon,\n DATE_FORMATS_INTL,\n formatDate,\n} from '../../common'\n\nconst MONTHLY_AVERAGE_LENGTH = 3\nconst MONTHS_OF_HISTORY = 12\n\n/**\n * Augment categories\n * @param categories - Categories to augment\n * @param monthlyCategoryTotals - Monthly category totals\n * @param currentCategoryTotals - Current month category totals\n */\nexport const augmentCategories = (\n categories: Category[],\n currentCategoryTotals: DateRangeCategoryTotals[],\n monthlyCategoryTotals: MonthlyCategoryTotals[],\n): DetailedCategory[] => {\n return categories\n .filter((category) => !category.parent_guid)\n .map((category) =>\n getDetailedCategory(\n category,\n currentCategoryTotals,\n monthlyCategoryTotals,\n categories.filter((c) => c.parent_guid === category.guid),\n ),\n )\n}\n\n/**\n * Get an augmented category with additional details\n * @param category - The category to augment\n * @param currentCategoryTotals - Current month category totals\n * @param monthlyCategoryTotals - Past monthly category totals\n * @param subCategories - Subcategories for the specified category (If applicable)\n */\nconst getDetailedCategory = (\n category: Category,\n currentCategoryTotals: DateRangeCategoryTotals[],\n monthlyCategoryTotals: MonthlyCategoryTotals[],\n subCategories: Category[] = [],\n): DetailedCategory => {\n const guid = category.guid\n const parentGuid = category.parent_guid || guid\n const isParent = guid === parentGuid\n\n const currentAmount = currentCategoryTotals.find((t) => t.category_guid === guid)?.total || 0\n const monthlyAmounts = getMonthlyAmounts(\n monthlyCategoryTotals.filter((total) => total.category_guid === guid),\n )\n const totalMonthlyAmounts = getMonthlyAmounts(\n monthlyCategoryTotals.filter(\n (total) => total.category_guid === guid || total.top_level_category_guid === guid,\n ),\n )\n const detailedSubCategories = subCategories.map((subCategory) =>\n getDetailedCategory(subCategory, currentCategoryTotals, monthlyCategoryTotals),\n )\n const totalAmount = detailedSubCategories.reduce(\n (total, current) => total + current.currentAmount,\n currentAmount,\n )\n\n return {\n ...category,\n currentAmount,\n averageAmount: getAverage(monthlyAmounts),\n color: CategoryColors[parentGuid],\n icon: CategoryIcon[parentGuid],\n isTransfer: parentGuid === CategoryGuids.TRANSFER,\n monthlyAmounts,\n subCategories: detailedSubCategories,\n totalAmount: isParent ? totalAmount : 0,\n totalAverageAmount: getAverage(totalMonthlyAmounts),\n totalMonthlyAmounts: isParent ? totalMonthlyAmounts : [],\n }\n}\n\n/**\n * Get the average amount based on the number of months (numMonths) requested\n * @param monthlyAmounts - Monthly amounts to calculate and average from\n * @param numMonths - Number of months to base the average on (DEFAULT: 3)\n */\nconst getAverage = (\n monthlyAmounts: MonthlyAmount[],\n numMonths: number = MONTHLY_AVERAGE_LENGTH,\n): number => {\n const monthsBack = numMonths > history.length ? history.length : numMonths\n\n return Math.ceil(\n Math.max(\n 0,\n monthlyAmounts.slice(-monthsBack).reduce((total, current) => total + current.amount, 0) /\n monthsBack,\n ),\n )\n}\n\n/**\n * Get the last 12 months of amounts for a category\n * @param categoryTotals - Monthly category totals\n */\nconst getMonthlyAmounts = (categoryTotals: MonthlyCategoryTotals[]): MonthlyAmount[] => {\n const monthlyAmounts: MonthlyAmount[] = []\n const today = startOfToday()\n for (let i = 0; i <= MONTHS_OF_HISTORY; i++) {\n const historyDate = startOfMonth(subMonths(today, MONTHS_OF_HISTORY - i))\n const monthlyTotals = categoryTotals.filter(\n (total) => total.year_month === Number(format(historyDate, 'yyyyMM')),\n )\n const totalAmount = monthlyTotals.reduce((acc, curr) => acc + curr.total, 0)\n\n monthlyAmounts.push({\n amount: totalAmount,\n isoDate: format(historyDate, 'yyyy-MM-dd'),\n label: formatDate(historyDate, DATE_FORMATS_INTL.MONTH_YEAR),\n })\n }\n\n return monthlyAmounts\n}\n","import { makeAutoObservable } from 'mobx'\n\nexport class UiStore {\n expandedGuid: string | null = null\n selectedGuid: string | null = null\n searchValue = ''\n showSelected = true\n shouldDisableDrawerScroll = false\n unselectable: string[] = []\n unselectableText = ''\n\n savedOnSelect: any // todo\n\n constructor() {\n makeAutoObservable(this)\n }\n\n setExpandedGuid = (guid: string | null) => (this.expandedGuid = guid)\n\n setSelectedGuid = (guid: string | null) => (this.selectedGuid = guid)\n\n setSearchValue = (value: string) => (this.searchValue = value)\n\n setShouldDisableDrawerScroll = (shouldDisable: boolean) =>\n (this.shouldDisableDrawerScroll = shouldDisable)\n\n setShowSelected = (showSelected: boolean) => (this.showSelected = showSelected)\n\n setUnselectable = (unselectable: string[]) => (this.unselectable = unselectable)\n\n setUnselectableText = (text: string) => (this.unselectableText = text)\n\n onSelect = (guid: string) => this.savedOnSelect(guid)\n\n setOnSelect = (callback: any) => (this.savedOnSelect = callback)\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { subMonths } from 'date-fns/subMonths'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { endOfMonth } from 'date-fns/endOfMonth'\n\nimport { Account, CategoryApi, CategoryGuids, CategoryGuidToName } from '../../common'\n\nimport type {\n Category,\n DetailedCategory,\n DateRangeCategoryTotals,\n GlobalStore,\n MonthlyCategoryTotals,\n} from '../../common'\n\nimport { augmentCategories } from '../util/CategoryUtil'\nimport { UiStore } from './UiStore'\n\nexport class CategoryStore {\n api = new CategoryApi('/', '')\n globalStore: GlobalStore\n uiStore: UiStore\n\n categories: Category[] = []\n dateRangeCategoryTotals: DateRangeCategoryTotals[] = []\n monthlyCategoryTotals: MonthlyCategoryTotals[] = []\n\n isLoadingCategoryTotals = false\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.uiStore = new UiStore()\n\n makeAutoObservable(this)\n }\n\n initialize = async (endpoint: string, token: string) => {\n this.api = new CategoryApi(endpoint, token)\n\n await this.loadCategories()\n }\n\n get detailedCategories(): DetailedCategory[] {\n return augmentCategories(\n this.categories,\n this.dateRangeCategoryTotals,\n this.monthlyCategoryTotals,\n )\n }\n\n get incomeCategories(): DetailedCategory[] {\n return this.detailedCategories.filter((c) => c.is_income)\n }\n\n get spendCategories(): DetailedCategory[] {\n return this.detailedCategories.filter(\n (c) => !c.is_income && !c.isTransfer && c.guid !== CategoryGuids.INVESTMENTS,\n )\n }\n\n get transferCategories(): DetailedCategory[] {\n return this.detailedCategories.filter((c) => c.isTransfer)\n }\n\n addCategory = async (name: string, parentGuid: string) => {\n const category = { name, parent_guid: parentGuid } as Category\n\n try {\n await this.api.addCategory(category)\n await this.loadCategories()\n } catch (error) {\n console.error(`Error occurred while adding category: ${error}`)\n }\n }\n\n loadCategories = async () => {\n try {\n const categories = await this.api.getCategories()\n const { default_categories } = this.globalStore.copyStore.copy.categories\n\n runInAction(() => {\n this.categories = categories.map((category: Category) => ({\n ...category,\n name: default_categories[category.guid]\n ? default_categories[category.guid].replace(/&/g, '&')\n : category.name,\n }))\n })\n } catch (error) {\n console.error(`Error occurred while getting categories: ${error}`)\n }\n }\n\n loadDateRangeCategoryTotals = async (accounts: Account[], startDate: Date, endDate: Date) => {\n this.setIsLoadingCategoryTotals(true)\n try {\n const totals = await this.api.getDateRangeCategoryTotals(\n getUnixTime(startDate),\n getUnixTime(endDate),\n accounts,\n )\n runInAction(() => {\n this.dateRangeCategoryTotals = totals\n this.setIsLoadingCategoryTotals(false)\n })\n } catch (error) {\n this.setIsLoadingCategoryTotals(false)\n console.error(`Error occurred while getting date range category totals: ${error}`)\n }\n }\n\n loadMonthlyCategoryTotals = async (\n accounts: Account[] = this.globalStore.accountStore.accounts,\n startDate?: Date,\n endDate?: Date,\n ) => {\n const start = getUnixTime(startOfMonth(startDate ?? subMonths(new Date(), 11)))\n const end = getUnixTime(endOfMonth(endDate ?? new Date()))\n\n try {\n const totals = await this.api.getMonthlyCategoryTotals(start, end, accounts)\n\n runInAction(() => {\n this.monthlyCategoryTotals = totals\n })\n } catch (error) {\n console.error(`Error occurred while getting monthly category totals: ${error}`)\n }\n }\n\n reloadCategoryTotals = async (accounts: Account[], startDate: Date, endDate: Date) => {\n this.setIsLoadingCategoryTotals(true)\n try {\n const dateRangeTotals = await this.api.getDateRangeCategoryTotals(\n getUnixTime(startDate),\n getUnixTime(endDate),\n accounts,\n )\n\n const monthlyTotals = await this.api.getMonthlyCategoryTotals(\n getUnixTime(startOfMonth(subMonths(endDate, 11))),\n getUnixTime(endOfMonth(endDate)),\n accounts,\n )\n\n runInAction(() => {\n this.dateRangeCategoryTotals = dateRangeTotals\n this.monthlyCategoryTotals = monthlyTotals\n this.setIsLoadingCategoryTotals(false)\n })\n } catch (error) {\n console.error(`Error occurred while getting category totals: ${error}`)\n }\n }\n\n removeCategory = async (guid: string) => {\n try {\n await this.api.removeCategory(guid)\n await this.loadCategories()\n } catch (error) {\n console.error(`Error occurred while removing category: ${error}`)\n }\n }\n\n setIsLoadingCategoryTotals = (isLoading: boolean) => {\n this.isLoadingCategoryTotals = isLoading\n }\n\n updateCategory = async (category: Category) => {\n try {\n await this.api.updateCategory(category)\n await this.loadCategories()\n } catch (error) {\n console.error(`Error occurred while updating category: ${error}`)\n }\n }\n\n // TODO: Remove this after refactoring Trends components to use detailedCategories\n getCategoryName = (guid: string) => {\n const category = this.categories.find((c) => c.guid === guid)\n return category?.name ?? CategoryGuidToName[guid]\n }\n}\n","import React from 'react'\n\nimport Avatar from '@mui/material/Avatar'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemIcon from '@mui/material/ListItemIcon'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { CategoryIcon, CategoryIconVariants, Icon, IconWeight, Text } from '@kyper/mui'\n\nimport { CategorySelectorDrawer } from '../../../../../categories'\n\nimport {\n ANALYTICS_EVENTS,\n buildDynamicCopy,\n Dialog,\n useCategoryStore,\n useGlobalCopyStore,\n} from '../../../../../common'\n\nimport type { Transaction } from '../../../../../common'\n\nimport { ON_CLICK_EVENTS } from '../../../../constants/OnClickEvents'\nimport { useTransactionsUiStore } from '../../../../context/hooks'\nimport { useEvent, useTransactionStore } from '../../../../../common'\n\ninterface CategoryActionProps {\n transaction: Transaction\n}\n\nconst CategoryAction: React.FC<CategoryActionProps> = ({ transaction }) => {\n const { addOrUpdateTransactionRule, updateTransaction } = useTransactionStore()\n const { categories } = useCategoryStore()\n const { onEvent } = useEvent()\n const { setShouldDisableDrawerScroll, updateManualTransaction } = useTransactionsUiStore()\n const { transactions: copy } = useGlobalCopyStore()\n\n const [open, setOpen] = React.useState(false)\n const [selectedGuid, setSelectedGuid] = React.useState('')\n\n const handleCategoryChange = async (applyToAll: boolean) => {\n await updateTransaction({ ...transaction, category_guid: selectedGuid })\n if (applyToAll) {\n await addOrUpdateTransactionRule(selectedGuid, transaction)\n }\n setSelectedGuid('')\n onEvent(ANALYTICS_EVENTS.TRANSACTION_DETAILS_CLICK_CATEGORY, {\n transaction_guid: transaction.guid,\n })\n }\n\n const handleSelected = (guid: string) => {\n if (transaction.is_manual && !transaction.guid) {\n const category = categories.find((c) => c.guid === guid)\n updateManualTransaction({\n ...transaction,\n category: category?.name,\n category_guid: guid,\n top_level_category_guid: category?.parent_guid || guid,\n })\n } else {\n setSelectedGuid(guid)\n }\n\n handleCloseDrawer()\n }\n\n const handleCloseDrawer = () => {\n setOpen(false)\n setShouldDisableDrawerScroll(false)\n }\n\n const category = React.useMemo(\n () => categories.find((item) => item.guid === selectedGuid),\n [selectedGuid],\n )\n\n return (\n <React.Fragment>\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton\n onClick={() => {\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_CATEGORY_CLICK)\n setOpen(true)\n }}\n >\n <ListItemAvatar>\n <Avatar sx={{ bgcolor: 'border.light' }} variant=\"rounded\">\n <CategoryIcon\n categoryGuid={transaction.top_level_category_guid}\n size={24}\n sx={{ color: 'text.primary' }}\n variant={CategoryIconVariants.Transparent}\n />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary=\"Category\"\n primaryTypographyProps={{ variant: 'XSmall' }}\n secondary={\n <Text bold={true} variant=\"Body\">\n {transaction.category ?? copy.actions_select_a_category}\n </Text>\n }\n />\n <ListItemIcon>\n <Icon name=\"chevron_right\" weight={IconWeight.Dark} />\n </ListItemIcon>\n </ListItemButton>\n </ListItem>\n\n <CategorySelectorDrawer\n initialSelected={transaction.category_guid}\n onClose={handleCloseDrawer}\n onSelect={handleSelected}\n showDrawer={open}\n title={copy.actions_select_a_category}\n />\n\n <Dialog\n copy={{\n title: buildDynamicCopy(\n copy.actions_apply_to_all_transaction_types,\n transaction.description,\n ) as string,\n }}\n isOpen={Boolean(selectedGuid)}\n onClose={() => setSelectedGuid('')}\n onPrimaryAction={() => handleCategoryChange(true)}\n onSecondaryAction={() => handleCategoryChange(false)}\n primaryText={copy.actions_apply_to_all}\n secondaryText={copy.actions_this_time_only}\n >\n <Text>\n {\n buildDynamicCopy(\n copy.actions_all_past_and_future,\n transaction.description,\n category?.name,\n ) as string\n }\n </Text>\n </Dialog>\n </React.Fragment>\n )\n}\n\nexport default CategoryAction\n","import React from 'react'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { getUnixTime } from 'date-fns/getUnixTime'\n\nimport Avatar from '@mui/material/Avatar'\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemIcon from '@mui/material/ListItemIcon'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { Icon, IconWeight, Text, useTokens } from '@kyper/mui'\n\nimport {\n ANALYTICS_EVENTS,\n Calendar,\n CalendarSelectionTypes,\n DATE_FORMATS_INTL,\n Drawer,\n formatDate,\n useEvent,\n useGlobalCopyStore,\n useTransactionStore,\n} from '../../../../../common'\n\nimport type { Transaction } from '../../../../../common'\n\nimport { useTransactionsUiStore } from '../../../../context/hooks'\nimport { ON_CLICK_EVENTS } from '../../../../constants/OnClickEvents'\n\ninterface DateActionProps {\n transaction: Transaction\n}\n\nconst DateAction: React.FC<DateActionProps> = ({ transaction }) => {\n const tokens = useTokens()\n\n const { onEvent } = useEvent()\n const { updateTransaction } = useTransactionStore()\n const { updateManualTransaction } = useTransactionsUiStore()\n const { common: commonCopy, transactions: copy } = useGlobalCopyStore()\n\n const [open, setOpen] = React.useState(false)\n const [date, setDate] = React.useState<number>(transaction.date)\n\n const handleDateSelected = (date: Date) => {\n setDate(getUnixTime(date))\n }\n\n const handleSave = async () => {\n if (transaction.is_manual && !transaction.guid) {\n updateManualTransaction({ ...transaction, date })\n setOpen(false)\n return\n }\n\n await updateTransaction({ ...transaction, date })\n onEvent(ANALYTICS_EVENTS.TRANSACTION_DETAILS_CLICK_DATE, { transaction_guid: transaction.guid })\n setOpen(false)\n }\n\n return (\n <Box className=\"mx-txn-date-action\">\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton\n onClick={() => {\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_DATE_CLICK)\n setOpen(true)\n }}\n >\n <ListItemAvatar>\n <Avatar sx={{ bgcolor: 'border.light' }} variant=\"rounded\">\n <Icon name=\"calendar_month\" sx={{ color: 'text.primary' }} weight={IconWeight.Dark} />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary={copy.date_title}\n primaryTypographyProps={{ variant: 'XSmall' }}\n secondary={\n <Text bold={true} variant=\"Body\">\n {formatDate(fromUnixTime(transaction.date), DATE_FORMATS_INTL.YEAR_MONTH_DAY)}\n </Text>\n }\n />\n <ListItemIcon>\n <Icon name=\"chevron_right\" weight={IconWeight.Dark} />\n </ListItemIcon>\n </ListItemButton>\n </ListItem>\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={open}\n onClose={() => setOpen(false)}\n onPrimaryAction={handleSave}\n primaryText={commonCopy.save_button}\n secondaryText={commonCopy.cancel_button}\n title={copy.date_edit_title}\n >\n <Stack alignItems=\"center\" mt={tokens.Spacing.XXLarge}>\n <Calendar\n beginDate={fromUnixTime(date)}\n copy={{\n nextAria: copy.date_next_aria,\n prevAria: copy.date_prev_aria,\n today: commonCopy.date_range_picker.today,\n }}\n onDateSelected={handleDateSelected}\n selectionType={CalendarSelectionTypes.Single}\n />\n </Stack>\n </Drawer>\n </Box>\n )\n}\n\nexport default DateAction\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport DeleteOutlinedIcon from '@mui/icons-material/DeleteOutlined'\n\nimport Avatar from '@mui/material/Avatar'\nimport Box from '@mui/material/Box'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemIcon from '@mui/material/ListItemIcon'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { Text } from '@kyper/mui'\n\nimport { Dialog, useEvent, useGlobalCopyStore, useTransactionStore } from '../../../../../common'\n\nimport type { Transaction } from '../../../../../common'\n\nimport { useTransactionsUiStore } from '../../../../context/hooks'\nimport { ON_CLICK_EVENTS } from '../../../../constants/OnClickEvents'\n\ninterface DeleteActionProps {\n transaction: Transaction\n}\n\nconst DeleteAction: React.FC<DeleteActionProps> = ({ transaction }) => {\n const { onEvent } = useEvent()\n const { removeTransaction } = useTransactionStore()\n const { setShouldDisableDrawerScroll } = useTransactionsUiStore()\n const { common: commonCopy, transactions: copy } = useGlobalCopyStore()\n\n const [open, setOpen] = React.useState(false)\n const handleDelete = async () => {\n await removeTransaction(transaction.guid)\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_DELETE_DELETED)\n }\n\n return (\n <Box className=\"mx-txn-delete\">\n {transaction && (\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton\n onClick={() => {\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_DELETE_CLICK)\n setShouldDisableDrawerScroll(true)\n setOpen(true)\n }}\n >\n <ListItemAvatar>\n <Avatar variant=\"rounded\">\n <DeleteOutlinedIcon color=\"secondary\" fontSize=\"small\" />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary={copy.manual_transaction_delete_title}\n secondary={copy.manual_transaction_delete_subtitle}\n />\n <ListItemIcon>\n <DeleteOutlinedIcon />\n </ListItemIcon>\n </ListItemButton>\n </ListItem>\n )}\n <Dialog\n copy={{ title: copy.manual_transaction_delete_title }}\n isOpen={open}\n onClose={() => {\n setShouldDisableDrawerScroll(false)\n setOpen(false)\n }}\n onPrimaryAction={handleDelete}\n onSecondaryAction={() => onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_DELETE_CANCEL)}\n primaryText={commonCopy.delete_button}\n secondaryText={commonCopy.cancel_button}\n >\n <Text sx={{ whiteSpace: 'normal' }} variant=\"Paragraph\">\n {copy.manual_transaction_delete_description}\n </Text>\n </Dialog>\n </Box>\n )\n}\n\nexport default observer(DeleteAction)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Avatar from '@mui/material/Avatar'\nimport Box from '@mui/material/Box'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemIcon from '@mui/material/ListItemIcon'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { Icon, IconWeight, Text } from '@kyper/mui'\n\nimport { ANALYTICS_EVENTS, Dialog, useGlobalCopyStore } from '../../../../../common'\n\nimport type { Transaction } from '../../../../../common'\n\nimport { useTransactionsUiStore } from '../../../../context/hooks'\nimport { useEvent, useTransactionStore } from '../../../../../common'\nimport { ON_CLICK_EVENTS } from '../../../../constants/OnClickEvents'\n\ninterface DeleteLogoActionProps {\n transaction: Transaction\n}\n\nconst DeleteLogoAction: React.FC<DeleteLogoActionProps> = ({ transaction }) => {\n const { onEvent } = useEvent()\n const { updateTransaction } = useTransactionStore()\n const { setShouldDisableDrawerScroll } = useTransactionsUiStore()\n const { common: commonCopy, transactions: copy } = useGlobalCopyStore()\n\n const [open, setOpen] = React.useState(false)\n\n const handleDeleteLogo = async () => {\n await updateTransaction({ ...transaction, merchant_guid: '' })\n onEvent(ANALYTICS_EVENTS.TRANSACTION_DETAILS_CLICK_DELETE_LOGO, {\n transaction_guid: transaction.guid,\n })\n }\n\n return (\n <Box className=\"mx-txn-delete-logo\">\n {transaction && (\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton\n onClick={() => {\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_DELETE_LOGO_CLICK)\n setOpen(true)\n }}\n >\n <ListItemAvatar>\n <Avatar sx={{ bgcolor: 'border.light' }} variant=\"rounded\">\n <Icon name=\"delete\" sx={{ color: 'text.primary' }} weight={IconWeight.Dark} />\n </Avatar>\n </ListItemAvatar>\n <ListItemText primary={copy.merchant_logo_title} secondary={copy.merchant_logo_desc} />\n <ListItemIcon>\n <Icon name=\"chevron_right\" weight={IconWeight.Dark} />\n </ListItemIcon>\n </ListItemButton>\n </ListItem>\n )}\n\n <Dialog\n copy={{ title: copy.merchant_logo_modal_title }}\n isOpen={open}\n onClose={() => {\n setShouldDisableDrawerScroll(false)\n setOpen(false)\n }}\n onPrimaryAction={handleDeleteLogo}\n onSecondaryAction={() => onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_DELETE_LOGO_CANCEL)}\n primaryText={commonCopy.delete_button}\n secondaryText={commonCopy.cancel_button}\n title={copy.merchant_logo_modal_title}\n >\n <Text sx={{ whiteSpace: 'normal' }} variant=\"Paragraph\">\n {copy.merchant_logo_modal_desc}\n </Text>\n <Text bold={true} sx={{ whiteSpace: 'normal' }} variant=\"Paragraph\">\n {` ${copy.merchant_logo_modal_desc_bold}`}\n </Text>\n </Dialog>\n </Box>\n )\n}\n\nexport default observer(DeleteLogoAction)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Avatar from '@mui/material/Avatar'\nimport Box from '@mui/material/Box'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemIcon from '@mui/material/ListItemIcon'\nimport ListItemText from '@mui/material/ListItemText'\nimport Switch from '@mui/material/Switch'\n\nimport { Icon, IconWeight, Text } from '@kyper/mui'\n\nimport { Dialog, useEvent, useGlobalCopyStore, useTransactionStore } from '../../../../../common'\n\nimport type { Transaction } from '../../../../../common'\n\nimport { useTransactionsUiStore } from '../../../../context/hooks'\nimport { ON_CLICK_EVENTS } from '../../../../constants/OnClickEvents'\n\ninterface HideActionProps {\n transaction: Transaction\n}\n\nconst HideAction: React.FC<HideActionProps> = ({ transaction }) => {\n const { onEvent } = useEvent()\n const { updateTransaction } = useTransactionStore()\n const { setShouldDisableDrawerScroll } = useTransactionsUiStore()\n const { common: commonCopy, transactions: copy } = useGlobalCopyStore()\n\n const [open, setOpen] = React.useState(false)\n\n const isHidden = transaction.is_hidden\n\n const toggleHide = async () => {\n await updateTransaction({ ...transaction, is_hidden: !transaction.is_hidden })\n onEvent(\n isHidden ? ON_CLICK_EVENTS.ON_TRANSACTION_UNHIDDEN : ON_CLICK_EVENTS.ON_TRANSACTION_HIDDEN,\n )\n }\n\n return (\n <Box className=\"mx-txn-hide-transaction\">\n {transaction && (\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton\n aria-checked={isHidden}\n onClick={() => {\n onEvent(\n isHidden\n ? ON_CLICK_EVENTS.ON_TRANSACTION_UNHIDE_CLICK\n : ON_CLICK_EVENTS.ON_TRANSACTION_HIDE_CLICK,\n )\n onEvent(\n isHidden\n ? 'transaction_details_click_unhide_transaction'\n : 'transaction_details_click_hide_transaction',\n {\n transaction_guid: transaction.guid,\n },\n )\n setOpen(true)\n }}\n role=\"switch\"\n >\n <ListItemAvatar>\n <Avatar sx={{ bgcolor: 'border.light' }} variant=\"rounded\">\n {isHidden ? (\n <Icon\n name=\"visibilityOff\"\n sx={{ color: 'text.primary' }}\n weight={IconWeight.Dark}\n />\n ) : (\n <Icon name=\"visibility\" sx={{ color: 'text.primary' }} weight={IconWeight.Dark} />\n )}\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary={\n isHidden ? copy.hide_trnx_subtitle_unhide_trnx : copy.hide_trnx_subtitle_hide_trnx\n }\n secondary={isHidden ? copy.hide_trnx_desc_unhiding : copy.hide_trnx_desc_hiding}\n />\n <ListItemIcon>\n <Switch\n checked={isHidden}\n id=\"hide-transaction\"\n name=\"hide-transaction\"\n tabIndex={-1}\n />\n </ListItemIcon>\n </ListItemButton>\n </ListItem>\n )}\n\n <Dialog\n copy={{\n title: isHidden ? copy.hide_trnx_subtitle_unhide_trnx : copy.hide_trnx_subtitle_hide_trnx,\n }}\n isOpen={open}\n onClose={() => {\n setShouldDisableDrawerScroll(false)\n setOpen(false)\n }}\n onPrimaryAction={toggleHide}\n onSecondaryAction={() =>\n onEvent(\n isHidden\n ? ON_CLICK_EVENTS.ON_TRANSACTION_UNHIDE_CANCEL_CLICK\n : ON_CLICK_EVENTS.ON_TRANSACTION_HIDE_CANCEL_CLICK,\n )\n }\n primaryText={isHidden ? commonCopy.unhide_button : commonCopy.hide_button}\n secondaryText={commonCopy.cancel_button}\n >\n <Text truncate={false} variant=\"Paragraph\">\n {isHidden ? copy.hide_trnx_desc_unhiding : copy.hide_trnx_desc_hiding}\n </Text>\n </Dialog>\n </Box>\n )\n}\n\nexport default observer(HideAction)\n","import React from 'react'\n\nimport Stack from '@mui/material/Stack'\n\nimport { H1, MerchantLogo, Text } from '@kyper/mui'\n\nimport { formatCurrency } from '../../../../common'\n\nimport type { Transaction } from '../../../../common'\n\ninterface TransactionAmountHeaderProps {\n transaction: Transaction\n}\n\nconst TransactionAmountHeader: React.FC<TransactionAmountHeaderProps> = ({ transaction }) => {\n const { amount, description, isIncome, merchant_guid, payee, top_level_category_guid } =\n transaction\n\n return (\n <Stack className=\"mx-txn-amount-header\" direction=\"row\" gap={12} px={16} py={24}>\n <MerchantLogo\n categoryGuid={top_level_category_guid || ''}\n merchantGuid={merchant_guid || ''}\n size={64}\n />\n <Stack overflow=\"hidden'\">\n <Text bold={true} mb={4} truncate={true} variant=\"Body\">\n {description || payee}\n </Text>\n <H1 color={isIncome ? 'success.main' : 'text.primary'} truncate={true}>\n {isIncome ? '+' : ''}\n {formatCurrency(amount, '0,0.00')}\n </H1>\n </Stack>\n </Stack>\n )\n}\n\nexport default TransactionAmountHeader\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Avatar from '@mui/material/Avatar'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemIcon from '@mui/material/ListItemIcon'\nimport ListItemText from '@mui/material/ListItemText'\nimport TextField from '@mui/material/TextField'\n\nimport { Icon, IconWeight, Text } from '@kyper/mui'\n\nimport { ANALYTICS_EVENTS, Drawer, useGlobalCopyStore } from '../../../../../common'\n\nimport type { Transaction } from '../../../../../common'\n\nimport { useTransactionsUiStore } from '../../../../context/hooks'\nimport { useEvent, useTransactionStore } from '../../../../../common'\nimport { ON_CLICK_EVENTS } from '../../../../constants/OnClickEvents'\n\nimport TransactionAmountHeader from '../TransactionAmountHeader'\n\ninterface MemoActionProps {\n transaction: Transaction\n}\n\nconst MemoAction: React.FC<MemoActionProps> = ({ transaction }) => {\n const { onEvent } = useEvent()\n const { updateTransaction } = useTransactionStore()\n const { updateManualTransaction } = useTransactionsUiStore()\n const { common: commonCopy, transactions: copy } = useGlobalCopyStore()\n\n const [open, setOpen] = React.useState(false)\n const [memoText, setMemoText] = React.useState('')\n\n React.useEffect(() => {\n if (open) {\n setMemoText(transaction.memo ? transaction.memo : '')\n }\n }, [open])\n\n const handleSave = async () => {\n if (transaction.is_manual && !transaction.guid) {\n updateManualTransaction({ ...transaction, memo: memoText })\n setOpen(false)\n return\n }\n\n await updateTransaction({ ...transaction, memo: memoText })\n onEvent(ANALYTICS_EVENTS.TRANSACTION_DETAILS_CLICK_MEMO, { transaction_guid: transaction.guid })\n setOpen(false)\n }\n\n return (\n <div className=\"mx-txn-memo-action\">\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton\n onClick={() => {\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_MEMO_CLICK)\n setOpen(true)\n }}\n >\n <ListItemAvatar>\n <Avatar sx={{ bgcolor: 'border.light' }} variant=\"rounded\">\n <Icon name=\"article\" sx={{ color: 'text.primary' }} weight={IconWeight.Dark} />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary={copy.memo_title}\n primaryTypographyProps={{ variant: 'XSmall' }}\n secondary={\n <Text\n bold={true}\n sx={{ overflowWrap: 'break-word', whiteSpace: 'wrap' }}\n variant=\"Body\"\n >\n {transaction.memo ? transaction.memo : copy.memo_desc}\n </Text>\n }\n />\n <ListItemIcon>\n <Icon name=\"chevron_right\" weight={IconWeight.Dark} />\n </ListItemIcon>\n </ListItemButton>\n </ListItem>\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={open}\n onClose={() => setOpen(false)}\n onPrimaryAction={handleSave}\n title={copy.memo_title}\n >\n <TransactionAmountHeader transaction={transaction} />\n <TextField\n aria-label={copy.memo_desc_aria}\n focused={true}\n multiline={true}\n name=\"memo\"\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setMemoText(e.target.value)}\n placeholder={copy.memo_desc}\n rows={4}\n sx={{ px: 16 }}\n value={memoText}\n />\n </Drawer>\n </div>\n )\n}\n\nexport default observer(MemoAction)\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 Grid from '@mui/material/Grid'\nimport IconButton from '@mui/material/IconButton'\nimport Stack from '@mui/material/Stack'\n\nimport CancelIcon from '@mui/icons-material/Cancel'\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight'\nimport DeleteOutlinedIcon from '@mui/icons-material/DeleteOutlined'\n\nimport { CategoryIcon, Text, useTokens } from '@kyper/mui'\n\nimport { CategorySelectorDrawer } from '../../../categories'\n\nimport { CurrencyInput, formatCurrency, useGlobalCopyStore } from '../../../common'\n\nimport type { Transaction } from '../../../common'\n\nimport { useEvent } from '../../../common'\nimport { ON_CLICK_EVENTS } from '../../constants/OnClickEvents'\n\ninterface SplitRowProps {\n index: number\n onCategoryChanged: (index: number, categoryGuid: string) => void\n onDeleteRow: (index: number) => void\n onUpdateAmount: (index: number, amount: number) => void\n split: Transaction\n}\n\nconst SplitRow: React.FC<SplitRowProps> = ({\n index,\n onDeleteRow,\n onCategoryChanged,\n onUpdateAmount,\n split,\n}) => {\n const tokens = useTokens()\n\n const { onEvent } = useEvent()\n const { transactions: copy } = useGlobalCopyStore()\n\n const [amount, setAmount] = React.useState(`${split.amount}`)\n const [categorySelectorOpen, setCategorySelectorOpen] = React.useState(false)\n\n const isTopRow = index === 0\n\n const handleChangeAmount = (value: string) => {\n if (!isNaN(Number(value))) {\n setAmount(value)\n onUpdateAmount(index, Number(value))\n }\n }\n\n return (\n <Box\n bgcolor=\"background.paper\"\n className=\"mx-txn-split-manager-row\"\n pb={tokens.Spacing.Tiny}\n px={tokens.Spacing.XSmall}\n >\n <Grid alignItems={isTopRow ? 'center' : 'start'} container={true}>\n <Grid item={true} xs={7}>\n <Stack alignItems=\"start\">\n <Button\n endIcon={<ChevronRightIcon />}\n onClick={() => setCategorySelectorOpen(true)}\n startIcon={<CategoryIcon categoryGuid={split.top_level_category_guid} />}\n sx={{ px: tokens.Spacing.Small, py: tokens.Spacing.XSmall }}\n >\n {split.category}\n </Button>\n <Box>\n {!split.category_guid && (\n <Stack\n color=\"error.main\"\n direction=\"row\"\n gap={tokens.Spacing.XSmall}\n p={tokens.Spacing.Small}\n >\n <CancelIcon sx={{ fontSize: tokens.FontSize.Body }} />\n <Text variant=\"Small\">{copy.split_transaction_errors_select_category}</Text>\n </Stack>\n )}\n </Box>\n </Stack>\n </Grid>\n <Grid item={true} xs={5}>\n {isTopRow ? (\n <div className=\"mx-txn-split-manager-row-top-container\">\n <Text>{formatCurrency(split.amount, '0,0.00')}</Text>\n </div>\n ) : (\n <Stack alignItems=\"start\">\n <Stack alignItems=\"start\" direction=\"row\" gap={tokens.Spacing.XSmall}>\n <CurrencyInput\n amount={amount}\n aria-label={copy.split_transaction_edit_split_amount}\n name=\"split-amount-input\"\n setAmount={handleChangeAmount}\n sx={{\n '.MuiOutlinedInput-input': { p: tokens.Spacing.Small },\n }}\n />\n <IconButton\n aria-label={copy.split_transaction_delete_split_btn}\n color=\"secondary\"\n onClick={() => {\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_SPLIT_DELETE_CLICK)\n onDeleteRow(index)\n }}\n sx={{ w: 44, h: 44 }}\n >\n <DeleteOutlinedIcon />\n </IconButton>\n </Stack>\n {!amount && (\n <Stack\n color=\"error.main\"\n direction=\"row\"\n gap={tokens.Spacing.XSmall}\n py={tokens.Spacing.Small}\n >\n <CancelIcon sx={{ fontSize: tokens.FontSize.Body }} />\n <Text variant=\"Small\">{copy.split_transaction_errors_enter_an_amount}</Text>\n </Stack>\n )}\n </Stack>\n )}\n </Grid>\n </Grid>\n\n <CategorySelectorDrawer\n initialSelected={split.category_guid}\n onClose={() => setCategorySelectorOpen(false)}\n onSelect={(guid: string) => {\n onCategoryChanged(index, guid)\n setCategorySelectorOpen(false)\n }}\n showDrawer={categorySelectorOpen}\n title={copy.actions_select_a_category}\n />\n </Box>\n )\n}\n\nexport default observer(SplitRow)\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 CancelIcon from '@mui/icons-material/Cancel'\nimport Stack from '@mui/material/Stack'\n\nimport { Text, useTokens } from '@kyper/mui'\n\nimport { buildDynamicCopy, formatCurrency } from '../../../common'\nimport type { Transaction } from '../../../common'\n\nimport SplitRow from './SplitRow'\n\nimport { useEvent, useGlobalCopyStore } from '../../../common'\nimport { ON_CLICK_EVENTS } from '../../constants/OnClickEvents'\n\ninterface SplitManagerProps {\n onAddSplit: () => void\n onCategoryChanged: (index: number, categoryGuid: string) => void\n onDeleteSplit: (index: number) => void\n onUpdateAmount: (index: number, amount: number) => void\n splits: Transaction[]\n transaction: Transaction\n}\n\nconst SplitManager: React.FC<SplitManagerProps> = ({\n onAddSplit,\n onCategoryChanged,\n onDeleteSplit,\n onUpdateAmount,\n splits,\n transaction,\n}) => {\n const tokens = useTokens()\n\n const { transactions: copy } = useGlobalCopyStore()\n const { onEvent } = useEvent()\n\n const [error, setError] = React.useState('')\n\n React.useEffect(() => {\n setError(splits.length <= 1 ? copy.split_transaction_errors_min_splits : '')\n setError(\n splits[0].amount < 0\n ? (buildDynamicCopy(\n copy.split_transaction_errors_totals_must_equal_amount,\n formatCurrency(transaction.amount, '0,0.00'),\n ) as string)\n : '',\n )\n }, [splits])\n\n return (\n <Box className=\"mx-txn-split-manager\">\n {splits.map((split, index) => (\n <SplitRow\n index={index}\n key={index}\n onCategoryChanged={onCategoryChanged}\n onDeleteRow={onDeleteSplit}\n onUpdateAmount={onUpdateAmount}\n split={split}\n />\n ))}\n {error && (\n <Stack\n color=\"error.main\"\n direction=\"row\"\n gap={tokens.Spacing.XSmall}\n p={tokens.Spacing.Medium}\n >\n <CancelIcon sx={{ fontSize: tokens.FontSize.Body }} />\n <Text variant=\"Small\">{error}</Text>\n </Stack>\n )}\n <Box p={tokens.Spacing.Medium}>\n <Button\n aria-label={copy.split_transaction_add_split_btn}\n onClick={() => {\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_SPLIT_ADD_CLICK)\n onAddSplit()\n }}\n >\n {copy.split_transaction_add_split_btn}\n </Button>\n </Box>\n </Box>\n )\n}\n\nexport default observer(SplitManager)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Avatar from '@mui/material/Avatar'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemIcon from '@mui/material/ListItemIcon'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { Icon, IconWeight, Text } from '@kyper/mui'\n\nimport {\n buildDynamicCopy,\n Dialog,\n Drawer,\n useCategoryStore,\n useGlobalCopyStore,\n useEvent,\n useTransactionStore,\n ANALYTICS_EVENTS,\n} from '../../../../../common'\n\nimport type { Transaction } from '../../../../../common'\n\nimport { useTransactionsUiStore } from '../../../../context/hooks'\nimport { ON_CLICK_EVENTS } from '../../../../constants/OnClickEvents'\n\nimport { SplitManager } from '../../../splitmanager'\n\nimport TransactionAmountHeader from '../TransactionAmountHeader'\n\ninterface SplitActionProps {\n transaction: Transaction\n}\n\nconst SplitAction: React.FC<SplitActionProps> = ({ transaction }) => {\n const { onEvent } = useEvent()\n const { splitTransaction, unSplitTransaction } = useTransactionStore()\n const { common: commonCopy, transactions: copy } = useGlobalCopyStore()\n const { setShouldDisableDrawerScroll } = useTransactionsUiStore()\n const { categories } = useCategoryStore()\n\n const INITIAL_SPLIT = {\n ...transaction,\n amount: transaction.amount - 1,\n guid: '',\n has_been_split: false,\n parent_guid: transaction.guid,\n }\n\n const EMPTY_SPLIT = {\n ...transaction,\n amount: 1,\n category_guid: undefined,\n category: copy.split_transaction_select_category_btn,\n guid: '',\n has_been_split: false,\n parent_guid: transaction.guid,\n top_level_category_guid: undefined,\n }\n\n const [isSplitDrawerOpen, setIsSplitDrawerOpen] = React.useState(false)\n const [isDeleteSplitOpen, setIsDeleteSplitOpen] = React.useState(false)\n const [splits, setSplits] = React.useState<Transaction[]>([])\n\n const handleAddSplit = () => {\n const updatedSplits = [...splits]\n\n updatedSplits.push({ ...EMPTY_SPLIT })\n updatedSplits[0].amount -= 1\n setSplits(updatedSplits)\n }\n\n const handleDeleteSplit = (index: number) => {\n if (index > 0) {\n const row = splits[index]\n const updatedSplits = [...splits]\n\n updatedSplits.splice(index, 1)\n updatedSplits[0].amount += row.amount\n setSplits(updatedSplits)\n }\n }\n\n const handleUpdateAmount = (index: number, amount: number) => {\n const updatedSplits = [...splits]\n\n updatedSplits[index].amount = amount\n updatedSplits[0].amount =\n transaction.amount -\n updatedSplits.reduce(\n (sum: number, split: Transaction, index) => sum + (index !== 0 ? split.amount : 0),\n 0,\n )\n setSplits(updatedSplits)\n }\n\n const handleCategoryChanged = (index: number, categoryGuid: string) => {\n const updatedSplits = [...splits]\n const category = categories.find((item) => item.guid === categoryGuid)\n if (category) {\n updatedSplits[index] = {\n ...updatedSplits[index],\n category_guid: categoryGuid,\n category: category.name,\n top_level_category_guid: category.parent_guid || categoryGuid,\n }\n setSplits(updatedSplits)\n }\n }\n\n const handleClick = () => {\n if (transaction.parent_guid || transaction.has_been_split) {\n setIsDeleteSplitOpen(true)\n return\n }\n\n setSplits([{ ...INITIAL_SPLIT }, { ...EMPTY_SPLIT }])\n\n onEvent(ANALYTICS_EVENTS.TRANSACTION_DETAILS_CLICK_SPLIT, {\n transaction_guid: transaction.guid,\n })\n setIsSplitDrawerOpen(true)\n }\n\n const handleSave = async () => {\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_SPLIT_SAVE_CLICK)\n await splitTransaction({ ...transaction, has_been_split: true }, splits)\n\n setIsSplitDrawerOpen(false)\n }\n\n const handleCancel = async () => {\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_SPLIT_CANCEL_CLICK)\n setSplits([{ ...INITIAL_SPLIT }, { ...EMPTY_SPLIT }])\n setIsSplitDrawerOpen(false)\n }\n\n const handleUnSplit = async () => {\n onEvent(ANALYTICS_EVENTS.TRANSACTION_DETAILS_CLICK_UNSPLIT, {\n transaction_guid: transaction.guid,\n })\n const guid = transaction.parent_guid ?? transaction.guid\n await unSplitTransaction(guid)\n }\n\n const hasError = React.useMemo(() => {\n const hasCategoryError = splits.some((split) => !split.category_guid)\n const hasAmountError = splits.some((split) => split.amount <= 0)\n\n return hasCategoryError || hasAmountError\n }, [splits])\n\n return (\n <React.Fragment>\n {transaction && (\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton onClick={handleClick}>\n <ListItemAvatar>\n <Avatar sx={{ bgcolor: 'border.light' }} variant=\"rounded\">\n <Icon name=\"call_split\" sx={{ color: 'text.primary' }} weight={IconWeight.Dark} />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary={\n transaction.has_been_split || transaction.parent_guid\n ? copy.split_transaction_unsplit_title\n : copy.split_transaction_title\n }\n secondary={\n transaction.has_been_split || transaction.parent_guid\n ? copy.split_transaction_unsplit_subtitle\n : copy.split_transaction_desc\n }\n />\n <ListItemIcon>\n {transaction.has_been_split || transaction.parent_guid ? (\n <Icon name=\"delete\" weight={IconWeight.Dark} />\n ) : (\n <Icon name=\"chevron_right\" weight={IconWeight.Dark} />\n )}\n </ListItemIcon>\n </ListItemButton>\n </ListItem>\n )}\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isSplitDrawerOpen}\n isPrimaryDisabled={hasError}\n onClose={handleCancel}\n onPrimaryAction={handleSave}\n primaryText={commonCopy.save_button}\n secondaryText={commonCopy.cancel_button}\n title={copy.split_transaction_title}\n >\n <TransactionAmountHeader transaction={transaction} />\n <SplitManager\n onAddSplit={handleAddSplit}\n onCategoryChanged={handleCategoryChanged}\n onDeleteSplit={handleDeleteSplit}\n onUpdateAmount={handleUpdateAmount}\n splits={splits}\n transaction={transaction}\n />\n </Drawer>\n <Dialog\n copy={{ title: copy.split_transaction_unsplit_title }}\n isOpen={isDeleteSplitOpen}\n onClose={() => {\n setShouldDisableDrawerScroll(false)\n setIsDeleteSplitOpen(false)\n }}\n onPrimaryAction={handleUnSplit}\n onSecondaryAction={() => {\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_UNSPLIT_CANCEL)\n }}\n primaryText={commonCopy.delete_button}\n secondaryText={commonCopy.cancel_button}\n >\n <Text variant=\"Paragraph\">\n {\n buildDynamicCopy(\n copy.split_transaction_unsplit_description,\n transaction.description,\n ) as string\n }\n </Text>\n </Dialog>\n </React.Fragment>\n )\n}\n\nexport default observer(SplitAction)\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 useTheme from '@mui/material/styles/useTheme'\n\nimport { P, Text, TextField } from '@kyper/mui'\n\nimport { Dialog, useGlobalCopyStore } from '../../../common'\n\nimport { useEvent, useTransactionStore } from '../../../common'\nimport { ON_CLICK_EVENTS } from '../../constants/OnClickEvents'\n\nconst Header = () => {\n const theme = useTheme()\n\n const { onEvent } = useEvent()\n const { addTag } = useTransactionStore()\n const { transactions: copy } = useGlobalCopyStore()\n\n const [isAdding, setIsAdding] = React.useState(false)\n const [tagName, setTagName] = React.useState('')\n const [tagNameError, setTagNameError] = React.useState('')\n\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n if (isAdding) {\n inputRef?.current?.focus()\n }\n }, [isAdding])\n\n const handleAdding = () => {\n onEvent(\n isAdding\n ? ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_TAG_ADD_CANCEL_CLICK\n : ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_TAG_ADD_CLICK,\n )\n if (!isAdding) {\n setTagName('')\n }\n setIsAdding(!isAdding)\n }\n\n const handleAddTag = async () => {\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_TAG_ADDED)\n await addTag(tagName)\n setIsAdding(false)\n }\n\n React.useEffect(() => {\n setTagNameError(tagName.length > 40 ? copy.tags_error_name_must_be_40_chars : '')\n }, [tagName])\n\n return (\n <Box className=\"mx-txn-tag-manager-header\">\n <Stack\n alignItems=\"center\"\n bgcolor={theme.palette.background.default}\n direction=\"row\"\n justifyContent=\"space-between\"\n px={24}\n py={16}\n >\n <Text bold={true}>{copy.tags_your_tags}</Text>\n <Button\n aria-expanded={isAdding}\n aria-label={copy.tags_add_tag_btn_aria}\n onClick={handleAdding}\n >\n {copy.tags_add_tag_btn}\n </Button>\n </Stack>\n\n <Dialog\n copy={{ title: copy.tags_add_tag_btn }}\n isOpen={isAdding}\n onClose={() => setIsAdding(false)}\n onPrimaryAction={handleAddTag}\n onSecondaryAction={() => setIsAdding(false)}\n >\n <TextField\n aria-label={copy.tags_placeholder}\n name=\"add-tag\"\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setTagName(e.target.value)}\n placeholder={copy.tags_placeholder}\n sx={{ width: '100%' }}\n value={tagName}\n />\n <P id=\"add-tag-error\" sx={{ color: 'error.main' }} variant=\"ParagraphSmall\">\n {tagNameError}\n </P>\n </Dialog>\n </Box>\n )\n}\n\nexport default observer(Header)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport HighlightOffIcon from '@mui/icons-material/HighlightOff'\nimport SearchIcon from '@mui/icons-material/Search'\n\nimport Box from '@mui/material/Box'\nimport IconButton from '@mui/material/IconButton'\nimport InputAdornment from '@mui/material/InputAdornment'\n\nimport { TextField, useTokens } from '@kyper/mui'\n\nimport { useGlobalCopyStore } from '../../../common'\n\ninterface SearchBoxProps {\n onSearchValueChanged: (value: string) => void\n searchValue: string\n}\n\nconst SearchBox: React.FC<SearchBoxProps> = ({ onSearchValueChanged, searchValue }) => {\n const { common: commonCopy, transactions: copy } = useGlobalCopyStore()\n const tokens = useTokens()\n\n const cancelButton = (\n <IconButton\n aria-label={copy.tags_cancel_search || 'Search'}\n onClick={() => onSearchValueChanged('')}\n >\n <HighlightOffIcon />\n </IconButton>\n )\n\n return (\n <Box className=\"mx-txn-tag-manager-search\" px={tokens.Spacing.Large} py={tokens.Spacing.Medium}>\n <TextField\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon color=\"disabled\" />\n </InputAdornment>\n ),\n endAdornment: (\n <InputAdornment position=\"end\" sx={{ padding: 0 }}>\n {searchValue ? cancelButton : null}\n </InputAdornment>\n ),\n }}\n aria-label={commonCopy.search_aria}\n name=\"search\"\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => onSearchValueChanged(e.target.value)}\n placeholder={commonCopy.search_placeholder}\n // TODO: Theme needs to have the background color defaulted to paper for TextField\n sx={{ bgcolor: 'background.paper', width: '100%' }}\n value={searchValue}\n />\n </Box>\n )\n}\n\nexport default observer(SearchBox)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport DeleteOutlinedIcon from '@mui/icons-material/DeleteOutlined'\nimport EditIcon from '@mui/icons-material/Edit'\n\nimport Checkbox from '@mui/material/Checkbox'\nimport IconButton from '@mui/material/IconButton'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemIcon from '@mui/material/ListItemIcon'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { P, Text, TextField } from '@kyper/mui'\n\nimport { Dialog, useGlobalCopyStore } from '../../../common'\n\nimport type { Tag } from '../../../common'\n\nimport { useEvent, useTransactionStore } from '../../../common'\nimport { ON_CLICK_EVENTS } from '../../constants/OnClickEvents'\n\ninterface TagRowProps {\n tag: Tag\n selectedTags: string[]\n onTagChecked: (guid: string) => void\n}\n\nconst TagRow: React.FC<TagRowProps> = ({ onTagChecked, selectedTags, tag }) => {\n const { onEvent } = useEvent()\n const { removeTag, updateTag } = useTransactionStore()\n const { common: commonCopy, transactions: copy } = useGlobalCopyStore()\n\n const [editOpen, setEditOpen] = React.useState(false)\n const [deleteOpen, setDeleteOpen] = React.useState(false)\n\n const [tagName, setTagName] = React.useState('')\n const [tagNameError, setTagNameError] = React.useState('')\n\n const handleSaveTag = async () => {\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_TAG_EDIT_SAVED)\n if (tag) {\n await updateTag({ ...tag, name: tagName })\n }\n setEditOpen(false)\n }\n\n const handleDeleteTag = async () => {\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_TAG_DELETED)\n await removeTag(tag.guid)\n setDeleteOpen(false)\n }\n\n React.useEffect(() => {\n setTagNameError(tagName.length > 40 ? copy.tags_error_name_must_be_40_chars : '')\n }, [tagName])\n\n const handleEditClick = () => {\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_TAG_EDIT_CLICK)\n setTagName(tag.name)\n setEditOpen(true)\n }\n\n const handleDeleteClick = () => {\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_TAG_DELETE_CLICK)\n setDeleteOpen(true)\n }\n\n return (\n <ListItem\n className=\"mx-txn-transaction-manager-row\"\n disableGutters={true}\n disablePadding={true}\n secondaryAction={\n !tag.is_default_tag && (\n <Stack direction=\"row\">\n <IconButton\n aria-label={`Edit ${tag.name} tag`}\n color=\"secondary\"\n onClick={handleEditClick}\n >\n <EditIcon color=\"secondary\" />\n </IconButton>\n <IconButton\n aria-label={`Delete ${tag.name} tag`}\n color=\"secondary\"\n onClick={handleDeleteClick}\n >\n <DeleteOutlinedIcon color=\"secondary\" />\n </IconButton>\n </Stack>\n )\n }\n >\n <ListItemButton\n aria-checked={selectedTags.includes(tag.guid)}\n onClick={() => onTagChecked(tag.guid)}\n role=\"checkbox\"\n >\n <ListItemIcon sx={{ ml: 0 }}>\n <Checkbox checked={selectedTags.includes(tag.guid)} edge=\"start\" tabIndex={-1} />\n </ListItemIcon>\n <ListItemText>{tag.name}</ListItemText>\n </ListItemButton>\n\n <Dialog\n copy={{ title: 'Update tag name' }} // TODO: Need copy\n isOpen={editOpen}\n onClose={() => setEditOpen(false)}\n onPrimaryAction={handleSaveTag}\n onSecondaryAction={() => setEditOpen(false)}\n >\n <TextField\n aria-describedby={tagNameError ? 'update-tag-error' : undefined}\n aria-label={copy.tags_update_the_tag_name}\n name=\"update-tag\"\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setTagName(e.target.value)}\n placeholder=\"Tag name\" // TODO: Need copy\n sx={{ width: '100%' }}\n value={tagName}\n />\n <P id=\"update-tag-error\" sx={{ color: 'error.main' }} variant=\"ParagraphSmall\">\n {tagNameError}\n </P>\n </Dialog>\n\n <Dialog\n copy={{ title: copy.tags_delete_title }}\n isOpen={deleteOpen}\n onClose={() => setDeleteOpen(false)}\n onPrimaryAction={handleDeleteTag}\n onSecondaryAction={() =>\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_TAG_DELETE_CANCEL_CLICK)\n }\n primaryText={commonCopy.delete_button}\n secondaryText={commonCopy.cancel_button}\n >\n <Text truncate={false}>{copy.tags_deleting_this_tag_will_remove_it}</Text>\n </Dialog>\n </ListItem>\n )\n}\n\nexport default observer(TagRow)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport Paper from '@mui/material/Paper'\n\nimport { useTransactionStore } from '../../../common'\n\nimport Header from './Header'\nimport SearchBox from './SearchBox'\nimport TagRow from './TagRow'\n\ninterface TagManagerProps {\n selectedTags: string[]\n onTagChecked: (guid: string) => void\n}\n\nconst TagManager: React.FC<TagManagerProps> = ({ selectedTags, onTagChecked }) => {\n const { tags } = useTransactionStore()\n\n const [searchValue, setSearchValue] = React.useState('')\n\n const filteredTags = tags.filter((tag) =>\n tag.name.toLowerCase().includes(searchValue.toLowerCase()),\n )\n\n return (\n <div className=\"mx-txn-tag-manager\">\n <SearchBox\n onSearchValueChanged={(value) => setSearchValue(value)}\n searchValue={searchValue}\n />\n\n <Header />\n\n <Paper sx={{ boxShadow: 'none' }}>\n <List>\n {filteredTags.map((tag) => (\n <React.Fragment key={tag.guid}>\n <TagRow onTagChecked={onTagChecked} selectedTags={selectedTags} tag={tag} />\n <Divider sx={{ ml: 24 }} />\n </React.Fragment>\n ))}\n </List>\n </Paper>\n </div>\n )\n}\n\nexport default observer(TagManager)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Avatar from '@mui/material/Avatar'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemIcon from '@mui/material/ListItemIcon'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { Icon, IconWeight, Text } from '@kyper/mui'\n\nimport { ANALYTICS_EVENTS, Drawer, useGlobalCopyStore } from '../../../../../common'\n\nimport type { Transaction } from '../../../../../common'\n\nimport { TagManager } from '../../../tagmanager'\nimport { useTransactionsUiStore } from '../../../../context/hooks'\nimport { useEvent, useTransactionStore } from '../../../../../common'\nimport { ON_CLICK_EVENTS } from '../../../../constants/OnClickEvents'\n\ninterface TagsActionProps {\n transaction: Transaction\n}\n\nconst TagsAction: React.FC<TagsActionProps> = ({ transaction }) => {\n const { onEvent } = useEvent()\n const { tags, updateTaggings, updateTransaction } = useTransactionStore()\n const { common: commonCopy, transactions: copy } = useGlobalCopyStore()\n const { updateManualTransaction } = useTransactionsUiStore()\n\n const [open, setOpen] = React.useState(false)\n const [selectedTags, setSelectedTags] = React.useState<string[]>(transaction.tags)\n\n React.useEffect(() => {\n setSelectedTags(transaction.tags)\n }, [open, transaction])\n\n const handleTagChecked = (guid: string) => {\n const tags = [...selectedTags]\n\n const index = selectedTags.indexOf(guid)\n if (index >= 0) {\n tags.splice(index, 1)\n } else {\n tags.push(guid)\n }\n setSelectedTags(tags)\n }\n\n const handleSave = async () => {\n if (transaction.is_manual && !transaction.guid) {\n updateManualTransaction({ ...transaction, tags: selectedTags })\n setOpen(false)\n return\n }\n\n await updateTaggings(selectedTags, transaction.guid)\n await updateTransaction({ ...transaction })\n onEvent(ANALYTICS_EVENTS.TRANSACTION_DETAILS_CLICK_TAGS, { transaction_guid: transaction.guid })\n setOpen(false)\n }\n\n const tagNames = React.useMemo(\n () =>\n transaction.tags.map(\n (tagGuid, index, selectedTags) =>\n `${tags.find((item) => item.guid === tagGuid)?.name}${\n index < selectedTags.length - 1 ? ' / ' : ''\n }`,\n ),\n [tags, transaction],\n )\n\n return (\n <React.Fragment>\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton\n onClick={() => {\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_TAGS_CLICK)\n setOpen(true)\n }}\n >\n <ListItemAvatar>\n <Avatar sx={{ bgcolor: 'border.light' }} variant=\"rounded\">\n <Icon name=\"local_offer\" sx={{ color: 'text.primary' }} weight={IconWeight.Dark} />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary={copy.tags_title}\n primaryTypographyProps={{ variant: 'XSmall' }}\n secondary={\n <Text bold={true} variant=\"Body\">\n {transaction.tags?.length > 0 ? tagNames : copy.tags_desc}\n </Text>\n }\n />\n <ListItemIcon>\n <Icon name=\"chevron_right\" weight={IconWeight.Dark} />\n </ListItemIcon>\n </ListItemButton>\n </ListItem>\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={open}\n onClose={() => setOpen(false)}\n onPrimaryAction={handleSave}\n primaryText={commonCopy.save_button}\n secondaryText={commonCopy.cancel_button}\n title={copy.tags_title}\n >\n <TagManager onTagChecked={handleTagChecked} selectedTags={selectedTags} />\n </Drawer>\n </React.Fragment>\n )\n}\n\nexport default observer(TagsAction)\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 FormGroup from '@mui/material/FormGroup'\nimport IconButton from '@mui/material/IconButton'\nimport Stack from '@mui/material/Stack'\nimport TextField from '@mui/material/TextField'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport type { Transaction } from '../../../../common'\n\nimport {\n ANALYTICS_EVENTS,\n useEvent,\n useGlobalCopyStore,\n useTransactionStore,\n} from '../../../../common'\nimport { ON_CLICK_EVENTS } from '../../../constants/OnClickEvents'\n\ninterface DescriptionProps {\n transaction: Transaction\n}\n\nconst Description: React.FC<DescriptionProps> = ({ transaction }) => {\n const { updateTransaction } = useTransactionStore()\n const { common: commonCopy, transactions: copy } = useGlobalCopyStore()\n const { onEvent } = useEvent()\n\n const [isEditing, setIsEditing] = React.useState(false)\n const [description, setDescription] = React.useState('')\n\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n if (isEditing) {\n setDescription(transaction.description)\n inputRef?.current?.focus()\n }\n }, [isEditing])\n\n const handleSave = async () => {\n onEvent(ANALYTICS_EVENTS.TRANSACTION_DETAILS_CLICK_DESCRIPTION, {\n transaction_guid: transaction.guid,\n })\n await updateTransaction({ ...transaction, description })\n setIsEditing(false)\n }\n\n return (\n <Box className=\"mx-txn-transaction-description\">\n {isEditing ? (\n <FormGroup row={true}>\n <TextField\n aria-label={copy.description_add_a_subcategory}\n name=\"add-subcategory\"\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setDescription(e.target.value)}\n ref={inputRef}\n sx={{\n backgroundColor: 'background.paper',\n '.MuiOutlinedInput-root': { borderTopRightRadius: 0, borderBottomRightRadius: 0 },\n '.MuiOutlinedInput-input': { p: 11 },\n width: 250,\n }}\n value={description}\n />\n <Button\n disabled={!description}\n onClick={handleSave}\n sx={{ borderTopLeftRadius: 0, borderBottomLeftRadius: 0 }}\n variant=\"outlined\"\n >\n {commonCopy.save_button}\n </Button>\n </FormGroup>\n ) : (\n <Stack alignItems=\"center\" direction=\"row\" gap={4}>\n <Text bold={true}>{transaction.description}</Text>\n <IconButton\n aria-label={copy.description_edit_transaction_name}\n onClick={() => {\n setIsEditing(true)\n onEvent(ON_CLICK_EVENTS.ON_TRANSACTION_DESCRIPTION_EDIT_CLICK)\n }}\n sx={{ color: 'action.active' }}\n >\n <Icon name=\"create\" size={22} />\n </IconButton>\n </Stack>\n )}\n </Box>\n )\n}\n\nexport default observer(Description)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport FlagOutlinedIcon from '@mui/icons-material/FlagOutlined'\nimport ToggleButton from '@mui/material/ToggleButton'\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport type { Transaction } from '../../../../common'\n\nimport {\n ANALYTICS_EVENTS,\n useEvent,\n useGlobalCopyStore,\n useTransactionStore,\n} from '../../../../common'\n\ninterface FlagTransactionProps {\n transaction: Transaction\n}\n\nconst FlagTransaction: React.FC<FlagTransactionProps> = ({ transaction }) => {\n const { updateTransaction } = useTransactionStore()\n const { transactions: copy } = useGlobalCopyStore()\n const { onEvent } = useEvent()\n const theme = useTheme()\n\n const handleFlagTransaction = async () => {\n onEvent(ANALYTICS_EVENTS.TRANSACTION_DETAILS_CLICK_FLAG, { transaction_guid: transaction.guid })\n await updateTransaction({ ...transaction, is_flagged: !transaction.is_flagged })\n }\n\n return (\n <div className=\"mx-txn-transaction-flag\">\n <ToggleButton\n aria-label={copy.flag_btn_aria}\n aria-pressed={transaction.is_flagged}\n color=\"warning\"\n onClick={handleFlagTransaction}\n selected={transaction.is_flagged}\n sx={{\n borderRadius: 6,\n color: theme.palette.secondary.main,\n '&.Mui-selected': {\n color: theme.palette.common.white,\n backgroundColor: theme.palette.warning.dark,\n ':hover': {\n color: theme.palette.common.white,\n backgroundColor: theme.palette.warning.main,\n },\n },\n ':hover': {\n color: theme.palette.warning.contrastText,\n backgroundColor: theme.palette.warning.light,\n },\n }}\n value=\"flagged\"\n >\n <FlagOutlinedIcon color=\"inherit\" />\n </ToggleButton>\n </div>\n )\n}\nexport default observer(FlagTransaction)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport Paper from '@mui/material/Paper'\nimport Stack from '@mui/material/Stack'\n\nimport { H1, MerchantLogo, Text, useTokens } from '@kyper/mui'\n\nimport { ANALYTICS_EVENTS, formatCurrency, Transaction, useEvent } from '../../../common'\n\nimport {\n BottomActions,\n DEFAULT_BOTTOM_ACTIONS,\n DEFAULT_TOP_ACTIONS,\n TopActions,\n} from '../../constants/Actions'\nimport {\n CategoryAction,\n DateAction,\n DeleteAction,\n DeleteLogoAction,\n HideAction,\n MemoAction,\n SplitAction,\n TagsAction,\n} from './transactiondetails/actions'\nimport Description from './transactiondetails/Description'\nimport FlagTransaction from './transactiondetails/FlagTransaction'\n\nexport interface TransactionDetailsProps {\n bottomActions?: BottomActions[]\n topActions?: TopActions[]\n transaction: Transaction\n}\n\nconst TransactionDetails: React.FC<TransactionDetailsProps> = ({\n bottomActions = DEFAULT_BOTTOM_ACTIONS,\n topActions = DEFAULT_TOP_ACTIONS,\n transaction,\n}) => {\n const tokens = useTokens()\n const showFullNumber = transaction?.number && transaction.number.length > 4\n const { onEvent } = useEvent()\n\n React.useEffect(\n () =>\n onEvent(ANALYTICS_EVENTS.TRANSACTION_DETAILS_VIEW, { transaction_guid: transaction.guid }),\n [],\n )\n\n return (\n <Box className=\"mx-txn-transaction-details\" width=\"100%\">\n {transaction && (\n <Stack>\n <Stack gap={tokens.Spacing.Small} p={tokens.Spacing.Large}>\n <Paper elevation={2} sx={{ borderRadius: tokens.BorderRadius.Small, width: 64 }}>\n <MerchantLogo\n categoryGuid={transaction.top_level_category_guid || ''}\n merchantGuid={transaction.merchant_guid || ''}\n size={64}\n />\n </Paper>\n\n <Description transaction={transaction} />\n\n <Stack direction=\"row\" justifyContent=\"space-between\">\n <H1 color={transaction.isIncome ? 'success.main' : 'text.primary'}>\n {transaction.isIncome ? '+' : ''}\n {formatCurrency(transaction.amount, '0,0.00')}\n </H1>\n <FlagTransaction transaction={transaction} />\n </Stack>\n\n <Stack\n bgcolor=\"background.highlight\"\n borderRadius={tokens.BorderRadius.Small}\n gap={tokens.Spacing.Tiny}\n p={tokens.Spacing.XSmall}\n >\n <Text bold={true}>\n {`${transaction.account}\n ${\n showFullNumber\n ? transaction.number\n : '\\u2022'.repeat(4).concat(transaction.number ?? '')\n }`}\n </Text>\n <Text bold={true} color=\"secondary\" variant=\"Tiny\">\n {transaction.feed_description}\n </Text>\n </Stack>\n </Stack>\n\n <Paper square={true} sx={{ boxShadow: 'none' }}>\n <List>\n {topActions.map((action, index) => (\n <React.Fragment key={action}>\n {action === TopActions.Category && <CategoryAction transaction={transaction} />}\n {action === TopActions.Date && <DateAction transaction={transaction} />}\n {action === TopActions.Memo && <MemoAction transaction={transaction} />}\n {action === TopActions.Tags && <TagsAction transaction={transaction} />}\n <Divider variant={index < topActions.length - 1 ? 'inset' : 'fullWidth'} />\n </React.Fragment>\n ))}\n </List>\n </Paper>\n\n <Text bold={true} mb={8} ml={26} mt={16} variant=\"Body\">\n Actions\n </Text>\n\n <Paper square={true} sx={{ boxShadow: 'none' }}>\n <List>\n {bottomActions.map((action, index) => (\n <React.Fragment key={action}>\n {action === BottomActions.SplitTransaction && (\n <SplitAction transaction={transaction} />\n )}\n {action === BottomActions.HideTransaction && (\n <HideAction transaction={transaction} />\n )}\n {action === BottomActions.MerchantLogo && (\n <DeleteLogoAction transaction={transaction} />\n )}\n <Divider variant={index < bottomActions.length - 1 ? 'inset' : 'fullWidth'} />\n </React.Fragment>\n ))}\n {transaction.is_manual && <DeleteAction transaction={transaction} />}\n </List>\n </Paper>\n </Stack>\n )}\n </Box>\n )\n}\n\nexport default observer(TransactionDetails)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { Text } from '@kyper/mui'\nimport { Dialog, useGlobalCopyStore } from '../../../common'\nimport { DialogProps } from '../../../common/components/dialog/Dialog'\n\nconst AddAccountModal: React.FC<DialogProps> = ({ copy, isOpen, onClose, onPrimaryAction }) => {\n const { common: commonCopy, transactions: modalCopy } = useGlobalCopyStore()\n return (\n <Dialog\n copy={{\n title: copy.title,\n }}\n isOpen={isOpen}\n onClose={onClose}\n onPrimaryAction={onPrimaryAction}\n primaryText={modalCopy.add_manual_account}\n secondaryText={commonCopy.cancel_button}\n >\n <Text component=\"p\" sx={{ marginBottom: '20px' }} truncate={false}>\n {modalCopy.add_account_modal_message}\n </Text>\n <Text component=\"p\" truncate={false}>\n {modalCopy.add_account_modal_cta}\n </Text>\n </Dialog>\n )\n}\n\nexport default observer(AddAccountModal)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Divider from '@mui/material/Divider'\nimport MenuItem from '@mui/material/MenuItem'\nimport RadioGroup from '@mui/material/RadioGroup'\nimport Stack from '@mui/material/Stack'\n\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore'\n\nimport { TextField } from '@kyper/mui'\n\nimport {\n CurrencyInput,\n SelectionBox,\n TransactionType,\n formatCurrency,\n useGlobalCopyStore,\n useGlobalUiStore,\n} from '../../../../common'\n\nimport { useTransactionsUiStore } from '../../../context/hooks'\n\nimport { CategoryAction, DateAction, MemoAction, TagsAction } from './actions'\n\ntype ManualAccount = {\n label: string\n value: string\n}\nconst ManualTransactionDetails = () => {\n const { selectedAccounts } = useGlobalUiStore()\n const { common: commonCopy, transactions: copy } = useGlobalCopyStore()\n const { manualTransaction, setIsAmountValid, updateManualTransaction } = useTransactionsUiStore()\n\n const [amount, setAmount] = React.useState('')\n const [payee, setPayee] = React.useState('')\n\n const manualAccounts = React.useMemo(\n () => selectedAccounts.filter((account) => account.is_manual),\n [selectedAccounts],\n ).map((account) => {\n return {\n label: `${account.name} | ${formatCurrency(account.balance, '0,0.00')}`,\n value: account.guid,\n } as ManualAccount\n })\n\n const currencyCopy = {\n error_amount_is_invalid: commonCopy.currency_input.error_amount_is_invalid,\n error_amount_must_be_equal_to: commonCopy.currency_input.error_amount_must_be_equal_to,\n error_amount_must_be_less_than_or_equal_to:\n commonCopy.currency_input.error_amount_must_be_less_than_or_equal_to,\n enter_amount: commonCopy.currency_input.enter_amount,\n }\n\n const handleAmountChanged = (amount: string) => {\n setAmount(amount)\n updateManualTransaction({ ...manualTransaction, amount: Number(amount) })\n }\n\n const handleTransactionTypeChanged = (_event: React.ChangeEvent<HTMLElement>, value: string) => {\n updateManualTransaction({ ...manualTransaction, transaction_type: Number(value) })\n }\n\n const handlePayeeChanged = (payee: string) => {\n setPayee(payee)\n updateManualTransaction({ ...manualTransaction, payee, description: payee })\n }\n\n const handleAccountChanged = (guid: string) => {\n updateManualTransaction({ ...manualTransaction, account_guid: guid })\n }\n\n return (\n <Box className=\"mx-txn-manual-transaction-details\">\n <Stack gap={40} mx={24} my={32}>\n <Stack\n direction=\"row\"\n sx={{ flexDirection: { xs: 'column', sm: 'row' }, gap: { xs: 40, sm: 8 } }}\n >\n <CurrencyInput\n allowDecimals={true}\n amount={amount}\n ariaLabel={copy.amount_title}\n copy={currencyCopy}\n label={copy.amount_title}\n setAmount={handleAmountChanged}\n setHasValidInput={setIsAmountValid}\n sx={{ bgcolor: 'background.paper' }}\n />\n <RadioGroup name=\"TransactionType\" onChange={handleTransactionTypeChanged} row={true}>\n <Stack alignItems=\"center\" direction=\"row\">\n <SelectionBox\n checked={manualTransaction.transaction_type === TransactionType.CREDIT}\n label={copy.manual_transaction_credit_button_label}\n sx={{ ml: { xs: 0, sm: 8 } }}\n tooltip={copy.manual_transaction_credit_button_tooltip}\n value={TransactionType.CREDIT}\n />\n <SelectionBox\n checked={manualTransaction.transaction_type === TransactionType.DEBIT}\n label={copy.manual_transaction_debit_button_label}\n tooltip={copy.manual_transaction_debit_button_tooltip}\n value={TransactionType.DEBIT}\n />\n </Stack>\n </RadioGroup>\n </Stack>\n\n <TextField\n label={copy.payee_title}\n name=\"payee\"\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => handlePayeeChanged(e.target.value)}\n sx={{ bgcolor: 'background.paper' }}\n value={payee}\n />\n\n <TextField\n InputLabelProps={{ shrink: true }}\n SelectProps={{ defaultValue: -1, IconComponent: ExpandMoreIcon }}\n label={copy.manual_transaction_select_an_account}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleAccountChanged(e.target.value)\n }\n placeholder={copy.manual_transaction_select}\n select={true}\n sx={{ bgcolor: 'background.paper' }}\n >\n {manualAccounts.map((account) => (\n <MenuItem key={account.value} value={account.value}>\n {account.label}\n </MenuItem>\n ))}\n </TextField>\n </Stack>\n <Divider light={true} />\n <Box bgcolor=\"background.paper\">\n <CategoryAction transaction={manualTransaction} />\n <DateAction transaction={manualTransaction} />\n <MemoAction transaction={manualTransaction} />\n <TagsAction transaction={manualTransaction} />\n </Box>\n </Box>\n )\n}\n\nexport default observer(ManualTransactionDetails)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\n\nimport { Text } from '@kyper/mui'\n\nimport { CategorySelectorDrawer } from '../../../../categories'\n\nimport { buildDynamicCopy, Dialog, useCategoryStore, useGlobalCopyStore } from '../../../../common'\nimport type { Transaction } from '../../../../common'\n\nimport { useTransactionStore } from '../../../../common'\n\ninterface EditCategoryActionProps {\n onClose: () => void\n transaction: Transaction\n}\n\nconst EditCategoryAction: React.FC<EditCategoryActionProps> = ({ onClose, transaction }) => {\n const { addOrUpdateTransactionRule, updateTransaction } = useTransactionStore()\n const { transactions: copy } = useGlobalCopyStore()\n\n const { categories } = useCategoryStore()\n\n const [categoryGuid, setCategoryGuid] = React.useState('')\n\n const category = React.useMemo(\n () => categories.find((item) => item.guid === categoryGuid),\n [categoryGuid],\n )\n\n const handleCategoryChanged = async (applyToAll: boolean) => {\n await updateTransaction({ ...transaction, category_guid: categoryGuid })\n if (applyToAll) {\n await addOrUpdateTransactionRule(categoryGuid, transaction)\n }\n\n setCategoryGuid('')\n onClose()\n }\n\n return (\n <Box className=\"mx-txn-edit-category-action\">\n <CategorySelectorDrawer\n initialSelected={transaction.category_guid}\n onClose={onClose}\n onSelect={(guid: string) => setCategoryGuid(guid)}\n showDrawer={!!transaction}\n title={copy.actions_select_a_category}\n />\n <Dialog\n copy={{\n title: buildDynamicCopy(\n copy.actions_apply_to_all_transaction_types,\n transaction.description,\n ) as string,\n }}\n isOpen={!!categoryGuid}\n onClose={() => handleCategoryChanged(false)}\n onPrimaryAction={() => handleCategoryChanged(true)}\n onSecondaryAction={() => handleCategoryChanged(false)}\n primaryText={copy.actions_apply_to_all}\n secondaryText={copy.actions_this_time_only}\n >\n <Text>\n {\n buildDynamicCopy(\n copy.actions_all_past_and_future,\n transaction.description,\n category?.name,\n ) as string\n }\n </Text>\n </Dialog>\n </Box>\n )\n}\n\nexport default observer(EditCategoryAction)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\n\nimport Box from '@mui/material/Box'\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport type { DateRange } from '@mui/x-date-pickers-pro'\n\nimport {\n ANALYTICS_EVENTS,\n Drawer,\n Loader,\n SearchBox,\n useAccountStore,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useTransactionStore,\n useUserStore,\n WidgetContainer,\n WidgetProps,\n} from '../common'\n\nimport { useTransactionsUiStore } from './context/hooks'\nimport { DEFAULT_TRANSACTION } from './constants/Transaction'\nimport { exportTransactionsToCSV } from './utils/exportTransactionsToCSV'\nimport ConnectDrawer from '../common/components/ConnectDrawer'\nimport ManualTransactionDetails from './components/shared/transactiondetails/ManualTransactionDetails'\nimport TransactionDetails from './components/shared/TransactionDetails'\nimport TransactionList from './components/shared/TransactionList'\nimport TransactionTable from './components/shared/TransactionTable'\nimport AddAccountModal from './components/transactionwidget/AddAccountModal'\nimport EditCategoryAction from './components/transactionwidget/actions/EditCategoryAction'\n\nconst HEADER_HEIGHT = 120\n\nenum Drawers {\n AddTransaction = 'addTransaction',\n Category = 'category',\n Transaction = 'transaction',\n}\n\ninterface TransactionWidgetProps extends WidgetProps {\n height?: string | number\n showInsights?: boolean\n}\n\nconst TransactionWidget: React.FC<TransactionWidgetProps> = ({\n onBackClick,\n height = '100dvh',\n showInsights = false,\n sx = {},\n}) => {\n const { accounts, refreshAccounts } = useAccountStore()\n const theme = useTheme()\n const {\n manualTransaction,\n isAmountValid,\n searchValue,\n setSearchValue,\n setShowInsights,\n updateManualTransaction,\n } = useTransactionsUiStore()\n const {\n addTransaction,\n filter,\n loadAssociatedBeats,\n setFilter,\n tags,\n transactions,\n updateTransaction,\n } = useTransactionStore()\n const { common: commonCopy, transactions: copy } = useGlobalCopyStore()\n const { userProfile } = useUserStore()\n const { onEvent } = useEvent()\n const {\n displayedDateRange,\n isInitialized,\n selectedAccountGuids,\n selectedAccounts,\n setDisplayedDate,\n setSelectedAccounts,\n } = useGlobalUiStore()\n\n const [drawerOpen, setDrawerOpen] = React.useState('')\n const [transactionGuid, setTransactionGuid] = React.useState('')\n\n const [addManualAccountModalOpen, setAddManualAccountModalOpen] = React.useState(false)\n const [showConnectWidget, setShowConnectWidget] = React.useState(false)\n\n const [isWidgetInitialized, setIsWidgetInitialized] = React.useState(false)\n\n React.useEffect(() => {\n setSelectedAccounts(accounts)\n }, [accounts])\n\n React.useEffect(() => {\n const startDate = startOfMonth(startOfToday())\n const endDate = endOfMonth(startOfToday())\n // Set the displayed date to the current month\n setDisplayedDate(startDate, endDate)\n // Set a Base filter\n setFilter({\n dateRange: { start: startDate, end: endDate },\n accounts: selectedAccounts.map((account) => account.guid),\n })\n setIsWidgetInitialized(true)\n onEvent(ANALYTICS_EVENTS.TRANSACTIONS_VIEW)\n }, [])\n\n React.useEffect(() => {\n // Update the filter whenever the display date or account filter changes\n if (isWidgetInitialized) {\n setFilter({\n ...filter,\n dateRange: { start: displayedDateRange.start, end: displayedDateRange.end },\n accounts: selectedAccountGuids,\n })\n //load associated beats for new date range\n loadAssociatedBeats(displayedDateRange.start)\n }\n }, [displayedDateRange, selectedAccountGuids])\n\n React.useEffect(() => {\n setShowInsights(showInsights)\n }, [showInsights])\n\n const manualAccounts = React.useMemo(\n () => accounts.filter((account) => account.is_manual),\n [accounts],\n )\n\n const transaction = transactionGuid\n ? transactions.find((transaction) => transaction.guid === transactionGuid)\n : undefined\n\n const isTransactionValid =\n isAmountValid &&\n Boolean(manualTransaction.payee) &&\n Boolean(manualTransaction.account_guid) &&\n Boolean(manualTransaction.category_guid)\n\n const handleDateChanged = (range: DateRange<Date>) => {\n setDisplayedDate(range[0] as Date, range[1] as Date)\n }\n\n const handleSearch = (searchTerm: string) => {\n setSearchValue(searchTerm)\n setFilter({\n ...filter,\n searchTerm,\n })\n onEvent(ANALYTICS_EVENTS.TRANSACTIONS_CLICK_SEARCH, { search_term: searchTerm })\n }\n\n const handleExportCsvClick = () => {\n exportTransactionsToCSV(transactions, tags)\n onEvent(ANALYTICS_EVENTS.TRANSACTIONS_CLICK_EXPORT)\n }\n\n const handleAddTransactionClick = () => {\n if (manualAccounts.length > 0) {\n updateManualTransaction({\n ...DEFAULT_TRANSACTION,\n date: getUnixTime(startOfToday()),\n user_guid: userProfile?.user_guid || '',\n })\n\n setDrawerOpen(Drawers.AddTransaction)\n onEvent(ANALYTICS_EVENTS.TRANSACTIONS_CLICK_ADD)\n } else {\n setAddManualAccountModalOpen(true)\n onEvent(ANALYTICS_EVENTS.TRANSACTIONS_ADD_MANUAL_ACCOUNT_MODAL)\n }\n }\n\n const handleAddTransaction = async () => {\n if (isTransactionValid) {\n await addTransaction(manualTransaction)\n }\n\n setDrawerOpen('')\n }\n\n const handleAddManualAccountClick = () => {\n setAddManualAccountModalOpen(false)\n setShowConnectWidget(true)\n }\n\n const handleConnectWidgetClose = () => {\n setShowConnectWidget(false)\n refreshAccounts()\n }\n\n if (!isInitialized || !isWidgetInitialized) {\n return <Loader />\n }\n\n return (\n <WidgetContainer\n accountOptions={accounts}\n actions={[\n {\n iconName: 'open_in_new',\n label: copy.export_csv_btn,\n onClick: handleExportCsvClick,\n },\n {\n iconName: 'add',\n label: copy.add_transaction_btn,\n onClick: handleAddTransactionClick,\n },\n ]}\n calendarActions={{\n onRangeChanged: handleDateChanged,\n }}\n onAccountsFilterClick={() => onEvent(ANALYTICS_EVENTS.ACCOUNTS_CLICK_FILTER)}\n onBackClick={onBackClick}\n sx={sx}\n title={copy.transactions_title}\n >\n <Box mt={16}>\n <SearchBox\n onChange={handleSearch}\n placeholder={copy.action_bar_search_placeholder}\n searchValue={searchValue}\n />\n </Box>\n\n <Box\n sx={{\n [theme.breakpoints.down('md')]: { display: 'none' },\n [theme.breakpoints.up('md')]: { display: 'block' },\n }}\n >\n <TransactionTable\n height={`calc(${height} - ${HEADER_HEIGHT}px)`}\n onCategoryClick={(guid: string) => {\n setTransactionGuid(guid)\n setDrawerOpen(Drawers.Category)\n }}\n onRowClick={(guid: string) => {\n setTransactionGuid(guid)\n setDrawerOpen(Drawers.Transaction)\n onEvent(ANALYTICS_EVENTS.TRANSACTIONS_CLICK_DETAILS, { transaction_guid: guid })\n }}\n />\n </Box>\n <Box\n sx={{\n [theme.breakpoints.down('md')]: { display: 'block' },\n [theme.breakpoints.up('md')]: { display: 'none' },\n }}\n >\n <TransactionList\n height={`calc(${height} - ${HEADER_HEIGHT}px)`}\n onClick={(guid: string) => {\n setTransactionGuid(guid)\n setDrawerOpen(Drawers.Transaction)\n }}\n showInsights={showInsights}\n />\n </Box>\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={drawerOpen === Drawers.Transaction}\n onClose={() => {\n // mark transaction as viewed\n if (transaction && !transaction.has_been_viewed) {\n updateTransaction({ ...transaction, has_been_viewed: true })\n }\n setDrawerOpen('')\n }}\n title={copy.details_title}\n >\n {transaction && <TransactionDetails transaction={transaction} />}\n </Drawer>\n {transaction && drawerOpen === Drawers.Category && (\n <EditCategoryAction\n onClose={() => {\n setDrawerOpen('')\n setTransactionGuid('')\n }}\n transaction={transaction}\n />\n )}\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={drawerOpen === Drawers.AddTransaction}\n isPrimaryDisabled={!isTransactionValid}\n onClose={() => setDrawerOpen('')}\n onPrimaryAction={handleAddTransaction}\n title={copy.add_transaction_title}\n >\n <ManualTransactionDetails />\n </Drawer>\n <AddAccountModal\n copy={{ title: copy.add_manual_account }}\n isOpen={addManualAccountModalOpen}\n onClose={() => {\n setAddManualAccountModalOpen(false)\n }}\n onPrimaryAction={handleAddManualAccountClick}\n />\n <ConnectDrawer\n onClose={handleConnectWidgetClose}\n showConnectWidget={showConnectWidget}\n title={copy.add_manual_account}\n />\n </WidgetContainer>\n )\n}\n\nexport default observer(TransactionWidget)\n","import { formatISO } from 'date-fns/formatISO'\nimport { getDate } from 'date-fns/getDate'\nimport { getDay } from 'date-fns/getDay'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { getMonth } from 'date-fns/getMonth'\n\nimport { RecurrenceTypes } from '../../common'\n\nimport type {\n Activity,\n CashflowSequence,\n RepeatDay,\n RepeatMonth,\n RepeatWeekday,\n ScheduledPayment,\n} from '../../common'\n\nexport const updateIncome = (activity: Activity, sequence: CashflowSequence): CashflowSequence => {\n const updatedSequence = {\n ...sequence,\n repeat_day: null,\n repeat_interval: null,\n repeat_month: null,\n repeat_weekday: null,\n start_date: getUnixTime(activity.expectedDate),\n } as CashflowSequence\n\n const repeatDay = `${getDate(activity.expectedDate)}` as RepeatDay\n const repeatMonth = `${getMonth(activity.expectedDate)}` as RepeatMonth\n const repeatWeekday = `${getDay(activity.expectedDate)}` as RepeatWeekday\n\n switch (activity.recurrenceType) {\n case RecurrenceTypes.EveryWeek:\n updatedSequence.repeat_interval = '1'\n updatedSequence.repeat_weekday = repeatWeekday\n break\n case RecurrenceTypes.EveryOtherWeek:\n updatedSequence.repeat_interval = '2'\n updatedSequence.repeat_weekday = repeatWeekday\n break\n case RecurrenceTypes.EveryMonth:\n updatedSequence.repeat_day = repeatDay\n break\n case RecurrenceTypes.EveryQuarter:\n updatedSequence.repeat_day = repeatDay\n updatedSequence.repeat_interval = '3'\n break\n case RecurrenceTypes.EveryYear:\n updatedSequence.repeat_day = repeatDay\n updatedSequence.repeat_month = repeatMonth\n break\n }\n\n return updatedSequence\n}\n\nexport const updateExpense = (\n activity: Activity,\n scheduledPayment: ScheduledPayment,\n): ScheduledPayment => {\n return {\n ...scheduledPayment,\n occurs_on: formatISO(activity.expectedDate, { representation: 'date' }),\n recurrence_type: activity.recurrenceType,\n }\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { Icon } from '@kyper/mui'\n\nimport {\n type Activity,\n ActivityType,\n DataRow,\n Drawer,\n RecurrenceTypes,\n useEvent,\n useGlobalCopyStore,\n useRecurringActivityStore,\n} from '../../../common'\n\nimport { updateExpense, updateIncome } from '../../util/updateActivity'\n\ninterface FrequencyActionProps {\n activity: Activity\n}\n\nconst FrequencyAction: React.FC<FrequencyActionProps> = ({ activity }) => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const { cashflowSequences, scheduledPayments, updateCashflowSequence, updateScheduledPayment } =\n useRecurringActivityStore()\n\n const { onEvent } = useEvent()\n const [isOpen, setIsOpen] = React.useState(false)\n const isIncome = activity.activityType === ActivityType.Income\n\n const frequencies = [\n { id: RecurrenceTypes.EveryWeek, label: recurringCopy.frequency_every_week },\n { id: RecurrenceTypes.EveryOtherWeek, label: recurringCopy.frequency_every_other_week },\n { id: RecurrenceTypes.EveryMonth, label: recurringCopy.frequency_every_month },\n { id: RecurrenceTypes.EveryOtherMonth, label: recurringCopy.frequency_every_other_month },\n { id: RecurrenceTypes.EveryQuarter, label: recurringCopy.frequency_every_quarter },\n { id: RecurrenceTypes.EveryOtherQuarter, label: recurringCopy.frequency_every_other_quarter },\n { id: RecurrenceTypes.EveryYear, label: recurringCopy.frequency_every_year },\n ]\n\n const handleOnClick = async (recurrenceType: RecurrenceTypes) => {\n const updatedActivity = { ...activity, recurrenceType }\n\n if (activity.activityType === ActivityType.Expense) {\n const payment = scheduledPayments.find((sp) => sp.guid === activity.scheduledPaymentGuid)\n\n if (payment) {\n // update scheduled payment\n await updateScheduledPayment(updateExpense(updatedActivity, payment))\n }\n } else {\n const sequence = cashflowSequences.find((cs) => cs.guid === activity.sequenceGuid)\n\n if (sequence) {\n // update cashflow sequence\n await updateCashflowSequence(updateIncome(updatedActivity, sequence))\n }\n }\n\n setIsOpen(false)\n }\n\n const handleOpen = () => {\n setIsOpen(true)\n onEvent(\n isIncome\n ? 'recurring_transactions_widget_income_details_click_payment_schedule'\n : 'recurring_transactions_widget_expense_details_click_payment_schedule',\n {\n transaction_guid: activity.transactionGuid,\n },\n )\n }\n\n const frequency = frequencies.find((f) => f.id === activity.recurrenceType)\n\n return (\n <>\n <DataRow\n iconName=\"sync\"\n label={recurringCopy.activity_schedule}\n onClick={handleOpen}\n value={frequency?.label || ''}\n />\n <Drawer\n ariaLabelClose={recurringCopy.close_drawer_aria}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n title={recurringCopy.frequency_title}\n >\n <List>\n {frequencies\n .filter(\n (f) =>\n // Filter out every other month and every other quarter when income since cashflow\n // sequence doesn't support them\n activity.activityType === ActivityType.Expense ||\n (f.id !== RecurrenceTypes.EveryOtherMonth &&\n f.id !== RecurrenceTypes.EveryOtherQuarter),\n )\n .map((frequency) => (\n <React.Fragment key={frequency.id}>\n <ListItem disableGutters={true} disablePadding={true} key={frequency.id}>\n <ListItemButton onClick={() => handleOnClick(frequency.id)}>\n <ListItemText\n primary={frequency.label}\n primaryTypographyProps={{ fontWeight: 400 }}\n />\n {activity.recurrenceType === frequency.id && (\n <Icon color=\"primary\" fill={true} name=\"check_circle\" size={24} />\n )}\n </ListItemButton>\n </ListItem>\n <Divider />\n </React.Fragment>\n ))}\n </List>\n </Drawer>\n </>\n )\n}\n\nexport default observer(FrequencyAction)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { startOfToday } from 'date-fns/startOfToday'\n\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3'\nimport { DateCalendar } from '@mui/x-date-pickers/DateCalendar'\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'\n\nimport {\n type Activity,\n ActivityType,\n DATE_FORMATS_INTL,\n DataRow,\n Drawer,\n formatDate,\n useEvent,\n useGlobalCopyStore,\n useRecurringActivityStore,\n} from '../../../common'\n\nimport { updateExpense, updateIncome } from '../../util/updateActivity'\n\ninterface PaymentDateActionProps {\n activity: Activity\n}\n\nconst PaymentDateAction: React.FC<PaymentDateActionProps> = ({ activity }) => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const { cashflowSequences, scheduledPayments, updateCashflowSequence, updateScheduledPayment } =\n useRecurringActivityStore()\n\n const { onEvent } = useEvent()\n const [isOpen, setIsOpen] = React.useState(false)\n const [selected, setSelected] = React.useState(activity.expectedDate)\n const isIncome = activity.activityType === ActivityType.Income\n\n const handleOpen = () => {\n setSelected(activity.expectedDate)\n setIsOpen(true)\n onEvent(\n isIncome\n ? 'recurring_transactions_widget_income_details_click_next_payment_due'\n : 'recurring_transactions_widget_expense_details_click_next_payment_due',\n {\n transaction_guid: activity.transactionGuid,\n },\n )\n }\n\n const handleSave = async () => {\n const updatedActivity = { ...activity, expectedDate: selected }\n\n if (activity.activityType === ActivityType.Expense) {\n const payment = scheduledPayments.find((sp) => sp.guid === activity.scheduledPaymentGuid)\n\n if (payment) {\n // update scheduled payment\n await updateScheduledPayment(updateExpense(updatedActivity, payment))\n }\n } else {\n const sequence = cashflowSequences.find((cs) => cs.guid === activity.sequenceGuid)\n\n if (sequence) {\n // update cashflow sequence\n await updateCashflowSequence(updateIncome(updatedActivity, sequence))\n }\n }\n\n setIsOpen(false)\n }\n\n return (\n <>\n <DataRow\n iconName=\"calendar_month\"\n label={recurringCopy.activity_payment_date}\n onClick={handleOpen}\n value={formatDate(activity.expectedDate, DATE_FORMATS_INTL.MONTH_DAY_YEAR)}\n />\n <Drawer\n ariaLabelClose={recurringCopy.close_drawer_aria}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n onPrimaryAction={handleSave}\n title={recurringCopy.activity_payment_date}\n >\n <LocalizationProvider dateAdapter={AdapterDateFns}>\n <DateCalendar\n minDate={startOfToday()}\n onChange={(date) => setSelected(date)}\n value={selected}\n />\n </LocalizationProvider>\n </Drawer>\n </>\n )\n}\n\nexport default observer(PaymentDateAction)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subDays } from 'date-fns/subDays'\n\nimport Button from '@mui/material/Button'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport Stack from '@mui/material/Stack'\n\nimport { H1, Icon, MerchantLogo, Text } from '@kyper/mui'\n\nimport {\n type Activity,\n type Transaction,\n ActivityType,\n DataRow,\n Dialog,\n formatCurrency,\n useCategoryStore,\n useRecurringActivityStore,\n useTransactionStore,\n Drawer,\n useGlobalUiStore,\n useEvent,\n useGlobalCopyStore,\n} from '../../common'\n\nimport { TransactionDetails, TransactionList } from '../../transactions'\n\nimport FrequencyAction from './actions/FrequencyAction'\nimport PaymentDateAction from './actions/PaymentDateAction'\n\ninterface ActivityDetailsProps {\n activity: Activity\n onDeleted: () => void\n}\n\nconst ActivityDetails: React.FC<ActivityDetailsProps> = ({ activity, onDeleted }) => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const { categories } = useCategoryStore()\n const { deleteCashflowSequence, deleteScheduledPayment, paidActivities } =\n useRecurringActivityStore()\n const { filter, setFilter, transactions } = useTransactionStore()\n const { selectedAccountGuids } = useGlobalUiStore()\n const { onEvent } = useEvent()\n\n const [showDeleteConfirm, setShowDeleteConfirm] = React.useState(false)\n const [transactionGuid, setTransactionGuid] = React.useState('')\n\n const category = categories.find((c) => c.guid === activity.categoryGuid)\n const isIncome = activity.activityType === ActivityType.Income\n const transaction = React.useMemo(\n () => transactions.find((t) => t.guid === transactionGuid),\n [transactionGuid],\n )\n\n React.useEffect(() => {\n setFilter({\n accounts: selectedAccountGuids,\n dateRange: { start: subDays(startOfToday(), 90), end: endOfMonth(startOfToday()) },\n })\n }, [])\n\n React.useEffect(() => {\n if (isIncome && activity.sequenceGuid) {\n // Set filter to show related paid income\n const transactionGuids = paidActivities\n .filter((pa) => pa.sequenceGuid === activity.sequenceGuid)\n .map((pa) => pa.transactionGuid)\n setFilter({\n ...filter,\n custom: (t: Transaction) => Boolean(transactionGuids.find((guid) => t.guid === guid)),\n })\n } else if (!isIncome && activity.scheduledPaymentGuid) {\n // Set filter to show related paid expenses\n setFilter({\n ...filter,\n custom: (t: Transaction) => t.scheduled_payment_guid === activity.scheduledPaymentGuid,\n })\n }\n }, [activity])\n\n const handleDeleteActivity = async () => {\n if (isIncome && activity.sequenceGuid) {\n await deleteCashflowSequence(activity.sequenceGuid)\n } else if (activity.scheduledPaymentGuid) {\n await deleteScheduledPayment(activity.scheduledPaymentGuid)\n }\n onDeleted()\n }\n\n const handleDeleteButtonClick = () => {\n setShowDeleteConfirm(true)\n onEvent(\n isIncome\n ? 'recurring_transactions_widget_income_details_click_delete'\n : 'recurring_transactions_widget_expense_details_click_delete',\n {\n transaction_guid: activity.transactionGuid,\n },\n )\n }\n\n return (\n <Stack bgcolor=\"background.default\" direction=\"column\" height=\"100%\">\n <Stack direction=\"column\" gap={12} m={24}>\n <MerchantLogo\n categoryGuid={activity.categoryGuid || ''}\n merchantGuid={activity.merchantGuid || ''}\n size={64}\n />\n <Text bold={true} variant=\"Body\">\n {activity.name}\n </Text>\n <H1 color={isIncome ? 'success.main' : 'text.primary'}>\n {isIncome ? '+' : ''}\n {formatCurrency(activity.amount, '0,0.00')}\n </H1>\n </Stack>\n <List sx={{ bgcolor: 'background.paper' }}>\n {activity.institution && (\n <>\n <DataRow\n iconName=\"checkbook\"\n label={recurringCopy.account}\n value={activity.institution}\n />\n <Divider color=\"secondary\" variant=\"inset\" />\n </>\n )}\n\n {category && (\n <>\n <DataRow\n iconName=\"monetization_on\"\n label={recurringCopy.category}\n value={category.name}\n />\n <Divider color=\"secondary\" variant=\"inset\" />\n </>\n )}\n\n <FrequencyAction activity={activity} />\n <Divider color=\"secondary\" variant=\"inset\" />\n\n <PaymentDateAction activity={activity} />\n <Divider color=\"secondary\" />\n </List>\n\n <Button\n color=\"error\"\n onClick={handleDeleteButtonClick}\n startIcon={<Icon name=\"delete\" />}\n sx={{ mx: 24, my: 16 }}\n variant=\"text\"\n >\n {isIncome ? recurringCopy.delete_income_title : recurringCopy.delete_expense_title}\n </Button>\n\n <Text bold={true} sx={{ ml: 24, mt: 16 }} variant=\"Body\">\n {recurringCopy.paid_transactions}\n </Text>\n\n <TransactionList height=\"30dvh\" onClick={setTransactionGuid} />\n\n <Drawer\n ariaLabelClose={recurringCopy.close_drawer_aria}\n isOpen={!!transactionGuid}\n onClose={() => setTransactionGuid('')}\n title={recurringCopy.transaction_details_drawer_title}\n >\n {transaction && <TransactionDetails transaction={transaction} />}\n </Drawer>\n\n <Dialog\n copy={{\n title: isIncome ? recurringCopy.delete_income_title : recurringCopy.delete_expense_title,\n close_aria: recurringCopy.close_drawer_aria,\n }}\n isOpen={showDeleteConfirm}\n onClose={() => setShowDeleteConfirm(false)}\n onPrimaryAction={handleDeleteActivity}\n >\n <Text>\n {isIncome\n ? recurringCopy.delete_income_description\n : recurringCopy.delete_expense_description}\n </Text>\n </Dialog>\n </Stack>\n )\n}\n\nexport default observer(ActivityDetails)\n","import AccessTimeFilledIcon from '@mui/icons-material/AccessTimeFilled'\nimport MonetizationOnIcon from '@mui/icons-material/MonetizationOn'\nimport CancelIcon from '@mui/icons-material/Cancel'\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle'\n\nimport IconBacking from '../../common/components/IconBacking'\n\nconst iconStyle = {\n gridRow: 1,\n gridColumn: 1,\n zIndex: 2,\n}\n\nconst offsetStyle = (isOffset: boolean) => {\n return isOffset ? { margin: '0 0 -6px -4px' } : undefined\n}\n\nexport const UpcomingExpenseBadge = ({ isOffset = false, size = 16 }) => (\n <IconBacking size={size} sx={{ ...offsetStyle(isOffset) }}>\n <AccessTimeFilledIcon color=\"primary\" sx={{ fontSize: size, ...iconStyle }} />\n </IconBacking>\n)\n\nexport const IncomeBadge = ({ isOffset = false, size = 16 }) => (\n <IconBacking size={size} sx={{ ...offsetStyle(isOffset) }}>\n <MonetizationOnIcon sx={{ color: 'categories.income', fontSize: size, ...iconStyle }} />\n </IconBacking>\n)\n\nexport const MissedBadge = ({ isOffset = false, size = 16 }) => (\n <IconBacking size={size} sx={{ ...offsetStyle(isOffset) }}>\n <CancelIcon color=\"error\" sx={{ fontSize: size, ...iconStyle }} />\n </IconBacking>\n)\n\nexport const PaidBadge = ({ isOffset = false, size = 16 }) => (\n <IconBacking size={size} sx={{ ...offsetStyle(isOffset) }}>\n <CheckCircleIcon color=\"success\" sx={{ fontSize: size, ...iconStyle }} />\n </IconBacking>\n)\n","import { format } from 'date-fns/format'\nimport { isValid } from 'date-fns/isValid'\nimport { buildDynamicCopy, RecurrenceTypes, type RecurringCopy } from '../../common'\n\ninterface GetRecurrenceArgs {\n copy: RecurringCopy\n date: Date | null\n type: RecurrenceTypes\n}\n\nexport const getRecurrence = ({ copy, date, type }: GetRecurrenceArgs) => {\n let recurrenceType =\n date && isValid(date)\n ? buildDynamicCopy(copy.monthly_ordinal, format(date, 'do'))\n : copy.monthly\n switch (type) {\n case RecurrenceTypes.EveryQuarter:\n recurrenceType = date\n ? buildDynamicCopy(copy.quarterly_ordinal, format(date, 'do'))\n : copy.quarterly\n break\n case RecurrenceTypes.EveryWeek:\n recurrenceType = date\n ? buildDynamicCopy(copy.weekly_ordinal, format(date, 'do'))\n : copy.weekly\n break\n case RecurrenceTypes.EveryYear:\n recurrenceType = date\n ? buildDynamicCopy(copy.anually_ordinal, format(date, 'do'))\n : copy.anually\n break\n case RecurrenceTypes.EveryOtherWeek:\n recurrenceType = date\n ? buildDynamicCopy(copy.every_other_week_ordinal, format(date, 'do'))\n : copy.every_other_week\n break\n case RecurrenceTypes.EveryOtherMonth:\n recurrenceType = date\n ? buildDynamicCopy(copy.every_other_month_ordinal, format(date, 'do'))\n : copy.every_other_month\n break\n case RecurrenceTypes.EveryOtherQuarter:\n recurrenceType = date\n ? buildDynamicCopy(copy.every_other_quarter_ordinal, format(date, 'do'))\n : copy.every_other_quarter\n break\n }\n\n return recurrenceType as string\n}\n","import {\n type Activity,\n ActivityStatus,\n buildDynamicCopy,\n DATE_FORMATS_INTL,\n formatDate,\n type RecurringCopy,\n} from '../../common'\n\nexport const getStatus = (activity: Activity, copy: RecurringCopy): string => {\n switch (activity.activityStatus) {\n case ActivityStatus.Paid:\n return activity.occurredOnDate\n ? (buildDynamicCopy(\n copy.paid_on,\n formatDate(activity.occurredOnDate, DATE_FORMATS_INTL.MONTH_DAY),\n ) as string)\n : copy.paid\n case ActivityStatus.Missed:\n return buildDynamicCopy(\n copy.missed_on,\n formatDate(activity.expectedDate, DATE_FORMATS_INTL.MONTH_DAY),\n ) as string\n case ActivityStatus.Upcoming:\n return buildDynamicCopy(\n copy.upcoming_on,\n formatDate(activity.expectedDate, DATE_FORMATS_INTL.MONTH_DAY),\n ) as string\n default:\n return copy.unknown\n }\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { Icon, InstitutionLogo, MerchantLogo, Text } from '@kyper/mui'\n\nimport {\n type Activity,\n ActivityStatus,\n ActivityType,\n Drawer,\n formatCurrency,\n useGlobalCopyStore,\n} from '../../common'\n\nimport ActivityDetails from './ActivityDetails'\nimport { IncomeBadge, MissedBadge, PaidBadge, UpcomingExpenseBadge } from './ActivityBadges'\nimport { getRecurrence } from '../util/getRecurrence'\nimport { getStatus } from '../util/getStatus'\n\nconst getStatusIcon = (activity: Activity): React.ReactNode => {\n if (activity.activityType === ActivityType.Income) {\n return <IncomeBadge />\n }\n\n switch (activity.activityStatus) {\n case ActivityStatus.Missed:\n return <MissedBadge />\n case ActivityStatus.Paid:\n return <PaidBadge />\n default:\n return <UpcomingExpenseBadge />\n }\n}\n\ninterface ActivityRowProps {\n activity: Activity\n isMini?: boolean\n onActivityClick?: (activity: Activity) => void\n showOrdinal?: boolean\n}\n\nconst ActivityRow: React.FC<ActivityRowProps> = ({\n activity,\n isMini = false,\n onActivityClick = () => {},\n showOrdinal = false,\n}) => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n\n // Use a guid rather than a boolean to force the drawer to close properly\n const [openGuid, setOpenGuid] = React.useState('')\n\n const isCredit = activity.activityType === ActivityType.Income\n const isPaid = activity.activityStatus === ActivityStatus.Paid\n const isMissed = activity.activityStatus === ActivityStatus.Missed\n const isUpcoming = activity.activityStatus === ActivityStatus.Upcoming\n\n let status = recurringCopy.paid?.toLowerCase()\n if (isMissed) {\n status = recurringCopy.missed?.toLowerCase()\n } else if (isUpcoming) {\n status = showOrdinal\n ? getRecurrence({\n copy: recurringCopy,\n date: activity.expectedDate,\n type: activity.recurrenceType,\n })\n : getRecurrence({ copy: recurringCopy, date: null, type: activity.recurrenceType })\n }\n\n const onItemClick = () => {\n setOpenGuid(activity.sequenceGuid || activity.scheduledPaymentGuid || '')\n onActivityClick(activity)\n }\n\n return (\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton onClick={onItemClick}>\n <ListItemAvatar>\n <MerchantLogo\n categoryGuid={activity.categoryGuid || ''}\n merchantGuid={activity.merchantGuid || ''}\n />\n </ListItemAvatar>\n <ListItemText>\n <Stack direction=\"row\" sx={{ textOverflow: 'ellipsis', textWrap: 'nowrap' }}>\n <Stack direction=\"column\" maxWidth=\"60%\">\n <Text bold={true} variant=\"Body\">\n {activity.name}\n </Text>\n <Stack alignItems=\"center\" direction=\"row\" gap={6}>\n {isMini ? (\n <Stack direction=\"row\" gap={4}>\n {getStatusIcon(activity)}\n <Text variant=\"XSmall\">{getStatus(activity, recurringCopy)}</Text>\n </Stack>\n ) : (\n <>\n {activity.institutionGuid && (\n <InstitutionLogo\n alt={activity.institution || ''}\n institutionGuid={activity.institutionGuid}\n size={12}\n />\n )}\n <Text variant=\"XSmall\">{activity.institution}</Text>\n </>\n )}\n </Stack>\n </Stack>\n\n <Stack\n alignItems=\"center\"\n direction=\"row\"\n flexGrow={1}\n gap={8}\n justifyContent=\"flex-end\"\n >\n <Stack alignItems=\"flex-end\">\n <Text bold={true} color={isCredit ? 'success.main' : 'text.primary'} variant=\"Body\">\n {isCredit ? '+' : ''}\n {formatCurrency(activity.amount, '0,0.00')}\n </Text>\n {!isMini && (\n <Stack alignItems=\"center\" direction=\"row\" gap={6} textTransform=\"uppercase\">\n {isPaid && <Icon color=\"success\" fill={true} name=\"check_circle\" size={12} />}\n {isMissed && <Icon color=\"error\" fill={true} name=\"cancel\" size={12} />}\n <Text bold={true} color=\"secondary.light\" variant=\"XSmall\">\n {status}\n </Text>\n </Stack>\n )}\n </Stack>\n </Stack>\n </Stack>\n </ListItemText>\n </ListItemButton>\n\n <Drawer\n ariaLabelClose={recurringCopy.close_drawer_aria}\n isOpen={openGuid === activity.sequenceGuid || openGuid === activity.scheduledPaymentGuid}\n onClose={() => setOpenGuid('')}\n title={\n activity.activityType !== ActivityType.Income\n ? recurringCopy.expense_details\n : recurringCopy.income_details\n }\n >\n <ActivityDetails activity={activity} onDeleted={() => setOpenGuid('')} />\n </Drawer>\n </ListItem>\n )\n}\n\nexport default observer(ActivityRow)\n","import { formatISO } from 'date-fns/formatISO'\nimport { getDay } from 'date-fns/getDay'\nimport { getDate } from 'date-fns/getDate'\nimport { getMonth } from 'date-fns/getMonth'\nimport { getUnixTime } from 'date-fns/getUnixTime'\n\nimport {\n type CashflowEvent,\n type CashflowSequence,\n type RepeatDay,\n type RepeatMonth,\n type ScheduledPayment,\n type Transaction,\n RecurrenceTypes,\n RepeatWeekday,\n} from '../../common'\n\nexport const buildNewCashflowSequence = (\n transaction: Transaction,\n recurrenceType: RecurrenceTypes,\n nextDate: Date,\n): CashflowSequence => {\n const cashflowSequence = {\n account_guid: transaction.account_guid,\n amount: transaction.amount,\n category_guid: transaction.category_guid,\n description: transaction.feed_description || transaction.description,\n name: transaction.description,\n repeat_day: null,\n repeat_interval: null,\n repeat_month: null,\n repeat_week: null,\n repeat_weekday: null,\n repeat_year: null,\n start_date: getUnixTime(nextDate),\n transaction_type: transaction.transaction_type,\n } as CashflowSequence\n\n switch (recurrenceType) {\n case RecurrenceTypes.EveryWeek:\n cashflowSequence.repeat_interval = '1'\n cashflowSequence.repeat_weekday = `${getDay(nextDate)}` as RepeatWeekday\n break\n case RecurrenceTypes.EveryOtherWeek:\n cashflowSequence.repeat_interval = '2'\n cashflowSequence.repeat_weekday = `${getDay(nextDate)}` as RepeatWeekday\n break\n case RecurrenceTypes.EveryMonth:\n cashflowSequence.repeat_day = `${getDate(nextDate)}` as RepeatDay\n break\n case RecurrenceTypes.EveryQuarter:\n cashflowSequence.repeat_interval = '3'\n cashflowSequence.repeat_day = `${getDate(nextDate)}` as RepeatDay\n break\n case RecurrenceTypes.EveryYear:\n cashflowSequence.repeat_day = `${getDate(nextDate)}` as RepeatDay\n cashflowSequence.repeat_month = `${getMonth(nextDate)}` as RepeatMonth\n break\n }\n\n return cashflowSequence\n}\n\nexport const buildNewCashflowEvent = (\n cashflowSequence: CashflowSequence,\n transaction: Transaction,\n) => {\n return {\n amount: transaction.amount,\n cashflow_sequence_guid: cashflowSequence.guid,\n category_guid: transaction.category_guid,\n description: transaction.feed_description || transaction.description,\n expected_date: transaction.date,\n name: transaction.description,\n occurred_on: transaction.date,\n transaction_guid: transaction.guid,\n transaction_type: transaction.transaction_type,\n } as CashflowEvent\n}\n\nexport const buildNewScheduledPayment = (\n transaction: Transaction,\n recurrenceType: RecurrenceTypes,\n nextDate: Date,\n) => {\n const payment = {\n amount: transaction.amount,\n description: transaction.feed_description || transaction.description,\n is_tracked_by_user: true,\n merchant_guid: transaction.merchant_guid,\n occurs_on: formatISO(nextDate, { representation: 'date' }),\n recurrence_day: 0,\n recurrence_type: RecurrenceTypes.EveryMonth,\n } as ScheduledPayment\n\n switch (recurrenceType) {\n case RecurrenceTypes.EveryWeek:\n case RecurrenceTypes.EveryOtherWeek:\n payment.recurrence_day = getDay(nextDate)\n break\n case RecurrenceTypes.EveryMonth:\n case RecurrenceTypes.EveryOtherMonth:\n case RecurrenceTypes.EveryQuarter:\n case RecurrenceTypes.EveryOtherQuarter:\n case RecurrenceTypes.EveryYear:\n payment.recurrence_day = getDate(nextDate)\n break\n }\n\n return payment\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\n\nimport { P } from '@kyper/mui'\n\nimport { SearchBox, useGlobalCopyStore } from '../../../../common'\nimport { TransactionList, useTransactionsUiStore } from '../../../../transactions'\n\ninterface SelectTransactionProps {\n bgcolor?: string\n description?: string\n onSearch: (value: string) => void\n onSelected: (guid: string) => void\n}\n\nconst SelectTransaction: React.FC<SelectTransactionProps> = ({\n bgcolor = 'background.default',\n description,\n onSearch,\n onSelected,\n}) => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const { searchValue, setSearchValue } = useTransactionsUiStore()\n\n return (\n <Stack sx={{ bgcolor, gap: 16, pt: 8 }}>\n {description && <P sx={{ mx: 24 }}>{description}</P>}\n <SearchBox\n ariaLabel={recurringCopy.select_transaction_search_aria}\n cancelAriaLabel={recurringCopy.select_transaction_search_cancel_aria}\n onChange={(value) => {\n setSearchValue(value)\n onSearch(value)\n }}\n placeholder={recurringCopy.select_transaction_search_placeholder}\n searchValue={searchValue}\n />\n <TransactionList bgcolor={bgcolor} height=\"auto\" onClick={onSelected} showLoader={false} />\n </Stack>\n )\n}\n\nexport default observer(SelectTransaction)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\n\nimport MenuItem from '@mui/material/MenuItem'\nimport Stack from '@mui/material/Stack'\nimport TextField from '@mui/material/TextField'\n\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3'\nimport { DatePicker } from '@mui/x-date-pickers'\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport { RecurrenceTypes, useGlobalCopyStore, type Transaction } from '../../../../common'\nimport SubheaderRow from '../../../../common/components/SubheaderRow'\n\nimport { TransactionRow } from '../../../../transactions'\n\nimport {\n fromUnixToDayOfWeekAndDate,\n getNextBiMonthlyDate,\n getNextBiQuarterlyDate,\n getNextBiWeeklyDate,\n getNextMonthlyDate,\n getNextQuarterlyDate,\n getNextWeeklyDate,\n getNextYearlyDate,\n} from '../../../../common/utils/DateUtil'\n\ninterface ActivityDetailsProps {\n bgcolor?: string\n frequency: RecurrenceTypes\n isIncome: boolean\n nextDate: Date | null\n onFrequencyChange: (frequency: RecurrenceTypes) => void\n onNextDateChange: (date: Date | null) => void\n transaction: Transaction\n}\n\nconst AddActivityDetails: React.FC<ActivityDetailsProps> = ({\n bgcolor = 'background.default',\n frequency,\n isIncome,\n nextDate,\n onFrequencyChange,\n onNextDateChange,\n transaction,\n}) => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const frequencies = [\n { id: RecurrenceTypes.EveryWeek, label: recurringCopy.frequency_every_week },\n { id: RecurrenceTypes.EveryOtherWeek, label: recurringCopy.frequency_every_other_week },\n { id: RecurrenceTypes.EveryMonth, label: recurringCopy.frequency_every_month },\n { id: RecurrenceTypes.EveryOtherMonth, label: recurringCopy.frequency_every_other_month },\n { id: RecurrenceTypes.EveryQuarter, label: recurringCopy.frequency_every_quarter },\n { id: RecurrenceTypes.EveryOtherQuarter, label: recurringCopy.frequency_every_other_quarter },\n { id: RecurrenceTypes.EveryYear, label: recurringCopy.frequency_every_year },\n ]\n\n React.useEffect(() => {\n // Calculate the next payment date based on monthly\n const transactionDate = fromUnixTime(transaction.date)\n\n onNextDateChange(getNextMonthlyDate(transactionDate))\n\n // Default the frequency to Monthly\n onFrequencyChange(RecurrenceTypes.EveryMonth)\n }, [transaction])\n\n const handleFrequencyChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const transactionDate = fromUnixTime(transaction.date)\n\n switch (Number(e.target.value)) {\n case RecurrenceTypes.EveryWeek:\n onNextDateChange(getNextWeeklyDate(transactionDate))\n break\n case RecurrenceTypes.EveryOtherWeek:\n onNextDateChange(getNextBiWeeklyDate(transactionDate))\n break\n case RecurrenceTypes.EveryMonth:\n onNextDateChange(getNextMonthlyDate(transactionDate))\n break\n case RecurrenceTypes.EveryOtherMonth:\n onNextDateChange(getNextBiMonthlyDate(transactionDate))\n break\n case RecurrenceTypes.EveryQuarter:\n onNextDateChange(getNextQuarterlyDate(transactionDate))\n break\n case RecurrenceTypes.EveryOtherQuarter:\n onNextDateChange(getNextBiQuarterlyDate(transactionDate))\n break\n case RecurrenceTypes.EveryYear:\n onNextDateChange(getNextYearlyDate(transactionDate))\n break\n }\n onFrequencyChange(Number(e.target.value))\n }\n\n return (\n <Stack bgcolor={bgcolor} gap={24} height=\"100%\">\n <Stack>\n <SubheaderRow bgcolor={bgcolor}>\n {fromUnixToDayOfWeekAndDate(transaction.date)}\n </SubheaderRow>\n <TransactionRow transaction={transaction} />\n </Stack>\n\n <Text bold={true} sx={{ mx: 24 }} variant=\"Body\">\n {isIncome ? recurringCopy.income_schedule : recurringCopy.expense_schedule}\n </Text>\n\n <TextField\n InputLabelProps={{ shrink: true }}\n SelectProps={{\n IconComponent: (props) => (\n <Icon fill={false} name=\"expand_more\" size={20} sx={{ mr: 4 }} {...props} />\n ),\n }}\n defaultValue={0}\n label={recurringCopy.frequency}\n onChange={handleFrequencyChange}\n select={true}\n sx={{ mx: 24 }}\n value={frequency}\n variant=\"outlined\"\n >\n {frequencies.map((frequency) => (\n <MenuItem key={frequency.id} value={frequency.id}>\n {frequency.label}\n </MenuItem>\n ))}\n </TextField>\n\n <LocalizationProvider dateAdapter={AdapterDateFns}>\n <DatePicker\n disablePast={true}\n label={isIncome ? recurringCopy.income_date_label : recurringCopy.expense_date_label}\n onChange={onNextDateChange}\n sx={{ mx: 24 }}\n value={nextDate}\n />\n </LocalizationProvider>\n </Stack>\n )\n}\n\nexport default observer(AddActivityDetails)\n","import { CategoryGuids, type Transaction, TransactionType } from '../../common'\n\n// Returns true if the transaction is not income\nexport const expenseFilter = (t: Transaction) =>\n t.top_level_category_guid !== CategoryGuids.INCOME && t.transaction_type === TransactionType.DEBIT\n\n// Returns true if the transaction is an expense and it matches the search string\nexport const expenseFilterSearch = (t: Transaction, searchValue: string) => {\n if (expenseFilter(t)) {\n return (\n t.payee?.toLowerCase().includes(searchValue.toLowerCase()) ||\n t.description.toLowerCase().includes(searchValue.toLowerCase()) ||\n t.feed_description.toLowerCase().includes(searchValue.toLowerCase())\n )\n }\n return false\n}\n\n// Returns true if the transaction is income\nexport const incomeFilter = (t: Transaction) =>\n t.top_level_category_guid === CategoryGuids.INCOME ||\n (t.top_level_category_guid === CategoryGuids.TRANSFER &&\n t.transaction_type === TransactionType.CREDIT)\n\n// Returns true if the transaction is income and it matches the search string\nexport const incomeFilterSearch = (t: Transaction, searchValue: string) => {\n if (incomeFilter(t)) {\n return (\n t.payee?.toLowerCase().includes(searchValue.toLowerCase()) ||\n t.description?.toLowerCase().includes(searchValue.toLowerCase()) ||\n t.feed_description?.toLowerCase().includes(searchValue.toLowerCase())\n )\n }\n return false\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Divider from '@mui/material/Divider'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport {\n type Transaction,\n Drawer,\n RecurrenceTypes,\n useGlobalCopyStore,\n useRecurringActivityStore,\n useTransactionStore,\n} from '../../../../common'\n\nimport {\n buildNewCashflowEvent,\n buildNewCashflowSequence,\n buildNewScheduledPayment,\n} from '../../../util/buildNewActivity'\n\nimport SelectTransaction from './SelectTransaction'\nimport AddActivityDetails from './AddActivityDetails'\nimport {\n expenseFilter,\n expenseFilterSearch,\n incomeFilter,\n incomeFilterSearch,\n} from '../../../../transactions/utils/Filters'\n\ninterface AddActivityProps {\n isIncome?: boolean\n label: string\n onAddActivity?: () => void\n}\n\nconst AddActivity: React.FC<AddActivityProps> = ({\n isIncome = false,\n label,\n onAddActivity = () => null,\n}) => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const { addCashflowEvent, addCashflowSequence, addScheduledPayment } = useRecurringActivityStore()\n\n const { filter, setFilter, transactions } = useTransactionStore()\n\n const [isSelectTransactionOpen, setIsSelectTransactionOpen] = React.useState(false)\n const [transactionGuid, setTransactionGuid] = React.useState('')\n const [frequency, setFrequency] = React.useState(RecurrenceTypes.EveryMonth)\n const [nextDate, setNextDate] = React.useState<Date | null>(null)\n\n const transaction = React.useMemo(\n () => transactions.find((t) => t.guid === transactionGuid),\n [transactionGuid],\n )\n\n const handleOpen = () => {\n setIsSelectTransactionOpen(true)\n\n if (isIncome) {\n setFilter({ ...filter, custom: incomeFilter })\n } else {\n setFilter({ ...filter, custom: expenseFilter })\n }\n }\n\n const handleAddActivity = async () => {\n onAddActivity()\n\n if (!transaction || !nextDate) {\n closeOnAdd()\n return\n }\n\n if (isIncome) {\n // Create CashflowSequence & CashflowEvent if Income\n const sequence = buildNewCashflowSequence(transaction, frequency, nextDate)\n\n const newSequence = await addCashflowSequence(sequence)\n if (newSequence) {\n const event = buildNewCashflowEvent(newSequence, transaction)\n await addCashflowEvent(event)\n }\n } else {\n // Create ScheduledPayment if Expense\n const payment = buildNewScheduledPayment(transaction, frequency, nextDate)\n await addScheduledPayment(payment, transaction)\n }\n\n closeOnAdd()\n }\n\n const closeOnAdd = () => {\n setTransactionGuid('')\n setIsSelectTransactionOpen(false)\n }\n\n return (\n <Box>\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton onClick={handleOpen}>\n <ListItemText>\n <Stack alignItems=\"center\" direction=\"row\" justifyContent=\"space-between\">\n <Stack alignItems=\"center\" direction=\"row\" gap={8}>\n <Icon fill={true} name=\"add_box\" size={24} sx={{ color: 'action.active' }} />\n <Text bold={true} sx={{ color: 'action.active' }} variant=\"Body\">\n {label}\n </Text>\n </Stack>\n <Icon name=\"chevron_right\" size={24} sx={{ color: 'primary.light' }} />\n </Stack>\n </ListItemText>\n </ListItemButton>\n </ListItem>\n <Divider />\n\n <Drawer\n ariaLabelClose={recurringCopy.close_drawer_aria}\n isOpen={isSelectTransactionOpen}\n onClose={() => setIsSelectTransactionOpen(false)}\n title={label}\n >\n <SelectTransaction\n description={\n isIncome ? recurringCopy.add_income_description : recurringCopy.add_expense_description\n }\n onSearch={(searchValue) => {\n setFilter({\n ...filter,\n custom: (transaction: Transaction) => {\n if (isIncome) {\n return searchValue\n ? incomeFilterSearch(transaction, searchValue)\n : incomeFilter(transaction)\n } else {\n return searchValue\n ? expenseFilterSearch(transaction, searchValue)\n : expenseFilter(transaction)\n }\n },\n })\n }}\n onSelected={(guid) => setTransactionGuid(guid)}\n />\n </Drawer>\n\n <Drawer\n ariaLabelClose={recurringCopy.close_drawer_aria}\n isOpen={Boolean(transactionGuid)}\n onClose={() => setTransactionGuid('')}\n onPrimaryAction={handleAddActivity}\n title={isIncome ? recurringCopy.income_details : recurringCopy.expense_details}\n >\n {transaction && (\n <AddActivityDetails\n frequency={frequency}\n isIncome={isIncome}\n nextDate={nextDate}\n onFrequencyChange={setFrequency}\n onNextDateChange={setNextDate}\n transaction={transaction}\n />\n )}\n </Drawer>\n </Box>\n )\n}\n\nexport default observer(AddActivity)\n","import React from 'react'\nimport { parseISO } from 'date-fns/parseISO'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\n\nimport {\n Account,\n Activity,\n ActivityStatus,\n ActivityType,\n ANALYTICS_EVENTS,\n ScheduledPayment,\n Transaction,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useRecurringActivityStore,\n useTransactionStore,\n} from '../../../../common'\nimport ActivityRow from '../../ActivityRow'\nimport AddActivity from './AddActivity'\n\nconst buildExpenses = (\n accounts: Account[],\n payments: ScheduledPayment[],\n transactions: Transaction[],\n) => {\n return payments.map((payment) => {\n // TODO: Refactor to shared filter functions\n const transaction = transactions.find((t) => t.scheduled_payment_guid === payment.guid)\n const account = accounts.find((a) => a.guid === transaction?.account_guid)\n\n return {\n activityStatus: ActivityStatus.Upcoming,\n activityType: ActivityType.Expense,\n amount: payment.amount,\n categoryGuid: transaction?.category_guid,\n expectedDate: parseISO(payment.occurs_on),\n name: payment.description,\n institution: account?.user_name,\n institutionGuid: account?.institution_guid,\n merchantGuid: payment.merchant_guid,\n recurrenceType: payment.recurrence_type,\n recurrenceDay: payment.recurrence_day,\n scheduledPaymentGuid: payment.guid,\n } as Activity\n })\n}\n\nconst ManageExpenses = () => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const { scheduledPayments } = useRecurringActivityStore()\n const { transactions } = useTransactionStore()\n const { selectedAccounts } = useGlobalUiStore()\n const { onEvent } = useEvent()\n\n const expenses = buildExpenses(selectedAccounts, scheduledPayments, transactions)\n\n const onActivityClick = (activity: Activity) => {\n onEvent(ANALYTICS_EVENTS.RECURRING_ACTIVITY_CLICK_EXPENSE, {\n transaction_guid: activity.transactionGuid,\n })\n }\n\n const onAddActivity = () => {\n onEvent(ANALYTICS_EVENTS.RECURRING_ACTIVITY_CLICK_ADD_EXPENSE)\n }\n\n return (\n <List sx={{ bgcolor: 'background.paper' }}>\n {expenses.map((expense, index) => (\n <React.Fragment key={expense.scheduledPaymentGuid}>\n <ActivityRow activity={expense} onActivityClick={onActivityClick} showOrdinal={true} />\n <Divider variant={index < expenses.length - 1 ? 'inset' : 'fullWidth'} />\n </React.Fragment>\n ))}\n <AddActivity label={recurringCopy.add_expense} onAddActivity={onAddActivity} />\n </List>\n )\n}\n\nexport default observer(ManageExpenses)\n","import { addDays } from 'date-fns/addDays'\nimport { addMonths } from 'date-fns/addMonths'\nimport { addQuarters } from 'date-fns/addQuarters'\nimport { addWeeks } from 'date-fns/addWeeks'\nimport { addYears } from 'date-fns/addYears'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { isAfter } from 'date-fns/isAfter'\nimport { isBefore } from 'date-fns/isBefore'\nimport { isWithinInterval } from 'date-fns/isWithinInterval'\nimport { nextDay } from 'date-fns/nextDay'\nimport { parseISO } from 'date-fns/parseISO'\nimport { setDate } from 'date-fns/setDate'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subDays } from 'date-fns/subDays'\nimport { subWeeks } from 'date-fns/subWeeks'\nimport { Day } from 'date-fns/types'\n\nimport {\n type Account,\n type Activity,\n ActivityStatus,\n ActivityType,\n type CashflowEvent,\n type CashflowSequence,\n RecurrenceTypes,\n type ScheduledPayment,\n type Transaction,\n} from '../../common'\n\nimport { fromUnixUTC } from '../../common/utils/DateUtil'\n\nconst buildInstitutionName = (account: Account) => {\n let name = account.user_name || account.feed_name || ''\n if (account.account_number) {\n name = `${name} *${account.account_number}`\n }\n return name\n}\n\nexport const getRecurrenceType = (sequence?: CashflowSequence) => {\n if (!sequence) return RecurrenceTypes.Unknown\n\n if (sequence.repeat_interval === '1') return RecurrenceTypes.EveryWeek\n if (sequence.repeat_interval === '2') return RecurrenceTypes.EveryOtherWeek\n if (sequence.repeat_day && !sequence.repeat_month && !sequence.repeat_interval)\n return RecurrenceTypes.EveryMonth\n if (sequence.repeat_day && sequence.repeat_interval === '3') return RecurrenceTypes.EveryQuarter\n if (sequence.repeat_day && sequence.repeat_month) return RecurrenceTypes.EveryYear\n\n return RecurrenceTypes.Unknown\n}\n\nexport const buildActivities = (\n accounts: Account[],\n events: CashflowEvent[],\n payments: ScheduledPayment[],\n projected: CashflowEvent[],\n sequences: CashflowSequence[],\n transactions: Transaction[],\n): Activity[] => {\n // Add paid income\n const paidIncome = events\n .filter((e) => {\n const sequence = sequences.find((s) => s.guid === e.cashflow_sequence_guid)\n const transaction = transactions.find((t) => t.guid === e.transaction_guid)\n\n return sequence?.end_date === null && transaction\n })\n .map((e) => {\n const sequence = sequences.find((s) => s.guid === e.cashflow_sequence_guid)\n const transaction = transactions.find((t) => t.guid === e.transaction_guid)\n const account = accounts.find((a) => a.guid === transaction?.account_guid)\n\n return {\n accountGuid: sequence?.account_guid || account?.guid,\n activityStatus: ActivityStatus.Paid,\n activityType: ActivityType.Income,\n amount: e.amount,\n categoryGuid: e.category_guid,\n expectedDate: fromUnixUTC(e.expected_date),\n occurredOnDate: e.occurred_on ? fromUnixUTC(e.occurred_on) : undefined,\n name: e.name,\n institution: account ? buildInstitutionName(account) : undefined,\n institutionGuid: account?.institution_guid,\n merchantGuid: transaction?.merchant_guid || undefined,\n recurrenceType: getRecurrenceType(sequence),\n recurrenceDay: sequence?.repeat_day ? Number(sequence?.repeat_day) : undefined,\n sequenceGuid: sequence?.guid,\n transactionGuid: e.transaction_guid,\n }\n })\n\n // Add expected income for the next 30 days\n const upcomingIncome = projected\n .filter((e) =>\n isWithinInterval(fromUnixTime(e.expected_date), {\n start: startOfMonth(startOfToday()),\n end: addDays(startOfToday(), 30),\n }),\n )\n .filter((e) => {\n const sequence = sequences.find((s) => s.guid === e.cashflow_sequence_guid)\n const actual = events.find(\n (a) => a.cashflow_sequence_guid === sequence?.guid && a.expected_date === e.expected_date,\n )\n return sequence?.end_date === null && !actual\n })\n .map((e) => {\n const sequence = sequences.find((s) => s.guid === e.cashflow_sequence_guid)\n // Find a past event to fill in account and merchant information\n const pastEvent = events.find(\n (p) => p.cashflow_sequence_guid === e.cashflow_sequence_guid && Boolean(p.transaction_guid),\n )\n const transaction = transactions.find((t) => t.guid === pastEvent?.transaction_guid)\n const account = accounts.find((a) => a.guid === transaction?.account_guid)\n\n return {\n accountGuid: sequence?.account_guid || account?.guid,\n activityStatus: ActivityStatus.Upcoming,\n activityType: ActivityType.Income,\n amount: e.amount,\n categoryGuid: e.category_guid,\n expectedDate: fromUnixUTC(e.expected_date),\n name: e.name,\n institution: account ? buildInstitutionName(account) : undefined,\n institutionGuid: account?.institution_guid,\n merchantGuid: transaction?.merchant_guid || undefined,\n recurrenceType: getRecurrenceType(sequence),\n recurrenceDay: sequence?.repeat_day ? Number(sequence?.repeat_day) : undefined,\n sequenceGuid: sequence?.guid,\n transactionGuid: undefined,\n }\n })\n\n // Add scheduled payments for the next 30 days\n const expenses = [] as Activity[]\n\n if (payments) {\n payments.forEach((payment) => expenses.push(...buildExpenses(accounts, payment, transactions)))\n }\n\n const activities = [...paidIncome, ...upcomingIncome, ...expenses] as Activity[]\n\n return activities.sort(\n (a, b) =>\n getUnixTime(a.occurredOnDate || a.expectedDate) -\n getUnixTime(b.occurredOnDate || b.expectedDate),\n )\n}\n\nconst buildExpenses = (\n accounts: Account[],\n payment: ScheduledPayment,\n transactions: Transaction[],\n): Activity[] => {\n const expenses = [] as Activity[]\n\n const pastTransaction = transactions.find((t) => t.scheduled_payment_guid === payment.guid)\n if (!pastTransaction) return []\n\n const account = accounts.find((a) => a.guid === pastTransaction?.account_guid)\n const occursOn = parseISO(payment.occurs_on)\n const baseExpense = {\n accountGuid: account?.guid,\n activityStatus: ActivityStatus.Upcoming,\n activityType: ActivityType.Expense,\n amount: payment.amount,\n categoryGuid: pastTransaction?.category_guid,\n expectedDate: occursOn,\n name: payment.description,\n institution: account ? buildInstitutionName(account) : undefined,\n institutionGuid: account?.institution_guid,\n merchantGuid: payment.merchant_guid,\n recurrenceType: payment.recurrence_type,\n recurrenceDay: payment.recurrence_day,\n scheduledPaymentGuid: payment.guid,\n transactionGuid: '',\n }\n\n const day = payment.recurrence_day\n const today = startOfToday()\n const startDate = startOfMonth(startOfToday())\n const endDate = addDays(startOfToday(), 30)\n\n let nextDate = startDate\n switch (payment.recurrence_type) {\n case RecurrenceTypes.EveryWeek:\n // Add upcoming expenses for each week in the current month + next month\n nextDate = nextDay(nextDate, day as Day)\n while (isBefore(nextDate, endDate)) {\n expenses.push({\n ...baseExpense,\n expectedDate: nextDate,\n })\n nextDate = nextDay(nextDate, day as Day)\n }\n break\n case RecurrenceTypes.EveryOtherWeek:\n // Add upcoming expense for every other week in current month + next month\n if (isBefore(occursOn, startDate)) {\n nextDate = addWeeks(occursOn, 2)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n expenses.push({\n ...baseExpense,\n expectedDate: nextDate,\n })\n }\n nextDate = addWeeks(nextDate, 2)\n }\n } else {\n // Add for occurs_on\n expenses.push({\n ...baseExpense,\n expectedDate: occursOn,\n })\n // Add past starting at occurs_on\n nextDate = subWeeks(occursOn, 2)\n while (isAfter(nextDate, startDate)) {\n expenses.push({\n ...baseExpense,\n expectedDate: nextDate,\n })\n nextDate = subWeeks(nextDate, 2)\n }\n\n // Add future starting at occurs_on\n nextDate = addWeeks(occursOn, 2)\n while (isBefore(nextDate, endDate)) {\n expenses.push({\n ...baseExpense,\n expectedDate: nextDate,\n })\n nextDate = addWeeks(nextDate, 2)\n }\n }\n break\n case RecurrenceTypes.EveryMonth:\n // Add expense for current month and next month\n expenses.push({\n ...baseExpense,\n expectedDate: setDate(nextDate, day),\n })\n expenses.push({\n ...baseExpense,\n expectedDate: addMonths(setDate(nextDate, day), 1),\n })\n break\n case RecurrenceTypes.EveryOtherMonth:\n // Use occurs_on to calculate next expense\n if (isBefore(occursOn, startDate)) {\n if (isBefore(addMonths(occursOn, 2), endDate)) {\n expenses.push({\n ...baseExpense,\n expectedDate: addMonths(occursOn, 2),\n })\n }\n } else if (isBefore(occursOn, endDate)) {\n expenses.push({\n ...baseExpense,\n expectedDate: occursOn,\n })\n }\n break\n case RecurrenceTypes.EveryQuarter:\n // Use occurs_on to calculate next expense\n if (isBefore(occursOn, startDate)) {\n if (isBefore(addQuarters(occursOn, 1), endDate)) {\n expenses.push({\n ...baseExpense,\n expectedDate: addQuarters(occursOn, 1),\n })\n }\n } else if (isBefore(occursOn, endDate)) {\n expenses.push({\n ...baseExpense,\n expectedDate: occursOn,\n })\n }\n break\n case RecurrenceTypes.EveryOtherQuarter:\n // Use occurs_on to calculate next expense\n if (isBefore(occursOn, startDate)) {\n if (isBefore(addQuarters(occursOn, 2), endDate)) {\n expenses.push({\n ...baseExpense,\n expectedDate: addQuarters(occursOn, 2),\n })\n }\n } else if (isBefore(occursOn, endDate)) {\n expenses.push({\n ...baseExpense,\n expectedDate: occursOn,\n })\n }\n break\n case RecurrenceTypes.EveryYear:\n // Use occurs_on to calculate next expense\n if (isBefore(occursOn, startDate)) {\n if (isBefore(addYears(occursOn, 1), endDate)) {\n expenses.push({\n ...baseExpense,\n expectedDate: addYears(occursOn, 1),\n })\n }\n } else if (isBefore(occursOn, endDate)) {\n expenses.push({\n ...baseExpense,\n expectedDate: occursOn,\n })\n }\n break\n }\n\n expenses.forEach((exp) => {\n const transaction = transactions.find(\n (t) =>\n t.scheduled_payment_guid === exp.scheduledPaymentGuid &&\n t.date > getUnixTime(subDays(exp.expectedDate, 3)) &&\n t.date < getUnixTime(addDays(exp.expectedDate, 3)),\n )\n if (transaction) {\n exp.transactionGuid = transaction.guid\n exp.occurredOnDate = fromUnixTime(transaction.date)\n exp.activityStatus = ActivityStatus.Paid\n } else if (isBefore(exp.expectedDate, subDays(today, 3))) {\n exp.activityStatus = ActivityStatus.Missed\n }\n })\n\n return expenses\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\n\nimport {\n Account,\n Activity,\n ActivityStatus,\n ActivityType,\n ANALYTICS_EVENTS,\n CashflowEvent,\n CashflowSequence,\n Transaction,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useRecurringActivityStore,\n useTransactionStore,\n} from '../../../../common'\nimport { fromUnixUTC } from '../../../../common/utils/DateUtil'\nimport { getRecurrenceType } from '../../../util/buildActivities'\nimport ActivityRow from '../../ActivityRow'\nimport AddActivity from './AddActivity'\n\nconst buildIncome = (\n accounts: Account[],\n events: CashflowEvent[],\n projectedEvents: CashflowEvent[],\n sequences: CashflowSequence[],\n transactions: Transaction[],\n) => {\n return sequences.map((sequence) => {\n const event = events.find((e) => e.cashflow_sequence_guid === sequence.guid)\n const projected = projectedEvents.find((e) => e.cashflow_sequence_guid === sequence.guid)\n const transaction = transactions.find((t) => t.guid === event?.transaction_guid)\n const account = accounts.find((a) => a.guid === transaction?.account_guid)\n\n // Fallback in case both event and projected are null, which should never happen\n let expectedDate = new Date()\n if (event) {\n expectedDate = fromUnixUTC(event.expected_date)\n } else if (projected) {\n expectedDate = fromUnixUTC(projected.expected_date)\n }\n return {\n activityStatus: ActivityStatus.Upcoming,\n activityType: ActivityType.Income,\n amount: sequence.amount,\n categoryGuid: event?.category_guid,\n expectedDate: expectedDate,\n name: sequence.name,\n institution: account?.user_name,\n institutionGuid: account?.institution_guid,\n merchantGuid: transaction?.merchant_guid,\n recurrenceType: getRecurrenceType(sequence),\n recurrenceDay: Number(sequence.repeat_day),\n sequenceGuid: sequence.guid,\n } as Activity\n })\n}\n\nconst ManageIncome = () => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const { selectedAccounts } = useGlobalUiStore()\n const { cashflowEvents, cashflowSequences, projectedEvents } = useRecurringActivityStore()\n const { transactions } = useTransactionStore()\n const { onEvent } = useEvent()\n\n const income = buildIncome(\n selectedAccounts,\n cashflowEvents,\n projectedEvents,\n cashflowSequences.filter((cs) => !cs.end_date),\n transactions,\n )\n\n const onActivityClick = (activity: Activity) => {\n onEvent(ANALYTICS_EVENTS.RECURRING_ACTIVITY_CLICK_INCOME, {\n transaction_guid: activity.transactionGuid,\n })\n }\n\n const onAddActivity = () => {\n onEvent(ANALYTICS_EVENTS.RECURRING_ACTIVITY_CLICK_ADD_INCOME)\n }\n\n return (\n <List sx={{ bgcolor: 'background.paper' }}>\n {income.map((item, index) => (\n <React.Fragment key={item.sequenceGuid}>\n <ActivityRow activity={item} onActivityClick={onActivityClick} showOrdinal={true} />\n <Divider variant={index < income.length - 1 ? 'inset' : 'fullWidth'} />\n </React.Fragment>\n ))}\n <AddActivity isIncome={true} label={recurringCopy.add_income} onAddActivity={onAddActivity} />\n </List>\n )\n}\n\nexport default observer(ManageIncome)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\n\nimport ManageExpenses from './activitysettings/ManageExpenses'\nimport ManageIncome from './activitysettings/ManageIncome'\nimport { useEvent, useGlobalCopyStore } from '../../../common'\n\nconst ActivitySettings = () => {\n const [selectedTab, setSelectedTab] = React.useState(0)\n const { onEvent } = useEvent()\n const { recurring: recurringCopy } = useGlobalCopyStore()\n\n const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => {\n setSelectedTab(newValue)\n onEvent(\n newValue === 0\n ? 'recurring_transactions_widget_manage_expenses'\n : 'recurring_transactions_widget_edit_income',\n )\n }\n\n return (\n <Box bgcolor=\"background.default\" height=\"100%\">\n <Tabs\n onChange={handleTabChange}\n sx={{ bgcolor: 'background.paper' }}\n value={selectedTab}\n variant=\"fullWidth\"\n >\n <Tab label={recurringCopy.manage_expenses} />\n <Tab label={recurringCopy.manage_income} />\n </Tabs>\n {selectedTab === 0 && <ManageExpenses />}\n {selectedTab === 1 && <ManageIncome />}\n </Box>\n )\n}\n\nexport default observer(ActivitySettings)\n","import { addDays } from 'date-fns/addDays'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { isWithinInterval } from 'date-fns/isWithinInterval'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\n\nimport { type Activity, ActivityType } from '../../common'\n\n// This adds up the total amount in a list of activities\nexport const totalReducer = (acc: number, curr: Activity) => acc + curr.amount\n\n// This filters activity to income during the current month\n// This is used by the Income activity bar\nexport const incomeFilter = (i: Activity) =>\n i.activityType === ActivityType.Income &&\n isWithinInterval(i.expectedDate, {\n start: startOfMonth(startOfToday()),\n end: endOfMonth(startOfToday()),\n })\n\n// This filters activity to expenses during the current month\n// This is used by the Expense activity bar\nexport const expenseFilter = (i: Activity) =>\n i.activityType === ActivityType.Expense &&\n isWithinInterval(i.expectedDate, {\n start: startOfMonth(startOfToday()),\n end: endOfMonth(startOfToday()),\n })\n\n// This filters all activity to the current month plus the next 30 days\nexport const dateFilter = (a: Activity) =>\n (a.occurredOnDate &&\n isWithinInterval(a.occurredOnDate, {\n start: startOfMonth(new Date()),\n end: addDays(startOfToday(), 30),\n })) ||\n isWithinInterval(a.expectedDate, {\n start: startOfMonth(new Date()),\n end: addDays(startOfToday(), 30),\n })\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { isSameDay } from 'date-fns/isSameDay'\n\nimport Badge from '@mui/material/Badge'\nimport { PickersDay, PickersDayProps } from '@mui/x-date-pickers/PickersDay'\n\nimport {\n ActivityStatus,\n ActivityType,\n useGlobalCopyStore,\n useGlobalUiStore,\n useRecurringActivityStore,\n} from '../../../common'\nimport { IncomeBadge, MissedBadge, PaidBadge, UpcomingExpenseBadge } from '../ActivityBadges'\n\nconst ActivityDay: React.FC<PickersDayProps<Date>> = ({ day, outsideCurrentMonth, ...other }) => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const { selectedAccountGuids } = useGlobalUiStore()\n const { activities, setSelectedDay } = useRecurringActivityStore()\n\n const filteredActivities = React.useMemo(\n () =>\n activities.filter((activity) => selectedAccountGuids.includes(activity.accountGuid || '')),\n [selectedAccountGuids, activities],\n )\n\n const dayActivities = filteredActivities.filter((a) =>\n isSameDay(a.occurredOnDate || a.expectedDate, day),\n )\n const hasUpcoming = dayActivities.some(\n (a) => a.activityType === ActivityType.Expense && a.activityStatus === ActivityStatus.Upcoming,\n )\n const hasMissed = dayActivities.some(\n (a) => a.activityType === ActivityType.Expense && a.activityStatus === ActivityStatus.Missed,\n )\n const hasPaid = dayActivities.some(\n (a) => a.activityType === ActivityType.Expense && a.activityStatus === ActivityStatus.Paid,\n )\n const hasIncome = dayActivities.some((a) => a.activityType === ActivityType.Income)\n\n const totalBadges =\n (hasUpcoming ? 1 : 0) + (hasMissed ? 1 : 0) + (hasPaid ? 1 : 0) + (hasIncome ? 1 : 0)\n\n return (\n <Badge\n badgeContent={\n dayActivities.length > 0 && (\n <>\n {hasMissed && <MissedBadge isOffset={true} />}\n {hasPaid && <PaidBadge isOffset={true} />}\n {hasUpcoming && <UpcomingExpenseBadge isOffset={true} />}\n {hasIncome && <IncomeBadge isOffset={true} />}\n </>\n )\n }\n overlap=\"circular\"\n sx={{\n '& .MuiBadge-badge': {\n padding: 0,\n marginRight: `${(totalBadges - 1) * 6 + 1}px`,\n flexWrap: 'nowrap',\n },\n }}\n >\n <PickersDay\n aria-label={`\n ${hasPaid && recurringCopy.paid}, \n ${hasMissed && recurringCopy.missed}, \n ${hasUpcoming && recurringCopy.upcoming}, \n ${hasIncome && recurringCopy.income}`}\n day={day}\n onClick={() => setSelectedDay(day)}\n outsideCurrentMonth={outsideCurrentMonth}\n sx={{\n '&.MuiPickersDay-root': {\n ...(outsideCurrentMonth && {\n color: 'text.disabled',\n }),\n },\n }}\n {...other}\n />\n </Badge>\n )\n}\n\nexport default observer(ActivityDay)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@kyper/mui'\nimport { IncomeBadge, MissedBadge, PaidBadge, UpcomingExpenseBadge } from '../ActivityBadges'\nimport { useGlobalCopyStore } from '../../../common'\n\ninterface SymbolProps {\n icon: any\n label: string\n}\n\nconst Symbol: React.FC<SymbolProps> = ({ icon: Icon, label }) => (\n <Stack alignItems=\"center\" flexDirection=\"row\" sx={{ gap: 6 }}>\n <Icon />\n <Text variant=\"XSmall\">{label}</Text>\n </Stack>\n)\n\nconst Legend = () => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n\n return (\n <Stack\n alignItems=\"center\"\n aria-hidden={true}\n flexDirection=\"row\"\n gap={16}\n justifyContent=\"center\"\n mt={12}\n >\n <Symbol icon={UpcomingExpenseBadge} label={recurringCopy.expense} />\n <Symbol icon={IncomeBadge} label={recurringCopy.income} />\n <Symbol icon={MissedBadge} label={recurringCopy.missed} />\n <Symbol icon={PaidBadge} label={recurringCopy.paid} />\n </Stack>\n )\n}\n\nexport default observer(Legend)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { addMonths } from 'date-fns/addMonths'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { getWeeksInMonth } from 'date-fns/getWeeksInMonth'\nimport { startOfMonth } from 'date-fns/startOfMonth'\n\nimport Stack from '@mui/material/Stack'\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3'\nimport { DateCalendar } from '@mui/x-date-pickers/DateCalendar'\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'\n\nimport {\n ANALYTICS_EVENTS,\n TOUCH_TARGET,\n useEvent,\n useRecurringActivityStore,\n} from '../../../common'\nimport ActivityDay from './ActivityDay'\nimport Legend from './Legend'\n\nconst HEADER_HEIGHT = 58\n\nconst ActivityCalendar = () => {\n const theme = useTheme()\n const { onEvent } = useEvent()\n const { selectedDay } = useRecurringActivityStore()\n const [calendarHeight, setCalendarHeight] = React.useState(\n getWeeksInMonth(new Date()) * TOUCH_TARGET + HEADER_HEIGHT,\n )\n\n const handleMonthChange = (date: Date) => {\n setCalendarHeight(getWeeksInMonth(date) * TOUCH_TARGET + HEADER_HEIGHT)\n onEvent(ANALYTICS_EVENTS.RECURRING_ACTIVITY_CLICK_CALENDAR_RIGHT)\n }\n\n const calendar = (\n <DateCalendar\n maxDate={endOfMonth(addMonths(new Date(), 1))}\n minDate={startOfMonth(new Date())}\n onMonthChange={handleMonthChange}\n showDaysOutsideCurrentMonth={true}\n slots={{\n day: ActivityDay,\n }}\n sx={{\n '& .MuiButtonBase-root.MuiPickersDay-root': {\n borderRadius: '4px',\n '&:focus, &:hover': {\n borderRadius: '4px',\n },\n },\n '& .MuiPickersCalendarHeader-root': {\n mt: 0,\n pl: 16,\n pr: 8,\n },\n '& .MuiPickersCalendarHeader-label': {\n fontSize: theme.typography.Body.fontSize,\n fontWeight: 600,\n },\n '& .MuiDayCalendar-slideTransition': {\n minHeight: calendarHeight,\n },\n '&.MuiDateCalendar-root': {\n minHeight: calendarHeight + TOUCH_TARGET,\n },\n '& .MuiButtonBase-root, .MuiDayCalendar-weekDayLabel': {\n height: TOUCH_TARGET,\n width: TOUCH_TARGET,\n margin: 0,\n },\n '& .MuiDayCalendar-weekDayLabel': {\n fontFamily: theme.typography.H3.fontFamily,\n fontSize: theme.typography.Small.fontSize,\n },\n }}\n value={selectedDay}\n views={['day']}\n />\n )\n\n return (\n <Stack justifyContent=\"center\">\n <LocalizationProvider dateAdapter={AdapterDateFns}>\n {/*NOTE: This seems odd, but because the DateCalendar cannot go from a controlled\n /* calendar to an un-controlled calendar, we have to create 2 different instances\n /* when there a selectedDay and when selectedDay is undefined */}\n {selectedDay && calendar}\n {!selectedDay && calendar}\n\n <Legend />\n </LocalizationProvider>\n </Stack>\n )\n}\n\nexport default observer(ActivityCalendar)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Button from '@mui/material/Button'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport ListSubheader from '@mui/material/ListSubheader'\nimport Stack from '@mui/material/Stack'\nimport { SxProps } from '@mui/material/styles'\n\nimport { Text } from '@kyper/mui'\n\nimport { type Activity, DATE_FORMATS_INTL, formatDate, useGlobalCopyStore } from '../../common'\nimport ActivityRow from './ActivityRow'\n\ninterface ActivityListProps {\n activities: Activity[]\n isMini?: boolean\n onResetClick?: () => void\n onActivityClick?: (activity: Activity) => void\n sx?: SxProps\n title?: string\n}\n\ninterface GroupedActivity {\n activities: Activity[]\n id: string\n expectedDate: Date\n}\n\nconst groupActivitiesByDate = (activities: Activity[]): GroupedActivity[] => {\n return activities.reduce((groupedActivities: GroupedActivity[], activity) => {\n const dateString = activity.expectedDate.toISOString().split('T')[0]\n const existingGroup = groupedActivities.find(\n (group) => group.expectedDate.toString() === activity.expectedDate.toString(),\n )\n\n if (existingGroup) {\n existingGroup.activities.push(activity)\n } else {\n groupedActivities.push({\n expectedDate: activity.expectedDate,\n id: `date-${dateString}`,\n activities: [activity],\n })\n }\n\n return groupedActivities\n }, [])\n}\n\nconst ActivityList: React.FC<ActivityListProps> = ({\n activities,\n isMini = false,\n onResetClick,\n onActivityClick,\n sx = {},\n title,\n}) => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const groupedActivities = groupActivitiesByDate(activities)\n\n return (\n <Stack gap={8} mt={4} sx={sx}>\n {title && (\n <Stack alignItems=\"top\" direction=\"row\" justifyContent=\"space-between\" px={24}>\n <Text bold={true} variant=\"Body\">\n {title}\n </Text>\n {onResetClick && (\n <Button onClick={onResetClick} sx={{ mt: -12 }} variant=\"text\">\n {recurringCopy.reset}\n </Button>\n )}\n </Stack>\n )}\n\n {activities.length === 0 ? (\n <Text fontStyle=\"italic\" py={24} sx={{ textAlign: 'center' }}>\n {recurringCopy.no_activities}\n </Text>\n ) : (\n <List>\n {isMini\n ? activities.map((item, index) => (\n <>\n <ActivityRow\n activity={item}\n isMini={isMini}\n key={item.expectedDate.toString() + index}\n onActivityClick={onActivityClick}\n />\n <Divider sx={{ mx: 24 }} />\n </>\n ))\n : groupedActivities.map((day) => {\n return (\n <>\n <ListItem key={day.id}>\n <List\n subheader={\n <ListSubheader sx={{ bgcolor: 'background.paper', ml: 8, pb: 4, pt: 12 }}>\n <Text bold={true} variant=\"XSmall\">\n {formatDate(\n day.activities[0].occurredOnDate || day.activities[0].expectedDate,\n DATE_FORMATS_INTL.DAY_OF_WEEK_MONTH_DAY,\n )}\n </Text>\n </ListSubheader>\n }\n sx={{ width: '100%' }}\n >\n {day.activities.map((activity: Activity, i: number) => {\n return (\n <>\n <ActivityRow\n activity={activity}\n isMini={isMini}\n key={activity.expectedDate.toString() + i}\n onActivityClick={onActivityClick}\n />\n {i !== day.activities.length - 1 && (\n <Divider sx={{ ml: 64, mr: 24 }} />\n )}\n </>\n )\n })}\n </List>\n </ListItem>\n <Divider sx={{ mx: 24 }} />\n </>\n )\n })}\n </List>\n )}\n </Stack>\n )\n}\n\nexport default observer(ActivityList)\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 useTheme from '@mui/material/styles/useTheme'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport { formatCurrency, StatusBar, useGlobalCopyStore } from '../../common'\n\ninterface ActivityStatusProps {\n title: string\n expected: number\n paid: number\n missed?: number\n total: number\n onNewClick?: () => void\n}\n\nconst ActivityStatus: React.FC<ActivityStatusProps> = ({\n title,\n expected,\n paid,\n missed,\n total,\n onNewClick,\n}) => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const theme = useTheme()\n\n const data = React.useMemo(() => {\n const activity = [{ color: theme.palette.success.main, percentage: `${paid / expected}` }]\n if (missed) {\n activity.push({ color: theme.palette.error.main, percentage: `${missed / expected}` })\n }\n return activity\n }, [paid, expected, missed])\n\n return (\n <Box px={24}>\n <Stack direction=\"row\" justifyContent=\"space-between\">\n <Box>\n <Text bold={true} variant=\"Body\">\n {`${total} ${title}`}\n </Text>\n <Stack direction=\"row\" gap={2} mb={8}>\n <Text bold={true} variant=\"XSmall\">\n {formatCurrency(paid, '0,0.00')}\n </Text>\n <Text variant=\"XSmall\">{recurringCopy.paid?.toLowerCase()}</Text>\n\n {missed !== undefined && (\n <>\n <Text variant=\"XSmall\">/</Text>\n <Text bold={true} variant=\"XSmall\">\n {formatCurrency(missed, '0,0.00')}\n </Text>\n <Text variant=\"XSmall\">{recurringCopy.missed?.toLowerCase()}</Text>\n </>\n )}\n\n <Text variant=\"XSmall\">/</Text>\n <Text bold={true} variant=\"XSmall\">\n {formatCurrency(expected, '0,0.00')}\n </Text>\n <Text variant=\"XSmall\">{recurringCopy.expected}</Text>\n </Stack>\n </Box>\n {onNewClick && (\n <Button onClick={onNewClick} startIcon={<Icon name=\"add\" />} variant=\"text\">\n {recurringCopy.add_new}\n </Button>\n )}\n </Stack>\n <StatusBar data={data} />\n </Box>\n )\n}\n\nexport default observer(ActivityStatus)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Grid from '@mui/material/Unstable_Grid2'\nimport Stack from '@mui/material/Stack'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\n\nimport { Text } from '@kyper/mui'\n\nimport {\n Activity,\n ANALYTICS_EVENTS,\n buildDynamicCopy,\n DATE_FORMATS_INTL,\n formatDate,\n useEvent,\n useGlobalCopyStore,\n useRecurringActivityStore,\n useScreenSize,\n} from '../../common'\n\nimport {\n dateFilter,\n expenseFilter,\n incomeFilter,\n totalReducer,\n} from '../util/RecurringActivityUtils'\n\nimport ActivityCalendar from './activitycalendar/ActivityCalendar'\nimport ActivityList from './ActivityList'\nimport ActivityStatus from './ActivityStatus'\n\nconst RecurringActivity = () => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const { isMobile, isSmallTablet } = useScreenSize()\n\n const {\n activities,\n missedActivities,\n paidActivities,\n selectedDay,\n selectedDayActivities,\n setSelectedDay,\n upcomingActivities,\n } = useRecurringActivityStore()\n\n const [selectedTab, setSelectedTab] = React.useState(0)\n const { onEvent } = useEvent()\n\n const all = activities.filter(dateFilter)\n const paid = paidActivities.filter(dateFilter)\n const missed = missedActivities.filter(dateFilter)\n\n const expenseExpected = all.filter(expenseFilter).reduce(totalReducer, 0)\n const expensePaid = paid.filter(expenseFilter).reduce(totalReducer, 0)\n const expenseMissed = missed.filter(expenseFilter).reduce(totalReducer, 0)\n const numExpenses = all.filter(expenseFilter).length\n\n const incomeExpected = all.filter(incomeFilter).reduce(totalReducer, 0)\n const incomePaid = paid.filter(incomeFilter).reduce(totalReducer, 0)\n const numIncome = all.filter(incomeFilter).length\n\n const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => {\n setSelectedTab(newValue)\n }\n\n const onUpcomingActivityClick = (activity: Activity) => {\n onEvent(ANALYTICS_EVENTS.RECURRING_ACTIVITY_CLICK_UPCOMING, {\n transaction_guid: activity.transactionGuid,\n })\n }\n\n const onPaidActivityClick = (activity: Activity) => {\n onEvent(ANALYTICS_EVENTS.RECURRING_ACTIVITY_CLICK_PAID, {\n transaction_guid: activity.transactionGuid,\n })\n }\n\n return (\n <Grid container={true} pt={16} px={24} spacing={24}>\n <Grid md={true} sm={12}>\n <Stack gap={24}>\n <ActivityStatus\n expected={expenseExpected}\n missed={expenseMissed}\n //onNewClick={() => {}} // TODO: Replace with function to add new expense\n paid={expensePaid}\n title={recurringCopy.expenses}\n total={numExpenses}\n />\n <ActivityStatus\n expected={incomeExpected}\n //onNewClick={() => {}} // TODO: Replace with function to add new income\n paid={incomePaid}\n title={recurringCopy.deposits}\n total={numIncome}\n />\n\n {!isSmallTablet && !isMobile && (\n <ActivityList\n activities={upcomingActivities}\n onActivityClick={onUpcomingActivityClick}\n title={recurringCopy.upcoming_activity}\n />\n )}\n\n {(isSmallTablet || isMobile) && (\n <Box>\n <Tabs onChange={handleTabChange} value={selectedTab} variant=\"fullWidth\">\n <Tab\n label={\n <Text bold={true} sx={{ textTransform: 'none' }} variant=\"Body\">\n {recurringCopy.upcoming_activity}\n </Text>\n }\n />\n <Tab\n label={\n <Text bold={true} sx={{ textTransform: 'none' }} variant=\"Body\">\n {recurringCopy.paid_activity}\n </Text>\n }\n />\n </Tabs>\n {selectedTab === 0 && (\n <ActivityList\n activities={upcomingActivities}\n onActivityClick={onUpcomingActivityClick}\n />\n )}\n {selectedTab === 1 && (\n <ActivityList activities={paid} onActivityClick={onPaidActivityClick} />\n )}\n </Box>\n )}\n </Stack>\n </Grid>\n\n {!isSmallTablet && !isMobile && (\n <Grid sx={{ minWidth: 450 }} xs=\"auto\">\n <Stack gap={35}>\n <ActivityCalendar />\n <ActivityList\n activities={selectedDayActivities || paid}\n onActivityClick={onPaidActivityClick}\n onResetClick={selectedDay ? () => setSelectedDay(selectedDay) : undefined}\n title={\n selectedDay\n ? (buildDynamicCopy(\n recurringCopy.day_transactions,\n formatDate(selectedDay, DATE_FORMATS_INTL.MONTH_DAY),\n ) as string)\n : recurringCopy.paid_activity\n }\n />\n </Stack>\n </Grid>\n )}\n </Grid>\n )\n}\n\nexport default observer(RecurringActivity)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { endOfToday } from 'date-fns/endOfToday'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subDays } from 'date-fns/subDays'\n\nimport Stack from '@mui/material/Stack'\nimport Skeleton from '@mui/material/Skeleton'\n\nimport {\n ANALYTICS_EVENTS,\n Drawer,\n useAccountStore,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useRecurringActivityStore,\n useTransactionStore,\n WidgetContainer,\n WidgetProps,\n} from '../common'\n\nimport ActivitySettings from './components/shared/ActivitySettings'\nimport RecurringActivity from './components/RecurringActivity'\n\nconst RecurringActivityWidget: React.FC<WidgetProps> = ({ onBackClick, sx = {} }) => {\n const { accounts } = useAccountStore()\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const { isInitialized, selectedAccountGuids, setSelectedAccounts } = useGlobalUiStore()\n const { setFilter } = useTransactionStore()\n const { isLoading } = useRecurringActivityStore()\n const { onEvent } = useEvent()\n\n React.useEffect(() => {\n setSelectedAccounts(accounts)\n }, [accounts])\n\n React.useEffect(() => {\n if (isInitialized) {\n setFilter({\n dateRange: { start: subDays(startOfToday(), 90), end: endOfToday() },\n accounts: selectedAccountGuids,\n })\n }\n }, [isInitialized, selectedAccountGuids])\n\n const [isSettingsOpen, setIsSettingsOpen] = React.useState(false)\n\n return (\n <WidgetContainer\n accountOptions={accounts}\n actions={[\n {\n label: recurringCopy.settings,\n iconName: 'settings',\n onClick: () => {\n setIsSettingsOpen(true)\n onEvent(ANALYTICS_EVENTS.RECURRING_ACTIVITY_CLICK_SETTINGS)\n },\n },\n ]}\n onAccountsFilterClick={() => onEvent(ANALYTICS_EVENTS.RECURRING_ACTIVITY_CLICK_FILTER)}\n onBackClick={onBackClick}\n sx={sx}\n title={recurringCopy.title}\n >\n {isInitialized || !isLoading ? (\n <RecurringActivity />\n ) : (\n <Stack direction=\"column\" p={48} spacing={24}>\n <Skeleton height={100} variant=\"rounded\" width=\"100%\" />\n <Skeleton height={100} variant=\"rounded\" width=\"100%\" />\n <Skeleton height={600} variant=\"rounded\" width=\"100%\" />\n </Stack>\n )}\n <Drawer\n ariaLabelClose={recurringCopy.close_drawer_aria}\n isOpen={isSettingsOpen}\n onClose={() => setIsSettingsOpen(false)}\n shouldShowHeaderBorders={false}\n title={recurringCopy.settings}\n >\n <ActivitySettings />\n </Drawer>\n </WidgetContainer>\n )\n}\n\nexport default observer(RecurringActivityWidget)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport Stack from '@mui/material/Stack'\n\nimport {\n buildDynamicCopy,\n DATE_FORMATS_INTL,\n formatDate,\n MiniWidgetProps,\n useGlobalCopyStore,\n useGlobalUiStore,\n useRecurringActivityStore,\n useWidgetContainerProvider,\n} from '../../common'\n\nimport ActivityCalendar from './activitycalendar/ActivityCalendar'\nimport ActivityList from './ActivityList'\n\nconst MiniWidgetContent: React.FC<MiniWidgetProps> = () => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const { selectedAccountGuids } = useGlobalUiStore()\n const { selectedDay, selectedDayActivities, setSelectedDay, upcomingActivities } =\n useRecurringActivityStore()\n\n const filteredUpcomingActivities = React.useMemo(\n () =>\n upcomingActivities.filter((activity) =>\n selectedAccountGuids.includes(activity.accountGuid || ''),\n ),\n [selectedAccountGuids, upcomingActivities],\n )\n\n const { availableWidth } = useWidgetContainerProvider()\n\n const isSmall = availableWidth < 750\n\n return (\n <Stack flexDirection={isSmall ? 'column' : 'row'} width=\"100%\">\n <ActivityCalendar />\n {!isSmall && <Divider flexItem={true} orientation=\"vertical\" sx={{ my: 16, ml: 16 }} />}\n <ActivityList\n activities={selectedDayActivities || filteredUpcomingActivities.slice(0, 4)}\n isMini={true}\n onResetClick={selectedDay ? () => setSelectedDay(selectedDay) : undefined}\n sx={{ width: isSmall ? '100%' : 'calc(100% - 336px)', mt: 12 }}\n title={\n selectedDay\n ? (buildDynamicCopy(\n recurringCopy.day_transactions,\n formatDate(selectedDay, DATE_FORMATS_INTL.MONTH_DAY),\n ) as string)\n : recurringCopy.upcoming_activity\n }\n />\n </Stack>\n )\n}\n\nexport default observer(MiniWidgetContent)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { endOfToday } from 'date-fns/endOfToday'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subDays } from 'date-fns/subDays'\n\nimport {\n MiniWidgetContainer,\n MiniWidgetProps,\n useGlobalCopyStore,\n useGlobalUiStore,\n useTransactionStore,\n} from '../common'\n\nimport MiniWidgetContent from './components/MiniWidgetContent'\n\nconst RecurringActivityMiniWidget: React.FC<MiniWidgetProps> = ({ onPrimaryCtaClick, sx }) => {\n const { recurring: recurringCopy } = useGlobalCopyStore()\n const { isInitialized, selectedAccountGuids } = useGlobalUiStore()\n const { setFilter } = useTransactionStore()\n\n React.useEffect(() => {\n if (isInitialized) {\n setFilter({\n dateRange: { start: subDays(startOfToday(), 90), end: endOfToday() },\n accounts: selectedAccountGuids,\n })\n }\n }, [isInitialized, selectedAccountGuids])\n\n return (\n <MiniWidgetContainer\n className=\"mx-exp-upcoming-activity-miniwidget\"\n onPrimaryCtaClick={onPrimaryCtaClick}\n primaryCtaLabel={recurringCopy.primary_cta}\n subTitle={recurringCopy.sub_title}\n sx={sx}\n title={recurringCopy.mini_title}\n >\n <MiniWidgetContent />\n </MiniWidgetContainer>\n )\n}\n\nexport default observer(RecurringActivityMiniWidget)\n","import { makeAutoObservable, runInAction } from 'mobx'\nimport { addDays } from 'date-fns/addDays'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { isAfter } from 'date-fns/isAfter'\nimport { isSameDay } from 'date-fns/isSameDay'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subDays } from 'date-fns/subDays'\n\nimport {\n type Activity,\n ActivityStatus,\n ActivityType,\n CashflowEvent,\n CashflowSequence,\n GlobalStore,\n isIncome,\n ScheduledPayment,\n ScheduledPaymentsApi,\n Transaction,\n TransactionType,\n} from '../../common'\nimport { CashflowApi } from '../../cashflow'\n\nimport { buildActivities } from '../util/buildActivities'\n\nexport class RecurringActivityStore {\n globalStore: GlobalStore\n api = new ScheduledPaymentsApi('/', '')\n cashflowApi = new CashflowApi('/', '')\n\n cashflowSequences: CashflowSequence[] = []\n cashflowEvents: CashflowEvent[] = []\n projectedEvents: CashflowEvent[] = []\n transactions: Transaction[] = []\n scheduledPayments: ScheduledPayment[] = []\n selectedDay: Date | undefined\n\n isLoading: boolean = true\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n\n makeAutoObservable(this)\n }\n\n initialize = async (endpoint: string, token: string) => {\n this.api = new ScheduledPaymentsApi(endpoint, token)\n this.cashflowApi = new CashflowApi(endpoint, token)\n\n this.loadActivity()\n }\n\n get activities() {\n if (!this.isLoading) {\n return buildActivities(\n this.globalStore.accountStore.accounts,\n this.cashflowEvents,\n this.scheduledPayments,\n this.projectedEvents,\n this.cashflowSequences,\n this.globalStore.transactionStore.transactions,\n )\n }\n return []\n }\n\n get paidActivities(): Activity[] {\n return this.activities.filter((a) => a.activityStatus === ActivityStatus.Paid)\n }\n\n get upcomingActivities(): Activity[] {\n return this.activities.filter((a) => a.activityStatus === ActivityStatus.Upcoming)\n }\n\n get missedActivities(): Activity[] {\n return this.activities.filter((a) => a.activityStatus === ActivityStatus.Missed)\n }\n\n get upcomingExpenses(): Activity[] {\n return this.upcomingActivities.filter((a) => a.activityType === ActivityType.Expense)\n }\n\n get upcomingIncome(): Activity[] {\n return this.upcomingActivities.filter((a) => a.activityType === ActivityType.Income)\n }\n\n get nextIncomeActivity(): Activity | undefined {\n return this.upcomingIncome.find((a) => isAfter(a.expectedDate, startOfToday()))\n }\n\n get selectedDayActivities(): Activity[] | undefined {\n return (\n this.selectedDay &&\n this.activities.filter(\n (a) => this.selectedDay && isSameDay(a.occurredOnDate || a.expectedDate, this.selectedDay),\n )\n )\n }\n\n get projectedIncome(): number {\n const categories = this.globalStore.categoryStore.categories\n return this.cashflowSequences\n .filter((cs) => cs.transaction_type === TransactionType.CREDIT)\n .filter((cs) => isIncome(categories, cs.category_guid || ''))\n .reduce((acc, current) => acc + current.amount, 0)\n }\n\n addCashflowEvent = async (cashflowEvent: CashflowEvent) => {\n try {\n const event = await this.cashflowApi.addCashflowEvent(cashflowEvent)\n\n runInAction(() => {\n this.cashflowEvents = [...this.cashflowEvents, event]\n })\n } catch (error) {\n console.error(`Error adding cashflow event: ${error}`)\n }\n }\n\n addCashflowSequence = async (\n cashflowSequence: CashflowSequence,\n ): Promise<CashflowSequence | undefined> => {\n try {\n const sequence = await this.cashflowApi.addCashflowSequence(cashflowSequence)\n\n // Reload all income activity\n await this.loadIncomeActivity()\n\n return sequence\n } catch (error) {\n console.error(`Error adding cashflow sequence: ${error}`)\n }\n return undefined\n }\n\n addScheduledPayment = async (scheduledPayemnt: ScheduledPayment, transaction: Transaction) => {\n try {\n const payment = await this.api.addScheduledPayment(scheduledPayemnt)\n await this.globalStore.transactionStore.updateTransaction({\n ...transaction,\n scheduled_payment_guid: payment.guid,\n })\n\n runInAction(() => {\n this.scheduledPayments = [...this.scheduledPayments, payment]\n })\n } catch (error) {\n console.error(`Error adding scheduled payment: ${error}`)\n }\n }\n\n deleteCashflowSequence = async (guid: string) => {\n try {\n await this.cashflowApi.deleteCashflowSequence(guid)\n\n // Reload all income activity\n await this.loadIncomeActivity()\n } catch (error) {\n console.error(`Error deleting cashflow sequence`)\n }\n }\n\n deleteScheduledPayment = async (guid: string) => {\n try {\n await this.api.deleteScheduledPayment(guid)\n\n runInAction(() => {\n const index = this.scheduledPayments.findIndex((sp) => sp.guid === guid)\n if (index >= 0) {\n this.scheduledPayments.splice(index, 1)\n }\n })\n } catch (error) {\n console.error(`Error deleting scheduled payent: ${error}`)\n }\n }\n\n loadActivity = () => {\n this.isLoading = true\n\n Promise.all([this.loadExpenseActivity(), this.loadIncomeActivity()]).finally(() =>\n runInAction(() => {\n this.isLoading = false\n }),\n )\n }\n\n loadExpenseActivity = async () => {\n await this.loadScheduledPayments()\n }\n\n loadIncomeActivity = async () => {\n await this.loadCashflowSequences()\n await this.loadExpectedEvents()\n await this.loadPaidEvents()\n }\n\n loadCashflowSequences = async () => {\n const sequences = await this.cashflowApi.getCashflowSequences()\n\n runInAction(() => {\n this.cashflowSequences = sequences.filter(\n (s) => s.transaction_type === TransactionType.CREDIT,\n )\n })\n }\n\n loadExpectedEvents = async () => {\n try {\n const events = await this.cashflowApi.getProjectedCashflowEvents(\n startOfMonth(startOfToday()),\n addDays(startOfToday(), 30),\n )\n\n runInAction(() => {\n this.projectedEvents = events.filter(\n (evt) => evt.transaction_type === TransactionType.CREDIT,\n )\n })\n } catch (error) {\n console.error(`Error occurred while getting projected events: ${error}`)\n }\n }\n\n loadPaidEvents = async () => {\n try {\n const events = await this.cashflowApi.getCashflowEventsByDateRange(\n subDays(startOfToday(), 90),\n endOfMonth(startOfToday()),\n )\n\n runInAction(() => {\n this.cashflowEvents = events.filter(\n (evt) => evt.transaction_type === TransactionType.CREDIT,\n )\n })\n } catch (error) {\n console.error(`Error occurred while getting cashflow events: ${error}`)\n }\n }\n\n loadScheduledPayments = async () => {\n try {\n const scheduledPayments = (await this.api.getScheduledPayments()) as ScheduledPayment[]\n\n runInAction(() => {\n this.scheduledPayments = scheduledPayments\n })\n } catch (error) {\n console.error(`Error occurred while getting scheduled payments: ${error}`)\n }\n }\n\n setSelectedDay = (day: Date) => {\n this.selectedDay = this.selectedDay && isSameDay(day, this.selectedDay) ? undefined : day\n }\n\n updateCashflowSequence = async (sequence: CashflowSequence) => {\n try {\n const hasEvents = Boolean(\n this.cashflowEvents.find((e) => e.cashflow_sequence_guid === sequence.guid),\n )\n\n if (hasEvents) {\n // Update existing sequence with enddate\n const existingSequence = this.cashflowSequences.find((c) => c.guid === sequence.guid)\n if (!existingSequence) return // TODO: Consider throwing an error\n\n const lastEvent = this.cashflowEvents.findLast((c) => c.guid === sequence.guid)\n await this.cashflowApi.updateCashflowSequence({\n ...existingSequence,\n end_date: lastEvent?.occurred_on || getUnixTime(new Date()),\n })\n\n // Create a new sequence\n await this.addCashflowSequence({\n ...sequence,\n guid: undefined,\n })\n } else {\n // Update current sequence\n await this.cashflowApi.updateCashflowSequence(sequence)\n }\n\n // Reload all income activity\n await this.loadIncomeActivity()\n } catch (error) {\n console.error(`Error updating cashflow sequence: ${error}`)\n }\n }\n\n updateScheduledPayment = async (payment: ScheduledPayment) => {\n try {\n const updatedPayment = await this.api.updateScheduledPayment(payment)\n\n const index = this.scheduledPayments.findIndex((sp) => sp.guid === payment.guid)\n if (index < 0) return\n\n runInAction(() => {\n this.scheduledPayments = [\n ...this.scheduledPayments.slice(0, index),\n updatedPayment,\n ...this.scheduledPayments.slice(index + 1),\n ]\n })\n } catch (error) {\n console.error(`Error occurred while updating schedule payment`)\n }\n }\n}\n","import CheckCircleIcon from '@mui/icons-material/CheckCircle'\nimport ErrorIcon from '@mui/icons-material/Error'\n\nimport { IconBacking } from '../../common'\n\ntype IconProp = {\n size?: number\n}\n\nconst iconStyle = {\n gridRow: 1,\n gridColumn: 1,\n zIndex: 2,\n}\n\nexport const ConnectedStatus = ({ size = 20 }: IconProp) => (\n <IconBacking size={size}>\n <CheckCircleIcon color=\"success\" sx={{ fontSize: size, ...iconStyle }} />\n </IconBacking>\n)\n\nexport const ErrorStatus = ({ size = 20 }: IconProp) => (\n <IconBacking size={size}>\n <ErrorIcon color=\"error\" sx={{ fontSize: size, ...iconStyle }} />\n </IconBacking>\n)\n","import { AccountType } from '../../common/types'\nimport type { Account } from '../../common/types'\n\nexport const isAccountLiability = (account: Account) =>\n account &&\n (account.account_type === AccountType.CREDIT_CARD ||\n account.account_type === AccountType.LOAN ||\n account.account_type === AccountType.MORTGAGE ||\n account.account_type === AccountType.LINE_OF_CREDIT ||\n account.account_type === AccountType.CHECKING_LINE_OF_CREDIT)\n\nexport const isManual = (account: Account) => account.is_manual || !account.guid\n\nexport const usesCreditLimitField = (account: Account) =>\n account.account_type === AccountType.LINE_OF_CREDIT ||\n account.account_type === AccountType.CREDIT_CARD ||\n account.account_type === AccountType.CHECKING_LINE_OF_CREDIT\n\nexport const usesInterestRateField = (account: Account) =>\n account.account_type === AccountType.SAVINGS ||\n account.account_type === AccountType.CHECKING ||\n account.account_type === AccountType.LINE_OF_CREDIT ||\n account.account_type === AccountType.CREDIT_CARD ||\n account.account_type === AccountType.LOAN ||\n account.account_type === AccountType.MORTGAGE\n\nexport const usesOriginalBalanceField = (account: Account) =>\n account.account_type === AccountType.LOAN || account.account_type === AccountType.MORTGAGE\n","import { Icon, Text } from '@kyper/mui'\n\nimport {\n AccountIcon,\n AccountType,\n buildDynamicCopy,\n DATE_FORMATS_INTL,\n formatCurrency,\n formatDate,\n formatOrdinal,\n formatPercentage,\n isValidNumber,\n PropertyType,\n} from '../../common'\nimport type { Account, AccountsCopy } from '../../common'\n\nimport { PropertyIcon } from '../../common/types/Account'\nimport {\n isAccountLiability,\n isManual,\n usesCreditLimitField,\n usesInterestRateField,\n usesOriginalBalanceField,\n} from './Accounts'\nimport { FieldType } from '../constants/Accounts'\n\ntype SelectOption = {\n label: string\n value: number\n icon: React.ReactElement\n}\n\nexport type AccountField = {\n event?: string\n label: string\n minAmount?: number\n options?: SelectOption[]\n name: keyof Account\n placeholder?: string\n type?: string\n validation?: (val: any) => string\n valueFormatter: (val: any) => any\n}\n\nexport const getAccountDetailFields = (account: Account, copy: AccountsCopy) => {\n const fields: AccountField[] = [\n {\n event: 'account_details_click_account_name',\n label: copy.account_name,\n name: 'user_name',\n placeholder: buildDynamicCopy(copy.enter_value, copy.account_name) as string,\n type: FieldType.Input,\n validation: (val: string) =>\n val ? '' : (buildDynamicCopy(copy.field_is_required, copy.account_name) as string),\n valueFormatter: (val) => val,\n },\n ]\n\n if (isManual(account)) {\n fields.unshift({\n label: copy.account_balance,\n name: 'balance',\n placeholder: buildDynamicCopy(copy.enter_value, copy.account_balance) as string,\n type: FieldType.Currency,\n valueFormatter: (val) => formatCurrency(val, '0,0.00'),\n })\n\n const accountTypeOptions = Object.keys(AccountType)\n .filter((key) => Number(key))\n .map((value) => ({\n label: copy.account_types[value],\n value: Number(value),\n icon: <Icon name={AccountIcon[value]} />,\n }))\n\n fields.push({\n label: copy.account_type,\n name: 'account_type',\n options: accountTypeOptions,\n placeholder: buildDynamicCopy(copy.select_value, copy.account_type) as string,\n type: FieldType.Select,\n valueFormatter: (val) => accountTypeOptions.find((option) => option.value === val)?.label,\n })\n }\n\n if (account.account_type === AccountType.PROPERTY) {\n const propertyTypeOptions = Object.keys(PropertyType)\n .filter((key) => Number(key))\n .map((value) => ({\n label: copy.property_types[value],\n value: Number(value),\n icon: <Icon name={PropertyIcon[value]} />,\n }))\n\n fields.push({\n label: copy.property_type,\n name: 'property_type',\n options: propertyTypeOptions,\n placeholder: buildDynamicCopy(copy.select_value, copy.property_type) as string,\n type: FieldType.Select,\n valueFormatter: (val) => propertyTypeOptions.find((option) => option.value === val)?.label,\n })\n }\n\n if (usesInterestRateField(account)) {\n let label = copy.interest_rate\n let fieldName = 'interest_rate' as keyof Account\n\n if (!account.is_manual) {\n if (typeof account.apr === 'number') {\n label = copy.apr\n fieldName = 'apr'\n }\n if (typeof account.apy === 'number') {\n label = copy.apy\n fieldName = 'apy'\n }\n }\n\n fields.push({\n event: 'account_details_click_interest_rate',\n label,\n name: fieldName,\n placeholder: buildDynamicCopy(copy.enter_value, label) as string,\n type: FieldType.Input,\n validation: (val) => (!isValidNumber(val) ? copy.error_amount_is_invalid : ''),\n valueFormatter: (val) => (isValidNumber(val) ? formatPercentage(val / 100) : val),\n })\n }\n\n if (isAccountLiability(account)) {\n fields.push({\n label: copy.minimum_payment,\n name: 'minimum_payment',\n placeholder: buildDynamicCopy(copy.enter_value, copy.minimum_payment) as string,\n type: FieldType.Currency,\n valueFormatter: (val) => formatCurrency(val, '0,0.00'),\n })\n\n if (account.payment_due_at) {\n fields.push({\n label: copy.next_payment,\n name: 'payment_due_at',\n type: FieldType.Date,\n valueFormatter: (val) => {\n // accounts for Unix and DateTime values\n const dateTimeStamp = typeof val === 'number' ? new Date(val * 1000) : val\n return formatDate(dateTimeStamp, DATE_FORMATS_INTL.MED_MONTH_SHORT_DAY_FULL_YEAR)\n },\n })\n } else {\n fields.push({\n label: copy.day_payment_due,\n name: 'day_payment_is_due',\n placeholder: buildDynamicCopy(copy.enter_value, copy.day_payment_due) as string,\n type: FieldType.Date,\n valueFormatter: (val) =>\n buildDynamicCopy(\n copy.day_of_every_month,\n formatOrdinal(val <= 31 ? val : new Date(val).getDate()),\n ) as string,\n })\n }\n }\n\n if (usesCreditLimitField(account)) {\n fields.push({\n label: copy.credit_limit,\n name: 'credit_limit',\n placeholder: buildDynamicCopy(copy.enter_value, copy.credit_limit) as string,\n type: FieldType.Currency,\n valueFormatter: (val) => formatCurrency(val, '0,0.00'),\n })\n }\n\n if (usesOriginalBalanceField(account)) {\n fields.push({\n label: copy.original_balance,\n minAmount: 1,\n name: 'original_balance',\n placeholder: buildDynamicCopy(copy.enter_value, copy.original_balance) as string,\n type: FieldType.Currency,\n valueFormatter: (val) => formatCurrency(val, '0,0.00'),\n })\n }\n\n return fields\n}\n\nexport const getAccountBalanceDetails = (account: Account, copy: AccountsCopy) => {\n let firstSubtitle = ''\n let firstValue = null\n let secondSubtitle = null\n let secondValue = null\n let hasAvailableBalance = false\n\n switch (account.account_type) {\n // checking or savings\n case 1:\n case 2: {\n // some savings accounts only have balance, and not available_balance\n if (account.available_balance) {\n firstSubtitle = copy.available_balance\n firstValue = account.available_balance\n secondSubtitle = account.available_balance ? copy.current_balance : null\n secondValue = formatCurrency(account.balance, '0,0.00')\n hasAvailableBalance = true\n } else {\n firstSubtitle = copy.current_balance\n firstValue = account.balance\n }\n break\n }\n // credit cards, loans, investments, etc\n default: {\n firstSubtitle = copy.current_balance\n firstValue = account.balance\n if (account.minimum_payment && account.payment_due_at) {\n const dateTimeStamp =\n typeof account.payment_due_at === 'number'\n ? new Date(account.payment_due_at * 1000)\n : account.payment_due_at\n secondSubtitle = (\n <Text component=\"strong\" variant=\"XSmall\">\n {\n buildDynamicCopy(\n copy.payment_due_on,\n formatCurrency(account.minimum_payment, '0,0.00'),\n formatDate(dateTimeStamp, DATE_FORMATS_INTL.FULL_MONTH_DAY),\n ) as string\n }\n </Text>\n )\n } else if (account.credit_limit) {\n secondSubtitle = copy.available_credit\n secondValue = formatCurrency(account.credit_limit, '0,0.00')\n }\n }\n }\n\n return {\n firstSubtitle,\n firstValue,\n secondSubtitle,\n secondValue,\n hasAvailableBalance,\n }\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Badge from '@mui/material/Badge'\nimport Box from '@mui/material/Box'\nimport ListItem, { ListItemOwnProps } from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { InstitutionLogo, Text } from '@kyper/mui'\n\nimport { ErrorStatus } from './ConnectionStatusIcons'\n\nimport { Account, ConnectionStatus, formatCurrency, useGlobalCopyStore } from '../../common'\nimport { getAccountBalanceDetails } from '../utils/AccountFields'\n\ninterface AccountListItemProps {\n account: Account\n onRowClick?: () => void\n listItemProps?: ListItemOwnProps\n shouldShowConnectionStatus?: boolean\n}\n\nconst AccountListItem: React.FC<AccountListItemProps> = ({\n account,\n onRowClick,\n listItemProps,\n shouldShowConnectionStatus = false,\n}) => {\n const { accounts: accountsCopy } = useGlobalCopyStore()\n const { firstSubtitle, firstValue, secondSubtitle, secondValue } = getAccountBalanceDetails(\n account,\n accountsCopy,\n )\n\n let statusIcon = undefined\n if (\n account.connectionStatus === ConnectionStatus.Error ||\n account.connectionStatus === ConnectionStatus.RequiresMfa\n ) {\n statusIcon = <ErrorStatus size={16} />\n }\n\n const content = (\n <>\n <ListItemAvatar>\n <Badge\n badgeContent={shouldShowConnectionStatus ? statusIcon : undefined}\n sx={{\n '& .MuiBadge-badge': {\n right: -1,\n },\n }}\n >\n <InstitutionLogo alt=\"MX\" institutionGuid={account.institution_guid || ''} />\n </Badge>\n </ListItemAvatar>\n\n <ListItemText\n disableTypography={true}\n primary={\n <Text bold={true} sx={{ whiteSpace: 'normal' }} variant=\"Body\">\n {`${account.name || account.feed_name} ${account.account_number ? `*${account.account_number}` : ''}`}{' '}\n {account.is_hidden && !account.is_closed && accountsCopy.is_hidden}\n {account.is_closed && accountsCopy.is_closed}\n </Text>\n }\n secondary={\n <>\n <Box sx={{ alignItems: 'center', display: 'flex', justifyContent: 'space-between' }}>\n <Text variant=\"XSmall\">{firstSubtitle}</Text>\n <Text bold={true} variant=\"Small\">\n {formatCurrency(firstValue, '0,0.00')}\n </Text>\n </Box>\n <Box sx={{ alignItems: 'center', display: 'flex', justifyContent: 'space-between' }}>\n <Text variant=\"XSmall\">{secondSubtitle}</Text>\n <Text ml=\"auto\" variant=\"XSmall\">\n {secondValue}\n </Text>\n </Box>\n </>\n }\n />\n </>\n )\n\n return (\n <ListItem sx={{ backgroundColor: 'background.paper' }} {...listItemProps}>\n {onRowClick ? (\n <ListItemButton alignItems=\"flex-start\" onClick={onRowClick} sx={{ px: 24 }}>\n {content}\n </ListItemButton>\n ) : (\n content\n )}\n </ListItem>\n )\n}\n\nexport default observer(AccountListItem)\n","import ListItem from '@mui/material/ListItem'\n\nimport RemainingCash from './RemainingCash'\n\ninterface DetailsFooterProps {\n remaining: number\n}\n\nconst DetailsFooter: React.FC<DetailsFooterProps> = ({ remaining }) => {\n return (\n <ListItem\n sx={{\n alignItems: 'center',\n backgroundColor: 'background.highlight',\n display: 'flex',\n gap: 12,\n padding: '12px 24px',\n borderBottomLeftRadius: '3px',\n borderBottomRightRadius: '3px',\n minHeight: 'auto',\n }}\n >\n <RemainingCash remaining={remaining} />\n </ListItem>\n )\n}\n\nexport default DetailsFooter\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport ListItem from '@mui/material/ListItem'\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@kyper/mui'\n\nimport { type Activity, DATE_FORMATS_INTL, formatDate } from '../../common'\nimport { CurrencyText } from '../../common/components/CurrencyText'\n\nexport enum ExpenseType {\n EXPENSE = 'expense',\n INCOME = 'income',\n}\n\ninterface DetailsExpenseRowType {\n activity: Activity\n}\n\nconst DetailsExpenseRow: React.FC<DetailsExpenseRowType> = ({ activity }) => {\n return (\n <>\n <ListItem sx={{ display: 'flex', alignItems: 'center', gap: 16, px: 24, py: 12 }}>\n <Stack alignItems=\"center\" height={32} width={32}>\n <Text bold={true} sx={{ fontSize: 11 }}>\n {formatDate(activity.expectedDate, DATE_FORMATS_INTL.MONTH)}\n </Text>\n <Text bold={true} sx={{ fontSize: 11 }}>\n {formatDate(activity.expectedDate, DATE_FORMATS_INTL.DAY)}\n </Text>\n </Stack>\n <Text sx={{ flexGrow: 1, fontSize: 13 }}>{activity.name}</Text>\n <CurrencyText\n amount={activity.amount}\n bold={true}\n sx={{ textAlign: 'right', fontSize: 13 }}\n />\n </ListItem>\n <Divider />\n </>\n )\n}\n\nexport default observer(DetailsExpenseRow)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport ListSubheader from '@mui/material/ListSubheader'\n\nimport { Text } from '@kyper/mui'\n\nimport { formatCurrency, useGlobalCopyStore } from '../../common'\n\nimport { ExpenseType } from './DetailsExpenseRow'\n\ninterface DetailsExpenseHeaderProps {\n total: number\n type: ExpenseType\n}\n\nconst DetailsExpenseHeader: React.FC<DetailsExpenseHeaderProps> = ({ total, type }) => {\n const { cashflow: customCopy } = useGlobalCopyStore()\n\n return (\n <>\n <ListSubheader\n sx={{\n alignItems: 'center',\n backgroundColor: 'background.highlight',\n display: 'flex',\n justifyContent: 'space-between',\n pb: 4,\n pt: 12,\n px: 24,\n }}\n >\n <Text bold={true} sx={{ fontSize: 12 }}>\n {type === ExpenseType.EXPENSE ? customCopy.expenses : customCopy.income}\n </Text>\n <Text bold={true} sx={{ fontSize: 13 }}>\n {type === ExpenseType.EXPENSE ? '-' : '+'}\n {formatCurrency(total, '0,0.00')}\n </Text>\n </ListSubheader>\n <Divider />\n </>\n )\n}\n\nexport default observer(DetailsExpenseHeader)\n","import type { Account, Activity } from '../../common'\nimport { isAfter } from 'date-fns/isAfter'\nimport { isBefore } from 'date-fns/isBefore'\nimport { isToday } from 'date-fns/isToday'\n\n/**\n * Returns activities that match the given account and date range\n * @param account The account\n * @param dateRange The date range\n */\nexport const activityFilter =\n (account: Account, dateRange: { start: Date; end: Date }) => (a: Activity) =>\n a.accountGuid === account.guid &&\n (isToday(a.expectedDate) || isAfter(a.expectedDate, dateRange.start)) &&\n isBefore(a.expectedDate, dateRange.end)\n","import { observer } from 'mobx-react-lite'\nimport { getUnixTime } from 'date-fns/getUnixTime'\n\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 '@kyper/mui'\n\nimport AccountListItem from '../../accounts/components/AccountListItem'\nimport DetailsFooter from './DetailsFooter'\nimport DetailsExpenseRow, { ExpenseType } from './DetailsExpenseRow'\nimport DetailsExpenseHeader from './DetailsExpenseHeader'\n\nimport {\n Account,\n Activity,\n DATE_FORMATS_INTL,\n formatDate,\n useGlobalCopyStore,\n useRecurringActivityStore,\n useWidgetContainerProvider,\n} from '../../common'\nimport { useCashflowUiStore } from '../context/hooks'\nimport { activityFilter } from '../util/Filters'\n\nconst DetailsTab = () => {\n const { availableWidth } = useWidgetContainerProvider()\n const { cashflow: customCopy } = useGlobalCopyStore()\n const { upcomingExpenses, upcomingIncome } = useRecurringActivityStore()\n const { dateRange, selectedCashAccounts } = useCashflowUiStore()\n\n return (\n <Stack>\n <Stack direction={availableWidth < 400 ? 'column' : 'row'} justifyContent=\"space-between\">\n <Text bold={true} sx={{ fontSize: 15, mb: 12, whiteSpace: 'normal' }}>\n {customCopy.accounts_breakdown}\n </Text>\n <Text bold={true} sx={{ fontSize: 15, mb: 12, whiteSpace: 'normal' }}>\n {formatDate(dateRange.start, DATE_FORMATS_INTL.FULL_MONTH_DAY)} -{' '}\n {formatDate(dateRange.end, DATE_FORMATS_INTL.FULL_MONTH_DAY)}\n </Text>\n </Stack>\n\n <Stack>\n {selectedCashAccounts.map((account: Account) => {\n const upcomingIncomeByAccount = upcomingIncome\n .filter(activityFilter(account, dateRange))\n .sort((a, b) => getUnixTime(a.expectedDate) - getUnixTime(b.expectedDate))\n\n const projectedExpensesByAccount = upcomingExpenses.filter(\n activityFilter(account, dateRange),\n )\n\n const incomeTotal = upcomingIncomeByAccount.reduce(\n (acc: number, curr: Activity) => acc + curr.amount,\n 0,\n )\n const expenseTotal = projectedExpensesByAccount.reduce(\n (acc, curr) => acc + curr.amount,\n 0,\n )\n\n return (\n <List\n key={account.guid}\n sx={{\n border: '1px solid',\n borderColor: 'border.light',\n mb: 24,\n borderRadius: 1,\n }}\n >\n <AccountListItem\n account={account}\n listItemProps={{\n disableGutters: false,\n disablePadding: false,\n sx: { borderTopRadius: 1, pr: 24 },\n }}\n />\n <Divider />\n {/* Income */}\n {upcomingIncomeByAccount.length > 0 && (\n <ListItem>\n <List\n subheader={\n <DetailsExpenseHeader total={incomeTotal} type={ExpenseType.INCOME} />\n }\n sx={{ width: '100%' }}\n >\n {upcomingIncomeByAccount.map((a) => (\n <DetailsExpenseRow activity={a} key={a.sequenceGuid} />\n ))}\n </List>\n </ListItem>\n )}\n {/* Expenses */}\n {projectedExpensesByAccount.length > 0 && (\n <ListItem>\n <List\n subheader={\n <DetailsExpenseHeader total={expenseTotal} type={ExpenseType.EXPENSE} />\n }\n sx={{ width: '100%' }}\n >\n {projectedExpensesByAccount.map((a) => (\n <DetailsExpenseRow activity={a} key={a.scheduledPaymentGuid} />\n ))}\n </List>\n </ListItem>\n )}\n {/* Bottom row total */}\n <DetailsFooter\n remaining={\n (account.available_balance || account.balance || 0) + incomeTotal - expenseTotal\n }\n />\n </List>\n )\n })}\n </Stack>\n </Stack>\n )\n}\n\nexport default observer(DetailsTab)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport Stack from '@mui/material/Stack'\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { DataGridPro, GridColDef } from '@mui/x-data-grid-pro'\n\nimport { InstitutionLogo, Text } from '@kyper/mui'\n\nimport {\n type Account,\n DATE_FORMATS_INTL,\n formatCurrency,\n formatDate,\n InformationTooltip,\n useGlobalCopyStore,\n useRecurringActivityStore,\n useWidgetContainerProvider,\n} from '../../common'\nimport { useCashflowUiStore } from '../context/hooks'\nimport { CurrencyText } from '../../common/components/CurrencyText'\nimport RemainingCash from './RemainingCash'\n\nconst SummaryTab = () => {\n const { availableWidth } = useWidgetContainerProvider()\n const theme = useTheme()\n const { cashflow: customCopy } = useGlobalCopyStore()\n const { upcomingExpenses, upcomingIncome } = useRecurringActivityStore()\n const { dateRange, selectedCashAccounts } = useCashflowUiStore()\n\n const columns: GridColDef[] = [\n {\n field: 'account',\n flex: 1.5,\n headerName: customCopy.accounts,\n renderCell: ({ value: { name, nickname, institution_guid, account_number } }) => {\n const accountName = nickname || name\n\n return (\n <Stack alignItems=\"center\" flexDirection=\"row\" gap={12}>\n <InstitutionLogo\n alt={customCopy.institution_logo}\n institutionGuid={institution_guid || ''}\n size={16}\n />\n {`${accountName} ${account_number ? `*${account_number}` : ''}`}\n </Stack>\n )\n },\n },\n {\n field: 'balance',\n flex: 1,\n headerName: customCopy.balance,\n type: 'number',\n renderCell: (params) => formatCurrency(params.value, '0,0.00'),\n },\n {\n field: 'income',\n flex: 1,\n headerName: customCopy.projected_income,\n type: 'number',\n renderCell: (params) => `+${formatCurrency(params.value, '0,0.00')}`,\n },\n {\n field: 'expenses',\n flex: 1.1,\n headerName: customCopy.projected_expenses,\n type: 'number',\n renderCell: (params) => `-${formatCurrency(params.value, '0,0.00')}`,\n },\n {\n field: 'remaining',\n flex: 1,\n headerName: customCopy.remaining,\n type: 'number',\n renderCell: (params) => {\n const total = params.row.balance + params.row.income - params.row.expenses\n\n return (\n <Text\n color={Math.sign(total) === -1 ? theme.palette.error.main : theme.palette.text.primary}\n variant=\"Small\"\n >\n {formatCurrency(total, '0,0.00')}\n </Text>\n )\n },\n },\n ]\n\n const rows = React.useMemo(() => {\n return selectedCashAccounts.map((account: Account) => {\n const totalprojectedExpenses = upcomingExpenses\n .filter((a) => a.accountGuid === account.guid)\n .reduce((acc, curr) => acc + curr.amount, 0)\n\n const totalProjectedIncome = upcomingIncome\n .filter((a) => a.accountGuid === account.guid)\n .reduce((acc, curr) => acc + curr.amount, 0)\n\n const remaining = (account.balance || 0) + totalProjectedIncome - totalprojectedExpenses\n\n return {\n account,\n balance: account.balance || 0,\n id: account.guid,\n income: totalProjectedIncome,\n expenses: totalprojectedExpenses,\n remaining,\n }\n })\n }, [selectedCashAccounts, upcomingExpenses, upcomingIncome])\n\n return (\n <Box\n sx={{\n width: '100%',\n }}\n >\n <Stack\n direction={availableWidth < 540 ? 'column' : 'row'}\n justifyContent=\"space-between\"\n mb={12}\n >\n <Stack alignItems=\"center\" direction=\"row\" gap={8}>\n <Text\n bold={true}\n sx={{\n fontSize: 15,\n whiteSpace: 'normal',\n }}\n >\n {customCopy.cash_inflow_and_outflow}\n </Text>\n <InformationTooltip\n body={customCopy.table_tooltip_body}\n title={customCopy.table_tooltip_title}\n />\n </Stack>\n <Text bold={true} sx={{ fontSize: 15, whiteSpace: 'normal' }}>\n {formatDate(dateRange.start, DATE_FORMATS_INTL.FULL_MONTH_DAY)} -{' '}\n {formatDate(dateRange.end, DATE_FORMATS_INTL.FULL_MONTH_DAY)}\n </Text>\n </Stack>\n {availableWidth > 650 ? (\n <DataGridPro\n autoHeight={true}\n columnHeaderHeight={48}\n columns={columns}\n density=\"standard\"\n disableColumnMenu={true}\n disableRowSelectionOnClick={true}\n hideFooter={true}\n rowHeight={48}\n rows={rows}\n sx={{\n border: '1px solid',\n borderColor: 'border.light',\n borderRadius: 1,\n }}\n />\n ) : (\n rows.map((row) => {\n const { name, nickname, institution_guid, account_number } = row.account\n const accountName = nickname || name\n\n return (\n <List\n key={row.id}\n sx={{\n border: '1px solid',\n borderColor: 'border.light',\n borderRadius: 1,\n marginBottom: 24,\n }}\n >\n <ListItem sx={{ minHeight: 'auto' }}>\n <Stack width=\"100%\">\n <Stack\n alignItems=\"center\"\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n px={16}\n py={12}\n >\n <Stack alignItems=\"center\" flexDirection=\"row\" gap={8}>\n <InstitutionLogo\n alt={customCopy.institution_logo}\n institutionGuid={institution_guid || ''}\n size={16}\n />\n <Text variant=\"Small\">{`${accountName} ${account_number ? `*${account_number}` : ''}`}</Text>\n </Stack>\n <CurrencyText amount={row.balance} bold={true} variant=\"Small\" />\n </Stack>\n <Divider sx={{ width: '100%' }} />\n <Stack\n alignItems=\"center\"\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n px={16}\n py={12}\n >\n <Text variant=\"Small\">{customCopy.projected_income}</Text>\n <CurrencyText amount={row.income} bold={true} symbol=\"+\" variant=\"Small\" />\n </Stack>\n <Divider sx={{ width: '100%' }} />\n <Stack\n alignItems=\"center\"\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n px={16}\n py={12}\n >\n <Text variant=\"Small\">{customCopy.projected_expenses}</Text>\n <CurrencyText amount={row.expenses} bold={true} symbol=\"-\" variant=\"Small\" />\n </Stack>\n <Divider sx={{ width: '100%' }} />\n <Stack\n alignItems=\"center\"\n bgcolor=\"background.default\"\n flexDirection=\"row\"\n gap={8}\n justifyContent=\"space-between\"\n px={16}\n py={12}\n sx={{ borderBottomLeftRadius: '4px', borderBottomRightRadius: '4px' }}\n >\n <RemainingCash remaining={row.remaining} />\n </Stack>\n </Stack>\n </ListItem>\n </List>\n )\n })\n )}\n </Box>\n )\n}\n\nexport default observer(SummaryTab)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport Box from '@mui/material/Box'\nimport Tabs from '@mui/material/Tabs'\nimport Tab from '@mui/material/Tab'\n\nimport DetailsTab from './DetailsTab'\nimport SummaryTab from './SummaryTab'\nimport { TabContentContainer, useEvent, useGlobalCopyStore, useScreenSize } from '../../common'\n\nconst CashflowContent: React.FC = () => {\n const { cashflow: customCopy } = useGlobalCopyStore()\n const { isDesktop } = useScreenSize()\n const { onEvent } = useEvent()\n\n const [value, setValue] = React.useState(0)\n\n const handleChange = (_event: React.SyntheticEvent, newValue: number) => {\n setValue(newValue)\n }\n\n React.useEffect(() => {\n onEvent(value === 0 ? 'cash_flow_summary' : 'cash_flow_details')\n }, [value])\n\n return (\n <Box>\n <Tabs\n aria-label={customCopy.cashflow_summary_and_details}\n centered={true}\n onChange={handleChange}\n value={value}\n variant=\"fullWidth\"\n >\n <Tab\n aria-controls=\"cashflow-tabpanel-0\"\n id=\"cashflow-tab-0\"\n label={customCopy.summary}\n sx={{ textTransform: 'none' }}\n />\n <Tab\n aria-controls=\"cashflow-tabpanel-1\"\n id=\"cashflow-tab-1\"\n label={customCopy.details}\n sx={{ textTransform: 'none' }}\n />\n </Tabs>\n <Box sx={{ mb: 32 }} />\n <TabContentContainer index={0} name=\"cashflow\" value={value}>\n <Box sx={{ m: isDesktop ? 48 : 16 }}>\n <SummaryTab />\n </Box>\n </TabContentContainer>\n <TabContentContainer index={1} name=\"cashflow\" value={value}>\n <Box sx={{ m: isDesktop ? 48 : 16 }}>\n <DetailsTab />\n </Box>\n </TabContentContainer>\n </Box>\n )\n}\n\nexport default observer(CashflowContent)\n","import React from 'react'\n\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@kyper/mui'\n\nimport { CurrencyText } from '../../common/components/CurrencyText'\n\ninterface CashflowAmountHeadingProps {\n amount: number\n isMobile?: boolean\n isTotal?: boolean\n label: string\n symbol?: string\n tooltip?: React.ReactNode\n}\n\nconst CashflowAmountHeading: React.FC<CashflowAmountHeadingProps> = ({\n amount,\n isMobile = false,\n isTotal = false,\n label,\n symbol,\n tooltip,\n}) => {\n return (\n <Stack\n bgcolor={isTotal ? 'background.default' : 'transparent'}\n direction={isMobile ? 'row' : 'column'}\n justifyContent={isMobile ? 'space-between' : 'initial'}\n padding={isMobile ? '14px 16px' : 0}\n sx={{ borderBottomLeftRadius: 4, borderBottomRightRadius: 4 }}\n >\n {!isMobile && <CurrencyText amount={amount} component=\"h2\" variant=\"H2\" />}\n <Stack alignItems=\"center\" component=\"span\" direction=\"row\" gap={8} mt={2}>\n <Text bold={isTotal} variant=\"Small\">\n {label}\n </Text>\n {tooltip}\n </Stack>\n {isMobile && <CurrencyText amount={amount} component=\"h2\" symbol={symbol} variant=\"Small\" />}\n </Stack>\n )\n}\n\nexport default CashflowAmountHeading\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { isAfter } from 'date-fns/isAfter'\nimport { isBefore } from 'date-fns/isBefore'\nimport { isToday } from 'date-fns/isToday'\n\nimport Button from '@mui/material/Button'\nimport Divider from '@mui/material/Divider'\nimport Stack from '@mui/material/Stack'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport {\n Activity,\n Drawer,\n InformationTooltip,\n useGlobalCopyStore,\n useGlobalUiStore,\n useRecurringActivityStore,\n useUserStore,\n useWidgetContainerProvider,\n} from '../../common'\n\nimport { ManageIncome } from '../../recurringactivity'\n\nimport CashflowAmountHeading from './CashflowAmountHeading'\nimport { useCashflowUiStore } from '../context/hooks'\n\n// This filter only includes activities that have an account guid that matches an account guid\n// in the given list of accountGuids and is within the given date range\nconst activityAccountFilter =\n (accountGuids: string[], dateRange: { start: Date; end: Date }) => (a: Activity) =>\n a.accountGuid &&\n accountGuids.includes(a.accountGuid) &&\n (isToday(a.expectedDate) || isAfter(a.expectedDate, dateRange.start)) &&\n isBefore(a.expectedDate, dateRange.end)\n\nconst CashflowHeading: React.FC = () => {\n const [isOpen, setIsOpen] = React.useState(false)\n\n const { availableWidth } = useWidgetContainerProvider()\n const { cashflow: customCopy } = useGlobalCopyStore()\n\n const { upcomingExpenses, upcomingIncome } = useRecurringActivityStore()\n const { selectedAccountGuids } = useGlobalUiStore()\n const { dateRange, selectedCashAccounts } = useCashflowUiStore()\n const { userProfile } = useUserStore()\n\n const filteredExpenses = React.useMemo(\n () => upcomingExpenses.filter(activityAccountFilter(selectedAccountGuids, dateRange)),\n [dateRange, selectedAccountGuids, upcomingExpenses],\n )\n\n const filteredIncome = React.useMemo(\n () => upcomingIncome.filter(activityAccountFilter(selectedAccountGuids, dateRange)),\n [dateRange, selectedAccountGuids, upcomingIncome],\n )\n\n const cashBalance = React.useMemo(\n () => selectedCashAccounts.reduce((total, account) => total + (account?.balance || 0), 0),\n [selectedCashAccounts],\n )\n\n const totalUpcomingExpenses = filteredExpenses.reduce((acc, curr) => acc + curr.amount, 0)\n const totalUpcomingIncome = filteredIncome.reduce((acc, curr) => acc + curr.amount, 0)\n const availableToSpend = cashBalance - totalUpcomingExpenses + totalUpcomingIncome\n\n const hasCompletedCashflowOnboarding =\n upcomingIncome.length > 0 && userProfile?.has_completed_cash_flow_onboarding\n const isSmallContainer = availableWidth < 725\n\n return (\n <Stack flexDirection=\"row\" gap={24} justifyContent=\"center\" my={isSmallContainer ? 24 : 42}>\n {isSmallContainer ? (\n <Stack border=\"1px solid\" borderColor=\"border.light\" borderRadius={1} mx={16} width=\"100%\">\n <CashflowAmountHeading\n amount={cashBalance}\n isMobile={true}\n label={customCopy.cash_and_bank}\n />\n\n <Divider />\n\n {hasCompletedCashflowOnboarding ? (\n <CashflowAmountHeading\n amount={totalUpcomingIncome}\n isMobile={true}\n label={customCopy.to_be_received}\n symbol=\"+\"\n />\n ) : (\n <Button\n onClick={() => setIsOpen(true)}\n startIcon={<Icon name=\"add\" />}\n sx={{ fontSize: 13 }}\n >\n {customCopy.add_income}\n </Button>\n )}\n\n <Divider />\n\n <CashflowAmountHeading\n amount={totalUpcomingExpenses}\n isMobile={true}\n label={customCopy.to_be_paid_out}\n symbol=\"-\"\n />\n\n <Divider />\n <CashflowAmountHeading\n amount={availableToSpend}\n isMobile={true}\n isTotal={true}\n label={customCopy.remaining_cash}\n tooltip={\n <InformationTooltip\n body={customCopy.remaining_income_tooltip_body}\n title={customCopy.remaining_income_tooltip_title}\n />\n }\n />\n </Stack>\n ) : (\n <>\n <CashflowAmountHeading amount={cashBalance} label={customCopy.cash_and_bank} />\n {hasCompletedCashflowOnboarding ? (\n <>\n <Text sx={{ fontSize: 25, lineHeight: 1 }}>+</Text>\n <CashflowAmountHeading\n amount={totalUpcomingIncome}\n label={customCopy.to_be_received}\n />\n </>\n ) : (\n <Button\n onClick={() => setIsOpen(true)}\n startIcon={<Icon name=\"add\" />}\n sx={{ fontSize: 13 }}\n >\n {customCopy.add_income}\n </Button>\n )}\n <Text sx={{ fontSize: 25, lineHeight: 1 }}>-</Text>\n <CashflowAmountHeading amount={totalUpcomingExpenses} label={customCopy.to_be_paid_out} />\n <Text sx={{ fontSize: 25, lineHeight: 1 }}>=</Text>\n <CashflowAmountHeading\n amount={availableToSpend}\n label={customCopy.remaining_cash}\n tooltip={\n <InformationTooltip\n body={customCopy.remaining_income_tooltip_body}\n title={customCopy.remaining_income_tooltip_title}\n />\n }\n />\n </>\n )}\n <Drawer\n ariaLabelClose={customCopy.close_manage_income_aria}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n shouldShowHeaderBorders={false}\n title={customCopy.manage_income}\n >\n <ManageIncome />\n </Drawer>\n </Stack>\n )\n}\n\nexport default observer(CashflowHeading)\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'\n\nimport { H1, H2, Icon, P } from '@kyper/mui'\nimport useTheme from '@mui/material/styles/useTheme'\nimport { useCashflowStore, useGlobalCopyStore } from '../../../common'\n\ninterface StepOneProps {\n handleNextStep: () => void\n}\n\nconst StepOne: React.FC<StepOneProps> = ({ handleNextStep }) => {\n const { completeOnboarding } = useCashflowStore()\n const { cashflow: customCopy } = useGlobalCopyStore()\n\n const theme = useTheme()\n\n return (\n <Stack>\n <H1 pb={12}>{customCopy.welcome_title}</H1>\n <H2\n color={theme.palette.action.active}\n pb={8}\n sx={{ wordBreak: 'break-word', whiteSpace: 'initial' }}\n variant=\"H3\"\n >\n {customCopy.welcome_sub_title}\n </H2>\n <P pb={32}>{customCopy.welcome_description}</P>\n <Stack direction=\"column\" mb={32} spacing={32}>\n <P sx={{ display: 'flex', alignItems: 'center', fontSize: 18 }}>\n <Box\n bgcolor={theme.palette.primary.lighter}\n borderRadius={1}\n component=\"span\"\n height={44}\n mr={24}\n sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}\n width={44}\n >\n <Icon color=\"primary\" name=\"currency_exchange\" />\n </Box>\n {customCopy.bullet_one}\n </P>\n <P sx={{ display: 'flex', alignItems: 'center', fontSize: 18 }}>\n <Box\n bgcolor={theme.palette.primary.lighter}\n borderRadius={1}\n component=\"span\"\n height={44}\n mr={24}\n sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}\n width={44}\n >\n <Icon color=\"primary\" name=\"cardiology\" />\n </Box>\n {customCopy.bullet_two}\n </P>\n <P sx={{ display: 'flex', alignItems: 'center', fontSize: 18 }}>\n <Box\n bgcolor={theme.palette.primary.lighter}\n borderRadius={1}\n component=\"span\"\n height={44}\n mr={24}\n sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}\n width={44}\n >\n <Icon color=\"primary\" name=\"flare\" />\n </Box>\n {customCopy.bullet_three}\n </P>\n </Stack>\n <Stack direction=\"row\" spacing={16}>\n <Button onClick={handleNextStep} variant=\"contained\">\n {customCopy.get_started_button}\n </Button>\n <Button onClick={completeOnboarding} variant=\"outlined\">\n {customCopy.skip_button}\n </Button>\n </Stack>\n </Stack>\n )\n}\n\nexport default observer(StepOne)\n","export default \"data:image/gif;base64,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Zr5sNsOmSKx8DRiYGYADzmJHc9piSZNoXwBil0YddnSvWnRmwYYtezftr6NB2aLTabfs2b+9jqaViY4nzcd9J+d6GtMoOrKgx5Y+fevpRZ9ufP+KxXv75u5AjXCMJevGKEyme5+fqB690QGebmSiFX++/a6d3GALKAAMYN5/XI2myQ219FLggQj29AJHo81ywyOcPOhfRRNGCNRot9wgwSsPcqfYcSiOhEIDLLbYgAIygXgDF66UuGFKCLjo4mkhoZgiRj72FhICGByQwgFIViBADzJR1soNfVwCQAbItfQAARUcaeQBFUQgUpBCXgTmjRshwAEBSKZpwAUZIYERlZtACcmUJkbkJkYPaJDmnl72OGZGfw5pApppprCmTC34woseW8yZgQNkovSAAHsimUKfII0ZKUSBgmQmoWqyKRMrn3DBhSeUZMajS5NWiiSmH2n/CiiYIn1a6aEyqdKHBL5soUorMrXqKqweyQokrUOeeauoMFniiw686vCIszEJWymxHRl7UQ4qMKDCt95qUauye+KKUybVUjqsSA10+627DGz6kBQwECDAvQTIYNAAOrY4mkS2lstsWtbyORG//Tbw70B7yGDvvQIY4ANHKQxUgQYGScJlBRxzfEAOFRFg0MBpCbBRDht3XMEBkhikQQUEzYBBSBgXxACoaRIwgYcGHUDRBDgjSQADDc18EgMzuDrDzhNxUJDPgUEt0QRJVzoD0TXd7KrOBWmLntdAb401TVpXyjVBXncHdtAHDG1T2XueTVqnHwEGlN2Z0h222WPTwsS23NoFieDaW9+kNUFtMz1QAz2wgMPjj7MA439aXOA45DiwgABBYSPudlEyaGDA6KMLIC6CuERMugFSS4XlQBXDjKASL8Puy8RbVUxShzzxzvPvwAcv/PDEF2/88cgnr/zyLxU2kO+7F+Q889QvVoVI11evPWOVIJS9Rt8X1P325F82vUTnl29TKhCxr/778Mcv//z012///fjnr//+/Pfv//8ADKAAB0jAAhrwgAhMoAIXyMAGOvCBEIygBCeYkIAAACH5BAUEAMQALAAAAADwAHEAh////6axweHm7/39/uHm8KCsveDl7+Ln8P7+/qeywv7+/6iywvj5+/j5/P7///v7/fb3+qOuv/3+/+Po8W+i5uXp8vH0+KGtvubq8qGsvfn6/KWwwODm7/v8/qKu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\"","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport { H1, P } from '@kyper/mui'\nimport { useGlobalCopyStore } from '../../../common'\n\nimport stepTwoLoadingUrl from '../../images/loading-animation.gif'\n\nconst StepTwo: React.FC = () => {\n const { cashflow: customCopy } = useGlobalCopyStore()\n\n return (\n <React.Fragment>\n <div>\n <img alt=\"Loading\" src={stepTwoLoadingUrl} />\n </div>\n <H1 pb={12}>{customCopy.loading_title}</H1>\n <P>{customCopy.loading_description}</P>\n </React.Fragment>\n )\n}\n\nexport default observer(StepTwo)\n","export default \"data:image/png;base64,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\"","import React, { useState } from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subDays } from 'date-fns/subDays'\n\nimport Box from '@mui/material/Box'\nimport Button from '@mui/material/Button'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport Stack from '@mui/material/Stack'\nimport { keyframes } from '@mui/material/styles'\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { H1, Icon, P } from '@kyper/mui'\n\nimport StepOne from './components/onboarding/StepOne'\nimport StepTwo from './components/onboarding/StepTwo'\n\nimport {\n RecurrenceTypes,\n type Transaction,\n useCashflowStore,\n useGlobalCopyStore,\n useGlobalUiStore,\n useRecurringActivityStore,\n useScreenSize,\n useTransactionStore,\n} from '../common'\nimport SubheaderRow from '../common/components/SubheaderRow'\n\nimport { useCashflowUiStore } from './context/hooks'\n\nimport { TransactionRow } from '../transactions'\nimport { incomeFilter, incomeFilterSearch } from '../transactions/utils/Filters'\nimport SelectTransaction from '../recurringactivity/components/shared/activitysettings/SelectTransaction'\nimport AddActivityDetails from '../recurringactivity/components/shared/activitysettings/AddActivityDetails'\n\nimport {\n buildNewCashflowEvent,\n buildNewCashflowSequence,\n} from '../recurringactivity/util/buildNewActivity'\n\nimport { fromUnixToDayOfWeekAndDate } from '../common/utils/DateUtil'\n\nimport stepOneImageUrl from './images/cashflow-onboarding.png'\n\ninterface UpcomingTransactions extends Transaction {\n nextDate: Date | null\n frequency: RecurrenceTypes\n}\n\nconst spin = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`\n\nconst CashflowOnboarding: React.FC = () => {\n const { addCashflowEvent, addCashflowSequence, cashflowSequences } = useRecurringActivityStore()\n const { cashflow: customCopy, common: commonCopy } = useGlobalCopyStore()\n\n const { completeOnboarding } = useCashflowStore()\n const { isDirty } = useCashflowUiStore()\n const { isMobile } = useScreenSize()\n const { setDisplayedDate } = useGlobalUiStore()\n const { filter, setFilter, transactions } = useTransactionStore()\n const theme = useTheme()\n\n const [addIncome, setAddIncome] = useState(true)\n const [frequency, setFrequency] = React.useState(RecurrenceTypes.EveryMonth)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [nextDate, setNextDate] = React.useState<Date | null>(null)\n const [step, setStep] = useState(1)\n const [selectedTransactions, setSelectedTransactions] = useState<UpcomingTransactions[] | []>([])\n const [transactionGuid, setTransactionGuid] = useState('')\n\n const transaction = React.useMemo(\n () => transactions.find((t) => t.guid === transactionGuid),\n [transactionGuid],\n )\n\n const canSubmit = !!cashflowSequences.length\n\n const handleGetTransactions = async () => {\n setStep(2)\n // set transaction date range and filter by income\n setDisplayedDate(\n // Beginning of the month, 90 days before today\n startOfMonth(subDays(startOfToday(), 90)),\n startOfToday(),\n )\n\n setFilter({ ...filter, custom: incomeFilter })\n\n setStep(3)\n }\n\n const handleAddIncome = async () => {\n if (selectedTransactions.length < 1) {\n return\n }\n setIsSubmitting(true)\n\n // Create CashflowSequences & CashflowEvents\n for (let i = 0; i < selectedTransactions.length; i++) {\n const upcomingTransaction = selectedTransactions[i]\n const sequence = buildNewCashflowSequence(\n upcomingTransaction,\n upcomingTransaction.frequency,\n upcomingTransaction.nextDate as Date,\n )\n const newSequence = await addCashflowSequence(sequence)\n if (newSequence) {\n const event = buildNewCashflowEvent(newSequence, upcomingTransaction)\n await addCashflowEvent(event)\n }\n }\n completeOnboarding()\n }\n\n const showSelectIncome =\n (!transaction && addIncome) || (!transaction && selectedTransactions.length < 1)\n\n return (\n <Box\n sx={{\n display: 'flex',\n alignItems: !isMobile ? 'center' : 'flex-start',\n backgroundColor: theme.palette.background.paper,\n backgroundImage: !isMobile ? `url(${stepOneImageUrl})` : null,\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'left 100px',\n backgroundSize: '35%',\n py: 24,\n }}\n >\n {step === 1 && (\n <Box\n sx={{\n ...(isMobile\n ? { display: 'flex', flexDirection: 'column', maxWidth: '100%', padding: '0 16px' }\n : { maxWidth: 590, ml: '40%', mr: 90 }),\n }}\n >\n <StepOne handleNextStep={handleGetTransactions} />\n </Box>\n )}\n {step === 2 && (\n <Box\n sx={{\n ...(isMobile\n ? { display: 'flex', flexDirection: 'column', maxWidth: '100%', padding: '0 16px' }\n : { maxWidth: 590, ml: '40%', mr: 90 }),\n }}\n >\n <StepTwo />\n </Box>\n )}\n {step === 3 && (\n <Box\n sx={{\n ...(isMobile\n ? { display: 'flex', flexDirection: 'column', maxWidth: '100%', padding: '0 16px' }\n : { maxWidth: 590, ml: '40%', mr: 90 }),\n }}\n >\n <H1 pb={12}>{customCopy.add_income_title}</H1>\n <P mb={24}>{customCopy.add_income_description}</P>\n\n {selectedTransactions.length > 0 && !transaction && (\n <>\n <List>\n {selectedTransactions.map((transaction, index) => {\n return (\n <React.Fragment key={transaction.guid}>\n <SubheaderRow bgcolor=\"background.paper\">\n {fromUnixToDayOfWeekAndDate(\n getUnixTime(transaction.nextDate || transaction.date),\n )}\n </SubheaderRow>\n <TransactionRow transaction={transaction} />\n {index !== selectedTransactions.length - 1 && <Divider />}\n </React.Fragment>\n )\n })}\n </List>\n <Stack alignItems=\"center\" direction=\"row\">\n <Divider sx={{ flexGrow: 1 }} />\n <Button\n onClick={() => setAddIncome(true)}\n startIcon={<Icon name=\"add\" size={20} />}\n >\n {customCopy.add_additional_income_button}\n </Button>\n </Stack>\n </>\n )}\n\n {showSelectIncome && (\n <SelectTransaction\n bgcolor=\"background.paper\"\n onSearch={(searchValue) =>\n setFilter({\n ...filter,\n custom: (transaction: Transaction) =>\n searchValue\n ? incomeFilterSearch(transaction, searchValue)\n : incomeFilter(transaction),\n })\n }\n onSelected={(guid) => {\n setTransactionGuid(guid)\n setAddIncome(false)\n }}\n />\n )}\n\n {!canSubmit && isDirty && (\n <P color=\"error\" mt={16}>\n {customCopy.confirm_error}\n </P>\n )}\n\n {transaction && (\n <>\n <AddActivityDetails\n bgcolor=\"background.paper\"\n frequency={frequency}\n isIncome={true}\n nextDate={nextDate}\n onFrequencyChange={setFrequency}\n onNextDateChange={setNextDate}\n transaction={transaction}\n />\n <Stack direction=\"row\" gap={16} ml={24} mt={32}>\n <Button\n aria-disabled={!transaction || !nextDate}\n onClick={() => {\n const updatedTransactions = [...selectedTransactions]\n updatedTransactions.push({ ...transaction, nextDate, frequency })\n\n setSelectedTransactions(updatedTransactions)\n setTransactionGuid('')\n }}\n variant=\"contained\"\n >\n {commonCopy.confirm_button}\n </Button>\n <Button\n onClick={() => {\n setTransactionGuid('')\n setAddIncome(true)\n handleGetTransactions()\n }}\n variant=\"outlined\"\n >\n {commonCopy.cancel_button}\n </Button>\n </Stack>\n </>\n )}\n\n {selectedTransactions.length > 0 && !transaction && (\n <Stack direction=\"row\" gap={16} ml={24} mt={32}>\n <Button\n aria-disabled={selectedTransactions.length < 1 || isSubmitting}\n onClick={handleAddIncome}\n startIcon={\n isSubmitting ? (\n <Icon\n name=\"progress_activity\"\n sx={{\n animation: `${spin} 2s linear infinite`,\n }}\n />\n ) : null\n }\n variant=\"contained\"\n >\n {customCopy.confirm_income_button}\n </Button>\n <Button onClick={completeOnboarding} variant=\"outlined\">\n {customCopy.skip_button}\n </Button>\n </Stack>\n )}\n </Box>\n )}\n </Box>\n )\n}\n\nexport default observer(CashflowOnboarding)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport {\n ANALYTICS_EVENTS,\n Drawer,\n useAccountStore,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useTransactionStore,\n useUserStore,\n WidgetContainer,\n WidgetProps,\n} from '../common'\n\nimport { ActivitySettings } from '../recurringactivity'\n\nimport CashflowContent from './components/CashflowContent'\nimport CashflowHeading from './components/CashflowHeading'\nimport CashflowOnboarding from './CashflowOnboarding'\nimport { useCashflowUiStore } from './context/hooks'\n\nconst CashflowWidget: React.FC<WidgetProps> = ({ onBackClick, sx = {} }) => {\n const {\n selectedAccounts,\n selectedAccountGuids,\n setSelectedAccounts,\n shouldDisableNextDate,\n shouldDisablePrevDate,\n } = useGlobalUiStore()\n\n const { onEvent } = useEvent()\n const { cashAccounts } = useAccountStore()\n const { setFilter } = useTransactionStore()\n const { userProfile } = useUserStore()\n const { dateRange, setSelectedCashAccounts } = useCashflowUiStore()\n const { cashflow: customCopy } = useGlobalCopyStore()\n\n const [isSettingsOpen, setIsSettingsOpen] = React.useState(false)\n\n React.useEffect(() => {\n setSelectedAccounts(cashAccounts)\n }, [cashAccounts])\n\n React.useEffect(() => {\n const cashAccountGuids = cashAccounts.map((account) => account.guid)\n const selAccts = selectedAccounts.filter(\n (account) =>\n selectedAccountGuids.includes(account.guid) && cashAccountGuids.includes(account.guid),\n )\n setSelectedCashAccounts(selAccts)\n setFilter({ accounts: selAccts.map((a) => a.guid) })\n }, [cashAccounts, selectedAccounts])\n\n if (userProfile?.has_completed_cash_flow_onboarding) {\n return (\n <WidgetContainer\n accountOptions={cashAccounts}\n actions={[\n {\n label: customCopy.cashflow_settings,\n iconName: 'settings',\n onClick: () => {\n setIsSettingsOpen(true)\n onEvent(ANALYTICS_EVENTS.CASH_FLOW_CLICK_SETTINGS)\n },\n },\n ]}\n calendarActions={{\n shouldDisableNext: shouldDisableNextDate,\n shouldDisablePrevious: shouldDisablePrevDate,\n shouldDisablePicker: true,\n onRangeChanged: () => {},\n }}\n dateRange={dateRange}\n dateRangeVariant=\"readonly\"\n onAccountsFilterClick={() => onEvent(ANALYTICS_EVENTS.CASH_FLOW_CLICK_FILTER)}\n onBackClick={onBackClick}\n sx={sx}\n title={customCopy.title}\n >\n <CashflowHeading />\n\n <CashflowContent />\n\n <Drawer\n ariaLabelClose={customCopy.close_settings_aria}\n isOpen={isSettingsOpen}\n onClose={() => setIsSettingsOpen(false)}\n shouldShowHeaderBorders={false}\n title={customCopy.cashflow_settings}\n >\n <ActivitySettings />\n </Drawer>\n </WidgetContainer>\n )\n }\n\n return (\n <WidgetContainer\n onBackClick={onBackClick}\n sx={{ height: '100%', overflow: 'auto' }}\n title={customCopy.title}\n >\n <CashflowOnboarding />\n </WidgetContainer>\n )\n}\n\nexport default observer(CashflowWidget)\n","import { getUnixTime } from 'date-fns/getUnixTime'\n\nimport { ApiEndpoints, Fetch, type CashflowEvent, type CashflowSequence } from '../../common'\n\nexport class CashflowApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\n }\n\n addCashflowEvent = async (cashflowEvent: CashflowEvent) => {\n return this.fetchInstance\n .post(ApiEndpoints.CASHFLOW_EVENTS, { ...cashflowEvent })\n .then((data) => data)\n }\n\n addCashflowSequence = async (cashflowSequence: CashflowSequence) => {\n return this.fetchInstance\n .post(ApiEndpoints.CASHFLOW_SEQUENCES, { ...cashflowSequence })\n .then((data) => data.cashflow_sequence)\n }\n\n getCashflowSequences = async (): Promise<CashflowSequence[]> => {\n return this.fetchInstance\n .get(ApiEndpoints.CASHFLOW_SEQUENCES)\n .then((data) => data.cashflow_sequences)\n }\n\n getCashflowEventsByDateRange = async (\n beginDate: Date,\n endDate: Date,\n ): Promise<CashflowEvent[]> => {\n return this.fetchInstance\n .get(\n `${ApiEndpoints.CASHFLOW_EVENTS}/from/${getUnixTime(beginDate)}/to/${getUnixTime(endDate)}`,\n )\n .then((data) => data.cashflow_events)\n }\n\n deleteCashflowSequence = async (guid: string) => {\n return this.fetchInstance\n .delete(`${ApiEndpoints.CASHFLOW_SEQUENCES}/${guid}`)\n .then((data) => data)\n }\n\n getProjectedCashflowEvents = async (beginDate: Date, endDate: Date): Promise<CashflowEvent[]> => {\n return this.fetchInstance\n .get(\n `${ApiEndpoints.CASHFLOW_SEQUENCES}/projected_events/from/${getUnixTime(\n beginDate,\n )}/to/${getUnixTime(endDate)}`,\n )\n .then((data) => data.cashflow_events)\n }\n\n updateCashflowSequence = async (cashflowSequence: CashflowSequence) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.CASHFLOW_SEQUENCES}/${cashflowSequence.guid}`, cashflowSequence)\n .then((data) => data.cashflow_sequence)\n }\n}\n","import { makeAutoObservable } from 'mobx'\nimport { addDays } from 'date-fns/addDays'\nimport { differenceInDays } from 'date-fns/differenceInDays'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { isBefore } from 'date-fns/isBefore'\nimport { startOfToday } from 'date-fns/startOfToday'\n\nimport { type Account, type Activity } from '../../common'\n\nexport class UiStore {\n // Cashflow is hard-coded to display 30 days starting from today\n dateRange = { start: startOfToday(), end: addDays(startOfToday(), 30) }\n isDirty = false\n\n nextIncome: Activity | undefined = undefined\n upcomingExpenses: Activity[] = []\n\n selectedCashAccounts: Account[] = []\n\n constructor() {\n makeAutoObservable(this)\n }\n\n // Returns the number of days until the next income activity or 0 if there is no income activity\n get daysUntilNextIncome() {\n return this.nextIncome\n ? Math.abs(differenceInDays(startOfToday(), this.nextIncome.expectedDate))\n : 0\n }\n\n // Returns the expenses (Activities) until the next income activity or the end of the month\n // if there is no income activity\n get expensesTilNextIncome() {\n return this.upcomingExpenses.filter((a) =>\n isBefore(a.expectedDate, this.nextIncome?.expectedDate || endOfMonth(new Date())),\n )\n }\n\n setNextIncome = (nextIncome: Activity) => {\n this.nextIncome = nextIncome\n }\n\n setUpcomingExpenses = (expenses: Activity[]) => {\n this.upcomingExpenses = expenses\n }\n\n setSelectedCashAccounts = (accounts: Account[]) => (this.selectedCashAccounts = accounts)\n}\n","import { makeAutoObservable } from 'mobx'\n\nimport { GlobalStore, type UserProfile } from '../../common'\n\nimport { UiStore } from './UiStore'\n\nexport class CashflowStore {\n globalStore: GlobalStore\n uiStore: UiStore\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.uiStore = new UiStore()\n\n makeAutoObservable(this)\n }\n\n completeOnboarding = async () => {\n const updatedUserProfile = {\n ...this.globalStore.userStore.userProfile,\n has_completed_cash_flow_onboarding: true,\n } as UserProfile\n\n await this.globalStore.userStore.updateUserProfile(updatedUserProfile)\n }\n}\n","import { makeAutoObservable } from 'mobx'\n\nimport { WidgetApi } from '../../common'\n\nimport type { GlobalStore } from '../../common'\n\nexport class ConnectStore {\n widgetApi: WidgetApi = new WidgetApi('/', '')\n\n globalStore: GlobalStore\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n makeAutoObservable(this)\n }\n\n initialize = async (endpoint: string, token: string) => {\n this.widgetApi = new WidgetApi(endpoint, token)\n }\n\n loadWidget = async ({ widget = 'connect_widget', mode = 'light', ...rest }) => {\n return await this.widgetApi.requestWidgetUrl({\n widget_url: { widget_type: widget, color_scheme: mode, ...rest },\n })\n }\n}\n","import { formatDuration, intervalToDuration } from 'date-fns'\n\nimport { Debt, formatCurrency, formatDate, DATE_FORMATS_INTL } from '../../common'\n\ntype PayoffProjection = {\n payoffSavings: string\n payoffDate: string\n payoffDuration: string\n}\n\nexport function getPayoffProjection(debts: Debt[], extraPayment?: number): PayoffProjection {\n // Sort non-zero debts by balance (ascending)\n const sortedDebts = debts.filter((d) => d.balance > 0).sort((a, b) => a.balance - b.balance)\n\n let totalSavings = 0\n let monthlyExtra = extraPayment ?? 0\n const startDate = new Date()\n const endDate = new Date()\n\n while (sortedDebts.some((debt) => debt.balance > 0)) {\n for (const debt of sortedDebts) {\n if (debt.balance <= 0) continue\n\n const monthlyInterest = (debt.balance * debt.interest_rate) / 12\n totalSavings += monthlyInterest\n\n // Apply monthly payment with any extra payment\n const appliedPayment = Math.min(debt.balance, debt.monthly_payment + monthlyExtra)\n debt.balance -= appliedPayment\n\n // If debt was paid off, roll over (\"snowball\") its payment as extra payment\n if (debt.balance <= 0) {\n monthlyExtra += debt.monthly_payment\n }\n }\n\n // Increment to the next month\n endDate.setMonth(endDate.getMonth() + 1)\n }\n\n const duration = intervalToDuration({ start: startDate, end: endDate })\n\n return {\n payoffSavings: formatCurrency(totalSavings, '0,0.00'),\n payoffDate: formatDate(endDate, DATE_FORMATS_INTL.MONTH_YEAR),\n payoffDuration: formatDuration(duration, { format: ['years', 'months'] }),\n }\n}\n","import React, { MouseEventHandler } from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { Card, Stack, useTheme } from '@mui/material'\nimport { Text } from '@kyper/mui'\n\nimport { useDebtStore, useScreenSize } from '../../common'\nimport { getPayoffProjection } from '../utils/SnowballCard'\n\nconst copy = {\n date_description: 'Debt-free by',\n amount_description: 'total savings by snowballing minimum payments',\n duration_description: 'debt-free acceleration',\n drawer_cta: 'What is Snowballing?',\n}\n\nconst SnowballCard = ({ onClickCta, sx }: { onClickCta: MouseEventHandler; sx?: any }) => {\n const theme = useTheme()\n const { isMobile } = useScreenSize()\n const { debts } = useDebtStore()\n\n const { payoffDate, payoffSavings, payoffDuration } = React.useMemo(() => {\n return getPayoffProjection(debts)\n }, [debts])\n\n return (\n <Card sx={{ width: isMobile ? '100%' : '186px', minWidth: '186px', ...sx }}>\n <Stack sx={{ gap: '12px', p: '16px' }}>\n <Stack\n flexDirection={isMobile ? 'row' : 'column'}\n gap={isMobile ? '4px' : '0'}\n sx={{\n borderBottom: '1px solid',\n borderBottomColor: theme.palette.grey[300],\n pb: '8px',\n }}\n >\n <Text variant=\"XSmall\">{copy.date_description}</Text>\n <Text bold={true} color={theme.palette.primary.main} variant=\"Small\">\n {payoffDate}\n </Text>\n </Stack>\n <Stack flexDirection={isMobile ? 'row' : 'column'} gap={isMobile ? '4px' : '0'}>\n <Text bold={true} variant=\"Small\">\n {payoffSavings}\n </Text>\n <Text sx={{ whiteSpace: 'normal' }} variant=\"XSmall\">\n {copy.amount_description}\n </Text>\n </Stack>\n <Stack flexDirection={isMobile ? 'row' : 'column'} gap={isMobile ? '4px' : '0'}>\n <Text bold={true} variant=\"Small\">\n {payoffDuration}\n </Text>\n <Text variant=\"XSmall\">{copy.duration_description}</Text>\n </Stack>\n <Text\n bold={true}\n color={theme.palette.primary.main}\n onClick={onClickCta}\n sx={{ cursor: 'pointer' }}\n variant=\"Small\"\n >\n {copy.drawer_cta}\n </Text>\n </Stack>\n </Card>\n )\n}\n\nexport default observer(SnowballCard)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { Box, Card, Stack, useTheme } from '@mui/material'\nimport { Text } from '@kyper/mui'\n\nimport { buildDynamicCopy, Drawer } from '../../common'\n\nconst copy = {\n title: 'Snowball Method',\n subtitle: 'Benefits of the snowball method',\n payoff_savings: '$361.71',\n amount_description: 'Interest Saved',\n duration_description: 'in in 3 yrs, 0 mo',\n card_question: 'What is the snowballing method?',\n card_answer:\n 'The snowball method helps you pay off multiple debts quickly by paying the same combined amount every month. When you’ve paid off the highest-priority debt, take that monthly payment and put it toward your next debt. The monthly total you pay for all the debts remains the same.',\n card_more: 'Read More',\n card_less: 'See Less',\n disclaimer:\n 'This information is for demonstration purposes and does not reflect your actual data.',\n month_header: 'Month _1{month_number}',\n payment_header: 'Payment',\n paid_label: 'Paid Off',\n total_label: 'Total payment',\n debt_label: 'Debt _1{label}',\n rollover_explainer_pt1: 'Put this _1{amount} towards ',\n rollover_explainer_pt2: ' next month.',\n}\n\ninterface SnowballDrawerProps {\n isOpen: boolean\n onClose: () => void\n sx?: any\n}\n\nconst SnowballDrawer = ({ isOpen, onClose, sx }: SnowballDrawerProps) => {\n const theme = useTheme()\n const [readMore, setReadMore] = React.useState(false)\n\n return (\n <Drawer ariaLabelClose={''} isOpen={isOpen} onClose={onClose} sx={{ ...sx }} title={copy.title}>\n <Stack bgcolor={theme.palette.grey[100]} height=\"100%\">\n {/* Drawer Header */}\n <Stack alignItems={'center'} px={24} py={24}>\n <Stack alignItems={'center'} pb={24}>\n <Text mb={12} variant=\"H3\">\n {copy.subtitle}\n </Text>\n <Text color={theme.palette.grey[700]} variant=\"Small\">\n {copy.amount_description}\n </Text>\n <Text variant=\"H1\">{copy.payoff_savings}</Text>\n <Text color={theme.palette.grey[700]} variant=\"Small\">\n {copy.duration_description}\n </Text>\n </Stack>\n {/* Drawer Info Card */}\n <Card sx={{ display: 'grid', py: 16, px: 24 }}>\n <Text mb={4} variant=\"H3\">\n {copy.card_question}\n </Text>\n <Text\n color={theme.palette.grey[700]}\n mb={8}\n sx={{ whiteSpace: readMore ? 'normal' : 'nowrap' }}\n variant=\"ParagraphSmall\"\n >\n {copy.card_answer}\n </Text>\n <Text\n bold={true}\n color={theme.palette.primary.main}\n onClick={() => setReadMore(!readMore)}\n sx={{ cursor: 'pointer' }}\n variant=\"Small\"\n >\n {!readMore ? copy.card_more : copy.card_less}\n </Text>\n </Card>\n </Stack>\n {/* Drawer Payoff Table */}\n <Stack>\n {/* Drawer Disclaimer */}\n <Text\n color={theme.palette.grey[700]}\n px={24}\n sx={{ textAlign: 'center', whiteSpace: 'normal' }}\n variant=\"Small\"\n >\n {copy.disclaimer}\n </Text>\n\n <Stack flexDirection=\"row\" justifyContent=\"space-between\" sx={{ pt: 12, px: 24, pb: 8 }}>\n <Text bold={true} variant=\"XSmall\">\n {buildDynamicCopy(copy.month_header, 1) as string}\n </Text>\n <Text bold={true} variant=\"XSmall\">\n {copy.payment_header}\n </Text>\n </Stack>\n <Stack bgcolor={theme.palette.background.paper} mb={24}>\n <Stack alignItems=\"center\" flexDirection=\"row\" pl={24}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n borderRadius: '50%',\n backgroundColor: theme.palette.success.main,\n marginRight: 12,\n }}\n >\n <Text color=\"white\" fontWeight={700} variant=\"Small\">\n ✓\n </Text>\n </Box>\n <Stack\n sx={{\n borderBottom: `1px solid ${theme.palette.grey[300]}`,\n flexDirection: 'row',\n flexGrow: 1,\n py: 14,\n pr: 24,\n }}\n >\n <Stack flexGrow={1}>\n <Text variant=\"Body\">{buildDynamicCopy(copy.debt_label, 'A') as string}</Text>\n <Text color={theme.palette.grey[700]} variant=\"XSmall\">\n {buildDynamicCopy(copy.rollover_explainer_pt1, '$100') as string}\n <strong>{buildDynamicCopy(copy.debt_label, 'B') as string}</strong>\n {copy.rollover_explainer_pt2}\n </Text>\n </Stack>\n <Stack>\n <Text variant=\"Body\">$100.00</Text>\n <Text\n bold={true}\n color={theme.palette.success.main}\n textAlign=\"end\"\n variant=\"Tiny\"\n >\n {copy.paid_label}\n </Text>\n </Stack>\n </Stack>\n </Stack>\n <Stack alignItems=\"center\" flexDirection=\"row\" pl={24}>\n <Box\n sx={{\n width: 20,\n height: 20,\n marginRight: 12,\n borderRadius: '50%',\n border: `3px solid ${theme.palette.grey[700]}`,\n }}\n />\n <Stack\n sx={{\n borderBottom: `1px solid ${theme.palette.grey[300]}`,\n flexDirection: 'row',\n flexGrow: 1,\n py: 14,\n pr: 24,\n }}\n >\n <Text flexGrow={1} variant=\"Body\">\n {buildDynamicCopy(copy.debt_label, 'B') as string}\n </Text>\n <Text variant=\"Body\">$400.00</Text>\n </Stack>\n </Stack>\n <Stack alignItems=\"center\" flexDirection=\"row\" pl={24} py={14}>\n <Box\n sx={{\n width: 20,\n height: 20,\n marginRight: 12,\n borderRadius: '50%',\n border: `3px solid ${theme.palette.grey[700]}`,\n }}\n />\n <Stack flexDirection=\"row\" flexGrow={1} pr={24}>\n <Text flexGrow={1} variant=\"Body\">\n {buildDynamicCopy(copy.debt_label, 'C') as string}\n </Text>\n <Text variant=\"Body\">$1,000.00</Text>\n </Stack>\n </Stack>\n <Stack\n sx={{\n py: 8,\n px: 24,\n flexDirection: 'row',\n justifyContent: 'space-between',\n borderTop: `1px solid ${theme.palette.grey[300]}`,\n borderBottom: `1px solid ${theme.palette.grey[300]}`,\n }}\n >\n <Text bold={true} variant=\"Body\">\n {copy.total_label}\n </Text>\n <Text bold={true} variant=\"Body\">\n $1,500.00\n </Text>\n </Stack>\n </Stack>\n\n <Stack flexDirection=\"row\" justifyContent=\"space-between\" sx={{ pt: 12, px: 24, pb: 8 }}>\n <Text bold={true} variant=\"XSmall\">\n {buildDynamicCopy(copy.month_header, 2) as string}\n </Text>\n <Text bold={true} variant=\"XSmall\">\n {copy.payment_header}\n </Text>\n </Stack>\n <Stack bgcolor={theme.palette.background.paper} mb={24}>\n <Stack alignItems=\"center\" flexDirection=\"row\" pl={24}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n borderRadius: '50%',\n backgroundColor: theme.palette.success.main,\n marginRight: 12,\n }}\n >\n <Text color=\"white\" fontWeight={700} variant=\"Small\">\n ✓\n </Text>\n </Box>\n <Stack\n sx={{\n borderBottom: `1px solid ${theme.palette.grey[300]}`,\n flexDirection: 'row',\n flexGrow: 1,\n py: 14,\n pr: 24,\n }}\n >\n <Stack flexGrow={1}>\n <Text variant=\"Body\">{buildDynamicCopy(copy.debt_label, 'B') as string}</Text>\n <Text color={theme.palette.grey[700]} variant=\"XSmall\">\n {buildDynamicCopy(copy.rollover_explainer_pt1, '$500') as string}\n <strong>{buildDynamicCopy(copy.debt_label, 'C') as string}</strong>\n {copy.rollover_explainer_pt2}\n </Text>\n </Stack>\n <Stack>\n <Text variant=\"Body\">$500.00</Text>\n <Text\n bold={true}\n color={theme.palette.success.main}\n textAlign=\"end\"\n variant=\"Tiny\"\n >\n {copy.paid_label}\n </Text>\n </Stack>\n </Stack>\n </Stack>\n <Stack alignItems=\"center\" flexDirection=\"row\" pl={24}>\n <Box\n sx={{\n width: 20,\n height: 20,\n marginRight: 12,\n borderRadius: '50%',\n border: `3px solid ${theme.palette.grey[700]}`,\n }}\n />\n <Stack\n sx={{\n flexDirection: 'row',\n flexGrow: 1,\n py: 14,\n pr: 24,\n }}\n >\n <Text flexGrow={1} variant=\"Body\">\n {buildDynamicCopy(copy.debt_label, 'C') as string}\n </Text>\n <Text variant=\"Body\">$1,000.00</Text>\n </Stack>\n </Stack>\n <Stack\n sx={{\n py: 8,\n px: 24,\n flexDirection: 'row',\n justifyContent: 'space-between',\n borderTop: `1px solid ${theme.palette.grey[300]}`,\n borderBottom: `1px solid ${theme.palette.grey[300]}`,\n }}\n >\n <Text bold={true} variant=\"Body\">\n {copy.total_label}\n </Text>\n <Text bold={true} variant=\"Body\">\n $1,500.00\n </Text>\n </Stack>\n </Stack>\n\n <Stack flexDirection=\"row\" justifyContent=\"space-between\" sx={{ pt: 12, px: 24, pb: 8 }}>\n <Text bold={true} variant=\"XSmall\">\n {buildDynamicCopy(copy.month_header, 3) as string}\n </Text>\n <Text bold={true} variant=\"XSmall\">\n {copy.payment_header}\n </Text>\n </Stack>\n <Stack bgcolor={theme.palette.background.paper} mb={24}>\n <Stack alignItems=\"center\" flexDirection=\"row\" pl={24}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n borderRadius: '50%',\n backgroundColor: theme.palette.success.main,\n marginRight: 12,\n }}\n >\n <Text color=\"white\" fontWeight={700} variant=\"Small\">\n ✓\n </Text>\n </Box>\n <Stack\n sx={{\n alignItems: 'center',\n flexDirection: 'row',\n flexGrow: 1,\n py: 14,\n pr: 24,\n }}\n >\n <Stack flexGrow={1}>\n <Text variant=\"Body\">{buildDynamicCopy(copy.debt_label, 'C') as string}</Text>\n </Stack>\n <Stack>\n <Text variant=\"Body\">$1,500.00</Text>\n <Text\n bold={true}\n color={theme.palette.success.main}\n textAlign=\"end\"\n variant=\"Tiny\"\n >\n {copy.paid_label}\n </Text>\n </Stack>\n </Stack>\n </Stack>\n <Stack\n sx={{\n py: 8,\n px: 24,\n flexDirection: 'row',\n justifyContent: 'space-between',\n borderTop: `1px solid ${theme.palette.grey[300]}`,\n borderBottom: `1px solid ${theme.palette.grey[300]}`,\n }}\n >\n <Text bold={true} variant=\"Body\">\n {copy.total_label}\n </Text>\n <Text bold={true} variant=\"Body\">\n $1,500.00\n </Text>\n </Stack>\n </Stack>\n </Stack>\n </Stack>\n </Drawer>\n )\n}\n\nexport default observer(SnowballDrawer)\n","import React from 'react'\nimport { LineSeriesType, LineChart, HighlightItemData } from '@mui/x-charts'\nimport { useTheme } from '@mui/material/styles'\n\nimport { formatCurrency, formatDate, DATE_FORMATS_INTL } from '../../common'\n\nconst BASE_LINE_COLOR = '#FF7B08'\n\nfunction adjustBrightness(color: string, factor: number): string {\n const [r, g, b] = color\n .replace(/^#/, '')\n .match(/.{1,2}/g)!\n .map((hex) => parseInt(hex, 16))\n\n const newColor = [\n Math.max(0, Math.min(255, Math.round(r * factor))),\n Math.max(0, Math.min(255, Math.round(g * factor))),\n Math.max(0, Math.min(255, Math.round(b * factor))),\n ]\n\n return `rgb(${newColor[0]}, ${newColor[1]}, ${newColor[2]})`\n}\n\ntype DataPoint = { x: Date; y: number }\ntype Dataset = DataPoint[]\n\ninterface DebtData {\n guid: string | undefined\n name: string\n dataset: Dataset\n}\n\ninterface DebtsChartProps {\n sx?: any\n height?: number\n width?: number\n debts: DebtData[]\n hoveredDebtGuid: string\n onHoverArea: (debtGuid: string) => void\n}\n\ninterface DebtsChartSeries extends LineSeriesType {\n guid?: string | null\n}\n\nexport const DebtsChart: React.FC<DebtsChartProps> = ({\n sx,\n height = 500,\n width,\n debts,\n hoveredDebtGuid,\n onHoverArea,\n}) => {\n // TODO: Ask design team about color selection rules\n const theme = useTheme()\n\n // Generate sorted array of unique dates\n const uniqueXValues = [\n ...new Set(debts.flatMap((debt) => debt.dataset.map((point) => new Date(point.x).getTime()))),\n ]\n .sort((a, b) => a - b)\n .map((timestamp) => new Date(timestamp))\n\n // Normalize datasets with missing dates\n const normalizedDatasets = debts.map((debt) => {\n const datasetMap = new Map(debt.dataset.map((point) => [new Date(point.x).getTime(), point.y]))\n\n let lastY = datasetMap.get(uniqueXValues[0].getTime()) ?? 0\n const normalizedDataset = uniqueXValues.map((x) => {\n const y = datasetMap.get(x.getTime()) ?? lastY // Use last known value for missing points\n lastY = y\n return { x, y }\n })\n\n return { ...debt, dataset: normalizedDataset }\n })\n\n const initialTotalDebt = normalizedDatasets.reduce(\n (sum, debt) => sum + (debt.dataset[0]?.y ?? 0),\n 0,\n )\n\n const payoffLine = uniqueXValues.map((x, index) => {\n const linearRate = index / (uniqueXValues.length - 1)\n const y = initialTotalDebt * (1 - linearRate)\n return { x, y }\n })\n\n const yMax = Math.ceil(initialTotalDebt / 100) * 100\n const xData = uniqueXValues\n\n const series: DebtsChartSeries[] = normalizedDatasets.map((debt, index) => {\n const brightnessFactor = 1 - (index / normalizedDatasets.length) * 0.5\n const seriesColor = adjustBrightness(BASE_LINE_COLOR, brightnessFactor)\n\n return {\n id: `debt-${index}`,\n guid: debt.guid,\n label: debt.name,\n data: debt.dataset.map((point) => point.y),\n color: seriesColor,\n curve: 'linear',\n type: 'line',\n area: true,\n stack: 'total',\n showMark: false,\n }\n })\n\n series.push({\n id: 'payoff-line',\n label: 'Payoff Line',\n data: payoffLine.map((point) => point.y),\n color: theme.palette.grey[700],\n curve: 'linear',\n type: 'line',\n stack: undefined,\n showMark: false,\n disableHighlight: true,\n })\n\n const getIndexByGuid = (guid: string) => {\n return series.findIndex((s) => s?.guid === guid)\n }\n\n const onHighlightChange = (line: HighlightItemData | null) => {\n const highlightedGuid = series.find((s) => s.id === line?.seriesId)?.guid\n onHoverArea(highlightedGuid ?? '')\n }\n\n return (\n <LineChart\n axisHighlight={{ x: 'none' }}\n disableLineItemHighlight={true}\n height={height}\n onHighlightChange={onHighlightChange}\n series={series}\n skipAnimation={true}\n slotProps={{\n legend: {\n hidden: true,\n },\n }}\n sx={{\n p: 4,\n '& .MuiBarLabel-root': {\n fontSize: 10,\n fontWeight: 600,\n },\n '& .MuiAreaElement-root': {\n opacity: 0.4,\n transition: 'opacity 0.3s ease',\n },\n '& .MuiAreaElement-root:hover': {\n opacity: 1,\n },\n '& .MuiLineElement-series-payoff-line': {\n strokeDasharray: '10 5',\n strokeWidth: 1,\n },\n [`& .MuiLineElement-series-debt-${getIndexByGuid(hoveredDebtGuid)}`]: {\n opacity: 1,\n },\n [`& .MuiAreaElement-series-debt-${getIndexByGuid(hoveredDebtGuid)}`]: {\n opacity: 1,\n },\n ...sx,\n }}\n tooltip={{ trigger: 'none' }}\n width={width}\n xAxis={[\n {\n data: xData,\n scaleType: 'time',\n min: uniqueXValues[0],\n disableTicks: true,\n valueFormatter: (value: Date) => formatDate(value, DATE_FORMATS_INTL.MONTH_SHORT_YEAR),\n },\n ]}\n yAxis={[\n {\n min: 0,\n max: yMax,\n disableTicks: true,\n valueFormatter: (value: number) => formatCurrency(value, '0,0'),\n },\n ]}\n />\n )\n}\n","import { Text } from '@kyper/mui'\nimport { GridColumnHeaderParams } from '@mui/x-data-grid'\n\nexport const HeaderCell = (params: GridColumnHeaderParams) => (\n <Text fontWeight={600} variant=\"Small\">\n {params.colDef.headerName}\n </Text>\n)\n","import { GridCellParams } from '@mui/x-data-grid-pro'\nimport Box from '@mui/material/Box'\nimport { Text } from '@kyper/mui'\n\nconst getColors = (priority: any) => {\n const colors = {\n text: '#121417',\n background: '#FFB252',\n }\n\n if (priority === '!') {\n colors.text = '#FFFFFF'\n colors.background = '#DF320C'\n }\n\n if (priority === '✓') {\n colors.text = '#FFFFFF'\n colors.background = '#09A57F'\n }\n\n return colors\n}\n\nexport const PriorityCell = (params: GridCellParams) => {\n const priority = String(params.formattedValue)\n const colors = getColors(priority)\n\n return (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20, // Adjust the size as needed\n height: 20,\n borderRadius: '50%',\n backgroundColor: colors.background,\n marginLeft: '10px',\n }}\n >\n <Text color={colors.text} fontWeight={700} variant=\"Small\">\n {priority}\n </Text>\n </Box>\n )\n}\n","import { GridCellParams } from '@mui/x-data-grid-pro'\nimport { InstitutionLogo, Text } from '@kyper/mui'\nimport Stack from '@mui/material/Stack'\n\nimport { AccountTypeName, type Account } from '../../../common'\n\nexport const AccountCell = (params: GridCellParams) => {\n const account = params.row.account as Account\n const accountType = AccountTypeName[account.account_type]\n\n return (\n <Stack alignItems=\"center\" flexDirection=\"row\">\n <InstitutionLogo\n alt={`${account.institutionName}`}\n institutionGuid={account.institution_guid || ''}\n />\n <Stack ml={12}>\n <Text variant=\"Small\">{account.name}</Text>\n <Text variant=\"XSmall\">{accountType}</Text>\n </Stack>\n </Stack>\n )\n}\n\nexport default AccountCell\n","import React from 'react'\nimport Box from '@mui/material/Box'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { DataGridPro, GridColDef, GridSortModel } from '@mui/x-data-grid-pro'\n\nimport {\n ANALYTICS_EVENTS,\n DATE_FORMATS_INTL,\n Debt,\n formatCurrency,\n formatDate,\n useEvent,\n} from '../../common'\n\nimport { HeaderCell } from '../../trends/components/trendstable/HeaderCell'\nimport { PriorityCell } from './debtstable/PriorityCell'\nimport { AccountCell } from './debtstable/AccountCell'\nimport { useTheme } from '@mui/material'\n\nfunction getPriority(debt: Debt) {\n if (debt.position === undefined) return '!'\n if (debt.is_paid_off) return '✓'\n return debt.position\n}\n\ntype Priority = number | '!' | '✓'\nfunction priorityComparator(a: Priority, b: Priority) {\n const getWeight = (value: Priority) => {\n if (typeof value === 'number') return value // Numbers sorted naturally\n if (value === '!') return Infinity - 1 // '!' comes after numbers\n if (value === '✓') return Infinity // '✓' comes last\n throw new Error('Unsupported value')\n }\n return getWeight(a) - getWeight(b) // Compare based on weights\n}\n\ninterface DebtsTableProps {\n sx?: any\n debts: Debt[]\n hoveredDebtGuid: string\n onHoverRow?: (debtGuid: string) => void\n onClickRow?: (debtGuid: string) => void\n}\n\nexport const DebtsTable: React.FC<DebtsTableProps> = ({\n sx = {},\n debts,\n hoveredDebtGuid,\n onHoverRow,\n onClickRow,\n}) => {\n const theme = useTheme()\n const { onEvent } = useEvent()\n const [sortModel, setSortModel] = React.useState<GridSortModel>([\n { field: 'priority', sort: 'asc' },\n ])\n\n const columns: GridColDef[] = [\n {\n field: 'priority',\n headerName: 'Priority',\n renderHeader: HeaderCell,\n renderCell: PriorityCell,\n sortComparator: priorityComparator,\n sortable: true,\n hideSortIcons: true,\n type: 'custom',\n align: 'left',\n headerAlign: 'left',\n minWidth: 72,\n flex: 0.4,\n },\n {\n field: 'account',\n headerName: 'Account',\n renderHeader: HeaderCell,\n renderCell: AccountCell,\n sortable: false,\n type: 'custom',\n align: 'left',\n headerAlign: 'left',\n minWidth: 225,\n flex: 1,\n },\n {\n field: 'balance',\n headerName: 'Balance',\n renderHeader: HeaderCell,\n valueFormatter: (val) => formatCurrency(val, '0,0'),\n sortable: true,\n hideSortIcons: true,\n type: 'number',\n align: 'left',\n headerAlign: 'left',\n minWidth: 122,\n flex: 0.6,\n },\n {\n field: 'apr',\n headerName: 'APR',\n renderHeader: HeaderCell,\n valueFormatter: (v) => `${Number(v * 100).toFixed(2)}%`,\n sortable: true,\n hideSortIcons: true,\n type: 'number',\n align: 'left',\n headerAlign: 'left',\n minWidth: 122,\n flex: 0.6,\n },\n {\n field: 'payoffDate',\n headerName: 'Final Payment',\n renderHeader: HeaderCell,\n valueFormatter: (v) =>\n v ? formatDate(fromUnixTime(v), DATE_FORMATS_INTL.MONTH_SHORT_YEAR) : '',\n sortable: true,\n hideSortIcons: true,\n type: 'number',\n align: 'left',\n headerAlign: 'left',\n minWidth: 122,\n flex: 0.6,\n },\n {\n field: 'payment',\n headerName: 'Amount Due',\n renderHeader: HeaderCell,\n valueFormatter: (val) => formatCurrency(val, '0,0'),\n sortable: true,\n hideSortIcons: true,\n type: 'number',\n align: 'left',\n headerAlign: 'left',\n minWidth: 122,\n flex: 0.6,\n },\n ]\n\n const rows = React.useMemo(() => {\n return debts.map((d, idx) => ({\n id: idx,\n guid: d.guid,\n priority: getPriority(d),\n account: d.account,\n balance: d.balance,\n apr: d.interest_rate,\n payoffDate: d.projected_payoff_date,\n payment: d.monthly_payment,\n }))\n }, [debts])\n\n const onMouseEnterRow = (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n const target = event.target as HTMLElement\n const rowEl = target.closest('[data-id]')\n const debtIdx = rowEl?.getAttribute('data-id')\n const hoveredDebt = debts[Number(debtIdx)]\n onHoverRow?.(hoveredDebt?.guid ?? '')\n }\n\n const getRowIdByGuid = (guid: string) => {\n return rows.find((r) => r.guid === guid)?.id\n }\n\n return (\n <Box\n sx={{\n height: '100dvh',\n width: '100%',\n mt: '15px',\n overflowX: 'auto',\n boxShadow: 'none',\n ...sx,\n }}\n >\n <DataGridPro\n columns={columns}\n disableColumnFilter={true}\n disableColumnMenu={true}\n hideFooter={true}\n initialState={{ sorting: { sortModel } }}\n onRowClick={(r) => {\n onClickRow?.(r.row.category)\n onEvent(ANALYTICS_EVENTS.TRENDS_CLICK_TABLE_ROW)\n }}\n onSortModelChange={(newModel) => {\n setSortModel(newModel)\n onEvent(ANALYTICS_EVENTS.TRENDS_CLICK_TABLE_SORT)\n }}\n rows={rows}\n slotProps={{\n baseIconButton: { color: 'secondary', sx: { ml: 8 } },\n row: {\n onMouseEnter: onMouseEnterRow,\n onMouseLeave: () => onHoverRow?.(''),\n },\n }}\n sortModel={sortModel}\n sortingOrder={['asc', 'desc']}\n sx={{\n [`& .MuiDataGrid-row[data-id=\"${getRowIdByGuid(hoveredDebtGuid)}\"]`]: {\n backgroundColor: theme.palette.mode === 'light' ? '#f8f9fb' : '#1f2329',\n filter: 'brightness(98%)',\n },\n }}\n />\n </Box>\n )\n}\n","import { type Debt } from '../../common'\n\nconst transformDebtsChartData = (debts: Debt[]) => {\n return debts\n .filter((d) => d.balance > 0)\n .map((debt) => {\n // Generate example payoff data based on monthly payments\n const monthlyPayment = debt.monthly_payment\n const initialBalance = debt.current_amount\n const payoffData = []\n\n if (monthlyPayment > 0) {\n let remainingBalance = initialBalance\n const date = new Date()\n\n while (remainingBalance > 0) {\n payoffData.push({ x: new Date(date), y: remainingBalance })\n remainingBalance -= monthlyPayment\n date.setMonth(date.getMonth() + 1)\n }\n payoffData.push({ x: new Date(date), y: 0 }) // Ensure final data point is zero\n }\n\n return {\n guid: debt.guid,\n name: debt.name,\n dataset: payoffData,\n }\n })\n}\n\nexport { transformDebtsChartData }\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport Stack from '@mui/material/Stack'\n\nimport {\n Loader,\n useAccountStore,\n useDebtStore,\n useGlobalUiStore,\n useGoalStore,\n useScreenSize,\n WidgetContainer,\n WidgetProps,\n} from '../common'\n\nimport SnowballCard from './components/SnowballCard'\nimport SnowballDrawer from './components/SnowballDrawer'\nimport { DebtsChart } from './components/DebtsChart'\nimport { DebtsTable } from './components/DebtsTable'\nimport { transformDebtsChartData } from './utils/DebtsWidget'\n\nconst copy = {\n title: 'Debts',\n}\n\nconst DebtsWidget: React.FC<WidgetProps> = ({ onBackClick, sx }) => {\n const [isWidgetInitialized, setIsWidgetInitialized] = React.useState(false)\n const [hoveredDebtGuid, setHoveredDebtGuid] = React.useState('')\n const [isDrawerOpen, setIsDrawerOpen] = React.useState(false)\n\n const { isInitialized, setSelectedAccounts } = useGlobalUiStore()\n const { isDesktop, isMobile } = useScreenSize()\n const { loadGoals } = useGoalStore()\n const { accounts } = useAccountStore()\n const { debts } = useDebtStore()\n\n React.useEffect(() => {\n if (isInitialized) {\n loadGoals()\n setSelectedAccounts(accounts)\n setIsWidgetInitialized(true)\n }\n }, [isInitialized])\n\n const debtsChartData = React.useMemo(() => transformDebtsChartData(debts), [debts])\n const debtsTableData = React.useMemo(() => debts, [debts])\n\n const onHoverDebt = (guid: string) => setHoveredDebtGuid(guid)\n const onAccountFilterClick = () => {}\n\n if (!isInitialized || !isWidgetInitialized) {\n return <Loader />\n }\n\n return (\n <WidgetContainer\n accountOptions={accounts}\n onAccountsFilterClick={onAccountFilterClick}\n onBackClick={onBackClick}\n sx={sx}\n title={copy.title}\n >\n <Stack sx={{ px: isDesktop ? '48px' : '24px' }}>\n <Stack\n alignItems={isMobile ? 'flex-start' : 'flex-end'}\n flexDirection={isMobile ? 'column' : 'row'}\n >\n <DebtsChart\n debts={debtsChartData}\n hoveredDebtGuid={hoveredDebtGuid}\n onHoverArea={onHoverDebt}\n sx={{ mr: isMobile ? '4px' : '-48px' }}\n />\n <SnowballCard\n onClickCta={() => setIsDrawerOpen(true)}\n sx={{ mb: isMobile ? '0px' : '64px' }}\n />\n </Stack>\n <DebtsTable\n debts={debtsTableData}\n hoveredDebtGuid={hoveredDebtGuid}\n onHoverRow={onHoverDebt}\n />\n </Stack>\n <SnowballDrawer isOpen={isDrawerOpen} onClose={() => setIsDrawerOpen(false)} />\n </WidgetContainer>\n )\n}\n\nexport default observer(DebtsWidget)\n","import { fromUnixTime, getDate, startOfMonth } from 'date-fns'\nimport { AccountType, type Account, type Debt, type Goal } from '../../common'\n\nfunction loadDebts(accounts: Account[], goals: Goal[]): Debt[] {\n const goalDebts = goals\n .map((goal) => {\n const account = accounts.find((acc) => acc.guid === goal.account_guid)\n return account ? createDebt(account, goal) : null\n })\n .filter((debt) => debt !== null)\n\n const liabilityDebts = accounts\n .filter((acc) => !goalDebts.some((debt) => debt?.account.guid === acc.guid))\n .map((account) => createDebt(account))\n\n const debts = [...goalDebts, ...liabilityDebts].filter((debt) => {\n if (!debt?.account) return false\n // Exclude checking line of credit accounts with positive balance\n if (debt.account.account_type === AccountType.CHECKING_LINE_OF_CREDIT) {\n return Number(debt.account.balance) < 0\n }\n return true\n })\n\n return debts\n}\n\nfunction createDebt(account: Account, goal?: Goal): Debt {\n // Get payment day of month; default to 1st\n const paymentDay = goal?.payment_due_at ? getDate(fromUnixTime(goal.payment_due_at)) : 1\n const paymentDate = startOfMonth(new Date()).setDate(paymentDay)\n\n return {\n account,\n goal,\n guid: goal?.guid,\n name: goal?.name ?? 'Unknown',\n position: goal?.position,\n balance: goal?.current_amount ?? 0,\n interest_rate: goal?.interest_rate ?? 0,\n monthly_payment: goal?.monthly_payment ?? 0,\n current_amount: goal?.current_amount ?? 0,\n payment_due_date: paymentDate,\n projected_payoff_date: goal?.projected_to_complete_at,\n is_excluded: account.is_excluded_from_debts,\n is_paid_off: Boolean(goal?.completed_at),\n is_impossible: goal ? isImpossible(goal) : undefined,\n }\n}\n\nfunction isImpossible(goal: Goal) {\n const { current_amount, interest_rate, monthly_payment } = goal\n if (!interest_rate || !monthly_payment) return true\n\n const MONTHS = 12\n const INTEREST_TO_DECIMAL = 100\n const MAX_MONTHLY_PAYMENTS = 1200 // 1 payment / month * 12 months * 100 years\n\n const monthlyInterestRate = interest_rate / (MONTHS * INTEREST_TO_DECIMAL)\n let numberOfMonthlyPayments\n\n // Calculates the total number of monthly payments needed\n // Source https://brownmath.com/bsci/loan.htm#Eq3\n if (monthlyInterestRate !== 0) {\n numberOfMonthlyPayments =\n -Math.log(1 - (monthlyInterestRate * current_amount) / monthly_payment) /\n Math.log(1 + monthlyInterestRate)\n } else {\n numberOfMonthlyPayments = current_amount / monthly_payment\n }\n\n return !Number.isFinite(numberOfMonthlyPayments) || numberOfMonthlyPayments > MAX_MONTHLY_PAYMENTS\n}\n\nexport { createDebt, isImpossible, loadDebts }\n","import { makeAutoObservable } from 'mobx'\n\nimport { type GlobalStore, type Debt } from '../../common'\nimport { loadDebts } from '../utils/DebtStore'\n\nexport class DebtsStore {\n globalStore: GlobalStore\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n makeAutoObservable(this)\n }\n\n get debts(): Debt[] {\n const { accounts } = this.globalStore.accountStore\n const { debtGoals } = this.globalStore.goalStore\n\n return loadDebts(accounts, debtGoals)\n }\n}\n","import { makeAutoObservable } from 'mobx'\n\nimport { addMonths } from 'date-fns/addMonths'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { getMonth } from 'date-fns/getMonth'\nimport { startOfMonth } from 'date-fns/startOfMonth'\n\nimport { Account } from '../types'\nimport type { GlobalStore } from './GlobalStore'\n\nexport class GlobalUiStore {\n globalStore: GlobalStore\n isInitialized = false\n\n selectedAccounts: Account[] = []\n selectedAccountGuids: string[] = this.selectedAccounts.map((account) => account.guid)\n\n displayedDate = new Date()\n displayedDateRange = {\n start: startOfMonth(this.displayedDate),\n end: endOfMonth(this.displayedDate),\n }\n\n constructor(globalStore: GlobalStore) {\n makeAutoObservable(this)\n this.globalStore = globalStore\n }\n\n setInitialized = (isInitialized: boolean) => {\n this.isInitialized = isInitialized\n }\n\n setSelectedAccounts = (accounts: Account[]) => {\n this.selectedAccounts = accounts\n this.selectedAccountGuids = this.selectedAccounts.map((account) => account.guid)\n }\n // Sets an array of selected account guids for the AccountFilter component\n setSelectedAccountGuids = (guids: string[]) => {\n this.selectedAccounts = this.globalStore.accountStore.accounts.filter((account) =>\n guids.includes(account.guid),\n )\n this.selectedAccountGuids = guids\n }\n\n setDisplayedDate = (startDate: Date, endDate: Date) => {\n this.displayedDate = endDate\n this.displayedDateRange = {\n start: startDate,\n end: endDate,\n }\n }\n\n get shouldDisableNextDate() {\n const selectedMonth = getMonth(this.displayedDate)\n const nextMonth = getMonth(addMonths(new Date(), 1))\n\n return selectedMonth === nextMonth\n }\n\n get shouldDisablePrevDate() {\n const selectedMonth = getMonth(this.displayedDate)\n const currentMonth = getMonth(new Date())\n\n return selectedMonth === currentMonth\n }\n}\n","import Stack from '@mui/material/Stack'\n\nimport { Text } from '@kyper/mui'\n\ninterface TabTitleProps {\n title: string\n subtitle: string\n}\n\nexport function TabTitle({ title, subtitle }: TabTitleProps) {\n return (\n <Stack>\n <Text bold={true} variant=\"Body\">\n {title}\n </Text>\n <Text sx={{ fontWeight: 400 }} variant=\"Body\">\n {subtitle}\n </Text>\n </Stack>\n )\n}\n","import { fromUnixTime } from 'date-fns/fromUnixTime'\n\nimport {\n type Goal,\n type GoalsCopy,\n buildDynamicCopy,\n DATE_FORMATS_INTL,\n formatDate,\n formatPercentage,\n TrackType,\n} from '../../common'\n\nexport interface GoalStatusData {\n backgroundColor: string\n color: string\n percentage: number\n percentageText: string\n projectedText: string\n}\n\nexport function getGoalStatusData(copy: GoalsCopy, goal: Goal): GoalStatusData {\n let percentage = goal.current_amount / goal.amount\n if (percentage > 1) percentage = 1\n\n let backgroundColor = 'chart.chart1'\n let color = 'common.black'\n if (goal.track_type === TrackType.DEBT_TRACK) {\n color = 'common.white'\n backgroundColor = 'chart.chart5'\n } else if (goal.track_type === TrackType.RETIREMENT_TRACK) {\n backgroundColor = 'chart.chart6'\n }\n\n const percentageStyle = {\n style: 'percent',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n } as Intl.NumberFormatOptions\n\n const completionDate = goal.projected_to_complete_at\n ? fromUnixTime(goal.projected_to_complete_at)\n : new Date()\n\n const percentageText = buildDynamicCopy(\n copy.goal_percentage,\n formatPercentage(percentage, percentageStyle),\n ) as string\n\n const projectedText = buildDynamicCopy(\n copy.goal_projection,\n formatDate(completionDate, DATE_FORMATS_INTL.MONTH_SHORT_YEAR),\n ) as string\n\n return {\n backgroundColor,\n color,\n percentage,\n percentageText,\n projectedText,\n }\n}\n","import { observer } from 'mobx-react-lite'\n\nimport Card from '@mui/material/Card'\nimport CardContent from '@mui/material/CardContent'\nimport CardHeader from '@mui/material/CardHeader'\nimport Stack from '@mui/material/Stack'\n\nimport { H2, Text } from '@kyper/mui'\n\nimport {\n formatCurrency,\n type Goal,\n StatusBar,\n StatusBarData,\n useGlobalCopyStore,\n} from '../../common'\n\nimport { getGoalStatusData } from '../util/GoalsUtil'\nimport { CardActionArea } from '@mui/material'\nimport Avatar from '@mui/material/Avatar'\nimport { Payments } from '@mxenabled/mx-icons'\n\ninterface GoalStatusCardProps {\n goal: Goal\n onClick?: () => void\n}\n\nexport const GoalStatusCard = observer(({ goal, onClick }: GoalStatusCardProps) => {\n const { goals: copy } = useGlobalCopyStore()\n\n const {\n backgroundColor: bgcolor,\n color,\n percentage,\n percentageText,\n projectedText,\n } = getGoalStatusData(copy, goal)\n\n const data = [\n {\n color: bgcolor,\n percentage: `${percentage}`,\n },\n ] as StatusBarData[]\n\n return (\n <Card elevation={2} sx={{ borderRadius: 2 }}>\n <CardActionArea disabled={!onClick} onClick={onClick}>\n <CardHeader\n avatar={\n <Avatar sx={{ bgcolor, color, height: 48, width: 48 }} variant=\"rounded\">\n <Payments />\n </Avatar>\n }\n subheader={\n <Text variant=\"H2\">\n {`\n ${formatCurrency(goal.current_amount, '0,0.00')}/\n ${formatCurrency(goal.amount, '0,0.00')}\n `}\n </Text>\n }\n title={\n <H2 color=\"text.secondary\" fontWeight={400} variant=\"Body\">\n {goal.name}\n </H2>\n }\n />\n <CardContent sx={{ pt: 0 }}>\n <Stack gap={6}>\n <StatusBar data={data} height={24} />\n <Stack alignItems=\"center\" direction=\"row\" justifyContent=\"space-between\">\n <Text color=\"text.secondary\" variant=\"XSmall\">\n {percentageText}\n </Text>\n {goal.projected_to_complete_at && (\n <Text color=\"text.secondary\" variant=\"XSmall\">\n {projectedText}\n </Text>\n )}\n </Stack>\n </Stack>\n </CardContent>\n </CardActionArea>\n </Card>\n )\n})\n","import { observer } from 'mobx-react-lite'\n\nimport Button from '@mui/material/Button'\nimport Card from '@mui/material/Card'\nimport CardActionArea from '@mui/material/CardActionArea'\nimport CardContent from '@mui/material/CardContent'\nimport Grid from '@mui/material/Unstable_Grid2'\nimport Stack from '@mui/material/Stack'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport {\n formatCurrency,\n TrackType,\n useGlobalCopyStore,\n useGoalStore,\n useScreenSize,\n} from '../../common'\n\nimport { GoalStatusCard } from './GoalStatusCard'\n\ninterface GoalListProps {\n trackType: TrackType\n onManageClick: (trackType: TrackType) => void\n}\n\nexport const GoalList = observer(({ onManageClick, trackType }: GoalListProps) => {\n const { isMobile } = useScreenSize()\n const { goals: copy } = useGlobalCopyStore()\n const { goals: allGoals, setSelectedGoal } = useGoalStore()\n\n const goals = allGoals.filter((goal) => goal.track_type === trackType)\n const ongoing = goals.filter((goal) => !goal.is_complete)\n const complete = goals.filter((goal) => goal.is_complete)\n\n let manageButtonLabel = copy.manage_saving_goals\n if (trackType === TrackType.DEBT_TRACK) {\n manageButtonLabel = copy.manage_debt_goals\n } else if (trackType === TrackType.RETIREMENT_TRACK) {\n manageButtonLabel = copy.manage_retirement_goals\n }\n\n const zeroStateComplete =\n trackType === TrackType.DEBT_TRACK\n ? copy.zero_state_complete_debt\n : copy.zero_state_complete_savings\n\n return (\n <Stack mt={16} mx={isMobile ? 24 : 0}>\n <Stack alignItems=\"center\" direction=\"row\" justifyContent=\"space-between\" mb={8}>\n <Text color=\"text.secondary\" variant=\"Small\">\n {copy.ongoing_title}\n </Text>\n <Button endIcon={<Icon name=\"chevron_right\" />} onClick={() => onManageClick(trackType)}>\n {manageButtonLabel}\n </Button>\n </Stack>\n\n <Grid container={true} spacing={24}>\n {ongoing.map((goal, index, goals) => (\n // Goal should be full width in mobile or if it's the first goal (unless there are 2)\n <Grid key={index} xs={isMobile || (index === 0 && goals.length !== 2) ? 12 : 6}>\n <GoalStatusCard goal={goal} key={goal.guid} onClick={() => setSelectedGoal(goal)} />\n </Grid>\n ))}\n </Grid>\n\n {trackType !== TrackType.RETIREMENT_TRACK && (\n <Stack gap={16} mt={48}>\n <Text color=\"text.secondary\" variant=\"Small\">\n {copy.complete_title}\n </Text>\n {complete.length === 0 && (\n <Stack alignItems=\"center\" bgcolor=\"background.default\" borderRadius={2} py={18}>\n <Text variant=\"Small\">{zeroStateComplete}</Text>\n </Stack>\n )}\n {complete.map((goal) => (\n <Card elevation={2} key={goal.guid} sx={{ borderRadius: 2 }}>\n <CardActionArea onClick={() => setSelectedGoal(goal)}>\n <CardContent sx={{ ':last-child': { pb: 16 } }}>\n <Stack alignItems=\"center\" direction=\"row\" justifyContent=\"space-between\">\n <Stack alignItems=\"center\" direction=\"row\" gap={6}>\n <Icon color=\"success\" fill={true} name=\"check_circle\" size={20} />\n <Text color=\"text.secondary\" variant=\"Body\">\n {goal.name}\n </Text>\n </Stack>\n <Text bold={true} variant=\"Body\">\n {formatCurrency(goal.amount, '0,0.00')}\n </Text>\n </Stack>\n </CardContent>\n </CardActionArea>\n </Card>\n ))}\n </Stack>\n )}\n </Stack>\n )\n})\n","import React from 'react'\n\nimport Button from '@mui/material/Button'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { ChevronRight, AddBox } from '@mxenabled/mx-icons'\n\nimport { InstitutionLogo, Text } from '@kyper/mui'\n\nimport {\n buildDynamicCopy,\n formatCurrency,\n formatPercentage,\n Goal,\n TrackType,\n useAccountStore,\n useGlobalCopyStore,\n} from '../../common'\n\nimport { GoalStatusCard } from './GoalStatusCard'\n\ninterface GoalDetailsProps {\n goal: Goal\n}\n\nexport const GoalDetails = ({ goal }: GoalDetailsProps) => {\n const { goals: copy } = useGlobalCopyStore()\n const { accounts } = useAccountStore()\n\n const account = React.useMemo(\n () => accounts.find((a) => a.guid === goal.account_guid),\n [accounts, goal],\n )\n\n let goalTitle = copy.details_save_title\n if (goal.track_type === TrackType.DEBT_TRACK) {\n goalTitle = copy.details_debt_title\n } else if (goal.track_type === TrackType.RETIREMENT_TRACK) {\n goalTitle = copy.details_retirement_title\n }\n\n return (\n <Stack>\n <Stack mx={24}>\n <Text color=\"text.secondary\" sx={{ mb: 4, mt: 24 }} variant=\"XSmall\">\n {goalTitle}\n </Text>\n <GoalStatusCard goal={goal} />\n\n <Text color=\"text.secondary\" sx={{ mb: 4, mt: 24 }} variant=\"XSmall\">\n {copy.details_title}\n </Text>\n </Stack>\n\n <List sx={{ bgcolor: 'background.paper' }}>\n {/* TODO Replace with action */}\n <ListItem>\n <ListItemButton>\n <ListItemText\n primary={copy.details_goal_name}\n primaryTypographyProps={{ fontSize: 11 }}\n secondary={goal.name}\n secondaryTypographyProps={{ fontSize: 15, fontWeight: 600 }}\n />\n <ChevronRight />\n </ListItemButton>\n </ListItem>\n <Divider variant=\"inset\" />\n\n {(goal.track_type === TrackType.SAVINGS_TRACK ||\n goal.track_type === TrackType.RETIREMENT_TRACK) && (\n // TODO Replace with action\n <>\n <ListItem>\n <ListItemButton>\n <ListItemText\n primary={copy.details_amount_to_save}\n primaryTypographyProps={{ fontSize: 11 }}\n secondary={formatCurrency(goal.amount, '0,0')}\n secondaryTypographyProps={{ fontSize: 15, fontWeight: 600 }}\n />\n <ChevronRight />\n </ListItemButton>\n </ListItem>\n <Divider\n variant={goal.track_type === TrackType.RETIREMENT_TRACK ? 'inset' : 'fullWidth'}\n />\n </>\n )}\n\n {goal.track_type === TrackType.DEBT_TRACK && (\n <>\n {/* TODO Replace with action */}\n <ListItem>\n <ListItemButton>\n <ListItemText\n primary={copy.details_monthly_payment}\n primaryTypographyProps={{ fontSize: 11 }}\n secondary={formatCurrency(goal.monthly_payment, '0,0')}\n secondaryTypographyProps={{ fontSize: 15, fontWeight: 600 }}\n />\n <ChevronRight />\n </ListItemButton>\n </ListItem>\n <Divider variant=\"inset\" />\n\n {/* TODO Replace with action */}\n <ListItem>\n <ListItemButton>\n <ListItemText\n primary={copy.details_interest_rate}\n primaryTypographyProps={{ fontSize: 11 }}\n secondary={formatPercentage(goal.interest_rate)}\n secondaryTypographyProps={{ fontSize: 15, fontWeight: 600 }}\n />\n <ChevronRight />\n </ListItemButton>\n </ListItem>\n <Divider variant=\"inset\" />\n\n {/* TODO Replace with action */}\n <ListItem>\n <ListItemButton>\n <ListItemText\n primary={copy.details_original_balance}\n primaryTypographyProps={{ fontSize: 11 }}\n secondary={formatCurrency(goal.initial_amount, '0,0')}\n secondaryTypographyProps={{ fontSize: 15, fontWeight: 600 }}\n />\n <ChevronRight />\n </ListItemButton>\n </ListItem>\n <Divider />\n </>\n )}\n\n {goal.track_type === TrackType.RETIREMENT_TRACK && (\n <>\n {/* TODO Replace with action */}\n <ListItem>\n <ListItemButton>\n <ListItemText\n primary={copy.details_retirement_age}\n primaryTypographyProps={{ fontSize: 11 }}\n secondary={65} // TODO Where do we get this value?\n secondaryTypographyProps={{ fontSize: 15, fontWeight: 600 }}\n />\n <ChevronRight />\n </ListItemButton>\n </ListItem>\n <Divider variant=\"inset\" />\n\n {/* TODO Replace with action */}\n <ListItem>\n <ListItemButton>\n <ListItemText\n primary={copy.details_birthday}\n primaryTypographyProps={{ fontSize: 11 }}\n secondary={'08/13/1985'} // TODO Where do we get this value?\n secondaryTypographyProps={{ fontSize: 15, fontWeight: 600 }}\n />\n <ChevronRight />\n </ListItemButton>\n </ListItem>\n <Divider />\n </>\n )}\n </List>\n\n <Text color=\"text.secondary\" sx={{ mb: 4, ml: 24, mt: 12 }} variant=\"XSmall\">\n {goal.track_type === TrackType.RETIREMENT_TRACK\n ? copy.details_accounts\n : copy.details_account}\n </Text>\n\n {account && (\n <>\n <ListItem sx={{ bgcolor: 'background.paper' }}>\n <ListItemButton>\n <ListItemAvatar>\n <InstitutionLogo\n alt={account.name || ''}\n institutionGuid={account.institution_guid || ''}\n />\n </ListItemAvatar>\n <ListItemText\n primary={account.name || account.feed_name}\n secondary={formatCurrency(account.balance, '0,0.00')}\n />\n <ChevronRight />\n </ListItemButton>\n </ListItem>\n <Divider />\n </>\n )}\n\n {goal.track_type === TrackType.RETIREMENT_TRACK && (\n <>\n <ListItem\n disableGutters={true}\n disablePadding={true}\n sx={{ bgcolor: 'background.paper' }}\n >\n <ListItemButton>\n <ListItemText>\n <Stack alignItems=\"center\" color=\"action.active\" direction=\"row\" gap={8}>\n <AddBox filled={true} />\n {copy.details_add_account}\n </Stack>\n </ListItemText>\n <ChevronRight color=\"primary\" />\n </ListItemButton>\n </ListItem>\n <Divider />\n </>\n )}\n\n {goal.track_type === TrackType.SAVINGS_TRACK && (\n <>\n <Button sx={{ mb: 8, mt: 24, mx: 24 }} variant=\"text\">\n {copy.details_change_account}\n </Button>\n <Text\n color=\"text.secondary\"\n sx={{ mx: 24, textAlign: 'center', whiteSpace: 'wrap' }}\n variant=\"Paragraph\"\n >\n {buildDynamicCopy(copy.details_change_account_description, goal.name) as string}\n </Text>\n </>\n )}\n </Stack>\n )\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\n\nimport {\n ANALYTICS_EVENTS,\n buildDynamicCopy,\n Drawer,\n formatCurrency,\n Loader,\n TrackType,\n useAccountStore,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useGoalStore,\n useScreenSize,\n WidgetContainer,\n WidgetProps,\n} from '../common'\n\nimport { TabTitle } from './components/TabTitle'\nimport { GoalList } from './components/GoalList'\nimport { GoalDetails } from './components/GoalDetails'\n\nexport const GoalsWidget = observer(({ onBackClick, sx }: WidgetProps) => {\n const { onEvent } = useEvent()\n const { isMobile } = useScreenSize()\n const { accounts } = useAccountStore()\n const { isInitialized, setSelectedAccounts } = useGlobalUiStore()\n const { goals: copy } = useGlobalCopyStore()\n const { loadGoals, selectedGoal, setSelectedGoal } = useGoalStore()\n\n const [selectedTab, setSelectedTab] = React.useState(0)\n\n // TODO: Replace with calculated values\n const savingTotal = 400\n const debtTotal = 205\n const retirementTotal = 624\n\n const savingsTabSubtitle = buildDynamicCopy(\n isMobile ? copy.tab_subtitle_mobile : copy.tab_subtitle,\n formatCurrency(savingTotal, '0,0'),\n ) as string\n\n const debtTabSubtitle = buildDynamicCopy(\n isMobile ? copy.tab_subtitle_mobile : copy.tab_subtitle,\n formatCurrency(debtTotal, '0,0'),\n ) as string\n\n const retireTabSubtitle = buildDynamicCopy(\n isMobile ? copy.tab_subtitle_mobile : copy.tab_subtitle,\n formatCurrency(retirementTotal, '0,0'),\n ) as string\n\n React.useEffect(() => {\n setSelectedAccounts(accounts)\n onEvent(ANALYTICS_EVENTS.GOALS_VIEW)\n }, [])\n\n React.useEffect(() => {\n if (isInitialized) {\n loadGoals().finally()\n }\n }, [isInitialized])\n\n const handleAccountFilterClick = () => {\n onEvent(ANALYTICS_EVENTS.GOALS_CLICK_FILTER)\n }\n\n const handleAddClick = () => {\n onEvent(ANALYTICS_EVENTS.GOALS_CLICK_ADD)\n }\n\n return (\n <WidgetContainer\n accountOptions={accounts}\n actions={[\n {\n iconName: 'add',\n label: copy.add_title,\n onClick: handleAddClick,\n },\n ]}\n onAccountsFilterClick={handleAccountFilterClick}\n onBackClick={onBackClick}\n sx={sx}\n title={copy.title}\n >\n {!isInitialized && <Loader />}\n {isInitialized && (\n <Stack mx={isMobile ? 0 : 48} my={24}>\n <Tabs\n onChange={(_, newValue) => setSelectedTab(newValue)}\n sx={{ bgcolor: 'background.paper' }}\n value={selectedTab}\n variant=\"fullWidth\"\n >\n <Tab label={<TabTitle subtitle={savingsTabSubtitle} title={copy.tab_saving_title} />} />\n <Tab label={<TabTitle subtitle={debtTabSubtitle} title={copy.tab_debt_title} />} />\n <Tab\n label={<TabTitle subtitle={retireTabSubtitle} title={copy.tab_retirement_title} />}\n />\n </Tabs>\n {selectedTab === 0 && (\n <GoalList onManageClick={() => {}} trackType={TrackType.SAVINGS_TRACK} />\n )}\n {selectedTab === 1 && (\n <GoalList onManageClick={() => {}} trackType={TrackType.DEBT_TRACK} />\n )}\n {selectedTab === 2 && (\n <GoalList onManageClick={() => {}} trackType={TrackType.RETIREMENT_TRACK} />\n )}\n </Stack>\n )}\n <Drawer\n isOpen={Boolean(selectedGoal)}\n onClose={() => setSelectedGoal(undefined)}\n title={copy.goal_details}\n >\n {selectedGoal && <GoalDetails goal={selectedGoal} />}\n </Drawer>\n </WidgetContainer>\n )\n})\n","import { ApiEndpoints, Fetch, Goal } from '../../common'\n\nexport class GoalApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\n }\n\n addGoal = async (goal: Goal) => {\n return this.fetchInstance.post(ApiEndpoints.GOALS, goal).then(data => data)\n }\n\n getGoalByGuid = async (guid: string) => {\n return this.fetchInstance.get(`${ApiEndpoints.GOALS}/${guid}`).then(data => data)\n }\n\n getGoals = async () => {\n return this.fetchInstance.get(ApiEndpoints.GOALS).then(data => data)\n }\n\n removeGoal = async (guid: string) => {\n return this.fetchInstance.delete(`${ApiEndpoints}/${guid}`).then(data => data)\n }\n\n updateGoal = async (goal: Goal, guid: string) => {\n return this.fetchInstance.put(`${ApiEndpoints.GOALS}/${guid}`, goal).then(data => data)\n }\n}","import { makeAutoObservable, runInAction } from 'mobx'\n\nimport { GoalApi } from '../api/GoalApi'\n\nimport { type Goal, GlobalStore, TrackType } from '../../common'\n\nexport class GoalStore {\n api = new GoalApi('/', '')\n globalStore: GlobalStore\n goals: Goal[] = []\n selectedGoal: Goal | undefined = undefined\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n makeAutoObservable(this)\n }\n\n initialize = async (endpoint: string, token: string) => {\n this.api = new GoalApi(endpoint, token)\n }\n\n get debtGoals() {\n return this.goals.filter((goal) => goal.track_type === TrackType.DEBT_TRACK)\n }\n\n get retirementGoals() {\n return this.goals.filter((goal) => goal.track_type === TrackType.RETIREMENT_TRACK)\n }\n\n get savingsGoals() {\n return this.goals.filter((goal) => goal.track_type === TrackType.SAVINGS_TRACK)\n }\n\n loadGoals = async () => {\n try {\n const goals = await this.api.getGoals()\n\n runInAction(() => {\n this.goals = goals\n })\n } catch (error) {\n console.error(`Error occured while getting goals: ${error}`)\n }\n }\n\n setSelectedGoal = (goal: Goal | undefined) => (this.selectedGoal = goal)\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { useVirtualizer } from '@tanstack/react-virtual'\n\nimport Box from '@mui/material/Box'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Paper from '@mui/material/Paper'\nimport Stack from '@mui/material/Stack'\n\nimport { MerchantLogo, Text } from '@kyper/mui'\n\nimport { Loader, SearchBox, useGlobalCopyStore, useMerchantStore } from '../../common'\n\nconst NAME_PATTERN = /^[ a-zA-ZÀ-ÿ0-9]+$/\nconst MAX_LENGTH = 50\nconst ROW_HEIGHT = 65 // List items have a minHeight of 64, so we add 1px for the borders so they don't disappear on hover\n\nexport interface MerchantLookupProps {\n height?: string | number\n onSelect: (guid: string) => void\n}\n\nconst MerchantLookup: React.FC<MerchantLookupProps> = ({\n height = 'calc(100dvh - 120px)',\n onSelect,\n}) => {\n const { isLoading, merchants, loadMerchants } = useMerchantStore()\n const { common: copy } = useGlobalCopyStore()\n\n const [searchValue, setSearchValue] = React.useState('')\n\n React.useEffect(() => {\n loadMerchants().finally()\n }, [loadMerchants])\n\n const handleSelected = (guid: string) => {\n onSelect(guid)\n }\n\n const handleSearch = async (value: string) => {\n if ((!value || NAME_PATTERN.test(value)) && value.length <= MAX_LENGTH) {\n setSearchValue(value)\n await loadMerchants(value)\n }\n }\n\n const parentRef = React.useRef<HTMLDivElement>(null)\n const rowVirtualizer = useVirtualizer({\n count: merchants.length,\n getScrollElement: () => parentRef.current,\n estimateSize: () => ROW_HEIGHT,\n overscan: 5,\n })\n\n React.useEffect(() => rowVirtualizer.measure(), [merchants])\n\n return (\n <Stack className=\"mx-mrt-lookup\">\n <SearchBox\n ariaLabel={copy.search_aria}\n cancelAriaLabel={copy.cancel_search_aria}\n onChange={handleSearch}\n placeholder={copy.search_placeholder}\n searchValue={searchValue}\n />\n\n <Paper sx={{ boxShadow: 'none' }}>\n <List>\n <Box height={height} overflow=\"auto\" ref={parentRef}>\n <Box height={rowVirtualizer.getTotalSize()} position=\"relative\">\n {isLoading && <Loader label=\"Loading...\" size={32} />}\n {!isLoading &&\n rowVirtualizer.getVirtualItems().length > 0 &&\n rowVirtualizer.getVirtualItems().map((row) => {\n const merchant = merchants[row.index]\n\n return (\n <Box\n height={ROW_HEIGHT}\n key={merchant.guid}\n position=\"absolute\"\n sx={{ transform: `translateY(${row.start}px)` }}\n width=\"100%\"\n >\n <ListItem disableGutters={true} disablePadding={true}>\n <ListItemButton onClick={() => handleSelected(merchant.guid)}>\n <ListItemAvatar>\n <MerchantLogo categoryGuid=\"\" merchantGuid={merchant.guid} />\n </ListItemAvatar>\n <ListItemText primary={merchant.name} />\n </ListItemButton>\n </ListItem>\n <Divider sx={{ ml: 24 }} />\n </Box>\n )\n })}\n </Box>\n {!merchants.length && (\n <Stack alignItems=\"center\" my={24}>\n <Text bold={true} color=\"secondary\" variant=\"Small\">\n {copy.search_zero_state}\n </Text>\n </Stack>\n )}\n </Box>\n </List>\n </Paper>\n </Stack>\n )\n}\n\nexport default observer(MerchantLookup)\n","import { ApiEndpoints, Fetch } from '../../common'\n\nexport class MerchantApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\n }\n\n getMerchants = async (\n searchValues = [] as string[],\n guids = [] as string[],\n page = 1,\n perPage = 25,\n ) => {\n let url = ApiEndpoints.MERCHANTS\n url += `?page=${page}&per_page=${perPage}`\n\n if (searchValues.length) {\n searchValues.forEach((value) => (url += `&fuzzy_name[]=${value}`))\n }\n\n if (guids.length) {\n guids.forEach((guid) => (url += `&guid[]=${guid}`))\n }\n\n return this.fetchInstance.get(url).then((data) => data.merchants)\n }\n\n getMerchantByGuid = async (guid: string) => {\n return this.fetchInstance.get(`${ApiEndpoints.MERCHANTS}/${guid}`).then((data) => data.merchant)\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\n\nimport { MerchantApi } from '../api/MerchantApi'\n\nimport type { Merchant } from '../../common'\n\nexport interface CopyObject {\n [key: string]: string\n}\n\nexport class MerchantStore {\n api: MerchantApi = new MerchantApi('/', '')\n\n merchant: Merchant | null = null\n merchants: Merchant[] = []\n isLoading = false\n\n constructor() {\n makeAutoObservable(this)\n }\n\n initialize = async (endpoint: string, token: string) => {\n this.api = new MerchantApi(endpoint, token)\n }\n\n loadMerchants = async (searchValue = '') => {\n this.isLoading = true\n\n const merchants = await this.api.getMerchants([searchValue])\n\n runInAction(() => {\n this.merchants = merchants\n this.isLoading = false\n })\n }\n\n loadMerchantByGuid = async (guid: string) => {\n const merchant = await this.api.getMerchantByGuid(guid)\n\n runInAction(() => (this.merchant = merchant))\n }\n}\n","import { format } from 'date-fns/format'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { subMonths } from 'date-fns/subMonths'\n\nimport type { Account, Member, MonthlyAccountBalance } from '../../common/types'\nimport { AccountTypeName, AccountIcon, AccountIconVariants } from '../../common/types'\nimport { isAccountLiability } from '../../accounts/utils'\nimport { FinancialAccount, AccountGroup, NetWorth } from '../types/NetWorth'\n\nconst MAX_NUMBER_MONTHS = 13\n\nexport const filterAccounts = (accounts: Account[], members: Member[]) => {\n return accounts.filter((account) => {\n const { is_closed, is_deleted, is_hidden, is_manual } = account\n\n if (is_closed || is_deleted || is_hidden) return false\n if (is_manual || !account.guid) return true\n\n return members.some((member) => {\n return accounts.some((account) => {\n return member.guid === account.member_guid\n })\n })\n })\n}\n\nexport const flattenBalances = (balances: any, balance: any) => {\n return [...balances, ...balance]\n}\n\nexport const getLatestNetWorthData = (chartData: NetWorth[]) => {\n if (chartData && chartData.length > 0) {\n return chartData[chartData.length - 1]\n } else return undefined\n}\n\nexport const sortByYearMonthAscending = (a: MonthlyAccountBalance, b: MonthlyAccountBalance) =>\n a.year_month - b.year_month\n\nconst buildDateTicks = () => {\n return Array.from({ length: MAX_NUMBER_MONTHS }, (_, count) => {\n return Math.floor(startOfMonth(subMonths(new Date(), count)).getTime() / 1000)\n }).sort()\n}\n\nexport const buildChartData = (\n accounts: Account[],\n monthlyAccountBalances: MonthlyAccountBalance[],\n numberOfMonths: number,\n) => {\n if (!accounts.length || !monthlyAccountBalances.length) return []\n const dateTicks = buildDateTicks()\n return dateTicks\n .reduceRight((result: any, x) => {\n const balances = monthlyAccountBalances.filter(\n ({ year_month }) => year_month === parseInt(format(fromUnixTime(x), 'yyyyMM')),\n )\n const accountsWithBalances = accounts.map((account) => {\n const balance = balances.find((balance) => balance.account_guid === account.guid)\n\n const zeroBalance = {\n change: 0,\n guid: account.guid,\n name: account.name,\n type: account.account_type,\n balance: 0,\n }\n\n if (!balance && result.length === 0 && !account.balance) return zeroBalance\n\n // The servers return the monthly account balances in Utah time. Frontend starts all the date calculations\n // in UTC. We get into overlaps for a few hours depending on the timezone with no monthly account balances\n // for all accounts.\n if (!balance && result.length === 0) {\n return {\n ...zeroBalance,\n value: isAccountLiability(account) ? -(account.balance ?? 0) : (account.balance ?? 0),\n }\n }\n\n if (!balance) {\n const lastBalance = result[0].accounts.find((acc: Account) => acc.guid === account.guid)\n\n return lastBalance ? lastBalance : zeroBalance\n }\n\n return {\n change: balance.transaction_total,\n guid: account.guid,\n name: account.name,\n type: account.account_type,\n value: balance.balance,\n }\n })\n\n const { y, change } = accountsWithBalances.reduce(\n (acc, current) => {\n return {\n y: acc.y + (current.value || 0),\n change: acc.change + (current.change || 0),\n }\n },\n { y: 0, change: 0 },\n )\n\n return [\n {\n accounts: accountsWithBalances,\n x,\n y,\n change,\n },\n ...result,\n ]\n }, [])\n .slice(MAX_NUMBER_MONTHS - numberOfMonths)\n}\n\nexport const buildGainsLosses = (selectedData?: NetWorth) => {\n const gains: { accountName: string; gain: number }[] = []\n const losses: { accountName: string; loss: number }[] = []\n let totalGains = 0\n let totalLosses = 0\n\n selectedData?.accounts.forEach((account) => {\n if (account.change > 0) {\n gains.push({ accountName: account.name, gain: account.change })\n totalGains += account.change\n }\n if (account.change < 0) {\n losses.push({ accountName: account.name, loss: account.change })\n totalLosses += account.change\n }\n })\n\n return { netWorth: selectedData, gains, losses, totalGains, totalLosses }\n}\n\nexport const buildAssetsLiabilities = (accounts: Account[]) => {\n const assets: FinancialAccount[] = []\n const liabilities: FinancialAccount[] = []\n let totalAssets = 0\n let totalLiabilities = 0\n\n accounts.forEach((account) => {\n if (isAccountLiability(account)) {\n const balance = account.balance ?? 0\n liabilities.push({ accountName: account.name, accountType: account.account_type, balance })\n totalLiabilities += balance\n } else {\n const balance = account.balance ?? 0\n assets.push({ accountName: account.name, accountType: account.account_type, balance })\n totalAssets += balance\n }\n })\n\n return { assets, liabilities, totalAssets, totalLiabilities }\n}\n// groups accounts by account type\n// returns array of account groups, each with an icon, name, and the grouped accounts\nexport const groupAccounts = (accounts: FinancialAccount[]): AccountGroup[] => {\n const groupedAccounts = accounts.reduce<{ [key: number]: FinancialAccount[] }>((acc, account) => {\n const accountType = account.accountType\n if (!acc[accountType]) {\n acc[accountType] = []\n }\n acc[accountType].push(account)\n return acc\n }, {})\n\n return Object.entries(groupedAccounts).map(([accountType, accounts]) => ({\n icon: AccountIconVariants[+accountType] || AccountIcon[+accountType],\n name: AccountTypeName[+accountType],\n accounts,\n }))\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\n\nimport type { Account, GlobalStore } from '../../common'\n\nimport { AssetsLiabilities, GainsLosses, NetWorth, NetWorthData } from '../types/NetWorth'\nimport {\n filterAccounts,\n flattenBalances,\n buildAssetsLiabilities,\n buildChartData,\n buildGainsLosses,\n getLatestNetWorthData,\n sortByYearMonthAscending,\n} from '../utils/NetWorthUtils'\n\nexport class NetWorthStore {\n globalStore: GlobalStore\n\n netWorthData: NetWorthData = { accounts: [], monthlyAccountBalances: [] }\n netWorthChartData: NetWorth[] = []\n hoveredData?: NetWorth\n selectedData?: NetWorth\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n makeAutoObservable(this)\n }\n\n loadNetWorthData = async (accounts: Account[]) => {\n try {\n const members = this.globalStore.accountStore.members\n\n const netWorthAccounts = filterAccounts(accounts, members)\n\n const accountBalances = await Promise.all(\n netWorthAccounts.map((account: Account) => {\n return this.globalStore.accountStore.api.getMonthlyAccountBalances(account.guid)\n }),\n )\n\n const monthlyAccountBalances = await accountBalances\n .reduce(flattenBalances, [])\n .sort(sortByYearMonthAscending)\n\n runInAction(() => {\n this.netWorthData = {\n accounts: netWorthAccounts,\n monthlyAccountBalances,\n }\n })\n } catch (error) {\n console.error(`Error occured while loading net worth data: ${error}`)\n }\n }\n\n loadChartData = async (numberOfMonths: number) => {\n try {\n const { accounts, monthlyAccountBalances } = this.netWorthData\n const chartData = await buildChartData(accounts, monthlyAccountBalances, numberOfMonths)\n const selectedData = getLatestNetWorthData(chartData)\n\n runInAction(() => {\n this.netWorthChartData = chartData\n this.selectedData = selectedData\n })\n } catch (error) {\n console.error(`Error occured while loading chart data: ${error}`)\n }\n }\n\n get gainsLosses(): GainsLosses {\n return buildGainsLosses(this.selectedData)\n }\n\n get assetsLiabilities(): AssetsLiabilities {\n const { assets, liabilities, totalAssets, totalLiabilities } = buildAssetsLiabilities(\n this.netWorthData.accounts,\n )\n return {\n netWorth: getLatestNetWorthData(this.netWorthChartData),\n assets,\n liabilities,\n totalAssets,\n totalLiabilities,\n }\n }\n\n setSelectedData = (dataIndex: number) => {\n runInAction(() => {\n this.selectedData = this.netWorthChartData[dataIndex]\n })\n }\n\n setHoveredData = (dataIndex: number | null) => {\n runInAction(() => {\n this.hoveredData = dataIndex !== null ? this.netWorthChartData[dataIndex] : undefined\n })\n }\n}\n","import { format } from 'date-fns/format'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { observer } from 'mobx-react-lite'\n\nimport { useTheme } from '@mui/material/styles'\n\nimport { LineChart, useScreenSize, useWidgetContainerProvider } from '../../common'\n\nimport { NetWorthProps } from '../types/NetWorth'\n\nconst NetWorthChart: React.FC<NetWorthProps> = ({\n chartData,\n hoveredData,\n onDataClick: onMarkClick,\n onMouseEnter,\n onMouseLeave,\n selectedData,\n}) => {\n const { isMobile } = useScreenSize()\n const { availableWidth } = useWidgetContainerProvider()\n const theme = useTheme()\n\n // on mobile, chart is same width as list; on desktop, chart takes up what the list does not\n const chartWidthNotMobile = availableWidth - 320\n\n const datasets = chartData.map((point) => {\n return {\n x: format(fromUnixTime(point.x), 'MMM'),\n y: point.y,\n }\n })\n\n const selectedMark = selectedData\n ? { index: chartData.findIndex((point) => point.x === selectedData.x) }\n : undefined\n\n const hoveredMark = hoveredData\n ? { index: chartData.findIndex((point) => point.x === hoveredData.x) }\n : undefined\n\n const getMarkStyles = (markIndex: number) => {\n const markStyles = {\n fill: markIndex === selectedMark?.index ? theme.palette.success.main : '',\n filter:\n markIndex === hoveredMark?.index\n ? `drop-shadow(0px 0px 10px ${theme.palette.success.main})`\n : 'none',\n stroke: theme.palette.success.main,\n }\n return markStyles\n }\n\n return (\n <LineChart\n baseline=\"min\" // causes the area below the line to be shaded\n colors={[theme.palette.success.main]}\n datasets={[datasets]}\n height={350}\n labels={[]}\n margin={{ right: 20 }}\n markHandlers={{ onMarkClick, onMouseEnter, onMouseLeave }}\n markStyles={getMarkStyles}\n showArea={true}\n useCustomMark={true}\n valueFormatterString=\"0,0a\" // formats to '109k' instead of '109,000'\n width={isMobile ? 320 : chartWidthNotMobile}\n />\n )\n}\n\nexport default observer(NetWorthChart)\n","import { observer } from 'mobx-react-lite'\nimport React from 'react'\n\nimport Divider from '@mui/material/Divider'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@kyper/mui'\n\nimport { CurrencyText, fromTimestampToMonthYear } from '../../common/'\nimport { NetWorth } from '../types/NetWorth'\n\ninterface NetWorthListItemProps {\n item: NetWorth\n getStyles: (item: NetWorth) => { backgroundColor: string; borderBottom: string; color: string }\n isHovered: boolean\n isSelected: boolean\n onItemClick?: (event: React.MouseEvent<HTMLDivElement, MouseEvent>, dataIndex: number) => void\n onMouseEnter: (dataIndex: number) => void\n onMouseLeave: () => void\n}\n\nconst NetWorthListItem: React.FC<NetWorthListItemProps> = ({\n item: dataPoint,\n getStyles,\n isHovered = false,\n isSelected = false,\n onItemClick,\n onMouseEnter,\n onMouseLeave,\n}) => {\n const [listItemStyles, setListItemStyles] = React.useState({\n color: '',\n })\n\n React.useEffect(() => {\n setListItemStyles(getStyles(dataPoint))\n }, [isHovered, isSelected])\n\n return (\n <React.Fragment key={dataPoint.x}>\n <ListItem\n sx={{\n ...listItemStyles,\n minHeight: 44,\n '&:hover': { color: isSelected ? 'inherit' : listItemStyles.color },\n }}\n >\n <ListItemButton\n onClick={(event) => onItemClick?.(event, dataPoint.x)}\n onMouseEnter={() => onMouseEnter(dataPoint.x)}\n onMouseLeave={() => onMouseLeave()}\n sx={{ minHeight: 44 }}\n >\n <ListItemText\n primary={\n <Stack direction=\"row\" justifyContent=\"space-between\" sx={{ fontWeight: 400 }}>\n <Text variant=\"Body\">{fromTimestampToMonthYear(dataPoint.x)}</Text>\n <CurrencyText amount={dataPoint.y} sx={{ color: 'inherit' }} variant=\"Body\" />\n </Stack>\n }\n />\n </ListItemButton>\n </ListItem>\n <Divider />\n </React.Fragment>\n )\n}\n\nexport default observer(NetWorthListItem)\n","import { observer } from 'mobx-react-lite'\nimport React from 'react'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListSubheader from '@mui/material/ListSubheader'\nimport Stack from '@mui/material/Stack'\n\nimport { useTheme } from '@mui/material/styles'\n\nimport { Text } from '@kyper/mui'\n\nimport { useGlobalCopyStore } from '../../common'\n\nimport NetWorthListItem from './NetWorthListItem'\nimport { NetWorth, NetWorthProps } from '../types/NetWorth'\nimport { Button } from '@mui/material'\n\nconst NetWorthList: React.FC<NetWorthProps> = ({\n chartData,\n hoveredData,\n onDataClick: onListItemClick,\n onButtonClick,\n onMouseEnter,\n onMouseLeave,\n selectedData,\n}) => {\n const { net_worth: copy } = useGlobalCopyStore()\n const theme = useTheme()\n\n const buildStyles = (lineItem: NetWorth) => {\n const isHovered = lineItem.x === hoveredData?.x\n const isSelected = lineItem.x === selectedData?.x\n\n const listItemStyles = {\n backgroundColor: 'inherit',\n borderBottom: 'inherit',\n color: 'inherit',\n padding: '12px',\n }\n\n if (isHovered) {\n listItemStyles.color = isSelected ? 'inherit' : listItemStyles.color\n listItemStyles.backgroundColor = theme.palette.action.hover\n }\n\n if (isSelected) {\n listItemStyles.backgroundColor = theme.palette.primary.main\n listItemStyles.borderBottom = theme.palette.border.light\n listItemStyles.color = theme.palette.common.white\n }\n\n return listItemStyles\n }\n\n return (\n <Stack direction=\"column\" width={320}>\n <List>\n <ListSubheader sx={{ backgroundColor: 'transparent', mb: 8, mt: 12, mx: 8 }}>\n <Text bold={true} component=\"h2\" variant=\"Body\">\n {copy.monthly_totals}\n </Text>\n </ListSubheader>\n <Divider />\n {chartData.map((dataPoint: NetWorth, index: number) => {\n return (\n <NetWorthListItem\n getStyles={buildStyles}\n isHovered={dataPoint.x === hoveredData?.x}\n isSelected={dataPoint.x === selectedData?.x}\n item={dataPoint}\n key={dataPoint.x}\n onItemClick={(event) => onListItemClick(event, index)}\n onMouseEnter={() => onMouseEnter(index)}\n onMouseLeave={() => onMouseLeave()}\n />\n )\n })}\n </List>\n <Button\n onClick={() => onButtonClick()}\n sx={{ alignSelf: 'center', marginTop: 16, width: 'fit-content' }}\n variant=\"outlined\"\n >\n {copy.view_assets_and_liabilities}\n </Button>\n </Stack>\n )\n}\n\nexport default observer(NetWorthList)\n","import { observer } from 'mobx-react-lite'\n\nimport { Stack, Theme } from '@mui/material'\nimport { TypographyProps } from '@mui/material/Typography'\nimport { Icon, Text } from '@kyper/mui'\nimport { CurrencyText } from '../../common/components/CurrencyText'\nimport { NetWorth } from '../types/NetWorth'\n\ninterface NetWorthChangeProps {\n netWorth: NetWorth\n currencyVariant?: TypographyProps['variant']\n currencyLabel?: string\n iconSize?: number\n theme: Theme\n}\n\nconst NetWorthChange: React.FC<NetWorthChangeProps> = ({\n currencyLabel,\n currencyVariant = 'Small',\n iconSize,\n netWorth,\n theme,\n}) => {\n let iconColor = theme.palette.secondary.main\n let currencyTextColor = theme.palette.secondary.main\n let iconName = 'trending_flat'\n\n if (netWorth.change < 0) {\n iconName = 'trending_down'\n } else if (netWorth.change > 0) {\n iconColor = theme.palette.success.main\n currencyTextColor = theme.palette.success.main\n iconName = 'trending_up'\n }\n\n return (\n <Stack alignItems=\"center\" direction=\"row\" spacing={4}>\n <Icon\n name={iconName}\n size={iconSize}\n sx={{\n color: iconColor,\n }}\n />\n <CurrencyText amount={netWorth.change} color={currencyTextColor} variant={currencyVariant} />\n <Text variant=\"Small\">{currencyLabel}</Text>\n </Stack>\n )\n}\n\nexport default observer(NetWorthChange)\n","import { observer } from 'mobx-react-lite'\nimport { fromUnixTime, format } from 'date-fns'\n\nimport { useTheme } from '@mui/material/styles'\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@kyper/mui'\n\nimport { CurrencyText, useGlobalCopyStore } from '../../common/'\nimport NetWorthChange from './NetWorthChange'\nimport { NetWorth } from '../types/NetWorth'\n\ninterface NetWorthSummaryProps {\n hoveredData?: NetWorth\n selectedData: NetWorth\n}\n\nconst NetWorthSummary: React.FC<NetWorthSummaryProps> = ({ hoveredData, selectedData }) => {\n const { net_worth: copy } = useGlobalCopyStore()\n const theme = useTheme()\n const summary = hoveredData ? hoveredData : selectedData\n\n const formattedMonth = format(fromUnixTime(summary.x), 'MMMM')\n\n return (\n <Stack alignItems=\"center\" direction=\"column\" m={24}>\n <Text color={theme.palette.secondary.main} variant=\"Small\">\n {`${formattedMonth} ${copy.net_worth}`}\n </Text>\n <CurrencyText amount={summary.y} variant=\"H2\" />\n <NetWorthChange currencyLabel={copy.this_month} netWorth={summary} theme={theme} />\n </Stack>\n )\n}\n\nexport default observer(NetWorthSummary)\n","import { observer } from 'mobx-react-lite'\nimport React from 'react'\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 ListItemButton from '@mui/material/ListItemButton'\nimport ListItemIcon from '@mui/material/ListItemIcon'\nimport ListItemText from '@mui/material/ListItemText'\nimport ListSubheader from '@mui/material/ListSubheader'\nimport Stack from '@mui/material/Stack'\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport { CurrencyText, useGlobalCopyStore } from '../../common/'\nimport NetWorthChange from './NetWorthChange'\nimport { AccountGroup, AssetsLiabilities } from '../types/NetWorth'\nimport { groupAccounts } from '../utils/NetWorthUtils'\n\nconst Group: React.FC<AccountGroup> = ({ accounts, name, icon }) => {\n const [isOpen, setIsOpen] = React.useState(false)\n\n return (\n <>\n <ListItem sx={(theme) => ({ backgroundColor: theme.palette.background.paper })}>\n <ListItemButton onClick={() => setIsOpen(!isOpen)}>\n {icon && (\n <ListItemIcon>\n <Icon name={icon} size={24} sx={{ mr: 12 }} />\n </ListItemIcon>\n )}\n <ListItemText\n primary={\n <Text sx={{ fontWeight: 700 }} variant=\"Body\">\n {name}\n </Text>\n }\n />\n <ListItemIcon>\n {isOpen ? <Icon name=\"expand_less\" size={24} /> : <Icon name=\"expand_more\" size={24} />}\n </ListItemIcon>\n </ListItemButton>\n </ListItem>\n <Divider />\n <Collapse in={isOpen} timeout=\"auto\" unmountOnExit={true}>\n {accounts.map((account, index) => (\n <List key={account.accountName}>\n <ListItem sx={() => ({ py: 14 })}>\n <ListItemText\n primary={\n <Stack direction=\"row\" justifyContent=\"space-between\" sx={{ fontWeight: 400 }}>\n <Text variant=\"Body\">{account.accountName}</Text>\n <CurrencyText amount={account.balance} variant=\"Small\" />\n </Stack>\n }\n sx={{ pl: 72, pr: 16 }}\n />\n </ListItem>\n {index < accounts.length - 1 ? <Divider variant=\"inset\" /> : <Divider />}\n </List>\n ))}\n </Collapse>\n </>\n )\n}\n\nconst ListGroup: React.FC<{\n groupedAccounts: AccountGroup[]\n}> = ({ groupedAccounts }) => (\n <>\n {groupedAccounts.map(({ accounts, icon, name }) => (\n <Group accounts={accounts} icon={icon} key={name} name={name} />\n ))}\n </>\n)\n\nconst AssetsLiabilitiesDetail: React.FC<AssetsLiabilities> = ({\n netWorth,\n assets,\n liabilities,\n totalAssets,\n totalLiabilities,\n}) => {\n const { net_worth: copy } = useGlobalCopyStore()\n\n const theme = useTheme()\n\n return (\n <>\n <Box\n sx={{\n alignItems: 'center',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n paddingTop: 24,\n marginBottom: 8,\n }}\n >\n <Text variant=\"Body\">{copy.current_net_worth}</Text>\n <CurrencyText amount={netWorth?.y ?? 0} variant=\"H1\" />\n {netWorth && (\n <NetWorthChange\n currencyLabel={copy.this_month}\n iconSize={20}\n netWorth={netWorth}\n theme={theme}\n />\n )}\n </Box>\n <List>\n <ListSubheader sx={{ mb: 8, mt: 12, mx: 8 }}>\n <ListItemText\n primary={\n <Stack direction=\"row\" justifyContent=\"space-between\">\n <Text sx={{ fontWeight: 700 }} variant=\"XSmall\">\n {copy.assets}\n </Text>\n <CurrencyText amount={totalAssets} sx={{ fontWeight: 400 }} variant=\"XSmall\" />\n </Stack>\n }\n />\n </ListSubheader>\n <ListGroup groupedAccounts={groupAccounts(assets)} />\n <ListSubheader sx={{ mb: 8, mt: 12, mx: 8 }}>\n <ListItemText\n primary={\n <Stack direction=\"row\" justifyContent=\"space-between\">\n <Text sx={{ fontWeight: 700 }} variant=\"XSmall\">\n {copy.liabilities}\n </Text>\n <CurrencyText amount={totalLiabilities} sx={{ fontWeight: 400 }} variant=\"XSmall\" />\n </Stack>\n }\n />\n </ListSubheader>\n <ListGroup groupedAccounts={groupAccounts(liabilities)} />\n </List>\n </>\n )\n}\n\nexport default observer(AssetsLiabilitiesDetail)\n","import { observer } from 'mobx-react-lite'\nimport React from 'react'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemText from '@mui/material/ListItemText'\nimport ListSubheader from '@mui/material/ListSubheader'\nimport Stack from '@mui/material/Stack'\n\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { Text } from '@kyper/mui'\n\nimport { CurrencyText, fromTimestampToMonthYear, useGlobalCopyStore } from '../../common/'\n\nimport { GainsLosses } from '../types/NetWorth'\nimport NetWorthChange from './NetWorthChange'\n\nconst GainsLossesDetail: React.FC<GainsLosses> = ({\n netWorth,\n gains,\n losses,\n totalGains,\n totalLosses,\n}) => {\n const { net_worth: copy } = useGlobalCopyStore()\n\n const theme = useTheme()\n\n return (\n <>\n <Stack alignItems=\"center\" justifyContent=\"space-between\" mb={8} pt={24}>\n <Text variant=\"Small\">{fromTimestampToMonthYear(netWorth?.x)}</Text>\n <Text variant=\"Body\">{copy.total_change}</Text>\n {netWorth && (\n <NetWorthChange currencyVariant={'H1'} iconSize={32} netWorth={netWorth} theme={theme} />\n )}\n </Stack>\n <List>\n <ListSubheader sx={{ mb: 8, mt: 12, mx: 8 }}>\n <ListItemText\n primary={\n <Stack direction=\"row\" justifyContent=\"space-between\">\n <Text sx={{ fontWeight: 700 }} variant=\"XSmall\">\n {copy.gains}\n </Text>\n <CurrencyText amount={totalGains} sx={{ fontWeight: 400 }} variant=\"XSmall\" />\n </Stack>\n }\n />\n </ListSubheader>\n {gains?.map((gain) => (\n <React.Fragment key={gain.accountName}>\n <ListItem sx={{ backgroundColor: theme.palette.background.paper, py: 14 }}>\n <ListItemText\n primary={\n <Stack direction=\"row\" justifyContent=\"space-between\" sx={{ fontWeight: 400 }}>\n <Text variant=\"Body\">{gain.accountName}</Text>\n <CurrencyText\n amount={gain.gain}\n sx={{ color: theme.palette.success.main, fontWeight: 700 }}\n variant=\"Body\"\n />\n </Stack>\n }\n sx={{ px: 16 }}\n />\n </ListItem>\n <Divider />\n </React.Fragment>\n ))}\n\n <ListSubheader sx={{ mb: 8, mt: 12, mx: 8 }}>\n <ListItemText\n primary={\n <Stack direction=\"row\" justifyContent=\"space-between\">\n <Text sx={{ fontWeight: 700 }} variant=\"XSmall\">\n {copy.losses}\n </Text>\n <CurrencyText amount={totalLosses} sx={{ fontWeight: 400 }} variant=\"XSmall\" />\n </Stack>\n }\n />\n </ListSubheader>\n {losses?.map((loss) => (\n <>\n <ListItem\n key={loss.accountName}\n sx={{ backgroundColor: theme.palette.background.paper, py: 14 }}\n >\n <ListItemText\n primary={\n <Stack direction=\"row\" justifyContent=\"space-between\" sx={{ fontWeight: 400 }}>\n <Text variant=\"Body\">{loss.accountName}</Text>\n <CurrencyText amount={loss.loss} sx={{ fontWeight: 700 }} variant=\"Body\" />\n </Stack>\n }\n sx={{ px: 16 }}\n />\n </ListItem>\n <Divider />\n </>\n ))}\n </List>\n </>\n )\n}\n\nexport default observer(GainsLossesDetail)\n","import { differenceInMonths } from 'date-fns'\nimport { observer } from 'mobx-react-lite'\nimport React from 'react'\n\nimport Stack from '@mui/material/Stack'\n\nimport type { DateRange } from '@mui/x-date-pickers-pro'\n\nimport {\n ANALYTICS_EVENTS,\n Drawer,\n Loader,\n useAccountStore,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useNetWorthStore,\n useScreenSize,\n WidgetContainer,\n WidgetProps,\n} from '../common'\n\nimport AssetsLiabilitiesDetail from './components/AssetsLiabilitiesDetail'\nimport GainsLossesDetail from './components/GainsLossesDetail'\nimport NetWorthChart from './components/NetWorthChart'\nimport NetWorthList from './components/NetWorthList'\nimport NetWorthSummary from './components/NetWorthSummary'\nimport { NetWorthProps } from './types/NetWorth'\n\nexport const NetWorthWidget: React.FC<WidgetProps> = observer(({ onBackClick }) => {\n const { isInitialized, selectedAccounts, setSelectedAccounts } = useGlobalUiStore()\n const { net_worth: copy } = useGlobalCopyStore()\n const { accounts } = useAccountStore()\n const {\n assetsLiabilities,\n gainsLosses,\n hoveredData,\n loadChartData,\n loadNetWorthData,\n netWorthChartData,\n selectedData,\n setHoveredData,\n setSelectedData,\n } = useNetWorthStore()\n const { isMobile } = useScreenSize()\n const { onEvent } = useEvent()\n\n const [isWidgetInitialized, setIsWidgetInitialized] = React.useState(false)\n const [timeframe, setTimeFrame] = React.useState(6) // default timeframe is 6 months\n const [isGlDrawerOpen, setIsGlDrawerOpen] = React.useState(false)\n const [isAlDrawerOpen, setIsAlDrawerOpen] = React.useState(false)\n\n const initalizeWidget = async () => {\n await loadNetWorthData(selectedAccounts)\n await loadChartData(timeframe)\n setIsWidgetInitialized(true)\n }\n\n React.useEffect(() => {\n onEvent(ANALYTICS_EVENTS.NET_WORTH_VIEW)\n setSelectedAccounts(accounts)\n }, [])\n\n React.useEffect(() => {\n if (isInitialized) {\n initalizeWidget()\n }\n }, [isInitialized, selectedAccounts])\n\n React.useEffect(() => {\n onEvent(ANALYTICS_EVENTS.NET_WORTH_WIDGET_CLICK_TIMEFRAME, { time_period: timeframe + 'M' })\n loadChartData(timeframe)\n }, [timeframe])\n\n const handleDataClick = (\n event: React.MouseEvent<SVGPathElement | HTMLDivElement, MouseEvent>,\n dataIndex: number,\n ) => {\n setSelectedData(dataIndex)\n if (event.currentTarget instanceof HTMLDivElement) {\n setIsGlDrawerOpen(true)\n }\n }\n\n const handleMouseEnter = (dataIndex: number) => {\n setHoveredData(dataIndex)\n }\n\n const handleMouseLeave = () => {\n setHoveredData(null)\n }\n\n const handleViewAssetsLiabilitiesClick = () => {\n onEvent(ANALYTICS_EVENTS.NET_WORTH_WIDGET_CLICK_ASSETS_LIABILITIES)\n setIsAlDrawerOpen(true)\n }\n\n const handleRangeChanged = async (range: DateRange<Date>) => {\n const startDate = range[0]\n const endDate = range[1]\n\n if (startDate && endDate) {\n setTimeFrame(differenceInMonths(endDate, startDate))\n }\n }\n\n const netWorthProps: NetWorthProps = {\n chartData: netWorthChartData,\n hoveredData: hoveredData,\n onButtonClick: handleViewAssetsLiabilitiesClick,\n onDataClick: handleDataClick,\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n selectedData: selectedData,\n }\n\n if (!isWidgetInitialized) {\n return <Loader />\n }\n\n return (\n <WidgetContainer\n accountOptions={accounts}\n calendarActions={{\n onRangeChanged: handleRangeChanged,\n }}\n dateRangeVariant={isMobile ? 'timeframetabs' : 'timeframebuttons'}\n onAccountsFilterClick={() => onEvent(ANALYTICS_EVENTS.NET_WORTH_WIDGET_CLICK_FILTER)}\n onBackClick={onBackClick}\n showDividerAboveDateSelector={false}\n sx={{ p: isMobile ? 0 : 48 }}\n title={copy.net_worth}\n >\n {isWidgetInitialized && (\n <>\n {selectedData && (\n <NetWorthSummary hoveredData={hoveredData} selectedData={selectedData} />\n )}\n <Stack\n alignItems={isMobile ? 'center' : 'flex-start'}\n direction={isMobile ? 'column' : 'row'}\n spacing={isMobile ? 0 : 48}\n >\n <NetWorthChart {...netWorthProps} />\n <NetWorthList {...netWorthProps} />\n </Stack>\n <Drawer\n ariaLabelClose={'Close'}\n isOpen={isGlDrawerOpen}\n onClose={() => setIsGlDrawerOpen(false)}\n shouldShowHeaderBorders={false}\n shouldShowHeaderShadow={true}\n title={copy.gains_and_losses}\n >\n {gainsLosses && <GainsLossesDetail {...gainsLosses} />}\n </Drawer>\n <Drawer\n ariaLabelClose={'Close'}\n isOpen={isAlDrawerOpen}\n onClose={() => setIsAlDrawerOpen(false)}\n shouldShowHeaderBorders={false}\n shouldShowHeaderShadow={true}\n title={copy.assets_and_liabilities}\n >\n {assetsLiabilities && <AssetsLiabilitiesDetail {...assetsLiabilities} />}\n </Drawer>\n </>\n )}\n </WidgetContainer>\n )\n})\n","import { ApiEndpoints } from '../../common'\n\nexport enum NotificationType {\n BudgetExceeded = 1,\n BudgetOffTarget = 2,\n DebtPaymentReminder = 3,\n GuideMeStepComplete = 4, //deprecated: unused\n GuideMeOffTarget = 5, //deprecated: unused\n AccountBalanceLow = 6,\n AccountDepositLarge = 7,\n TransactionExpenseLarge = 8,\n TransactionFeeCharge = 9,\n SystemNotification = 10, //deprecated: unused\n ApiNotification = 11,\n UserSummary = 12,\n Offer = 13,\n PasswordResetToken = 14,\n PasswordChanged = 15,\n EmailVerification = 16,\n EmailVerified = 17,\n WelcomeNewUser = 18,\n DeviceCreated = 19,\n DeviceDeleted = 20,\n SmsVerification = 21,\n AccountNearingZero = 22,\n InternationalTransaction = 23,\n GoalProgress = 25,\n DuplicatePayment = 29,\n}\n\nexport const NOTIFICATION_DETAILS = {\n [NotificationType.BudgetExceeded]: {\n type: 'Exceeded Budget',\n icon: 'attention',\n },\n [NotificationType.BudgetOffTarget]: {\n type: 'Projected to Exceed Budget',\n icon: 'attention',\n },\n [NotificationType.DebtPaymentReminder]: {\n type: 'Payment Reminder',\n icon: 'calendar-plus',\n },\n [NotificationType.AccountBalanceLow]: {\n type: 'Low Account Balance',\n icon: 'attention',\n },\n [NotificationType.AccountDepositLarge]: {\n type: 'Large Deposit',\n icon: 'cash',\n },\n [NotificationType.TransactionExpenseLarge]: {\n type: 'Large Expense/Withdrawal',\n icon: 'attention',\n },\n [NotificationType.TransactionFeeCharge]: {\n type: 'Fee Charged',\n icon: 'attention',\n },\n [NotificationType.ApiNotification]: {\n type: 'API Notification',\n icon: 'info',\n },\n [NotificationType.UserSummary]: {\n type: 'Weekly Summary',\n icon: 'info',\n },\n [NotificationType.Offer]: {\n type: 'Special Message',\n icon: '',\n },\n [NotificationType.InternationalTransaction]: {\n type: 'International Transaction',\n icon: 'attention',\n },\n}\n\nexport const NOTIFICATION_ICON = {\n 1: 'check-skinny',\n 2: 'credit-card',\n 3: 'savings',\n 4: 'debts',\n 5: 'money-banknote',\n}\n\nexport const getNotificationDetailRoute = (notificationType: number) => {\n switch (notificationType) {\n case NotificationType.BudgetExceeded:\n case NotificationType.BudgetOffTarget:\n return ApiEndpoints.BUDGETS\n case NotificationType.DebtPaymentReminder:\n case NotificationType.AccountBalanceLow:\n case NotificationType.AccountDepositLarge:\n case NotificationType.AccountNearingZero:\n return ApiEndpoints.ACCOUNTS\n case NotificationType.TransactionExpenseLarge:\n case NotificationType.TransactionFeeCharge:\n case NotificationType.InternationalTransaction:\n case NotificationType.DuplicatePayment:\n return ApiEndpoints.TRANSACTIONS\n default:\n return null\n }\n}\n","import { makeAutoObservable, observable, runInAction } from 'mobx'\n\nimport { NotificationApi, type Notification } from '../../common'\n\nfunction filterRecentNotifications(notifications: Notification[]): Notification[] {\n const SEVEN_DAYS_IN_SECONDS = 7 * 24 * 60 * 60\n const currentTime = Math.floor(Date.now() / 1000)\n\n return notifications.filter((notification: Notification) => {\n const deliveredAt = notification.delivered_at\n return currentTime - deliveredAt <= SEVEN_DAYS_IN_SECONDS\n })\n}\n\nexport class NotificationStore {\n api = new NotificationApi('/', '')\n isLoading: boolean = true\n notifications: Notification[] = []\n recentNotifications: Notification[] = []\n\n constructor() {\n makeAutoObservable(this, { notifications: observable })\n }\n\n initialize = async (endpoint: string, token: string) => {\n this.api = new NotificationApi(endpoint, token)\n await this.loadNotifications()\n }\n\n get newNotifications(): Notification[] {\n return this.recentNotifications.filter((n) => !n.has_been_viewed)\n }\n\n loadNotifications = async () => {\n try {\n this.isLoading = true\n const data = await this.api.getNotifications()\n\n runInAction(() => {\n this.notifications = data\n this.recentNotifications = filterRecentNotifications(data)\n this.isLoading = false\n })\n } catch (error) {\n console.error(`Error occurred while loading notifications: ${error}`)\n }\n }\n\n markAllAsViewed = async () => {\n // Optimistically update the UI\n this.notifications.forEach((n) => (n.has_been_viewed = true))\n // Update on the server\n // (NOTE: The notifications/mark_all_as_viewed endpoint is broken, but still returns 202)\n await this.api.markAllAsViewed()\n await this.loadNotifications()\n }\n\n updateNotification = async (notification: Notification) => {\n notification.has_been_viewed = true\n await this.api.updateNotification(notification)\n }\n}\n","import { fromUnixTime, isSameDay } from 'date-fns'\n\nimport { Notification } from '../../common'\n\nexport const sortByDate = (a: Notification, b: Notification) => {\n return b.delivered_at - a.delivered_at\n}\n\nexport const shouldShowDate = (index: number, notifications: Notification[]) => {\n const currentDate = fromUnixTime(notifications[index].delivered_at)\n const previousDate = fromUnixTime(notifications[index - 1]?.delivered_at)\n\n return !isSameDay(currentDate, previousDate)\n}\n\nexport const hasInsetBorder = (index: number, notifications: Notification[]) => {\n const currentDate = fromUnixTime(notifications[index].delivered_at)\n const nextDate = fromUnixTime(notifications[index + 1]?.delivered_at)\n\n return isSameDay(currentDate, nextDate)\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport { InstitutionLogo, CategoryIcon } from '@kyper/mui'\n\nimport { useAccountStore, useBudgetsStore, useGlobalCopyStore } from '../../common'\nimport { type Notification } from '../../common/types'\n\ninterface NotificationBadgeProps {\n notification: Notification\n}\n\nconst NotificationBadge: React.FC<NotificationBadgeProps> = ({ notification }) => {\n const { accounts } = useAccountStore()\n const { budgets } = useBudgetsStore()\n const { accounts: accountsCopy } = useGlobalCopyStore()\n\n const account = accounts.find((account) => account.guid === notification.entity_guid)\n const budget = budgets.find((budget) => budget.guid === notification.entity_guid)\n const isGoal = notification.entity_guid.includes('GOL')\n\n const styles = {\n badge: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 4,\n marginRight: 12,\n },\n }\n\n if (account || isGoal) {\n return (\n <div style={styles.badge}>\n <InstitutionLogo\n alt={account?.institutionName || accountsCopy.institution_logo_alt}\n institutionGuid={account?.institution_guid ?? ''}\n size={33}\n />\n </div>\n )\n } else {\n return (\n <div style={styles.badge}>\n <CategoryIcon categoryGuid={budget?.category_guid} size={36} />\n </div>\n )\n }\n}\n\nexport default observer(NotificationBadge)\n","import React from 'react'\nimport { Card, useTheme } from '@mui/material'\nimport { Text } from '@kyper/mui'\n\nimport { type Notification } from '../../common/types'\nimport { useNotificationStore } from '../../common'\nimport NotificationBadge from './NotificationBadge'\n\ninterface NotificationCardProps {\n notification: Notification\n onClick: (notification: Notification) => void\n}\n\nconst NotificationCard: React.FC<NotificationCardProps> = ({ notification, onClick }) => {\n const { updateNotification } = useNotificationStore()\n const theme = useTheme()\n\n const styles = {\n card: {\n alignItems: 'center',\n borderRadius: 2,\n cursor: 'pointer',\n display: 'flex',\n marginBottom: 12,\n paddingX: 24,\n paddingY: 12,\n '&:focus': {\n backgroundColor: theme.palette.background.default,\n },\n '&:hover': {\n backgroundColor: theme.palette.background.default,\n },\n },\n dot: {\n backgroundColor: theme.palette.primary.main,\n borderRadius: '100%',\n flex: '0 0 auto',\n marginLeft: -8,\n marginRight: 8,\n height: 8,\n width: 8,\n },\n }\n\n const handleOnClick = () => {\n onClick(notification)\n updateNotification({ ...notification, has_been_viewed: true }).finally()\n }\n\n return (\n <Card onClick={handleOnClick} sx={styles.card}>\n {!notification.has_been_viewed ? (\n <div data-testid=\"new-message-dot\" style={styles.dot} />\n ) : null}\n <NotificationBadge notification={notification} />\n <Text bold={!notification.has_been_viewed} truncate={false} variant={'Small'}>\n {notification.content}\n </Text>\n </Card>\n )\n}\n\nexport default NotificationCard\n","import React from 'react'\nimport Box from '@mui/material/Box'\nimport { Text } from '@kyper/mui'\n\nimport { fromUnixToDayOfWeekAndDate } from '../../common/utils/DateUtil'\n\ninterface DateRowProps {\n date: number\n}\n\nconst DateRow: React.FC<DateRowProps> = ({ date }) => {\n return (\n <Box sx={{ display: 'flex', justifyContent: 'center', mt: 12, py: 8 }}>\n <Text bold={true} variant=\"Small\">\n {fromUnixToDayOfWeekAndDate(date)}\n </Text>\n </Box>\n )\n}\n\nexport default DateRow\n","import React, { useEffect } from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport { Box, Divider, List } from '@mui/material'\nimport { Text } from '@kyper/mui'\n\nimport { shouldShowDate } from '../utils/NotificationUtils'\nimport { type Notification } from '../../common/types'\n\nimport { Loader, useGlobalCopyStore, useNotificationStore } from '../../common'\nimport NotificationCard from './NotificationCard'\nimport DateRow from './DateRow'\n\nexport interface NotificationListProps {\n onClick?: (notification: Notification) => void\n}\n\nconst NotificationList: React.FC<NotificationListProps> = ({ onClick }) => {\n const { isLoading, recentNotifications, markAllAsViewed } = useNotificationStore()\n const { notifications: notificationsCopy } = useGlobalCopyStore()\n\n const handleClick = (notification: Notification) => {\n onClick?.(notification)\n }\n\n useEffect(() => {\n return () => {\n markAllAsViewed().finally()\n }\n }, [])\n\n return (\n <List sx={{ p: 16 }}>\n {isLoading && <Loader label={notificationsCopy?.loading} size={40} />}\n {!isLoading && recentNotifications.length === 0 && (\n <Box sx={{ p: 16 }}>\n <Text fontStyle=\"italic\" sx={{ textAlign: 'center' }}>\n {notificationsCopy.no_notifications}\n </Text>\n </Box>\n )}\n {!isLoading &&\n recentNotifications\n .slice()\n .sort((a, b) => b.delivered_at - a.delivered_at)\n .map((notification, index) => {\n const showDate = shouldShowDate(index, recentNotifications)\n\n return (\n <Box key={notification.guid} sx={{ mb: 12 }}>\n {showDate && (\n <Box sx={{ mb: 12 }}>\n <DateRow date={notification.delivered_at} />\n <Divider />\n </Box>\n )}\n <NotificationCard notification={notification} onClick={handleClick} />\n </Box>\n )\n })}\n </List>\n )\n}\n\nexport default observer(NotificationList)\n","import { makeAutoObservable, runInAction } from 'mobx'\n\nimport { UserApi } from '../api'\n\nimport type { UserProfile } from '../types'\n\nexport class UserStore {\n api: UserApi = new UserApi('/', '')\n\n userProfile: UserProfile | null = null\n\n constructor() {\n makeAutoObservable(this)\n }\n\n initialize = async (endpoint: string, token: string) => {\n this.api = new UserApi(endpoint, token)\n\n await this.loadUserProfile()\n }\n\n loadUserProfile = async () => {\n try {\n const userProfile = await this.api.getUserProfile()\n\n runInAction(() => {\n this.userProfile = userProfile\n })\n } catch (error) {\n console.error(`Error occurred while loading user profile: ${error}`)\n }\n }\n\n updateUserProfile = async (userProfile: UserProfile) => {\n try {\n const updatedProfile = await this.api.updateUserProfile(userProfile)\n\n runInAction(() => {\n this.userProfile = updatedProfile\n })\n } catch (error) {\n console.error(`Error occurred while updating user profile: ${error}`)\n }\n }\n}\n","import { makeAutoObservable } from 'mobx'\n\nimport { AccountStore } from '../../accounts'\nimport { BeatStore } from '../../insights/store/BeatStore'\nimport { BudgetsStore } from '../../budgets/store/BudgetsStore'\nimport { CashflowStore } from '../../cashflow'\nimport { CategoryStore } from '../../categories'\nimport { ConnectStore } from './ConnectStore'\nimport { DebtsStore } from '../../debts/index'\nimport { GlobalUiStore } from './GlobalUiStore'\nimport { GoalStore } from '../../goals'\nimport { MerchantStore } from '../../merchants'\nimport { NetWorthStore } from '../../networth'\nimport { NotificationStore } from '../../notifications'\nimport { RecurringActivityStore } from '../../recurringactivity'\nimport { TransactionStore } from '../../transactions'\nimport { UserStore } from './UserStore'\nimport { GlobalCopyStore } from './GlobalCopyStore'\n\nexport class GlobalStore {\n accountStore: AccountStore\n beatStore: BeatStore\n budgetsStore: BudgetsStore\n cashflowStore: CashflowStore\n categoryStore: CategoryStore\n connectStore: ConnectStore\n copyStore: GlobalCopyStore\n goalStore: GoalStore\n debtsStore: DebtsStore\n merchantStore: MerchantStore\n netWorthStore: NetWorthStore\n notificationStore: NotificationStore\n recurringActivityStore: RecurringActivityStore\n transactionStore: TransactionStore\n userStore: UserStore\n\n globalUiStore: GlobalUiStore\n\n isInitialized = false\n\n constructor() {\n this.accountStore = new AccountStore(this)\n this.beatStore = new BeatStore()\n this.budgetsStore = new BudgetsStore(this)\n this.cashflowStore = new CashflowStore(this)\n this.categoryStore = new CategoryStore(this)\n this.connectStore = new ConnectStore(this)\n this.goalStore = new GoalStore(this)\n this.debtsStore = new DebtsStore(this)\n this.copyStore = new GlobalCopyStore()\n this.merchantStore = new MerchantStore()\n this.netWorthStore = new NetWorthStore(this)\n this.notificationStore = new NotificationStore()\n this.recurringActivityStore = new RecurringActivityStore(this)\n this.transactionStore = new TransactionStore(this)\n this.userStore = new UserStore()\n\n this.globalUiStore = new GlobalUiStore(this)\n\n makeAutoObservable(this)\n }\n\n initialize = async (endpoint: string, token: string) => {\n await this.copyStore.initialize(endpoint, token)\n\n Promise.all([\n this.accountStore.initialize(endpoint, token),\n this.beatStore.initialize(endpoint, token),\n this.goalStore.initialize(endpoint, token),\n this.merchantStore.initialize(endpoint, token),\n this.userStore.initialize(endpoint, token),\n this.categoryStore.initialize(endpoint, token),\n this.transactionStore.initialize(endpoint, token),\n this.recurringActivityStore.initialize(endpoint, token),\n this.budgetsStore.initialize(endpoint, token),\n this.notificationStore.initialize(endpoint, token),\n this.connectStore.initialize(endpoint, token),\n ]).then(() => {\n this.isInitialized = true\n this.globalUiStore.setInitialized(true)\n })\n }\n}\n","import Divider from '@mui/material/Divider'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\n\ninterface AccountActionsRowProps {\n onClick: () => void\n isLast?: boolean\n primaryText: string\n secondaryText: string\n}\n\nconst AccountActionsRow: React.FC<React.PropsWithChildren<AccountActionsRowProps>> = ({\n children,\n isLast = false,\n onClick,\n primaryText,\n secondaryText,\n}) => {\n return (\n <>\n <ListItem sx={{ backgroundColor: 'background.paper' }}>\n <ListItemButton onClick={onClick}>\n <ListItemText primary={primaryText} secondary={secondaryText} />\n {children}\n </ListItemButton>\n </ListItem>\n <Divider sx={{ ml: isLast ? 0 : 24 }} />\n </>\n )\n}\n\nexport default AccountActionsRow\n","import React from 'react'\nimport { GlobalDataContext, useAccountStore } from '../../common'\n\nexport const useAccountUiStore = () => {\n const context = React.useContext(GlobalDataContext)\n\n if (!context) {\n throw new Error('useCategoryUiStore() must be used within the GlobalDataContext')\n }\n\n return useAccountStore().uiStore\n}\n","import { useAccountStore } from '../../common'\nimport { useAccountUiStore } from './useUiStore'\n\nexport const useGetMergeableAccounts = () => {\n const { accounts } = useAccountStore()\n const { selectedAccount, selectedMember } = useAccountUiStore()\n return accounts.filter(\n (account) =>\n account.member_guid === selectedMember.guid &&\n selectedMember.successfully_aggregated_at &&\n account.guid !== selectedAccount.guid,\n )\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/List'\nimport List from '@mui/material/List'\nimport ListSubheader from '@mui/material/ListSubheader'\nimport Switch from '@mui/material/Switch'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport AccountActionsRow from './AccountActionsRow'\n\nimport {\n ANALYTICS_EVENTS,\n Account,\n Dialog,\n Drawer,\n buildDynamicCopy,\n useAccountStore,\n useEvent,\n useGlobalCopyStore,\n} from '../../../../common'\nimport { useAccountUiStore } from '../../../hooks/useUiStore'\nimport { useGetMergeableAccounts } from '../../../hooks/useGetMergeableAccounts'\nimport AccountListItem from '../../AccountListItem'\n\ntype UpdatedValue = Pick<Account, 'is_closed'> | Pick<Account, 'is_hidden'>\n\nconst AccountActions = () => {\n const [shouldShowCloseAccountModal, setShouldShowCloseAccountModal] = React.useState(false)\n const [shouldShowAccountMergeDrawer, setShouldShowAccountMergeDrawer] = React.useState(false)\n const [shouldShowMergeConfirmModal, setShouldShowMergeConfirmModal] = React.useState(false)\n const [accountToMerge, setAccountToMerge] = React.useState({} as Account)\n\n const { selectedAccount: account } = useAccountUiStore()\n const { mergeAccounts, updateAccount } = useAccountStore()\n const { accounts: accountsCopy } = useGlobalCopyStore()\n const mergeableAccounts = useGetMergeableAccounts()\n const { onEvent } = useEvent()\n\n const handleUpdateAccount = (updatedValue: UpdatedValue) => {\n updateAccount({\n ...account,\n ...updatedValue,\n })\n }\n\n const handleMergeAccounts = () => {\n mergeAccounts([account.guid, accountToMerge.guid]).finally(() =>\n setShouldShowAccountMergeDrawer(false),\n )\n }\n\n return (\n <>\n <ListSubheader sx={{ backgroundColor: 'transparent', mb: 4, mt: 12, mx: 8 }}>\n <Text bold={true} component=\"h2\" variant=\"XSmall\">\n {accountsCopy.actions}\n </Text>\n </ListSubheader>\n\n <AccountActionsRow\n onClick={() => {\n handleUpdateAccount({ is_hidden: !account.is_hidden })\n onEvent(ANALYTICS_EVENTS.ACCOUNT_DETAILS_CLICK_HIDE, { account_guid: account.guid })\n }}\n primaryText={account.is_hidden ? accountsCopy.unhide_account : accountsCopy.hide_Account}\n secondaryText={\n account.is_hidden ? accountsCopy.include_this_account : accountsCopy.exclude_this_account\n }\n >\n <Switch checked={account.is_hidden} />\n </AccountActionsRow>\n\n <AccountActionsRow\n onClick={() => {\n setShouldShowCloseAccountModal(true)\n onEvent(ANALYTICS_EVENTS.ACCOUNT_DETAILS_CLICK_MARK_CLOSED, {\n account_guid: account.guid,\n })\n }}\n primaryText={account.is_closed ? accountsCopy.mark_as_open : accountsCopy.mark_as_closed}\n secondaryText={accountsCopy.this_will_set_the_account_balance_to_0}\n >\n <Icon name=\"chevron_right\" />\n </AccountActionsRow>\n\n {mergeableAccounts.length > 0 && (\n <AccountActionsRow\n isLast={true}\n onClick={() => {\n setShouldShowAccountMergeDrawer(true)\n onEvent(ANALYTICS_EVENTS.ACCOUNT_DETAILS_CLICK_MARK_DUPLICATE, {\n account_guid: account.guid,\n })\n }}\n primaryText={accountsCopy.mark_as_duplicate}\n secondaryText={accountsCopy.if_a_connected_account_is_showing_up_twice}\n >\n <Icon name=\"chevron_right\" />\n </AccountActionsRow>\n )}\n\n <Dialog\n copy={{\n close_aria: accountsCopy.close_modal,\n title: account.is_closed\n ? accountsCopy.confirm_mark_as_open\n : accountsCopy.confirm_mark_closed,\n }}\n isOpen={shouldShowCloseAccountModal}\n onClose={() => {\n setShouldShowCloseAccountModal(false)\n }}\n onPrimaryAction={() => handleUpdateAccount({ is_closed: !account.is_closed })}\n >\n {\n buildDynamicCopy(\n account.is_closed\n ? accountsCopy.this_will_resume_updating_the_balance\n : accountsCopy.this_will_set_the_balance_of_your_account,\n account.name,\n ) as string\n }\n </Dialog>\n\n <Drawer\n ariaLabelClose={accountsCopy.close_drawer}\n isOpen={shouldShowAccountMergeDrawer}\n onClose={() => setShouldShowAccountMergeDrawer(false)}\n title={accountsCopy.mark_as_duplicate}\n >\n <List>\n {mergeableAccounts.map((account: Account) => {\n const isLast = mergeableAccounts.indexOf(account) === mergeableAccounts.length - 1\n return (\n <React.Fragment key={account.guid}>\n <AccountListItem\n account={account}\n onRowClick={() => {\n setShouldShowMergeConfirmModal(true)\n setAccountToMerge(account)\n }}\n />\n <Divider sx={{ ml: isLast ? 0 : 24 }} />\n </React.Fragment>\n )\n })}\n </List>\n </Drawer>\n {shouldShowMergeConfirmModal && (\n <Dialog\n copy={{\n close_aria: accountsCopy.close_modal,\n title: accountsCopy.confirm_merge,\n }}\n isOpen={shouldShowMergeConfirmModal}\n onClose={() => setShouldShowMergeConfirmModal(false)}\n onPrimaryAction={handleMergeAccounts}\n >\n {\n buildDynamicCopy(\n accountsCopy.this_means_accounts_will_be_merged,\n account.name,\n accountToMerge.name,\n ) as string\n }\n <Text color=\"error\" sx={{ mt: 24 }}>\n {accountsCopy.this_action_cannot_be_undone}\n </Text>\n </Dialog>\n )}\n </>\n )\n}\n\nexport default observer(AccountActions)\n","import { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { isToday } from 'date-fns/isToday'\nimport { isYesterday } from 'date-fns/isYesterday'\n\nimport {\n ConnectCopy,\n ConnectionStatusEnums,\n DATE_FORMATS_INTL,\n buildDynamicCopy,\n formatDate,\n type Member,\n} from '../../common'\n\nexport interface ConnectionMessageObject {\n cta?: string\n main: string\n statusName: string\n title: string\n}\n\nexport const getConnectionMessages: any = (member: Member, copy: ConnectCopy) => {\n const { connection_messages } = copy\n\n switch (member.connection_status) {\n case ConnectionStatusEnums.CHALLENGED: {\n return {\n cta: connection_messages.challenged_cta,\n main: buildDynamicCopy(\n connection_messages.challenged_connection_description,\n member.name,\n ) as string,\n statusName: copy.connection_statuses[member.connection_status],\n title: connection_messages.challenged_connection_title,\n }\n }\n case ConnectionStatusEnums.CLOSED: {\n return {\n main: connection_messages.closed_connection_description,\n statusName: copy.connection_statuses[member.connection_status],\n title: connection_messages.closed_connection_title,\n }\n }\n case ConnectionStatusEnums.DEGRADED: {\n return {\n main: connection_messages.degraded_connection_description,\n statusName: copy.connection_statuses[member.connection_status],\n title: connection_messages.degraded_connection_title,\n }\n }\n case ConnectionStatusEnums.DELAYED: {\n return {\n main: buildDynamicCopy(\n connection_messages.delayed_connection_description,\n member.name,\n ) as string,\n statusName: copy.connection_statuses[member.connection_status],\n title: connection_messages.delayed_connection_title,\n }\n }\n case ConnectionStatusEnums.DENIED: {\n return {\n cta: connection_messages.denied_cta,\n main: buildDynamicCopy(\n connection_messages.denied_connection_description,\n member.name,\n ) as string,\n statusName: copy.connection_statuses[member.connection_status],\n title: connection_messages.denied_connection_title,\n }\n }\n case ConnectionStatusEnums.DISABLED: {\n return {\n main: connection_messages.disabled_connection_description,\n statusName: copy.connection_statuses[member.connection_status],\n title: connection_messages.disabled_connection_title,\n }\n }\n case ConnectionStatusEnums.DISCONNECTED: {\n return {\n main: buildDynamicCopy(\n connection_messages.disconnected_connection_description,\n member.name,\n ) as string,\n statusName: copy.connection_statuses[member.connection_status],\n title: connection_messages.disconnected_connection_title,\n }\n }\n case ConnectionStatusEnums.DISCONTINUED: {\n return {\n main: connection_messages.discontinued_connection_description,\n statusName: copy.connection_statuses[member.connection_status],\n title: connection_messages.discontinued_connection_title,\n }\n }\n case ConnectionStatusEnums.EXPIRED: {\n return {\n cta: connection_messages.expired_cta,\n main: connection_messages.expired_connection_description,\n statusName: copy.connection_statuses[member.connection_status],\n title: connection_messages.expired_connection_title,\n }\n }\n case ConnectionStatusEnums.FAILED: {\n return {\n main: buildDynamicCopy(\n connection_messages.failed_connection_description,\n member.name,\n ) as string,\n statusName: copy.connection_statuses[member.connection_status],\n title: connection_messages.failed_connection_title,\n }\n }\n case ConnectionStatusEnums.IMPAIRED: {\n return {\n cta: connection_messages.impaired_cta,\n main: buildDynamicCopy(\n connection_messages.impaired_connection_description,\n member.name,\n ) as string,\n statusName: copy.connection_statuses[member.connection_status],\n title: connection_messages.impaired_connection_title,\n }\n }\n case ConnectionStatusEnums.IMPEDED: {\n return {\n main: buildDynamicCopy(\n connection_messages.impeded_connection_description,\n member.name,\n member.name,\n ) as string,\n statusName: copy.connection_statuses[member.connection_status],\n title: connection_messages.impeded_connection_title,\n }\n }\n case ConnectionStatusEnums.IMPORTED: {\n return {\n cta: connection_messages.imported_cta,\n main: buildDynamicCopy(\n connection_messages.imported_connection_description,\n member.name,\n ) as string,\n statusName: copy.connection_statuses[member.connection_status],\n title: connection_messages.imported_connection_title,\n }\n }\n case ConnectionStatusEnums.LOCKED: {\n return {\n cta: connection_messages.locked_cta,\n main: buildDynamicCopy(\n connection_messages.locked_connection_description,\n member.name,\n ) as string,\n statusName: copy.connection_statuses[member.connection_status],\n title: connection_messages.locked_connection_title,\n }\n }\n case ConnectionStatusEnums.PREVENTED: {\n return {\n cta: connection_messages.prevented_cta,\n main: connection_messages.prevented_connection_description,\n statusName: copy.connection_statuses[member.connection_status],\n title: connection_messages.prevented_connection_title,\n }\n }\n case ConnectionStatusEnums.REJECTED: {\n return {\n cta: connection_messages.rejected_cta,\n main: connection_messages.rejected_connection_description,\n statusName: copy.connection_statuses[member.connection_status],\n title: connection_messages.rejected_connection_title,\n }\n }\n default: {\n const lastUpdatedCopy = () => {\n const lastUpdated = member.successfully_aggregated_at\n ? fromUnixTime(member.successfully_aggregated_at)\n : undefined\n const lastUpdatedFormattedTime =\n lastUpdated && formatDate(lastUpdated, DATE_FORMATS_INTL.TIME_STAMP_HOUR_MINUTE)\n\n if (!lastUpdatedFormattedTime) return undefined\n if (isToday(lastUpdated))\n return buildDynamicCopy(copy.last_updated_at, copy.today, lastUpdatedFormattedTime)\n if (isYesterday(lastUpdated))\n return buildDynamicCopy(copy.last_updated_at, copy.yesterday, lastUpdatedFormattedTime)\n return buildDynamicCopy(\n copy.last_updated_at,\n formatDate(lastUpdated, DATE_FORMATS_INTL.MONTH_DAY_YEAR),\n lastUpdatedFormattedTime,\n )\n }\n return {\n statusName: copy.connection_statuses[6], // Connected\n title: lastUpdatedCopy(),\n }\n }\n }\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport CheckCircleRoundedIcon from '@mui/icons-material/CheckCircleRounded'\nimport Divider from '@mui/material/Divider'\nimport ErrorIcon from '@mui/icons-material/Error'\nimport LanguageRoundedIcon from '@mui/icons-material/LanguageRounded'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport ListSubheader from '@mui/material/ListSubheader'\nimport Stack from '@mui/material/Stack'\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { Icon, THEMES, Text } from '@kyper/mui'\n\nimport ConnectDrawer from '../../../../common/components/ConnectDrawer'\nimport { IconBacking, NonConnectedStatuses, useGlobalCopyStore } from '../../../../common'\nimport { getConnectionMessages } from '../../../utils/getConnectionMessages'\nimport { useAccountUiStore } from '../../../hooks/useUiStore'\n\nconst iconStyle = {\n color: 'background.default',\n fontSize: 20,\n gridRow: 1,\n gridColumn: 1,\n zIndex: 2,\n}\n\nconst AccountConnection = () => {\n const [shouldShowConnectDrawer, setShouldShowConnectDrawer] = React.useState(false)\n const {\n palette: { mode },\n } = useTheme()\n const { selectedMember: member } = useAccountUiStore()\n const { accounts: accountsCopy, connect: connectCopy } = useGlobalCopyStore()\n\n const statusMessages = getConnectionMessages(member, connectCopy)\n\n const status = NonConnectedStatuses.includes(member.connection_status)\n ? {\n color: 'error.main',\n ctaCopy: statusMessages.cta ?? '',\n icon: <ErrorIcon sx={{ ...iconStyle }} />,\n mainMessage: statusMessages.statusName,\n secondaryMessage: `${statusMessages.title}.`,\n }\n : {\n color: 'success.main',\n icon: <CheckCircleRoundedIcon sx={{ ...iconStyle }} />,\n mainMessage: statusMessages.statusName,\n secondaryMessage: statusMessages.title,\n }\n\n return (\n <>\n <ListSubheader sx={{ mb: 4, mt: 12, mx: 8 }}>\n <Text bold={true} component=\"h2\" variant=\"XSmall\">\n {accountsCopy.connection_status}\n </Text>\n </ListSubheader>\n <ListItem sx={{ backgroundColor: 'background.paper' }}>\n {member.is_manual || !status.ctaCopy ? (\n <Stack alignItems=\"center\" direction=\"row\" px={24} py={12}>\n <ListItemAvatar>\n <IconBacking backingSx={{ backgroundColor: status.color, borderRadius: 1 }} size={32}>\n {status.icon}\n </IconBacking>\n </ListItemAvatar>\n <ListItemText primary={status.mainMessage} secondary={status.secondaryMessage} />\n </Stack>\n ) : (\n <ListItemButton onClick={() => setShouldShowConnectDrawer(true)}>\n <ListItemAvatar>\n <IconBacking backingSx={{ backgroundColor: status.color, borderRadius: 1 }} size={32}>\n {status.icon}\n </IconBacking>\n </ListItemAvatar>\n <ListItemText\n primary={status.mainMessage}\n secondary={\n status.secondaryMessage && (\n <>\n {status.secondaryMessage}{' '}\n <Text bold={true} sx={{ color: 'action.active' }} variant=\"XSmall\">\n {status.ctaCopy}\n </Text>\n </>\n )\n }\n />\n <Icon name=\"chevron_right\" />\n </ListItemButton>\n )}\n </ListItem>\n <Divider sx={{ ml: member.is_manual || !member.institution_url ? 0 : 24 }} />\n\n {!member.is_manual && member.institution_url && (\n <>\n <ListItem sx={{ backgroundColor: 'background.paper' }}>\n <ListItemButton component=\"a\" href={member.institution_url} target=\"_blank\">\n <ListItemAvatar>\n <IconBacking\n backingSx={{\n backgroundColor: mode === THEMES.LIGHT ? 'grey.300' : 'grey.700',\n borderRadius: 1,\n }}\n size={32}\n >\n <LanguageRoundedIcon\n sx={{\n ...iconStyle,\n color: mode === THEMES.LIGHT ? 'grey.900' : 'common.white',\n }}\n />\n </IconBacking>\n </ListItemAvatar>\n <ListItemText primary={member.name} secondary={member.institution_url} />\n <Icon name=\"launch\" />\n </ListItemButton>\n </ListItem>\n <Divider />\n </>\n )}\n\n {shouldShowConnectDrawer && (\n <ConnectDrawer\n loadWidgetProps={{ current_member_guid: member.guid }}\n onClose={() => setShouldShowConnectDrawer(false)}\n showConnectWidget={shouldShowConnectDrawer}\n title={accountsCopy.manage_connection}\n />\n )}\n </>\n )\n}\n\nexport default observer(AccountConnection)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport { addMonths } from 'date-fns/addMonths'\n\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3'\nimport { DateCalendar } from '@mui/x-date-pickers/DateCalendar'\nimport FormControl from '@mui/material/FormControl'\nimport InputLabel from '@mui/material/InputLabel'\nimport { LocalizationProvider } from '@mui/x-date-pickers-pro'\nimport MenuItem from '@mui/material/MenuItem'\nimport Select from '@mui/material/Select'\nimport TextField from '@mui/material/TextField'\n\nimport {\n CurrencyInput,\n Dialog,\n buildDynamicCopy,\n useAccountStore,\n useGlobalCopyStore,\n} from '../../../../common'\n\nimport { type AccountField } from '../../../utils/AccountFields'\nimport { useAccountUiStore } from '../../../hooks/useUiStore'\nimport { FieldType } from '../../../constants/Accounts'\n\ninterface AccountDetailEditProps {\n field: AccountField\n isOpen: boolean\n onClose: () => void\n}\n\nconst AccountDetailEdit: React.FC<AccountDetailEditProps> = ({ field, isOpen, onClose }) => {\n const { updateAccount } = useAccountStore()\n const { selectedAccount: account } = useAccountUiStore()\n const { accounts: accountsCopy } = useGlobalCopyStore()\n\n const [editedValue, setEditedValue] = React.useState<any>(account[field.name])\n const [errorMessage, setErrorMessage] = React.useState('')\n const [hasValidCurrencyInput, setHasValidCurrencyInput] = React.useState(true)\n\n const handleClose = () => {\n setEditedValue('')\n setErrorMessage('')\n onClose()\n }\n\n const getEditableField = () => {\n switch (field.type) {\n case FieldType.Select: {\n return (\n <FormControl fullWidth={true}>\n <InputLabel id={`${field.label}-select-label`}>{field.label}</InputLabel>\n <Select\n id={`${field.label}-select`}\n inputProps={{\n sx: {\n backgroundColor: 'background.paper',\n },\n }}\n label={field.label}\n labelId={`${field.label}-select-label`}\n onChange={(e) => setEditedValue(e.target.value)}\n placeholder={field.placeholder}\n value={editedValue}\n >\n {field.options?.map((option) => (\n <MenuItem key={option.value} value={option.value}>\n {option.label}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )\n }\n\n case FieldType.Currency: {\n return (\n <CurrencyInput\n amount={(editedValue as string | number) || ''}\n fullWidth={true}\n label={field.label}\n placeholder={field.placeholder}\n setAmount={setEditedValue}\n setHasValidInput={setHasValidCurrencyInput}\n />\n )\n }\n\n case FieldType.Date: {\n return (\n <LocalizationProvider dateAdapter={AdapterDateFns}>\n <DateCalendar\n maxDate={addMonths(new Date(), 1)}\n minDate={new Date()}\n onChange={(date: Date) => {\n if (account[field.name] && Number(account[field.name]) <= 31) {\n // gets and sets the day of the month to editedValue\n setEditedValue(date.getDate())\n } else {\n // the day of the month was already passed, so we set it directly to state\n setEditedValue(date)\n }\n }}\n views={['day']}\n />\n </LocalizationProvider>\n )\n }\n\n default: {\n return (\n <TextField\n defaultValue={account[field.name]}\n error={!!errorMessage}\n fullWidth={true}\n helperText={errorMessage}\n onChange={updateField}\n placeholder={field.placeholder}\n />\n )\n }\n }\n }\n\n const saveField = () => {\n // prevents any unnecessary api calls\n if (account[field.name] !== editedValue) {\n updateAccount({\n ...account,\n [field.name]: editedValue,\n })\n }\n handleClose()\n }\n\n const updateField = (e: React.ChangeEvent<HTMLInputElement>) => {\n setEditedValue(e.target.value)\n\n if (field.validation) {\n setErrorMessage(field.validation(e.target.value))\n }\n }\n\n return (\n <Dialog\n copy={{\n close_aria: accountsCopy.close_aria,\n title: buildDynamicCopy(accountsCopy.edit_field, field.label) as string,\n }}\n disablePrimaryButton={!!errorMessage || !hasValidCurrencyInput}\n isOpen={isOpen}\n onClose={handleClose}\n onPrimaryAction={saveField}\n primaryText={accountsCopy.save}\n >\n {getEditableField()}\n </Dialog>\n )\n}\n\nexport default observer(AccountDetailEdit)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport AccountDetailEdit from './AccountDetailEdit'\n\nimport { getAccountDetailFields, type AccountField } from '../../../utils/AccountFields'\nimport { useAccountUiStore } from '../../../hooks/useUiStore'\nimport { useEvent, useGlobalCopyStore } from '../../../../common'\n\nconst AccountDetails = () => {\n const widgetProfile = window.app?.config\n\n const { onEvent } = useEvent()\n const { selectedAccount: account } = useAccountUiStore()\n const { accounts: accountsCopy } = useGlobalCopyStore()\n\n const fields = getAccountDetailFields(account, accountsCopy)\n const canEdit =\n account.member_is_managed_by_user ||\n (!account.member_is_managed_by_user && widgetProfile.enable_renaming_home_accounts)\n\n const [showEditDialog, setShowEditDialog] = React.useState(false)\n const [fieldToEdit, setFieldToEdit] = React.useState<AccountField>(fields[0])\n\n const displayableFields = fields.filter(\n (field) => canEdit || account[field.name] || account[field.name] === 0,\n )\n\n return (\n <>\n {displayableFields.map((field) => {\n const hasValue = account[field.name] || account[field.name] === 0\n const isLast = displayableFields.indexOf(field) === displayableFields.length - 1\n\n const content = (\n <ListItemText\n disableTypography={true}\n primary={<Text sx={{ fontSize: 11 }}>{field.label}</Text>}\n secondary={\n <Text bold={true} sx={{ fontSize: 15 }}>\n {hasValue\n ? (field.valueFormatter(account[field.name]) as string)\n : field.placeholder}\n </Text>\n }\n />\n )\n\n return (\n <React.Fragment key={field.name}>\n {canEdit ? (\n <>\n <ListItem sx={{ backgroundColor: 'background.paper', px: 0 }}>\n <ListItemButton\n onClick={() => {\n setFieldToEdit(field)\n setShowEditDialog(true)\n if (field?.event) onEvent(field.event, { account_guid: account.guid })\n }}\n >\n {content}\n <Icon name=\"chevron_right\" />\n </ListItemButton>\n </ListItem>\n <Divider sx={{ ml: isLast ? 0 : 24 }} />\n </>\n ) : (\n hasValue && (\n <>\n <ListItem sx={{ backgroundColor: 'background.paper', px: 24 }}>\n {content}\n </ListItem>\n <Divider sx={{ ml: isLast ? 0 : 24 }} />\n </>\n )\n )}\n </React.Fragment>\n )\n })}\n {showEditDialog && fieldToEdit && (\n <AccountDetailEdit\n field={fieldToEdit}\n isOpen={showEditDialog}\n onClose={() => setShowEditDialog(false)}\n />\n )}\n </>\n )\n}\n\nexport default observer(AccountDetails)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport List from '@mui/material/List'\n\nimport AccountActions from './AccountActions'\nimport AccountConnection from './AccountConnection'\nimport AccountDetails from './AccountDetails'\n\nimport { ANALYTICS_EVENTS, useEvent } from '../../../../common'\n\nconst AccountDetailsTab = () => {\n const { onEvent } = useEvent()\n React.useEffect(() => onEvent(ANALYTICS_EVENTS.ACCOUNT_DETAILS_VIEW), [])\n\n return (\n <List>\n <AccountDetails />\n <AccountConnection />\n <AccountActions />\n </List>\n )\n}\n\nexport default observer(AccountDetailsTab)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Alert from '@mui/material/Alert'\nimport AlertTitle from '@mui/material/AlertTitle'\nimport ErrorIcon from '@mui/icons-material/Error'\nimport Link from '@mui/material/Link'\nimport Paper from '@mui/material/Paper'\n\nimport { Text } from '@kyper/mui'\n\nimport ConnectDrawer from '../../../../common/components/ConnectDrawer'\n\nimport {\n getConnectionMessages,\n ConnectionMessageObject,\n} from '../../../utils/getConnectionMessages'\nimport { NonConnectedStatuses, useGlobalCopyStore } from '../../../../common'\nimport { useAccountUiStore } from '../../../hooks/useUiStore'\n\ninterface ConnectionErrorMessageProps {\n setTabValue: (val: number) => void\n}\n\nconst ConnectionErrorMessage: React.FC<ConnectionErrorMessageProps> = ({ setTabValue }) => {\n const [shouldShowConnectDrawer, setShouldShowConnectDrawer] = React.useState(false)\n\n const { selectedMember: member } = useAccountUiStore()\n const { accounts: accountsCopy, connect: connectCopy } = useGlobalCopyStore()\n\n const hasError =\n member.connection_status && NonConnectedStatuses.includes(member.connection_status)\n\n React.useEffect(() => {\n if (hasError) {\n setTabValue(1)\n }\n }, [hasError])\n\n if (!hasError) return\n\n const statusMessages: ConnectionMessageObject = getConnectionMessages(member, connectCopy)\n\n // eslint-disable-next-line consistent-return\n return (\n <>\n <Paper\n sx={{\n mb: 16,\n mt: 24,\n mx: 24,\n }}\n >\n <Alert\n icon={<ErrorIcon />}\n severity=\"error\"\n sx={{\n borderLeft: 5,\n borderTopLeftRadius: 6,\n borderBottomLeftRadius: 6,\n borderColor: 'error.main',\n color: 'text.primary',\n '&.MuiPaper-root': {\n backgroundColor: 'background.paper',\n },\n }}\n >\n {statusMessages.title && (\n <AlertTitle sx={{ fontWeight: 600, marginTop: 2 }} variant=\"Body\">\n {statusMessages.title}\n </AlertTitle>\n )}\n <Text component=\"p\" sx={{ whiteSpace: 'wrap' }} variant=\"ParagraphSmall\">\n {statusMessages.main}\n </Text>\n {statusMessages.cta && (\n <Link\n onClick={() => setShouldShowConnectDrawer(true)}\n sx={{ fontSize: 15, fontWeight: 600, ml: 0 }}\n >\n {statusMessages.cta}\n </Link>\n )}\n </Alert>\n </Paper>\n\n {shouldShowConnectDrawer && (\n <ConnectDrawer\n loadWidgetProps={{ current_member_guid: member.guid }}\n onClose={() => setShouldShowConnectDrawer(false)}\n showConnectWidget={shouldShowConnectDrawer}\n title={accountsCopy.manage_connection}\n />\n )}\n </>\n )\n}\n\nexport default observer(ConnectionErrorMessage)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { subDays, startOfToday, endOfToday } from 'date-fns'\n\nimport {\n ANALYTICS_EVENTS,\n Drawer,\n useEvent,\n useGlobalCopyStore,\n useTransactionStore,\n} from '../../../../common'\nimport { TransactionDetails, TransactionList } from '../../../../transactions'\nimport { useAccountUiStore } from '../../../hooks/useUiStore'\n\nconst TransactionsTab = () => {\n const [guid, setGuid] = React.useState('')\n\n const { onEvent } = useEvent()\n const { selectedAccount } = useAccountUiStore()\n const { accounts: accountsCopy } = useGlobalCopyStore()\n const { setFilter, sortedTransactions } = useTransactionStore()\n\n const transaction = React.useMemo(() => sortedTransactions.find((t) => t.guid === guid), [guid])\n\n React.useEffect(() => {\n setFilter({\n dateRange: { start: subDays(startOfToday(), 90), end: endOfToday() },\n accounts: [selectedAccount.guid],\n })\n }, [selectedAccount])\n\n React.useEffect(() => onEvent(ANALYTICS_EVENTS.ACCOUNT_DETAILS_VIEW_TRANSACTIONS), [])\n\n return (\n <>\n <TransactionList onClick={setGuid} />\n {transaction && (\n <Drawer\n ariaLabelClose={accountsCopy.close_drawer}\n isOpen={!!guid}\n onClose={() => setGuid('')}\n title={accountsCopy.transaction_drawer_title}\n >\n <TransactionDetails transaction={transaction} />\n </Drawer>\n )}\n </>\n )\n}\n\nexport default observer(TransactionsTab)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\n\nimport { TabContentContainer, useGlobalCopyStore } from '../../../../common'\n\nimport AccountDetailsTab from './AccountDetailsTab'\nimport ConnectionErrorMessage from './ConnectionErrorMessage'\nimport TransactionsTab from '../Transactions/TransactionsTab'\n\nconst AccountDetailsContent = () => {\n const [tabValue, setTabValue] = React.useState(0)\n\n const { accounts: accountsCopy } = useGlobalCopyStore()\n\n return (\n <>\n <ConnectionErrorMessage setTabValue={setTabValue} />\n\n <Tabs\n aria-label={accountsCopy.transactions_and_details_aria}\n centered={true}\n onChange={(_, val) => setTabValue(val)}\n value={tabValue}\n variant=\"fullWidth\"\n >\n <Tab\n aria-controls=\"transaction-details-tabpanel-0\"\n id=\"transaction-details-tab-0\"\n label={accountsCopy.transactions}\n />\n <Tab\n aria-controls=\"account-details-tabpanel-1\"\n id=\"account-details-tab-1\"\n label={accountsCopy.account_details}\n />\n </Tabs>\n\n <TabContentContainer index={0} name=\"transaction-details\" value={tabValue}>\n <TransactionsTab />\n </TabContentContainer>\n\n <TabContentContainer index={1} name=\"account-details\" value={tabValue}>\n <AccountDetailsTab />\n </TabContentContainer>\n </>\n )\n}\n\nexport default observer(AccountDetailsContent)\n","import { CategoryGuids, MonthlyCategoryTotals, PaymentCategories } from '../../common'\nimport { StackedLineChartData } from './TrendsData'\n\ntype TotalsData = MonthlyCategoryTotals | StackedLineChartData\n\nexport const isIncome = (totals: TotalsData) => {\n return (\n totals.top_level_category_guid === CategoryGuids.INCOME ||\n totals.category_guid === CategoryGuids.INCOME\n )\n}\n\nexport const isExpense = (totals: TotalsData) => {\n return !isIncome(totals) && !isTransfer(totals)\n}\n\nexport const isPayment = (totals: TotalsData) => {\n return (\n PaymentCategories.includes(totals.top_level_category_guid) ||\n PaymentCategories.includes(totals.category_guid)\n )\n}\n\nexport const isTransfer = (totals: TotalsData) => {\n return (\n totals.top_level_category_guid === CategoryGuids.TRANSFER ||\n totals.category_guid === CategoryGuids.TRANSFER\n )\n}\n\nexport const isSpend = (totals: TotalsData) => {\n return !isIncome(totals) && !isPayment(totals) && !isTransfer(totals)\n}\n\nexport const getTopLevelCategoryTotals = (\n totals: (MonthlyCategoryTotals | StackedLineChartData)[],\n) => {\n return totals.filter((item) => item.category_guid === item.top_level_category_guid)\n}\n","import { addMonths } from 'date-fns/addMonths'\nimport { isBefore } from 'date-fns/isBefore'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { subMonths } from 'date-fns/subMonths'\nimport { endOfMonth } from 'date-fns/endOfMonth'\n\nimport { CategoryGuids, DATE_FORMATS_INTL, formatDate, MonthlyCategoryTotals } from '../../common'\nimport { isIncome, isPayment, isSpend } from './shared'\n\ntype DateRange = {\n start: Date\n end: Date\n}\n\nexport const getMonthlyTotals = (totals: MonthlyCategoryTotals[], range?: DateRange) => {\n const data: { x: string; y: number }[] = []\n let startDate = startOfMonth(range?.start ?? subMonths(new Date(), 5))\n const endDate = range?.end ?? new Date()\n\n while (isBefore(startDate, endDate)) {\n // Add total amount for each month\n data.push({\n x: formatDate(startDate, DATE_FORMATS_INTL.MONTH_SHORT),\n y: totals\n .filter((t) => t.year === startDate.getFullYear() && t.month === startDate.getMonth() + 1)\n .reduce((total, item) => total + item.total, 0),\n })\n startDate = addMonths(startDate, 1)\n }\n\n return data\n}\n\nexport const getIncomeTotals = (totals: MonthlyCategoryTotals[], range?: DateRange) => {\n const incomeTotals = totals.filter(isIncome)\n // Income totals are negative values, but we want to display them as positive\n return getMonthlyTotals(incomeTotals, range).map((t) => ({ ...t, y: Math.abs(t.y) }))\n}\n\nexport const getPaymentTotals = (totals: MonthlyCategoryTotals[], range?: DateRange) => {\n const paymentTotals = totals.filter(isPayment)\n // Payment totals are negative values, but we want to display them as positive\n return getMonthlyTotals(paymentTotals, range).map((t) => ({ ...t, y: Math.abs(t.y) }))\n}\n\nexport const getSpendingTotals = (totals: MonthlyCategoryTotals[], range?: DateRange) => {\n const spendingTotals = totals.filter(isSpend)\n return getMonthlyTotals(spendingTotals, range)\n}\n\nexport const getSpendingData = (totals: MonthlyCategoryTotals[]) => {\n const data: { x: string; y: number }[] = []\n\n // Filter out income and transfers\n const filteredTotals = totals.filter(\n (t) =>\n t.top_level_category_guid !== CategoryGuids.INCOME &&\n t.top_level_category_guid !== CategoryGuids.TRANSFER &&\n t.total > 0,\n )\n\n let startDate = startOfMonth(subMonths(new Date(), 5))\n const endDate = endOfMonth(new Date())\n while (isBefore(startDate, endDate)) {\n // Add total amount for each month\n data.push({\n x: formatDate(startDate, DATE_FORMATS_INTL.MONTH_SHORT),\n y: filteredTotals\n .filter((t) => t.year === startDate.getFullYear() && t.month === startDate.getMonth() + 1)\n .reduce((total, item) => total + item.total, 0),\n })\n startDate = addMonths(startDate, 1)\n }\n\n return data\n}\n","import { observer } from 'mobx-react-lite'\nimport { useTheme } from '@mui/material/styles'\n\nimport {\n AccountType,\n formatCurrency,\n LineChart,\n useCategoryStore,\n INCOME_ACCOUNT_TYPES,\n PAYMENT_ACCOUNT_TYPES,\n SPENDING_ACCOUNT_TYPES,\n useGlobalCopyStore,\n} from '../../common'\n\nimport type { MonthlyCategoryTotals, TrendsCopy } from '../../common'\nimport { useAccountUiStore } from '../../accounts/hooks/useUiStore'\nimport { getIncomeTotals, getPaymentTotals, getSpendingTotals } from '../utils/SpendingData'\n\nconst getDatasets = (totals: MonthlyCategoryTotals[], accountType: AccountType) => {\n const incomeData = INCOME_ACCOUNT_TYPES.includes(accountType) ? getIncomeTotals(totals) : []\n const paymentData = PAYMENT_ACCOUNT_TYPES.includes(accountType) ? getPaymentTotals(totals) : []\n const spendingData = SPENDING_ACCOUNT_TYPES.includes(accountType) ? getSpendingTotals(totals) : []\n\n // There should always be 1-2 datasets returned. No account type will have all three categories.\n return [incomeData, paymentData, spendingData].filter((data) => data.length > 0)\n}\n\nconst getLabels = (datasets: any[], accountType: AccountType, copy: TrendsCopy) => {\n const [dataA, dataB] = datasets\n const credits = dataA\n const debits = dataB ?? dataA\n const labels: string[] = []\n\n if (credits && debits && INCOME_ACCOUNT_TYPES.includes(accountType)) {\n const lastIncome = formatCurrency(credits[credits.length - 1].y, '0,0')\n labels.push(`${copy.income_label} ${lastIncome}`)\n } else if (PAYMENT_ACCOUNT_TYPES.includes(accountType)) {\n const lastPayment = formatCurrency(credits[credits.length - 1].y, '0,0')\n labels.push(`${copy.payments_label} ${lastPayment}`)\n }\n\n if (debits && SPENDING_ACCOUNT_TYPES.includes(accountType)) {\n const lastSpending = formatCurrency(debits[debits.length - 1].y, '0,0')\n labels.push(`${copy.spending_label} ${lastSpending}`)\n }\n\n return labels\n}\n\nconst TrendsChart = () => {\n const theme = useTheme()\n const { selectedAccount } = useAccountUiStore()\n const { monthlyCategoryTotals } = useCategoryStore()\n const { trends: trendsCopy } = useGlobalCopyStore()\n\n const colors = [theme.palette.chart?.chart1, theme.palette.chart?.chart2]\n const datasets = getDatasets(monthlyCategoryTotals, selectedAccount.account_type)\n const labels = getLabels(datasets, selectedAccount.account_type, trendsCopy)\n const isLoan = [AccountType.LOAN, AccountType.MORTGAGE].includes(selectedAccount.account_type)\n\n return (\n <div data-testid=\"TrendsChart\">\n <LineChart\n colors={colors}\n datasets={datasets}\n height={185}\n labels={labels}\n showAverage={isLoan}\n showBars={isLoan}\n />\n </div>\n )\n}\n\nexport default observer(TrendsChart)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Card from '@mui/material/Card'\nimport CardContent from '@mui/material/CardContent'\nimport CardHeader from '@mui/material/CardHeader'\n\nimport { H3 } from '@kyper/mui'\n\nimport {\n formatDate,\n DATE_FORMATS_INTL,\n Loader,\n MiniWidgetProps,\n useCategoryStore,\n useGlobalStore,\n} from '../../../../common'\n\nimport TrendsChart from '../../../../trends/components/TrendsChart'\nimport { useAccountUiStore } from '../../../hooks/useUiStore'\n\nconst AccountDetailsChart: React.FC<MiniWidgetProps> = ({ sx }) => {\n const { loadMonthlyCategoryTotals } = useCategoryStore()\n const { isInitialized } = useGlobalStore()\n const { selectedAccount } = useAccountUiStore()\n\n const [isWidgetInitialized, setIsWidgetInitialized] = React.useState(false)\n\n React.useEffect(() => {\n if (isInitialized) {\n loadMonthlyCategoryTotals([selectedAccount]).finally(() => {\n setIsWidgetInitialized(true)\n })\n }\n }, [isInitialized, selectedAccount])\n\n if (!isInitialized || !isWidgetInitialized) {\n return <Loader />\n }\n\n return (\n <Card\n sx={{\n borderRadius: '8px',\n '& .MuiCardContent-root:last-child': {\n pb: 0,\n },\n ...sx,\n }}\n >\n <CardHeader\n sx={{ pb: 0 }}\n title={<H3 sx={{ pb: 4 }}>{formatDate(new Date(), DATE_FORMATS_INTL.MONTH_LONG)}</H3>}\n />\n\n <CardContent sx={{ p: 0 }}>\n <TrendsChart />\n </CardContent>\n </Card>\n )\n}\n\nexport default observer(AccountDetailsChart)\n","import { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\n\nimport { H2, InstitutionLogo, Text } from '@kyper/mui'\n\nimport {\n formatCurrency,\n useAccountStore,\n INCOME_ACCOUNT_TYPES,\n PAYMENT_ACCOUNT_TYPES,\n SPENDING_ACCOUNT_TYPES,\n useGlobalCopyStore,\n} from '../../../../common'\nimport { getAccountBalanceDetails } from '../../../utils/AccountFields'\nimport { useAccountUiStore } from '../../../hooks/useUiStore'\n\nimport AccountDetailsChart from './AccountDetailsChart'\n\nconst AccountDetailsHeader = () => {\n const { institutions } = useAccountStore()\n const { selectedAccount: account } = useAccountUiStore()\n const { accounts: accountsCopy } = useGlobalCopyStore()\n const { firstSubtitle, firstValue, hasAvailableBalance, secondSubtitle, secondValue } =\n getAccountBalanceDetails(account, accountsCopy)\n\n const institution = institutions.find(\n (institution) => institution.guid === account?.institution_guid,\n )\n\n const showChart = [\n ...INCOME_ACCOUNT_TYPES,\n ...PAYMENT_ACCOUNT_TYPES,\n ...SPENDING_ACCOUNT_TYPES,\n ].includes(account.account_type)\n\n return (\n <Stack p={24}>\n <Stack gap={12}>\n <InstitutionLogo\n alt={accountsCopy.institution_logo_alt}\n institutionGuid={account.institution_guid || ''}\n size={64}\n />\n <Text variant=\"Small\">{institution?.name}</Text>\n </Stack>\n <Stack gap={8} mb={24} mt={4}>\n <H2>{account.name || account.feed_name}</H2>\n <Stack direction=\"row\" justifyContent=\"space-between\">\n <Text bold={hasAvailableBalance} variant=\"Body\">\n {firstSubtitle}\n </Text>\n <Text bold={true} variant=\"Body\">\n {formatCurrency(firstValue, '0,0.00')}\n </Text>\n </Stack>\n <Stack direction=\"row\" justifyContent=\"space-between\">\n <Text variant=\"Small\">{secondSubtitle}</Text>\n <Text variant=\"Small\">{secondValue}</Text>\n </Stack>\n </Stack>\n {showChart && (\n <Stack>\n <AccountDetailsChart />\n </Stack>\n )}\n </Stack>\n )\n}\n\nexport default observer(AccountDetailsHeader)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListSubheader from '@mui/material/ListSubheader'\nimport Stack from '@mui/system/Stack'\n\nimport { Text } from '@kyper/mui'\n\nimport {\n ANALYTICS_EVENTS,\n Drawer,\n formatCurrency,\n useAccountStore,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n} from '../../common'\nimport type { Account, AccountType, Member } from '../../common'\n\nimport AccountDetailsContent from './detailsdrawer/Accounts/AccountDetailsContent'\nimport AccountDetailsHeader from './detailsdrawer/Accounts/AccountDetailsHeader'\nimport AccountListItem from './AccountListItem'\nimport { useAccountUiStore } from '../hooks/useUiStore'\n\nconst AccountsList = () => {\n const [selectedAccountGuid, setSelectedAccountGuid] = React.useState('')\n\n const { accounts: accountsCopy } = useGlobalCopyStore()\n const { selectedAccounts: accounts } = useGlobalUiStore()\n const { setSelectedAccount, setSelectedMember } = useAccountUiStore()\n const { members } = useAccountStore()\n const { onEvent } = useEvent()\n\n const accountTypes: AccountType[] = [...new Set(accounts.map((account) => account.account_type))]\n\n const account = accounts.find((account) => selectedAccountGuid === account.guid)\n\n React.useEffect(() => {\n if (account) {\n setSelectedAccount(account)\n const member =\n members.find((member: Member) => member.guid === account?.member_guid) || ({} as Member)\n if (member) {\n setSelectedMember(member)\n }\n }\n }, [account, selectedAccountGuid])\n\n return (\n <Box sx={{ pt: 24 }}>\n {accountTypes.map((type) => {\n const accountsOfType = accounts.filter((account) => account.account_type === type)\n const accountsOfTypeTotal = accountsOfType.reduce(\n (total, account) => (account.available_balance || account.balance || 0) + total,\n 0,\n )\n\n const onRowClick = (account: Account) => {\n setSelectedAccountGuid(account.guid)\n onEvent(ANALYTICS_EVENTS.ACCOUNTS_CLICK_ACCOUNT, {\n account_guid: account.guid,\n account_type: account.account_type,\n })\n }\n\n return (\n <List\n aria-label={accountsCopy.account_type_accounts[accountsOfType[0].account_type]}\n key={type}\n subheader={\n <ListSubheader component={'h2'} sx={{ backgroundColor: 'transparent', px: 24 }}>\n <Stack\n component=\"span\"\n direction=\"row\"\n sx={{ display: 'flex', justifyContent: 'space-between' }}\n >\n <Text bold={true} variant=\"Body\">\n {accountsCopy.account_types[type]}\n </Text>\n <Text bold={true} variant=\"Body\">\n {formatCurrency(accountsOfTypeTotal, '0,0.00')}\n </Text>\n </Stack>\n </ListSubheader>\n }\n >\n <Stack>\n {accountsOfType.map((account) => {\n const isVeryLastItem = accounts.indexOf(account) === accounts.length - 1\n const isLastAccountTypeItem =\n accountsOfType.indexOf(account) === accountsOfType.length - 1\n\n return (\n <React.Fragment key={account.guid}>\n <AccountListItem\n account={account}\n onRowClick={() => onRowClick(account)}\n shouldShowConnectionStatus={true}\n />\n {/* the margin bottom is to counteract Firefly's CSS reset and will ideally be removed at some point */}\n {!isVeryLastItem && (\n <Divider\n sx={{\n mb: isLastAccountTypeItem ? 24 : 4,\n ml: !isLastAccountTypeItem ? 68 : 24,\n }}\n />\n )}\n </React.Fragment>\n )\n })}\n </Stack>\n </List>\n )\n })}\n <Drawer\n ariaLabelClose={accountsCopy.close_account_details_aria}\n isOpen={!!selectedAccountGuid}\n onClose={() => setSelectedAccountGuid('')}\n title={accountsCopy.account_details}\n >\n <AccountDetailsHeader />\n\n <AccountDetailsContent />\n </Drawer>\n </Box>\n )\n}\n\nexport default observer(AccountsList)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport { useTheme } from '@mui/material/styles'\n\nimport { ConnectionsWidget } from '@mxenabled/web-widget-sdk'\n\nimport ConnectStatus from './ConnectStatus'\nimport { Drawer, useAccountStore, useGlobalCopyStore } from '../../common'\nimport { MemberConnectionStatus } from '../constants/Accounts'\nimport { CONNECTIONS_WIDGET_ID } from '../../common/constants/Connect'\nimport { useConnectStore } from '../../common/context/hooks'\n\ninterface ConnectionsDrawerProps {\n onClose: () => void\n showConnectionsWidget: boolean\n title: string\n}\n\nconst ConnectionsDrawer: React.FC<ConnectionsDrawerProps> = ({\n onClose,\n showConnectionsWidget,\n title,\n}) => {\n let connectionsWidget: ConnectionsWidget\n const { refreshAccounts } = useAccountStore()\n const { loadWidget } = useConnectStore()\n const { connect: connectCopy } = useGlobalCopyStore()\n const theme = useTheme()\n\n const [isLoading, setIsLoading] = React.useState(false)\n const [hasError, setHasError] = React.useState(false)\n\n React.useEffect(() => {\n if (showConnectionsWidget) {\n setIsLoading(true)\n loadWidget({ widget: 'connections_widget', mode: theme.palette.mode }).then((res) => {\n connectionsWidget = new ConnectionsWidget({\n container: `#${CONNECTIONS_WIDGET_ID}`,\n style: {\n height: 'calc(100% - 62px)',\n width: '100%',\n position: 'absolute',\n },\n url: res.url,\n onSsoUrlLoadError: () => {\n setIsLoading(false)\n setHasError(true)\n },\n onLoad: () => {\n setIsLoading(false)\n setHasError(false)\n },\n })\n })\n } else {\n setIsLoading(false)\n setHasError(false)\n }\n\n return () => {\n connectionsWidget?.unmount()\n }\n }, [showConnectionsWidget])\n\n return (\n <Drawer\n ariaLabelClose={connectCopy.close_connections_aria}\n isOpen={showConnectionsWidget}\n onClose={() => {\n onClose()\n refreshAccounts()\n }}\n title={title}\n >\n <div id={CONNECTIONS_WIDGET_ID}>\n {hasError && <ConnectStatus status={MemberConnectionStatus.Error} />}\n {isLoading && <ConnectStatus status={MemberConnectionStatus.Loading} />}\n </div>\n </Drawer>\n )\n}\n\nexport default observer(ConnectionsDrawer)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\n\nimport AccountsList from './components/AccountsList'\nimport ConnectionsDrawer from './components/ConnectionsDrawer'\n\nimport { Text } from '@kyper/mui'\n\nimport {\n ANALYTICS_EVENTS,\n Loader,\n WidgetContainer,\n useAccountStore,\n useEvent,\n useScreenSize,\n WidgetProps,\n useGlobalUiStore,\n useGlobalCopyStore,\n} from '../common'\n\nconst AccountsWidget: React.FC<WidgetProps> = ({ onBackClick, sx = {} }) => {\n const [showConnectionsWidget, setShowConnectionsWidget] = React.useState(false)\n const [isLoading, setIsLoading] = React.useState(false)\n\n const { accounts, refreshMembers } = useAccountStore()\n const { accounts: accountsCopy } = useGlobalCopyStore()\n const { setSelectedAccounts, selectedAccountGuids } = useGlobalUiStore()\n const { isDesktop } = useScreenSize()\n const { onEvent } = useEvent()\n\n React.useEffect(() => {\n setSelectedAccounts(accounts)\n }, [accounts])\n\n const handleSync = () => {\n setIsLoading(true)\n refreshMembers().finally(() => {\n setIsLoading(false)\n })\n onEvent(ANALYTICS_EVENTS.ACCOUNTS_CLICK_SYNC)\n }\n\n const handleManageConnections = () => {\n setShowConnectionsWidget(true)\n onEvent(ANALYTICS_EVENTS.ACCOUNTS_CLICK_CONNECT)\n }\n\n return (\n <WidgetContainer\n accountOptions={accounts}\n actions={[\n {\n iconName: 'settings',\n label: accountsCopy.manage_connections,\n onClick: handleManageConnections,\n },\n {\n iconName: 'sync',\n label: accountsCopy.sync_accounts,\n onClick: handleSync,\n },\n ]}\n onAccountsFilterClick={() => onEvent(ANALYTICS_EVENTS.ACCOUNTS_CLICK_FILTER)}\n onBackClick={onBackClick}\n sx={sx}\n title={accountsCopy.title}\n >\n {isLoading ? (\n <Loader />\n ) : (\n <>\n <Box sx={{ px: isDesktop ? 24 : 12 }}>\n {selectedAccountGuids.length < 1 && (\n <Text display=\"flex\" justifyContent=\"center\" my={24}>\n {accountsCopy.no_accounts}\n </Text>\n )}\n <AccountsList />\n </Box>\n <ConnectionsDrawer\n onClose={() => setShowConnectionsWidget(false)}\n showConnectionsWidget={showConnectionsWidget}\n title={accountsCopy.manage_connections}\n />\n </>\n )}\n </WidgetContainer>\n )\n}\n\nexport default observer(AccountsWidget)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\n\nimport {\n Account,\n MiniWidgetContainer,\n MiniWidgetProps,\n useAccountStore,\n useGlobalCopyStore,\n useGlobalUiStore,\n} from '../common'\nimport AccountListItem from './components/AccountListItem'\n\nconst fliterAccounts = (accounts: Account[], selectedAccountGuids: string[]) => {\n return accounts.filter((account) => selectedAccountGuids.includes(account.guid)).slice(0, 3)\n}\n\nconst AccountsMiniWidget: React.FC<MiniWidgetProps> = ({ onPrimaryCtaClick, sx }) => {\n const { accounts } = useAccountStore()\n const { accounts: accountsCopy } = useGlobalCopyStore()\n const { selectedAccountGuids } = useGlobalUiStore()\n const [visibleAccounts, setVisibleAccounts] = React.useState(accounts)\n\n React.useEffect(() => {\n setVisibleAccounts(fliterAccounts(accounts, selectedAccountGuids))\n }, [accounts, selectedAccountGuids])\n\n return (\n <MiniWidgetContainer\n className=\"mx-exp-accounts-miniwidget\"\n onPrimaryCtaClick={onPrimaryCtaClick}\n primaryCtaLabel={accountsCopy.primary_cta}\n sx={sx}\n title={accountsCopy.mini_title}\n >\n <List>\n {visibleAccounts.length < 1 && (\n <ListItem sx={{ justifyContent: 'center' }}>{accountsCopy.no_accounts}</ListItem>\n )}\n {visibleAccounts.map((account, i) => {\n const isLast = visibleAccounts.indexOf(account) === visibleAccounts.length - 1\n return (\n <React.Fragment key={`account-item${i}`}>\n <AccountListItem\n account={account}\n listItemProps={{ sx: { px: 24 } }}\n shouldShowConnectionStatus={true}\n />\n {!isLast && <Divider aria-hidden=\"true\" variant=\"inset\" />}\n </React.Fragment>\n )\n })}\n </List>\n </MiniWidgetContainer>\n )\n}\n\nexport default observer(AccountsMiniWidget)\n","const ConnectImage = () => {\n return (\n <svg\n fill=\"none\"\n style={{ maxWidth: 400 }}\n viewBox=\"0 0 272 66\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g opacity=\"0.35\">\n <rect fill=\"#CD1141\" height=\"40.3437\" rx=\"2.81371\" width=\"39.6876\" x=\"19.6553\" />\n <path\n clipRule=\"evenodd\"\n d=\"M31.8226 13.6354C31.3503 13.6354 31.1918 13.8197 30.9968 14.3526L29.3583 18.8049H28.3261L27.0161 15.5731L25.7663 18.8049H24.6983L22.9884 14.4239C22.7933 13.9196 22.5042 13.6354 22.079 13.6354H21.9443V12.9824H24.8577V13.6354H24.5756C24.2499 13.6354 24.1033 13.7232 24.1152 13.9075C24.1152 13.9438 24.1033 14.0081 24.1391 14.0919C24.1391 14.0919 24.8058 15.6895 25.3334 17.2672C25.3889 17.2753 25.4127 17.2753 25.4127 17.2753L26.5557 14.3647C26.5081 13.8839 26.3494 13.6354 25.8533 13.6354H25.4646V12.9824H28.5325V13.6354H28.0483C27.7583 13.6354 27.6474 13.6996 27.6474 13.8718C27.6474 13.9438 27.6593 14.0317 27.6951 14.1161C27.6951 14.1161 28.3856 15.8096 28.8897 17.2837C28.9568 17.2837 28.9568 17.2874 28.9568 17.2874L30.0641 14.3401C30.1359 14.144 30.1359 13.996 30.1359 13.8954C30.1359 13.7111 29.9771 13.6354 29.6517 13.6354H29.2508V12.9824H32.0409V13.6354H31.8226ZM31.5757 18.8049V18.1523L31.9133 18.1402C32.4134 18.1402 32.6915 18.0921 32.6915 17.6074V14.1682C32.6915 13.6875 32.4134 13.6354 31.9133 13.6354H31.5757V12.9824H37.7633V15.241H37.1084C37.0727 13.8839 36.7592 13.6711 35.5923 13.6711H33.989V15.4009H34.4014C35.132 15.4009 35.2272 15.1532 35.2871 14.2759H35.9459V17.2272H35.2752C35.2272 16.2267 35.132 16.0895 34.4133 16.0895H33.989V18.1163H35.8344C36.8782 18.1163 37.1283 17.6157 37.2195 16.4582H37.8741V18.8049H31.5757ZM38.3799 18.8049V18.1523H38.709C39.2054 18.1523 39.4236 18.1042 39.4236 17.6074L39.4117 14.1803C39.4117 13.6875 39.1217 13.6354 38.6339 13.6354H38.3319V12.9824H41.7884V13.6354L41.3757 13.6475C40.82 13.6475 40.7211 13.6996 40.7211 14.1803V18.1163H42.1187C42.7971 18.1163 43.1979 18.0279 43.3805 17.6837C43.5508 17.3752 43.6223 17.0267 43.6223 16.4582H44.289V18.8049H38.3799ZM44.792 18.8049V18.1523H44.8793C45.3788 18.1523 45.597 18.1042 45.597 17.6074L45.5851 14.1803C45.5851 13.6875 45.3513 13.6354 44.8674 13.6354H44.5023V12.9824H47.963V13.6354L47.5506 13.6475C46.9901 13.6475 46.8957 13.6996 46.8957 14.1803V18.1163H48.2888C48.9708 18.1163 49.3713 18.0279 49.5539 17.6837C49.7209 17.3752 49.796 17.0267 49.796 16.4582H50.4627V18.8049H44.792Z\"\n fill=\"#FCB827\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M56.3297 17.1039C56.3297 18.4374 55.2982 18.9175 53.7705 18.9175C52.85 18.9175 51.9638 18.3853 51.7693 18.201L51.5752 18.8095H50.9921V16.4674H51.6585C51.8411 17.5846 52.5793 18.0687 53.631 18.1175C54.5362 18.1575 55.1788 17.9123 55.2505 17.2761C55.3339 16.5391 54.5362 16.5875 53.8694 16.4634L52.8845 16.279C51.4164 16.019 50.9441 15.5861 50.9084 14.6135C50.869 13.5521 51.8173 12.8598 53.0921 12.8477C53.711 12.8477 54.5123 12.9476 55.1312 13.4525L55.4209 12.9715H55.9292V15.0054H55.2863C55.1467 13.877 54.052 13.5326 53.116 13.5562C52.4361 13.58 51.9876 13.9763 51.9876 14.4456C51.9876 14.8819 52.4123 14.9378 52.9523 15.0334L54.1545 15.2462C55.3818 15.4542 56.3297 15.7105 56.3297 17.0918V17.1039Z\"\n fill=\"#FCB827\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M28.8464 23.9664C28.8464 23.5179 28.7749 23.1213 28.6162 22.8008C28.4217 22.4566 28.0248 22.4045 27.3419 22.4045H25.9092V24.1464H26.3616C27.0879 24.1464 27.1993 24.0108 27.1993 23.1092H27.7314V26.0205L27.1874 26.0084C27.1755 25.0349 27.076 24.835 26.3616 24.835H25.9092V26.3525C25.9092 26.8376 25.9849 26.8848 26.481 26.8848H27.1477V27.5383H23.6152V26.8848L23.9449 26.8733C24.441 26.8733 24.6117 26.8255 24.6117 26.3404V22.9013C24.6117 22.4209 24.441 22.3688 23.9449 22.3688H23.6152V21.7158H29.5052V23.9664H28.8464Z\"\n fill=\"#FCB827\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M31.9262 22.7664L31.0653 25.0005H32.799L31.9262 22.7664ZM32.2397 27.5393V26.8858H32.8589C33.1886 26.8858 33.347 26.8501 33.347 26.6502C33.347 26.5779 33.307 26.478 33.2594 26.3694L33.0173 25.6894H30.7832L30.4935 26.4181C30.4456 26.5301 30.4217 26.6142 30.4217 26.6902C30.4217 26.8743 30.5768 26.8858 30.8821 26.8858H31.4777V27.5393H28.4893V26.8858H28.7512C29.1994 26.8858 29.3349 26.7259 29.5053 26.3172L31.4225 21.7168H32.8271L34.6607 26.3172C34.8277 26.7622 35.0136 26.8858 35.3393 26.8858H35.6171V27.5393H32.2397Z\"\n fill=\"#FCB827\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M40.0656 23.2598C40.0656 22.5827 39.677 22.3828 38.8631 22.3828H37.6367V24.1483L38.8872 24.1362C39.6889 24.1362 40.0656 23.8761 40.0656 23.2719V23.2598ZM42.0885 26.1816C42.0885 27.2423 41.6043 27.6628 40.9137 27.6628C40.1243 27.6628 39.6129 27.4428 39.5769 26.6381L39.5531 25.961C39.5173 24.9846 39.2108 24.7882 38.2189 24.7882H37.6358V26.3538C37.6358 26.8386 37.7073 26.8861 38.207 26.8861H38.7269V27.5393H35.2305V26.8861H35.7385C36.0682 26.8861 36.3378 26.766 36.3378 26.3417V22.9026C36.3378 22.4219 36.2627 22.3697 35.7666 22.3697H35.2943V21.7168H39.2346C40.7074 21.7168 41.386 22.1618 41.386 23.0987C41.386 23.9388 40.7434 24.4558 39.6486 24.6039C40.6683 24.8524 40.8029 25.2202 40.8624 26.0094C40.8743 26.0857 40.8624 26.2458 40.8624 26.3694C40.8863 26.7138 41.0212 26.8743 41.1915 26.8622C41.5411 26.8386 41.5686 26.5779 41.5411 25.8852H42.0885C42.1004 25.9852 42.1004 26.0857 42.1004 26.1816H42.0885Z\"\n fill=\"#FCB827\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M47.1941 23.583C46.92 22.7101 46.3451 22.3017 45.3969 22.3017C44.4633 22.3017 43.7215 23.0787 43.7334 24.56C43.7334 26.0657 44.3284 26.8791 45.3969 26.8906C46.1745 26.8906 46.865 26.4986 46.865 25.8293V25.5093C46.865 25.117 46.7695 25.117 46.2221 25.117H45.936V24.4486H48.5991V25.117H48.3808C47.968 25.117 47.9049 25.077 47.9049 25.5735V27.5234H47.4362L47.1346 27.0393C46.611 27.4598 45.8609 27.6556 45.1896 27.6556C44.4047 27.6556 43.7334 27.375 43.2016 26.8307C42.6423 26.2501 42.3165 25.4736 42.3284 24.56C42.3284 23.6594 42.6185 22.9428 43.1897 22.3659C43.6858 21.8697 44.4395 21.5894 45.218 21.6009C45.8609 21.6009 46.611 21.7732 47.0354 22.2303L47.3288 21.6251H47.7855V23.5793L47.1941 23.583Z\"\n fill=\"#FCB827\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M54.3606 24.6277C54.3606 23.0983 53.5391 22.3008 52.4107 22.3008C51.2958 22.3008 50.4468 23.0983 50.4468 24.6277C50.4468 26.1533 51.2958 26.9704 52.4107 26.9704C53.5223 26.9704 54.3487 26.1533 54.3487 24.6277H54.3606ZM52.4355 27.6467C50.5311 27.6467 49.0547 26.4373 49.0547 24.6032C49.0547 22.7775 50.5311 21.584 52.4236 21.584C54.3258 21.584 55.7665 22.7775 55.7665 24.6153C55.7665 26.4373 54.3258 27.6467 52.4355 27.6467Z\"\n fill=\"#FCB827\"\n fillRule=\"evenodd\"\n />\n <rect fill=\"#E3E6E7\" height=\"40.3437\" rx=\"2.81371\" width=\"39.6876\" x=\"115.611\" />\n <path\n clipRule=\"evenodd\"\n d=\"M133.919 27.8109C134.985 28.9105 136.408 29.5155 137.925 29.5155C139.447 29.5155 140.874 28.9066 141.942 27.7999L142.108 27.6282C143.176 26.5226 143.764 25.0454 143.765 23.47C143.765 21.8941 143.177 20.4175 142.11 19.3124L138.767 16.1174L136.091 13.0798C135.024 11.9791 133.601 11.373 132.084 11.373C130.561 11.373 129.135 11.9824 128.066 13.0886L127.901 13.2603C125.689 15.5505 125.685 19.2738 127.889 21.5667L131.007 24.415L133.919 27.8109ZM137.924 30.3814C136.179 30.3814 134.543 29.6826 133.318 28.4141L133.301 28.3954L130.398 25.01L127.306 22.1887C126.081 20.9197 125.406 19.2256 125.406 17.4189C125.407 15.6117 126.082 13.9176 127.308 12.648L127.474 12.4764C128.7 11.2062 130.337 10.5068 132.083 10.5068C133.827 10.5068 135.462 11.2057 136.688 12.4741L136.701 12.4885L139.371 15.5201L142.688 18.6874C143.926 19.9686 144.6 21.6627 144.6 23.4699C144.6 25.2766 143.924 26.9712 142.698 28.2402L142.533 28.4119C141.306 29.6821 139.669 30.3814 137.924 30.3814Z\"\n fill=\"#F27762\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M129.239 16.2603C126.255 17.2081 124.569 20.4924 125.48 23.5864L125.548 23.8182C126.269 26.2674 128.505 27.978 130.984 27.978C131.534 27.978 132.082 27.8936 132.612 27.728L136.506 26.2177L140.769 25.1529C143.752 24.204 145.437 20.9208 144.526 17.828L144.457 17.5956C143.737 15.1464 141.501 13.4357 139.022 13.4357C138.47 13.4357 137.921 13.5207 137.39 13.6874L133.086 15.2435L129.239 16.2603ZM130.984 28.8622C128.132 28.8622 125.56 26.8938 124.73 24.0759L124.662 23.8435C123.613 20.2798 125.559 16.4964 128.999 15.4107L129.018 15.4051L132.856 14.3906L137.132 12.8433C137.747 12.649 138.382 12.5508 139.022 12.5508C141.874 12.5508 144.445 14.5186 145.275 17.3371L145.343 17.569C146.392 21.1332 144.447 24.916 141.006 26.0024L140.982 26.009L136.731 27.071L132.873 28.5697C132.259 28.7634 131.623 28.8622 130.984 28.8622Z\"\n fill=\"#57A8B2\"\n fillRule=\"evenodd\"\n />\n <mask\n height=\"23\"\n id=\"mask0_6197_80303\"\n maskUnits=\"userSpaceOnUse\"\n style={{ maskType: 'luminance' }}\n width=\"22\"\n x=\"124\"\n y=\"9\"\n >\n <path\n clipRule=\"evenodd\"\n d=\"M124.378 9.40137H145.627V31.4884H124.378V9.40137Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n </mask>\n <g mask=\"url(#mask0_6197_80303)\">\n <path\n clipRule=\"evenodd\"\n d=\"M128.324 23.1985C127.947 24.7049 128.16 26.2792 128.925 27.6327C129.693 28.9906 130.92 29.956 132.379 30.3512L132.605 30.4131C133.073 30.5395 133.553 30.6035 134.032 30.6035C136.612 30.6035 138.87 28.8051 139.525 26.2295L140.501 21.6192L141.682 17.694C142.061 16.187 141.847 14.6117 141.081 13.2571C140.314 11.8991 139.088 10.9337 137.629 10.5385L137.401 10.4772C136.934 10.3502 136.454 10.2862 135.974 10.2862C133.396 10.2862 131.139 12.0819 130.483 14.6553L129.683 18.8808L128.324 23.1985ZM134.032 31.4884C133.48 31.4884 132.927 31.4144 132.389 31.2687L132.162 31.2068C130.482 30.752 129.071 29.6414 128.189 28.0798C127.305 26.5182 127.061 24.701 127.5 22.9622L127.508 22.9368L128.863 18.6324L129.653 14.4449C130.404 11.4752 133.003 9.40137 135.974 9.40137C136.527 9.40137 137.08 9.47533 137.618 9.62106L137.844 9.68233C139.524 10.1377 140.935 11.2483 141.819 12.8099C142.701 14.3715 142.946 16.1887 142.506 17.9275L142.501 17.9474L141.322 21.8638L140.354 26.4448C139.603 29.4145 137.004 31.4884 134.032 31.4884Z\"\n fill=\"#008796\"\n fillRule=\"evenodd\"\n />\n </g>\n <rect fill=\"#0F375A\" height=\"40.3437\" rx=\"2.81371\" width=\"39.6876\" x=\"163.104\" />\n <path\n clipRule=\"evenodd\"\n d=\"M172.903 25.3916V29.0834C172.903 31.1461 174.153 31.487 175.199 31.487C176.746 31.487 177.462 30.4569 177.462 29.0624V25.3916H176.438V29.1869C176.438 29.6664 176.283 30.5619 175.199 30.5443C174.214 30.5269 174.031 29.6116 174.031 29.025V25.3916H172.903Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M181.736 25.6341C181.736 25.6341 181.083 25.3057 180.341 25.3057C179.416 25.3057 178.254 25.786 178.254 27.0922C178.254 27.9996 178.915 28.4298 179.368 28.6508C179.607 28.7689 179.899 28.9007 180.138 29.0301C180.262 29.0976 180.753 29.2647 180.753 29.8026C180.753 30.3755 180.13 30.5722 179.85 30.5722C178.852 30.5722 178.173 30.114 178.173 30.114L178.277 31.2653C178.277 31.2653 178.684 31.4744 179.906 31.4753C181.07 31.472 181.91 30.7186 181.91 29.68C181.91 28.8806 181.369 28.4066 180.907 28.1811C180.543 27.9996 180.332 27.9038 180.016 27.7531C179.7 27.6036 179.374 27.344 179.374 26.9412C179.374 26.5108 179.764 26.2018 180.341 26.2018C181.188 26.2018 181.529 26.5875 181.736 26.7099V25.6341Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M190.065 25.3818H188.836L189.032 25.8814L187.125 31.013L185.159 25.3818H183.93L184.126 25.8814L182.093 31.3527H183.203L183.558 30.3111H185.66L186.013 31.3527H188.109L188.465 30.3111H190.567L190.921 31.3527H192.15L190.065 25.3818ZM183.834 29.5023L184.65 27.1638L185.377 29.5023H183.834ZM188.742 29.5023L189.556 27.1638L190.285 29.5023H188.742Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M172.841 18.6769L172.892 20.5423C172.892 20.5423 173.347 20.2041 173.854 20.2041C174.364 20.2041 174.938 20.5727 174.938 20.5727L179.489 23.2554L179.873 21.5693L174.938 18.6608C174.938 18.6608 174.366 18.2939 173.854 18.2939C173.344 18.2939 172.841 18.6769 172.841 18.6769Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M172.841 16.2365L172.892 18.1025C172.892 18.1025 173.347 17.764 173.854 17.764C174.364 17.764 174.938 18.1326 174.938 18.1326L179.98 21.1039L180.364 19.4181L174.938 16.2206C174.938 16.2206 174.366 15.8535 173.854 15.8535C173.344 15.8535 172.841 16.2365 172.841 16.2365Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M172.841 13.798L172.892 15.6634C172.892 15.6634 173.347 15.3255 173.854 15.3255C174.364 15.3255 174.938 15.6929 174.938 15.6929L180.471 18.9561L180.855 17.2691L174.938 13.7803C174.938 13.7803 174.366 13.415 173.854 13.415C173.344 13.415 172.841 13.798 172.841 13.798Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M182.326 10.8286L182.833 13.0307L189.763 17.1136C189.763 17.1136 190.309 17.4801 190.843 17.4801C191.379 17.4801 191.859 17.0966 191.859 17.0966L191.807 15.2312C191.807 15.2312 191.372 15.57 190.843 15.57C190.316 15.57 189.763 15.202 189.763 15.202L184.401 12.0413L184.031 10.6249C184.031 10.5656 184.084 10.5373 184.103 10.5321L185.012 10.2457C185.133 10.2457 185.204 10.3516 185.204 10.4417L185.252 10.5424C185.285 10.5601 185.422 10.4925 185.432 10.487V9.92816C185.435 9.55861 185.142 9.22986 184.741 9.22986H183.834C183.834 9.22986 183.702 8.91602 183.316 8.91602H181.594C181.139 8.91602 181.029 9.34827 181.029 9.34827L179.833 14.2297L174.938 11.3433C174.938 11.3433 174.408 10.9756 173.854 10.9756C173.303 10.9756 172.841 11.3589 172.841 11.3589L172.892 13.2239C172.892 13.2239 173.301 12.8867 173.854 12.8867C174.408 12.8867 174.938 13.2553 174.938 13.2553L180.96 16.804L182.326 10.8286Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M182.969 13.6348L183.474 15.846L189.764 19.5518C189.764 19.5518 190.327 19.9201 190.844 19.9201C191.36 19.9201 191.859 19.5353 191.859 19.5353L191.807 17.6703C191.807 17.6703 191.404 18.0078 190.844 18.0078C190.282 18.0078 189.764 17.641 189.764 17.641L182.969 13.6348Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M183.613 16.4541L184.12 18.6659L189.763 21.9912C189.763 21.9912 190.328 22.3592 190.844 22.3592C191.361 22.3592 191.859 21.9754 191.859 21.9754L191.808 20.1097C191.808 20.1097 191.404 20.4467 190.844 20.4467C190.283 20.4467 189.763 20.0802 189.763 20.0802L183.613 16.4541Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M184.258 19.2744L184.764 21.4832L189.762 24.4301C189.762 24.4301 190.326 24.7991 190.843 24.7991C191.36 24.7991 191.858 24.4125 191.858 24.4125L191.807 22.548C191.807 22.548 191.403 22.8868 190.843 22.8868C190.281 22.8868 189.762 22.5172 189.762 22.5172L184.258 19.2744Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <rect fill=\"#63215F\" height=\"40.3437\" rx=\"2.81371\" width=\"39.6876\" x=\"210.6\" />\n <path\n clipRule=\"evenodd\"\n d=\"M239.721 19.6979C239.721 15.1527 236.576 9.83984 230.029 9.83984C223.481 9.83984 220.336 15.1527 220.336 19.6979C220.336 24.0237 223.185 29.0459 229.106 29.5197L234.111 23.9305H230.128C227.849 23.9305 225.918 22.1459 225.918 19.6979C225.918 17.25 227.849 15.4654 230.128 15.4654C232.409 15.4654 234.339 17.25 234.339 19.6979V29.1864H239.721V19.6979Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <rect fill=\"#4C9C42\" height=\"40.3437\" rx=\"2.81371\" width=\"39.6876\" x=\"68.0742\" />\n <path\n clipRule=\"evenodd\"\n d=\"M87.3886 9.33496C81.8333 9.33496 77.3135 13.9232 77.3135 19.5633C77.3135 25.2031 81.8333 29.7914 87.3886 29.7914C92.944 29.7914 97.4638 25.2031 97.4638 19.5633C97.4638 13.9232 92.944 9.33496 87.3886 9.33496ZM87.3887 30.2718C81.5726 30.2718 76.8408 25.4683 76.8408 19.5637C76.8408 13.6592 81.5726 8.85547 87.3887 8.85547C93.2049 8.85547 97.9367 13.6592 97.9367 19.5637C97.9367 25.4683 93.2049 30.2718 87.3887 30.2718Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M85.5645 21.2082H89.2207L86.9458 16.7266L85.5645 21.2082Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M87.2797 16.5158L84.847 20.1764L85.2719 20.8966H84.4244L83.7935 22.0585L79.9922 24.2446L84.4582 20.2796L78.8241 20.8272L84.1948 19.0006L78.7783 17.2801L84.4119 17.7342L80.0718 13.9902L85.1801 16.595L82.5804 11.5263L86.1641 15.9554L85.8435 9.83984L87.5509 15.6298L89.3364 10.1073L88.7986 15.9086L92.5547 11.7119L89.7826 16.8624L94.9705 14.3975L90.4138 17.8274L96.311 17.7342L90.7219 18.9087L96.2304 21.14L90.0559 20.2538L94.7107 24.5453L91.1039 22.5482L93.7395 27.0644C93.7395 27.0644 91.2261 29.1735 88.4481 29.1735C85.6703 29.1735 83.6458 28.4084 83.6458 28.4084L85.7735 21.7179L90.4873 21.6878L89.5488 20.9858\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n </g>\n <rect fill=\"#163F8E\" height=\"47.5848\" rx=\"3.31025\" width=\"46.8064\" x=\"57.1562\" y=\"18.1035\" />\n <path\n clipRule=\"evenodd\"\n d=\"M64.2012 29.4199L64.218 49.0359L80.5605 54.688L96.9025 49.0359V29.4199H64.2012Z\"\n fill=\"#D52942\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M80.5347 48.419H75.539V46.664H75.4866C74.5173 48.0471 73.1319 48.7649 71.0654 48.7649C68.6337 48.7649 66.4092 47.2501 66.4092 44.0852V34.6182H71.5871V41.8493C71.5871 43.4469 71.7723 44.5637 73.2897 44.5637C74.1785 44.5637 75.355 44.1119 75.355 41.9045V34.6182H80.5347V48.419Z\"\n fill=\"#FEFEFE\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M90.1891 38.6329C90.1634 38.1818 89.9281 37.8365 89.5856 37.595C89.2736 37.3309 88.8546 37.1976 88.4366 37.1976C87.7043 37.1976 86.8663 37.357 86.8663 38.2604C86.8663 38.6595 87.1819 38.845 87.4685 38.9782C88.3317 39.3518 90.2945 39.4566 92.0216 40.0423C93.7474 40.6012 95.2646 41.6386 95.2646 43.8987C95.2646 47.728 91.6527 48.7649 88.3579 48.7649C85.1667 48.7649 81.6615 47.4616 81.583 43.8987H86.5266C86.5541 44.3773 86.7614 44.7769 87.1535 45.1228C87.4159 45.362 87.9129 45.5206 88.5408 45.5206C89.2218 45.5206 90.2945 45.2559 90.2945 44.4572C90.2945 43.659 89.8484 43.4203 87.4419 42.9953C83.4935 42.303 81.8968 41.0269 81.8968 38.6595C81.8968 35.1761 85.5862 34.2725 88.3055 34.2725C91.2357 34.2725 94.7658 35.0968 94.8977 38.6329H90.1891Z\"\n fill=\"#FEFEFE\"\n fillRule=\"evenodd\"\n />\n <rect fill=\"white\" height=\"47.5848\" rx=\"3.31025\" width=\"46.8064\" x=\"113.168\" y=\"18.1035\" />\n <mask\n height=\"48\"\n id=\"mask1_6197_80303\"\n maskUnits=\"userSpaceOnUse\"\n style={{ maskType: 'luminance' }}\n width=\"47\"\n x=\"113\"\n y=\"18\"\n >\n <rect fill=\"white\" height=\"47.5848\" rx=\"3.31025\" width=\"46.8064\" x=\"113.168\" y=\"18.1035\" />\n </mask>\n <g mask=\"url(#mask1_6197_80303)\">\n <mask\n height=\"49\"\n id=\"mask2_6197_80303\"\n maskUnits=\"userSpaceOnUse\"\n style={{ maskType: 'luminance' }}\n width=\"48\"\n x=\"113\"\n y=\"18\"\n >\n <path\n clipRule=\"evenodd\"\n d=\"M113.168 18.1123H160.315V66.018H113.168V18.1123Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n </mask>\n <g mask=\"url(#mask2_6197_80303)\">\n <path\n clipRule=\"evenodd\"\n d=\"M159.987 18.1123H113.168V38.2766L114.766 34.5609H118.188L118.659 35.4794V34.5609H122.655L123.557 36.5441L124.437 34.5609H137.182C137.776 34.5609 138.289 34.6654 138.678 34.9996V34.5609H142.181V34.9996C142.755 34.6654 143.514 34.5609 144.374 34.5609H149.435L149.906 35.4794V34.5609H153.635L154.189 35.4794V34.5609H157.835V42.3895H154.148L153.43 41.1989V42.3895H148.84L148.328 41.1156H147.201L146.689 42.3895H144.291C143.35 42.3895 142.652 42.1591 142.181 41.909V42.3895H136.485V40.5934C136.485 40.3433 136.444 40.3016 136.281 40.3016H136.096V42.3895H125.093V41.3869L124.703 42.3895H122.388L121.999 41.4286V42.3895H117.553L117.081 41.1156H115.955L115.442 42.3895H113.168V66.018H159.987V51.6778C159.495 51.9075 158.778 52.0325 158.081 52.0325H154.66V51.5527C154.27 51.8658 153.553 52.0325 152.897 52.0325H142.141V50.2379C142.141 49.9871 142.099 49.9871 141.894 49.9871H141.711V52.0325H138.166V49.9036C137.571 50.1955 136.915 50.1955 136.321 50.1955H135.932V52.0325H131.609L130.585 50.8222L129.457 52.0325H122.511V44.1842H129.58L130.585 45.3952L131.691 44.1842H136.444C136.998 44.1842 137.899 44.2675 138.289 44.6639V44.1842H142.53C142.96 44.1842 143.78 44.2675 144.333 44.6639V44.1842H150.725V44.6639C151.095 44.3509 151.75 44.1842 152.344 44.1842H155.909V44.6639C156.299 44.3932 156.852 44.1842 157.569 44.1842H159.987V18.1123ZM115.586 38.8399L116.509 36.627L117.409 38.8399H115.586ZM137.262 37.9434C137.058 38.0684 136.873 38.0684 136.606 38.0684H134.988V36.8369H136.606C136.833 36.8369 137.098 36.8369 137.262 36.9203C137.426 37.0249 137.508 37.1916 137.508 37.4417C137.508 37.6721 137.426 37.8805 137.262 37.9434ZM148.655 38.8399L147.754 36.627L146.853 38.8399H148.655ZM127.366 35.667H125.216L123.597 39.4661L121.876 35.667H119.766V40.9478L117.511 35.667H115.565L113.208 41.2614H114.622L115.114 40.03H117.88L118.372 41.2614H121.056V36.878L122.982 41.2614H124.109L126.035 36.878V41.2614H127.366V35.667ZM132.757 40.1133H129.683V38.9864H132.716V37.8382H129.683V36.8363H132.757V35.667H128.352V41.2614H132.757V40.1133ZM138.289 35.9178C137.858 35.667 137.388 35.667 136.711 35.667H133.699V41.2614H134.99V39.2365H136.403C136.875 39.2365 137.183 39.2782 137.388 39.4661C137.613 39.7587 137.572 40.2383 137.572 40.5514V41.2614H138.924V40.155C138.924 39.6752 138.882 39.4244 138.678 39.1531C138.555 38.9864 138.33 38.7984 138.043 38.6734C138.411 38.5059 138.986 38.0678 138.986 37.191C138.986 36.5438 138.719 36.1891 138.289 35.9178ZM141.076 35.667H139.745V41.2614H141.076V35.667ZM156.668 41.2614H154.783L152.303 37.066V41.2614H149.64L149.127 40.03H146.382L145.87 41.2614H144.333C143.698 41.2614 142.879 41.1152 142.407 40.6354C141.977 40.155 141.73 39.5078 141.73 38.5059C141.751 37.6714 141.854 36.9196 142.448 36.3142C142.838 35.8761 143.554 35.667 144.456 35.667H145.706V36.878H144.456C143.985 36.878 143.698 36.9614 143.431 37.191C143.186 37.4411 143.083 37.8799 143.083 38.4642C143.083 39.0697 143.186 39.5078 143.431 39.8003C143.616 39.9882 143.985 40.0716 144.333 40.0716H144.927L146.813 35.667H148.759L150.972 40.9478V35.667H153L155.316 39.5495V35.667H156.668V41.2614ZM128.229 49.7565H124.971V48.6288H127.88V47.5019H124.971V46.4795H128.27L129.725 48.1074L128.229 49.7565ZM131.424 48.1078L133.453 45.916V50.4245L131.424 48.1078ZM136.486 47.8989H134.744V46.4795H136.486C136.958 46.4795 137.264 46.6675 137.264 47.1473C137.264 47.6269 136.958 47.8989 136.486 47.8989ZM142.879 47.6269C142.673 47.711 142.489 47.711 142.243 47.711L140.646 47.7527V46.4795H142.243C142.489 46.4795 142.714 46.4795 142.879 46.5834C143.042 46.6675 143.145 46.8342 143.145 47.0638C143.145 47.3146 143.042 47.5019 142.879 47.6269ZM136.484 45.3115H132.284L130.584 47.1486L128.985 45.3115H123.678V50.906H128.903L130.584 49.0689L132.202 50.906H134.743V49.0273H136.402C137.529 49.0273 138.677 48.7143 138.677 47.1486C138.677 45.6245 137.509 45.3115 136.484 45.3115ZM143.943 45.5828C143.513 45.3532 143 45.3115 142.323 45.3115H139.312V50.906H140.644V48.8606H142.058C142.529 48.8606 142.795 48.9022 143 49.1107C143.226 49.382 143.226 49.8618 143.226 50.2383V50.906H144.537V49.82C144.537 49.3191 144.496 49.0689 144.332 48.7976C144.209 48.6302 143.984 48.4217 143.656 48.3172C144.024 48.1921 144.598 47.7123 144.598 46.8355C144.598 46.1884 144.373 45.8337 143.943 45.5828ZM149.742 49.7578H146.648V48.6302H149.681V47.5032H146.648V46.4808H149.742V45.3115H145.357V50.906H149.742V49.7578ZM154.783 47.942C154.455 47.6707 153.984 47.5032 153.247 47.5032H152.53C152.345 47.5032 152.181 47.4616 152.017 47.4199C151.874 47.3577 151.751 47.2319 151.751 47.0228C151.751 46.8355 151.792 46.7097 151.956 46.5848C152.058 46.5013 152.222 46.5013 152.468 46.5013H154.886V45.3115H152.263C150.849 45.3115 150.378 46.1884 150.378 46.9818C150.378 48.756 151.915 48.6726 153.124 48.7143C153.369 48.7143 153.513 48.756 153.595 48.8394C153.676 48.9022 153.759 49.0689 153.759 49.2357C153.759 49.382 153.676 49.5078 153.595 49.5911C153.471 49.6745 153.328 49.7162 153.083 49.7162H150.542V50.906H153.083C154.414 50.906 155.173 50.3421 155.173 49.1531C155.173 48.5892 155.008 48.2339 154.783 47.942ZM160.315 49.1531C160.315 50.3421 159.556 50.906 158.225 50.906H155.684V49.7162H158.225C158.47 49.7162 158.655 49.6745 158.737 49.5911C158.819 49.5078 158.9 49.382 158.9 49.2357C158.9 49.0689 158.819 48.9022 158.737 48.8394C158.655 48.756 158.511 48.7143 158.266 48.7143C157.057 48.6726 155.52 48.756 155.52 46.9818C155.52 46.1884 156.032 45.3115 157.405 45.3115H160.028V46.5013H157.61C157.364 46.5013 157.2 46.5013 157.098 46.5848C156.975 46.7097 156.893 46.8355 156.893 47.0228C156.893 47.2319 157.016 47.3577 157.159 47.4199C157.323 47.4616 157.488 47.5032 157.672 47.5032H158.388C159.126 47.5032 159.597 47.6707 159.926 47.942C160.151 48.2339 160.315 48.5892 160.315 49.1531Z\"\n fill=\"#0078A9\"\n fillRule=\"evenodd\"\n />\n </g>\n </g>\n <rect fill=\"#CC373B\" height=\"47.5848\" rx=\"3.31025\" width=\"46.8064\" x=\"169.182\" y=\"18.1035\" />\n <path\n clipRule=\"evenodd\"\n d=\"M188.11 37.584L191.61 39.0914C187.932 40.5994 184.433 42.4085 181.053 44.459L177.555 42.7102C180.934 40.7201 184.433 39.0311 188.11 37.584Z\"\n fill=\"#0071BA\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M183.723 35.9551C179.928 37.1613 176.31 38.7291 172.811 40.7198L176.073 41.9859C179.453 39.9963 183.01 38.3067 186.748 36.92L183.723 35.9551Z\"\n fill=\"#0071BA\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M196.058 37.3417C193.093 35.8951 190.008 34.6889 186.806 33.6631L183.426 34.7481C186.748 35.7745 189.948 36.9807 192.973 38.4887L196.058 37.3417Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M200.979 35.9553C197.895 34.5681 194.753 33.4216 191.491 32.5176L188.408 33.2411C191.668 34.206 194.753 35.4123 197.776 36.9203L200.979 35.9553Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M208.806 38.6094C201.038 41.3225 193.922 45.0017 187.398 49.706L192.143 52.9622C198.311 47.9572 205.071 43.9161 212.424 40.7202L208.806 38.6094Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M203.53 36.0752C195.465 38.2469 188.052 41.6243 181.234 46.2673L185.739 48.7402C192.442 44.0358 199.676 40.4779 207.562 38.005L203.53 36.0752Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <rect fill=\"#3469C5\" height=\"47.5848\" rx=\"3.31025\" width=\"46.8064\" x=\"225.193\" y=\"18.1035\" />\n <path\n clipRule=\"evenodd\"\n d=\"M260.318 36.857H259.652C254.804 36.857 249.955 36.8461 245.107 36.8703C244.471 36.8735 244.25 36.7044 244.268 36.0348C244.311 34.355 244.28 32.6733 244.283 30.9925C244.284 30.049 244.556 29.757 245.462 29.7546C247.808 29.7484 250.154 29.7425 252.5 29.7655C252.785 29.7684 253.142 29.8689 253.342 30.0587C255.612 32.213 257.858 34.393 260.109 36.5681C260.168 36.625 260.208 36.7025 260.318 36.857Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M254.264 54.3927C254.25 54.1047 254.232 53.9082 254.232 53.7119C254.23 48.7753 254.242 43.839 254.217 38.9028C254.213 38.2357 254.414 38.0471 255.055 38.0635C256.688 38.1051 258.322 38.0751 259.955 38.0783C260.901 38.08 261.124 38.2925 261.127 39.2231C261.132 41.6571 261.142 44.0914 261.112 46.525C261.109 46.8547 260.976 47.2613 260.759 47.4972C258.731 49.7102 256.671 51.8941 254.618 54.0844C254.533 54.1763 254.428 54.2508 254.264 54.3927Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M237.063 48.2785H237.801C242.583 48.2785 247.365 48.2778 252.147 48.279C253.027 48.2792 253.028 48.2824 253.029 49.1898C253.03 50.8256 253.033 52.4612 253.027 54.0968C253.024 54.9902 252.737 55.2849 251.865 55.2866C249.474 55.2914 247.083 55.2969 244.692 55.2762C244.428 55.274 244.097 55.1783 243.912 55.0018C241.696 52.8879 239.501 50.7512 237.303 48.6183C237.242 48.5596 237.203 48.4786 237.063 48.2785Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M242.954 30.7637C242.97 31.0715 242.991 31.2883 242.991 31.5051C242.993 36.3712 242.98 41.2375 243.006 46.1034C243.01 46.7919 242.82 47.0094 242.136 46.9899C240.482 46.9423 238.826 46.9794 237.171 46.9713C236.343 46.9674 236.104 46.7172 236.102 45.8612C236.098 43.4281 236.091 40.9949 236.113 38.5621C236.116 38.2727 236.212 37.9101 236.398 37.7078C238.46 35.4659 240.548 33.2487 242.631 31.0265C242.703 30.9503 242.793 30.8931 242.954 30.7637Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n <rect fill=\"#624D9F\" height=\"47.5848\" rx=\"3.31025\" width=\"46.8064\" y=\"18.1035\" />\n <path\n clipRule=\"evenodd\"\n d=\"M27.7715 28.3135L20.123 41.8988L27.7715 55.9116L32.478 52.8357L28.2757 45.0605H37.0165V39.2502L28.2757 38.9938L32.394 31.5603L27.7715 28.3135Z\"\n fill=\"#98C93C\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M18.8624 28.3135L14.2399 31.5603L18.358 38.9938L9.61719 39.2502V45.0605H18.358L14.1557 52.8357L18.8624 55.9116L26.5107 41.8988L18.8624 28.3135Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n </svg>\n )\n}\n\nexport default ConnectImage\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@kyper/mui'\n\nimport { MiniWidgetContainer, useGlobalCopyStore } from '../../common'\nimport ConnectImage from './ConnectImage'\n\nimport type { MiniWidgetProps } from '../../common'\n\nconst ConnectMiniWidgetCard: React.FC<MiniWidgetProps> = ({ onPrimaryCtaClick, sx = {} }) => {\n const { connect: connectCopy } = useGlobalCopyStore()\n\n return (\n <MiniWidgetContainer\n className=\"mx-exp-connect-miniwidget\"\n onPrimaryCtaClick={onPrimaryCtaClick}\n primaryCtaLabel={connectCopy.primary_cta}\n sx={sx}\n title={connectCopy.mini_title}\n >\n <Stack alignItems=\"center\" direction=\"column\" m={24}>\n <ConnectImage />\n <Text\n sx={{\n whiteSpace: 'wrap',\n mt: 16,\n textAlign: 'center',\n }}\n variant=\"Paragraph\"\n >\n {connectCopy.mini_widget_content}\n </Text>\n </Stack>\n </MiniWidgetContainer>\n )\n}\n\nexport default observer(ConnectMiniWidgetCard)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport { type SxProps } from '@mui/material/styles'\n\n\nimport ConnectMiniWidgetCard from './components/ConnectMiniWidgetCard'\nimport { ConnectDrawer, useGlobalCopyStore } from '../common'\n\ninterface ConnectMiniWidgetProps {\n onPrimaryCtaClick?: () => void\n sx?: SxProps\n}\n\nconst ConnectMiniWidget: React.FC<ConnectMiniWidgetProps> = ({ onPrimaryCtaClick = () => {}, sx }) => {\n const { connect: connectCopy } = useGlobalCopyStore()\n const [showConnectWidget, setShowConnectWidget] = React.useState(false)\n const onCtaClick = () => {\n setShowConnectWidget(true)\n onPrimaryCtaClick()\n }\n\n return (\n <Box data-testid=\"ConnectMiniWidget\">\n <ConnectMiniWidgetCard onPrimaryCtaClick={onCtaClick} sx={sx} />\n {showConnectWidget &&\n <ConnectDrawer onClose={() => setShowConnectWidget(false)}\n showConnectWidget={showConnectWidget}\n title={connectCopy.mini_title} />\n }\n </Box>\n )\n}\n\nexport default observer(ConnectMiniWidget)\n","import Fetch from '../../common/utils/Fetch'\n\nimport { ApiEndpoints } from '../../common/constants'\nimport type { Account } from '../../common'\n\nexport class AccountApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\n }\n\n createAccount = async (account: Account) => {\n return this.fetchInstance\n .post(ApiEndpoints.ACCOUNTS, account)\n .then((data) => data.account)\n .catch((error) => error)\n }\n\n deleteAccount = async (accountGuid: string) => {\n return this.fetchInstance\n .delete(`${ApiEndpoints.ACCOUNTS}/${accountGuid}`)\n .catch((error) => error)\n }\n\n getAccounts = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.ACCOUNTS)\n .then((data) => data.accounts)\n .catch((error) => error)\n }\n\n getInstitutions = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.INSTITUTIONS)\n .then((data) => data)\n .catch((error) => error)\n }\n\n getMembers = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.MEMBERS)\n .then((data) => data.members)\n .catch((error) => error)\n }\n\n getMonthlyAccountBalances = async (guid: string) => {\n return this.fetchInstance\n .get(`${ApiEndpoints.ACCOUNTS}/${guid}/monthly_account_balances`)\n .then((data) => data.monthly_account_balances)\n .catch((error) => error)\n }\n\n mergeAccounts = async (accountGuids: string[]) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.ACCOUNTS}/merge`, { accounts: accountGuids })\n .then((data) => data)\n .catch((error) => error)\n }\n\n refreshAllMembers = async () => {\n return this.fetchInstance\n .get(`${ApiEndpoints.MEMBERS}/refresh_all`)\n .then((data) => data)\n .catch((error) => error)\n }\n\n updateAccount = async (account: Account) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.ACCOUNTS}/${account.guid}`, account)\n .then((data) => data.account)\n .catch((error) => error)\n }\n}\n","import { makeAutoObservable } from 'mobx'\nimport { Account, Member } from '../../common'\n\nexport class UiStore {\n isLoading = false\n\n selectedAccount: Account = {} as Account\n selectedMember: Member = {} as Member\n\n constructor() {\n makeAutoObservable(this)\n }\n\n setIsLoading = (isLoading: boolean) => (this.isLoading = isLoading)\n\n setSelectedAccount = (account: Account) => (this.selectedAccount = account)\n setSelectedMember = (member: Member) => (this.selectedMember = member)\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\n\nimport {\n AccountType,\n ErrorStatuses,\n MfaStatuses,\n ConnectionStatus,\n ProcessingStatuses,\n} from '../../common'\n\nimport type { Account, GlobalStore, Institution, Member } from '../../common'\n\nimport { AccountApi } from '../api/AccountApi'\nimport { UiStore } from './UiStore'\n\nexport class AccountStore {\n api: AccountApi = new AccountApi('/', '')\n\n globalStore: GlobalStore\n\n accounts: Account[] = []\n institutions: Institution[] = []\n members: Member[] = []\n uiStore: UiStore\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.uiStore = new UiStore()\n makeAutoObservable(this)\n }\n\n initialize = async (endpoint: string, token: string) => {\n this.api = new AccountApi(endpoint, token)\n\n await Promise.all([this.loadAccounts(), this.loadInstitutions()])\n }\n\n get cashAccounts(): Account[] {\n return this.accounts.filter(\n (account: Account) =>\n account.account_type === AccountType.CASH ||\n account.account_type === AccountType.CHECKING ||\n account.account_type === AccountType.PREPAID ||\n account.account_type === AccountType.SAVINGS ||\n account.account_type === AccountType.CHECKING_LINE_OF_CREDIT,\n )\n }\n\n get debtAccounts(): Account[] {\n return this.accounts.filter(\n (account: Account) =>\n account.account_type === AccountType.CREDIT_CARD ||\n account.account_type === AccountType.LOAN ||\n account.account_type === AccountType.MORTGAGE ||\n account.account_type === AccountType.LINE_OF_CREDIT ||\n account.account_type === AccountType.CHECKING_LINE_OF_CREDIT,\n )\n }\n\n get cashBalance(): number {\n return this.cashAccounts.reduce((total, account) => total + (account?.balance || 0), 0)\n }\n\n addAccount = async (account: Account) => {\n try {\n const newAccount = await this.api.createAccount(account)\n\n runInAction(() => {\n this.accounts = [...this.accounts, newAccount]\n })\n } catch (error) {\n console.error(`Error occurred while adding an account: ${error}`)\n }\n }\n\n augmentAccounts = (accounts: Account[] = this.accounts) => {\n const augmentedAccounts: Account[] = []\n\n accounts.forEach((account: Account) => {\n const memberLocation = this.members.findIndex(\n (member: Member) => member.guid === account.member_guid,\n )\n if (memberLocation > -1) {\n let connectionStatus = ConnectionStatus.Connected\n const member = this.members[memberLocation]\n if (ErrorStatuses.includes(member.connection_status)) {\n connectionStatus = ConnectionStatus.Error\n } else if (ProcessingStatuses.includes(member.connection_status)) {\n connectionStatus = ConnectionStatus.Processing\n } else if (MfaStatuses.includes(member.connection_status)) {\n connectionStatus = ConnectionStatus.RequiresMfa\n }\n\n augmentedAccounts.push({\n ...account,\n memberName: member.name,\n connectionStatus,\n })\n\n this.members[memberLocation].connectionStatus = connectionStatus\n }\n })\n\n return augmentedAccounts\n }\n\n loadAccounts = async () => {\n await this.loadMembers()\n\n try {\n const accounts = await this.api.getAccounts()\n\n runInAction(() => {\n this.accounts = this.sortAccounts(this.augmentAccounts(accounts))\n })\n } catch (error) {\n console.error(`Error occurred while loading accounts: ${error}`)\n }\n }\n\n loadInstitutions = async () => {\n try {\n const institutions = await this.api.getInstitutions()\n\n runInAction(() => {\n this.institutions = institutions\n })\n } catch (error) {\n console.error(`Error occurred while loading institutions: ${error}`)\n }\n }\n\n loadMembers = async () => {\n try {\n const members = await this.api.getMembers()\n\n runInAction(() => {\n this.members = members\n })\n } catch (error) {\n console.error(`Error occurred while loading members: ${error}`)\n }\n }\n\n mergeAccounts = async (accountGuids: string[]) => {\n try {\n const response = await this.api.mergeAccounts(accountGuids)\n // the response from the api is a funky database key here, so this is essentially just getting the first item in the returned object\n // to prevent making multiple api calls here\n const mergedAccount = response[Object.keys(response)[0]]\n\n runInAction(() => {\n const account2Index = this.accounts.findIndex((account) => account.guid === accountGuids[1])\n this.accounts.splice(account2Index, 1)\n\n const account1Index = this.accounts.findIndex((account) => account.guid === accountGuids[0])\n this.accounts.splice(account1Index, 1, mergedAccount)\n })\n } catch (error) {\n console.error(`Error occurred while merging accounts: ${error}`)\n }\n }\n\n sortAccounts = (accounts: Account[] = this.accounts) => {\n return accounts.sort((a: Account, b: Account) => {\n // orders by account type descending (Checking -> Savings -> Credit card)\n if (a.account_type > b.account_type) return 1\n if (a.account_type < b.account_type) return -1\n // orders by name (Emergency Savings -> Health Savings -> Rainy Day Savings)\n if ((a.name || '') > (b.name || '')) return 1\n if ((a.name || '') < (b.name || '')) return -1\n return 0\n })\n }\n\n refreshAccounts = async () => {\n this.uiStore.setIsLoading(true)\n await Promise.all([this.loadAccounts(), this.loadInstitutions()])\n this.uiStore.setIsLoading(false)\n }\n\n refreshMembers = async () => {\n try {\n await this.api.refreshAllMembers()\n await this.loadMembers()\n } catch (error) {\n console.error(`Error occurredwhile refreshing members: ${error}`)\n }\n }\n\n removeAccount = async (accountGuid: string) => {\n try {\n await this.api.deleteAccount(accountGuid)\n\n runInAction(() => {\n const deletedIndex = this.accounts.findIndex((account) => account.guid === accountGuid)\n this.accounts.splice(deletedIndex, 1)\n })\n } catch (error) {\n console.error(`Error occurred while removing an account: ${error}`)\n }\n }\n\n updateAccount = async (account: Account) => {\n try {\n const updatedAccount = await this.api.updateAccount(account)\n\n runInAction(() => {\n const updatedAccountIndex = this.accounts.findIndex(\n (account) => account.guid === updatedAccount.guid,\n )\n\n this.accounts.splice(updatedAccountIndex, 1, updatedAccount)\n this.augmentAccounts(this.accounts)\n })\n } catch (error) {\n console.error(`Error occurred while updating account: ${error}`)\n }\n }\n}\n","import * as d3 from 'd3'\n\nimport type { Simulation } from 'd3'\n\nimport { type BubbleData } from '../components/BubbleChart'\nimport { DetailedBudget } from '../../common'\n\n// D3 SVG Types\nexport type SimulationType = Simulation<BubbleData, undefined>\n\nconst PROGRESS_INDICATOR_SIZE = 5\nconst MAX_BUBBLE_RADIUS = 100\nconst MIN_BUBBLE_RADIUS = 25\n\n/**\n * Enables dragging of bubbles\n * @param simulation D3 Simulation\n */\nexport const drag = (simulation: SimulationType) => {\n const dragStarted = (event: any) => {\n if (!event.active) simulation.alphaTarget(0.3).restart()\n event.subject.fx = event.subject.x\n event.subject.fy = event.subject.y\n }\n\n const dragged = (event: any) => {\n event.subject.fx = event.x\n event.subject.fy = event.y\n }\n\n const dragEnded = (event: any) => {\n if (!event.active) simulation.alphaTarget(0)\n event.subject.fx = null\n event.subject.fy = null\n }\n return d3.drag().on('start', dragStarted).on('drag', dragged).on('end', dragEnded)\n}\n\n/**\n * Provide d values for the arc between the start and end radius based on time\n * @param bubble Bubble data\n */\nexport const arcTween = (bubble: BubbleData) => {\n // Percentage of the budget\n let p = bubble.transaction_total / bubble.amount\n if (p < 0) p = 0\n else if (p > 1) p = 1\n\n // End angle for the progress status\n const angle = p * 2 * Math.PI\n // Interpolate values between 0 and the end angle\n const interpolate = d3.interpolate(0, angle)\n // Progress arc starting at 0\n const arc = d3\n .arc<BubbleData>()\n .cornerRadius(5)\n .innerRadius(bubble.radius - PROGRESS_INDICATOR_SIZE * 2)\n .outerRadius(bubble.radius - PROGRESS_INDICATOR_SIZE)\n .startAngle(0)\n .endAngle(0)\n\n return (t: number) => {\n // assign end angle to interpolated value for t\n arc.endAngle(interpolate(t))\n // call arc and return intermediate `d` value\n return arc(bubble) || ''\n }\n}\n\n/**\n * Enable drag\n * @param simulation D3 Simulation\n */\nexport const enableDrag = (simulation: SimulationType) => {\n d3.selectAll('.bubble').call(drag(simulation) as any)\n}\n\n/**\n * Update location after a resize\n * @param simulation D3 Simulation\n * @param height New height\n * @param width New width\n */\nexport const resize = (simulation: SimulationType, height: number, width: number) => {\n simulation\n .alpha(1)\n .restart()\n .force(\n 'x',\n d3\n .forceX()\n .x(width / 2)\n .strength(0.01),\n )\n .force(\n 'y',\n d3\n .forceY()\n .y(height / 2)\n .strength(0.01),\n )\n}\n\nexport const getScale = (min: number, max: number) =>\n d3.scaleLinear().domain([min, max]).range([MIN_BUBBLE_RADIUS, MAX_BUBBLE_RADIUS])\n\n/**\n * Simulates the chart\n * @param budgets Budget data\n */\nexport const simulate = (budgets: DetailedBudget[]) => {\n const maxValue = budgets.reduce((acc, budget) => {\n const max = Math.max(budget.transaction_total, budget.amount)\n return max > acc ? max : acc\n }, 0)\n\n const minValue = budgets.reduce((acc, budget) => {\n const max = Math.max(budget.transaction_total, budget.amount)\n return max < acc ? max : acc\n }, maxValue)\n\n const scale = getScale(minValue, maxValue)\n\n const bubbles = budgets.map((budget) => {\n const radius = scale(Math.max(budget.transaction_total, budget.amount)) || 25\n\n return {\n ...budget,\n radius,\n } as BubbleData\n })\n\n return d3\n .forceSimulation<BubbleData>(bubbles)\n .velocityDecay(0.05)\n .force('collide', d3.forceCollide<BubbleData>((d) => d.radius + 2).strength(0.5))\n .on('tick', () => {\n d3.selectAll('.bubble')\n .data(bubbles)\n .attr('transform', (d: BubbleData) => `translate(${d.x},${d.y})`)\n })\n}\n","import React from 'react'\nimport * as d3 from 'd3'\n\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { arcTween } from '../../utils/BubblesSVG'\n\nimport type { BubbleData } from '../BubbleChart'\n\nconst PROGRESS_INDICATOR_SIZE = 5\nconst PROGRESS_DURATION = 2000\n\ninterface MercuryProps {\n bubble: BubbleData\n}\n\nexport function Mercury({ bubble }: MercuryProps) {\n const theme = useTheme()\n const {\n guid,\n budgetColors: { mercury },\n radius,\n } = bubble\n\n const bubbleId = `mercury-${guid}`\n\n React.useEffect(() => {\n // Remove previous status arc\n d3.select(`.${bubbleId}`).selectAll('.status').remove()\n\n // Append updated status arc\n d3.select(`.${bubbleId}`)\n .append('path')\n .transition()\n .duration(PROGRESS_DURATION)\n .delay(0)\n .attr('class', 'status')\n .attr('style', `fill: ${mercury}; fill-opacity: 1;`)\n .attrTween('d', () => arcTween(bubble))\n }, [bubble])\n\n const trackArc = d3\n .arc<number>()\n .innerRadius((radius: number) => radius - 2 * PROGRESS_INDICATOR_SIZE)\n .outerRadius((radius: number) => radius - PROGRESS_INDICATOR_SIZE)\n .startAngle(0)\n .endAngle(2 * Math.PI)\n\n return (\n <g className={bubbleId}>\n <path\n d={trackArc(radius) || ''}\n style={{ fill: theme.palette.common.white, fillOpacity: 0.35 }}\n />\n </g>\n )\n}\n","import React from 'react'\nimport * as d3 from 'd3'\n\nimport Tooltip from '@mui/material/Tooltip'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport { Mercury } from './Mercury'\n\nimport type { DetailedBudget } from '../../../common'\nimport type { BubbleData } from '../BubbleChart'\n\nconst LARGE_THRESHOLD = 75\nconst MEDIUM_THRESHOLD = 50\n\ninterface BubbleProps {\n bubble: BubbleData\n isDraggable: boolean\n onClick?: (budget: DetailedBudget) => void\n}\n\nexport function Bubble({ bubble, isDraggable, onClick = () => {} }: BubbleProps) {\n const [showTooltip, setShowTooltip] = React.useState(false)\n\n React.useEffect(() => {\n document.fonts.ready.then(() => {\n // Due to icon font location on Safari, we have determine x after the icon font has loaded\n const iconText = d3.select(`.icon-${icon}`) as d3.Selection<\n SVGTextElement,\n BubbleData,\n HTMLElement,\n any\n >\n const textLength = iconText.node()?.getComputedTextLength()\n iconText.attr('x', () => {\n if (radius < LARGE_THRESHOLD) {\n return textLength ? textLength / 2 - 12 : 12\n }\n return textLength ? textLength / 2 - 16 : 16\n })\n })\n }, [])\n\n if (!bubble) return undefined\n\n const {\n budgetColors: { background, text: textColor },\n category: { icon, name },\n guid,\n description,\n radius,\n x,\n y,\n } = bubble\n\n let iconY = 13\n if (radius > 75) iconY = -20\n else if (radius > 50) iconY = -6\n\n const tooltipText = `${bubble.category.name}: ${description}`\n const tooltipPopperSlot = {\n modifiers: [\n {\n name: 'offset',\n options: { offset: [0, 15] },\n },\n ],\n }\n\n return (\n <g\n className=\"bubble\"\n id={`bubble-${guid}`}\n key={guid}\n onClick={() => onClick(bubble)}\n onMouseEnter={() => setShowTooltip(true)}\n onMouseLeave={() => setShowTooltip(false)}\n style={{ cursor: isDraggable ? 'pointer' : 'default' }}\n textAnchor=\"middle\"\n x={x}\n y={y}\n >\n <Tooltip\n followCursor={true}\n open={showTooltip}\n slotProps={{ popper: tooltipPopperSlot }}\n title={tooltipText}\n >\n <circle fill={background} id={`circle-${guid}`} r={radius} />\n </Tooltip>\n\n <Icon\n className={`icon-${icon}`}\n component=\"text\"\n name={icon}\n size={radius <= LARGE_THRESHOLD ? 24 : 32}\n sx={{\n fill: textColor,\n }}\n /* @ts-expect-error Property doesn't exist on type */\n y={iconY}\n />\n\n {radius > LARGE_THRESHOLD && (\n <Text\n bold={true}\n component=\"text\"\n id={`budget-category-${guid}`}\n sx={{ fill: textColor }}\n variant=\"Small\"\n /* @ts-expect-error Property doesn't exist on type */\n y={4}\n >\n {name}\n </Text>\n )}\n\n {radius > MEDIUM_THRESHOLD && (\n <Text\n bold={true}\n component=\"text\"\n id={`budget-description-${guid}-1`}\n sx={{ fill: textColor }}\n variant=\"Body\"\n /* @ts-expect-error Property doesn't exist on type */\n y={radius <= LARGE_THRESHOLD ? 12 : 24}\n >\n {radius <= LARGE_THRESHOLD ? description.split(' ')[0] : description}\n </Text>\n )}\n\n {radius <= LARGE_THRESHOLD && radius > MEDIUM_THRESHOLD && (\n <Text\n component=\"text\"\n id={`budget-description-${guid}-2`}\n sx={{ fill: textColor }}\n variant=\"XSmall\"\n /* @ts-expect-error Property doesn't exist on type */\n y={28}\n >\n {description.split(' ')[1]}\n </Text>\n )}\n\n <Mercury bubble={bubble} />\n </g>\n )\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { SimulationNodeDatum } from 'd3-force'\n\nimport { DetailedBudget, useBudgetsStore } from '../../common'\n\nimport { enableDrag, resize, simulate, SimulationType } from '../utils/BubblesSVG'\nimport { Bubble } from './bubblechart/Bubble'\n\nexport interface BubbleData extends DetailedBudget, SimulationNodeDatum {\n radius: number\n}\n\ninterface BubbleChartProps {\n height: number\n width: number\n isDraggable?: boolean\n onClick?: (budget: DetailedBudget) => void\n}\n\nlet simulation: SimulationType\n\nconst BubbleChart: React.FC<BubbleChartProps> = ({\n height,\n width,\n isDraggable = false,\n onClick = () => {},\n}) => {\n const { detailedBudgets: budgets } = useBudgetsStore()\n\n simulation = React.useMemo(() => simulate(budgets), [budgets])\n\n React.useEffect(() => {\n resize(simulation, height, width)\n\n if (isDraggable) {\n enableDrag(simulation)\n }\n }, [simulation, height, width])\n\n return (\n <svg height={height} style={{ overflow: 'visible' }} width={Math.abs(width)}>\n {simulation.nodes().map((bubble) => (\n <Bubble bubble={bubble} isDraggable={isDraggable} key={bubble.guid} onClick={onClick} />\n ))}\n </svg>\n )\n}\n\nexport default observer(BubbleChart)\n","import Stack from '@mui/material/Stack'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport { useGlobalCopyStore } from '../../common'\n\nconst ZeroState = () => {\n const { budgets: budgetsCopy } = useGlobalCopyStore()\n\n return (\n <Stack alignItems=\"center\" gap={12} sx={{ mx: 24, textAlign: 'center' }}>\n <Icon name=\"bubble_chart\" size={48} />\n <Text bold={true} variant=\"Paragraph\">\n {budgetsCopy.zero_state_title}\n </Text>\n <Text sx={{ whiteSpace: 'wrap' }} variant=\"Paragraph\">\n {budgetsCopy.zero_state_description}\n </Text>\n </Stack>\n )\n}\n\nexport default ZeroState\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\n\nimport {\n type DetailedBudget,\n ANALYTICS_EVENTS,\n useBudgetsStore,\n useEvent,\n useGlobalUiStore,\n useWidgetContainerProvider,\n useCategoryStore,\n Loader,\n useScreenSize,\n} from '../../common'\n\nimport BubbleChart from './BubbleChart'\nimport ZeroState from './ZeroState'\n\ninterface BubbleBudgetsProps {\n height: number\n isDraggable?: boolean\n shouldShowZeroState: boolean\n unavailableWidth?: number\n}\n\nexport const BubbleBudgets: React.FC<BubbleBudgetsProps> = observer(\n ({ height, isDraggable = false, shouldShowZeroState, unavailableWidth = 24 }) => {\n const { onEvent } = useEvent()\n const { setSelectedBudget } = useBudgetsStore()\n const { isLoadingCategoryTotals } = useCategoryStore()\n const { isInitialized } = useGlobalUiStore()\n const { availableWidth } = useWidgetContainerProvider()\n const { isMobile } = useScreenSize()\n\n const width = React.useMemo(() => {\n return availableWidth - unavailableWidth\n }, [availableWidth])\n\n const handleBubbleClick = (budget: DetailedBudget) => {\n setSelectedBudget(budget)\n onEvent(ANALYTICS_EVENTS.BUDGETS_CLICK_BUDGET_CATEGORY, {\n budget_category: budget.category.name,\n click_type: 'bubble',\n })\n }\n\n if (isLoadingCategoryTotals) {\n return (\n <Stack alignItems=\"center\" height={height} justifyContent=\"center\" width={Math.abs(width)}>\n <Loader />\n </Stack>\n )\n }\n\n return (\n <Box ml={shouldShowZeroState || isMobile ? 0 : 24}>\n {shouldShowZeroState || !isInitialized ? (\n <ZeroState />\n ) : (\n <BubbleChart\n height={height}\n isDraggable={isDraggable}\n onClick={handleBubbleClick}\n width={width}\n />\n )}\n </Box>\n )\n },\n)\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 useTheme from '@mui/material/styles/useTheme'\n\nimport { Text } from '@kyper/mui'\n\nimport {\n MiniWidgetContainer,\n MiniWidgetProps,\n formatCurrency,\n useBudgetsStore,\n useGlobalCopyStore,\n} from '../common'\n\nimport { useGetBudgetDifference } from './utils/BudgetUtil'\nimport { BubbleBudgets } from './components/BubbleBudgets'\n\nconst BubbleBudgetsMiniWidget = (props: MiniWidgetProps) => {\n const theme = useTheme()\n\n const { budgets, loadBudgets, setTheme } = useBudgetsStore()\n const { budgets: budgetsCopy } = useGlobalCopyStore()\n const difference = useGetBudgetDifference()\n const shouldShowZeroState = budgets.length === 0\n\n React.useEffect(() => {\n setTheme(theme)\n loadBudgets().finally()\n }, [])\n\n return (\n <MiniWidgetContainer\n primaryCtaLabel={shouldShowZeroState ? budgetsCopy.get_started_cta : budgetsCopy.details_cta}\n title={budgetsCopy.budgets_title}\n {...props}\n >\n <Stack height={450} mt={32}>\n <BubbleBudgets height={370} shouldShowZeroState={shouldShowZeroState} />\n {!shouldShowZeroState && (\n <Box ml={16}>\n <Text bold={true} color={difference < 0 ? 'error.main' : 'success.main'}>\n {formatCurrency(Math.abs(difference), '0,0')}\n </Text>\n <Text>\n {difference < 0 ? budgetsCopy.overspent_in_budgets : budgetsCopy.left_in_budgets}\n </Text>\n </Box>\n )}\n </Stack>\n </MiniWidgetContainer>\n )\n}\n\nexport default observer(BubbleBudgetsMiniWidget)\n","import React from 'react'\n\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { CategoryIcon, Text } from '@kyper/mui'\n\nimport { type DetailedBudget, formatCurrency, SingleSegmentDonut } from '../../../common'\n\ninterface BudgetRowProps {\n budget: DetailedBudget\n onClick?: (budget: DetailedBudget) => void\n}\n\nexport const BudgetRow: React.FC<BudgetRowProps> = ({ budget, onClick }) => {\n const {\n amount,\n budgetColors: { background, description: descriptionColor },\n category_guid,\n description,\n percentage,\n subBudgets,\n transaction_total,\n } = budget\n\n return (\n <ListItem>\n <ListItemButton onClick={() => onClick?.(budget)}>\n <ListItemAvatar sx={{ mb: -8, mr: 16 }}>\n <SingleSegmentDonut color={background} percent={percentage} size={40}>\n <CategoryIcon categoryGuid={category_guid} variant=\"basic\" />\n </SingleSegmentDonut>\n </ListItemAvatar>\n <ListItemText\n primary={\n <Stack component=\"span\" direction=\"row\" justifyContent=\"space-between\">\n <Text bold={true} variant=\"Body\">\n {budget.category.name}\n </Text>\n <Text fontWeight={400} variant=\"Body\">\n {`\n ${formatCurrency(transaction_total, '0,0')} / \n ${formatCurrency(amount, '0,0')}\n `}\n </Text>\n </Stack>\n }\n secondary={\n <Stack component=\"span\" direction=\"row\" justifyContent=\"space-between\">\n <Text variant=\"XSmall\">{`${subBudgets.length} Sub-budgets`}</Text>\n <Text bold={percentage > 100} color={descriptionColor} variant=\"XSmall\">\n {description}\n </Text>\n </Stack>\n }\n />\n </ListItemButton>\n </ListItem>\n )\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Card from '@mui/material/Card'\nimport CardContent from '@mui/material/CardContent'\nimport CardHeader from '@mui/material/CardHeader'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\n\nimport { H3 } from '@kyper/mui'\n\nimport {\n type DetailedBudget,\n ANALYTICS_EVENTS,\n useBudgetsStore,\n useEvent,\n useGlobalCopyStore,\n} from '../../common'\n\nimport { BudgetRow } from './budgetlist/BudgetRow'\n\nexport const BudgetList = observer(() => {\n const { onEvent } = useEvent()\n const { budgets: copy } = useGlobalCopyStore()\n const { detailedBudgets: budgets, setSelectedBudget } = useBudgetsStore()\n\n const handleBudgetClick = (budget: DetailedBudget) => {\n setSelectedBudget(budget)\n onEvent(ANALYTICS_EVENTS.BUDGETS_CLICK_BUDGET_CATEGORY, {\n budget_category: budget.category.name,\n click_type: 'list',\n })\n }\n\n return (\n <Card elevation={2} sx={{ borderRadius: 2 }}>\n <CardHeader sx={{ pb: 8, pl: 24 }} title={<H3>{copy.budget_categories_title}</H3>} />\n <CardContent sx={{ p: 0, ':last-child': { p: 0 } }}>\n <List>\n {budgets.map((budget) => (\n <React.Fragment key={budget.guid}>\n <BudgetRow budget={budget} onClick={handleBudgetClick} />\n <Divider />\n </React.Fragment>\n ))}\n </List>\n </CardContent>\n </Card>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { subDays } from 'date-fns/subDays'\n\nimport Card from '@mui/material/Card'\nimport CardContent from '@mui/material/CardContent'\nimport CardHeader from '@mui/material/CardHeader'\nimport IconButton from '@mui/material/IconButton'\nimport Stack from '@mui/material/Stack'\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { H3, Icon, Text } from '@kyper/mui'\n\nimport {\n type StatusBarData,\n ANALYTICS_EVENTS,\n buildDynamicCopy,\n Drawer,\n formatCurrency,\n StatusBar,\n useBudgetsStore,\n useCategoryStore,\n useGlobalCopyStore,\n useRecurringActivityStore,\n useTransactionStore,\n useAccountStore,\n useEvent,\n} from '../../common'\n\nimport { ManageIncome } from '../../recurringactivity'\n\nexport const Overview = observer(() => {\n const theme = useTheme()\n\n const { onEvent } = useEvent()\n const { accounts } = useAccountStore()\n const { budgets: copy, common: commonCopy, recurring: recurringCopy } = useGlobalCopyStore()\n const { incomeCategories, spendCategories } = useCategoryStore()\n const { detailedBudgets: budgets, totalBudgeted } = useBudgetsStore()\n const { projectedIncome } = useRecurringActivityStore()\n const { setFilter } = useTransactionStore()\n\n const [isIncomeOpen, setIsIncomeOpen] = React.useState(false)\n\n const [spentTotal, spendingStatus] = React.useMemo(() => {\n const spentTotal = spendCategories.reduce((total, current) => total + current.totalAmount, 0)\n let spendingPercentage = spentTotal / totalBudgeted\n if (spendingPercentage > 1) spendingPercentage = 1\n let color = theme.palette.success.main\n if (spendingPercentage > 0.8 && spendingPercentage < 1) {\n color = theme.palette.warning.main\n } else if (spendingPercentage >= 1) {\n color = theme.palette.error.main\n }\n\n const spendingStatus = [\n {\n color,\n percentage: `${spendingPercentage}`,\n },\n ] as StatusBarData[]\n return [spentTotal, spendingStatus]\n }, [budgets, spendCategories])\n\n const [incomePaid, incomeStatus] = React.useMemo(() => {\n const incomePaid = Math.abs(\n incomeCategories.reduce((total, current) => total + current.totalAmount, 0),\n )\n let incomePercentage = incomePaid / projectedIncome\n if (incomePercentage > 1) incomePercentage = 1\n\n const incomeStatus = [\n {\n color: theme.palette.secondary.main,\n percentage: `${incomePercentage}`,\n },\n ]\n return [incomePaid, incomeStatus]\n }, [incomeCategories, projectedIncome])\n\n const handleOpenIncome = () => {\n setFilter({\n accounts: accounts.map((account) => account.guid),\n dateRange: {\n start: subDays(new Date(), 90),\n end: new Date(),\n },\n })\n setIsIncomeOpen(true)\n onEvent(ANALYTICS_EVENTS.BUDGETS_CLICK_EDIT_INCOME)\n }\n\n return (\n <Card elevation={2} sx={{ overflow: 'visible', borderRadius: 2 }}>\n <CardHeader sx={{ pb: 8, pl: 24 }} title={<H3>{copy.overview_title}</H3>} />\n <CardContent sx={{ pt: 12, px: 24 }}>\n <Stack gap={24}>\n <Stack gap={8}>\n <Text bold={true} sx={{ mb: 8 }} variant=\"Body\">\n {copy.spending_title}\n </Text>\n <StatusBar data={spendingStatus} height={16} />\n <Text variant=\"Small\">\n {\n buildDynamicCopy(\n copy.spending_description,\n formatCurrency(spentTotal, '0,0'),\n formatCurrency(totalBudgeted, '0,0'),\n ) as string\n }\n </Text>\n </Stack>\n\n <Stack gap={8}>\n <Stack alignItems=\"center\" direction=\"row\" gap={4} mb={-4}>\n <Text bold={true} variant=\"Body\">\n {copy.income_title}\n </Text>\n <IconButton\n aria-label={recurringCopy.manage_income}\n onClick={handleOpenIncome}\n sx={{ p: 0 }}\n >\n <Icon name=\"edit\" />\n </IconButton>\n </Stack>\n <StatusBar data={incomeStatus} height={16} />\n <Text variant=\"Small\">\n {\n buildDynamicCopy(\n copy.income_description,\n formatCurrency(incomePaid, '0,0'),\n formatCurrency(projectedIncome, '0,0'),\n ) as string\n }\n </Text>\n </Stack>\n </Stack>\n </CardContent>\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isIncomeOpen}\n onClose={() => setIsIncomeOpen(false)}\n title={recurringCopy.manage_income}\n >\n <Stack gap={4}>\n <Text bold={true} sx={{ mt: 12, mx: 24 }} variant=\"Small\">\n {copy.income_title}\n </Text>\n <ManageIncome />\n </Stack>\n </Drawer>\n </Card>\n )\n})\n","import { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@kyper/mui'\n\nimport {\n formatCurrency,\n useBudgetsStore,\n useGlobalCopyStore,\n useRecurringActivityStore,\n} from '../../../common'\n\nexport const Header = observer(() => {\n const { budgets: copy } = useGlobalCopyStore()\n const { totalBudgeted } = useBudgetsStore()\n const { projectedIncome } = useRecurringActivityStore()\n\n const remaining = projectedIncome - totalBudgeted\n\n return (\n <Stack direction=\"row\" justifyContent=\"center\" my={16} spacing={20}>\n <Stack alignItems=\"center\">\n <Text bold={true} variant=\"Body\">\n {formatCurrency(projectedIncome, '0,0')}\n </Text>\n <Text color=\"secondary\" variant=\"Small\">\n {copy.projected_income}\n </Text>\n </Stack>\n\n <Text bold={true} justifyContent=\"center\" variant=\"Body\">\n {'-'}\n </Text>\n\n <Stack alignItems=\"center\">\n <Text bold={true} variant=\"Body\">\n {formatCurrency(totalBudgeted, '0,0')}\n </Text>\n <Text color=\"secondary\" variant=\"Small\">\n {copy.budgeted}\n </Text>\n </Stack>\n\n <Text bold={true} justifyContent=\"center\" variant=\"Body\">\n {'='}\n </Text>\n\n <Stack alignItems=\"center\">\n <Text bold={true} variant=\"Body\">\n {formatCurrency(remaining, '0,0')}\n </Text>\n <Text color=\"secondary\" variant=\"Small\">\n {copy.remaining}\n </Text>\n </Stack>\n </Stack>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { CategoryIcon } from '@kyper/mui'\n\nimport {\n type DetailedCategory,\n buildDynamicCopy,\n formatCurrency,\n useBudgetsStore,\n useGlobalCopyStore,\n} from '../../../common'\n\ninterface RecalculateBudgetRowProps {\n category: DetailedCategory\n}\n\nexport const RecalculateBudgetRow: React.FC<RecalculateBudgetRowProps> = observer(\n ({ category }) => {\n const { budgets: copy } = useGlobalCopyStore()\n const { budgets } = useBudgetsStore()\n\n const secondaryText = React.useMemo(() => {\n const budget = budgets.find((b) => b.category_guid === category.guid)\n const part1 = formatCurrency(category.totalAverageAmount, '0,0')\n const part2 = budget\n ? buildDynamicCopy(copy.recalculate_previous_budget, formatCurrency(budget.amount, '0,0'))\n : copy.recalculate_new_budget\n\n return `${part1} - ${part2}`\n }, [copy, budgets])\n\n return (\n <React.Fragment key={category.guid}>\n <ListItem>\n <ListItemButton>\n <ListItemAvatar>\n <CategoryIcon categoryGuid={category.guid} variant=\"filled\" />\n </ListItemAvatar>\n <ListItemText primary={category.name} secondary={secondaryText} />\n </ListItemButton>\n </ListItem>\n <Divider />\n </React.Fragment>\n )\n },\n)\n","import React from 'react'\n\nimport Button from '@mui/material/Button'\nimport List from '@mui/material/List'\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@kyper/mui'\n\nimport { Drawer, useBudgetsStore, useCategoryStore, useGlobalCopyStore } from '../../../common'\n\nimport { RecalculateBudgetRow } from './RecalculateBudgetRow'\n\ninterface RecalculateBudgetsProps {\n onRecalculateBudgets?: () => void\n}\n\nexport const RecalculateBudgets = ({ onRecalculateBudgets }: RecalculateBudgetsProps) => {\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const { spendCategories } = useCategoryStore()\n const { recalculateBudgets, setAlert } = useBudgetsStore()\n\n const [isOpen, setIsOpen] = React.useState(false)\n\n const newBudgetCategories = spendCategories.filter((category) => category.totalAverageAmount > 0)\n\n const handlePrimaryClick = async () => {\n await recalculateBudgets(newBudgetCategories)\n\n setIsOpen(false)\n setAlert(copy.alert_recalculated_budgets)\n onRecalculateBudgets?.()\n }\n\n return (\n <React.Fragment>\n <Button onClick={() => setIsOpen(true)} sx={{ mt: 24, mx: 24 }} variant=\"text\">\n {copy.recalculate_button}\n </Button>\n\n <Text sx={{ mx: 24, my: 16, textAlign: 'center', whiteSpace: 'wrap' }} variant=\"Paragraph\">\n {copy.recalculate_help}\n </Text>\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n onPrimaryAction={handlePrimaryClick}\n title={copy.recalculate_title}\n >\n <Stack>\n <Stack mx={24} my={16}>\n <Text bold={true} variant=\"Body\">\n {copy.recalculate_description_top}\n </Text>\n <Text variant=\"ParagraphSmall\">{copy.recalculate_description_bottom}</Text>\n </Stack>\n <Box bgcolor=\"background.paper\">\n <List>\n {newBudgetCategories.map((category) => (\n <RecalculateBudgetRow category={category} key={category.guid} />\n ))}\n </List>\n </Box>\n </Stack>\n </Drawer>\n </React.Fragment>\n )\n}\n","import React from 'react'\n\nimport Stack from '@mui/material/Stack'\nimport { Text } from '@kyper/mui'\nimport {\n buildDynamicCopy,\n CurrencyInput,\n formatCurrency,\n useBudgetsStore,\n useGlobalCopyStore,\n useRecurringActivityStore,\n} from '../../../common'\n\ninterface BudgetAmountProps {\n amount: string\n categoryName: string\n onAmountChanged: (amount: string) => void\n}\n\nexport const BudgetAmount: React.FC<BudgetAmountProps> = ({\n amount,\n categoryName,\n onAmountChanged,\n}) => {\n const { budgets: copy } = useGlobalCopyStore()\n const { totalBudgeted } = useBudgetsStore()\n const { projectedIncome } = useRecurringActivityStore()\n\n const unbudgetedIncome = projectedIncome - totalBudgeted\n\n return (\n <Stack gap={16}>\n <Stack>\n <Text>\n {\n buildDynamicCopy(\n copy.add_description_top,\n formatCurrency(unbudgetedIncome, '0,0'),\n ) as string\n }\n </Text>\n <Text>{buildDynamicCopy(copy.add_description_bottom, categoryName) as string}</Text>\n </Stack>\n <CurrencyInput\n amount={amount}\n autoFocus={true}\n label={copy.add_label}\n minAmount={0}\n setAmount={onAmountChanged}\n sx={{ '.MuiTypography-Body': { p: 0 } }}\n />\n </Stack>\n )\n}\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction'\nimport ListItemText from '@mui/material/ListItemText'\n\nimport { CategoryIcon, Icon } from '@kyper/mui'\n\nimport { type DetailedCategory, Dialog, formatCurrency, useGlobalCopyStore } from '../../../common'\n\nimport { BudgetAmount } from '../shared/BudgetAmount'\n\ninterface UnbudgetedRowProps {\n category: DetailedCategory\n onAddBudget: (category: DetailedCategory, amount: number) => void\n}\n\nexport const UnbudgetedRow: React.FC<UnbudgetedRowProps> = observer(({ category, onAddBudget }) => {\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n\n const [isAddBudgetOpen, setIsAddBudgetOpen] = React.useState(false)\n const [amount, setAmount] = React.useState(\n `${category.totalAmount === 0 ? '' : category.totalAmount}`,\n )\n\n return (\n <React.Fragment>\n <ListItem key={category.guid}>\n <ListItemButton onClick={() => setIsAddBudgetOpen(true)}>\n <ListItemAvatar>\n <CategoryIcon categoryGuid={category.guid} />\n </ListItemAvatar>\n <ListItemText\n primary={category.name}\n secondary={formatCurrency(category.totalAmount, '0,0')}\n />\n <ListItemSecondaryAction>\n <Icon name=\"add\" size={20} />\n </ListItemSecondaryAction>\n </ListItemButton>\n </ListItem>\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.add_title }}\n disablePrimaryButton={Number(amount) <= 0}\n isOpen={isAddBudgetOpen}\n onClose={() => setIsAddBudgetOpen(false)}\n onPrimaryAction={() => onAddBudget(category, Number(amount))}\n primaryText={copy.add_save_button}\n >\n <BudgetAmount amount={amount} categoryName={category.name} onAmountChanged={setAmount} />\n </Dialog>\n </React.Fragment>\n )\n})\n","import { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport List from '@mui/material/List'\nimport Stack from '@mui/material/Stack'\n\nimport {\n buildDynamicCopy,\n type DetailedCategory,\n useBudgetsStore,\n useGlobalCopyStore,\n} from '../../common'\n\nimport { Header } from './addbudget/Header'\nimport { RecalculateBudgets } from './addbudget/RecalculateBudgets'\nimport { UnbudgetedRow } from './addbudget/UnbudgetedRow'\n\ninterface AddBudgetsProps {\n onRecalculateBudgets?: () => void\n}\n\nexport const AddBudgets = observer(({ onRecalculateBudgets }: AddBudgetsProps) => {\n const { budgets: copy } = useGlobalCopyStore()\n const { addBudget, setAlert, unbudgetedCategories } = useBudgetsStore()\n\n const handleOnAddBudget = async (category: DetailedCategory, amount: number) => {\n await addBudget(category, amount)\n setAlert(buildDynamicCopy(copy.alert_budget_created, category.name) as string)\n }\n\n return (\n <Stack>\n <Header />\n\n <Box bgcolor=\"background.paper\">\n <List>\n {unbudgetedCategories.map((category) => (\n <UnbudgetedRow\n category={category}\n key={category.guid}\n onAddBudget={handleOnAddBudget}\n />\n ))}\n </List>\n </Box>\n\n <RecalculateBudgets onRecalculateBudgets={onRecalculateBudgets} />\n </Stack>\n )\n})\n","import React from 'react'\n\nimport Card from '@mui/material/Card'\nimport CardContent from '@mui/material/CardContent'\nimport Stack from '@mui/material/Stack'\n\nimport { CategoryIcon, H1, Text } from '@kyper/mui'\n\nimport { DetailedBudget, formatCurrency, StatusBar } from '../../../common'\n\ninterface HeaderProps {\n budget: DetailedBudget\n}\n\nexport const Header: React.FC<HeaderProps> = ({ budget }) => {\n const {\n amount,\n budgetColors: { background },\n category: { name: categoryName },\n category_guid,\n percentage,\n transaction_total,\n } = budget\n\n const status = [\n {\n color: background,\n percentage: `${percentage}%`,\n },\n ]\n\n return (\n <Card sx={{ mt: 24, mx: 24 }}>\n <CardContent>\n <Stack alignItems=\"center\" gap={16}>\n <CategoryIcon categoryGuid={category_guid} size={56} />\n <H1>\n {`${formatCurrency(transaction_total, '0,0')} / ${formatCurrency(amount, '0,0')}`}\n </H1>\n <Text bold={true} variant=\"XSmall\">\n {categoryName}\n </Text>\n <StatusBar data={status} height={10} />\n </Stack>\n </CardContent>\n </Card>\n )\n}\n","import Stack from '@mui/material/Stack'\nimport { observer } from 'mobx-react-lite'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport { useGlobalCopyStore } from '../../../common'\n\nexport const SubBudgetZeroState = observer(() => {\n const { budgets: copy } = useGlobalCopyStore()\n\n return (\n <Stack alignItems=\"center\" gap={12} height=\"auto\" mb={24} mt={24}>\n <Icon color=\"secondary\" name=\"bubble_chart\" sx={{ fontSize: 32 }} />\n <Text bold={true} color=\"secondary\" variant=\"Small\">\n {copy.zero_state_no_sub_budgets}\n </Text>\n <Text color=\"text.secondary\" variant=\"XSmall\">\n {copy.zero_state_no_sub_budgets_description}\n </Text>\n </Stack>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport ListItem from '@mui/material/ListItem'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { CategoryIcon, Text } from '@kyper/mui'\n\nimport {\n type DetailedBudget,\n formatCurrency,\n SingleSegmentDonut,\n useBudgetsStore,\n} from '../../../common'\n\ninterface SubBudgetRowProps {\n budget: DetailedBudget\n}\n\nexport const SubBudgetRow: React.FC<SubBudgetRowProps> = observer(({ budget }) => {\n const {\n amount,\n budgetColors: { background },\n category,\n percentage,\n transaction_total,\n } = budget\n\n const { setSelectedSubBudget } = useBudgetsStore()\n\n return (\n <ListItem>\n <ListItemButton onClick={() => setSelectedSubBudget(budget)}>\n <ListItemAvatar sx={{ mb: -8, mr: 16 }}>\n <SingleSegmentDonut color={background} percent={percentage} size={40}>\n <CategoryIcon categoryGuid={category.parent_guid} variant=\"basic\" />\n </SingleSegmentDonut>\n </ListItemAvatar>\n <ListItemText\n primary={\n <Stack component=\"span\" direction=\"row\" justifyContent=\"space-between\">\n <Text bold={true} variant=\"Body\">\n {budget.category.name}\n </Text>\n </Stack>\n }\n secondary={\n <Stack component=\"span\" direction=\"row\" justifyContent=\"space-between\">\n <Text fontWeight={400} variant=\"Body\">\n {`\n ${formatCurrency(transaction_total, '0,0')} / \n ${formatCurrency(amount, '0,0')}\n `}\n </Text>\n </Stack>\n }\n />\n </ListItemButton>\n </ListItem>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Stack from '@mui/material/Stack'\n\nimport { Icon, Text } from '@kyper/mui'\n\nimport {\n type DetailedBudget,\n type DetailedCategory,\n Dialog,\n Drawer,\n useBudgetsStore,\n useGlobalCopyStore,\n} from '../../../common'\nimport { CategoryRow, useCategoryUiStore } from '../../../categories'\nimport { BudgetAmount } from '../shared/BudgetAmount'\n\ninterface AddSubBudgetProps {\n category: DetailedCategory\n parentBudget: DetailedBudget\n}\n\nexport const AddSubBudget: React.FC<AddSubBudgetProps> = observer(({ category, parentBudget }) => {\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const { setExpandedGuid, setOnSelect } = useCategoryUiStore()\n const { addBudget } = useBudgetsStore()\n\n const [isOpen, setIsOpen] = React.useState(false)\n const [isAddBudgetOpen, setIsAddBudgetOpen] = React.useState(false)\n const [amount, setAmount] = React.useState('')\n const [subCategory, setSubCategory] = React.useState<DetailedCategory | undefined>(undefined)\n\n React.useEffect(() => {\n setOnSelect((guid: string) => {\n const subCategory = category.subCategories.find((sc) => sc.guid === guid)\n if (subCategory) {\n setSubCategory(subCategory)\n setAmount(`${subCategory.currentAmount === 0 ? '' : subCategory.currentAmount}`)\n setIsAddBudgetOpen(true)\n }\n })\n }, [])\n\n const handleOpen = () => {\n setExpandedGuid(category.guid)\n setIsOpen(true)\n }\n\n const handleAddSubBudget = async () => {\n if (subCategory && Number(amount) > 0) {\n await addBudget(subCategory, Number(amount), parentBudget.guid)\n setIsAddBudgetOpen(false)\n setIsOpen(false)\n setSubCategory(undefined)\n }\n }\n\n return (\n <Box>\n <ListItem disableGutters={true} disablePadding={true} sx={{ bgcolor: 'background.paper' }}>\n <ListItemButton onClick={handleOpen}>\n <ListItemText>\n <Stack alignItems=\"center\" direction=\"row\" justifyContent=\"space-between\">\n <Stack alignItems=\"center\" direction=\"row\" gap={8}>\n <Icon fill={true} name=\"add_box\" size={24} sx={{ color: 'action.active' }} />\n <Text bold={true} sx={{ color: 'action.active' }} variant=\"Body\">\n {copy.add_sub_budget_button}\n </Text>\n </Stack>\n <Icon name=\"chevron_right\" size={24} sx={{ color: 'primary.light' }} />\n </Stack>\n </ListItemText>\n </ListItemButton>\n </ListItem>\n <Divider />\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n title={copy.add_sub_budget_title}\n >\n <List>\n <CategoryRow category={category} subCategories={category.subCategories} />\n </List>\n </Drawer>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.add_title }}\n disablePrimaryButton={Number(amount) <= 0}\n isOpen={isAddBudgetOpen}\n onClose={() => setIsAddBudgetOpen(false)}\n onPrimaryAction={handleAddSubBudget}\n primaryText={copy.add_save_button}\n >\n <BudgetAmount\n amount={amount}\n categoryName={subCategory?.name || ''}\n onAmountChanged={setAmount}\n />\n </Dialog>\n </Box>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@kyper/mui'\n\nimport {\n type Budget,\n type DetailedBudget,\n type Transaction,\n buildDynamicCopy,\n Dialog,\n Drawer,\n useBudgetsStore,\n useGlobalCopyStore,\n useTransactionStore,\n} from '../../../common'\n\nimport { TransactionList } from '../../../transactions'\n\nimport { SubBudgetZeroState } from '../budgetlist/SubBudgetZeroState'\nimport { SubBudgetRow } from '../budgetlist/SubBudgetRow'\nimport { BudgetAmount } from '../shared/BudgetAmount'\nimport { AddSubBudget } from './AddSubBudget'\nimport { Header } from './Header'\n\ninterface SubBudgetListProps {\n budget: DetailedBudget\n}\n\nexport const SubBudgetList: React.FC<SubBudgetListProps> = observer(({ budget }) => {\n const { category, subBudgets } = budget\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const { deleteBudget, selectedSubBudget, setSelectedSubBudget, updateBudget } = useBudgetsStore()\n const { filter, setFilter } = useTransactionStore()\n\n const [isEditOpen, setIsEditOpen] = React.useState(false)\n const [isDeleteOpen, setIsDeleteOpen] = React.useState(false)\n const [amount, setAmount] = React.useState(``)\n\n React.useEffect(() => {\n if (selectedSubBudget) {\n setAmount(`${selectedSubBudget.amount}`)\n setFilter({\n ...filter,\n custom: (t: Transaction) => t.category_guid === selectedSubBudget.category_guid,\n })\n }\n }, [selectedSubBudget])\n\n const handleUpdateBudget = async () => {\n if (selectedSubBudget) {\n await updateBudget({\n ...selectedSubBudget,\n amount: Number(amount),\n } as Budget)\n }\n }\n\n const handleDeleteBudget = async () => {\n if (selectedSubBudget) {\n await deleteBudget(selectedSubBudget.guid)\n }\n setIsDeleteOpen(false)\n handleClose()\n }\n\n const handleClose = () => {\n setFilter({\n ...filter,\n custom: (t: Transaction) =>\n t.category_guid === budget.category_guid ||\n t.top_level_category_guid === budget.category_guid,\n })\n setSelectedSubBudget(undefined)\n }\n\n return (\n <React.Fragment>\n <List sx={{ bgcolor: 'background.paper' }}>\n {subBudgets.length === 0 ? (\n <SubBudgetZeroState />\n ) : (\n subBudgets.map((subBudget) => (\n <React.Fragment key={subBudget.guid}>\n <SubBudgetRow budget={subBudget} />\n <Divider />\n </React.Fragment>\n ))\n )}\n <AddSubBudget category={category} parentBudget={budget} />\n </List>\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={Boolean(selectedSubBudget)}\n onClose={handleClose}\n onPrimaryAction={() => setIsEditOpen(true)}\n onSecondaryAction={() => setIsDeleteOpen(true)}\n primaryText={copy.details_edit_button}\n secondaryText={copy.details_delete_button}\n title={copy.details_title}\n >\n {selectedSubBudget && (\n <Stack gap={24}>\n <Header budget={selectedSubBudget} />\n <TransactionList height=\"100%\" />\n </Stack>\n )}\n </Drawer>\n\n {selectedSubBudget && (\n <React.Fragment>\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.details_edit_title }}\n disablePrimaryButton={Number(amount) <= 0}\n isOpen={isEditOpen}\n onClose={() => setIsEditOpen(false)}\n onPrimaryAction={handleUpdateBudget}\n primaryText={copy.edit_save_button}\n >\n <BudgetAmount\n amount={amount}\n categoryName={selectedSubBudget.category.name}\n onAmountChanged={setAmount}\n />\n </Dialog>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.delete_title }}\n isOpen={isDeleteOpen}\n onClose={() => setIsDeleteOpen(false)}\n onPrimaryAction={handleDeleteBudget}\n primaryColor=\"error\"\n primaryText=\"Delete\"\n secondaryColor=\"secondary\"\n >\n <Text variant=\"Paragraph\">\n {buildDynamicCopy(copy.delete_description, selectedSubBudget.category.name) as string}\n </Text>\n </Dialog>\n </React.Fragment>\n )}\n </React.Fragment>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\n\nimport { Icon } from '@kyper/mui'\n\nimport {\n type DetailedBudget,\n Drawer,\n useBudgetsStore,\n useGlobalCopyStore,\n useTransactionStore,\n} from '../../../common'\n\nimport { exportTransactionsToCSV, TransactionDetails, TransactionList } from '../../../transactions'\n\nimport { Header } from './Header'\nimport { SubBudgetList } from './SubBudgetList'\n\ninterface BudgetDetailsProps {\n budget: DetailedBudget\n}\n\nexport const BudgetDetails: React.FC<BudgetDetailsProps> = observer(({ budget }) => {\n const { budgets: copy, common: commonCopy, transactions: transactionCopy } = useGlobalCopyStore()\n const { setAlert } = useBudgetsStore()\n const { sortedTransactions: transactions, tags } = useTransactionStore()\n\n const [selectedTab, setSelectedTab] = React.useState(0)\n const [transactionGuid, setTransactionGuid] = React.useState('')\n\n const transaction = React.useMemo(\n () => transactions.find((t) => t.guid === transactionGuid),\n [transactionGuid],\n )\n\n const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => {\n setSelectedTab(newValue)\n }\n\n const handleExportToCsv = () => {\n exportTransactionsToCSV(transactions, tags)\n setAlert(copy.alert_csv_downloaded)\n }\n\n return (\n <Stack gap={24}>\n <Header budget={budget} />\n\n <Stack>\n <Tabs\n onChange={handleTabChange}\n sx={{ width: '100%' }}\n value={selectedTab}\n variant=\"fullWidth\"\n >\n <Tab label={copy.details_transactions_tab} />\n <Tab label={copy.details_subbudgets_tab} />\n </Tabs>\n {selectedTab === 0 && (\n <Stack>\n {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 height=\"100%\" onClick={setTransactionGuid} />\n </Stack>\n )}\n {selectedTab === 1 && <SubBudgetList budget={budget} />}\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={Boolean(transaction)}\n onClose={() => setTransactionGuid('')}\n title={copy.details_transaction_drawer}\n >\n {transaction && <TransactionDetails transaction={transaction} />}\n </Drawer>\n </Stack>\n </Stack>\n )\n})\n","import React from 'react'\n\nimport { observer } from 'mobx-react-lite'\n\nimport { Text } from '@kyper/mui'\n\nimport {\n type Budget,\n type Transaction,\n buildDynamicCopy,\n Dialog,\n Drawer,\n useBudgetsStore,\n useGlobalCopyStore,\n useGlobalUiStore,\n useTransactionStore,\n} from '../../common'\n\nimport { BudgetDetails } from './budgetdetails/BudgetDetails'\nimport { BudgetAmount } from './shared/BudgetAmount'\n\nexport const BudgetDetailsDrawer = observer(() => {\n const { selectedAccountGuids } = useGlobalUiStore()\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const {\n dateRange,\n deleteBudget,\n selectedBudget,\n selectedSubBudget,\n setAlert,\n setSelectedBudget,\n updateBudget,\n } = useBudgetsStore()\n const { setFilter } = useTransactionStore()\n\n const [isOpen, setIsOpen] = React.useState(false)\n const [isEditOpen, setIsEditOpen] = React.useState(false)\n const [isDeleteOpen, setIsDeleteOpen] = React.useState(false)\n const [amount, setAmount] = React.useState(``)\n\n React.useEffect(() => {\n if (selectedBudget && !selectedSubBudget) {\n setAmount(`${selectedBudget.amount}`)\n setIsOpen(true)\n setFilter({\n accounts: selectedAccountGuids,\n dateRange: dateRange,\n custom: (t: Transaction) =>\n t.category_guid === selectedBudget.category_guid ||\n t.top_level_category_guid === selectedBudget.category_guid,\n })\n }\n }, [selectedBudget])\n\n const handleUpdateBudget = async () => {\n if (selectedBudget) {\n await updateBudget({\n ...selectedBudget,\n amount: Number(amount),\n percentage: (selectedBudget.category.totalAmount / Number(amount)) * 100,\n } as Budget)\n\n setAlert(buildDynamicCopy(copy.alert_budget_updated, selectedBudget.category.name) as string)\n }\n }\n\n const handleDeleteBudget = async () => {\n if (selectedBudget) {\n await deleteBudget(selectedBudget.guid)\n setAlert(buildDynamicCopy(copy.alert_budget_deleted, selectedBudget.category.name) as string)\n }\n setIsDeleteOpen(false)\n handleClose()\n }\n\n const handleClose = () => {\n setIsOpen(false)\n // Wait for the close animation before set the selected budget\n setTimeout(() => {\n setSelectedBudget(undefined)\n }, 250)\n }\n\n if (!selectedBudget) {\n return undefined\n }\n\n return (\n <React.Fragment>\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isOpen}\n onClose={handleClose}\n onPrimaryAction={() => setIsEditOpen(true)}\n onSecondaryAction={() => setIsDeleteOpen(true)}\n primaryText={copy.details_edit_button}\n secondaryColor=\"error\"\n secondaryText={copy.details_delete_button}\n title={copy.details_title}\n >\n <BudgetDetails budget={selectedBudget} />\n </Drawer>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.details_edit_title }}\n disablePrimaryButton={Number(amount) <= 0}\n isOpen={isEditOpen}\n onClose={() => setIsEditOpen(false)}\n onPrimaryAction={handleUpdateBudget}\n primaryText={copy.edit_save_button}\n >\n <BudgetAmount\n amount={amount}\n categoryName={selectedBudget.category.name}\n onAmountChanged={setAmount}\n />\n </Dialog>\n\n <Dialog\n copy={{ close_aria: commonCopy.close_aria, title: copy.delete_title }}\n isOpen={isDeleteOpen}\n onClose={() => setIsDeleteOpen(false)}\n onPrimaryAction={handleDeleteBudget}\n primaryColor=\"error\"\n primaryText={copy.details_delete_button}\n secondaryColor=\"secondary\"\n >\n <Text variant=\"Paragraph\">\n {buildDynamicCopy(copy.delete_description, selectedBudget.category.name) as string}\n </Text>\n </Dialog>\n </React.Fragment>\n )\n})\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { isAfter } from 'date-fns/isAfter'\nimport { startOfMonth } from 'date-fns/startOfMonth'\n\nimport Alert from '@mui/material/Alert'\nimport Stack from '@mui/material/Stack'\nimport Snackbar from '@mui/material/Snackbar'\nimport useTheme from '@mui/material/styles/useTheme'\nimport { DateRange } from '@mui/x-date-pickers-pro'\n\nimport {\n ANALYTICS_EVENTS,\n Drawer,\n Loader,\n useAccountStore,\n useBudgetsStore,\n useCategoryStore,\n useEvent,\n useGlobalCopyStore,\n useGlobalUiStore,\n useRecurringActivityStore,\n useScreenSize,\n WidgetContainer,\n WidgetProps,\n} from '../common'\n\nimport { BubbleBudgets } from './components/BubbleBudgets'\nimport { BudgetList } from './components/BudgetList'\nimport { Overview } from './components/Overview'\nimport { AddBudgets } from './components/AddBudgets'\nimport { BudgetDetailsDrawer } from './components/BudgetDetailsDrawer'\n\nconst BUDGET_LIST_WIDTH = 480\n\nexport const BubbleBudgetsWidget: React.FC<WidgetProps> = observer(({ onBackClick, sx }) => {\n const theme = useTheme()\n\n const { onEvent } = useEvent()\n const { accounts } = useAccountStore()\n const { budgets: copy, common: commonCopy } = useGlobalCopyStore()\n const { isInitialized, selectedAccounts, setDisplayedDate, setSelectedAccounts } =\n useGlobalUiStore()\n const { alert, dateRange, loadBudgets, setDateRange, setAlert, setTheme } = useBudgetsStore()\n const { loadCashflowSequences } = useRecurringActivityStore()\n const { isDesktop, isTablet } = useScreenSize()\n const { reloadCategoryTotals } = useCategoryStore()\n\n const [isDataLoaded, setIsDataLoaded] = React.useState(false)\n const [isAddOpen, setIsAddOpen] = React.useState(false)\n\n React.useEffect(() => {\n setTheme(theme)\n setSelectedAccounts(accounts)\n setDisplayedDate(dateRange.start, dateRange.end)\n onEvent(ANALYTICS_EVENTS.BUDGETS_VIEW)\n }, [])\n\n React.useEffect(() => {\n if (isInitialized) {\n reloadCategoryTotals(selectedAccounts, dateRange.start, dateRange.end).finally()\n if (!isDataLoaded) {\n loadCashflowSequences().finally()\n loadBudgets().finally(() => setIsDataLoaded(true))\n }\n }\n }, [isInitialized, selectedAccounts, dateRange])\n\n const onMonthChanged = (dateRange: DateRange<Date>) => {\n setDateRange({ start: dateRange[0] || new Date(), end: dateRange[1] || new Date() })\n }\n\n const handleAccountFilterClick = () => {\n onEvent(ANALYTICS_EVENTS.BUDGETS_CLICK_FILTER)\n }\n\n const handleAddClick = () => {\n setIsAddOpen(true)\n onEvent(ANALYTICS_EVENTS.BUDGETS_CLICK_ADD)\n }\n\n const handleBudgetsRecalculated = () => {\n setIsAddOpen(false)\n }\n\n const shouldDisableNext = isAfter(dateRange.end, startOfMonth(new Date()))\n\n if (!isInitialized || !isDataLoaded) {\n return <Loader />\n }\n\n return (\n <WidgetContainer\n accountOptions={accounts}\n actions={[\n {\n iconName: 'add',\n label: copy.add_title,\n onClick: handleAddClick,\n },\n ]}\n calendarActions={{ onRangeChanged: onMonthChanged, shouldDisableNext }}\n onAccountsFilterClick={handleAccountFilterClick}\n onBackClick={onBackClick}\n sx={sx}\n title={copy.budgets_title}\n >\n {(!isInitialized || !isDataLoaded) && <Loader />}\n {isInitialized && isDataLoaded && (\n <Stack direction={isDesktop || isTablet ? 'row' : 'column'} height=\"100%\" width=\"100%\">\n <Stack height={isDesktop || isTablet ? 'calc(100dvh - 150px)' : 450}>\n <BubbleBudgets\n height={isDesktop || isTablet ? 800 : 450}\n isDraggable={true}\n shouldShowZeroState={false}\n unavailableWidth={isDesktop || isTablet ? BUDGET_LIST_WIDTH : 0}\n />\n </Stack>\n <Stack\n gap={24}\n height=\"100%\"\n sx={{ mr: 24 }}\n width={isDesktop || isTablet ? BUDGET_LIST_WIDTH : '100%'}\n >\n <Overview />\n <BudgetList />\n </Stack>\n </Stack>\n )}\n\n <BudgetDetailsDrawer />\n\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isAddOpen}\n onClose={() => setIsAddOpen(false)}\n title={copy.add_new_title}\n >\n <AddBudgets onRecalculateBudgets={handleBudgetsRecalculated} />\n </Drawer>\n\n <Snackbar\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n autoHideDuration={3500}\n onClose={() => setAlert('')}\n open={Boolean(alert)}\n >\n <Alert onClose={() => setAlert('')} severity=\"success\" variant=\"filled\">\n {alert}\n </Alert>\n </Snackbar>\n </WidgetContainer>\n )\n})\n","export enum DashboardLocation {\n Main = 0,\n RightSide = 1,\n}\n","import { observer } from 'mobx-react-lite'\nimport Stack from '@mui/material/Stack'\nimport Paper from '@mui/material/Paper'\n\nimport { H1, Text } from '@kyper/mui'\n\nimport {\n AccountFilter,\n useAccountStore,\n useGlobalCopyStore,\n useGlobalUiStore,\n useScreenSize,\n} from '../common'\n\nconst Greeting = () => {\n const { accounts } = useAccountStore()\n const { selectedAccountGuids, setSelectedAccountGuids } = useGlobalUiStore()\n const { isMobile } = useScreenSize()\n const { common: commonCopy } = useGlobalCopyStore()\n\n const accountFilterCopy = {\n accountFilterOptionsCopy: {\n accountTypeAccounts: commonCopy.account_filter.account_type_accounts,\n cancelButton: commonCopy.cancel_button,\n filterButton: commonCopy.filter_button,\n filterButtonAria: commonCopy.account_filter.filter_button_generic_aria,\n selectAllAccounts: commonCopy.account_filter.select_all_accounts,\n toggleAccountTypeAccounts: commonCopy.account_filter.toggle_account_type_accounts,\n unselectAllAccounts: commonCopy.account_filter.unselect_all_accounts,\n zeroStateButton: commonCopy.account_filter.zero_state_button,\n zeroStateDescription: commonCopy.account_filter.zero_state_description,\n zeroStateTitle: commonCopy.account_filter.zero_state_title,\n },\n title: commonCopy.account_filter.title,\n }\n\n const getGreeting = () => {\n const now = new Date()\n const hour = now.getHours()\n\n if (hour > 1 && hour < 12) {\n return commonCopy.good_morning\n } else if (hour >= 12 && hour < 18) {\n return commonCopy.good_afternoon\n } else {\n return commonCopy.good_evening\n }\n }\n\n return (\n <Paper sx={{ mb: isMobile ? 24 : 0, p: 24 }}>\n <Stack alignItems=\"center\" flexDirection=\"row\" justifyContent=\"space-between\">\n <Stack>\n <H1>{getGreeting()}</H1>\n <Text color=\"text.secondary\" sx={{ fontSize: 15 }}>\n {commonCopy.heres_your_spending_overview}\n </Text>\n </Stack>\n <AccountFilter\n accounts={accounts}\n copy={accountFilterCopy}\n onFilterClick={(guids) => {\n setSelectedAccountGuids(guids)\n }}\n selectedAccountGuids={selectedAccountGuids}\n showAccountNumbers={false}\n sx={{ '& .mx-cmn-account-filter-title': { fontSize: 15 }, mx: 4 }}\n variant=\"text\"\n />\n </Stack>\n </Paper>\n )\n}\n\nexport default observer(Greeting)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Grid from '@mui/material/Unstable_Grid2'\nimport Skeleton from '@mui/material/Skeleton'\nimport Stack from '@mui/material/Stack'\n\nimport { useAccountStore, useGlobalStore, useGlobalUiStore, useScreenSize } from '../common'\nimport { DashboardLocation } from './constants/Dashboard'\n\nimport type { DashboardWidget } from './types/DashboardTypes'\nimport Greeting from './Greeting'\n\nexport interface DashboardProps {\n widgets: DashboardWidget[]\n isLoading: boolean\n}\n\nconst Dashboard: React.FC<DashboardProps> = ({ widgets, isLoading }) => {\n const { isDesktop, isMobile } = useScreenSize()\n const { copyStore } = useGlobalStore()\n const { setSelectedAccounts } = useGlobalUiStore()\n const { accounts } = useAccountStore()\n\n React.useEffect(() => {\n setSelectedAccounts(accounts)\n }, [accounts])\n\n const sortedWidgets = React.useMemo(\n () => widgets.sort((w1, w2) => w1.index - w2.index),\n [widgets],\n )\n\n const mainWidgets = React.useMemo(\n () => sortedWidgets.filter((widget) => widget.location === DashboardLocation.Main),\n [widgets],\n )\n\n const sideWidgets = React.useMemo(\n () => sortedWidgets.filter((widget) => widget.location === DashboardLocation.RightSide),\n [widgets],\n )\n\n return (\n <Grid container={true} spacing={isMobile ? 0 : 24} sx={{ overflow: 'scroll' }}>\n <Grid xs={12}>{copyStore.isInitialized && <Greeting />}</Grid>\n\n {/* Main Column */}\n <Grid xl={8} xs={12}>\n {isLoading && (\n <Stack direction=\"column\" spacing={24}>\n <Skeleton height={100} variant=\"rounded\" width=\"100%\" />\n <Skeleton height={300} variant=\"rounded\" width=\"100%\" />\n <Skeleton height={300} variant=\"rounded\" width=\"100%\" />\n </Stack>\n )}\n {!isLoading && (\n <Stack direction=\"column\" spacing={24}>\n {isDesktop\n ? mainWidgets.map((widget) => (\n <React.Fragment key={widget.index}>{widget.component}</React.Fragment>\n ))\n : sortedWidgets.map((widget) => (\n <React.Fragment key={widget.index}>{widget.component}</React.Fragment>\n ))}\n </Stack>\n )}\n </Grid>\n\n {/* Right Column */}\n {isDesktop && (\n <Grid xl={4}>\n {isLoading ? (\n <Stack direction=\"column\" spacing={24}>\n <Skeleton height={200} variant=\"rounded\" width=\"100%\" />\n <Skeleton height={100} variant=\"rounded\" width=\"100%\" />\n <Skeleton height={300} variant=\"rounded\" width=\"100%\" />\n </Stack>\n ) : (\n <Stack direction=\"column\" spacing={24}>\n {sideWidgets.map((widget) => (\n <React.Fragment key={widget.index}>{widget.component}</React.Fragment>\n ))}\n </Stack>\n )}\n </Grid>\n )}\n </Grid>\n )\n}\n\nexport default observer(Dashboard)\n","import React, { PropsWithChildren } from 'react'\n\nimport Box from '@mui/material/Box'\n\nimport { Text } from '@kyper/mui'\n\ninterface SubheaderRowProps {\n bgcolor?: string\n}\n\n//TODO use subheaderRow from common once pulse has CSSbaseline from MUI\nconst SubheaderRow: React.FC<PropsWithChildren<SubheaderRowProps>> = ({\n bgcolor = 'background.default',\n children,\n}) => (\n <Box\n alignItems=\"flex-end\"\n boxSizing=\"border-box\"\n display=\"flex\"\n height={32}\n pb={4}\n pl={24}\n pr={24}\n pt={4}\n sx={{ bgcolor }}\n width=\"100%\"\n >\n <Text bold={true} boxSizing=\"border-box\" component=\"div\" variant=\"XSmall\" width=\"100%\">\n {children}\n </Text>\n </Box>\n)\n\nexport default SubheaderRow\n","import React from 'react'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport ListItemAvatar from '@mui/material/ListItemAvatar'\nimport Box from '@mui/material/Box'\nimport Switch from '@mui/material/Switch'\nimport Divider from '@mui/material/Divider'\n\nimport { InstitutionLogo } from '@kyper/mui'\n\nimport PulseSubheaderRow from '../../components/PulseSubheaderRow'\n\nimport type { Account } from '../../../../common/types/Account'\nimport { Dialog } from '../../../../common'\nimport { SettingsMenuContent } from '../../hiddeninsights/types'\n\ninterface Props {\n accounts: Account[]\n content: SettingsMenuContent\n toggleAccount: (dialogueActionType: string, accountToUpdate: string, updateType: string) => void\n title: string\n}\n\nexport const AccountGroup: React.FC<Props> = ({\n accounts = [],\n content,\n toggleAccount,\n title = '',\n}) => {\n const [isDialogOpen, setIsDialogOpen] = React.useState(false)\n const [accountUpdateData, setAccountUpdateData] = React.useState({\n accountToUpdate: '',\n updateType: '',\n })\n\n const prepareToToggleAccount = (account: Account) => {\n setAccountUpdateData({\n accountToUpdate: account.guid,\n updateType: account.is_hidden ? 'ENABLE' : 'DISABLE',\n })\n setIsDialogOpen(true)\n }\n\n const handleToggleAccount = () => {\n toggleAccount('confirm', accountUpdateData.accountToUpdate, accountUpdateData.updateType)\n handleCloseDialog()\n }\n\n const handleCloseDialog = () => {\n setIsDialogOpen(false)\n toggleAccount('cancel', '', accountUpdateData.updateType)\n //call analytics\n setAccountUpdateData({\n accountToUpdate: '',\n updateType: '',\n })\n }\n\n return (\n <Box>\n <PulseSubheaderRow>{title}</PulseSubheaderRow>\n {accounts.map((account, i) => (\n <Box key={account.guid}>\n <ListItem>\n <ListItemButton onClick={() => prepareToToggleAccount(account)}>\n <ListItemAvatar>\n <InstitutionLogo\n alt={`${account.displayName} logo`}\n institutionGuid={account.institution_guid || ''}\n />\n </ListItemAvatar>\n <ListItemText\n primary={account.truncatedDisplayName}\n secondary={account.institutionName}\n />\n <Switch checked={!account.is_hidden} />\n </ListItemButton>\n </ListItem>\n <Divider sx={{ ml: i < accounts.length - 1 ? 24 : 0 }} />\n </Box>\n ))}\n <Dialog\n copy={{\n close_aria: content.close,\n title:\n accountUpdateData.updateType === 'DISABLE'\n ? content.turn_off_account\n : content.turn_on_account,\n }}\n isOpen={isDialogOpen}\n onClose={handleCloseDialog}\n onPrimaryAction={handleToggleAccount}\n primaryText={\n accountUpdateData.updateType === 'DISABLE' ? content.turn_off : content.turn_on\n }\n >\n {accountUpdateData.updateType === 'DISABLE'\n ? content.account_data_hidden + '*'\n : content.account_data_shown}\n <br />\n <br />\n {accountUpdateData.updateType === 'DISABLE'\n ? '*' + content.undo_reactivate_account + '.'\n : ''}\n </Dialog>\n </Box>\n )\n}\n","import React from 'react'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport Divider from '@mui/material/Divider'\nimport useTheme from '@mui/material/styles/useTheme'\nimport ChevronRightOutlinedIcon from '@mui/icons-material/ChevronRightOutlined'\n\nimport { Text } from '@kyper/mui'\n\ninterface SettingsItemProps {\n Icon: React.ElementType\n label: string\n onClick: () => void\n itemCount?: number\n}\n\nconst SettingsItem: React.FC<SettingsItemProps> = ({ Icon, label, onClick, itemCount }) => {\n const theme = useTheme()\n\n return (\n <>\n <ListItem sx={{ backgroundColor: 'background.paper' }}>\n <ListItemButton onClick={onClick}>\n <Icon sx={{ fontSize: 22, marginRight: '16px' }} />\n <ListItemText\n primary={label}\n primaryTypographyProps={{\n fontSize: theme.typography.Body.fontSize,\n }}\n sx={{\n marginRight: 16,\n }}\n />\n {itemCount !== undefined && (\n <Text\n sx={{\n marginRight: 24,\n color: theme.palette.text.secondary,\n fontWeight: theme.typography.fontWeightBold,\n fontSize: theme.typography.Small.fontSize,\n }}\n >\n {itemCount}\n </Text>\n )}\n <ChevronRightOutlinedIcon sx={{ fontSize: 22 }} />\n </ListItemButton>\n </ListItem>\n <Divider />\n </>\n )\n}\n\nexport default SettingsItem\n","import React from 'react'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport AccountBalanceOutlinedIcon from '@mui/icons-material/AccountBalanceOutlined'\n\nimport Drawer from '../../../../common/components/drawer/Drawer'\n\nimport { ManageAccountsStore } from '../types'\nimport { AccountGroup } from './AccountGroup'\nimport { SettingsMenuContent } from '../../hiddeninsights/types'\nimport SettingsItem from '../../components/SettingsItem'\n\ninterface Props {\n content: SettingsMenuContent\n manageAccountsStore: ManageAccountsStore\n}\n\nexport const ManageAccountsDrawer: React.FC<Props> = ({ content, manageAccountsStore }) => {\n const { groupedAccounts, toggleAccount } = manageAccountsStore\n const [isAccountsControlDrawerOpen, setIsAccountsControlDrawerOpen] = React.useState(false)\n\n return (\n <>\n <SettingsItem\n Icon={AccountBalanceOutlinedIcon}\n label={content.manage_accounts}\n onClick={() => {\n setIsAccountsControlDrawerOpen(true)\n manageAccountsStore.handleAccountsDrawerAction('opened')\n }}\n />\n <Drawer\n ariaLabelClose={content.close}\n isOpen={isAccountsControlDrawerOpen}\n onClose={() => {\n setIsAccountsControlDrawerOpen(false)\n manageAccountsStore.handleAccountsDrawerAction('closed')\n }}\n shouldShowHeaderBorders={false}\n sx={{\n '& .MuiDrawer-paper': {\n backgroundColor: 'background.white',\n },\n }}\n title={content.manage_accounts}\n >\n <Divider />\n <List sx={{ height: '100%' }}>\n {groupedAccounts.map(({ accountType, accounts, title }) => (\n <AccountGroup\n accounts={accounts}\n content={content}\n key={accountType}\n title={title}\n toggleAccount={toggleAccount}\n />\n ))}\n </List>\n </Drawer>\n </>\n )\n}\n","import React, { createContext, useContext, useState, ReactNode } from 'react'\n\ninterface ToastState {\n isOpen: boolean\n message: string\n severity: 'success' | 'error'\n}\n\ninterface ToastContextProps {\n toastState: ToastState\n showToast: (msg?: string, severityType?: 'success' | 'error') => void\n hideToast: () => void\n setMessage: (msg: string) => void\n}\n\nconst ToastContext = createContext<ToastContextProps | undefined>(undefined)\n\nconst ToastProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const [toastState, setToastState] = useState<ToastState>({\n isOpen: false,\n message: '',\n severity: 'success',\n })\n\n const showToast = (msg?: string, severityType?: 'success' | 'error') => {\n setToastState({\n isOpen: true,\n message: msg ?? toastState.message,\n severity: severityType ?? toastState.severity,\n })\n }\n\n const hideToast = () => {\n setToastState({\n ...toastState,\n isOpen: false,\n })\n }\n\n const setMessage = (msg: string) => {\n setToastState((prevState) => ({\n ...prevState,\n message: msg,\n }))\n }\n\n return (\n <ToastContext.Provider value={{ toastState, showToast, hideToast, setMessage }}>\n {children}\n </ToastContext.Provider>\n )\n}\n\nconst useToast = (): ToastContextProps => {\n const context = useContext(ToastContext)\n if (!context) {\n throw new Error('useToast must be used within a ToastProvider')\n }\n return context\n}\n\nexport { ToastProvider, useToast }\n","import React from 'react'\nimport Snackbar from '@mui/material/Snackbar'\nimport Alert from '@mui/material/Alert'\nimport { CheckCircleRounded } from '@mui/icons-material'\nimport { SxProps, Theme } from '@mui/system'\nimport Grow, { GrowProps } from '@mui/material/Grow'\n\nimport { Text } from '@kyper/mui'\n//TODO update component for all uses according to this story\n// https://mxcom.atlassian.net/browse/MEW-488, move into kyper-mui, and re-consume from there\nexport function GrowTransition(props: GrowProps) {\n return <Grow {...props} />\n}\n\ninterface ToastProps {\n open: boolean\n handleClose: () => void\n message: string\n autoHideDuration?: number\n severity?: 'success' | 'error' | 'warning' | 'info'\n icon?: React.ReactNode\n snackbarSx?: SxProps<Theme>\n}\n\nconst Toast: React.FC<ToastProps> = ({\n open,\n handleClose,\n message,\n autoHideDuration = 3000,\n severity = 'success',\n icon = <CheckCircleRounded fontSize=\"inherit\" />,\n snackbarSx,\n}) => {\n return (\n <Snackbar\n TransitionComponent={GrowTransition}\n autoHideDuration={autoHideDuration}\n onClose={handleClose}\n open={open}\n sx={{\n width: '100%',\n px: 24,\n ...snackbarSx,\n }}\n >\n <Alert\n icon={icon}\n onClose={handleClose}\n severity={severity}\n sx={{\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n height: 56,\n backgroundColor: (theme) => theme.palette[severity].darker,\n //TODO can be removed once pulse has CSSbaseline from MUI and component is moved to kyper\n boxSizing: 'border-box',\n }}\n variant=\"filled\"\n >\n <Text sx={{ lineHeight: '20px' }} truncate={false}>\n {message}\n </Text>\n </Alert>\n </Snackbar>\n )\n}\n\nexport default Toast\n","export default \"data:image/png;base64,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\"","import Box from '@mui/material/Box'\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { Text } from '@kyper/mui'\nimport React from 'react'\nimport { SettingsMenuContent } from '../types'\n\nimport noInsightsImageUrl from '../images/no-insights.png'\n\ninterface Props {\n content: SettingsMenuContent\n}\n\nexport const CategoryEmptyState: React.FC<Props> = ({ content = {} }) => {\n const theme = useTheme()\n\n return (\n <Box px={24} py={32}>\n <Text\n color={theme.palette.text.secondary}\n component=\"div\"\n fontWeight=\"bold\"\n height=\"72px\"\n maxWidth=\"297px\"\n truncate={false}\n variant=\"Body\"\n >\n {content.there_are_no_insights_hidden}\n </Text>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n p: '16px 24px',\n }}\n >\n <Box\n sx={{\n backgroundImage: `url(${noInsightsImageUrl})`,\n backgroundRepeat: 'no-repeat',\n backgroundSize: '100% 100%',\n height: '105px',\n width: '121px',\n }}\n />\n </Box>\n </Box>\n )\n}\n","import React, { useEffect } from 'react'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemText from '@mui/material/ListItemText'\nimport Button from '@mui/material/Button'\nimport LoadingButton from '@mui/lab/LoadingButton'\nimport Checkbox from '@mui/material/Checkbox'\nimport useTheme from '@mui/material/styles/useTheme'\nimport Box from '@mui/material/Box'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport Stack from '@mui/material/Stack'\n\nimport { DisabledBeatTemplate, SettingsMenuContent } from '../types'\nimport { Text } from '@kyper/mui'\n\nimport Drawer from '../../../../common/components/drawer/Drawer'\nimport { usePrevious } from '../../../../common/hooks/usePrevious'\nimport Toast from '../../components/Toast'\nimport SubheaderRow from '../../components/PulseSubheaderRow'\n\nimport { useToast } from '../../../contexts/ToastContext'\n\ninterface Props {\n content: SettingsMenuContent\n disabledBeatTemplates: DisabledBeatTemplate[]\n handleEnableBeatTemplates: (templateNames: string[], showSnackBar: boolean) => void\n isOpen: boolean\n isUpdateLoading: boolean\n onClose: () => void\n translatedSubCatetgory: string\n}\n\nexport const SubCategoryDrawer: React.FC<Props> = ({\n content,\n disabledBeatTemplates = [],\n handleEnableBeatTemplates = () => {},\n isOpen = false,\n isUpdateLoading = false,\n onClose = () => {},\n translatedSubCatetgory = '',\n}) => {\n const theme = useTheme()\n\n // using an object to store checkbox state because updating the check value via\n // key/name in handleCheckboxChange is seemed cleaner than a map with a conditional\n //\n // [name]: checked\n // vs\n // prevCheckboxes.map((checkbox) =>\n // checkbox.id === id ? { ...checkbox, checked: !checkbox.checked } : checkbox\n // )\n //\n // for the initialCheckboxState, using reduce to create an object instead of map to create an array of objects also felt\n // more focused for this use case\n const initialCheckboxState = React.useMemo(\n () => disabledBeatTemplates.reduce((acc, beat) => ({ ...acc, [beat.name]: false }), {}),\n [disabledBeatTemplates],\n )\n\n const [beatTemplatesChecked, setBeatTemplatesChecked] = React.useState<{\n [key: string]: boolean\n }>(initialCheckboxState)\n\n const { toastState, hideToast } = useToast()\n\n const prevUpdateLoading = usePrevious(isUpdateLoading)\n\n useEffect(() => {\n //a update request was made\n if (prevUpdateLoading && !isUpdateLoading) {\n setBeatTemplatesChecked(initialCheckboxState)\n }\n }, [prevUpdateLoading, isUpdateLoading, initialCheckboxState, setBeatTemplatesChecked])\n\n const handleCheckboxChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { name, checked } = e.target\n setBeatTemplatesChecked((prev) => ({\n ...prev,\n [name]: checked,\n }))\n }\n\n const numCheckedBeats = Object.values(beatTemplatesChecked).filter(Boolean).length\n\n const handleClose = () => {\n setBeatTemplatesChecked(initialCheckboxState)\n onClose()\n }\n\n const toggleAllCheckboxes = () => {\n const newCheckboxesState = disabledBeatTemplates.reduce(\n (acc, beat) => ({\n ...acc,\n [beat.name]: numCheckedBeats !== disabledBeatTemplates.length,\n }),\n {} as { [key: string]: boolean },\n )\n setBeatTemplatesChecked(newCheckboxesState)\n }\n\n const handleUnhideSelectedInisghts = () => {\n const shouldCloseDrawer = numCheckedBeats === disabledBeatTemplates.length\n\n handleEnableBeatTemplates(\n Object.keys(beatTemplatesChecked).filter((key) => beatTemplatesChecked[key]),\n shouldCloseDrawer,\n )\n }\n\n return (\n <Drawer\n ariaLabelClose={content.close}\n isOpen={isOpen}\n onClose={handleClose}\n shouldShowHeaderBorders={false}\n sx={{\n '& .MuiDrawer-paper': {\n backgroundColor: 'background.white',\n },\n }}\n title={translatedSubCatetgory.replace(/&/g, '&')}\n >\n <Divider />\n <Box px={24} py={16}>\n <Text\n sx={{\n fontSize: theme.typography.Paragraph,\n maxWidth: 327,\n overflow: 'visible',\n whiteSpace: 'normal',\n }}\n >\n {content.select_insights_for_feed}\n </Text>\n </Box>\n <Divider />\n <Stack height=\"calc(100vh - 142px)\">\n <List\n subheader={\n <SubheaderRow>\n <Box\n boxSizing=\"border-box\"\n pt={8}\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n width: '100%',\n height: '100%',\n }}\n >\n <Text fontSize={11} fontWeight={700}>\n {content.insight_name}\n </Text>\n <Button\n onClick={toggleAllCheckboxes}\n size=\"small\"\n sx={{\n '&:hover': { backgroundColor: 'transparent' },\n color: theme.palette.primary.main,\n p: 0,\n height: 16,\n fontSize: 13,\n minWidth: 0,\n }}\n >\n {numCheckedBeats === disabledBeatTemplates.length\n ? content.unselect_all\n : content.select_all}\n </Button>\n </Box>\n </SubheaderRow>\n }\n sx={{ height: '100%' }}\n >\n {disabledBeatTemplates\n .sort((a, b) => (a.name < b.name ? -1 : 1))\n .map((beat, i) => (\n <Box key={i}>\n <ListItem disablePadding={true}>\n <ListItemButton\n onClick={() =>\n setBeatTemplatesChecked((prevCheckboxes) => ({\n ...prevCheckboxes,\n [beat.name]: !prevCheckboxes[beat.name],\n }))\n }\n >\n <ListItemText\n primary={beat.title}\n secondary={<React.Fragment>{beat.description}</React.Fragment>}\n />\n <Checkbox\n checked={\n beatTemplatesChecked[beat.name] ? beatTemplatesChecked[beat.name] : false\n }\n edge=\"end\"\n inputProps={{\n 'aria-label': beatTemplatesChecked[beat.name]\n ? `${content.unselect_insight.split(' ')[0]} ${\n beat.name\n } ${content.unselect_insight.split(' ')[1]}`\n : `${content.select_insight.split(' ')[0]} ${\n beat.name\n } ${content.select_insight.split(' ')[1]}`,\n role: 'checkbox',\n }}\n name={beat.name}\n onChange={handleCheckboxChange}\n size=\"small\"\n />\n </ListItemButton>\n </ListItem>\n <Divider sx={{ ml: i < disabledBeatTemplates.length - 1 ? 24 : 0 }} />\n </Box>\n ))}\n </List>\n {/* Todo remove border-box after pulse has CSSbaseline */}\n <Box\n boxSizing=\"border-box\"\n pb={32}\n pt={24}\n px={24}\n sx={{ display: 'flex', justifyContent: 'center' }}\n >\n {!isUpdateLoading && (\n <Toast\n handleClose={hideToast}\n message={toastState.message}\n open={toastState.isOpen}\n severity={toastState.severity}\n snackbarSx={{\n boxSizing: 'border-box',\n position: 'absolute',\n '&.MuiSnackbar-root': { bottom: '24px', left: 0, right: 0, justifySelf: 'center' },\n }}\n />\n )}\n <LoadingButton\n color=\"primary\"\n disabled={numCheckedBeats === 0}\n fullWidth={true}\n loading={isUpdateLoading}\n onClick={handleUnhideSelectedInisghts}\n variant=\"contained\"\n >\n {numCheckedBeats > 0\n ? `${content.show} ${numCheckedBeats} ${numCheckedBeats > 1 ? content.hidden_insights : content.hidden_insight}`\n : content.show_insights}\n </LoadingButton>\n </Box>\n </Stack>\n </Drawer>\n )\n}\n","import {\n DisabledBeatTemplate,\n CategoryMapping,\n SubcategoryMapping,\n BeatCategory,\n} from '../settings/hiddeninsights/types/index'\n\n// Create category and subcategory translation mappings\nconst createTranslationMappings = (beatTemplatesWithCategories: DisabledBeatTemplate[]) => {\n const categoryMapping: CategoryMapping = {\n spending: '',\n saving: '',\n borrowing: '',\n planning: '',\n }\n const subcategoryMapping: SubcategoryMapping = {\n take_action_now: '',\n bills_and_subscriptions: '',\n current_spending: '',\n savings_and_optimization: '',\n credit_and_debt_management: '',\n planning_and_goal_setting: '',\n inform_me: '',\n }\n\n beatTemplatesWithCategories.forEach((template) => {\n template.categories.forEach((category) => {\n const {\n category_key,\n category: categoryName,\n subcategory_key,\n subcategory: subcategoryName,\n } = category\n categoryMapping[category_key] = categoryName\n subcategoryMapping[subcategory_key] = subcategoryName\n })\n })\n\n return [categoryMapping, subcategoryMapping]\n}\n\n// Organize beats into the sorted structure\nconst organizeBeatsForUIStructure = (beatTemplatesWithCategories: DisabledBeatTemplate[]) => {\n // Initialize the sorted beats structure based on UI requirements --\n // both categories and subcategoires are in a specifically required order\n const beatCategoryStructure: BeatCategory[] = [\n {\n key: 'spending',\n subcategories: [\n { key: 'take_action_now', beats: [] },\n { key: 'bills_and_subscriptions', beats: [] },\n { key: 'current_spending', beats: [] },\n ],\n },\n {\n key: 'saving',\n subcategories: [{ key: 'savings_and_optimization', beats: [] }],\n },\n {\n key: 'borrowing',\n subcategories: [{ key: 'credit_and_debt_management', beats: [] }],\n },\n {\n key: 'planning',\n subcategories: [\n { key: 'planning_and_goal_setting', beats: [] },\n { key: 'inform_me', beats: [] },\n ],\n },\n ]\n\n beatTemplatesWithCategories.forEach((template) => {\n template.categories.forEach((category) => {\n const { category_key, subcategory_key } = category\n const sortedCategory = beatCategoryStructure.find((cat) => cat.key === category_key)\n if (sortedCategory) {\n const sortedSubcategory = sortedCategory.subcategories.find(\n (subcat) => subcat.key === subcategory_key,\n )\n if (sortedSubcategory) {\n sortedSubcategory.beats.push(template)\n }\n }\n })\n })\n\n return beatCategoryStructure\n}\n\nexport const organizeBeats = (beatTemplatesWithCategories: DisabledBeatTemplate[]) => {\n // Map the category keys to their translated names\n const [translatedCats, translatedSubCats] = createTranslationMappings(beatTemplatesWithCategories)\n\n // Map the beats to the corresponding category/subcategory by key\n const categorizedBeats = organizeBeatsForUIStructure(beatTemplatesWithCategories)\n const beatsAndCategories: [BeatCategory[], CategoryMapping, SubcategoryMapping] = [\n categorizedBeats,\n translatedCats,\n translatedSubCats,\n ]\n\n return beatsAndCategories\n}\n","import React, { useEffect } from 'react'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\nimport ListItem from '@mui/material/ListItem'\nimport ListItemButton from '@mui/material/ListItemButton'\nimport ListItemText from '@mui/material/ListItemText'\nimport LoadingButton from '@mui/lab/LoadingButton'\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\nimport VisibilityOffOutlinedIcon from '@mui/icons-material/VisibilityOffOutlined'\n\nimport { Icon } from '@kyper/mui'\n\nimport Drawer from '../../../../common/components/drawer/Drawer'\nimport Toast from '../../components/Toast'\nimport PulseSubheaderRow from '../../components/PulseSubheaderRow'\nimport { usePrevious } from '../../../../common/hooks/usePrevious'\nimport { CategoryEmptyState } from './CategoryEmptyState'\nimport { SubCategoryDrawer } from './SubCategoryDrawer'\nimport SettingsItem from '../../components/SettingsItem'\n\nimport { organizeBeats } from '../../../utils/beatTemplateCategories'\n\nimport {\n CategoryMapping,\n BeatCategory,\n SubcategoryMapping,\n SettingsMenuContent,\n DisabledBeatTemplatesStore,\n} from '../types'\nimport { useToast } from '../../../contexts/ToastContext'\n\ninterface Props {\n content: SettingsMenuContent\n disabledBeatTemplatesStore: DisabledBeatTemplatesStore\n}\n\nexport const HiddenInsightsDrawer: React.FC<Props> = ({ content, disabledBeatTemplatesStore }) => {\n const {\n items: disabledBeatTemplates,\n update: handleEnableBeatTemplates,\n isUpdateError,\n isUpdateLoading,\n } = disabledBeatTemplatesStore\n\n const [sortedBeats, translatedCategories, translatedSubcategories]: [\n BeatCategory[],\n CategoryMapping,\n SubcategoryMapping,\n ] = organizeBeats(disabledBeatTemplates)\n\n const { toastState, showToast, hideToast, setMessage } = useToast()\n const [isSubCatDrawerOpen, setIsSubCatDrawerOpen] = React.useState(false)\n const [isSubCategoryDrawerOpen, setIsSubCategoryDrawerOpen] = React.useState(false)\n const [selectedCategory, setSelectedCategory] = React.useState<string>('')\n const [selectedSubCategory, setSelectedSubCategory] = React.useState<string>('')\n const prevUpdateLoading = usePrevious(isUpdateLoading)\n\n useEffect(() => {\n //check if an update request was made\n //otherwise if drawer opens with old api request state it will fire a toast\n if (prevUpdateLoading && !isUpdateLoading) {\n if (isUpdateError) {\n showToast(content.something_went_wrong, 'error')\n } else {\n showToast(undefined, 'success')\n }\n }\n }, [prevUpdateLoading, isUpdateError])\n\n const handleUnhideAllInsights = () => {\n setMessage(\n disabledBeatTemplates.length > 1 ? content.insights_unhidden : content.insight_unhidden,\n )\n handleEnableBeatTemplates(disabledBeatTemplates.map((beat) => beat.name))\n }\n\n const handleOpenSubcategoryDrawer = (category: string, subcategory: string) => {\n setIsSubCategoryDrawerOpen(true)\n setSelectedCategory(category)\n setSelectedSubCategory(subcategory)\n }\n\n const handleCloseSubCategoryDrawer = () => {\n setIsSubCategoryDrawerOpen(false)\n setSelectedSubCategory('')\n setSelectedCategory('')\n }\n\n const handleEnableBeatTemplatesFromSubcategory = (\n templateNames: string[],\n shouldCloseDrawer: boolean,\n ) => {\n handleEnableBeatTemplates(templateNames)\n\n if (shouldCloseDrawer) {\n setIsSubCategoryDrawerOpen(false)\n }\n\n setMessage(templateNames.length > 1 ? content.insights_unhidden : content.insight_unhidden)\n }\n\n return (\n <>\n <SettingsItem\n Icon={VisibilityOffOutlinedIcon}\n itemCount={disabledBeatTemplates.length}\n label={content.manage_hidden_insights}\n onClick={() => setIsSubCatDrawerOpen(true)}\n />\n <Drawer\n ariaLabelClose={content.close}\n isOpen={isSubCatDrawerOpen}\n onClose={() => setIsSubCatDrawerOpen(false)}\n shouldShowHeaderBorders={false}\n sx={{\n '& .MuiDrawer-paper': {\n backgroundColor: 'background.white',\n },\n }}\n title={content.manage_hidden_insights}\n >\n <Divider />\n <Stack height=\"calc(100vh - 61px)\">\n {disabledBeatTemplates.length > 0 ? (\n <List sx={{ height: '100%' }}>\n {sortedBeats.map(\n (category) =>\n translatedCategories[category.key] !== '' && (\n <List\n key={category.key}\n subheader={\n <PulseSubheaderRow>{translatedCategories[category.key]}</PulseSubheaderRow>\n }\n >\n {category.subcategories.map(\n (subcategory, i) =>\n subcategory.beats.length > 0 && (\n <Box key={subcategory.key}>\n <ListItem disablePadding={true}>\n <ListItemButton\n onClick={() =>\n handleOpenSubcategoryDrawer(category.key, subcategory.key)\n }\n >\n <ListItemText\n primary={translatedSubcategories[subcategory.key].replace(\n /&/g,\n '&',\n )}\n secondary={\n <React.Fragment>\n {subcategory.beats.length}{' '}\n {subcategory.beats.length > 1\n ? content.insights_hidden\n : content.insight_hidden}\n </React.Fragment>\n }\n />\n <Icon name=\"chevron_right\" size={24} />\n </ListItemButton>\n </ListItem>\n <Divider\n sx={{ ml: i < category.subcategories.length - 1 ? 24 : 0 }}\n />\n </Box>\n ),\n )}\n </List>\n ),\n )}\n </List>\n ) : (\n <CategoryEmptyState content={content} />\n )}\n {/* Todo remove border-box after pulse has CSSbaseline */}\n <Box boxSizing=\"border-box\" pb={32} pt={24} px={24}>\n {disabledBeatTemplates.length > 0 && (\n <LoadingButton\n color=\"primary\"\n fullWidth={true}\n loading={isUpdateLoading}\n onClick={handleUnhideAllInsights}\n variant=\"contained\"\n >\n {content.show_all_hidden_insights}\n </LoadingButton>\n )}\n <Toast\n handleClose={hideToast}\n message={toastState.message}\n open={toastState.isOpen}\n severity={toastState.severity}\n snackbarSx={{\n boxSizing: 'border-box',\n position: 'absolute',\n '&.MuiSnackbar-root': { bottom: '24px', left: 0, right: 0, justifySelf: 'center' },\n }}\n />\n </Box>\n </Stack>\n <SubCategoryDrawer\n content={content}\n disabledBeatTemplates={\n selectedSubCategory !== ''\n ? sortedBeats\n .filter((category) => category.key === selectedCategory)[0]\n .subcategories.filter((subcategory) => subcategory.key === selectedSubCategory)[0]\n .beats\n : []\n }\n handleEnableBeatTemplates={handleEnableBeatTemplatesFromSubcategory}\n isOpen={isSubCategoryDrawerOpen}\n isUpdateLoading={isUpdateLoading}\n onClose={handleCloseSubCategoryDrawer}\n translatedSubCatetgory={translatedSubcategories[selectedSubCategory]}\n />\n </Drawer>\n </>\n )\n}\n","import React from 'react'\n\nimport { ToastProvider } from '../../../contexts/ToastContext'\nimport { HiddenInsightsDrawer } from './HiddenInsightsDrawer'\nimport { SettingsMenuContent, DisabledBeatTemplatesStore } from '../types'\n\ninterface Props {\n content: SettingsMenuContent\n disabledBeatTemplatesStore: DisabledBeatTemplatesStore\n}\n\nexport const HiddenInsightsDrawerWrapper: React.FC<Props> = ({\n content,\n disabledBeatTemplatesStore,\n}) => {\n return (\n <ToastProvider>\n <HiddenInsightsDrawer\n content={content}\n disabledBeatTemplatesStore={disabledBeatTemplatesStore}\n />\n </ToastProvider>\n )\n}\n","import React from 'react'\n\nimport Divider from '@mui/material/Divider'\nimport List from '@mui/material/List'\n\nimport { Drawer } from '../../common/components'\n\nimport type { SettingsMenuContent } from './hiddeninsights/types'\n\n//TODO get content from content store instead of as a prop from pulse\ninterface Props {\n children?: React.ReactNode\n content: SettingsMenuContent\n isOpen: boolean\n onClose: () => void\n}\n\nconst SettingsDrawer: React.FC<Props> = ({\n children,\n content,\n isOpen = false,\n onClose = () => {},\n}) => {\n return (\n <Drawer\n ariaLabelClose={content.close}\n isOpen={isOpen}\n onClose={onClose}\n shouldShowHeaderBorders={false}\n title={content.settings}\n >\n <List>\n <Divider />\n {children}\n </List>\n </Drawer>\n )\n}\n\nexport default SettingsDrawer\n","import { makeAutoObservable, runInAction } from 'mobx'\nimport { GlobalCopyApi, type MicroInsightsCopy } from '../../common'\n\nexport class CopyStore {\n copyApi: GlobalCopyApi = new GlobalCopyApi('/', '')\n copyObject: MicroInsightsCopy = {} as MicroInsightsCopy\n namespace = 'experiences'\n translationKey = 'micro_insights'\n\n constructor() {\n makeAutoObservable(this)\n }\n\n initialize = async (endpoint: string, token: string) => {\n this.copyApi = new GlobalCopyApi(endpoint, token)\n await this.loadCopy()\n }\n\n loadCopy = async () => {\n const copy = await this.copyApi.getGlobalCopy(this.namespace, this.translationKey)\n\n runInAction(() => {\n this.copyObject = copy[this.translationKey]\n })\n }\n\n get cardsCopy(): any {\n return this.copyObject.cards\n }\n\n get carouselCopy(): any {\n return this.copyObject.carousel\n }\n\n get zeroStateCopy(): any {\n return this.copyObject.zero_state\n }\n}\n","import type { BasicAnalyticsEvent } from '../../common'\n\nexport const TEMPLATE_NAMES = {\n BillAmountNotStandard: 'BillAmountNotStandard',\n CanadianUpcomingDeadlineAlert: 'CanadianUpcomingDeadlineAlert',\n DuplicatePaymentV2: 'DuplicatePaymentV2',\n IntroducePulse: 'IntroducePulse',\n LargeTransaction: 'LargeTransaction',\n MonthlySpendToIncomeComparisonV2: 'MonthlySpendToIncomeComparisonV2',\n QuarterlySummary: 'QuarterlySummary',\n SpendingPlanCategorySpending: 'SpendingPlanCategorySpending',\n SubscriptionPriceIncrease: 'SubscriptionPriceIncrease',\n UncategorizedTransactionsV2: 'UncategorizedTransactionsV2',\n UpcomingBill: 'UpcomingBill',\n UnifiedDeposit: 'UnifiedDeposit',\n WeeklySpendingPlanSummary: 'WeeklySpendingPlanSummary',\n WeeklyNewMerchantsV2: 'WeeklyNewMerchantsV2',\n MonthlySpendComparison: 'MonthlySpendComparison',\n MonthlySpendToIncomeComparison: 'MonthlySpendToIncomeComparison',\n}\n\nconst instanceId = (window as any)?.app?.clientConfig?.microwidget_instance_id || ''\n\nconst PATHS = {\n INSIGHTS_MICRO_WIDGET: '/micro-insights-carousel',\n}\n\nexport const ON_CLICK_EVENT = (name: string) => `on${name}Click`\nexport const ON_VIEW_EVENT = (name: string) => `on${name}View`\nexport const ON_VIEW_FIRST_TIME_EVENT = (name: string) => `on${name}ViewFirstTime`\nexport const readableTemplateName = (name: string) => name.replace(/([a-z])([A-Z])/g, '$1 $2')\nexport const onBeatClickedEvents = () => {\n return Object.values(TEMPLATE_NAMES).reduce(\n (acc, name) => ({\n ...acc,\n [ON_CLICK_EVENT(name)]: {\n action: ANALYTICS_ACTIONS.MICRO_BEAT_CLICKED,\n category: ANALYTICS_CATEGORIES.BEAT_INTERACTION,\n label: readableTemplateName(name),\n value: instanceId,\n },\n }),\n {},\n ) as Record<keyof AnalyticsEventsType, string>\n}\n\nexport const onBeatDisplayedEvents = () => {\n return Object.values(TEMPLATE_NAMES).reduce(\n (acc, name) => ({\n ...acc,\n [ON_VIEW_EVENT(name)]: {\n action: ANALYTICS_ACTIONS.MICRO_BEAT_DISPLAYED,\n category: ANALYTICS_CATEGORIES.BEAT_INTERACTION,\n label: readableTemplateName(name),\n value: instanceId,\n },\n }),\n {},\n ) as Record<keyof AnalyticsEventsType, string>\n}\n\nexport const onBeatDisplayedForFirstTimeEvents = () => {\n return Object.values(TEMPLATE_NAMES).reduce(\n (acc, name) => ({\n ...acc,\n [ON_VIEW_FIRST_TIME_EVENT(name)]: {\n action: ANALYTICS_ACTIONS.MICRO_BEAT_DISPLAYED_FIRST_TIME,\n category: ANALYTICS_CATEGORIES.BEAT_INTERACTION,\n label: readableTemplateName(name),\n value: instanceId,\n },\n }),\n {},\n ) as Record<keyof AnalyticsEventsType, string>\n}\n\nexport const ANALYTICS_LABELS = {\n CARD: 'Card',\n CAROUSEL_CONTROL: 'Carousel Control',\n MICRO_WIDGET: 'Micro Widget',\n VIEW_MORE: 'View More',\n}\n\nexport const ANALYTICS_CATEGORIES = {\n MICRO_WIDGET_INTERACTION: 'Micro Widget Interaction',\n BEAT_INTERACTION: 'Beat Interaction',\n}\n\nexport const ANALYTICS_CLICK_EVENTS = {\n ON_CAROUSEL_BACK_CLICK: 'onCarouselBackClick',\n ON_CAROUSEL_BACK_SWIPE: 'onCarouselBackSwipe',\n ON_CAROUSEL_FORWARD_CLICK: 'onCarouselForwardClick',\n ON_CAROUSEL_FORWARD_SWIPE: 'onCarouselForwardSwipe',\n ON_NO_RELEVANT_INSIGHTS_CLICKED: 'onNoRelevantInsightsClicked',\n ON_VIEW_MORE_CLICKED: 'onViewMoreClicked',\n}\n\nexport const ANALYTICS_VIEW_EVENTS = {\n ON_VIEW_MORE_VIEWED: 'onViewMoreCardView',\n}\n\nexport const ANALYTICS_ACTIONS = {\n CONTROL_BACKWARD: 'Control Backward',\n CONTROL_FORWARD: 'Control Forward',\n MICRO_BEAT_CLICKED: 'Micro Beat Clicked',\n MICRO_BEAT_DISPLAYED: 'Micro Beat Displayed',\n MICRO_BEAT_DISPLAYED_FIRST_TIME: 'Micro Beat Displayed For First Time',\n SWIPE_BACKWARD: 'Swipe Backward',\n SWIPE_FORWARD: 'Swipe Forward',\n}\n\nexport const ANALYTICS_PAGE_NAMES = {\n MICRO_WIDGET_CAROUSEL: 'Micro Widget Carousel',\n MICRO_WIDGET_CAROUSEL_ZERO_STATE: 'Micro Widget Carousel Zero State',\n MICRO_WIDGET_CAROUSEL_NO_RELEVANT_INSIGHTS: 'Micro Widget Carousel No Relevant Insights',\n}\n\nexport const ANALYTICS_PAGEVIEWS = {\n [ANALYTICS_PAGE_NAMES.MICRO_WIDGET_CAROUSEL]: {\n label: ANALYTICS_LABELS.MICRO_WIDGET,\n name: ANALYTICS_PAGE_NAMES.MICRO_WIDGET_CAROUSEL,\n path: PATHS.INSIGHTS_MICRO_WIDGET,\n value: instanceId,\n },\n // zero state\n [ANALYTICS_PAGE_NAMES.MICRO_WIDGET_CAROUSEL_ZERO_STATE]: {\n label: ANALYTICS_LABELS.MICRO_WIDGET,\n name: ANALYTICS_PAGE_NAMES.MICRO_WIDGET_CAROUSEL_ZERO_STATE,\n path: PATHS.INSIGHTS_MICRO_WIDGET,\n value: instanceId,\n },\n // no relevant cards\n [ANALYTICS_PAGE_NAMES.MICRO_WIDGET_CAROUSEL_NO_RELEVANT_INSIGHTS]: {\n label: ANALYTICS_LABELS.MICRO_WIDGET,\n name: ANALYTICS_PAGE_NAMES.MICRO_WIDGET_CAROUSEL_NO_RELEVANT_INSIGHTS,\n path: '/micro-widget',\n value: instanceId,\n },\n}\n\nexport const ANALYTICS_EVENTS = {\n // carousel control interaction events - clicks and swipes\n [ANALYTICS_CLICK_EVENTS.ON_CAROUSEL_BACK_CLICK]: {\n action: ANALYTICS_ACTIONS.CONTROL_BACKWARD,\n category: ANALYTICS_CATEGORIES.MICRO_WIDGET_INTERACTION,\n label: ANALYTICS_LABELS.CAROUSEL_CONTROL,\n value: instanceId,\n },\n [ANALYTICS_CLICK_EVENTS.ON_CAROUSEL_FORWARD_CLICK]: {\n action: ANALYTICS_ACTIONS.CONTROL_FORWARD,\n category: ANALYTICS_CATEGORIES.MICRO_WIDGET_INTERACTION,\n label: ANALYTICS_LABELS.CAROUSEL_CONTROL,\n value: instanceId,\n },\n [ANALYTICS_CLICK_EVENTS.ON_CAROUSEL_BACK_SWIPE]: {\n action: ANALYTICS_ACTIONS.SWIPE_BACKWARD,\n category: ANALYTICS_CATEGORIES.MICRO_WIDGET_INTERACTION,\n label: ANALYTICS_LABELS.CAROUSEL_CONTROL,\n value: instanceId,\n },\n [ANALYTICS_CLICK_EVENTS.ON_CAROUSEL_FORWARD_SWIPE]: {\n action: ANALYTICS_ACTIONS.SWIPE_FORWARD,\n category: ANALYTICS_CATEGORIES.MICRO_WIDGET_INTERACTION,\n label: ANALYTICS_LABELS.CAROUSEL_CONTROL,\n value: instanceId,\n },\n // read more card events\n [ANALYTICS_CLICK_EVENTS.ON_VIEW_MORE_CLICKED]: {\n action: ANALYTICS_ACTIONS.MICRO_BEAT_CLICKED,\n category: ANALYTICS_CATEGORIES.BEAT_INTERACTION,\n label: ANALYTICS_LABELS.VIEW_MORE,\n value: instanceId,\n },\n [ANALYTICS_VIEW_EVENTS.ON_VIEW_MORE_VIEWED]: {\n action: ANALYTICS_ACTIONS.MICRO_BEAT_DISPLAYED,\n category: ANALYTICS_CATEGORIES.BEAT_INTERACTION,\n label: ANALYTICS_LABELS.VIEW_MORE,\n value: instanceId,\n },\n\n ...onBeatClickedEvents(),\n ...onBeatDisplayedEvents(),\n ...onBeatDisplayedForFirstTimeEvents(),\n}\n\nexport interface AnalyticsEventsObjectType extends BasicAnalyticsEvent {\n value: string\n}\n\nexport type AnalyticsEventsType = {\n [key: string]: AnalyticsEventsObjectType\n}\n","import { analyticsSession } from '../common'\nimport { AnalyticsPageviewObjectType } from '../common/types/Analytics'\n\nimport { ANALYTICS_EVENTS, ANALYTICS_PAGEVIEWS } from './constants/Analytics'\nimport type { AnalyticsEventsObjectType } from './constants/Analytics'\n\nexport type AnalyticSession = Awaited<ReturnType<typeof analyticsSession>>\n\nexport const onAnalyticEvent = async (event: string, session: AnalyticSession) => {\n if (!session || !ANALYTICS_EVENTS[event]) return null\n\n return session\n .sendAnalyticEvent(ANALYTICS_EVENTS[event] as AnalyticsEventsObjectType)\n .then((response) => response)\n .catch((error) => {\n throw error\n })\n}\n\nexport const onAnalyticPageView = async (page: string, session: AnalyticSession) => {\n if (!session || !ANALYTICS_PAGEVIEWS[page]) {\n return null\n }\n\n return session\n .sendAnalyticsPageview(ANALYTICS_PAGEVIEWS[page] as AnalyticsPageviewObjectType)\n .then((response) => response)\n .catch((error) => {\n throw error\n })\n}\n","import { type AnalyticSession, onAnalyticEvent, onAnalyticPageView } from '../analytics'\nimport { BeatApi } from '../../common/api/BeatApi'\nimport type { Beat } from '../../common'\nimport { makeAutoObservable } from 'mobx'\n\nexport interface ErrPromise<TSuccess, TError = unknown> {\n then<TResult1 = TSuccess, TResult2 = never>(\n onfulfilled?: ((value: TSuccess) => TResult1 | PromiseLike<TResult1>) | undefined | null,\n onrejected?: ((reason: TError) => TResult2 | PromiseLike<TResult2>) | undefined | null,\n ): Promise<TResult1 | TResult2>\n catch<TResult = never>(\n onrejected?: ((reason: TError) => TResult | PromiseLike<TResult>) | undefined | null,\n ): Promise<TSuccess | TResult>\n}\n\nexport class InsightsMicroWidgetStore {\n onAnalyticEvent: (\n event: string,\n session: AnalyticSession,\n ) => ErrPromise<string, AnalyticSession> = onAnalyticEvent\n onAnalyticPageView: (\n event: string,\n session: AnalyticSession,\n ) => ErrPromise<string, AnalyticSession> = onAnalyticPageView\n\n beatApi = new BeatApi('/', '')\n\n constructor() {\n makeAutoObservable(this)\n }\n\n initialize = async (endpoint: string, token: string, logOutUser: () => void) => {\n this.onAnalyticEvent = (event: string, session: AnalyticSession): any => {\n onAnalyticEvent(event, session)\n .then((res) => res)\n .catch((err) => {\n if (err.status === 401) {\n logOutUser()\n }\n throw err\n })\n }\n\n this.onAnalyticPageView = (page: string, session: AnalyticSession): any => {\n onAnalyticPageView(page, session)\n .then((res) => res)\n .catch((err) => {\n if (err.status === 401) {\n logOutUser()\n }\n throw err\n })\n }\n\n this.beatApi = new BeatApi(endpoint, token)\n }\n\n updateBeat = async (beat: Beat) => {\n this.beatApi.updateBeat(beat)\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\n\nimport { analyticsSession } from '../../common'\n\nimport { CopyStore } from './CopyStore'\nimport { InsightsMicroWidgetStore } from './InsightsMicroWidgetStore'\n\nimport type { AnalyticSession } from '../analytics'\n\nexport class AppStore {\n copyStore\n endpoint = '/'\n insightsMicroWidgetStore\n session: AnalyticSession | null = null\n token = ''\n\n isInitialized = false\n\n constructor() {\n this.copyStore = new CopyStore()\n this.insightsMicroWidgetStore = new InsightsMicroWidgetStore()\n makeAutoObservable(this)\n }\n\n initialize = async (endpoint: string, token: string, logOutUser: () => void) => {\n await this.copyStore.initialize(endpoint, token)\n await this.insightsMicroWidgetStore.initialize(endpoint, token, logOutUser)\n this.session = await analyticsSession(endpoint, token, '1.0.0', 'Micro Insights Carousel')\n\n runInAction(() => {\n this.isInitialized = true\n })\n }\n}\n","import React from 'react'\n\nimport type { AppStore } from '../stores/AppStore'\n\nexport interface InsightsMicroWidgetContextTypes {\n children: React.ReactNode\n onEvent: (event: string, props?: object) => void\n onPageview: (page: string) => void\n store: AppStore\n}\n\nexport const InsightsMicroWidgetDataContext =\n React.createContext<InsightsMicroWidgetContextTypes | null>(null)\n\nexport const InsightsMicroWidgetDataProvider: React.FC<InsightsMicroWidgetContextTypes> = ({\n onEvent,\n onPageview,\n store,\n children,\n}) => (\n <InsightsMicroWidgetDataContext.Provider value={{ onEvent, onPageview, store, children }}>\n {children}\n </InsightsMicroWidgetDataContext.Provider>\n)\n","import { FC, useEffect, useState } from 'react'\n\nimport { CategoryIcon } from '@kyper/mui'\n\nimport { BeatUIComponent } from '../../types/BeatUIComponent'\nimport { CategoryGuids } from '../../../common'\n\nexport const BeatCategoryIcon: FC<BeatUIComponent> = ({ beat }) => {\n const [categoryGuid, setCategoryGuid] = useState<string>(CategoryGuids.UNCATEGORIZED)\n\n useEffect(() => {\n if (beat.primary_category_guid) {\n setCategoryGuid(beat.primary_category_guid)\n } else if (beat.category_guids?.length) {\n setCategoryGuid(beat.category_guids[0])\n }\n }, [])\n\n return <CategoryIcon categoryGuid={categoryGuid} size={16} sx={{ minWidth: 16 }} />\n}\n","import { FC } from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport { css } from '@mxenabled/cssinjs'\nimport { useTokens, MerchantLogo } from '@kyper/mui'\n\nimport { BeatUIComponent } from '../../types/BeatUIComponent'\n\nconst BeatMerchantLogo: FC<BeatUIComponent> = ({ beat }) => {\n const tokens = useTokens()\n const styles = getStyles(tokens)\n\n return (\n <MerchantLogo\n categoryGuid={\n beat.primary_category_guid || (beat.category_guids && beat.category_guids[0]) || ''\n }\n className={styles}\n merchantGuid={beat.primary_merchant_guid || beat.merchant_guids[0]}\n size={16}\n />\n )\n}\n\nconst getStyles = (tokens: any) =>\n css({\n marginTop: tokens.Spacing.XTiny,\n '& .kyper-categoryicon': {\n display: 'flex',\n },\n })\n\nexport default observer(BeatMerchantLogo)\n","import React from 'react'\n\ninterface ChartFilledIconProps {\n color?: string\n height?: number\n size?: number\n styles?: object\n viewBox?: string\n width?: number\n}\n\nexport const ChartFilledIcon: React.FC<ChartFilledIconProps> = ({\n color = 'currentColor',\n height,\n size = 16,\n styles,\n viewBox = '0 0 16 16',\n width,\n}) => {\n return (\n <svg\n aria-hidden={true}\n className=\"kyper-icon\"\n focusable={false}\n height={height || size}\n style={styles}\n viewBox={viewBox}\n width={width || size}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M16 1.5C16 0.671573 15.3284 0 14.5 0H1.5C0.671573 0 0 0.671573 0 1.5V14.5C0 15.3284 0.671573 16 1.5 16H14.5C15.3284 16 16 15.3284 16 14.5V1.5ZM12.8 5.1C13.0209 5.26568 13.0657 5.57909 12.9 5.8L9.90003 9.8C9.71746 10.0434 9.36163 10.0687 9.14648 9.85355L6.55413 7.2612L3.90003 10.8C3.73434 11.0209 3.42094 11.0657 3.20003 10.9C2.97912 10.7343 2.93434 10.4209 3.10003 10.2L6.10003 6.2C6.28259 5.95658 6.63843 5.93129 6.85358 6.14645L9.44593 8.7388L12.1 5.2C12.2657 4.97908 12.5791 4.93431 12.8 5.1Z\"\n fill={color}\n />\n </svg>\n )\n}\n","import { DataSeries } from '../../common'\n\nexport const buildDataSeries = (data: DataSeries | undefined) => {\n if (!data) {\n return []\n }\n\n if (data.data) {\n return data.data.map((d) => {\n const item: any = {}\n\n data.names?.map((name, index) => {\n item[name] = d[index]\n })\n return item\n })\n } else {\n return []\n }\n}\n","import { FC } from 'react'\nimport { Icon, useTokens } from '@kyper/mui'\n\nimport type { BeatUIComponent } from '../../types/BeatUIComponent'\nimport { DataSeries } from '../../../common'\nimport { buildDataSeries } from '../../utils/DataSeries'\n\nexport const getIconColor = (data: DataSeries | undefined, designTokens: any) => {\n const fullDataSeries = buildDataSeries(data)\n const chunkSize = fullDataSeries.length / 2\n\n const spendChunk = fullDataSeries.slice(0, chunkSize)\n const incomeChunk = fullDataSeries.slice(chunkSize)\n\n if (!spendChunk.length || !incomeChunk.length) return designTokens.Color.Primary300\n\n if (spendChunk[0].amount > incomeChunk[0].amount) {\n return designTokens.Color.Error300\n } else if (spendChunk[0].amount < incomeChunk[0].amount) {\n return designTokens.Color.Success300\n }\n\n return designTokens.Color.Primary300\n}\n\nexport const MonthlySpendComparisonIcon: FC<BeatUIComponent> = ({ beat }) => {\n const tokens = useTokens()\n const iconColor = getIconColor(beat.data_series, tokens)\n return <Icon name=\"bar_chart\" sx={{ color: iconColor }} />\n}\n","export const ZeroStateIcon = () => (\n <svg fill=\"none\" height=\"36\" viewBox=\"0 0 40 36\" width=\"40\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n clipRule=\"evenodd\"\n d=\"M24.9618 32.6003H9.92084C9.60559 32.6003 9.34766 32.3424 9.34766 32.0271V18.3125C9.34766 17.9972 9.60559 17.7393 9.92084 17.7393H24.9618C25.2771 17.7393 25.535 17.9972 25.535 18.3125V32.0271C25.535 32.3424 25.2771 32.6003 24.9618 32.6003Z\"\n fill=\"#CDD3DD\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M25.535 18.3124V19.5952H9.34766V18.3124C9.34766 17.9974 9.6055 17.7393 9.92084 17.7393H24.9618C25.2771 17.7393 25.535 17.9974 25.535 18.3124Z\"\n fill=\"#E8F6FF\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M10.8689 18.7157C10.8689 18.96 10.6709 19.158 10.4266 19.158C10.1824 19.158 9.98438 18.96 9.98438 18.7157C9.98438 18.4714 10.1824 18.2734 10.4266 18.2734C10.6709 18.2734 10.8689 18.4714 10.8689 18.7157Z\"\n fill=\"#C3E4FF\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M12.2986 18.7157C12.2986 18.96 12.1006 19.158 11.8563 19.158C11.6121 19.158 11.4141 18.96 11.4141 18.7157C11.4141 18.4714 11.6121 18.2734 11.8563 18.2734C12.1006 18.2734 12.2986 18.4714 12.2986 18.7157Z\"\n fill=\"#C3E4FF\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M13.7263 18.7157C13.7263 18.96 13.5283 19.158 13.2841 19.158C13.0398 19.158 12.8418 18.96 12.8418 18.7157C12.8418 18.4714 13.0398 18.2734 13.2841 18.2734C13.5283 18.2734 13.7263 18.4714 13.7263 18.7157Z\"\n fill=\"#C3E4FF\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M26.7313 35.6692H11.6904C11.3751 35.6692 11.1172 35.4112 11.1172 35.096V21.3813C11.1172 21.0661 11.3751 20.8081 11.6904 20.8081H26.7313C27.0466 20.8081 27.3045 21.0661 27.3045 21.3813V35.096C27.3045 35.4112 27.0466 35.6692 26.7313 35.6692Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M27.3045 21.3813V22.6641H11.1172V21.3813C11.1172 21.0662 11.375 20.8081 11.6904 20.8081H26.7313C27.0467 20.8081 27.3045 21.0662 27.3045 21.3813Z\"\n fill=\"#E8F6FF\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M12.6404 21.7846C12.6404 22.0288 12.4424 22.2268 12.1981 22.2268C11.9539 22.2268 11.7559 22.0288 11.7559 21.7846C11.7559 21.5403 11.9539 21.3423 12.1981 21.3423C12.4424 21.3423 12.6404 21.5403 12.6404 21.7846Z\"\n fill=\"#C3E4FF\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M14.0701 21.7846C14.0701 22.0288 13.8721 22.2268 13.6278 22.2268C13.3836 22.2268 13.1855 22.0288 13.1855 21.7846C13.1855 21.5403 13.3836 21.3423 13.6278 21.3423C13.8721 21.3423 14.0701 21.5403 14.0701 21.7846Z\"\n fill=\"#C3E4FF\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M15.4959 21.7846C15.4959 22.0288 15.2979 22.2268 15.0536 22.2268C14.8094 22.2268 14.6113 22.0288 14.6113 21.7846C14.6113 21.5403 14.8094 21.3423 15.0536 21.3423C15.2979 21.3423 15.4959 21.5403 15.4959 21.7846Z\"\n fill=\"#C3E4FF\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M38.0145 25.175H22.9736C22.6584 25.175 22.4004 24.9171 22.4004 24.6018V10.8871C22.4004 10.5719 22.6584 10.314 22.9736 10.314H38.0145C38.3298 10.314 38.5878 10.5719 38.5878 10.8871V24.6018C38.5878 24.9171 38.3298 25.175 38.0145 25.175Z\"\n fill=\"#EEF1F6\"\n fillRule=\"evenodd\"\n />\n <mask height=\"3\" id=\"mask0_1565_98011\" maskUnits=\"userSpaceOnUse\" width=\"17\" x=\"22\" y=\"10\">\n <path\n clipRule=\"evenodd\"\n d=\"M22.4004 10.3022H38.5878V12.1582H22.4004V10.3022Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n </mask>\n <g mask=\"url(#mask0_1565_98011)\">\n <path\n clipRule=\"evenodd\"\n d=\"M38.5878 10.8754V12.1582H22.4004V10.8754C22.4004 10.5604 22.6582 10.3022 22.9736 10.3022H38.0146C38.3299 10.3022 38.5878 10.5604 38.5878 10.8754Z\"\n fill=\"#CDD3DD\"\n fillRule=\"evenodd\"\n />\n </g>\n <path\n clipRule=\"evenodd\"\n d=\"M23.9099 11.2802C23.9099 11.5244 23.7119 11.7224 23.4677 11.7224C23.2234 11.7224 23.0254 11.5244 23.0254 11.2802C23.0254 11.0359 23.2234 10.8379 23.4677 10.8379C23.7119 10.8379 23.9099 11.0359 23.9099 11.2802Z\"\n fill=\"#C3E4FF\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M25.3377 11.2802C25.3377 11.5244 25.1397 11.7224 24.8954 11.7224C24.6511 11.7224 24.4531 11.5244 24.4531 11.2802C24.4531 11.0359 24.6511 10.8379 24.8954 10.8379C25.1397 10.8379 25.3377 11.0359 25.3377 11.2802Z\"\n fill=\"#C3E4FF\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M26.7654 11.2802C26.7654 11.5244 26.5674 11.7224 26.3231 11.7224C26.0789 11.7224 25.8809 11.5244 25.8809 11.2802C25.8809 11.0359 26.0789 10.8379 26.3231 10.8379C26.5674 10.8379 26.7654 11.0359 26.7654 11.2802Z\"\n fill=\"#C3E4FF\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M29.1719 27.6866H32.7022V27.0142H29.1719V27.6866Z\"\n fill=\"#C3E4FF\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M29.1719 28.6871H39.2264V28.3726H29.1719V28.6871Z\"\n fill=\"#EEF1F6\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M29.1719 30.5064H39.5626V30.1919H29.1719V30.5064Z\"\n fill=\"#EEF1F6\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M29.1719 31.4156H40.0029V31.1011H29.1719V31.4156Z\"\n fill=\"#EEF1F6\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M29.1719 32.3253H35.7521V32.0107H29.1719V32.3253Z\"\n fill=\"#EEF1F6\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M29.1719 29.5953H40.0029V29.2808H29.1719V29.5953Z\"\n fill=\"#EEF1F6\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M9.98438 11.9322H13.1338V11.2598H9.98438V11.9322Z\"\n fill=\"#C3E4FF\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M9.98438 12.9327H18.954V12.6182H9.98438V12.9327Z\"\n fill=\"#D6EEFF\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M9.98438 14.7506H19.254V14.436H9.98438V14.7506Z\"\n fill=\"#D6EEFF\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M9.98438 15.6602H16.8127V15.3457H9.98438V15.6602Z\"\n fill=\"#D6EEFF\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M9.98438 13.8409H19.6468V13.5264H9.98438V13.8409Z\"\n fill=\"#D6EEFF\"\n fillRule=\"evenodd\"\n />\n <g filter=\"url(#filter0_d_1565_98011)\">\n <mask height=\"22\" id=\"mask1_1565_98011\" maskUnits=\"userSpaceOnUse\" width=\"17\" x=\"16\" y=\"12\">\n <path\n clipRule=\"evenodd\"\n d=\"M16.5098 12.2725H32.8412V33.707H16.5098V12.2725Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n </mask>\n <g mask=\"url(#mask1_1565_98011)\">\n <path\n clipRule=\"evenodd\"\n d=\"M32.3427 33.707H17.0083C16.7341 33.707 16.5098 33.4827 16.5098 33.2086V12.7709C16.5098 12.4968 16.7341 12.2725 17.0083 12.2725H32.3427C32.6169 12.2725 32.8412 12.4968 32.8412 12.7709V33.2086C32.8412 33.4827 32.6169 33.707 32.3427 33.707Z\"\n fill=\"white\"\n fillRule=\"evenodd\"\n />\n </g>\n <path\n clipRule=\"evenodd\"\n d=\"M20.875 21.5786H31.134V21.1816H20.875V21.5786Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M20.875 22.4077H28.1023V22.0107H20.875V22.4077Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M20.875 31.8461H27.8799V31.3003H20.875V31.8461Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M18.7308 22.7869C18.1849 22.7869 17.7383 22.3404 17.7383 21.7946C17.7383 21.2488 18.1849 20.8022 18.7308 20.8022C19.2767 20.8022 19.7233 21.2488 19.7233 21.7946C19.7233 22.3404 19.2767 22.7869 18.7308 22.7869Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n stroke=\"#E4E8EE\"\n strokeWidth=\"0.176004\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M18.7308 29.3841C18.1849 29.3841 17.7383 28.9375 17.7383 28.3917C17.7383 27.8459 18.1849 27.3994 18.7308 27.3994C19.2767 27.3994 19.7233 27.8459 19.7233 28.3917C19.7233 28.9375 19.2767 29.3841 18.7308 29.3841Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n stroke=\"#E4E8EE\"\n strokeWidth=\"0.176004\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M18.7308 26.0862C18.1849 26.0862 17.7383 25.6397 17.7383 25.0939C17.7383 24.5481 18.1849 24.1016 18.7308 24.1016C19.2767 24.1016 19.7233 24.5481 19.7233 25.0939C19.7233 25.6397 19.2767 26.0862 18.7308 26.0862Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n stroke=\"#E4E8EE\"\n strokeWidth=\"0.176004\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M20.875 24.8764H31.134V24.4795H20.875V24.8764Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M20.875 25.707H28.1023V25.3101H20.875V25.707Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M20.875 28.1758H31.134V27.7788H20.875V28.1758Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M20.875 29.0049H28.1023V28.6079H20.875V29.0049Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M17.7383 18.0811L18.4668 18.657L19.758 17.1641\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path\n d=\"M17.7383 18.0811L18.4668 18.657L19.758 17.1641\"\n stroke=\"#E4E8EE\"\n strokeWidth=\"0.264005\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M17.7383 14.7823L18.4668 15.3582L19.758 13.8652\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path\n d=\"M17.7383 14.7823L18.4668 15.3582L19.758 13.8652\"\n stroke=\"#E4E8EE\"\n strokeWidth=\"0.264005\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M20.875 14.3389H31.134V13.8369H20.875V14.3389Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M20.875 15.3878H28.1023V14.8857H20.875V15.3878Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M20.4648 14.0869H31.545H20.4648Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path d=\"M20.4648 14.0869H31.545\" stroke=\"#E4E8EE\" strokeWidth=\"0.0880018\" />\n <path\n clipRule=\"evenodd\"\n d=\"M20.4648 15.1372H28.4939H20.4648Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path d=\"M20.4648 15.1372H28.4939\" stroke=\"#E4E8EE\" strokeWidth=\"0.0880018\" />\n <path\n clipRule=\"evenodd\"\n d=\"M20.875 17.6368H31.134V17.1348H20.875V17.6368Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M20.875 18.6861H28.1023V18.1841H20.875V18.6861Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M20.4648 17.3858H31.545H20.4648Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path d=\"M20.4648 17.3858H31.545\" stroke=\"#E4E8EE\" strokeWidth=\"0.0880018\" />\n <path\n clipRule=\"evenodd\"\n d=\"M20.4648 18.4356H28.4939H20.4648Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path d=\"M20.4648 18.4356H28.4939\" stroke=\"#E4E8EE\" strokeWidth=\"0.0880018\" />\n <path\n clipRule=\"evenodd\"\n d=\"M18.2832 19.8984H31.0117H18.2832Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path d=\"M18.2832 19.8984H31.0117\" stroke=\"#E4E8EE\" strokeWidth=\"0.0880018\" />\n <path\n clipRule=\"evenodd\"\n d=\"M18.7295 30.8101V32.3377V30.8101Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path d=\"M18.7295 30.8101V32.3377\" stroke=\"#E4E8EE\" strokeWidth=\"0.264005\" />\n <path\n clipRule=\"evenodd\"\n d=\"M17.9668 31.5737H19.4947H17.9668Z\"\n fill=\"#E4E8EE\"\n fillRule=\"evenodd\"\n />\n <path d=\"M17.9668 31.5737H19.4947\" stroke=\"#E4E8EE\" strokeWidth=\"0.264005\" />\n </g>\n <g filter=\"url(#filter1_d_1565_98011)\">\n <circle cx=\"15.0441\" cy=\"16.0441\" fill=\"#CDD3DD\" r=\"15.0441\" />\n <mask height=\"30\" id=\"mask2_1565_98011\" maskUnits=\"userSpaceOnUse\" width=\"30\" x=\"0\" y=\"1\">\n <circle cx=\"15.0435\" cy=\"16.0445\" fill=\"#F8F9FB\" r=\"14.3951\" />\n </mask>\n <g mask=\"url(#mask2_1565_98011)\">\n <rect fill=\"white\" height=\"31.1359\" transform=\"translate(0 0.162598)\" width=\"31.0101\" />\n <rect fill=\"#A8B1BD\" height=\"3.0172\" rx=\"0.167622\" width=\"3.0172\" x=\"3.26953\" y=\"4.52002\" />\n <rect fill=\"#A8B1BD\" height=\"3.0172\" rx=\"0.167622\" width=\"3.0172\" x=\"3.26953\" y=\"17.1758\" />\n <rect fill=\"#A8B1BD\" height=\"3.0172\" rx=\"0.167622\" width=\"3.0172\" x=\"3.26953\" y=\"26.0186\" />\n <rect fill=\"#A8B1BD\" height=\"3.0172\" rx=\"0.167622\" width=\"3.0172\" x=\"3.26953\" y=\"9.04541\" />\n <rect\n fill=\"#CDD3DD\"\n height=\"1.17336\"\n rx=\"0.167622\"\n width=\"10.9793\"\n x=\"6.87305\"\n y=\"4.52002\"\n />\n <rect\n fill=\"#CDD3DD\"\n height=\"1.17336\"\n rx=\"0.167622\"\n width=\"10.9793\"\n x=\"6.87305\"\n y=\"17.1758\"\n />\n <rect\n fill=\"#CDD3DD\"\n height=\"1.17336\"\n rx=\"0.167622\"\n width=\"10.9793\"\n x=\"6.87305\"\n y=\"26.0186\"\n />\n <rect\n fill=\"#CDD3DD\"\n height=\"1.17336\"\n rx=\"0.167622\"\n width=\"10.9793\"\n x=\"6.87305\"\n y=\"9.04541\"\n />\n <rect\n fill=\"#EEF1F6\"\n height=\"0.880018\"\n rx=\"0.167622\"\n width=\"10.9793\"\n x=\"3.26953\"\n y=\"2.34131\"\n />\n <rect\n fill=\"#EEF1F6\"\n height=\"0.880018\"\n rx=\"0.167622\"\n width=\"10.9793\"\n x=\"3.26953\"\n y=\"14.9971\"\n />\n <rect\n fill=\"#EEF1F6\"\n height=\"0.880018\"\n rx=\"0.167622\"\n width=\"10.9793\"\n x=\"3.26953\"\n y=\"23.8389\"\n />\n <rect\n fill=\"#EEF1F6\"\n height=\"1.17336\"\n rx=\"0.167622\"\n width=\"8.50684\"\n x=\"6.87305\"\n y=\"6.36377\"\n />\n <rect\n fill=\"#EEF1F6\"\n height=\"1.17336\"\n rx=\"0.167622\"\n width=\"8.50684\"\n x=\"6.87305\"\n y=\"19.0195\"\n />\n <rect\n fill=\"#EEF1F6\"\n height=\"1.17336\"\n rx=\"0.167622\"\n width=\"8.50684\"\n x=\"6.87305\"\n y=\"27.8613\"\n />\n <rect\n fill=\"#EEF1F6\"\n height=\"1.17336\"\n rx=\"0.167622\"\n width=\"8.50684\"\n x=\"6.87305\"\n y=\"10.8892\"\n />\n <rect\n fill=\"#A8B1BD\"\n height=\"1.17336\"\n rx=\"0.167622\"\n width=\"5.15439\"\n x=\"21.666\"\n y=\"5.44238\"\n />\n <rect\n fill=\"#A8B1BD\"\n height=\"1.17336\"\n rx=\"0.167622\"\n width=\"5.15439\"\n x=\"21.666\"\n y=\"18.0972\"\n />\n <rect\n fill=\"#A8B1BD\"\n height=\"1.17336\"\n rx=\"0.167622\"\n width=\"5.15439\"\n x=\"21.666\"\n y=\"26.9399\"\n />\n <rect\n fill=\"#A8B1BD\"\n height=\"1.17336\"\n rx=\"0.167622\"\n width=\"5.15439\"\n x=\"21.666\"\n y=\"9.96826\"\n />\n <path d=\"M2.64062 8.25H27.4487\" stroke=\"#E4E8EE\" strokeWidth=\"0.0838112\" />\n <path d=\"M2.64062 20.9058H27.4487\" stroke=\"#E4E8EE\" strokeWidth=\"0.0838112\" />\n <path d=\"M2.64062 29.7476H27.4487\" stroke=\"#E4E8EE\" strokeWidth=\"0.0838112\" />\n <path d=\"M2.64062 12.7759H27.4487\" stroke=\"#E4E8EE\" strokeWidth=\"0.0838112\" />\n <path d=\"M2.64062 3.72412H27.4487\" stroke=\"#E4E8EE\" strokeWidth=\"0.0838112\" />\n <path d=\"M2.64062 16.3799H27.4487\" stroke=\"#E4E8EE\" strokeWidth=\"0.0838112\" />\n <path d=\"M2.64062 25.2217H27.4487\" stroke=\"#E4E8EE\" strokeWidth=\"0.0838112\" />\n <path d=\"M2.64062 8.25H27.4487\" stroke=\"#E4E8EE\" strokeWidth=\"0.0838112\" />\n <path d=\"M2.64062 20.9058H27.4487\" stroke=\"#E4E8EE\" strokeWidth=\"0.0838112\" />\n <path d=\"M2.64062 29.7476H27.4487\" stroke=\"#E4E8EE\" strokeWidth=\"0.0838112\" />\n </g>\n </g>\n <path\n d=\"M24.1888 27.3166L24.4326 27.0728L25.6395 27.8404L32.2915 34.4924C32.4911 34.6919 32.4911 35.0154 32.2915 35.215C32.092 35.4145 31.7685 35.4145 31.569 35.215L24.9487 28.5947L24.1888 27.3166Z\"\n fill=\"#CDD3DD\"\n />\n <defs>\n <filter\n colorInterpolationFilters=\"sRGB\"\n filterUnits=\"userSpaceOnUse\"\n height=\"22.1051\"\n id=\"filter0_d_1565_98011\"\n width=\"17.0025\"\n x=\"16.1745\"\n y=\"12.0629\"\n >\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix\n in=\"SourceAlpha\"\n result=\"hardAlpha\"\n type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n />\n <feOffset dy=\"0.125717\" />\n <feGaussianBlur stdDeviation=\"0.167622\" />\n <feColorMatrix\n type=\"matrix\"\n values=\"0 0 0 0 0.341176 0 0 0 0 0.4 0 0 0 0 0.458824 0 0 0 0.15 0\"\n />\n <feBlend in2=\"BackgroundImageFix\" mode=\"normal\" result=\"effect1_dropShadow_1565_98011\" />\n <feBlend\n in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_1565_98011\"\n mode=\"normal\"\n result=\"shape\"\n />\n </filter>\n <filter\n colorInterpolationFilters=\"sRGB\"\n filterUnits=\"userSpaceOnUse\"\n height=\"31.7646\"\n id=\"filter1_d_1565_98011\"\n width=\"31.7641\"\n x=\"-0.838112\"\n y=\"0.580944\"\n >\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix\n in=\"SourceAlpha\"\n result=\"hardAlpha\"\n type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n />\n <feOffset dy=\"0.419056\" />\n <feGaussianBlur stdDeviation=\"0.419056\" />\n <feColorMatrix\n type=\"matrix\"\n values=\"0 0 0 0 0.341176 0 0 0 0 0.4 0 0 0 0 0.458824 0 0 0 0.16 0\"\n />\n <feBlend in2=\"BackgroundImageFix\" mode=\"normal\" result=\"effect1_dropShadow_1565_98011\" />\n <feBlend\n in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_1565_98011\"\n mode=\"normal\"\n result=\"shape\"\n />\n </filter>\n </defs>\n </svg>\n)\n","import React from 'react'\n\nimport { Icon } from '@kyper/mui'\nimport useTheme from '@mui/material/styles/useTheme'\n\nimport { clientColorSchemeProps } from '../..'\n\nimport { BeatCategoryIcon, BeatMerchantLogo, MonthlySpendComparisonIcon } from '.'\n\nimport { Beat } from '../../../common'\n\nexport interface BeatIconProps {\n beat?: Beat\n clientColorScheme?: clientColorSchemeProps\n color?: string | null\n type?: number | null\n}\n\nexport const BeatIcon: React.FC<BeatIconProps> = ({ beat, clientColorScheme, color, type }) => {\n const theme = useTheme()\n\n const primaryColor = clientColorScheme?.primary_300\n ? clientColorScheme.primary_300\n : theme.palette.primary.main\n\n if (type === 0)\n return <Icon fill={true} name=\"error\" sx={{ color: color ? color : primaryColor }} /> // This is the attention icon\n\n if (type === 1 && beat) return <BeatCategoryIcon beat={beat} />\n\n if (type === 2 && beat) return <BeatMerchantLogo beat={beat} />\n\n if (type === 3 && beat) return <MonthlySpendComparisonIcon beat={beat} />\n\n // This is for the default and type 4 logo\n return (\n <Icon\n fill={true}\n name=\"info\"\n sx={{\n color: primaryColor,\n }}\n />\n )\n}\n","export const SUPPORTED_CAROUSEL_HEIGHTS: any = {\n LARGE: 180,\n STANDARD: 154,\n XLARGE: 200,\n XXLARGE: 248,\n}\n\nexport const CAROUSEL_FONT_STYLES: any = {\n LARGE: {\n DESCRIPTION: 15,\n DESCRIPTION_LINE_CLAMP: 2,\n DESCRIPTION_LINE_HEIGHT: 20,\n TITLE: 15,\n TITLE_LINE_CLAMP: 1,\n TITLE_LINE_HEIGHT: 20,\n LINK_ICON_HEIGHT: 11,\n LINK_ICON_WIDTH: 6,\n },\n STANDARD: {\n DESCRIPTION: 14,\n DESCRIPTION_LINE_CLAMP: 2,\n DESCRIPTION_LINE_HEIGHT: 19,\n TITLE: 14,\n TITLE_LINE_CLAMP: 2,\n TITLE_LINE_HEIGHT: 19,\n LINK_ICON_HEIGHT: 11,\n LINK_ICON_WIDTH: 6,\n },\n XLARGE: {\n DESCRIPTION: 17,\n DESCRIPTION_LINE_CLAMP: 2,\n DESCRIPTION_LINE_HEIGHT: 24,\n TITLE: 19,\n TITLE_LINE_CLAMP: 2,\n TITLE_LINE_HEIGHT: 24,\n LINK_ICON_HEIGHT: 24,\n LINK_ICON_WIDTH: 24,\n },\n XXLARGE: {\n DESCRIPTION: 19,\n DESCRIPTION_LINE_CLAMP: 3,\n DESCRIPTION_LINE_HEIGHT: 24,\n TITLE: 21,\n TITLE_LINE_CLAMP: 2,\n TITLE_LINE_HEIGHT: 28,\n LINK_ICON_HEIGHT: 24,\n LINK_ICON_WIDTH: 24,\n },\n}\n\nexport const MINIMUM_SWIPE_DISTANCE = 50\n\nexport const VIEW_THRESHOLD = 1 // card is 100% in view\n","import React from 'react'\n\nimport { InsightsMicroWidgetDataContext } from './InsightsMicroWidgetDataProvider'\n\nexport const useDataContext = () => {\n const context = React.useContext(InsightsMicroWidgetDataContext)\n\n if (!context) {\n throw new Error('useDataContext() must be used within the InsightsMicroWidgetDataProvider')\n }\n\n return context\n}\n\nexport const useStore = () => {\n const context = React.useContext(InsightsMicroWidgetDataContext)\n\n if (!context) {\n throw new Error('useStore() must be used within the InsightsMicroWidgetDataProvider')\n }\n\n return context.store\n}\n\nexport const useCopyStore = () => {\n const context = React.useContext(InsightsMicroWidgetDataContext)\n\n if (!context) {\n throw new Error('useCopyStore() must be used within the InsightsMicroWidgetDataProvider')\n }\n\n return context.store.copyStore\n}\n\nexport const useInsightsMicroWidgetStore = () => {\n const context = React.useContext(InsightsMicroWidgetDataContext)\n\n if (!context?.store?.insightsMicroWidgetStore) {\n throw new Error(\n 'useInsightsMicroWidgetStore() must be used within the InsightsMicroWidgetDataProvider',\n )\n }\n\n return context.store.insightsMicroWidgetStore\n}\n\nexport const useEvent = () => {\n const context = React.useContext(InsightsMicroWidgetDataContext)\n\n if (!context) {\n throw new Error('useEvent() must be used within the InsightsMicroWidgetDataProvider')\n }\n\n return { onEvent: context.onEvent }\n}\n\nexport const usePageview = () => {\n const context = React.useContext(InsightsMicroWidgetDataContext)\n\n if (!context) {\n throw new Error('usePageview() must be used within the InsightsMicroWidgetDataProvider')\n }\n\n return { onPageview: context.onPageview }\n}","import React, { useEffect } from 'react'\nimport { useInView } from 'react-intersection-observer'\n\nimport { MicroWidgetProps, MicroInsightCard } from '../../'\nimport { BeatIcon } from '../beaticons'\n\nimport { Beat } from '../../../common'\n\nimport { ON_CLICK_EVENT, ON_VIEW_EVENT, ON_VIEW_FIRST_TIME_EVENT } from '../../constants/Analytics'\nimport { VIEW_THRESHOLD } from '../../constants/App'\n\nimport { useCopyStore, useEvent, useInsightsMicroWidgetStore } from '../../context/hooks'\n\ndeclare const window: Window &\n typeof globalThis & {\n app: any\n }\n\nexport interface BeatCardProps extends MicroWidgetProps {\n backgroundColor?: string\n beat: Beat\n index?: number\n variant?: 'elevation' | 'outlined'\n}\n\nexport const BeatCard: React.FC<BeatCardProps> = ({\n ariaLabel,\n backgroundColor,\n beat,\n clientColorScheme,\n showCTAColocatedWithText = true,\n heightOverrides,\n index,\n isActiveCard,\n onCardClick,\n posthog,\n showIcon,\n variant,\n widthOverrides,\n}) => {\n const clientGuid = window.app?.config.client_guid\n\n const { ref, inView }: { ref: any; inView: any } = useInView({\n threshold: VIEW_THRESHOLD,\n })\n\n // *************** Context functions *********************\n const { cardsCopy } = useCopyStore()\n const { onEvent } = useEvent()\n const { updateBeat } = useInsightsMicroWidgetStore()\n\n // ************** Use Effects Hooks **********************\n useEffect(() => {\n if (inView) {\n if (!beat.has_been_displayed) {\n updateBeat({\n ...beat,\n has_been_displayed: true,\n })\n onEvent(ON_VIEW_FIRST_TIME_EVENT(beat.template))\n } else {\n onEvent(ON_VIEW_EVENT(beat.template))\n }\n }\n }, [inView])\n useEffect(() => {\n if (posthog?.capture && inView && beat && clientGuid) {\n posthog.capture('micro_widget_viewed_insight', {\n beat_guid: beat.guid,\n insight_template: beat.template,\n position: index,\n $groups: { client: clientGuid },\n })\n }\n }, [beat, clientGuid, posthog, index, inView])\n\n // *************** Click handlers ************************\n const handleClick = () => {\n /* eslint-disable no-unused-expressions */\n onCardClick && onCardClick(beat)\n onEvent(ON_CLICK_EVENT(beat.template))\n if (posthog?.capture && clientGuid) {\n posthog.capture('micro_widget_clicked_insight', {\n beat_guid: beat.guid,\n insight_template: beat.template,\n position: index,\n $groups: { client: clientGuid },\n })\n }\n }\n\n return (\n <MicroInsightCard\n actionText={beat.micro_call_to_action || cardsCopy.micro_card_cta}\n ariaLabel={ariaLabel}\n backgroundColor={backgroundColor}\n description={\n beat?.html_micro_description && beat?.html_micro_description.length > 0\n ? beat.html_micro_description\n : beat.html_description\n }\n fontColors={{ buttonColor: clientColorScheme?.primary_300 }}\n heightOverrides={heightOverrides}\n icon={\n BeatIcon && (\n <BeatIcon\n beat={beat}\n clientColorScheme={clientColorScheme}\n color={beat?.icon_color}\n type={beat?.icon_type}\n />\n )\n }\n isActiveCard={isActiveCard}\n onCardClick={handleClick}\n ref={ref}\n showCTAColocatedWithText={showCTAColocatedWithText}\n showIcon={showIcon}\n title={beat.micro_title && beat.micro_title.length > 0 ? beat.micro_title : beat.title}\n variant={variant}\n widthOverrides={widthOverrides}\n />\n )\n}\n","import React from 'react'\n\nimport { css } from '@mxenabled/cssinjs'\n\nimport Box from '@mui/material/Box'\nimport IconButton from '@mui/material/IconButton'\nimport ChevronLeft from '@mui/icons-material/ChevronLeft'\nimport ChevronRight from '@mui/icons-material/ChevronRight'\n\nimport { clientColorSchemeProps } from '../../'\n\nimport { useCopyStore } from '../../context/hooks'\n\nexport interface CarouselControlsProps {\n clientColorScheme?: clientColorSchemeProps\n currentBeatIndex: number\n numBeats: number\n onNextClick: () => void\n onPreviousClick: () => void\n scrollRightBoundary: number\n scrollX: number\n}\n\nexport const CarouselControls: React.FC<CarouselControlsProps> = ({\n clientColorScheme,\n currentBeatIndex,\n numBeats,\n onNextClick,\n onPreviousClick,\n scrollRightBoundary,\n scrollX,\n}) => {\n const styles = getStyles()\n\n // *************** Context functions *********************\n const { carouselCopy: copy } = useCopyStore()\n\n const disabledLeft = Math.floor(scrollX) > scrollRightBoundary || currentBeatIndex === 0\n const disabledRight = scrollX < 0 || numBeats - 1 === currentBeatIndex\n\n const DISABLED_ICON_COLOR = '#BBBCBC'\n const ICON_COLOR = clientColorScheme?.primary_300 ? clientColorScheme?.primary_300 : '#2D64EF'\n\n return (\n <Box className={styles}>\n <IconButton\n aria-label={copy.previous_insight_cta_aria}\n disabled={disabledLeft}\n onClick={onPreviousClick}\n >\n <ChevronLeft\n style={{\n color: disabledLeft ? DISABLED_ICON_COLOR : ICON_COLOR,\n }}\n />\n </IconButton>\n {Array.from({ length: numBeats }).map((_, i) => (\n <div\n className=\"mx-insights-micro-carousel-dots\"\n key={`carousel-button-${i}`}\n style={{\n backgroundColor: i === currentBeatIndex ? ICON_COLOR : DISABLED_ICON_COLOR,\n }}\n />\n ))}\n <IconButton\n aria-label={copy.next_insight_cta_aria}\n disabled={disabledRight}\n onClick={onNextClick}\n >\n <ChevronRight\n style={{\n color: disabledRight ? DISABLED_ICON_COLOR : ICON_COLOR,\n }}\n />\n </IconButton>\n </Box>\n )\n}\n\nconst getStyles = () =>\n css({\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'center',\n width: '100%',\n // we were using `gap` instead of margin, but it doesn't work in safari browsers older than iOS 14.1\n '& button:first-child': {\n marginRight: 8,\n },\n '& .mx-insights-micro-carousel-dots': {\n borderRadius: '50%',\n height: 8,\n padding: 0,\n width: 8,\n // we were using `gap` instead of margin, but it doesn't work in safari browsers older than iOS 14.1\n marginRight: 8,\n },\n })\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { css } from '@mxenabled/cssinjs'\n\nimport { CarouselControls } from './CarouselControls'\n\nimport { BeatCard, MicroWidgetProps, ViewMoreMicroCard } from '../../'\n\nimport { buildDynamicCopy } from '../../../common'\n\nimport { useCopyStore, useEvent } from '../../context/hooks'\n\nimport type { Beat } from '../../../common'\n\nimport { ANALYTICS_CLICK_EVENTS } from '../../constants/Analytics'\nimport { MINIMUM_SWIPE_DISTANCE } from '../../constants/App'\n\nexport interface MicroBeatCarouselProps extends MicroWidgetProps {\n beats?: Beat[]\n showCarouselControls?: boolean\n}\n\nconst MicroBeatCarousel: React.FC<MicroBeatCarouselProps> = ({\n beats = [],\n clientColorScheme,\n showCTAColocatedWithText,\n heightOverrides,\n onCardClick,\n posthog,\n showCarouselControls,\n showIcon,\n showWithMargin,\n variant,\n widthOverrides,\n}) => {\n const styles = getStyles(heightOverrides, showWithMargin, widthOverrides)\n\n // ************** Use Ref Hooks **************************\n const ulRef = React.useRef<HTMLUListElement | null>(null)\n\n // ************** Use States Hooks ***********************\n const [scrollX, setScrollX] = React.useState<number>(0)\n const [touchEnd, setTouchEnd] = React.useState<number | null>(null)\n const [touchStart, setTouchStart] = React.useState<number | null>(null)\n\n // *************** Context functions *********************\n const { carouselCopy: copy } = useCopyStore()\n const { onEvent } = useEvent()\n\n // *************** Click handlers ************************\n const handleNextClick = () => {\n onEvent(ANALYTICS_CLICK_EVENTS.ON_CAROUSEL_FORWARD_CLICK)\n\n if (ulRef.current) {\n ulRef.current.scrollTo({\n left:\n // Adds the flex gap to the carousel ulRef's width\n (ulRef.current.offsetWidth + 8) *\n (Math.floor(scrollX / (ulRef.current.offsetWidth + 8)) + 1),\n top: 0,\n behavior: 'smooth',\n })\n }\n }\n\n const handlePreviousClick = () => {\n onEvent(ANALYTICS_CLICK_EVENTS.ON_CAROUSEL_BACK_CLICK)\n\n if (ulRef.current) {\n ulRef.current.scrollTo({\n left:\n (ulRef.current.offsetWidth + 8) *\n (Math.floor(scrollX / (ulRef.current.offsetWidth + 8)) - 1),\n top: 0,\n behavior: 'smooth',\n })\n }\n }\n\n const handleScroll = () => {\n if (ulRef.current) {\n setScrollX(ulRef.current.scrollLeft)\n }\n }\n\n // *************** Mobile handlers ************************\n const onTouchEnd = () => {\n if (!touchStart || !touchEnd) return\n const distance = touchStart - touchEnd\n\n // swiping left\n if (distance > MINIMUM_SWIPE_DISTANCE) {\n onEvent(ANALYTICS_CLICK_EVENTS.ON_CAROUSEL_FORWARD_SWIPE)\n } else {\n // swiping right\n onEvent(ANALYTICS_CLICK_EVENTS.ON_CAROUSEL_BACK_SWIPE)\n }\n }\n\n const onTouchMove = (e: React.TouchEvent) => {\n setTouchEnd(e.targetTouches[0].clientX)\n }\n\n const onTouchStart = (e: React.TouchEvent) => {\n // otherwise the swipe is fired even with usual touch events\n setTouchEnd(null)\n setTouchStart(e.targetTouches[0].clientX)\n }\n\n // ************** Spreadable Props ***********************\n const generalProps = {\n clientColorScheme,\n showCTAColocatedWithText,\n heightOverrides,\n showIcon,\n variant,\n widthOverrides,\n }\n\n const activeCardIndex =\n ulRef.current && ulRef.current.offsetWidth ? Math.round(scrollX / ulRef.current.offsetWidth) : 0\n const scrollBoundry = ulRef.current ? ulRef.current.scrollWidth - ulRef.current.offsetWidth : 0\n\n return (\n <div className={styles}>\n <ul\n className=\"mx-insights-micro-carousel-container\"\n onScroll={handleScroll}\n onTouchEnd={onTouchEnd}\n onTouchMove={onTouchMove}\n onTouchStart={onTouchStart}\n ref={ulRef}\n >\n {beats.map((beat: Beat, i) => {\n return (\n <BeatCard\n ariaLabel={\n buildDynamicCopy(\n copy.card_position_in_carousel_aria,\n i + 1,\n beats.length + 1,\n ) as string\n }\n beat={beat}\n index={i}\n isActiveCard={i === activeCardIndex}\n key={`${beat.guid} ${i}`}\n onCardClick={onCardClick}\n posthog={posthog}\n {...generalProps}\n />\n )\n })}\n <ViewMoreMicroCard\n isActiveCard={activeCardIndex === beats.length}\n onCardClick={onCardClick}\n {...generalProps}\n />\n </ul>\n {showCarouselControls && (\n <CarouselControls\n clientColorScheme={clientColorScheme}\n currentBeatIndex={activeCardIndex}\n numBeats={beats.length + 1}\n onNextClick={handleNextClick}\n onPreviousClick={handlePreviousClick}\n scrollRightBoundary={scrollBoundry}\n scrollX={scrollX}\n />\n )}\n </div>\n )\n}\n\nexport default observer(MicroBeatCarousel)\n\nconst getStyles = (\n heightOverrides?: number | string,\n showWithMargin = true,\n widthOverrides?: number | string,\n) =>\n css({\n alignItems: 'center',\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n height: heightOverrides,\n width: widthOverrides ? widthOverrides : '100%',\n '& .mx-insights-micro-carousel-container': {\n alignItems: 'center',\n display: 'flex',\n gap: 8,\n height: heightOverrides && '100%',\n maxWidth: showWithMargin ? `calc(100% - 32px)` : '100%',\n overflowX: 'auto',\n overflowY: 'hidden',\n scrollbarWidth: 'none',\n '-ms-overflow-style': 'none',\n '-webkit-overflow-scrolling': 'touch',\n margin: 0,\n padding: 0,\n listStyleType: 'none',\n '&::-webkit-scrollbar': {\n display: 'none',\n },\n },\n })\n","import React from 'react'\nimport { css } from '@mxenabled/cssinjs'\nimport { P } from '@kyper/mui'\n\nimport Card from '@mui/material/Card'\nimport CardActions from '@mui/material/CardActions'\nimport CardHeader from '@mui/material/CardHeader'\n\nimport { MicroWidgetProps, StyleProps } from '../../'\n\ninterface MicroInsightProps extends MicroWidgetProps {\n actionText?: string\n backgroundColor?: string\n description?: string\n icon: React.ReactNode\n fontColors?: fontColors\n style?: StyleProps\n title?: string\n}\n\ninterface fontColors {\n buttonColor?: string\n headerColor?: string\n iconColor?: string\n textColor?: string\n}\n\nexport const MicroInsightCard = React.forwardRef<HTMLDivElement, MicroInsightProps>(\n function MicroInsight(\n {\n actionText,\n ariaLabel,\n backgroundColor,\n showCTAColocatedWithText,\n description,\n heightOverrides,\n icon,\n isActiveCard,\n onCardClick = () => {},\n showIcon,\n style = {},\n fontColors = {},\n title,\n variant,\n widthOverrides,\n },\n inViewRef,\n ) {\n // ************** Use States Hooks ***********************\n const [lineClamp, setLineClamp] = React.useState(1)\n\n // ************** Use Effects Hooks **********************\n React.useEffect(() => {\n if (widthOverrides && widthOverrides <= 325) setLineClamp(3)\n if (widthOverrides && widthOverrides > 325) setLineClamp(2)\n }, [widthOverrides])\n\n // ************** Style constants ************************\n // The not variant is necessary to overirde the automatic raised style that defaults when no variant is given.\n const { cardStyle, linkTextStyle } = style\n const cardStyles = !variant ? { border: 'none', boxShadow: 'none', ...cardStyle } : cardStyle\n const styles = getStyles(\n cardStyles,\n showCTAColocatedWithText,\n fontColors,\n lineClamp,\n linkTextStyle,\n heightOverrides,\n )\n\n return (\n <li\n aria-hidden={!isActiveCard}\n className={styles}\n onClick={() => onCardClick()}\n ref={inViewRef as React.RefObject<HTMLLIElement>}\n role=\"button\"\n tabIndex={isActiveCard ? 0 : -1}\n >\n {/* This span is so that safari will read out the current card you are on when using a screenreader */}\n {ariaLabel && <span aria-label={ariaLabel} style={{ visibility: 'hidden' }} />}\n <Card className={`mx-micro-card`} sx={{ backgroundColor }} variant={variant}>\n <CardHeader\n avatar={showIcon && icon}\n subheader={\n <div className=\"mx-micro-content-container\">\n <P\n className=\"mx-micro-card-description\"\n color={fontColors.textColor ? 'undefined' : 'text.primary'}\n >\n {description && <span dangerouslySetInnerHTML={{ __html: description }} />}\n </P>\n </div>\n }\n title={title}\n />\n {!!actionText && (\n <CardActions sx={{ paddingLeft: 0 }}>\n <div className=\"mx-insights-micro-card-link-text\">{actionText}</div>\n </CardActions>\n )}\n </Card>\n </li>\n )\n },\n)\n\nconst getStyles = (\n cardStyle: object,\n showCTAColocatedWithText: any,\n fontColors: fontColors,\n lineClamp: number,\n linkTextStyle?: object,\n heightOverrides?: number | string,\n) =>\n css({\n height: '100%',\n listStyleType: 'none',\n userSelect: 'none',\n minWidth: '100%',\n '& .mx-micro-card': {\n borderRadius: 8,\n cursor: 'pointer',\n display: 'flex',\n flexDirection: 'column',\n height: heightOverrides ? '100%' : 124,\n justifyContent: !showCTAColocatedWithText && 'space-between',\n width: '100%',\n padding: 16,\n ...cardStyle,\n },\n '& .mx-micro-content-container': {\n height: '100%',\n },\n '& .mx-micro-card-description': {\n letterSpacing: 0.48,\n color: fontColors.textColor ? fontColors.textColor : '',\n display: '-webkit-box',\n fontSize: 13,\n lineHeight: '20px',\n overflow: 'hidden',\n WebkitLineClamp: lineClamp,\n WebkitBoxOrient: 'vertical',\n wordWrap: 'break-word',\n },\n '& .mx-insights-micro-card-link-text': {\n color: fontColors.buttonColor ? fontColors.buttonColor : '#2D64EF',\n fontSize: 14,\n fontWeight: 'bold',\n marginLeft: 24,\n ...linkTextStyle,\n },\n '& .MuiCardHeader-avatar': {\n color: fontColors.iconColor,\n marginBottom: 'auto',\n marginRight: '8px !important',\n paddingTop: 2,\n },\n '& .MuiCardHeader-root': {\n padding: 0,\n },\n '& .MuiCardHeader-title': {\n fontSize: 15,\n fontWeight: 'bold',\n color: fontColors.headerColor,\n paddingBottom: 8,\n WebkitLineClamp: 2,\n },\n '& .MuiCardContent-root': {\n // Needed to override padding for standard and first and last child conditions\n padding: `${0} !important`,\n },\n })\n","import React from 'react'\nimport type { PostHog } from 'posthog-js'\n\nimport { observer } from 'mobx-react-lite'\n\nimport Link from '@mui/material/Link'\nimport Stack from '@mui/material/Stack'\nimport Typography from '@mui/material/Typography'\n\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight'\n\nimport { clientColorSchemeProps } from '../../'\n\nimport { Beat } from '../../../common'\n\nimport { ANALYTICS_CLICK_EVENTS } from '../../constants/Analytics'\n\nimport { useCopyStore, useEvent } from '../../context/hooks'\n\ndeclare const window: Window &\n typeof globalThis & {\n app: any\n }\n\nexport interface CarouselHeaderProps {\n clientColorScheme?: clientColorSchemeProps\n onCardClick: (beat?: Beat | undefined) => void\n posthog?: PostHog\n widthOverrides?: number | string\n}\n\nconst CarouselHeader: React.FC<CarouselHeaderProps> = ({\n clientColorScheme,\n onCardClick,\n posthog,\n widthOverrides,\n}) => {\n // *************** Context functions *********************\n const { carouselCopy: copy } = useCopyStore()\n const { onEvent } = useEvent()\n\n const clientGuid = window.app?.config.client_guid\n\n // *************** Click handlers ************************\n const handleViewAllClick = () => {\n if (onEvent) {\n onEvent(ANALYTICS_CLICK_EVENTS.ON_VIEW_MORE_CLICKED)\n if (posthog?.capture && clientGuid) {\n onCardClick()\n\n posthog.capture('micro_widget_clicked_insight', {\n insight_template: 'view_all',\n $groups: { client: clientGuid },\n })\n }\n }\n }\n\n return (\n <Stack\n alignItems=\"center\"\n direction=\"row\"\n justifyContent=\"space-between\"\n spacing={2}\n sx={{\n padding: widthOverrides ? 0 : 16,\n width: widthOverrides ? widthOverrides : undefined,\n }}\n >\n <Typography\n sx={{\n fontSize: 18,\n fontWeight: 700,\n lineHeight: '24px',\n }}\n variant=\"h3\"\n >\n {copy.carousel_title}\n </Typography>\n <Link\n onClick={handleViewAllClick}\n sx={{\n display: 'flex',\n alignItems: 'center',\n '&.MuiLink-underlineNone': {\n textDecoration: 'none',\n ':hover': {\n borderBottom: 'none',\n },\n },\n }}\n underline=\"none\"\n >\n <Typography\n sx={{\n color: clientColorScheme?.primary_300,\n fontSize: 15,\n fontWeight: 600,\n lineHeight: '20px',\n }}\n variant=\"body1\"\n >\n {copy.view_all_insights_in_full_feed_cta_aria}\n </Typography>\n <ChevronRightIcon sx={{ color: clientColorScheme?.primary_300, ml: '8px' }} />\n </Link>\n </Stack>\n )\n}\n\nexport default observer(CarouselHeader)\n","import React from 'react'\nimport Box from '@mui/material/Box'\nimport CircularProgress from '@mui/material/CircularProgress'\n\nconst Spinner: React.FC = () => {\n return (\n <Box\n sx={{\n alignItems: 'center',\n display: 'flex',\n height: '100%',\n justifyContent: 'center',\n width: '100%',\n }}\n >\n <CircularProgress />\n </Box>\n )\n}\n\nexport default Spinner\n","import React, { useState } from 'react'\n\nimport { observer } from 'mobx-react-lite'\nimport Box from '@mui/material/Box'\nimport CssBaseline from '@mui/material/CssBaseline'\nimport { ThemeProvider } from '@mui/material/styles'\n\nimport { createMXTheme } from '@kyper/mui'\n\nimport { useCombineEvents, useCombinePageviews, Beat } from '../../../common'\n\nimport { InsightsMicroWidgetDataProvider } from '../../context/InsightsMicroWidgetDataProvider'\n\nimport CarouselHeader from '../carouselheader/CarouselHeader'\n\nimport { MicroWidgetProps, MicroBeatCarousel, NoRelevantInsightsCard, ZeroStateCard } from '../../'\n\nimport Spinner from '../spinner/Spinner'\n\nimport { AppStore } from '../../stores/AppStore'\n\nconst store = new AppStore()\n\nexport interface InsightsMicroWidgetProps extends MicroWidgetProps {\n areBeatsLoading: boolean\n beats: Beat[]\n endpoint: string\n logOutUser: () => void\n onEvent?: (event?: string | undefined) => void\n onPageview?: (event?: string | undefined) => void\n token: string\n userHasFullInsightFeedBeats?: boolean\n}\n\n/*\n This is the parent component / starting point for the general availabile insights micro widget. The Legacy/Cibc version is in a seperate repo\n called insights micro widget. The difference between the No relevent and zero state component is that No relevant is a zero state theat lets the\n user know that although there are no micro insights available but the user has fill insights available and zero state lets the user know that there\n aren't any micro or full insights available.\n*/\n\nconst InsightsMicroWidget: React.FC<InsightsMicroWidgetProps> = ({\n areBeatsLoading,\n beats = [], // This also determines the length of the carousel controls (beat.length + 1)\n clientColorScheme, // Allows certain icons, view all and read more button to reflect the clients color scheme. Currently only supports primary_300\n showCTAColocatedWithText = true,\n endpoint = '/',\n heightOverrides,\n logOutUser,\n onCardClick = () => {},\n onEvent: onConsumerEvent = () => {},\n onPageview: onConsumerPageview = () => {},\n posthog,\n showBorder = true,\n showCarouselControls,\n showHeader,\n showIcon,\n showWithMargin = true,\n token = '',\n useDarkMode,\n userHasFullInsightFeedBeats,\n variant,\n widthOverrides,\n}) => {\n // ************** Use States Hooks ***********************\n const [carouselSize, setCarouselSize] = useState<string>('STANDARD')\n const [isLoaded, setIsLoaded] = useState(false)\n\n // ************** Use Custom Hooks ***********************\n const onEvent = useCombineEvents([onConsumerEvent], store)\n const onPageview = useCombinePageviews([onConsumerPageview], store)\n\n // ************** Use Effects Hooks **********************\n React.useEffect(() => {\n if (!store.isInitialized) {\n store.initialize(endpoint, token, logOutUser)\n }\n }, [endpoint, token, logOutUser, store.isInitialized])\n\n React.useEffect(() => {\n const pageHeight = window.innerHeight\n\n if (pageHeight < 180) {\n setCarouselSize('STANDARD')\n } else if (pageHeight >= 180 && pageHeight < 200) {\n setCarouselSize('LARGE')\n } else if (pageHeight >= 200 && pageHeight < 248) {\n setCarouselSize('XLARGE')\n } else if (pageHeight >= 248) {\n setCarouselSize('XXLARGE')\n }\n }, [window.innerHeight])\n\n React.useEffect(() => {\n setIsLoaded(!areBeatsLoading && store.isInitialized)\n }, [areBeatsLoading, store.isInitialized])\n\n // ************** Spreadable Props ***********************\n const generalProps = {\n showCTAColocatedWithText,\n heightOverrides,\n onCardClick,\n showIcon,\n showWithMargin,\n useDarkMode,\n widthOverrides,\n }\n\n const zeroStateProps = {\n carouselSize,\n posthog,\n variant,\n ...generalProps,\n }\n\n return (\n // The Theme provider must wrap the component so that the styles don't break when imported into other applications.\n <ThemeProvider theme={createMXTheme(useDarkMode ? 'dark' : 'light')}>\n <CssBaseline />\n <InsightsMicroWidgetDataProvider onEvent={onEvent} onPageview={onPageview} store={store}>\n <Box\n sx={{\n boxSizing: 'border-box',\n height: !heightOverrides ? '100%' : undefined,\n margin: '0 auto',\n width: !widthOverrides ? '100%' : undefined,\n }}\n >\n {(areBeatsLoading || !store.isInitialized) && <Spinner />}\n\n {isLoaded && showHeader && (\n <CarouselHeader\n clientColorScheme={clientColorScheme}\n onCardClick={onCardClick}\n posthog={posthog}\n widthOverrides={widthOverrides}\n />\n )}\n\n {isLoaded && !!beats.length && (\n <MicroBeatCarousel\n beats={beats}\n clientColorScheme={clientColorScheme}\n showCarouselControls={showCarouselControls}\n variant={showBorder ? variant : undefined}\n {...generalProps}\n />\n )}\n\n {isLoaded && !beats.length && userHasFullInsightFeedBeats && (\n <NoRelevantInsightsCard clientColorScheme={clientColorScheme} {...zeroStateProps} />\n )}\n\n {isLoaded && !beats.length && !userHasFullInsightFeedBeats && (\n <ZeroStateCard {...zeroStateProps} />\n )}\n </Box>\n </InsightsMicroWidgetDataProvider>\n </ThemeProvider>\n )\n}\n\nexport default observer(InsightsMicroWidget)\n","import React from 'react'\n\nimport { observer } from 'mobx-react-lite'\n\nimport { MicroWidgetProps, MicroInsightCard, ZeroStateIcon } from '../../'\n\nimport { useCopyStore, useEvent, usePageview } from '../../context/hooks'\n\nimport { SUPPORTED_CAROUSEL_HEIGHTS } from '../../constants/App'\nimport { ANALYTICS_CLICK_EVENTS, ANALYTICS_PAGE_NAMES } from '../../constants/Analytics'\n\ndeclare const window: Window &\n typeof globalThis & {\n app: any\n }\n\nexport interface MicroZeroStateCardProps extends MicroWidgetProps {\n carouselSize: string\n}\n\nexport const NoRelevantInsightsCard: React.FC<MicroZeroStateCardProps> = ({\n ariaLabel,\n carouselSize,\n clientColorScheme,\n heightOverrides,\n onCardClick,\n posthog,\n showIcon,\n showWithMargin,\n variant,\n widthOverrides,\n}) => {\n // *************** Context functions *********************git\n const { cardsCopy } = useCopyStore()\n const { onEvent } = useEvent()\n const { onPageview } = usePageview()\n\n const clientGuid = window.app?.config.client_guid\n\n // ************** Use Effects Hooks **********************\n React.useEffect(() => {\n onPageview(ANALYTICS_PAGE_NAMES.MICRO_WIDGET_CAROUSEL_NO_RELEVANT_INSIGHTS)\n }, [])\n\n // *************** Click handlers ************************\n const handleClick = () => {\n if (onCardClick) onCardClick()\n onEvent(ANALYTICS_CLICK_EVENTS.ON_NO_RELEVANT_INSIGHTS_CLICKED)\n if (posthog?.capture && clientGuid) {\n posthog.capture('micro_widget_clicked_insight', {\n insight_template: 'no_relevant_insights',\n $groups: { client: clientGuid },\n })\n }\n }\n\n return (\n <MicroInsightCard\n actionText={cardsCopy.micro_card_cta}\n ariaLabel={ariaLabel}\n description={cardsCopy.no_relevant_insights_card_description}\n fontColors={{ buttonColor: clientColorScheme?.primary_300 }}\n heightOverrides={heightOverrides}\n icon={<ZeroStateIcon />}\n onCardClick={handleClick}\n showIcon={showIcon}\n style={{\n cardStyle: {\n card: {\n height: `calc(${SUPPORTED_CAROUSEL_HEIGHTS[carouselSize]}px - 44px)`,\n margin: '0 auto',\n width: showWithMargin ? `calc(100% - 32px)` : '100%',\n },\n description: {\n WebkitLineClamp: 4,\n },\n },\n linkTextStyle: {\n marginLeft: 48,\n },\n }}\n title={cardsCopy.no_relevant_insights_card_title}\n variant={variant}\n widthOverrides={widthOverrides}\n />\n )\n}\n\nexport default observer(NoRelevantInsightsCard)\n","import React, { useEffect } from 'react'\nimport { useInView } from 'react-intersection-observer'\nimport { useTokens } from '@kyper/mui'\n\nimport { observer } from 'mobx-react-lite'\n\nimport { ChartFilledIcon, MicroWidgetProps, MicroInsightCard } from '../../'\n\nimport { useCopyStore, useEvent } from '../../context/hooks'\n\nimport { ANALYTICS_CLICK_EVENTS, ANALYTICS_VIEW_EVENTS } from '../../constants/Analytics'\nimport { VIEW_THRESHOLD } from '../../constants/App'\n\ndeclare const window: Window &\n typeof globalThis & {\n app: any\n }\n\nexport interface ViewMoreMicroCardProps extends MicroWidgetProps {\n isActiveCard: boolean\n}\n\nexport const ViewMoreMicroCard: React.FC<ViewMoreMicroCardProps> = ({\n isActiveCard,\n ariaLabel,\n clientColorScheme,\n heightOverrides,\n onCardClick,\n posthog,\n showIcon,\n variant,\n widthOverrides,\n}) => {\n const tokens = useTokens()\n\n const clientGuid = window.app?.config.client_guid\n\n const { ref, inView }: { ref: any; inView: any } = useInView({\n threshold: VIEW_THRESHOLD,\n })\n\n // *************** Context functions *********************\n const { cardsCopy } = useCopyStore()\n const { onEvent } = useEvent()\n\n // ************** Use Effects Hooks **********************\n useEffect(() => {\n if (inView) {\n onEvent(ANALYTICS_VIEW_EVENTS.ON_VIEW_MORE_VIEWED)\n }\n }, [inView])\n\n useEffect(() => {\n if (posthog?.capture && inView && clientGuid) {\n posthog.capture('micro_widget_viewed_insight', {\n insight_template: 'read_more_card',\n $groups: { client: clientGuid },\n })\n }\n }, [clientGuid, posthog, inView])\n\n // *************** Click handlers ************************\n const handleClick = () => {\n if (onCardClick) onCardClick()\n onEvent(ANALYTICS_CLICK_EVENTS.ON_VIEW_MORE_CLICKED)\n if (posthog?.capture && clientGuid) {\n posthog.capture('micro_widget_clicked_insight', {\n insight_template: 'read_more_card',\n $groups: { client: clientGuid },\n })\n }\n }\n\n return (\n <MicroInsightCard\n actionText={cardsCopy.micro_card_cta}\n ariaLabel={ariaLabel}\n description={cardsCopy.view_more_card_description}\n fontColors={{ buttonColor: clientColorScheme?.primary_300 }}\n heightOverrides={heightOverrides}\n icon={\n <ChartFilledIcon\n color={\n clientColorScheme?.primary_300\n ? clientColorScheme?.primary_300\n : tokens.Color.Primary300\n }\n />\n }\n isActiveCard={isActiveCard}\n onCardClick={handleClick}\n ref={ref}\n showIcon={showIcon}\n title={cardsCopy.view_more_card_title}\n variant={variant}\n widthOverrides={widthOverrides}\n />\n )\n}\n\nexport default observer(ViewMoreMicroCard)\n","import React from 'react'\n\nimport { observer } from 'mobx-react-lite'\n\nimport { MicroWidgetProps, MicroInsightCard, ZeroStateIcon } from '../../'\n\nimport { useCopyStore, usePageview } from '../../context/hooks'\n\nimport { SUPPORTED_CAROUSEL_HEIGHTS } from '../../constants/App'\nimport { ANALYTICS_PAGE_NAMES } from '../../constants/Analytics'\n\nexport interface ZeroStateCardProps extends MicroWidgetProps {\n carouselSize: string\n}\n\nexport const ZeroStateCard: React.FC<ZeroStateCardProps> = ({\n ariaLabel,\n carouselSize,\n heightOverrides,\n onCardClick,\n showIcon,\n showWithMargin,\n variant,\n widthOverrides,\n}) => {\n // *************** Context functions *********************\n const { onPageview } = usePageview()\n const { zeroStateCopy } = useCopyStore()\n\n // ************** Use Effects Hooks **********************\n React.useEffect(() => {\n onPageview(ANALYTICS_PAGE_NAMES.MICRO_WIDGET_CAROUSEL_ZERO_STATE)\n }, [])\n\n return (\n <MicroInsightCard\n ariaLabel={ariaLabel}\n description={zeroStateCopy.carousel_zero_state_description}\n heightOverrides={heightOverrides}\n icon={<ZeroStateIcon />}\n onCardClick={onCardClick}\n showIcon={showIcon}\n style={{\n cardStyle: {\n card: {\n height: `calc(${SUPPORTED_CAROUSEL_HEIGHTS[carouselSize]}px - 44px)`,\n margin: '0 auto',\n width: showWithMargin ? `calc(100% - 32px)` : '100%',\n },\n description: {\n WebkitLineClamp: 4,\n },\n },\n }}\n title={zeroStateCopy.carousel_zero_state_title}\n variant={variant}\n widthOverrides={widthOverrides}\n />\n )\n}\n\nexport default observer(ZeroStateCard)\n","import { Category, CategoryColors, CategoryGuids, DateRangeCategoryTotals } from '../../common'\nimport { DonutData } from '../../common/components/charts/Donut'\n\nconst TOP_CATEGORY_LENGTH = 5\n\nexport interface CategoryTotal {\n guid: string\n name: string\n color: string\n categoryTotals?: CategoryTotal[]\n amount: number\n}\n\nexport interface SpendingData {\n categoryData: CategoryTotal[]\n donutData: DonutData[]\n totalAmount: number\n}\n\n/**\n * Rolls all categories up into parent categories and return an array of CategoryTotal items.\n * @param categories - Array of all categories\n * @param totals - And array of type DateRangeCategoryTotals\n */\nconst getTotalsByParentCategory = (\n categories: Category[],\n totals: DateRangeCategoryTotals[],\n): CategoryTotal[] => {\n // Iterate over the category data from BE and roll up all categories into parent categories\n // acc is the accumulated category totals of type CategoryTotal that is initialized as an empty []\n // curr is the current DateRangeCategoryTotal\n return totals.reduce((acc, curr) => {\n if (curr.total > 0) {\n // Find category and if it doesn't exist, return acc\n const category = categories.find((c) => c.guid === curr.category_guid)\n if (!category) return acc\n\n // Find parent category and if it doesn't exist, return acc\n const parentGuid = category.parent_guid ?? category.guid\n const parentCategory = categories.find((c) => c.guid === parentGuid)\n if (!parentCategory) return acc\n\n const categoryTotal = {\n guid: category.guid,\n name: category.guid === parentGuid ? `General ${category.name}` : category.name,\n color: CategoryColors[parentCategory.guid],\n amount: curr.total,\n }\n\n // If parent category has already been added to acc then find it and add the current total,\n // otherwise add the parent category to acc.\n const parentCategoryTotal = acc.find((ct) => ct.guid === parentGuid)\n if (parentCategoryTotal) {\n parentCategoryTotal.amount += curr.total\n parentCategoryTotal.categoryTotals?.push(categoryTotal)\n } else {\n acc.push({\n guid: parentGuid,\n name: parentCategory.name,\n color: CategoryColors[parentCategory.guid],\n categoryTotals: [categoryTotal],\n amount: curr.total,\n })\n }\n }\n\n return acc\n }, [] as CategoryTotal[])\n}\n\n/**\n * Returns an object of type SpendingData containing a subset of category totals related to spending\n * Excludes Income and Transfers\n *\n * @param categories - Array of all categories\n * @param totals - And array of type DateRangeCategoryTotals\n */\nexport const getSpendingData = (\n categories: Category[],\n totals: DateRangeCategoryTotals[],\n): SpendingData => {\n const parentCategoryTotals = getTotalsByParentCategory(categories, totals)\n\n // Filter out Income and Transfers from spending totals\n // Sort in decending order by amount\n const spendingTotals = parentCategoryTotals\n .filter((ct) => ct.guid !== CategoryGuids.INCOME && ct.guid !== CategoryGuids.TRANSFER)\n .sort((cat1, cat2) => cat2.amount - cat1.amount)\n\n // Calculate the total spend\n const totalAmount = spendingTotals.reduce(\n (acc: number, total: CategoryTotal) => acc + total.amount,\n 0,\n )\n\n // Find the number of top categories to include\n const length =\n spendingTotals.length > TOP_CATEGORY_LENGTH ? TOP_CATEGORY_LENGTH : spendingTotals.length\n\n // Only include the top categories\n const categoryData = spendingTotals.slice(0, length)\n\n // Map the category data to donut data\n const donutData = categoryData.map((categoryTotal) => ({\n id: categoryTotal.guid,\n color: categoryTotal.color,\n label: categoryTotal.name,\n value: (categoryTotal.amount / totalAmount) * 100,\n }))\n\n // If there additional categories outside of the top categories, combine them into an Other category\n if (spendingTotals.length > 5) {\n const otherCategories = spendingTotals.slice(TOP_CATEGORY_LENGTH, parentCategoryTotals.length)\n const otherTotal = otherCategories.reduce(\n (acc: number, total: CategoryTotal) => acc + total.amount,\n 0,\n )\n categoryData.push({\n guid: 'other',\n color: '#ACB0B3', // TODO: Get from theme\n name: 'Other', // TODO: Needs localization\n categoryTotals: otherCategories,\n amount: otherTotal,\n })\n\n donutData.push({\n id: 'other',\n color: '#ACB0B3', // TODO: Get from theme,\n label: 'Other', // TODO: Needs localization\n value: (otherTotal / totalAmount) * 100,\n })\n }\n\n // Return an object of type SpendingData\n return {\n categoryData,\n donutData,\n totalAmount,\n }\n}\n\n/**\n * Returns an object of type SpendingData containing a subset of category totals related to income\n * Only includes Income subcategories\n *\n * @param categories - Array of all categories\n * @param monthlyTotals - And array of type DateRangeCategoryTotals\n * @param colors - An array of color strings to use for income colors\n */\nexport const getIncomeData = (\n categories: Category[],\n monthlyTotals: DateRangeCategoryTotals[],\n colors: string[],\n): SpendingData => {\n // Get all income subcategories\n const incomeCategories = categories.filter(\n (category) => category.parent_guid === CategoryGuids.INCOME,\n )\n\n // Filter, sort & map DateRangeCategoryTotals to CategoryTotal objects\n // The filter return only subcategories with a parent category of Income\n // The sort is in acending order due to amounts being negative\n const incomeTotals: CategoryTotal[] = monthlyTotals\n .filter((total) => incomeCategories.some((category) => category.guid === total.category_guid))\n .sort((total1, total2) => total1.total - total2.total)\n .map((total, index) => {\n return {\n guid: total.category_guid,\n name: categories.find((cat) => cat.guid === total.category_guid)?.name,\n color: colors[index],\n categoryTotals: [],\n amount: Math.abs(total.total),\n }\n }) as CategoryTotal[]\n\n // Calculates the total income amount\n const totalAmount = incomeTotals.reduce(\n (acc: number, total: CategoryTotal) => acc + total.amount,\n 0,\n )\n\n // Maps the income totals to donut data\n const donutData = incomeTotals.map((incomeTotal) => ({\n id: incomeTotal.guid,\n color: incomeTotal.color,\n label: incomeTotal.name,\n value: (incomeTotal.amount / totalAmount) * 100,\n }))\n\n // Return an object of type SpendingData\n return {\n categoryData: incomeTotals,\n donutData,\n totalAmount,\n }\n}\n","import React from 'react'\n\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@kyper/mui'\n\nimport { formatCurrency } from '../../common'\n\ninterface SpendingTabLabelProps {\n amount: number\n label: string\n}\n\nconst SpendingTabLabel: React.FC<SpendingTabLabelProps> = ({ amount, label }) => {\n return (\n <Stack direction=\"column\">\n <Text bold={true} sx={{ textTransform: 'none' }} variant=\"Body\">\n {label}\n </Text>\n <Text variant=\"XSmall\">{formatCurrency(amount, '0,0')}</Text>\n </Stack>\n )\n}\n\nexport default SpendingTabLabel\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport Stack from '@mui/material/Stack'\n\nimport { CategoryIcon, CategoryIconVariants, Text } from '@kyper/mui'\n\nimport {\n CategoryGuids,\n Donut,\n formatCurrency,\n useGlobalCopyStore,\n useScreenSize,\n} from '../../common'\n\nimport type { SpendingData } from '../utils/SpendingData'\nimport Button from '@mui/material/Button'\nimport { useTheme } from '@mui/material'\n\ninterface SpendingDonutProps {\n data: SpendingData\n isIncome?: boolean\n onSelected: (id: string) => void\n onViewTransactions?: (id: string) => void\n selectedId: string\n size?: number\n totalLabel: string\n variant?: 'mini' | 'full'\n}\n\nconst SpendingDonut: React.FC<SpendingDonutProps> = ({\n data,\n isIncome = false,\n onSelected,\n onViewTransactions,\n selectedId,\n size = 150,\n totalLabel,\n variant = 'mini',\n}) => {\n const { spending: spendingCopy } = useGlobalCopyStore()\n const theme = useTheme()\n const { isTablet } = useScreenSize()\n\n const selectedCategory = React.useMemo(\n () => (selectedId ? data.categoryData.find((cd) => cd.guid === selectedId) : undefined),\n [selectedId],\n )\n\n const donutData = React.useMemo(() => {\n if (data.donutData.length > 0) return data.donutData\n\n // Empty Donut zero state\n return [{ id: '0', color: theme.palette.border.light, value: 100 }]\n }, [data, theme])\n\n const handleViewTransactions = () => {\n onViewTransactions?.(selectedId)\n }\n\n const iconSize = isTablet ? 32 : 48\n\n return (\n <Donut data={donutData} onClick={onSelected} selectedId={selectedId} size={size}>\n <Stack alignItems=\"center\" height=\"100%\" justifyContent=\"center\" width=\"100%\">\n <Stack alignItems=\"center\" justifyContent=\"center\" minHeight={size} minWidth={size}>\n {selectedCategory && (\n <Stack\n alignItems=\"center\"\n gap={variant === 'mini' ? 0 : 8}\n mb={variant === 'mini' ? 0 : 8}\n mt={variant === 'mini' ? 0 : -16}\n sx={\n variant === 'mini'\n ? { gap: 0, mb: 0 }\n : { gap: { xs: 4, xl: 8 }, mb: { xs: 4, xl: 8 } }\n }\n >\n <CategoryIcon\n categoryGuid={isIncome ? CategoryGuids.INCOME : selectedCategory.guid}\n size={variant === 'mini' ? 24 : iconSize}\n variant={CategoryIconVariants.Transparent}\n />\n <Text color=\"secondary\" noWrap={true} variant={variant === 'mini' ? 'Tiny' : 'Body'}>\n {selectedCategory ? selectedCategory.name : totalLabel}\n </Text>\n </Stack>\n )}\n\n {!selectedCategory && variant === 'full' && (\n <Text bold={true} color=\"secondary\" sx={{ mb: { xs: 4, xl: 8 } }}>\n {totalLabel}\n </Text>\n )}\n\n <Text variant={variant === 'mini' ? 'H2' : 'H1'}>\n {selectedCategory\n ? formatCurrency(selectedCategory.amount, '0,0')\n : formatCurrency(data.totalAmount, '0,0')}\n </Text>\n\n {!selectedCategory && variant === 'mini' && (\n <Text color=\"secondary\" noWrap={true} variant=\"Tiny\">\n {totalLabel}\n </Text>\n )}\n\n {variant === 'full' && (\n <Button\n aria-label={`View ${selectedCategory?.name || ''} Transactions`}\n disabled={data.categoryData.length === 0}\n onClick={handleViewTransactions}\n sx={{ mt: { xl: 4, xs: 0 }, zIndex: 1 }}\n variant=\"text\"\n >\n {spendingCopy.view_transactions}\n </Button>\n )}\n </Stack>\n </Stack>\n </Donut>\n )\n}\n\nexport default observer(SpendingDonut)\n","import React from 'react'\n\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\n\nimport { Text } from '@kyper/mui'\n\nimport type { SpendingData } from '../utils/SpendingData'\n\ninterface SpendingLegendProps {\n data: SpendingData\n onSelected: (id: string) => void\n selectedId: string\n}\n\nconst SpendingLegend: React.FC<SpendingLegendProps> = ({ data, onSelected, selectedId }) => {\n return (\n <Stack gap={8} height=\"100%\" justifyContent=\"center\" my=\"auto\">\n {data.categoryData.map((item) => (\n <Stack\n alignItems=\"center\"\n aria-label={item.name}\n aria-selected={item.guid === selectedId}\n direction=\"row\"\n gap={8}\n key={item.guid}\n onClick={() => onSelected(item.guid)}\n role=\"button\"\n sx={{ cursor: 'pointer' }}\n >\n <Box borderRadius={4} height={8} sx={{ backgroundColor: item.color }} width={8} />\n <Text bold={item.guid === selectedId} variant=\"XSmall\">\n {item.name}\n </Text>\n </Stack>\n ))}\n </Stack>\n )\n}\n\nexport default SpendingLegend\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 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/useTheme'\n\nimport { useCategoryStore, useGlobalCopyStore, useGlobalUiStore } 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 { spending: spendingCopy } = useGlobalCopyStore()\n const { selectedAccounts } = useGlobalUiStore()\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 { categories, dateRangeCategoryTotals, loadDateRangeCategoryTotals } = useCategoryStore()\n\n React.useEffect(() => {\n loadDateRangeCategoryTotals(\n selectedAccounts,\n startOfMonth(new Date()),\n endOfMonth(new Date()),\n ).finally()\n }, [selectedAccounts])\n\n const [selectedId, setSelectedId] = React.useState('')\n const [selectedTab, setSelectedTab] = React.useState(0)\n\n const spendingData = React.useMemo(\n () => getSpendingData(categories, 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 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 <Box>\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\n data={spendingData}\n onSelected={handleSelected}\n selectedId={selectedId}\n />\n </Stack>\n </Box>\n )}\n {selectedTab === 1 && (\n <Box>\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 )}\n </Box>\n )\n}\n\nexport default observer(MiniSpendingChart)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport { MiniWidgetContainer, MiniWidgetProps, useGlobalCopyStore } from '../common'\nimport MiniSpendingChart from './components/MiniSpendingChart'\n\nconst SpendingMiniWidget: React.FC<MiniWidgetProps> = ({ onPrimaryCtaClick, sx = {} }) => {\n const { spending: spendingCopy } = useGlobalCopyStore()\n\n return (\n <MiniWidgetContainer\n className=\"mx-exp-spending-miniwidget\"\n onPrimaryCtaClick={onPrimaryCtaClick}\n primaryCtaLabel={spendingCopy.primary_cta}\n sx={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 '@kyper/mui'\n\nimport { formatCurrency, useGlobalCopyStore } from '../../common'\nimport { SpendingData } from '../utils/SpendingData'\nimport ListItemButton from '@mui/material/ListItemButton'\n\ninterface SpendingListProps {\n data: SpendingData\n onSelected: (id: string) => 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} sx={{ py: 12 }}>\n {`${title} ${spendingCopy.by_category}`}\n </Text>\n\n <Divider aria-hidden=\"true\" />\n\n <List>\n {data.categoryData.map((item) => (\n <React.Fragment key={item.guid}>\n <ListItem\n disableGutters={true}\n disablePadding={true}\n sx={{\n minHeight: 44,\n }}\n >\n <ListItemButton\n aria-expanded={Boolean(selectedCategory?.guid === item.guid)}\n onClick={() => onSelected(item.guid)}\n sx={{ minHeight: 44, px: 8, py: 0 }}\n >\n <Box\n borderRadius={4}\n flexShrink={0}\n height={8}\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=\"Body\">\n {formatCurrency(item.amount, '0,0')}\n </Text>\n </Stack>\n </ListItemButton>\n </ListItem>\n\n <Divider />\n\n {item.categoryTotals && item.categoryTotals.length > 0 && (\n <Collapse in={Boolean(selectedCategory?.guid === item.guid)} unmountOnExit={true}>\n <List>\n {selectedCategory?.categoryTotals?.map((subItem) => (\n <ListItem\n key={subItem.guid}\n sx={{\n pl: 24,\n pr: 8,\n py: 0,\n }}\n >\n <Stack direction=\"row\" justifyContent=\"space-between\" width=\"100%\">\n <Text>{subItem.name} </Text>\n <Text>{formatCurrency(subItem.amount, '0,0')}</Text>\n </Stack>\n </ListItem>\n ))}\n <Divider />\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')}`}\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) => 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 { isLoadingCategoryTotals } = useCategoryStore()\n const { spending: spendingCopy } = useGlobalCopyStore()\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 {isLoadingCategoryTotals && loadingDonut}\n {/* Not using a ternary here because it doesn't show the animation */}\n {!isLoadingCategoryTotals && (\n <SpendingDonut\n data={data}\n onSelected={onSelected}\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 Tab from '@mui/material/Tab'\nimport Tabs from '@mui/material/Tabs'\nimport { useTheme } from '@mui/material'\nimport type { Theme } from '@mui/system'\n\nimport {\n CategoryGuids,\n Drawer,\n Transaction,\n useCategoryStore,\n useGlobalCopyStore,\n useGlobalUiStore,\n useTransactionStore,\n} from '../../common'\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\n const { categories, dateRangeCategoryTotals, loadDateRangeCategoryTotals } = useCategoryStore()\n const { spending: spendingCopy } = useGlobalCopyStore()\n const { displayedDateRange, selectedAccounts, selectedAccountGuids } = useGlobalUiStore()\n const { setFilter, sortedTransactions: transactions } = useTransactionStore()\n\n const [selectedId, setSelectedId] = React.useState('')\n const [selectedTab, setSelectedTab] = React.useState(0)\n const [transactionGuid, setTransactionGuid] = React.useState('')\n const [transactionsOpen, setTransactionsOpen] = React.useState(false)\n\n React.useEffect(() => {\n loadDateRangeCategoryTotals(\n selectedAccounts,\n displayedDateRange.start,\n displayedDateRange.end,\n ).finally()\n }, [selectedAccounts, displayedDateRange])\n\n const spendingData = React.useMemo(\n () => getSpendingData(categories, 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],\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 === '0' ? '' : id)\n }\n\n const handleViewTransactions = (id: string) => {\n const transactionFilter = {\n accounts: 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 })\n }\n } else {\n // Income\n setFilter({\n ...transactionFilter,\n custom: (t: Transaction) =>\n id ? t.category_guid === id : t.top_level_category_guid === CategoryGuids.INCOME,\n })\n }\n\n setTransactionsOpen(true)\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 <TransactionList onClick={setTransactionGuid} />\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} from '../common'\n\nimport type { WidgetProps } from '../common'\n\nimport Spending from './components/Spending'\n\ninterface RSpendingWidgetProps extends WidgetProps {\n onBackClick?: () => void\n}\n\nconst SpendingWidget: React.FC<RSpendingWidgetProps> = ({ onBackClick, sx = {} }) => {\n const { accounts } = useAccountStore()\n const { spending: spendingCopy } = useGlobalCopyStore()\n const { isInitialized, setDisplayedDate, setSelectedAccounts } = useGlobalUiStore()\n const { onEvent } = useEvent()\n\n const [isWidgetInitialized, setIsWidgetInitialized] = React.useState(false)\n\n React.useEffect(() => {\n setSelectedAccounts(accounts)\n }, [accounts])\n\n React.useEffect(() => {\n setDisplayedDate(startOfMonth(startOfToday()), endOfMonth(startOfToday()))\n setIsWidgetInitialized(true)\n onEvent(ANALYTICS_EVENTS.SPENDING_VIEW)\n }, [])\n\n const handleDateChanged = (range: DateRange<Date>) => {\n setDisplayedDate(range[0] as Date, range[1] as Date)\n }\n\n if (!isInitialized || !isWidgetInitialized) {\n return <Loader />\n }\n\n return (\n <WidgetContainer\n accountOptions={accounts}\n calendarActions={{ onRangeChanged: handleDateChanged }}\n onAccountsFilterClick={() => onEvent(ANALYTICS_EVENTS.SPENDING_CLICK_FILTER)}\n onBackClick={onBackClick}\n sx={sx}\n title={spendingCopy.title}\n >\n <Box height=\"calc(100dvh - 150px)\" overflow=\"scroll\" width=\"100%\">\n <Spending />\n </Box>\n </WidgetContainer>\n )\n}\n\nexport default observer(SpendingWidget)\n","import { GridComparatorFn } from '@mui/x-data-grid-pro'\n\nimport { CategoryColors, CategoryGuidToName, MonthlyCategoryTotals } from '../../common'\n\ntype DataPoint = { x: Date; y: number }\ntype Dataset = DataPoint[]\n\ntype CategoryTotalData = {\n top_level_category_guid: string\n category_guid: string\n amount: number\n year_month: number // e.g. 202409\n}\n\ntype GroupedCategoryTotalData = {\n [categoryGuid: string]: CategoryTotalData[]\n}\n\nexport interface StackedLineChartData {\n top_level_category_guid: string\n category_guid: string\n category_name: string\n category_color: string\n dataset: Dataset\n}\n\nconst getCategoryColor = (categoryGuid: string): string => {\n return CategoryColors[categoryGuid] ?? CategoryColors.default\n}\n\nconst getCategoryName = (categoryGuid: string): string => {\n return CategoryGuidToName[categoryGuid]\n}\n\nfunction createYearMonthRange(start: Date, end: Date): number[] {\n const result = []\n const current = new Date(start)\n\n while (current <= end) {\n const year = current.getFullYear()\n const month = String(current.getMonth() + 1).padStart(2, '0')\n result.push(Number(`${year}${month}`))\n current.setMonth(current.getMonth() + 1)\n }\n\n return result\n}\n\nconst createGroupedCategoryTotals = (totals: MonthlyCategoryTotals[]): GroupedCategoryTotalData => {\n const groupedTotals = totals.reduce((result, item) => {\n const totalData: CategoryTotalData = {\n top_level_category_guid: item.top_level_category_guid,\n category_guid: item.category_guid,\n amount: item.total,\n year_month: item.year_month,\n }\n\n const { top_level_category_guid, category_guid } = totalData\n\n // Ensure category bucket exists\n if (!result[category_guid]) {\n result[category_guid] = []\n }\n result[category_guid].push(totalData)\n\n // Ensure top-level category bucket exists (if different than category)\n if (top_level_category_guid !== category_guid) {\n if (!result[top_level_category_guid]) {\n result[top_level_category_guid] = []\n }\n result[top_level_category_guid].push(totalData)\n }\n\n return result\n }, {} as GroupedCategoryTotalData)\n\n return groupedTotals\n}\n\nexport const getStackedLineChartData = (\n totals: MonthlyCategoryTotals[],\n start: Date,\n end: Date,\n): StackedLineChartData[] => {\n const groupedTotals = createGroupedCategoryTotals(totals)\n const yearMonths = createYearMonthRange(start, end)\n\n const chartData = Object.entries(groupedTotals).map(([categoryGuid, totals]) => {\n const topLevelCategoryGuid = totals[0].top_level_category_guid\n // Build dataset for current category\n const dataset: Dataset = yearMonths\n // Build chart coordinates and fill missing totals with 0\n .map((yearMonth) => {\n // Sum category totals for same month\n // (totals with same top_level_category_guid but different category_guid)\n // And fill missing totals with 0\n // (necessary for StackedLineChart lines to be smooth)\n const sumTotal = totals\n .filter((total) => total.year_month === yearMonth)\n .reduce((sum, total) => sum + Math.abs(total.amount), 0)\n\n const year = Number(String(yearMonth).slice(0, 4))\n const month = Number(String(yearMonth).slice(4))\n const date = new Date(year, month - 1)\n\n return { x: date, y: sumTotal }\n })\n .sort((a, b) => a.x.getTime() - b.x.getTime())\n\n return {\n top_level_category_guid: topLevelCategoryGuid,\n category_guid: categoryGuid,\n category_name: getCategoryName(categoryGuid),\n category_color: getCategoryColor(topLevelCategoryGuid),\n dataset: dataset,\n }\n })\n\n return chartData\n}\n\nexport const amountComparator: GridComparatorFn<string | number> = (v1, v2) => {\n const num1 = typeof v1 === 'string' ? parseFloat(v1.replace(/[^0-9.-]+/g, '')) : v1\n const num2 = typeof v2 === 'string' ? parseFloat(v2.replace(/[^0-9.-]+/g, '')) : v2\n\n return (num1 || 0) - (num2 || 0)\n}\n","import { GridCellParams } from '@mui/x-data-grid'\nimport Stack from '@mui/material/Stack'\n\nimport { CurrencyText } from '../../../common/components/CurrencyText'\n\nexport const AmountCell = (params: GridCellParams) => {\n const amount = params.row[params.field]\n\n return (\n <Stack alignItems=\"flex-end\" tabIndex={params.tabIndex}>\n <CurrencyText amount={amount} variant=\"Small\" />\n </Stack>\n )\n}\n","import { GridCellParams } from '@mui/x-data-grid'\nimport { CategoryIcon, Text } from '@kyper/mui'\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\n\nimport { buildDynamicCopy, CategoryGuidToName, useGlobalCopyStore } from '../../../common'\n\nconst CategoryIconLabel: React.FC<{\n categoryGuid: string\n topLevelCategoryGuid: string\n}> = ({ categoryGuid, topLevelCategoryGuid }) => {\n const { categories: copy } = useGlobalCopyStore()\n const categoryName = CategoryGuidToName[categoryGuid]\n\n return (\n <Stack alignItems=\"center\" direction=\"row\" justifyContent=\"center\">\n <Box\n aria-label={buildDynamicCopy(copy.category_icon_label_aria, categoryName) as string}\n role=\"img\"\n >\n <CategoryIcon categoryGuid={topLevelCategoryGuid} />\n </Box>\n <Text sx={{ ml: 12, pb: 6 }} variant=\"Small\">\n {categoryName}\n </Text>\n </Stack>\n )\n}\n\nexport const CategoryCell = (params: GridCellParams) => {\n return (\n <Stack alignItems=\"center\" direction=\"row\" height=\"100%\" width=\"100%\">\n <CategoryIconLabel\n categoryGuid={params.row.category}\n topLevelCategoryGuid={params.row.top_level_category_guid}\n />\n </Stack>\n )\n}\n","import React from 'react'\nimport Box from '@mui/material/Box'\nimport { DataGridPro, GridColDef, GridSortModel } from '@mui/x-data-grid-pro'\n\nimport {\n ANALYTICS_EVENTS,\n DATE_FORMATS_INTL,\n formatDate,\n MonthlyCategoryTotals,\n useEvent,\n} from '../../common'\n\nimport { AmountCell } from './trendstable/AmountCell'\nimport { CategoryCell } from './trendstable/CategoryCell'\nimport { HeaderCell } from './trendstable/HeaderCell'\nimport { amountComparator } from '../utils/TrendsData'\n\nconst generateMonthHeaders = (start: Date, end: Date): string[] => {\n const result: string[] = []\n const current = new Date(start)\n\n while (current <= end) {\n const formattedDate = formatDate(current, DATE_FORMATS_INTL.MONTH)\n result.push(formattedDate)\n current.setMonth(current.getMonth() + 1)\n }\n\n return result\n}\n\ninterface CategoryRow {\n id: string\n category: string\n [key: string]: string | number // For dynamic month keys with string or number values\n}\n\ninterface TrendsTableProps {\n sx?: any\n height?: number | string\n monthlyCategoryTotals: MonthlyCategoryTotals[]\n selectedDateRange: { start: Date; end: Date }\n selectedCategory?: string\n onClickRow?: (category: string) => void\n}\n\nconst TrendsTable: React.FC<TrendsTableProps> = ({\n monthlyCategoryTotals,\n selectedDateRange,\n selectedCategory,\n onClickRow,\n height = '100dvh',\n sx = {},\n}) => {\n const { onEvent } = useEvent()\n const monthName = formatDate(new Date(), DATE_FORMATS_INTL.MONTH_SHORT)\n const [sortModel, setSortModel] = React.useState<GridSortModel>([\n { field: monthName, sort: 'desc' },\n ])\n\n // Generate all headers for the selected date range\n const headerNames = React.useMemo(() => {\n return generateMonthHeaders(selectedDateRange.start, selectedDateRange.end)\n }, [selectedDateRange])\n\n const columns: GridColDef[] = [\n {\n field: 'category',\n headerName: 'Category',\n minWidth: 175,\n renderHeader: HeaderCell,\n renderCell: CategoryCell,\n sortable: true,\n type: 'string',\n },\n ...headerNames.map(\n (headerName) =>\n ({\n field: headerName,\n headerName: headerName,\n minWidth: 75,\n renderHeader: HeaderCell,\n renderCell: AmountCell,\n align: 'right',\n headerAlign: 'right',\n sortable: true,\n hideSortIcons: false,\n type: 'number',\n sortComparator: amountComparator,\n }) as GridColDef,\n ),\n ]\n\n const rows = React.useMemo(() => {\n const selectedCategoryTotals = selectedCategory\n ? monthlyCategoryTotals.filter(\n (total) =>\n total.category_guid === selectedCategory ||\n total.top_level_category_guid === selectedCategory,\n )\n : monthlyCategoryTotals\n\n const groupedTotals = selectedCategoryTotals.reduce(\n (groups: Record<string, CategoryRow>, item) => {\n const { category_guid, top_level_category_guid, month, total, year } = item\n\n // Determine the grouping key based on selectedCategory\n const groupKey = selectedCategory ? category_guid : top_level_category_guid\n\n if (!groups[groupKey]) {\n groups[groupKey] = {\n id: groupKey,\n category: groupKey,\n category_guid,\n top_level_category_guid,\n }\n }\n\n // Format the month name and assign the total\n const monthName = formatDate(new Date(year, month - 1), DATE_FORMATS_INTL.MONTH_SHORT)\n\n // Accumulate totals for the month\n if (!groups[groupKey][monthName]) {\n groups[groupKey][monthName] = 0\n }\n groups[groupKey][monthName] = (groups[groupKey][monthName] as number) + total\n\n return groups\n },\n {},\n )\n\n // Convert grouped totals into an array of rows\n return Object.values(groupedTotals)\n }, [monthlyCategoryTotals, selectedCategory])\n\n return (\n <Box sx={{ height: height, width: '100%', overflowX: 'auto', boxShadow: 'none', ...sx }}>\n <DataGridPro\n columns={columns}\n disableColumnFilter={true}\n disableColumnMenu={true}\n hideFooter={true}\n initialState={{ sorting: { sortModel } }}\n onRowClick={(r) => {\n onClickRow?.(r.row.category)\n onEvent(ANALYTICS_EVENTS.TRENDS_CLICK_TABLE_ROW)\n }}\n onSortModelChange={(newModel) => {\n setSortModel(newModel)\n onEvent(ANALYTICS_EVENTS.TRENDS_CLICK_TABLE_SORT)\n }}\n rows={rows}\n slotProps={{ baseIconButton: { color: 'secondary', sx: { ml: 8 } } }}\n sortModel={sortModel}\n sortingOrder={['asc', 'desc']}\n />\n </Box>\n )\n}\n\nexport default TrendsTable\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport {\n ANALYTICS_EVENTS,\n Drawer,\n useGlobalCopyStore,\n useEvent,\n useTransactionStore,\n useGlobalUiStore,\n Transaction,\n} from '../../common'\nimport { TransactionDetails, TransactionList } from '../../transactions'\n\nconst copy = {\n title: 'Transaction List',\n}\n\ninterface TrendsDrawerProps {\n categoryGuid: string\n dateRange: {\n start: Date\n end: Date\n }\n isOpen: boolean\n onClose: () => void\n}\n\nconst TrendsDrawer: React.FC<TrendsDrawerProps> = ({\n categoryGuid,\n dateRange,\n isOpen,\n onClose,\n}) => {\n const { onEvent } = useEvent()\n const { selectedAccountGuids: accounts } = useGlobalUiStore()\n const { common: commonCopy } = useGlobalCopyStore()\n const { setFilter, sortedTransactions } = useTransactionStore()\n\n const [guid, setGuid] = React.useState('')\n const transaction = React.useMemo(() => sortedTransactions.find((t) => t.guid === guid), [guid])\n\n React.useEffect(() => {\n setFilter({\n accounts,\n dateRange,\n custom: (t: Transaction) =>\n categoryGuid === '' ||\n categoryGuid === t.category_guid ||\n categoryGuid === t.top_level_category_guid,\n })\n }, [accounts, categoryGuid, dateRange])\n\n React.useEffect(() => onEvent(ANALYTICS_EVENTS.TRENDS_VIEW_TRANSACTIONS), [])\n\n const handleClose = () => {\n setGuid('')\n onClose()\n }\n\n return (\n <Drawer\n ariaLabelClose={commonCopy.close_aria}\n isOpen={isOpen}\n onClose={handleClose}\n title={copy.title}\n >\n {transaction && <TransactionDetails transaction={transaction} />}\n {!transaction && <TransactionList onClick={setGuid} />}\n </Drawer>\n )\n}\n\nexport default observer(TrendsDrawer)\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { useTheme } from '@mui/material/styles'\n\nimport { DateRange } from '@mui/x-date-pickers-pro'\nimport { Icon, Text } from '@kyper/mui'\nimport Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\nimport Button from '@mui/material/Button'\nimport ToggleButton from '@mui/material/ToggleButton'\nimport ToggleButtonGroup from '@mui/material/ToggleButtonGroup'\n\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { subMonths } from 'date-fns/subMonths'\nimport { addSeconds } from 'date-fns/addSeconds'\nimport { differenceInCalendarMonths } from 'date-fns/differenceInCalendarMonths'\n\nimport {\n ANALYTICS_EVENTS,\n DATE_FORMATS_INTL,\n Loader,\n StackedLineChart,\n WidgetContainer,\n WidgetProps,\n formatDate,\n useAccountStore,\n useEvent,\n useCategoryStore,\n useGlobalCopyStore,\n useGlobalUiStore,\n useScreenSize,\n useTransactionStore,\n} from '../common'\n\nimport { getStackedLineChartData, StackedLineChartData } from './utils/TrendsData'\nimport { getTopLevelCategoryTotals, isExpense, isIncome } from './utils/shared'\n\nimport TrendsTable from './components/TrendsTable'\nimport TrendsDrawer from './components/TrendsDrawer'\n\nconst tempCopy = {\n view_transactions: 'View Transactions',\n}\n\nconst TrendsFullWidget: React.FC<WidgetProps> = ({ onBackClick, sx }) => {\n const theme = useTheme()\n const { onEvent } = useEvent()\n const { isDesktop, isTablet, isMobile } = useScreenSize()\n const { accounts } = useAccountStore()\n const { loadMonthlyCategoryTotals, monthlyCategoryTotals, getCategoryName } = useCategoryStore()\n const { sortedTransactions: transactions } = useTransactionStore()\n const { isInitialized, selectedAccounts, setSelectedAccounts } = useGlobalUiStore()\n const { trends: copy } = useGlobalCopyStore()\n\n const isDark = theme.palette.mode === 'dark'\n\n const [isWidgetInitialized, setIsWidgetInitialized] = React.useState(false)\n const [showTransactions, setShowTransactions] = React.useState(false)\n const [selectedTab, setSelectedTab] = React.useState('Chart')\n const [selectedCategory, setSelectedCategory] = React.useState('')\n // NOTE: does this date range need to be adjusted bidirectionally?\n const [selectedDateRange, setSelectedDateRange] = React.useState({\n start: addSeconds(endOfMonth(subMonths(new Date(), 6)), 1),\n end: endOfMonth(new Date()),\n })\n\n // Reset selected accounts on load\n React.useEffect(() => {\n setSelectedAccounts(accounts)\n }, [accounts])\n\n // Initialize monthlyCategoryTotals, and reload on account or date range change\n React.useEffect(() => {\n if (isInitialized) {\n loadMonthlyCategoryTotals(\n selectedAccounts,\n selectedDateRange.start,\n selectedDateRange.end,\n ).finally(() => {\n setIsWidgetInitialized(true)\n })\n }\n }, [isInitialized, selectedAccounts, selectedDateRange])\n\n // Cache a full year of StackedLineChart data\n const chartData = React.useMemo(() => {\n if (!isWidgetInitialized) return { stackedDatasets: [], unstackedDatasets: [] }\n\n const data = getStackedLineChartData(\n monthlyCategoryTotals,\n selectedDateRange.start,\n selectedDateRange.end,\n )\n\n const filteredData = selectedCategory.length\n ? data.filter(\n (d) =>\n d.top_level_category_guid === selectedCategory || d.category_guid === selectedCategory,\n )\n : getTopLevelCategoryTotals(data)\n\n return {\n stackedDatasets: filteredData.filter(isExpense) as StackedLineChartData[],\n unstackedDatasets: filteredData.filter(isIncome) as StackedLineChartData[],\n }\n }, [monthlyCategoryTotals, selectedCategory, selectedDateRange])\n\n // Build date range text for display\n // e.g. October 2023 - March 2024, or Oct 2023 - Mar 2024\n const dateRangeText = React.useMemo(() => {\n const startDate = formatDate(\n selectedDateRange.start,\n isMobile ? DATE_FORMATS_INTL.MONTH_SHORT_YEAR : DATE_FORMATS_INTL.MONTH_YEAR,\n )\n const endDate = formatDate(\n selectedDateRange.end,\n isMobile ? DATE_FORMATS_INTL.MONTH_SHORT_YEAR : DATE_FORMATS_INTL.MONTH_YEAR,\n )\n return `${startDate} - ${endDate}`\n }, [selectedDateRange, isMobile])\n\n const onTabChange = (_event: React.SyntheticEvent, newValue: string) => {\n setSelectedTab(newValue ?? selectedTab)\n onEvent(ANALYTICS_EVENTS.TRENDS_CLICK_TOGGLE)\n }\n\n const onRangeChanged = (dateRange: DateRange<Date>) => {\n const startDate = addSeconds(dateRange?.[0] as Date, 1)\n const endDate = dateRange?.[1] as Date\n const months = differenceInCalendarMonths(endDate, startDate)\n\n setSelectedDateRange({ start: startDate, end: endDate })\n onEvent(ANALYTICS_EVENTS.TRENDS_CLICK_DATE, {\n time_period: months + 'M',\n })\n }\n\n const onAccountsFilterClick = () => {\n onEvent(ANALYTICS_EVENTS.TRENDS_CLICK_FILTER)\n }\n const onClickRow = (guid: string) => {\n setSelectedCategory(guid)\n }\n const onClickLegend = (guid: string) => {\n setSelectedCategory(guid)\n onEvent(ANALYTICS_EVENTS.TRENDS_CLICK_LEGEND, { category: getCategoryName(guid) })\n }\n const onHoverLegend = (guid: string) => {\n onEvent(ANALYTICS_EVENTS.TRENDS_HOVER_LEGEND, { category: getCategoryName(guid) })\n }\n const onHoverArea = (category: string) => {\n onEvent(ANALYTICS_EVENTS.TRENDS_HOVER_AREA, { category })\n }\n const onHoverPoint = (category: string) => {\n onEvent(ANALYTICS_EVENTS.TRENDS_HOVER_POINT, { category })\n }\n\n if (!isInitialized || !isWidgetInitialized) return <Loader />\n\n return (\n <WidgetContainer\n accountOptions={accounts}\n calendarActions={{ onRangeChanged }}\n dateRange={selectedDateRange}\n dateRangeVariant=\"timeframebuttons\"\n onAccountsFilterClick={onAccountsFilterClick}\n onBackClick={onBackClick}\n sx={sx}\n title={copy.title}\n >\n <Stack\n sx={{\n // eslint-disable-next-line no-nested-ternary\n px: isDesktop ? 48 : isTablet ? 24 : 12,\n }}\n >\n <Stack\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n sx={{ pb: isMobile ? 12 : 24, pt: isMobile ? 24 : 48 }}\n >\n <Box sx={{ mr: 10, minWidth: '60%' }}>\n <Text\n display=\"block\"\n fontWeight={700}\n sx={{\n whiteSpace: 'normal',\n overflow: 'visible',\n textOverflow: 'unset',\n }}\n variant={isDesktop ? 'H3' : 'Body'}\n >\n {getCategoryName(selectedCategory) || copy.sub_title}\n </Text>\n <Text variant={isDesktop ? 'Body' : 'Small'}>{dateRangeText}</Text>\n </Box>\n <ToggleButtonGroup\n exclusive={true}\n onChange={onTabChange}\n orientation=\"horizontal\"\n value={selectedTab}\n >\n {['Chart', 'Table'].map((tab) => (\n <ToggleButton\n key={tab}\n sx={{\n fontSize: 15,\n fontWeight: 600,\n height: 44,\n width: 56,\n color: isDark ? theme.palette.grey[200] : theme.palette.grey[600],\n borderColor: isDark ? theme.palette.grey[600] : theme.palette.grey[400],\n '&:hover': {\n backgroundColor: isDark ? `${theme.palette.primary.darker}25` : 'inherit',\n borderColor: isDark ? theme.palette.grey[500] : theme.palette.primary.main,\n color: isDark ? theme.palette.primary.light : theme.palette.primary.dark,\n },\n '&.Mui-selected': {\n backgroundColor: isDark\n ? theme.palette.primary.darker\n : theme.palette.primary.lighter,\n borderColor: isDark ? theme.palette.primary.light : theme.palette.primary.main,\n color: isDark ? theme.palette.common.white : theme.palette.primary.dark,\n },\n '&.Mui-disabled': {\n borderColor: isDark ? theme.palette.grey[700] : theme.palette.grey[400],\n color: theme.palette.grey[500],\n },\n }}\n value={tab}\n >\n {tab === 'Chart' ? (\n <Icon name=\"table_chart_view\" />\n ) : (\n <Icon name=\"format_list_bulleted\" />\n )}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n </Stack>\n <Stack alignItems=\"center\" flexDirection=\"row\" width=\"100%\">\n <Box flexGrow={1}>\n {selectedCategory && (\n <Button onClick={() => setSelectedCategory('')} sx={{ p: 0, pr: 5 }}>\n <Icon name=\"arrow_back\" />\n {copy.all_categories}\n </Button>\n )}\n </Box>\n <Button onClick={() => setShowTransactions(true)} sx={{ px: 5 }}>\n {`${tempCopy.view_transactions} (${transactions.length})`}\n </Button>\n </Stack>\n <Box>\n {selectedTab === 'Chart' && (\n <StackedLineChart\n onClickLegend={onClickLegend}\n onHoverArea={onHoverArea}\n onHoverLegend={onHoverLegend}\n onHoverPoint={onHoverPoint}\n stackedDatasets={chartData.stackedDatasets}\n unstackedDatasets={chartData.unstackedDatasets}\n />\n )}\n {selectedTab === 'Table' && (\n <TrendsTable\n monthlyCategoryTotals={monthlyCategoryTotals}\n onClickRow={onClickRow}\n selectedCategory={selectedCategory}\n selectedDateRange={selectedDateRange}\n />\n )}\n </Box>\n </Stack>\n <TrendsDrawer\n categoryGuid={selectedCategory}\n dateRange={selectedDateRange}\n isOpen={showTransactions}\n onClose={() => setShowTransactions(false)}\n />\n </WidgetContainer>\n )\n}\n\nexport default observer(TrendsFullWidget)\n","import { observer } from 'mobx-react-lite'\nimport { useTheme } from '@mui/material/styles'\n\nimport { LineChart, useCategoryStore, useGlobalCopyStore } from '../../common'\nimport { getSpendingData } from '../utils/SpendingData'\n\nconst SpendingChart = () => {\n const theme = useTheme()\n const { monthlyCategoryTotals } = useCategoryStore()\n const { trends: trendsCopy } = useGlobalCopyStore()\n\n const data = getSpendingData(monthlyCategoryTotals)\n\n return (\n <LineChart\n baseline=\"min\"\n colors={[theme.palette.primary.main]}\n datasets={[data]}\n height={300}\n labels={[trendsCopy.spending_label]}\n showArea={true}\n showAverage={true}\n showMarkLabel={true}\n useCustomMark={true}\n />\n )\n}\n\nexport default observer(SpendingChart)\n","import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport {\n Loader,\n MiniWidgetContainer,\n MiniWidgetProps,\n useCategoryStore,\n useGlobalCopyStore,\n useGlobalStore,\n useGlobalUiStore,\n} from '../common'\n\nimport SpendingChart from './components/SpendingChart'\n\nconst TrendsMiniWidget: React.FC<MiniWidgetProps> = ({ onPrimaryCtaClick, sx }) => {\n const { loadMonthlyCategoryTotals } = useCategoryStore()\n const { isInitialized } = useGlobalStore()\n const { trends: trendsCopy } = useGlobalCopyStore()\n const { selectedAccounts } = useGlobalUiStore()\n\n const [isWidgetInitialized, setIsWidgetInitialized] = React.useState(false)\n\n React.useEffect(() => {\n if (isInitialized) {\n loadMonthlyCategoryTotals(selectedAccounts).finally(() => {\n setIsWidgetInitialized(true)\n })\n }\n }, [isInitialized, selectedAccounts])\n\n if (!isInitialized || !isWidgetInitialized) {\n return <Loader />\n }\n\n return (\n <MiniWidgetContainer\n onPrimaryCtaClick={onPrimaryCtaClick}\n primaryCtaLabel={trendsCopy.primary_cta}\n subTitle={trendsCopy.sub_title}\n sx={sx}\n title={trendsCopy.mini_title}\n >\n <SpendingChart />\n </MiniWidgetContainer>\n )\n}\n\nexport default observer(TrendsMiniWidget)\n"],"names":["analyticsSession","endpoint","token","version","featureName","analyticsApi","AnalyticsApi","analytics_session","host","event","getUnixTime","pageview","ApiEndpoints","ANALYTICS_EVENTS","ORDINAL_DATE_FORMAT","ORDINAL_MONTH_DAY_YEAR_FORMAT","DATE_FORMATS_INTL","formatDate","date","dFormat","intlFormat","getLocale","AccountType","AccountSubType","PropertyType","ConnectionStatusEnums","ProcessingStatuses","MfaStatuses","ErrorStatuses","NonConnectedStatuses","ConnectionStatus","StatusName","AccountTypeName","AccountIcon","AccountIconVariants","PropertyTypeName","PropertyIcon","INCOME_ACCOUNT_TYPES","PAYMENT_ACCOUNT_TYPES","SPENDING_ACCOUNT_TYPES","CategoryGuids","PaymentCategories","CategoryGuidToName","CategoryColors","CategoryIcon","MAX_MONEY_INPUT","CurrencyCodes","RecurrenceTypes","RECURRENCE_COPY","LOADING_STATUS","PlanTypes","IterationItemTypes","DEFAULT_DONUT_SIZE","DEFAULT_STROKE_WIDTH","Sizes","TOUCH_TARGET","getCategory","categories","categoryGuid","c","getDetailedCategory","detailedCategories","guid","dc","getDetailedSubCategory","parent","sc","getCategoryTotalsByParent","dateRangeTotals","categoryTotals","dateRangeTotal","category","parentGuid","parentCategory","categoryTotal","parentCategoryTotal","ct","isIncome","copyPattern","buildDynamicCopy","str","args","hasFormattedElement","arg","matches","acc","match","matchIndex","temp","groups","curlyIndex","variableName","index","React","element","clonedElement","buildPluralCopy","strOne","strMulti","count","Fetch","url","options","response","text","data","err","Honeybadger","body","error","formatCurrency","amount","formatting","roundingFunction","numeral","getCurrencyCodes","isValidNumber","value","defaultPercentStyle","formatPercentage","getPluralRules","formatOrdinal","number","copy","rule","getNextWeeklyDate","dayOfWeek","getDay","nextDate","nextDay","isBefore","startOfToday","addWeeks","getNextBiWeeklyDate","nextWeeklyday","getNextMonthlyDate","setDate","addMonths","getNextBiMonthlyDate","nextMonthlyDate","getNextQuarterlyDate","addQuarters","getNextBiQuarterlyDate","nextQuarterlyDate","getNextYearlyDate","addYears","fromUnixUTC","utcTime","fromUnixTime","fromUnixToDayOfWeekAndDate","fromTimestampToMonthYear","timestamp","browser","Bowser","BeatApi","pageNum","perPage","beatParams","fromDate","beat","CategoryApi","startDate","endDate","accounts","account","GlobalCopyApi","namespace","translationKey","LocalizedCopyApi","req","NotificationApi","obj","notification","channel","ScheduledPaymentsApi","scheduledPayment","TransactionType","UserApi","userProfile","WidgetApi","setupMappedSelectedOptions","selectedAccountGuids","accumulator","setupMappedAccounts","accountType","newAccount","AccountFilterOptions","accountFilterButtonEl","onAccountClick","onAccountGroupClick","onCancelClick","onConnectAccountClick","onFilterClick","selectedOptions","setSelectedOptions","handleClose","showAccountNumbers","mappedAccounts","useMemo","shouldShowZeroState","isOpen","isAllChecked","jsx","Popover","jsxs","Stack","AccountsIcon","P","Button","List","ListItem","FormControlLabel","CheckBox","updatedOptions","key","groupedAccounts","allGroupedAccountsSelected","ListSubheader","ListItemButton","ListItemText","isSelected","label","useCombineEvents","events","store","session","storeEvents","curr","eventFunctions","e","useCombinePageviews","pages","useScreenSize","useMediaQuery","useTheme","usePrevious","ref","useRef","useEffect","AccountFilter","sx","variant","isMobile","setAccountFilterButtonEl","onClick","Box","Tooltip","IconButton","Icon","allSelected","selectedOptionsClone","Legend","color","labelAverage","labelMain","tokens","useTokens","styles","getStyles","Text","css","Bar","ariaLabel","height","selectedIndex","handleKeyDown","labelColor","BarLabel","frameName","expandAnimation","keyframes","BarColumn","averageLineHeight","bottomHeight","range","topHeight","valueLabel","width","xAxisLabel","topBarHeight","bottomBarHeight","xAxisColor","sumReducer","rangeReducer","valueReducer","getSectionHeight","hasSection1","hasSection2","fullHeight","getAverageLineHeight","average","max","min","BarChart","barWidth","legendLabelAverage","legendLabelMain","onBarClick","valueFormatter","values","avg","hasTop","hasBottom","getBarColor","EmptyColumn","d","Header","onNextClick","onPreviousClick","H2","KeyboardArrowLeftRoundedIcon","KeyboardArrowRightRoundedIcon","Day","beginDate","isInMonth","theme","isInRange","isWithinInterval","isSameDay","isRangeStart","isRangeEnd","isToday","format","DATE_SIZE","CALENDAR_WIDTH","CalendarSelectionTypes","Calendar","beginDateProp","endDateProp","onDateSelected","onRangeSelected","selectionType","setBeginDate","setEndDate","weeks","weeksInInterval","eachWeekOfInterval","startOfMonth","endOfMonth","i","weekStart","days","eachDayOfInterval","addDays","week","j","handleSelection","handleTodayClick","today","handleNextMonthClick","handlePreviousMonthClick","subMonths","Paper","day","isSameMonth","INNER_RADIUS","OUT_RADIUS","SELECTION_RADIUS","Donut","selectedId","size","children","offset","selectAll","interpolateString","item","startAngle","endAngle","segment","arc","CustomMark","props","showLabel","xNumber","yNumber","handleMarkClick","handleMouseEnter","handleMouseLeave","Fragment","CustomLine","CustomLegend","series","style","commonCopy","useGlobalCopyStore","s","CustomLegend$2","observer","LineChart","baseline","colors","datasets","labels","margin","markHandlers","markStyles","showBars","showArea","showAverage","showMarkLabel","useCustomMark","valueFormatterString","xData","yData","total","yMin","yMax","ResponsiveChartContainer","AreaPlot","LinePlot","MarkPlot","BarPlot","ChartsXAxis","ChartsYAxis","ChartsReferenceLine","ChartsLegend","GlobalDataContext","GlobalDataProvider","globalStore","onEvent","onPageView","WidgetContainerContext","WidgetContainerProvider","availableHeight","availableWidth","useGlobalDataContext","providerName","context","useAccountStore","useBudgetsStore","useCashflowStore","useCategoryStore","useConnectStore","useDebtStore","useGlobalStore","useGlobalUiStore","useGoalStore","useMerchantStore","useNetWorthStore","useNotificationStore","useRecurringActivityStore","useTransactionStore","useUserStore","useEvent","usePageView","useWidgetContainerContext","useWidgetContainerProvider","CategoryIconLabel","topLevelCategoryGuid","getCategoryName","categoryName","CurrencyText","bold","formatString","symbol","rest","CustomAreaTooltip","topLevelGuid","hoveredAreaData","cursorPosition","chartContainerRef","tooltipRef","adjustedPos","setAdjustedPos","useState","tooltipEl","chartEl","tooltipRect","containerRect","newX","newY","seriesSum","sum","dataPoint","Card","CardContent","Divider","Grid","CustomAreaTooltip$1","CustomPointTooltip","dataIndex","dataValue","dataDate","categoryGuids","hoveredLegend","onHoverLegend","onClickLegend","top_level_guid","isHovered","categoryColor","topLevelCategoryColor","baseBackground","transparentBackground","StackedLineChart","onHoverArea","onHoverPoint","stackedDatasets","unstackedDatasets","setHoveredLegend","hoverState","setHoverState","hoveredSeriesId","isAreaHovered","cursorPos","showAreaTooltip","showPointTooltip","xTicks","cumulativeHeights","_","dataset","stackedMax","unstackedMax","stackedSeries","unstackedSeries","guids","getSeriesCategoryGuids","seriesId","handleHoverLegend","handleClickLegend","handleClickArea","clickedSeriesGuid","handleHighlightChange","highlightedItem","hoveredSeriesGuid","hoveredSeries","isPointHovered","hoveredDataPoints","yValue","handleMouseMove","rect","prev","customStyles","selector","point","StatusBar","borderRadius","Dialog","className","disablePrimaryButton","onClose","onPrimaryAction","primaryColor","primaryText","onSecondaryAction","secondaryColor","secondaryText","handlePrimaryAction","handleSecondaryAction","MuiDialog","DialogHeader","DialogContent","DialogFooter","DrawerHeader","ariaLabelClose","shouldShowBorders","shouldShowShadow","title","ArrowBackOutlinedIcon","Drawer","id","isPrimaryDisabled","shouldShowHeaderBorders","shouldShowHeaderShadow","KMuiDrawer","Footer","DateRangeSelector","calendarActions","endOfToday","shouldShrinkToIcon","toolTipContent","isDark","isDesktop","dateRange","setDateRange","shortcut","setShortcut","pickerDateRange","setPickerDateRange","isPickerOpen","setIsPickerOpen","isMonthFormat","setIsMonthFormat","timeframe","setTimeframe","timeframes","getTimeFrameDates","timeframeEndDate","handlePrevNextClick","direction","newRange","isPrev","subYears","startOfYear","endOfYear","numDays","differenceInCalendarDays","subDays","handleRangeChanged","handleTimeframeChanged","ButtonGroup","ToggleButtonGroup","ToggleButton","Tabs","newValue","Tab","DateRangePicker","MultiSegmentDonut","hasGap","segments","strokeWidth","radius","halfSize","length","SingleSegmentDonut","percent","limitedPercent","useDebounce","func","delay","timeoutId","useDimensions","debounceDelay","dimensions","setDimensions","observerRef","previousDimensions","debouncedSetDimensions","customRef","node","entry","MiniWidgetContainer","onPrimaryCtaClick","primaryCtaLabel","subTitle","containerRef","CardHeader","H3","WidgetContainer","accountOptions","actions","dateRangeVariant","hasDivider","onBackClick","onAccountsFilterClick","showDividerAboveDateSelector","isTablet","displayedDateRange","setSelectedAccountGuids","handleBackClick","accountFilterCopy","dateRangeSelectorCopy","selAcctGuids","action","H1","WidgetContainer$1","ConnectStatus","status","MemberConnectionStatus","connectCopy","CircularProgress","ConnectStatus$1","FieldType","CONNECT_WIDGET_ID","CONNECTIONS_WIDGET_ID","ConnectDrawer","loadWidgetProps","showConnectWidget","connectWidget","refreshAccounts","loadWidget","isLoading","setIsLoading","hasError","setHasError","mode","res","ConnectWidget","ConnectDrawer$1","CurrencyInput","allowDecimals","amountIsRequired","customValidate","errorText","minAmount","setAmount","setHasValidInput","errorMsg","setErrorMsg","customCopy","numbersOnly","numbersWithComma","numbersWithDecimal","pattern","nameRef","uuidv4","handleValidation","TextField","Loader","ResponsiveButton","icon","placement","tooltipText","SearchBox","cancelAriaLabel","onChange","placeholder","searchValue","cancelButton","InputAdornment","SearchBox$3","SelectionBox","checked","tooltip","greyColor","borderColor","Radio","TabContentContainer","name","IconBacking","backingSx","DataRow","iconName","rowContents","ListItemAvatar","Avatar","IconWeight","ListItemIcon","InformationTooltip","ListItemWrapper","clickEventName","GlobalCopyStore","makeAutoObservable","runInAction","newCopy","BeatStore","beats","BudgetsApi","budget","getBudgetPercentage","budgetAmount","totalAmount","getBudgetColors","percentage","budgetColors","useGetBudgetDifference","budgets","currentAmount","difference","augmentBudgets","detailedBudgets","spent","parentBudget","b","findBudget","findSubBudget","BudgetsStore","reaction","subBudget","a","alert","budgetsToDelete","budgetToDelete","updatedBudget","useCashflowUiStore","RemainingCash","remaining","RemainingCash$1","CashflowWidgetContent","onAddIncomeClick","cashAccounts","cashBalance","daysUntilNextIncome","expensesTilNextIncome","selectedCashAccounts","setNextIncome","setSelectedCashAccounts","setUpcomingExpenses","nextIncomeActivity","upcomingExpenses","filteredCashBalance","filteredExpenseTotal","expense","availableToSpend","hasCompletedCashflowOnboarding","CashflowWidgetContent$1","CashflowMiniWidget","CashflowMiniWidget$1","TransactionApi","tag","tagging","transaction","accountGuids","accountsList","TopActions","TopActions2","BottomActions","BottomActions2","DEFAULT_TOP_ACTIONS","DEFAULT_BOTTOM_ACTIONS","ON_CLICK_EVENTS","TABLE_CONST","buildDetailedTransactions","transactions","taggings","accountsMap","categoriesMap","taggingsMap","transaction_guid","tag_guid","tags","TransactionStatus","ANALYTICS_ACTIONS","ANALYTICS_CATEGORIES","ANALYTICS_LABELS","onAnalyticEvent","COLUMN_NAMES","UNCATEGORIZED_TERM","sortAndFilterTransactions","filter","expandedSplits","sortColumn","sortDirection","filteredTransactions","filterTransactions","sortedTransactions","sortTransactions","t","custom","searchFilter","isTagIncludedInSearch","isIncludedInSearch","column","sortCompare","sortASC","sortDESC","lowerCasedTerms","lowerCasedValue","ActivityType","ActivityStatus","UserVerification","ExpenseStatus","ScheduledPaymentTypes","TrackType","ScreenSize","DEFAULT_TRANSACTION","UiStore$3","isInitialized","valid","shouldDisable","showInsights","splitGuid","manualTransaction","TransactionStore","UiStore","tagGuid","transactionGuid","existingRule","newTransaction","fromDateISO","formatISO","transactionRules","taggingGuid","updatedTransactions","splits","updatedTransaction","child","tagGuids","useTransactionsUiStore","exportTransactionsToCSV","csvContent","structureCSVData","formatTransactions","uriEncodedData","link","getDescription","getTags","formattedTransactions","csvHeader","csvRows","description","TransactionRow","associatedBeats","isCredit","MerchantLogo","TransactionRow$1","SubheaderRow","bgcolor","ZeroState","showIcon","showSubtitle","ReceiptOutlinedIcon","ZeroState$2","shouldShowDate","currentDate","previousDate","hasInsetBorder","ROW_HEIGHT","DATE_ROW_HEIGHT","TransactionList","loader","showLoader","zeroState","setShowInsights","toggleSplit","handleClick","parentRef","rowVirtualizer","useVirtualizer","row","showDate","isInset","rowHeight","TransactionList$1","AccountCell","params","AmountCell","transaction_type","CategoryCell","isHover","setIsHover","CategoryCell$2","DateCell","FlagCell","transactionsCopy","is_flagged","is_hidden","has_been_viewed","parent_guid","hasNotBeenViewed","FlagCell$1","HeaderCell","PayeeCell","TransactionTable","onCategoryClick","onRowClick","columns","rows","DataGridPro","TransactionTable$1","useCategoryUiStore","CustomCategoryModalType","CustomCategoryModal","onSave","type","setName","setShouldDisableDrawerScroll","headingText","isDeleteType","CustomCategoryModal$1","AddSubcategory","showAdd","setShowAdd","addCategory","handleAdd","handleAdding","handleModalClose","AddSubcategory$1","RenameSubcategory","setShowRename","subCategory","showRename","updateCategory","handleRename","RenameSubcategory$1","DeleteSubcategory","showDelete","setShowDelete","removeCategory","handleDelete","DeleteSubcategory$1","SubcategoryRow","onSelect","selectedGuid","setSelectedGuid","showSelected","unselectable","unselectableText","isCustom","isSelectable","CheckCircleIcon","Chip","EditOutlinedIcon","DeleteOutlinedIcon","SubcategoryRow$1","SubcategoryList","expandedGuid","isExpanded","isFiltered","Collapse","SubcategoryList$1","CategoryRow","subCategories","setExpandedGuid","handleExpanderClick","ExpandMoreIcon","ChevronRightIcon","CategoryRow$1","CategoryList","nestedCategories","currCategory","nested","CategoryList$1","CategorySelector","initialSelected","loadCategories","setOnSelect","setSearchValue","setShowSelected","setUnselectable","setUnselectableText","CategorySelector$1","CategorySelectorDrawer","showDrawer","categorySelectorProps","CategorySelectorDrawer$1","MONTHLY_AVERAGE_LENGTH","MONTHS_OF_HISTORY","augmentCategories","currentCategoryTotals","monthlyCategoryTotals","isParent","monthlyAmounts","getMonthlyAmounts","totalMonthlyAmounts","detailedSubCategories","current","getAverage","numMonths","monthsBack","historyDate","UiStore$2","callback","CategoryStore","default_categories","totals","start","end","monthlyTotals","CategoryAction","addOrUpdateTransactionRule","updateTransaction","updateManualTransaction","open","setOpen","handleCategoryChange","applyToAll","handleSelected","handleCloseDrawer","CategoryIconVariants","DateAction","handleDateSelected","handleSave","DeleteAction","removeTransaction","DeleteAction$1","DeleteLogoAction","handleDeleteLogo","DeleteLogoAction$1","HideAction","isHidden","toggleHide","Switch","HideAction$1","TransactionAmountHeader","merchant_guid","payee","top_level_category_guid","MemoAction","memoText","setMemoText","MemoAction$1","SplitRow","onDeleteRow","onCategoryChanged","onUpdateAmount","split","categorySelectorOpen","setCategorySelectorOpen","isTopRow","handleChangeAmount","CancelIcon","SplitRow$1","SplitManager","onAddSplit","onDeleteSplit","setError","SplitManager$1","SplitAction","splitTransaction","unSplitTransaction","INITIAL_SPLIT","EMPTY_SPLIT","isSplitDrawerOpen","setIsSplitDrawerOpen","isDeleteSplitOpen","setIsDeleteSplitOpen","setSplits","handleAddSplit","updatedSplits","handleDeleteSplit","handleUpdateAmount","handleCategoryChanged","handleCancel","handleUnSplit","hasCategoryError","hasAmountError","SplitAction$1","addTag","isAdding","setIsAdding","tagName","setTagName","tagNameError","setTagNameError","inputRef","handleAddTag","Header$3","onSearchValueChanged","HighlightOffIcon","SearchIcon","SearchBox$1","TagRow","onTagChecked","selectedTags","removeTag","updateTag","editOpen","setEditOpen","deleteOpen","setDeleteOpen","handleSaveTag","handleDeleteTag","handleEditClick","handleDeleteClick","EditIcon","Checkbox","TagRow$1","TagManager","filteredTags","TagManager$1","TagsAction","updateTaggings","setSelectedTags","handleTagChecked","tagNames","TagsAction$1","Description","isEditing","setIsEditing","setDescription","FormGroup","Description$1","FlagTransaction","handleFlagTransaction","FlagOutlinedIcon","FlagTransaction$1","TransactionDetails","bottomActions","topActions","showFullNumber","TransactionDetails$1","AddAccountModal","modalCopy","AddAccountModal$1","ManualTransactionDetails","selectedAccounts","setIsAmountValid","setPayee","manualAccounts","currencyCopy","handleAmountChanged","handleTransactionTypeChanged","_event","handlePayeeChanged","handleAccountChanged","RadioGroup","MenuItem","ManualTransactionDetails$1","EditCategoryAction","setCategoryGuid","EditCategoryAction$1","HEADER_HEIGHT","TransactionWidget","isAmountValid","addTransaction","loadAssociatedBeats","setFilter","setDisplayedDate","setSelectedAccounts","drawerOpen","setDrawerOpen","setTransactionGuid","addManualAccountModalOpen","setAddManualAccountModalOpen","setShowConnectWidget","isWidgetInitialized","setIsWidgetInitialized","isTransactionValid","handleDateChanged","handleSearch","searchTerm","handleExportCsvClick","handleAddTransactionClick","handleAddTransaction","handleAddManualAccountClick","handleConnectWidgetClose","TransactionWidget$1","updateIncome","activity","sequence","updatedSequence","repeatDay","getDate","repeatMonth","getMonth","repeatWeekday","updateExpense","FrequencyAction","recurringCopy","cashflowSequences","scheduledPayments","updateCashflowSequence","updateScheduledPayment","setIsOpen","frequencies","handleOnClick","recurrenceType","updatedActivity","payment","sp","cs","handleOpen","frequency","f","FrequencyAction$1","PaymentDateAction","selected","setSelected","LocalizationProvider","AdapterDateFns","DateCalendar","PaymentDateAction$1","ActivityDetails","onDeleted","deleteCashflowSequence","deleteScheduledPayment","paidActivities","showDeleteConfirm","setShowDeleteConfirm","transactionGuids","pa","handleDeleteActivity","handleDeleteButtonClick","ActivityDetails$1","iconStyle","offsetStyle","isOffset","UpcomingExpenseBadge","AccessTimeFilledIcon","IncomeBadge","MonetizationOnIcon","MissedBadge","PaidBadge","getRecurrence","isValid","getStatus","getStatusIcon","ActivityRow","isMini","onActivityClick","showOrdinal","openGuid","setOpenGuid","isPaid","isMissed","isUpcoming","InstitutionLogo","ActivityRow$1","buildNewCashflowSequence","cashflowSequence","buildNewCashflowEvent","buildNewScheduledPayment","SelectTransaction","onSearch","onSelected","SelectTransaction$1","AddActivityDetails","onFrequencyChange","onNextDateChange","transactionDate","handleFrequencyChange","DatePicker","AddActivityDetails$1","expenseFilter","expenseFilterSearch","incomeFilter","incomeFilterSearch","AddActivity","onAddActivity","addCashflowEvent","addCashflowSequence","addScheduledPayment","isSelectTransactionOpen","setIsSelectTransactionOpen","setFrequency","setNextDate","handleAddActivity","closeOnAdd","newSequence","AddActivity$1","buildExpenses","payments","parseISO","ManageExpenses","expenses","ManageExpenses$1","buildInstitutionName","getRecurrenceType","buildActivities","projected","sequences","paidIncome","upcomingIncome","actual","pastEvent","p","pastTransaction","occursOn","baseExpense","isAfter","subWeeks","exp","buildIncome","projectedEvents","expectedDate","ManageIncome","cashflowEvents","income","ManageIncome$1","ActivitySettings","selectedTab","setSelectedTab","ActivitySettings$1","totalReducer","dateFilter","ActivityDay","outsideCurrentMonth","other","activities","setSelectedDay","dayActivities","hasUpcoming","hasMissed","hasPaid","hasIncome","totalBadges","Badge","PickersDay","ActivityDay$1","Symbol","Legend$1","ActivityCalendar","selectedDay","calendarHeight","setCalendarHeight","getWeeksInMonth","handleMonthChange","calendar","ActivityCalendar$1","groupActivitiesByDate","groupedActivities","dateString","existingGroup","group","ActivityList","onResetClick","ActivityList$1","expected","paid","missed","onNewClick","ActivityStatus$1","RecurringActivity","isSmallTablet","missedActivities","selectedDayActivities","upcomingActivities","all","expenseExpected","expensePaid","expenseMissed","numExpenses","incomeExpected","incomePaid","numIncome","handleTabChange","onUpcomingActivityClick","onPaidActivityClick","RecurringActivity$1","RecurringActivityWidget","isSettingsOpen","setIsSettingsOpen","Skeleton","RecurringActivityWidget$1","MiniWidgetContent","filteredUpcomingActivities","isSmall","MiniWidgetContent$1","RecurringActivityMiniWidget","RecurringActivityMiniWidget$1","RecurringActivityStore","CashflowApi","cashflowEvent","scheduledPayemnt","evt","existingSequence","lastEvent","updatedPayment","ErrorStatus","ErrorIcon","isAccountLiability","isManual","usesCreditLimitField","usesInterestRateField","usesOriginalBalanceField","getAccountDetailFields","fields","val","accountTypeOptions","option","propertyTypeOptions","fieldName","dateTimeStamp","getAccountBalanceDetails","firstSubtitle","firstValue","secondSubtitle","secondValue","hasAvailableBalance","AccountListItem","listItemProps","shouldShowConnectionStatus","accountsCopy","statusIcon","content","AccountListItem$1","DetailsFooter","ExpenseType","DetailsExpenseRow","DetailsExpenseRow$1","DetailsExpenseHeader","DetailsExpenseHeader$1","activityFilter","DetailsTab","upcomingIncomeByAccount","projectedExpensesByAccount","incomeTotal","expenseTotal","DetailsTab$1","SummaryTab","nickname","institution_guid","account_number","accountName","totalprojectedExpenses","totalProjectedIncome","SummaryTab$1","CashflowContent","setValue","handleChange","CashflowContent$1","CashflowAmountHeading","isTotal","activityAccountFilter","CashflowHeading","filteredExpenses","filteredIncome","totalUpcomingExpenses","totalUpcomingIncome","isSmallContainer","CashflowHeading$1","StepOne","handleNextStep","completeOnboarding","StepOne$1","stepTwoLoadingUrl","StepTwo","StepTwo$1","stepOneImageUrl","spin","CashflowOnboarding","isDirty","addIncome","setAddIncome","isSubmitting","setIsSubmitting","step","setStep","selectedTransactions","setSelectedTransactions","canSubmit","handleGetTransactions","handleAddIncome","upcomingTransaction","showSelectIncome","CashflowOnboarding$1","CashflowWidget","shouldDisableNextDate","shouldDisablePrevDate","cashAccountGuids","selAccts","CashflowWidget$1","UiStore$1","differenceInDays","nextIncome","CashflowStore","updatedUserProfile","ConnectStore","widget","getPayoffProjection","debts","extraPayment","sortedDebts","totalSavings","monthlyExtra","debt","monthlyInterest","appliedPayment","duration","intervalToDuration","formatDuration","SnowballCard","onClickCta","payoffDate","payoffSavings","payoffDuration","SnowballCard$1","SnowballDrawer","readMore","setReadMore","SnowballDrawer$1","BASE_LINE_COLOR","adjustBrightness","factor","r","g","hex","newColor","DebtsChart","hoveredDebtGuid","uniqueXValues","normalizedDatasets","datasetMap","lastY","normalizedDataset","x","y","initialTotalDebt","payoffLine","linearRate","brightnessFactor","seriesColor","getIndexByGuid","line","highlightedGuid","getColors","priority","PriorityCell","getPriority","priorityComparator","getWeight","DebtsTable","onHoverRow","onClickRow","sortModel","setSortModel","v","idx","onMouseEnterRow","debtIdx","hoveredDebt","getRowIdByGuid","newModel","transformDebtsChartData","monthlyPayment","initialBalance","payoffData","remainingBalance","DebtsWidget","setHoveredDebtGuid","isDrawerOpen","setIsDrawerOpen","loadGoals","debtsChartData","debtsTableData","onHoverDebt","onAccountFilterClick","DebtsWidget$1","loadDebts","goals","goalDebts","goal","createDebt","liabilityDebts","paymentDay","paymentDate","isImpossible","current_amount","interest_rate","monthly_payment","MONTHS","INTEREST_TO_DECIMAL","MAX_MONTHLY_PAYMENTS","monthlyInterestRate","numberOfMonthlyPayments","DebtsStore","debtGoals","GlobalUiStore","selectedMonth","nextMonth","currentMonth","TabTitle","subtitle","getGoalStatusData","backgroundColor","percentageStyle","completionDate","percentageText","projectedText","GoalStatusCard","CardActionArea","Payments","GoalList","onManageClick","trackType","allGoals","setSelectedGoal","ongoing","complete","manageButtonLabel","zeroStateComplete","GoalDetails","goalTitle","ChevronRight","AddBox","GoalsWidget","selectedGoal","savingTotal","debtTotal","retirementTotal","savingsTabSubtitle","debtTabSubtitle","retireTabSubtitle","handleAccountFilterClick","handleAddClick","GoalApi","GoalStore","NAME_PATTERN","MAX_LENGTH","MerchantLookup","merchants","loadMerchants","merchant","MerchantLookup$1","MerchantApi","searchValues","page","MerchantStore","MAX_NUMBER_MONTHS","filterAccounts","members","is_closed","is_deleted","is_manual","member","flattenBalances","balances","balance","getLatestNetWorthData","chartData","sortByYearMonthAscending","buildDateTicks","buildChartData","monthlyAccountBalances","numberOfMonths","result","year_month","accountsWithBalances","zeroBalance","lastBalance","change","buildGainsLosses","selectedData","gains","losses","totalGains","totalLosses","buildAssetsLiabilities","assets","liabilities","totalAssets","totalLiabilities","groupAccounts","NetWorthStore","netWorthAccounts","NetWorthChart","hoveredData","onMarkClick","onMouseEnter","onMouseLeave","chartWidthNotMobile","selectedMark","hoveredMark","getMarkStyles","markIndex","NetWorthChart$1","NetWorthListItem","onItemClick","listItemStyles","setListItemStyles","NetWorthListItem$1","NetWorthList","onListItemClick","onButtonClick","buildStyles","lineItem","NetWorthList$1","NetWorthChange","currencyLabel","currencyVariant","iconSize","netWorth","iconColor","currencyTextColor","NetWorthChange$1","NetWorthSummary","summary","formattedMonth","NetWorthSummary$1","Group","ListGroup","AssetsLiabilitiesDetail","AssetsLiabilitiesDetail$1","GainsLossesDetail","gain","loss","GainsLossesDetail$1","NetWorthWidget","assetsLiabilities","gainsLosses","loadChartData","loadNetWorthData","netWorthChartData","setHoveredData","setSelectedData","setTimeFrame","isGlDrawerOpen","setIsGlDrawerOpen","isAlDrawerOpen","setIsAlDrawerOpen","initalizeWidget","handleDataClick","handleViewAssetsLiabilitiesClick","differenceInMonths","netWorthProps","getNotificationDetailRoute","notificationType","filterRecentNotifications","notifications","currentTime","deliveredAt","NotificationStore","observable","n","NotificationBadge","isGoal","NotificationBadge$1","NotificationCard","updateNotification","DateRow","NotificationList","recentNotifications","markAllAsViewed","notificationsCopy","NotificationList$1","UserStore","updatedProfile","GlobalStore","AccountStore","AccountActionsRow","isLast","useAccountUiStore","useGetMergeableAccounts","selectedAccount","selectedMember","AccountActions","shouldShowCloseAccountModal","setShouldShowCloseAccountModal","shouldShowAccountMergeDrawer","setShouldShowAccountMergeDrawer","shouldShowMergeConfirmModal","setShouldShowMergeConfirmModal","accountToMerge","setAccountToMerge","mergeAccounts","updateAccount","mergeableAccounts","handleUpdateAccount","updatedValue","handleMergeAccounts","AccountActions$1","getConnectionMessages","connection_messages","lastUpdatedCopy","lastUpdated","lastUpdatedFormattedTime","isYesterday","AccountConnection","shouldShowConnectDrawer","setShouldShowConnectDrawer","statusMessages","CheckCircleRoundedIcon","THEMES","LanguageRoundedIcon","AccountConnection$1","AccountDetailEdit","field","editedValue","setEditedValue","errorMessage","setErrorMessage","hasValidCurrencyInput","setHasValidCurrencyInput","getEditableField","FormControl","InputLabel","Select","updateField","saveField","AccountDetailEdit$1","AccountDetails","widgetProfile","canEdit","showEditDialog","setShowEditDialog","fieldToEdit","setFieldToEdit","displayableFields","hasValue","AccountDetails$1","AccountDetailsTab","AccountDetailsTab$1","ConnectionErrorMessage","setTabValue","Alert","AlertTitle","Link","ConnectionErrorMessage$1","TransactionsTab","setGuid","TransactionsTab$1","AccountDetailsContent","tabValue","AccountDetailsContent$1","isExpense","isTransfer","isPayment","isSpend","getTopLevelCategoryTotals","getMonthlyTotals","getIncomeTotals","incomeTotals","getPaymentTotals","paymentTotals","getSpendingTotals","spendingTotals","getSpendingData","filteredTotals","getDatasets","incomeData","paymentData","spendingData","getLabels","dataA","dataB","credits","debits","lastIncome","lastPayment","lastSpending","TrendsChart","trendsCopy","isLoan","TrendsChart$1","AccountDetailsChart","loadMonthlyCategoryTotals","AccountDetailsChart$1","AccountDetailsHeader","institutions","institution","showChart","AccountDetailsHeader$1","AccountsList","selectedAccountGuid","setSelectedAccountGuid","setSelectedAccount","setSelectedMember","accountTypes","accountsOfType","accountsOfTypeTotal","isVeryLastItem","isLastAccountTypeItem","AccountsList$1","ConnectionsDrawer","showConnectionsWidget","connectionsWidget","ConnectionsWidget","ConnectionsDrawer$1","AccountsWidget","setShowConnectionsWidget","refreshMembers","handleSync","handleManageConnections","AccountsWidget$1","fliterAccounts","AccountsMiniWidget","visibleAccounts","setVisibleAccounts","AccountsMiniWidget$1","ConnectImage","ConnectMiniWidgetCard","ConnectMiniWidgetCard$1","ConnectMiniWidget","ConnectMiniWidget$1","AccountApi","accountGuid","augmentedAccounts","memberLocation","connectionStatus","mergedAccount","account2Index","account1Index","deletedIndex","updatedAccount","updatedAccountIndex","PROGRESS_INDICATOR_SIZE","MAX_BUBBLE_RADIUS","MIN_BUBBLE_RADIUS","drag","simulation","dragStarted","dragged","dragEnded","d3","arcTween","bubble","angle","interpolate","enableDrag","resize","getScale","simulate","maxValue","minValue","scale","bubbles","PROGRESS_DURATION","Mercury","mercury","bubbleId","trackArc","LARGE_THRESHOLD","MEDIUM_THRESHOLD","Bubble","isDraggable","showTooltip","setShowTooltip","iconText","textLength","background","textColor","iconY","tooltipPopperSlot","BubbleChart","BubbleChart$1","budgetsCopy","BubbleBudgets","unavailableWidth","setSelectedBudget","isLoadingCategoryTotals","handleBubbleClick","BubbleBudgetsMiniWidget","loadBudgets","setTheme","BubbleBudgetsMiniWidget$1","BudgetRow","descriptionColor","category_guid","subBudgets","transaction_total","BudgetList","handleBudgetClick","Overview","incomeCategories","spendCategories","totalBudgeted","projectedIncome","isIncomeOpen","setIsIncomeOpen","spentTotal","spendingStatus","spendingPercentage","incomeStatus","incomePercentage","handleOpenIncome","RecalculateBudgetRow","part1","part2","RecalculateBudgets","onRecalculateBudgets","recalculateBudgets","setAlert","newBudgetCategories","handlePrimaryClick","BudgetAmount","onAmountChanged","unbudgetedIncome","UnbudgetedRow","onAddBudget","isAddBudgetOpen","setIsAddBudgetOpen","ListItemSecondaryAction","AddBudgets","addBudget","unbudgetedCategories","handleOnAddBudget","SubBudgetZeroState","SubBudgetRow","setSelectedSubBudget","AddSubBudget","setSubCategory","handleAddSubBudget","SubBudgetList","deleteBudget","selectedSubBudget","updateBudget","isEditOpen","setIsEditOpen","isDeleteOpen","setIsDeleteOpen","handleUpdateBudget","handleDeleteBudget","BudgetDetails","transactionCopy","handleExportToCsv","BudgetDetailsDrawer","selectedBudget","BUDGET_LIST_WIDTH","BubbleBudgetsWidget","loadCashflowSequences","reloadCategoryTotals","isDataLoaded","setIsDataLoaded","isAddOpen","setIsAddOpen","onMonthChanged","handleBudgetsRecalculated","shouldDisableNext","Snackbar","DashboardLocation","Greeting","hour","Greeting$1","Dashboard","widgets","copyStore","sortedWidgets","w1","w2","mainWidgets","sideWidgets","Dashboard$1","AccountGroup","toggleAccount","isDialogOpen","setIsDialogOpen","accountUpdateData","setAccountUpdateData","prepareToToggleAccount","handleToggleAccount","handleCloseDialog","PulseSubheaderRow","SettingsItem","itemCount","ChevronRightOutlinedIcon","ManageAccountsDrawer","manageAccountsStore","isAccountsControlDrawerOpen","setIsAccountsControlDrawerOpen","AccountBalanceOutlinedIcon","ToastContext","createContext","ToastProvider","toastState","setToastState","showToast","msg","severityType","hideToast","setMessage","prevState","useToast","useContext","GrowTransition","Grow","Toast","message","autoHideDuration","severity","CheckCircleRounded","snackbarSx","noInsightsImageUrl","CategoryEmptyState","SubCategoryDrawer","disabledBeatTemplates","handleEnableBeatTemplates","isUpdateLoading","translatedSubCatetgory","initialCheckboxState","beatTemplatesChecked","setBeatTemplatesChecked","prevUpdateLoading","handleCheckboxChange","numCheckedBeats","toggleAllCheckboxes","newCheckboxesState","handleUnhideSelectedInisghts","shouldCloseDrawer","prevCheckboxes","LoadingButton","createTranslationMappings","beatTemplatesWithCategories","categoryMapping","subcategoryMapping","template","category_key","subcategory_key","subcategoryName","organizeBeatsForUIStructure","beatCategoryStructure","sortedCategory","cat","sortedSubcategory","subcat","organizeBeats","translatedCats","translatedSubCats","HiddenInsightsDrawer","disabledBeatTemplatesStore","isUpdateError","sortedBeats","translatedCategories","translatedSubcategories","isSubCatDrawerOpen","setIsSubCatDrawerOpen","isSubCategoryDrawerOpen","setIsSubCategoryDrawerOpen","selectedCategory","setSelectedCategory","selectedSubCategory","setSelectedSubCategory","handleUnhideAllInsights","handleOpenSubcategoryDrawer","subcategory","handleCloseSubCategoryDrawer","handleEnableBeatTemplatesFromSubcategory","templateNames","VisibilityOffOutlinedIcon","HiddenInsightsDrawerWrapper","SettingsDrawer","CopyStore","TEMPLATE_NAMES","instanceId","PATHS","ON_CLICK_EVENT","ON_VIEW_EVENT","ON_VIEW_FIRST_TIME_EVENT","readableTemplateName","onBeatClickedEvents","onBeatDisplayedEvents","onBeatDisplayedForFirstTimeEvents","ANALYTICS_CLICK_EVENTS","ANALYTICS_VIEW_EVENTS","ANALYTICS_PAGE_NAMES","ANALYTICS_PAGEVIEWS","onAnalyticPageView","InsightsMicroWidgetStore","logOutUser","AppStore","InsightsMicroWidgetDataContext","InsightsMicroWidgetDataProvider","onPageview","BeatCategoryIcon","BeatMerchantLogo","BeatMerchantLogo$1","ChartFilledIcon","viewBox","buildDataSeries","getIconColor","designTokens","fullDataSeries","chunkSize","spendChunk","incomeChunk","MonthlySpendComparisonIcon","ZeroStateIcon","BeatIcon","clientColorScheme","SUPPORTED_CAROUSEL_HEIGHTS","MINIMUM_SWIPE_DISTANCE","VIEW_THRESHOLD","useCopyStore","useInsightsMicroWidgetStore","usePageview","BeatCard","showCTAColocatedWithText","heightOverrides","isActiveCard","onCardClick","posthog","widthOverrides","clientGuid","inView","useInView","cardsCopy","updateBeat","MicroInsightCard","CarouselControls","currentBeatIndex","numBeats","scrollRightBoundary","scrollX","disabledLeft","disabledRight","DISABLED_ICON_COLOR","ICON_COLOR","ChevronLeft","MicroBeatCarousel","showCarouselControls","showWithMargin","ulRef","setScrollX","touchEnd","setTouchEnd","touchStart","setTouchStart","handleNextClick","handlePreviousClick","handleScroll","onTouchEnd","onTouchMove","onTouchStart","generalProps","activeCardIndex","scrollBoundry","ViewMoreMicroCard","MicroBeatCarousel$1","actionText","fontColors","inViewRef","lineClamp","setLineClamp","cardStyle","linkTextStyle","cardStyles","CardActions","CarouselHeader","handleViewAllClick","Typography","CarouselHeader$1","Spinner","InsightsMicroWidget","areBeatsLoading","onConsumerEvent","onConsumerPageview","showBorder","showHeader","useDarkMode","userHasFullInsightFeedBeats","carouselSize","setCarouselSize","isLoaded","setIsLoaded","pageHeight","zeroStateProps","ThemeProvider","createMXTheme","CssBaseline","NoRelevantInsightsCard","ZeroStateCard","InsightsMicroWidget$1","NoRelevantInsightsCard$1","ViewMoreMicroCard$1","zeroStateCopy","ZeroStateCard$1","TOP_CATEGORY_LENGTH","getTotalsByParentCategory","parentCategoryTotals","cat1","cat2","categoryData","donutData","otherCategories","otherTotal","getIncomeData","total1","total2","SpendingTabLabel","SpendingDonut","onViewTransactions","totalLabel","spendingCopy","cd","handleViewTransactions","SpendingDonut$1","SpendingLegend","MiniSpendingChart","incomeColors","dateRangeCategoryTotals","loadDateRangeCategoryTotals","setSelectedId","MiniSpendingChart$1","SpendingMiniWidget","SpendingMiniWidget$1","SpendingList","subItem","SpendingList$1","SpendingChart","SpendingChart$3","getIncomeColors","Spending","transactionsOpen","setTransactionsOpen","transactionFilter","Spending$1","SpendingWidget","SpendingWidget$1","getCategoryColor","createYearMonthRange","year","month","createGroupedCategoryTotals","totalData","getStackedLineChartData","groupedTotals","yearMonths","yearMonth","sumTotal","amountComparator","v1","v2","num1","num2","generateMonthHeaders","formattedDate","TrendsTable","selectedDateRange","monthName","headerNames","headerName","groupKey","TrendsDrawer","TrendsDrawer$1","tempCopy","TrendsFullWidget","showTransactions","setShowTransactions","setSelectedDateRange","addSeconds","filteredData","dateRangeText","onTabChange","onRangeChanged","months","differenceInCalendarMonths","tab","TrendsFullWidget$1","SpendingChart$1","TrendsMiniWidget","TrendsMiniWidget$1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|