@mx-cartographer/experiences 4.0.13 → 4.0.14-alpha.JB1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (513) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/debts/components/SnowballCard.d.ts +3 -1
  3. package/dist/debts/components/SnowballDrawer.d.ts +9 -0
  4. package/dist/index.es.js +3905 -3522
  5. package/dist/index.es.js.map +1 -1
  6. package/package.json +23 -3
  7. package/src/accounts/AccountsMiniWidget.tsx +62 -0
  8. package/src/accounts/AccountsWidget.tsx +93 -0
  9. package/src/accounts/ConnectMiniWidget.tsx +36 -0
  10. package/src/accounts/__tests__/Accounts.test.tsx +561 -0
  11. package/src/accounts/api/AccountApi.ts +74 -0
  12. package/src/accounts/api/__mocks__/AccountApi.ts +46 -0
  13. package/src/accounts/components/AccountListItem.tsx +102 -0
  14. package/src/accounts/components/AccountsList.tsx +133 -0
  15. package/src/accounts/components/ConnectImage.tsx +314 -0
  16. package/src/accounts/components/ConnectMiniWidgetCard.tsx +41 -0
  17. package/src/accounts/components/ConnectStatus.tsx +44 -0
  18. package/src/accounts/components/ConnectionStatusIcons.tsx +26 -0
  19. package/src/accounts/components/ConnectionsDrawer.tsx +84 -0
  20. package/src/accounts/components/detailsdrawer/Accounts/AccountActions.tsx +177 -0
  21. package/src/accounts/components/detailsdrawer/Accounts/AccountActionsRow.tsx +33 -0
  22. package/src/accounts/components/detailsdrawer/Accounts/AccountConnection.tsx +139 -0
  23. package/src/accounts/components/detailsdrawer/Accounts/AccountDetailEdit.tsx +162 -0
  24. package/src/accounts/components/detailsdrawer/Accounts/AccountDetails.tsx +98 -0
  25. package/src/accounts/components/detailsdrawer/Accounts/AccountDetailsChart.tsx +63 -0
  26. package/src/accounts/components/detailsdrawer/Accounts/AccountDetailsContent.tsx +52 -0
  27. package/src/accounts/components/detailsdrawer/Accounts/AccountDetailsHeader.tsx +71 -0
  28. package/src/accounts/components/detailsdrawer/Accounts/AccountDetailsTab.tsx +25 -0
  29. package/src/accounts/components/detailsdrawer/Accounts/ConnectionErrorMessage.tsx +99 -0
  30. package/src/accounts/components/detailsdrawer/Transactions/TransactionsTab.tsx +51 -0
  31. package/src/accounts/constants/Accounts.ts +11 -0
  32. package/src/accounts/hooks/useGetMergeableAccounts.tsx +13 -0
  33. package/src/accounts/hooks/useUiStore.ts +12 -0
  34. package/src/accounts/index.ts +8 -0
  35. package/src/accounts/stores/AccountStore.ts +220 -0
  36. package/src/accounts/stores/UiStore.ts +18 -0
  37. package/src/accounts/stores/__tests__/AccountStore.test.ts +204 -0
  38. package/src/accounts/utils/AccountFields.tsx +248 -0
  39. package/src/accounts/utils/Accounts.ts +28 -0
  40. package/src/accounts/utils/__tests__/AccountFieldsUtils.test.tsx +215 -0
  41. package/src/accounts/utils/__tests__/AccountsUtils.test.tsx +104 -0
  42. package/src/accounts/utils/getConnectionMessages.tsx +198 -0
  43. package/src/accounts/utils/index.ts +1 -0
  44. package/src/budgets/BubbleBudgetsMiniWidget.tsx +57 -0
  45. package/src/budgets/BubbleBudgetsWidget.tsx +154 -0
  46. package/src/budgets/__tests__/BubbleBudgetsWidget.test.tsx +40 -0
  47. package/src/budgets/__tests__/BudgetList.test.tsx +38 -0
  48. package/src/budgets/__tests__/BudgetsStore.test.tsx +48 -0
  49. package/src/budgets/__tests__/Overview.test.tsx +38 -0
  50. package/src/budgets/api/BudgetsApi.ts +43 -0
  51. package/src/budgets/api/__mocks__/BudgetsApi.ts +7 -0
  52. package/src/budgets/components/AddBudgets.tsx +50 -0
  53. package/src/budgets/components/BubbleBudgets.tsx +73 -0
  54. package/src/budgets/components/BubbleChart.tsx +50 -0
  55. package/src/budgets/components/BudgetDetailsDrawer.tsx +134 -0
  56. package/src/budgets/components/BudgetList.tsx +50 -0
  57. package/src/budgets/components/Overview.tsx +156 -0
  58. package/src/budgets/components/ZeroState.tsx +23 -0
  59. package/src/budgets/components/addbudget/Header.tsx +59 -0
  60. package/src/budgets/components/addbudget/RecalculateBudgetRow.tsx +53 -0
  61. package/src/budgets/components/addbudget/RecalculateBudgets.tsx +69 -0
  62. package/src/budgets/components/addbudget/UnbudgetedRow.tsx +57 -0
  63. package/src/budgets/components/bubblechart/Bubble.tsx +148 -0
  64. package/src/budgets/components/bubblechart/Mercury.tsx +57 -0
  65. package/src/budgets/components/budgetdetails/AddSubBudget.tsx +111 -0
  66. package/src/budgets/components/budgetdetails/BudgetDetails.tsx +93 -0
  67. package/src/budgets/components/budgetdetails/Header.tsx +48 -0
  68. package/src/budgets/components/budgetdetails/SubBudgetList.tsx +148 -0
  69. package/src/budgets/components/budgetlist/BudgetRow.tsx +63 -0
  70. package/src/budgets/components/budgetlist/SubBudgetRow.tsx +64 -0
  71. package/src/budgets/components/budgetlist/SubBudgetZeroState.tsx +22 -0
  72. package/src/budgets/components/shared/BudgetAmount.tsx +54 -0
  73. package/src/budgets/index.ts +2 -0
  74. package/src/budgets/store/BudgetsStore.ts +183 -0
  75. package/src/budgets/utils/BubblesSVG.ts +142 -0
  76. package/src/budgets/utils/BudgetUtil.ts +140 -0
  77. package/src/cashflow/CashflowMiniWidget.tsx +25 -0
  78. package/src/cashflow/CashflowOnboarding.tsx +298 -0
  79. package/src/cashflow/CashflowWidget.tsx +111 -0
  80. package/src/cashflow/api/CashflowApi.ts +62 -0
  81. package/src/cashflow/api/__mocks__/CashflowApi.ts +15 -0
  82. package/src/cashflow/components/CashflowAmountHeading.tsx +46 -0
  83. package/src/cashflow/components/CashflowContent.tsx +63 -0
  84. package/src/cashflow/components/CashflowHeading.tsx +172 -0
  85. package/src/cashflow/components/CashflowWidgetContent.tsx +225 -0
  86. package/src/cashflow/components/DetailsExpenseHeader.tsx +47 -0
  87. package/src/cashflow/components/DetailsExpenseRow.tsx +46 -0
  88. package/src/cashflow/components/DetailsFooter.tsx +28 -0
  89. package/src/cashflow/components/DetailsTab.tsx +128 -0
  90. package/src/cashflow/components/RemainingCash.tsx +44 -0
  91. package/src/cashflow/components/SummaryTab.tsx +247 -0
  92. package/src/cashflow/components/onboarding/StepOne.tsx +90 -0
  93. package/src/cashflow/components/onboarding/StepTwo.tsx +23 -0
  94. package/src/cashflow/context/hooks.tsx +12 -0
  95. package/src/cashflow/images/cashflow-onboarding.png +0 -0
  96. package/src/cashflow/images/loading-animation.gif +0 -0
  97. package/src/cashflow/index.ts +5 -0
  98. package/src/cashflow/stores/CashflowStore.ts +26 -0
  99. package/src/cashflow/stores/UiStore.ts +48 -0
  100. package/src/cashflow/stores/__tests__/CashflowStore.test.ts +16 -0
  101. package/src/cashflow/util/Filters.ts +15 -0
  102. package/src/categories/components/CategoryList.tsx +64 -0
  103. package/src/categories/components/CategoryRow.tsx +68 -0
  104. package/src/categories/components/CategorySelector.tsx +80 -0
  105. package/src/categories/components/CategorySelectorDrawer.tsx +41 -0
  106. package/src/categories/components/CustomCategories/AddSubcategory.tsx +65 -0
  107. package/src/categories/components/CustomCategories/CustomCategoryModal.tsx +99 -0
  108. package/src/categories/components/CustomCategories/DeleteSubcategory.tsx +49 -0
  109. package/src/categories/components/CustomCategories/RenameSubcategory.tsx +48 -0
  110. package/src/categories/components/CustomCategories/index.ts +4 -0
  111. package/src/categories/components/SubcategoryList.tsx +47 -0
  112. package/src/categories/components/SubcategoryRow.tsx +123 -0
  113. package/src/categories/constants/Analytics.ts +89 -0
  114. package/src/categories/constants/OnClickEvents.ts +13 -0
  115. package/src/categories/context/hooks.ts +12 -0
  116. package/src/categories/index.ts +5 -0
  117. package/src/categories/stores/CategoryStore.ts +184 -0
  118. package/src/categories/stores/UiStore.ts +36 -0
  119. package/src/categories/stores/__tests__/CategoryStore.test.ts +54 -0
  120. package/src/categories/util/CategoryUtil.ts +136 -0
  121. package/src/common/api/AnalyticsApi.ts +49 -0
  122. package/src/common/api/BeatApi.ts +32 -0
  123. package/src/common/api/CategoryApi.ts +52 -0
  124. package/src/common/api/GlobalCopyApi.ts +17 -0
  125. package/src/common/api/LocalizedCopyApi.ts +21 -0
  126. package/src/common/api/NotificationApi.ts +40 -0
  127. package/src/common/api/ScheduledPaymentsApi.ts +37 -0
  128. package/src/common/api/UserApi.ts +23 -0
  129. package/src/common/api/WidgetApi.ts +15 -0
  130. package/src/common/api/__mocks__/BeatApi.ts +8 -0
  131. package/src/common/api/__mocks__/CategoryApi.ts +15 -0
  132. package/src/common/api/__mocks__/GlobalCopyApi.ts +7 -0
  133. package/src/common/api/__mocks__/NotificationApi.ts +11 -0
  134. package/src/common/api/__mocks__/ScheduledPaymentsApi.ts +7 -0
  135. package/src/common/api/__mocks__/UserApi.ts +9 -0
  136. package/src/common/api/__mocks__/WidgetApi.ts +11 -0
  137. package/src/common/api/index.ts +9 -0
  138. package/src/common/components/ConnectDrawer.tsx +87 -0
  139. package/src/common/components/CurrencyInput.tsx +147 -0
  140. package/src/common/components/CurrencyText.tsx +44 -0
  141. package/src/common/components/DataRow.tsx +52 -0
  142. package/src/common/components/IconBacking.tsx +41 -0
  143. package/src/common/components/InformationTooltip.tsx +52 -0
  144. package/src/common/components/ListItemWrapper.tsx +49 -0
  145. package/src/common/components/Loader.tsx +24 -0
  146. package/src/common/components/MiniWidgetContainer.tsx +64 -0
  147. package/src/common/components/ResponsiveButton.tsx +65 -0
  148. package/src/common/components/SearchBox.tsx +64 -0
  149. package/src/common/components/SelectionBox.tsx +64 -0
  150. package/src/common/components/SubheaderRow.tsx +22 -0
  151. package/src/common/components/TabContentContainer.tsx +28 -0
  152. package/src/common/components/WidgetContainer.tsx +239 -0
  153. package/src/common/components/accountfilter/AccountFilter.tsx +133 -0
  154. package/src/common/components/accountfilter/AccountFilterOptions.tsx +263 -0
  155. package/src/common/components/accountfilter/index.ts +1 -0
  156. package/src/common/components/barchart/Bar.tsx +123 -0
  157. package/src/common/components/barchart/BarChart.tsx +136 -0
  158. package/src/common/components/barchart/BarColumn.tsx +150 -0
  159. package/src/common/components/barchart/Legend.tsx +60 -0
  160. package/src/common/components/barchart/Util.ts +54 -0
  161. package/src/common/components/barchart/__tests__/BarChart.test.tsx +46 -0
  162. package/src/common/components/barchart/index.ts +1 -0
  163. package/src/common/components/calendar/Calendar.tsx +223 -0
  164. package/src/common/components/calendar/Day.tsx +127 -0
  165. package/src/common/components/calendar/Header.tsx +58 -0
  166. package/src/common/components/calendar/__tests__/Calendar.test.tsx +50 -0
  167. package/src/common/components/calendar/index.ts +1 -0
  168. package/src/common/components/calendar/upcomingActivity/CalendarIcons.tsx +40 -0
  169. package/src/common/components/charts/Donut.tsx +82 -0
  170. package/src/common/components/charts/LineChart.tsx +204 -0
  171. package/src/common/components/charts/StackedLineChart.tsx +292 -0
  172. package/src/common/components/charts/StatusBar.tsx +41 -0
  173. package/src/common/components/charts/index.ts +4 -0
  174. package/src/common/components/charts/linechart/CustomLegend.tsx +49 -0
  175. package/src/common/components/charts/linechart/CustomLine.tsx +31 -0
  176. package/src/common/components/charts/linechart/CustomMark.tsx +68 -0
  177. package/src/common/components/charts/stackedlinechart/CategoryIconLabel.tsx +29 -0
  178. package/src/common/components/charts/stackedlinechart/CustomAreaTooltip.tsx +115 -0
  179. package/src/common/components/charts/stackedlinechart/CustomLegend.tsx +73 -0
  180. package/src/common/components/charts/stackedlinechart/CustomPointTooltip.tsx +41 -0
  181. package/src/common/components/charts/stackedlinechart/utils.ts +13 -0
  182. package/src/common/components/daterangeselector/DateRangeSelector.tsx +383 -0
  183. package/src/common/components/daterangeselector/index.ts +1 -0
  184. package/src/common/components/dialog/Dialog.tsx +92 -0
  185. package/src/common/components/dialog/index.ts +1 -0
  186. package/src/common/components/donuts/MultiSegmentDonut.tsx +89 -0
  187. package/src/common/components/donuts/SingleSegmentDonut.tsx +75 -0
  188. package/src/common/components/donuts/index.ts +2 -0
  189. package/src/common/components/drawer/Drawer.tsx +97 -0
  190. package/src/common/components/drawer/Header.tsx +64 -0
  191. package/src/common/components/drawer/index.ts +1 -0
  192. package/src/common/components/index.ts +22 -0
  193. package/src/common/constants/Account.ts +30 -0
  194. package/src/common/constants/Analytics.ts +70 -0
  195. package/src/common/constants/ApiEndpoints.ts +30 -0
  196. package/src/common/constants/Category.ts +302 -0
  197. package/src/common/constants/Connect.ts +2 -0
  198. package/src/common/constants/DateFormats.ts +122 -0
  199. package/src/common/constants/Donut.ts +2 -0
  200. package/src/common/constants/Numbers.ts +6 -0
  201. package/src/common/constants/ScheduledPayment.ts +21 -0
  202. package/src/common/constants/Sizes.ts +7 -0
  203. package/src/common/constants/SpendingPlan.ts +17 -0
  204. package/src/common/constants/Table.ts +13 -0
  205. package/src/common/constants/index.ts +21 -0
  206. package/src/common/context/GlobalDataProvider.tsx +31 -0
  207. package/src/common/context/WidgetContainerProvider.tsx +24 -0
  208. package/src/common/context/__mocks__/GlobalDataProvider.tsx +25 -0
  209. package/src/common/context/hooks.tsx +57 -0
  210. package/src/common/context/index.ts +22 -0
  211. package/src/common/hooks/__tests__/useDimensions.test.tsx +190 -0
  212. package/src/common/hooks/index.ts +3 -0
  213. package/src/common/hooks/useCombineEvents.tsx +53 -0
  214. package/src/common/hooks/useDimensions.tsx +78 -0
  215. package/src/common/hooks/usePrevious.tsx +10 -0
  216. package/src/common/hooks/useScreenSize.tsx +15 -0
  217. package/src/common/index.ts +23 -0
  218. package/src/common/stores/ConnectStore.ts +26 -0
  219. package/src/common/stores/GlobalCopyStore.ts +36 -0
  220. package/src/common/stores/GlobalStore.ts +83 -0
  221. package/src/common/stores/GlobalUiStore.ts +66 -0
  222. package/src/common/stores/UserStore.ts +45 -0
  223. package/src/common/stores/__tests__/GlobalCopyStore.test.ts +23 -0
  224. package/src/common/stores/__tests__/GlobalStore.test.ts +24 -0
  225. package/src/common/stores/index.ts +3 -0
  226. package/src/common/types/Account.ts +406 -0
  227. package/src/common/types/Activity.ts +31 -0
  228. package/src/common/types/Analytics.ts +70 -0
  229. package/src/common/types/Beat.ts +71 -0
  230. package/src/common/types/Budget.ts +29 -0
  231. package/src/common/types/Cashflow.ts +110 -0
  232. package/src/common/types/Category.ts +68 -0
  233. package/src/common/types/Date.ts +2 -0
  234. package/src/common/types/Debt.ts +19 -0
  235. package/src/common/types/Expense.ts +20 -0
  236. package/src/common/types/Global.ts +13 -0
  237. package/src/common/types/GlobalCopy.ts +37 -0
  238. package/src/common/types/Goal.ts +59 -0
  239. package/src/common/types/Institution.ts +11 -0
  240. package/src/common/types/LocalizedContent.ts +9 -0
  241. package/src/common/types/Merchant.ts +6 -0
  242. package/src/common/types/Notification.ts +15 -0
  243. package/src/common/types/ScheduledPayment.ts +15 -0
  244. package/src/common/types/ScreenSize.tsx +4 -0
  245. package/src/common/types/SpendingPlan.ts +48 -0
  246. package/src/common/types/Transaction.ts +91 -0
  247. package/src/common/types/User.ts +20 -0
  248. package/src/common/types/Widgets.ts +11 -0
  249. package/src/common/types/index.ts +93 -0
  250. package/src/common/types/localization/AccountFilterCopy.ts +12 -0
  251. package/src/common/types/localization/AccountTypeCopy.ts +16 -0
  252. package/src/common/types/localization/AccountsCopy.ts +113 -0
  253. package/src/common/types/localization/BudgetsCopy.ts +52 -0
  254. package/src/common/types/localization/CashflowCopy.ts +77 -0
  255. package/src/common/types/localization/CategoryCopy.ts +18 -0
  256. package/src/common/types/localization/CommonCopy.ts +30 -0
  257. package/src/common/types/localization/ConnectCopy.ts +74 -0
  258. package/src/common/types/localization/CurrencyInputCopy.ts +6 -0
  259. package/src/common/types/localization/DateRangePickerCopy.ts +23 -0
  260. package/src/common/types/localization/GoalsCopy.ts +37 -0
  261. package/src/common/types/localization/InsightsFeedCopy.ts +26 -0
  262. package/src/common/types/localization/MicroInsightsCopy.ts +28 -0
  263. package/src/common/types/localization/NetWorthCopy.ts +14 -0
  264. package/src/common/types/localization/NotificationsCopy.ts +7 -0
  265. package/src/common/types/localization/RecurringCopy.ts +76 -0
  266. package/src/common/types/localization/SpendingCopy.ts +16 -0
  267. package/src/common/types/localization/TransactionsCopy.ts +81 -0
  268. package/src/common/types/localization/TrendsCopy.ts +10 -0
  269. package/src/common/types/localization/index.ts +19 -0
  270. package/src/common/utils/AccountFilter.ts +45 -0
  271. package/src/common/utils/Analytics.ts +51 -0
  272. package/src/common/utils/Categories.ts +75 -0
  273. package/src/common/utils/DateUtil.ts +67 -0
  274. package/src/common/utils/Fetch.ts +115 -0
  275. package/src/common/utils/Localization.ts +67 -0
  276. package/src/common/utils/NumberFormatting.ts +65 -0
  277. package/src/common/utils/__tests__/Fetch.test.tsx +34 -0
  278. package/src/common/utils/index.ts +18 -0
  279. package/src/dashboard/Dashboard.tsx +92 -0
  280. package/src/dashboard/Greeting.tsx +75 -0
  281. package/src/dashboard/__tests__/Dashboard.test.tsx +84 -0
  282. package/src/dashboard/constants/Dashboard.ts +4 -0
  283. package/src/dashboard/index.ts +3 -0
  284. package/src/dashboard/types/DashboardTypes.ts +9 -0
  285. package/src/debts/DebtsWidget.tsx +90 -0
  286. package/src/debts/components/DebtsChart.tsx +190 -0
  287. package/src/debts/components/DebtsTable.tsx +209 -0
  288. package/src/debts/components/SnowballCard.tsx +70 -0
  289. package/src/debts/components/SnowballDrawer.tsx +384 -0
  290. package/src/debts/components/debtstable/AccountCell.tsx +25 -0
  291. package/src/debts/components/debtstable/PriorityCell.tsx +46 -0
  292. package/src/debts/index.ts +4 -0
  293. package/src/debts/store/DebtsStore.ts +20 -0
  294. package/src/debts/utils/DebtStore.ts +75 -0
  295. package/src/debts/utils/DebtsWidget.ts +32 -0
  296. package/src/debts/utils/SnowballCard.tsx +48 -0
  297. package/src/goals/GoalsWidget.tsx +128 -0
  298. package/src/goals/api/GoalApi.ts +29 -0
  299. package/src/goals/components/GoalDetails.tsx +240 -0
  300. package/src/goals/components/GoalList.tsx +101 -0
  301. package/src/goals/components/GoalStatusCard.tsx +87 -0
  302. package/src/goals/components/TabTitle.tsx +21 -0
  303. package/src/goals/constants/CopyKeys.ts +29 -0
  304. package/src/goals/index.ts +2 -0
  305. package/src/goals/stores/GoalStore.ts +47 -0
  306. package/src/goals/util/GoalsUtil.ts +61 -0
  307. package/src/index.ts +17 -0
  308. package/src/insights/README.md +16 -0
  309. package/src/insights/contexts/ToastContext.tsx +62 -0
  310. package/src/insights/index.ts +5 -0
  311. package/src/insights/settings/SettingsDrawer.tsx +40 -0
  312. package/src/insights/settings/__tests__/SettingsDrawer.test.tsx +50 -0
  313. package/src/insights/settings/components/PulseSubheaderRow.tsx +34 -0
  314. package/src/insights/settings/components/SettingsItem.tsx +55 -0
  315. package/src/insights/settings/components/Toast.tsx +69 -0
  316. package/src/insights/settings/hiddeninsights/__tests__/HiddenInsightsDrawer.test.tsx +108 -0
  317. package/src/insights/settings/hiddeninsights/__tests__/SubCategoryDrawer.test.tsx +150 -0
  318. package/src/insights/settings/hiddeninsights/components/CategoryEmptyState.tsx +50 -0
  319. package/src/insights/settings/hiddeninsights/components/HiddenInsightsDrawer.tsx +222 -0
  320. package/src/insights/settings/hiddeninsights/components/HiddenInsightsDrawerWrapper.tsx +24 -0
  321. package/src/insights/settings/hiddeninsights/components/SubCategoryDrawer.tsx +256 -0
  322. package/src/insights/settings/hiddeninsights/images/no-insights.png +0 -0
  323. package/src/insights/settings/hiddeninsights/types/index.ts +74 -0
  324. package/src/insights/settings/manageaccounts/__tests__/AccountGroup.test.tsx +92 -0
  325. package/src/insights/settings/manageaccounts/__tests__/ManageAccountsDrawer.test.tsx +83 -0
  326. package/src/insights/settings/manageaccounts/components/AccountGroup.tsx +109 -0
  327. package/src/insights/settings/manageaccounts/components/ManageAccountsDrawer.tsx +63 -0
  328. package/src/insights/settings/manageaccounts/types/index.ts +13 -0
  329. package/src/insights/settings/types/index.ts +4 -0
  330. package/src/insights/store/BeatStore.ts +25 -0
  331. package/src/insights/utils/beatTemplateCategories.ts +103 -0
  332. package/src/merchants/api/MerchantApi.ts +33 -0
  333. package/src/merchants/components/MerchantLookup.tsx +117 -0
  334. package/src/merchants/index.ts +2 -0
  335. package/src/merchants/stores/MerchantStore.ts +42 -0
  336. package/src/microinsights/analytics.ts +31 -0
  337. package/src/microinsights/components/beatCard/BeatCard.tsx +124 -0
  338. package/src/microinsights/components/beaticons/BeatCategoryIcon.tsx +20 -0
  339. package/src/microinsights/components/beaticons/BeatIcon.tsx +45 -0
  340. package/src/microinsights/components/beaticons/BeatMerchantLogo.tsx +33 -0
  341. package/src/microinsights/components/beaticons/ChartFilledIcon.tsx +37 -0
  342. package/src/microinsights/components/beaticons/MonthlySpendComparisonIcon.tsx +30 -0
  343. package/src/microinsights/components/beaticons/ZeroStateIcon.tsx +558 -0
  344. package/src/microinsights/components/beaticons/index.tsx +7 -0
  345. package/src/microinsights/components/carouselheader/CarouselHeader.tsx +111 -0
  346. package/src/microinsights/components/insightsmicrowidget/InsightsMicroWidget.tsx +163 -0
  347. package/src/microinsights/components/microBeatCarousel/CarouselControls.tsx +99 -0
  348. package/src/microinsights/components/microBeatCarousel/MicroBeatCarousel.tsx +207 -0
  349. package/src/microinsights/components/microInsightCard/MicroInsightCard.tsx +173 -0
  350. package/src/microinsights/components/noRelevantInsightsCard/NoRelevantInsightsCard.tsx +89 -0
  351. package/src/microinsights/components/spinner/Spinner.tsx +21 -0
  352. package/src/microinsights/components/viewMoreMicroCard/ViewMoreMicroCard.tsx +101 -0
  353. package/src/microinsights/components/zeroStateCard/ZeroStateCard.tsx +62 -0
  354. package/src/microinsights/constants/Analytics.ts +192 -0
  355. package/src/microinsights/constants/App.ts +53 -0
  356. package/src/microinsights/constants/Insights.tsx +3 -0
  357. package/src/microinsights/constants/OnClickEvents.ts +3 -0
  358. package/src/microinsights/context/InsightsMicroWidgetDataProvider.tsx +24 -0
  359. package/src/microinsights/context/hooks.tsx +65 -0
  360. package/src/microinsights/index.ts +16 -0
  361. package/src/microinsights/interfaces.ts +28 -0
  362. package/src/microinsights/stores/AppStore.ts +34 -0
  363. package/src/microinsights/stores/CopyStore.ts +38 -0
  364. package/src/microinsights/stores/InsightsMicroWidgetStore.ts +61 -0
  365. package/src/microinsights/types/BeatUIComponent.ts +5 -0
  366. package/src/microinsights/utils/DataSeries.ts +20 -0
  367. package/src/networth/NetWorthWidget.tsx +171 -0
  368. package/src/networth/__tests__/AssetsLiabilitiesDetail.test.tsx +94 -0
  369. package/src/networth/__tests__/NetWorthChart.test.tsx +31 -0
  370. package/src/networth/__tests__/NetWorthList.test.tsx +33 -0
  371. package/src/networth/components/AssetsLiabilitiesDetail.tsx +146 -0
  372. package/src/networth/components/GainsLossesDetail.tsx +110 -0
  373. package/src/networth/components/NetWorthChange.tsx +51 -0
  374. package/src/networth/components/NetWorthChart.tsx +71 -0
  375. package/src/networth/components/NetWorthList.tsx +91 -0
  376. package/src/networth/components/NetWorthListItem.tsx +72 -0
  377. package/src/networth/components/NetWorthSummary.tsx +36 -0
  378. package/src/networth/index.ts +5 -0
  379. package/src/networth/stores/NetWorthStore.ts +99 -0
  380. package/src/networth/stores/__tests__/NetWorthStore.test.ts +32 -0
  381. package/src/networth/types/NetWorth.ts +59 -0
  382. package/src/networth/utils/NetWorthUtils.ts +177 -0
  383. package/src/networth/utils/__tests__/NetWorthUtils.test.ts +198 -0
  384. package/src/notifications/__tests__/NotificationList.test.tsx +67 -0
  385. package/src/notifications/components/DateRow.tsx +21 -0
  386. package/src/notifications/components/NotificationBadge.tsx +51 -0
  387. package/src/notifications/components/NotificationCard.tsx +63 -0
  388. package/src/notifications/components/NotificationList.tsx +65 -0
  389. package/src/notifications/constants/NotificationConstants.ts +104 -0
  390. package/src/notifications/index.ts +3 -0
  391. package/src/notifications/stores/NotificationStore.ts +62 -0
  392. package/src/notifications/utils/NotificationUtils.ts +21 -0
  393. package/src/recurringactivity/RecurringActivityMiniWidget.tsx +45 -0
  394. package/src/recurringactivity/RecurringActivityWidget.tsx +89 -0
  395. package/src/recurringactivity/__tests__/BuildActivities.test.ts +30 -0
  396. package/src/recurringactivity/__tests__/BuildNewActivity.test.ts +59 -0
  397. package/src/recurringactivity/__tests__/RecurringActivityWidget.test.tsx +33 -0
  398. package/src/recurringactivity/components/ActivityBadges.tsx +40 -0
  399. package/src/recurringactivity/components/ActivityDetails.tsx +196 -0
  400. package/src/recurringactivity/components/ActivityList.tsx +141 -0
  401. package/src/recurringactivity/components/ActivityRow.tsx +161 -0
  402. package/src/recurringactivity/components/ActivityStatus.tsx +82 -0
  403. package/src/recurringactivity/components/MiniWidgetContent.tsx +61 -0
  404. package/src/recurringactivity/components/RecurringActivity.tsx +165 -0
  405. package/src/recurringactivity/components/actions/FrequencyAction.tsx +130 -0
  406. package/src/recurringactivity/components/actions/PaymentDateAction.tsx +99 -0
  407. package/src/recurringactivity/components/activitycalendar/ActivityCalendar.tsx +100 -0
  408. package/src/recurringactivity/components/activitycalendar/ActivityDay.tsx +88 -0
  409. package/src/recurringactivity/components/activitycalendar/Legend.tsx +42 -0
  410. package/src/recurringactivity/components/shared/ActivitySettings.tsx +43 -0
  411. package/src/recurringactivity/components/shared/activitysettings/AddActivity.tsx +175 -0
  412. package/src/recurringactivity/components/shared/activitysettings/AddActivityDetails.tsx +148 -0
  413. package/src/recurringactivity/components/shared/activitysettings/ManageExpenses.tsx +84 -0
  414. package/src/recurringactivity/components/shared/activitysettings/ManageIncome.tsx +102 -0
  415. package/src/recurringactivity/components/shared/activitysettings/SelectTransaction.tsx +45 -0
  416. package/src/recurringactivity/index.ts +5 -0
  417. package/src/recurringactivity/stores/RecurringActivityStore.ts +312 -0
  418. package/src/recurringactivity/util/RecurringActivityUtils.ts +40 -0
  419. package/src/recurringactivity/util/buildActivities.ts +334 -0
  420. package/src/recurringactivity/util/buildNewActivity.ts +111 -0
  421. package/src/recurringactivity/util/getRecurrence.ts +50 -0
  422. package/src/recurringactivity/util/getStatus.ts +32 -0
  423. package/src/recurringactivity/util/updateActivity.ts +66 -0
  424. package/src/spending/SpendingMiniWidget.tsx +23 -0
  425. package/src/spending/SpendingWidget.tsx +71 -0
  426. package/src/spending/__tests__/MiniSpendingChart.test.tsx +43 -0
  427. package/src/spending/__tests__/SpendingData.test.ts +38 -0
  428. package/src/spending/__tests__/SpendingMiniWidget.test.tsx +49 -0
  429. package/src/spending/__tests__/SpendingWidget.test.tsx +49 -0
  430. package/src/spending/components/MiniSpendingChart.tsx +125 -0
  431. package/src/spending/components/Spending.tsx +175 -0
  432. package/src/spending/components/SpendingChart.tsx +74 -0
  433. package/src/spending/components/SpendingDonut.tsx +125 -0
  434. package/src/spending/components/SpendingLegend.tsx +41 -0
  435. package/src/spending/components/SpendingList.tsx +112 -0
  436. package/src/spending/components/SpendingTabLabel.tsx +25 -0
  437. package/src/spending/index.ts +2 -0
  438. package/src/spending/utils/SpendingData.ts +196 -0
  439. package/src/transactions/TransactionWidget.tsx +319 -0
  440. package/src/transactions/analytics.ts +12 -0
  441. package/src/transactions/api/TransactionApi.ts +204 -0
  442. package/src/transactions/api/__mocks__/TransactionApi.ts +20 -0
  443. package/src/transactions/components/shared/TransactionDetails.tsx +140 -0
  444. package/src/transactions/components/shared/TransactionList.tsx +124 -0
  445. package/src/transactions/components/shared/TransactionTable.tsx +123 -0
  446. package/src/transactions/components/shared/transactiondetails/Description.tsx +97 -0
  447. package/src/transactions/components/shared/transactiondetails/FlagTransaction.tsx +63 -0
  448. package/src/transactions/components/shared/transactiondetails/ManualTransactionDetails.tsx +148 -0
  449. package/src/transactions/components/shared/transactiondetails/TransactionAmountHeader.tsx +39 -0
  450. package/src/transactions/components/shared/transactiondetails/actions/CategoryAction.tsx +149 -0
  451. package/src/transactions/components/shared/transactiondetails/actions/DateAction.tsx +119 -0
  452. package/src/transactions/components/shared/transactiondetails/actions/DeleteAction.tsx +85 -0
  453. package/src/transactions/components/shared/transactiondetails/actions/DeleteLogoAction.tsx +88 -0
  454. package/src/transactions/components/shared/transactiondetails/actions/HideAction.tsx +126 -0
  455. package/src/transactions/components/shared/transactiondetails/actions/MemoAction.tsx +112 -0
  456. package/src/transactions/components/shared/transactiondetails/actions/SplitAction.tsx +234 -0
  457. package/src/transactions/components/shared/transactiondetails/actions/TagsAction.tsx +119 -0
  458. package/src/transactions/components/shared/transactiondetails/actions/index.ts +8 -0
  459. package/src/transactions/components/shared/transactionlist/DateRow.tsx +33 -0
  460. package/src/transactions/components/shared/transactionlist/TransactionRow.tsx +92 -0
  461. package/src/transactions/components/shared/transactionlist/ZeroState.tsx +36 -0
  462. package/src/transactions/components/shared/transactiontable/cells/AccountCell.tsx +12 -0
  463. package/src/transactions/components/shared/transactiontable/cells/AmountCell.tsx +35 -0
  464. package/src/transactions/components/shared/transactiontable/cells/CategoryCell.tsx +37 -0
  465. package/src/transactions/components/shared/transactiontable/cells/DateCell.tsx +17 -0
  466. package/src/transactions/components/shared/transactiontable/cells/FlagCell.tsx +43 -0
  467. package/src/transactions/components/shared/transactiontable/cells/HeaderCell.tsx +11 -0
  468. package/src/transactions/components/shared/transactiontable/cells/PayeeCell.tsx +21 -0
  469. package/src/transactions/components/shared/transactiontable/cells/index.ts +7 -0
  470. package/src/transactions/components/splitmanager/SplitManager.tsx +93 -0
  471. package/src/transactions/components/splitmanager/SplitRow.tsx +149 -0
  472. package/src/transactions/components/splitmanager/index.ts +1 -0
  473. package/src/transactions/components/tagmanager/Header.tsx +100 -0
  474. package/src/transactions/components/tagmanager/SearchBox.tsx +60 -0
  475. package/src/transactions/components/tagmanager/TagManager.tsx +51 -0
  476. package/src/transactions/components/tagmanager/TagRow.tsx +145 -0
  477. package/src/transactions/components/tagmanager/index.ts +1 -0
  478. package/src/transactions/components/transactionwidget/AddAccountModal.tsx +30 -0
  479. package/src/transactions/components/transactionwidget/actions/AddTransactionAction.tsx +74 -0
  480. package/src/transactions/components/transactionwidget/actions/EditCategoryAction.tsx +80 -0
  481. package/src/transactions/components/transactionwidget/actions/ExportCsvAction.tsx +32 -0
  482. package/src/transactions/constants/Actions.ts +28 -0
  483. package/src/transactions/constants/Analytics.ts +272 -0
  484. package/src/transactions/constants/OnClickEvents.ts +45 -0
  485. package/src/transactions/constants/Transaction.ts +32 -0
  486. package/src/transactions/constants/TransactionsTable.ts +26 -0
  487. package/src/transactions/context/hooks.tsx +12 -0
  488. package/src/transactions/index.ts +12 -0
  489. package/src/transactions/stores/TransactionStore.ts +327 -0
  490. package/src/transactions/stores/UiStore.ts +72 -0
  491. package/src/transactions/stores/__tests__/TransactionStore.test.ts +80 -0
  492. package/src/transactions/utils/Filters.ts +35 -0
  493. package/src/transactions/utils/Transactions.ts +22 -0
  494. package/src/transactions/utils/buildDetailedTransactions.ts +66 -0
  495. package/src/transactions/utils/exportTransactionsToCSV.ts +85 -0
  496. package/src/transactions/utils/sortAndFilterTransactions.ts +127 -0
  497. package/src/trends/TrendsFullWidget.tsx +286 -0
  498. package/src/trends/TrendsMiniWidget.tsx +49 -0
  499. package/src/trends/__tests__/TrendsFullWidget.test.tsx +45 -0
  500. package/src/trends/__tests__/TrendsMiniWidget.test.tsx +35 -0
  501. package/src/trends/components/SpendingChart.tsx +29 -0
  502. package/src/trends/components/TrendsChart.tsx +75 -0
  503. package/src/trends/components/TrendsDrawer.tsx +74 -0
  504. package/src/trends/components/TrendsTable.tsx +161 -0
  505. package/src/trends/components/__tests__/SpendingChart.test.tsx +37 -0
  506. package/src/trends/components/trendstable/AmountCell.tsx +14 -0
  507. package/src/trends/components/trendstable/CategoryCell.tsx +39 -0
  508. package/src/trends/components/trendstable/HeaderCell.tsx +8 -0
  509. package/src/trends/index.ts +2 -0
  510. package/src/trends/mocks.ts +423 -0
  511. package/src/trends/utils/SpendingData.ts +76 -0
  512. package/src/trends/utils/TrendsData.ts +127 -0
  513. package/src/trends/utils/shared.ts +39 -0
@@ -0,0 +1,40 @@
1
+ import { addDays } from 'date-fns/addDays'
2
+ import { endOfMonth } from 'date-fns/endOfMonth'
3
+ import { isWithinInterval } from 'date-fns/isWithinInterval'
4
+ import { startOfMonth } from 'date-fns/startOfMonth'
5
+ import { startOfToday } from 'date-fns/startOfToday'
6
+
7
+ import { type Activity, ActivityType } from '../../common'
8
+
9
+ // This adds up the total amount in a list of activities
10
+ export const totalReducer = (acc: number, curr: Activity) => acc + curr.amount
11
+
12
+ // This filters activity to income during the current month
13
+ // This is used by the Income activity bar
14
+ export const incomeFilter = (i: Activity) =>
15
+ i.activityType === ActivityType.Income &&
16
+ isWithinInterval(i.expectedDate, {
17
+ start: startOfMonth(startOfToday()),
18
+ end: endOfMonth(startOfToday()),
19
+ })
20
+
21
+ // This filters activity to expenses during the current month
22
+ // This is used by the Expense activity bar
23
+ export const expenseFilter = (i: Activity) =>
24
+ i.activityType === ActivityType.Expense &&
25
+ isWithinInterval(i.expectedDate, {
26
+ start: startOfMonth(startOfToday()),
27
+ end: endOfMonth(startOfToday()),
28
+ })
29
+
30
+ // This filters all activity to the current month plus the next 30 days
31
+ export const dateFilter = (a: Activity) =>
32
+ (a.occurredOnDate &&
33
+ isWithinInterval(a.occurredOnDate, {
34
+ start: startOfMonth(new Date()),
35
+ end: addDays(startOfToday(), 30),
36
+ })) ||
37
+ isWithinInterval(a.expectedDate, {
38
+ start: startOfMonth(new Date()),
39
+ end: addDays(startOfToday(), 30),
40
+ })
@@ -0,0 +1,334 @@
1
+ import { addDays } from 'date-fns/addDays'
2
+ import { addMonths } from 'date-fns/addMonths'
3
+ import { addQuarters } from 'date-fns/addQuarters'
4
+ import { addWeeks } from 'date-fns/addWeeks'
5
+ import { addYears } from 'date-fns/addYears'
6
+ import { fromUnixTime } from 'date-fns/fromUnixTime'
7
+ import { getUnixTime } from 'date-fns/getUnixTime'
8
+ import { isAfter } from 'date-fns/isAfter'
9
+ import { isBefore } from 'date-fns/isBefore'
10
+ import { isWithinInterval } from 'date-fns/isWithinInterval'
11
+ import { nextDay } from 'date-fns/nextDay'
12
+ import { parseISO } from 'date-fns/parseISO'
13
+ import { setDate } from 'date-fns/setDate'
14
+ import { startOfMonth } from 'date-fns/startOfMonth'
15
+ import { startOfToday } from 'date-fns/startOfToday'
16
+ import { subDays } from 'date-fns/subDays'
17
+ import { subWeeks } from 'date-fns/subWeeks'
18
+ import { Day } from 'date-fns/types'
19
+
20
+ import {
21
+ type Account,
22
+ type Activity,
23
+ ActivityStatus,
24
+ ActivityType,
25
+ type CashflowEvent,
26
+ type CashflowSequence,
27
+ RecurrenceTypes,
28
+ type ScheduledPayment,
29
+ type Transaction,
30
+ } from '../../common'
31
+
32
+ import { fromUnixUTC } from '../../common/utils/DateUtil'
33
+
34
+ const buildInstitutionName = (account: Account) => {
35
+ let name = account.user_name || account.feed_name || ''
36
+ if (account.account_number) {
37
+ name = `${name} *${account.account_number}`
38
+ }
39
+ return name
40
+ }
41
+
42
+ export const getRecurrenceType = (sequence?: CashflowSequence) => {
43
+ if (!sequence) return RecurrenceTypes.Unknown
44
+
45
+ if (sequence.repeat_interval === '1') return RecurrenceTypes.EveryWeek
46
+ if (sequence.repeat_interval === '2') return RecurrenceTypes.EveryOtherWeek
47
+ if (sequence.repeat_day && !sequence.repeat_month && !sequence.repeat_interval)
48
+ return RecurrenceTypes.EveryMonth
49
+ if (sequence.repeat_day && sequence.repeat_interval === '3') return RecurrenceTypes.EveryQuarter
50
+ if (sequence.repeat_day && sequence.repeat_month) return RecurrenceTypes.EveryYear
51
+
52
+ return RecurrenceTypes.Unknown
53
+ }
54
+
55
+ export const buildActivities = (
56
+ accounts: Account[],
57
+ events: CashflowEvent[],
58
+ payments: ScheduledPayment[],
59
+ projected: CashflowEvent[],
60
+ sequences: CashflowSequence[],
61
+ transactions: Transaction[],
62
+ ): Activity[] => {
63
+ // Add paid income
64
+ const paidIncome = events
65
+ .filter((e) => {
66
+ const sequence = sequences.find((s) => s.guid === e.cashflow_sequence_guid)
67
+ const transaction = transactions.find((t) => t.guid === e.transaction_guid)
68
+
69
+ return sequence?.end_date === null && transaction
70
+ })
71
+ .map((e) => {
72
+ const sequence = sequences.find((s) => s.guid === e.cashflow_sequence_guid)
73
+ const transaction = transactions.find((t) => t.guid === e.transaction_guid)
74
+ const account = accounts.find((a) => a.guid === transaction?.account_guid)
75
+
76
+ return {
77
+ accountGuid: sequence?.account_guid || account?.guid,
78
+ activityStatus: ActivityStatus.Paid,
79
+ activityType: ActivityType.Income,
80
+ amount: e.amount,
81
+ categoryGuid: e.category_guid,
82
+ expectedDate: fromUnixUTC(e.expected_date),
83
+ occurredOnDate: e.occurred_on ? fromUnixUTC(e.occurred_on) : undefined,
84
+ name: e.name,
85
+ institution: account ? buildInstitutionName(account) : undefined,
86
+ institutionGuid: account?.institution_guid,
87
+ merchantGuid: transaction?.merchant_guid || undefined,
88
+ recurrenceType: getRecurrenceType(sequence),
89
+ recurrenceDay: sequence?.repeat_day ? Number(sequence?.repeat_day) : undefined,
90
+ sequenceGuid: sequence?.guid,
91
+ transactionGuid: e.transaction_guid,
92
+ }
93
+ })
94
+
95
+ // Add expected income for the next 30 days
96
+ const upcomingIncome = projected
97
+ .filter((e) =>
98
+ isWithinInterval(fromUnixTime(e.expected_date), {
99
+ start: startOfMonth(startOfToday()),
100
+ end: addDays(startOfToday(), 30),
101
+ }),
102
+ )
103
+ .filter((e) => {
104
+ const sequence = sequences.find((s) => s.guid === e.cashflow_sequence_guid)
105
+ const actual = events.find(
106
+ (a) => a.cashflow_sequence_guid === sequence?.guid && a.expected_date === e.expected_date,
107
+ )
108
+ return sequence?.end_date === null && !actual
109
+ })
110
+ .map((e) => {
111
+ const sequence = sequences.find((s) => s.guid === e.cashflow_sequence_guid)
112
+ // Find a past event to fill in account and merchant information
113
+ const pastEvent = events.find(
114
+ (p) => p.cashflow_sequence_guid === e.cashflow_sequence_guid && Boolean(p.transaction_guid),
115
+ )
116
+ const transaction = transactions.find((t) => t.guid === pastEvent?.transaction_guid)
117
+ const account = accounts.find((a) => a.guid === transaction?.account_guid)
118
+
119
+ return {
120
+ accountGuid: sequence?.account_guid || account?.guid,
121
+ activityStatus: ActivityStatus.Upcoming,
122
+ activityType: ActivityType.Income,
123
+ amount: e.amount,
124
+ categoryGuid: e.category_guid,
125
+ expectedDate: fromUnixUTC(e.expected_date),
126
+ name: e.name,
127
+ institution: account ? buildInstitutionName(account) : undefined,
128
+ institutionGuid: account?.institution_guid,
129
+ merchantGuid: transaction?.merchant_guid || undefined,
130
+ recurrenceType: getRecurrenceType(sequence),
131
+ recurrenceDay: sequence?.repeat_day ? Number(sequence?.repeat_day) : undefined,
132
+ sequenceGuid: sequence?.guid,
133
+ transactionGuid: undefined,
134
+ }
135
+ })
136
+
137
+ // Add scheduled payments for the next 30 days
138
+ const expenses = [] as Activity[]
139
+
140
+ if (payments) {
141
+ payments.forEach((payment) => expenses.push(...buildExpenses(accounts, payment, transactions)))
142
+ }
143
+
144
+ const activities = [...paidIncome, ...upcomingIncome, ...expenses] as Activity[]
145
+
146
+ return activities.sort(
147
+ (a, b) =>
148
+ getUnixTime(a.occurredOnDate || a.expectedDate) -
149
+ getUnixTime(b.occurredOnDate || b.expectedDate),
150
+ )
151
+ }
152
+
153
+ const buildExpenses = (
154
+ accounts: Account[],
155
+ payment: ScheduledPayment,
156
+ transactions: Transaction[],
157
+ ): Activity[] => {
158
+ const expenses = [] as Activity[]
159
+
160
+ const pastTransaction = transactions.find((t) => t.scheduled_payment_guid === payment.guid)
161
+ if (!pastTransaction) return []
162
+
163
+ const account = accounts.find((a) => a.guid === pastTransaction?.account_guid)
164
+ const occursOn = parseISO(payment.occurs_on)
165
+ const baseExpense = {
166
+ accountGuid: account?.guid,
167
+ activityStatus: ActivityStatus.Upcoming,
168
+ activityType: ActivityType.Expense,
169
+ amount: payment.amount,
170
+ categoryGuid: pastTransaction?.category_guid,
171
+ expectedDate: occursOn,
172
+ name: payment.description,
173
+ institution: account ? buildInstitutionName(account) : undefined,
174
+ institutionGuid: account?.institution_guid,
175
+ merchantGuid: payment.merchant_guid,
176
+ recurrenceType: payment.recurrence_type,
177
+ recurrenceDay: payment.recurrence_day,
178
+ scheduledPaymentGuid: payment.guid,
179
+ transactionGuid: '',
180
+ }
181
+
182
+ const day = payment.recurrence_day
183
+ const today = startOfToday()
184
+ const startDate = startOfMonth(startOfToday())
185
+ const endDate = addDays(startOfToday(), 30)
186
+
187
+ let nextDate = startDate
188
+ switch (payment.recurrence_type) {
189
+ case RecurrenceTypes.EveryWeek:
190
+ // Add upcoming expenses for each week in the current month + next month
191
+ nextDate = nextDay(nextDate, day as Day)
192
+ while (isBefore(nextDate, endDate)) {
193
+ expenses.push({
194
+ ...baseExpense,
195
+ expectedDate: nextDate,
196
+ })
197
+ nextDate = nextDay(nextDate, day as Day)
198
+ }
199
+ break
200
+ case RecurrenceTypes.EveryOtherWeek:
201
+ // Add upcoming expense for every other week in current month + next month
202
+ if (isBefore(occursOn, startDate)) {
203
+ nextDate = addWeeks(occursOn, 2)
204
+ while (isBefore(nextDate, endDate)) {
205
+ if (isAfter(nextDate, startDate)) {
206
+ expenses.push({
207
+ ...baseExpense,
208
+ expectedDate: nextDate,
209
+ })
210
+ }
211
+ nextDate = addWeeks(nextDate, 2)
212
+ }
213
+ } else {
214
+ // Add for occurs_on
215
+ expenses.push({
216
+ ...baseExpense,
217
+ expectedDate: occursOn,
218
+ })
219
+ // Add past starting at occurs_on
220
+ nextDate = subWeeks(occursOn, 2)
221
+ while (isAfter(nextDate, startDate)) {
222
+ expenses.push({
223
+ ...baseExpense,
224
+ expectedDate: nextDate,
225
+ })
226
+ nextDate = subWeeks(nextDate, 2)
227
+ }
228
+
229
+ // Add future starting at occurs_on
230
+ nextDate = addWeeks(occursOn, 2)
231
+ while (isBefore(nextDate, endDate)) {
232
+ expenses.push({
233
+ ...baseExpense,
234
+ expectedDate: nextDate,
235
+ })
236
+ nextDate = addWeeks(nextDate, 2)
237
+ }
238
+ }
239
+ break
240
+ case RecurrenceTypes.EveryMonth:
241
+ // Add expense for current month and next month
242
+ expenses.push({
243
+ ...baseExpense,
244
+ expectedDate: setDate(nextDate, day),
245
+ })
246
+ expenses.push({
247
+ ...baseExpense,
248
+ expectedDate: addMonths(setDate(nextDate, day), 1),
249
+ })
250
+ break
251
+ case RecurrenceTypes.EveryOtherMonth:
252
+ // Use occurs_on to calculate next expense
253
+ if (isBefore(occursOn, startDate)) {
254
+ if (isBefore(addMonths(occursOn, 2), endDate)) {
255
+ expenses.push({
256
+ ...baseExpense,
257
+ expectedDate: addMonths(occursOn, 2),
258
+ })
259
+ }
260
+ } else if (isBefore(occursOn, endDate)) {
261
+ expenses.push({
262
+ ...baseExpense,
263
+ expectedDate: occursOn,
264
+ })
265
+ }
266
+ break
267
+ case RecurrenceTypes.EveryQuarter:
268
+ // Use occurs_on to calculate next expense
269
+ if (isBefore(occursOn, startDate)) {
270
+ if (isBefore(addQuarters(occursOn, 1), endDate)) {
271
+ expenses.push({
272
+ ...baseExpense,
273
+ expectedDate: addQuarters(occursOn, 1),
274
+ })
275
+ }
276
+ } else if (isBefore(occursOn, endDate)) {
277
+ expenses.push({
278
+ ...baseExpense,
279
+ expectedDate: occursOn,
280
+ })
281
+ }
282
+ break
283
+ case RecurrenceTypes.EveryOtherQuarter:
284
+ // Use occurs_on to calculate next expense
285
+ if (isBefore(occursOn, startDate)) {
286
+ if (isBefore(addQuarters(occursOn, 2), endDate)) {
287
+ expenses.push({
288
+ ...baseExpense,
289
+ expectedDate: addQuarters(occursOn, 2),
290
+ })
291
+ }
292
+ } else if (isBefore(occursOn, endDate)) {
293
+ expenses.push({
294
+ ...baseExpense,
295
+ expectedDate: occursOn,
296
+ })
297
+ }
298
+ break
299
+ case RecurrenceTypes.EveryYear:
300
+ // Use occurs_on to calculate next expense
301
+ if (isBefore(occursOn, startDate)) {
302
+ if (isBefore(addYears(occursOn, 1), endDate)) {
303
+ expenses.push({
304
+ ...baseExpense,
305
+ expectedDate: addYears(occursOn, 1),
306
+ })
307
+ }
308
+ } else if (isBefore(occursOn, endDate)) {
309
+ expenses.push({
310
+ ...baseExpense,
311
+ expectedDate: occursOn,
312
+ })
313
+ }
314
+ break
315
+ }
316
+
317
+ expenses.forEach((exp) => {
318
+ const transaction = transactions.find(
319
+ (t) =>
320
+ t.scheduled_payment_guid === exp.scheduledPaymentGuid &&
321
+ t.date > getUnixTime(subDays(exp.expectedDate, 3)) &&
322
+ t.date < getUnixTime(addDays(exp.expectedDate, 3)),
323
+ )
324
+ if (transaction) {
325
+ exp.transactionGuid = transaction.guid
326
+ exp.occurredOnDate = fromUnixTime(transaction.date)
327
+ exp.activityStatus = ActivityStatus.Paid
328
+ } else if (isBefore(exp.expectedDate, subDays(today, 3))) {
329
+ exp.activityStatus = ActivityStatus.Missed
330
+ }
331
+ })
332
+
333
+ return expenses
334
+ }
@@ -0,0 +1,111 @@
1
+ import { formatISO } from 'date-fns/formatISO'
2
+ import { getDay } from 'date-fns/getDay'
3
+ import { getDate } from 'date-fns/getDate'
4
+ import { getMonth } from 'date-fns/getMonth'
5
+ import { getUnixTime } from 'date-fns/getUnixTime'
6
+
7
+ import {
8
+ type CashflowEvent,
9
+ type CashflowSequence,
10
+ type RepeatDay,
11
+ type RepeatMonth,
12
+ type ScheduledPayment,
13
+ type Transaction,
14
+ RecurrenceTypes,
15
+ RepeatWeekday,
16
+ } from '../../common'
17
+
18
+ export const buildNewCashflowSequence = (
19
+ transaction: Transaction,
20
+ recurrenceType: RecurrenceTypes,
21
+ nextDate: Date,
22
+ ): CashflowSequence => {
23
+ const cashflowSequence = {
24
+ account_guid: transaction.account_guid,
25
+ amount: transaction.amount,
26
+ category_guid: transaction.category_guid,
27
+ description: transaction.feed_description || transaction.description,
28
+ name: transaction.description,
29
+ repeat_day: null,
30
+ repeat_interval: null,
31
+ repeat_month: null,
32
+ repeat_week: null,
33
+ repeat_weekday: null,
34
+ repeat_year: null,
35
+ start_date: getUnixTime(nextDate),
36
+ transaction_type: transaction.transaction_type,
37
+ } as CashflowSequence
38
+
39
+ switch (recurrenceType) {
40
+ case RecurrenceTypes.EveryWeek:
41
+ cashflowSequence.repeat_interval = '1'
42
+ cashflowSequence.repeat_weekday = `${getDay(nextDate)}` as RepeatWeekday
43
+ break
44
+ case RecurrenceTypes.EveryOtherWeek:
45
+ cashflowSequence.repeat_interval = '2'
46
+ cashflowSequence.repeat_weekday = `${getDay(nextDate)}` as RepeatWeekday
47
+ break
48
+ case RecurrenceTypes.EveryMonth:
49
+ cashflowSequence.repeat_day = `${getDate(nextDate)}` as RepeatDay
50
+ break
51
+ case RecurrenceTypes.EveryQuarter:
52
+ cashflowSequence.repeat_interval = '3'
53
+ cashflowSequence.repeat_day = `${getDate(nextDate)}` as RepeatDay
54
+ break
55
+ case RecurrenceTypes.EveryYear:
56
+ cashflowSequence.repeat_day = `${getDate(nextDate)}` as RepeatDay
57
+ cashflowSequence.repeat_month = `${getMonth(nextDate)}` as RepeatMonth
58
+ break
59
+ }
60
+
61
+ return cashflowSequence
62
+ }
63
+
64
+ export const buildNewCashflowEvent = (
65
+ cashflowSequence: CashflowSequence,
66
+ transaction: Transaction,
67
+ ) => {
68
+ return {
69
+ amount: transaction.amount,
70
+ cashflow_sequence_guid: cashflowSequence.guid,
71
+ category_guid: transaction.category_guid,
72
+ description: transaction.feed_description || transaction.description,
73
+ expected_date: transaction.date,
74
+ name: transaction.description,
75
+ occurred_on: transaction.date,
76
+ transaction_guid: transaction.guid,
77
+ transaction_type: transaction.transaction_type,
78
+ } as CashflowEvent
79
+ }
80
+
81
+ export const buildNewScheduledPayment = (
82
+ transaction: Transaction,
83
+ recurrenceType: RecurrenceTypes,
84
+ nextDate: Date,
85
+ ) => {
86
+ const payment = {
87
+ amount: transaction.amount,
88
+ description: transaction.feed_description || transaction.description,
89
+ is_tracked_by_user: true,
90
+ merchant_guid: transaction.merchant_guid,
91
+ occurs_on: formatISO(nextDate, { representation: 'date' }),
92
+ recurrence_day: 0,
93
+ recurrence_type: RecurrenceTypes.EveryMonth,
94
+ } as ScheduledPayment
95
+
96
+ switch (recurrenceType) {
97
+ case RecurrenceTypes.EveryWeek:
98
+ case RecurrenceTypes.EveryOtherWeek:
99
+ payment.recurrence_day = getDay(nextDate)
100
+ break
101
+ case RecurrenceTypes.EveryMonth:
102
+ case RecurrenceTypes.EveryOtherMonth:
103
+ case RecurrenceTypes.EveryQuarter:
104
+ case RecurrenceTypes.EveryOtherQuarter:
105
+ case RecurrenceTypes.EveryYear:
106
+ payment.recurrence_day = getDate(nextDate)
107
+ break
108
+ }
109
+
110
+ return payment
111
+ }
@@ -0,0 +1,50 @@
1
+ import { format } from 'date-fns/format'
2
+ import { isValid } from 'date-fns/isValid'
3
+ import { buildDynamicCopy, RecurrenceTypes, type RecurringCopy } from '../../common'
4
+
5
+ interface GetRecurrenceArgs {
6
+ copy: RecurringCopy
7
+ date: Date | null
8
+ type: RecurrenceTypes
9
+ }
10
+
11
+ export const getRecurrence = ({ copy, date, type }: GetRecurrenceArgs) => {
12
+ let recurrenceType =
13
+ date && isValid(date)
14
+ ? buildDynamicCopy(copy.monthly_ordinal, format(date, 'do'))
15
+ : copy.monthly
16
+ switch (type) {
17
+ case RecurrenceTypes.EveryQuarter:
18
+ recurrenceType = date
19
+ ? buildDynamicCopy(copy.quarterly_ordinal, format(date, 'do'))
20
+ : copy.quarterly
21
+ break
22
+ case RecurrenceTypes.EveryWeek:
23
+ recurrenceType = date
24
+ ? buildDynamicCopy(copy.weekly_ordinal, format(date, 'do'))
25
+ : copy.weekly
26
+ break
27
+ case RecurrenceTypes.EveryYear:
28
+ recurrenceType = date
29
+ ? buildDynamicCopy(copy.anually_ordinal, format(date, 'do'))
30
+ : copy.anually
31
+ break
32
+ case RecurrenceTypes.EveryOtherWeek:
33
+ recurrenceType = date
34
+ ? buildDynamicCopy(copy.every_other_week_ordinal, format(date, 'do'))
35
+ : copy.every_other_week
36
+ break
37
+ case RecurrenceTypes.EveryOtherMonth:
38
+ recurrenceType = date
39
+ ? buildDynamicCopy(copy.every_other_month_ordinal, format(date, 'do'))
40
+ : copy.every_other_month
41
+ break
42
+ case RecurrenceTypes.EveryOtherQuarter:
43
+ recurrenceType = date
44
+ ? buildDynamicCopy(copy.every_other_quarter_ordinal, format(date, 'do'))
45
+ : copy.every_other_quarter
46
+ break
47
+ }
48
+
49
+ return recurrenceType as string
50
+ }
@@ -0,0 +1,32 @@
1
+ import {
2
+ type Activity,
3
+ ActivityStatus,
4
+ buildDynamicCopy,
5
+ DATE_FORMATS_INTL,
6
+ formatDate,
7
+ type RecurringCopy,
8
+ } from '../../common'
9
+
10
+ export const getStatus = (activity: Activity, copy: RecurringCopy): string => {
11
+ switch (activity.activityStatus) {
12
+ case ActivityStatus.Paid:
13
+ return activity.occurredOnDate
14
+ ? (buildDynamicCopy(
15
+ copy.paid_on,
16
+ formatDate(activity.occurredOnDate, DATE_FORMATS_INTL.MONTH_DAY),
17
+ ) as string)
18
+ : copy.paid
19
+ case ActivityStatus.Missed:
20
+ return buildDynamicCopy(
21
+ copy.missed_on,
22
+ formatDate(activity.expectedDate, DATE_FORMATS_INTL.MONTH_DAY),
23
+ ) as string
24
+ case ActivityStatus.Upcoming:
25
+ return buildDynamicCopy(
26
+ copy.upcoming_on,
27
+ formatDate(activity.expectedDate, DATE_FORMATS_INTL.MONTH_DAY),
28
+ ) as string
29
+ default:
30
+ return copy.unknown
31
+ }
32
+ }
@@ -0,0 +1,66 @@
1
+ import { formatISO } from 'date-fns/formatISO'
2
+ import { getDate } from 'date-fns/getDate'
3
+ import { getDay } from 'date-fns/getDay'
4
+ import { getUnixTime } from 'date-fns/getUnixTime'
5
+ import { getMonth } from 'date-fns/getMonth'
6
+
7
+ import { RecurrenceTypes } from '../../common'
8
+
9
+ import type {
10
+ Activity,
11
+ CashflowSequence,
12
+ RepeatDay,
13
+ RepeatMonth,
14
+ RepeatWeekday,
15
+ ScheduledPayment,
16
+ } from '../../common'
17
+
18
+ export const updateIncome = (activity: Activity, sequence: CashflowSequence): CashflowSequence => {
19
+ const updatedSequence = {
20
+ ...sequence,
21
+ repeat_day: null,
22
+ repeat_interval: null,
23
+ repeat_month: null,
24
+ repeat_weekday: null,
25
+ start_date: getUnixTime(activity.expectedDate),
26
+ } as CashflowSequence
27
+
28
+ const repeatDay = `${getDate(activity.expectedDate)}` as RepeatDay
29
+ const repeatMonth = `${getMonth(activity.expectedDate)}` as RepeatMonth
30
+ const repeatWeekday = `${getDay(activity.expectedDate)}` as RepeatWeekday
31
+
32
+ switch (activity.recurrenceType) {
33
+ case RecurrenceTypes.EveryWeek:
34
+ updatedSequence.repeat_interval = '1'
35
+ updatedSequence.repeat_weekday = repeatWeekday
36
+ break
37
+ case RecurrenceTypes.EveryOtherWeek:
38
+ updatedSequence.repeat_interval = '2'
39
+ updatedSequence.repeat_weekday = repeatWeekday
40
+ break
41
+ case RecurrenceTypes.EveryMonth:
42
+ updatedSequence.repeat_day = repeatDay
43
+ break
44
+ case RecurrenceTypes.EveryQuarter:
45
+ updatedSequence.repeat_day = repeatDay
46
+ updatedSequence.repeat_interval = '3'
47
+ break
48
+ case RecurrenceTypes.EveryYear:
49
+ updatedSequence.repeat_day = repeatDay
50
+ updatedSequence.repeat_month = repeatMonth
51
+ break
52
+ }
53
+
54
+ return updatedSequence
55
+ }
56
+
57
+ export const updateExpense = (
58
+ activity: Activity,
59
+ scheduledPayment: ScheduledPayment,
60
+ ): ScheduledPayment => {
61
+ return {
62
+ ...scheduledPayment,
63
+ occurs_on: formatISO(activity.expectedDate, { representation: 'date' }),
64
+ recurrence_type: activity.recurrenceType,
65
+ }
66
+ }
@@ -0,0 +1,23 @@
1
+ import React from 'react'
2
+ import { observer } from 'mobx-react-lite'
3
+
4
+ import { MiniWidgetContainer, MiniWidgetProps, useGlobalCopyStore } from '../common'
5
+ import MiniSpendingChart from './components/MiniSpendingChart'
6
+
7
+ const SpendingMiniWidget: React.FC<MiniWidgetProps> = ({ onPrimaryCtaClick, sx = {} }) => {
8
+ const { spending: spendingCopy } = useGlobalCopyStore()
9
+
10
+ return (
11
+ <MiniWidgetContainer
12
+ className="mx-exp-spending-miniwidget"
13
+ onPrimaryCtaClick={onPrimaryCtaClick}
14
+ primaryCtaLabel={spendingCopy.primary_cta}
15
+ sx={sx}
16
+ title={spendingCopy.mini_title}
17
+ >
18
+ <MiniSpendingChart />
19
+ </MiniWidgetContainer>
20
+ )
21
+ }
22
+
23
+ export default observer(SpendingMiniWidget)