@mx-cartographer/experiences 4.0.14-alpha.JB0 → 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 (508) hide show
  1. package/package.json +3 -2
  2. package/src/accounts/AccountsMiniWidget.tsx +62 -0
  3. package/src/accounts/AccountsWidget.tsx +93 -0
  4. package/src/accounts/ConnectMiniWidget.tsx +36 -0
  5. package/src/accounts/__tests__/Accounts.test.tsx +561 -0
  6. package/src/accounts/api/AccountApi.ts +74 -0
  7. package/src/accounts/api/__mocks__/AccountApi.ts +46 -0
  8. package/src/accounts/components/AccountListItem.tsx +102 -0
  9. package/src/accounts/components/AccountsList.tsx +133 -0
  10. package/src/accounts/components/ConnectImage.tsx +314 -0
  11. package/src/accounts/components/ConnectMiniWidgetCard.tsx +41 -0
  12. package/src/accounts/components/ConnectStatus.tsx +44 -0
  13. package/src/accounts/components/ConnectionStatusIcons.tsx +26 -0
  14. package/src/accounts/components/ConnectionsDrawer.tsx +84 -0
  15. package/src/accounts/components/detailsdrawer/Accounts/AccountActions.tsx +177 -0
  16. package/src/accounts/components/detailsdrawer/Accounts/AccountActionsRow.tsx +33 -0
  17. package/src/accounts/components/detailsdrawer/Accounts/AccountConnection.tsx +139 -0
  18. package/src/accounts/components/detailsdrawer/Accounts/AccountDetailEdit.tsx +162 -0
  19. package/src/accounts/components/detailsdrawer/Accounts/AccountDetails.tsx +98 -0
  20. package/src/accounts/components/detailsdrawer/Accounts/AccountDetailsChart.tsx +63 -0
  21. package/src/accounts/components/detailsdrawer/Accounts/AccountDetailsContent.tsx +52 -0
  22. package/src/accounts/components/detailsdrawer/Accounts/AccountDetailsHeader.tsx +71 -0
  23. package/src/accounts/components/detailsdrawer/Accounts/AccountDetailsTab.tsx +25 -0
  24. package/src/accounts/components/detailsdrawer/Accounts/ConnectionErrorMessage.tsx +99 -0
  25. package/src/accounts/components/detailsdrawer/Transactions/TransactionsTab.tsx +51 -0
  26. package/src/accounts/constants/Accounts.ts +11 -0
  27. package/src/accounts/hooks/useGetMergeableAccounts.tsx +13 -0
  28. package/src/accounts/hooks/useUiStore.ts +12 -0
  29. package/src/accounts/index.ts +8 -0
  30. package/src/accounts/stores/AccountStore.ts +220 -0
  31. package/src/accounts/stores/UiStore.ts +18 -0
  32. package/src/accounts/stores/__tests__/AccountStore.test.ts +204 -0
  33. package/src/accounts/utils/AccountFields.tsx +248 -0
  34. package/src/accounts/utils/Accounts.ts +28 -0
  35. package/src/accounts/utils/__tests__/AccountFieldsUtils.test.tsx +215 -0
  36. package/src/accounts/utils/__tests__/AccountsUtils.test.tsx +104 -0
  37. package/src/accounts/utils/getConnectionMessages.tsx +198 -0
  38. package/src/accounts/utils/index.ts +1 -0
  39. package/src/budgets/BubbleBudgetsMiniWidget.tsx +57 -0
  40. package/src/budgets/BubbleBudgetsWidget.tsx +154 -0
  41. package/src/budgets/__tests__/BubbleBudgetsWidget.test.tsx +40 -0
  42. package/src/budgets/__tests__/BudgetList.test.tsx +38 -0
  43. package/src/budgets/__tests__/BudgetsStore.test.tsx +48 -0
  44. package/src/budgets/__tests__/Overview.test.tsx +38 -0
  45. package/src/budgets/api/BudgetsApi.ts +43 -0
  46. package/src/budgets/api/__mocks__/BudgetsApi.ts +7 -0
  47. package/src/budgets/components/AddBudgets.tsx +50 -0
  48. package/src/budgets/components/BubbleBudgets.tsx +73 -0
  49. package/src/budgets/components/BubbleChart.tsx +50 -0
  50. package/src/budgets/components/BudgetDetailsDrawer.tsx +134 -0
  51. package/src/budgets/components/BudgetList.tsx +50 -0
  52. package/src/budgets/components/Overview.tsx +156 -0
  53. package/src/budgets/components/ZeroState.tsx +23 -0
  54. package/src/budgets/components/addbudget/Header.tsx +59 -0
  55. package/src/budgets/components/addbudget/RecalculateBudgetRow.tsx +53 -0
  56. package/src/budgets/components/addbudget/RecalculateBudgets.tsx +69 -0
  57. package/src/budgets/components/addbudget/UnbudgetedRow.tsx +57 -0
  58. package/src/budgets/components/bubblechart/Bubble.tsx +148 -0
  59. package/src/budgets/components/bubblechart/Mercury.tsx +57 -0
  60. package/src/budgets/components/budgetdetails/AddSubBudget.tsx +111 -0
  61. package/src/budgets/components/budgetdetails/BudgetDetails.tsx +93 -0
  62. package/src/budgets/components/budgetdetails/Header.tsx +48 -0
  63. package/src/budgets/components/budgetdetails/SubBudgetList.tsx +148 -0
  64. package/src/budgets/components/budgetlist/BudgetRow.tsx +63 -0
  65. package/src/budgets/components/budgetlist/SubBudgetRow.tsx +64 -0
  66. package/src/budgets/components/budgetlist/SubBudgetZeroState.tsx +22 -0
  67. package/src/budgets/components/shared/BudgetAmount.tsx +54 -0
  68. package/src/budgets/index.ts +2 -0
  69. package/src/budgets/store/BudgetsStore.ts +183 -0
  70. package/src/budgets/utils/BubblesSVG.ts +142 -0
  71. package/src/budgets/utils/BudgetUtil.ts +140 -0
  72. package/src/cashflow/CashflowMiniWidget.tsx +25 -0
  73. package/src/cashflow/CashflowOnboarding.tsx +298 -0
  74. package/src/cashflow/CashflowWidget.tsx +111 -0
  75. package/src/cashflow/api/CashflowApi.ts +62 -0
  76. package/src/cashflow/api/__mocks__/CashflowApi.ts +15 -0
  77. package/src/cashflow/components/CashflowAmountHeading.tsx +46 -0
  78. package/src/cashflow/components/CashflowContent.tsx +63 -0
  79. package/src/cashflow/components/CashflowHeading.tsx +172 -0
  80. package/src/cashflow/components/CashflowWidgetContent.tsx +225 -0
  81. package/src/cashflow/components/DetailsExpenseHeader.tsx +47 -0
  82. package/src/cashflow/components/DetailsExpenseRow.tsx +46 -0
  83. package/src/cashflow/components/DetailsFooter.tsx +28 -0
  84. package/src/cashflow/components/DetailsTab.tsx +128 -0
  85. package/src/cashflow/components/RemainingCash.tsx +44 -0
  86. package/src/cashflow/components/SummaryTab.tsx +247 -0
  87. package/src/cashflow/components/onboarding/StepOne.tsx +90 -0
  88. package/src/cashflow/components/onboarding/StepTwo.tsx +23 -0
  89. package/src/cashflow/context/hooks.tsx +12 -0
  90. package/src/cashflow/images/cashflow-onboarding.png +0 -0
  91. package/src/cashflow/images/loading-animation.gif +0 -0
  92. package/src/cashflow/index.ts +5 -0
  93. package/src/cashflow/stores/CashflowStore.ts +26 -0
  94. package/src/cashflow/stores/UiStore.ts +48 -0
  95. package/src/cashflow/stores/__tests__/CashflowStore.test.ts +16 -0
  96. package/src/cashflow/util/Filters.ts +15 -0
  97. package/src/categories/components/CategoryList.tsx +64 -0
  98. package/src/categories/components/CategoryRow.tsx +68 -0
  99. package/src/categories/components/CategorySelector.tsx +80 -0
  100. package/src/categories/components/CategorySelectorDrawer.tsx +41 -0
  101. package/src/categories/components/CustomCategories/AddSubcategory.tsx +65 -0
  102. package/src/categories/components/CustomCategories/CustomCategoryModal.tsx +99 -0
  103. package/src/categories/components/CustomCategories/DeleteSubcategory.tsx +49 -0
  104. package/src/categories/components/CustomCategories/RenameSubcategory.tsx +48 -0
  105. package/src/categories/components/CustomCategories/index.ts +4 -0
  106. package/src/categories/components/SubcategoryList.tsx +47 -0
  107. package/src/categories/components/SubcategoryRow.tsx +123 -0
  108. package/src/categories/constants/Analytics.ts +89 -0
  109. package/src/categories/constants/OnClickEvents.ts +13 -0
  110. package/src/categories/context/hooks.ts +12 -0
  111. package/src/categories/index.ts +5 -0
  112. package/src/categories/stores/CategoryStore.ts +184 -0
  113. package/src/categories/stores/UiStore.ts +36 -0
  114. package/src/categories/stores/__tests__/CategoryStore.test.ts +54 -0
  115. package/src/categories/util/CategoryUtil.ts +136 -0
  116. package/src/common/api/AnalyticsApi.ts +49 -0
  117. package/src/common/api/BeatApi.ts +32 -0
  118. package/src/common/api/CategoryApi.ts +52 -0
  119. package/src/common/api/GlobalCopyApi.ts +17 -0
  120. package/src/common/api/LocalizedCopyApi.ts +21 -0
  121. package/src/common/api/NotificationApi.ts +40 -0
  122. package/src/common/api/ScheduledPaymentsApi.ts +37 -0
  123. package/src/common/api/UserApi.ts +23 -0
  124. package/src/common/api/WidgetApi.ts +15 -0
  125. package/src/common/api/__mocks__/BeatApi.ts +8 -0
  126. package/src/common/api/__mocks__/CategoryApi.ts +15 -0
  127. package/src/common/api/__mocks__/GlobalCopyApi.ts +7 -0
  128. package/src/common/api/__mocks__/NotificationApi.ts +11 -0
  129. package/src/common/api/__mocks__/ScheduledPaymentsApi.ts +7 -0
  130. package/src/common/api/__mocks__/UserApi.ts +9 -0
  131. package/src/common/api/__mocks__/WidgetApi.ts +11 -0
  132. package/src/common/api/index.ts +9 -0
  133. package/src/common/components/ConnectDrawer.tsx +87 -0
  134. package/src/common/components/CurrencyInput.tsx +147 -0
  135. package/src/common/components/CurrencyText.tsx +44 -0
  136. package/src/common/components/DataRow.tsx +52 -0
  137. package/src/common/components/IconBacking.tsx +41 -0
  138. package/src/common/components/InformationTooltip.tsx +52 -0
  139. package/src/common/components/ListItemWrapper.tsx +49 -0
  140. package/src/common/components/Loader.tsx +24 -0
  141. package/src/common/components/MiniWidgetContainer.tsx +64 -0
  142. package/src/common/components/ResponsiveButton.tsx +65 -0
  143. package/src/common/components/SearchBox.tsx +64 -0
  144. package/src/common/components/SelectionBox.tsx +64 -0
  145. package/src/common/components/SubheaderRow.tsx +22 -0
  146. package/src/common/components/TabContentContainer.tsx +28 -0
  147. package/src/common/components/WidgetContainer.tsx +239 -0
  148. package/src/common/components/accountfilter/AccountFilter.tsx +133 -0
  149. package/src/common/components/accountfilter/AccountFilterOptions.tsx +263 -0
  150. package/src/common/components/accountfilter/index.ts +1 -0
  151. package/src/common/components/barchart/Bar.tsx +123 -0
  152. package/src/common/components/barchart/BarChart.tsx +136 -0
  153. package/src/common/components/barchart/BarColumn.tsx +150 -0
  154. package/src/common/components/barchart/Legend.tsx +60 -0
  155. package/src/common/components/barchart/Util.ts +54 -0
  156. package/src/common/components/barchart/__tests__/BarChart.test.tsx +46 -0
  157. package/src/common/components/barchart/index.ts +1 -0
  158. package/src/common/components/calendar/Calendar.tsx +223 -0
  159. package/src/common/components/calendar/Day.tsx +127 -0
  160. package/src/common/components/calendar/Header.tsx +58 -0
  161. package/src/common/components/calendar/__tests__/Calendar.test.tsx +50 -0
  162. package/src/common/components/calendar/index.ts +1 -0
  163. package/src/common/components/calendar/upcomingActivity/CalendarIcons.tsx +40 -0
  164. package/src/common/components/charts/Donut.tsx +82 -0
  165. package/src/common/components/charts/LineChart.tsx +204 -0
  166. package/src/common/components/charts/StackedLineChart.tsx +292 -0
  167. package/src/common/components/charts/StatusBar.tsx +41 -0
  168. package/src/common/components/charts/index.ts +4 -0
  169. package/src/common/components/charts/linechart/CustomLegend.tsx +49 -0
  170. package/src/common/components/charts/linechart/CustomLine.tsx +31 -0
  171. package/src/common/components/charts/linechart/CustomMark.tsx +68 -0
  172. package/src/common/components/charts/stackedlinechart/CategoryIconLabel.tsx +29 -0
  173. package/src/common/components/charts/stackedlinechart/CustomAreaTooltip.tsx +115 -0
  174. package/src/common/components/charts/stackedlinechart/CustomLegend.tsx +73 -0
  175. package/src/common/components/charts/stackedlinechart/CustomPointTooltip.tsx +41 -0
  176. package/src/common/components/charts/stackedlinechart/utils.ts +13 -0
  177. package/src/common/components/daterangeselector/DateRangeSelector.tsx +383 -0
  178. package/src/common/components/daterangeselector/index.ts +1 -0
  179. package/src/common/components/dialog/Dialog.tsx +92 -0
  180. package/src/common/components/dialog/index.ts +1 -0
  181. package/src/common/components/donuts/MultiSegmentDonut.tsx +89 -0
  182. package/src/common/components/donuts/SingleSegmentDonut.tsx +75 -0
  183. package/src/common/components/donuts/index.ts +2 -0
  184. package/src/common/components/drawer/Drawer.tsx +97 -0
  185. package/src/common/components/drawer/Header.tsx +64 -0
  186. package/src/common/components/drawer/index.ts +1 -0
  187. package/src/common/components/index.ts +22 -0
  188. package/src/common/constants/Account.ts +30 -0
  189. package/src/common/constants/Analytics.ts +70 -0
  190. package/src/common/constants/ApiEndpoints.ts +30 -0
  191. package/src/common/constants/Category.ts +302 -0
  192. package/src/common/constants/Connect.ts +2 -0
  193. package/src/common/constants/DateFormats.ts +122 -0
  194. package/src/common/constants/Donut.ts +2 -0
  195. package/src/common/constants/Numbers.ts +6 -0
  196. package/src/common/constants/ScheduledPayment.ts +21 -0
  197. package/src/common/constants/Sizes.ts +7 -0
  198. package/src/common/constants/SpendingPlan.ts +17 -0
  199. package/src/common/constants/Table.ts +13 -0
  200. package/src/common/constants/index.ts +21 -0
  201. package/src/common/context/GlobalDataProvider.tsx +31 -0
  202. package/src/common/context/WidgetContainerProvider.tsx +24 -0
  203. package/src/common/context/__mocks__/GlobalDataProvider.tsx +25 -0
  204. package/src/common/context/hooks.tsx +57 -0
  205. package/src/common/context/index.ts +22 -0
  206. package/src/common/hooks/__tests__/useDimensions.test.tsx +190 -0
  207. package/src/common/hooks/index.ts +3 -0
  208. package/src/common/hooks/useCombineEvents.tsx +53 -0
  209. package/src/common/hooks/useDimensions.tsx +78 -0
  210. package/src/common/hooks/usePrevious.tsx +10 -0
  211. package/src/common/hooks/useScreenSize.tsx +15 -0
  212. package/src/common/index.ts +23 -0
  213. package/src/common/stores/ConnectStore.ts +26 -0
  214. package/src/common/stores/GlobalCopyStore.ts +36 -0
  215. package/src/common/stores/GlobalStore.ts +83 -0
  216. package/src/common/stores/GlobalUiStore.ts +66 -0
  217. package/src/common/stores/UserStore.ts +45 -0
  218. package/src/common/stores/__tests__/GlobalCopyStore.test.ts +23 -0
  219. package/src/common/stores/__tests__/GlobalStore.test.ts +24 -0
  220. package/src/common/stores/index.ts +3 -0
  221. package/src/common/types/Account.ts +406 -0
  222. package/src/common/types/Activity.ts +31 -0
  223. package/src/common/types/Analytics.ts +70 -0
  224. package/src/common/types/Beat.ts +71 -0
  225. package/src/common/types/Budget.ts +29 -0
  226. package/src/common/types/Cashflow.ts +110 -0
  227. package/src/common/types/Category.ts +68 -0
  228. package/src/common/types/Date.ts +2 -0
  229. package/src/common/types/Debt.ts +19 -0
  230. package/src/common/types/Expense.ts +20 -0
  231. package/src/common/types/Global.ts +13 -0
  232. package/src/common/types/GlobalCopy.ts +37 -0
  233. package/src/common/types/Goal.ts +59 -0
  234. package/src/common/types/Institution.ts +11 -0
  235. package/src/common/types/LocalizedContent.ts +9 -0
  236. package/src/common/types/Merchant.ts +6 -0
  237. package/src/common/types/Notification.ts +15 -0
  238. package/src/common/types/ScheduledPayment.ts +15 -0
  239. package/src/common/types/ScreenSize.tsx +4 -0
  240. package/src/common/types/SpendingPlan.ts +48 -0
  241. package/src/common/types/Transaction.ts +91 -0
  242. package/src/common/types/User.ts +20 -0
  243. package/src/common/types/Widgets.ts +11 -0
  244. package/src/common/types/index.ts +93 -0
  245. package/src/common/types/localization/AccountFilterCopy.ts +12 -0
  246. package/src/common/types/localization/AccountTypeCopy.ts +16 -0
  247. package/src/common/types/localization/AccountsCopy.ts +113 -0
  248. package/src/common/types/localization/BudgetsCopy.ts +52 -0
  249. package/src/common/types/localization/CashflowCopy.ts +77 -0
  250. package/src/common/types/localization/CategoryCopy.ts +18 -0
  251. package/src/common/types/localization/CommonCopy.ts +30 -0
  252. package/src/common/types/localization/ConnectCopy.ts +74 -0
  253. package/src/common/types/localization/CurrencyInputCopy.ts +6 -0
  254. package/src/common/types/localization/DateRangePickerCopy.ts +23 -0
  255. package/src/common/types/localization/GoalsCopy.ts +37 -0
  256. package/src/common/types/localization/InsightsFeedCopy.ts +26 -0
  257. package/src/common/types/localization/MicroInsightsCopy.ts +28 -0
  258. package/src/common/types/localization/NetWorthCopy.ts +14 -0
  259. package/src/common/types/localization/NotificationsCopy.ts +7 -0
  260. package/src/common/types/localization/RecurringCopy.ts +76 -0
  261. package/src/common/types/localization/SpendingCopy.ts +16 -0
  262. package/src/common/types/localization/TransactionsCopy.ts +81 -0
  263. package/src/common/types/localization/TrendsCopy.ts +10 -0
  264. package/src/common/types/localization/index.ts +19 -0
  265. package/src/common/utils/AccountFilter.ts +45 -0
  266. package/src/common/utils/Analytics.ts +51 -0
  267. package/src/common/utils/Categories.ts +75 -0
  268. package/src/common/utils/DateUtil.ts +67 -0
  269. package/src/common/utils/Fetch.ts +115 -0
  270. package/src/common/utils/Localization.ts +67 -0
  271. package/src/common/utils/NumberFormatting.ts +65 -0
  272. package/src/common/utils/__tests__/Fetch.test.tsx +34 -0
  273. package/src/common/utils/index.ts +18 -0
  274. package/src/dashboard/Dashboard.tsx +92 -0
  275. package/src/dashboard/Greeting.tsx +75 -0
  276. package/src/dashboard/__tests__/Dashboard.test.tsx +84 -0
  277. package/src/dashboard/constants/Dashboard.ts +4 -0
  278. package/src/dashboard/index.ts +3 -0
  279. package/src/dashboard/types/DashboardTypes.ts +9 -0
  280. package/src/debts/DebtsWidget.tsx +90 -0
  281. package/src/debts/components/DebtsChart.tsx +190 -0
  282. package/src/debts/components/DebtsTable.tsx +209 -0
  283. package/src/debts/components/SnowballCard.tsx +70 -0
  284. package/src/debts/components/SnowballDrawer.tsx +384 -0
  285. package/src/debts/components/debtstable/AccountCell.tsx +25 -0
  286. package/src/debts/components/debtstable/PriorityCell.tsx +46 -0
  287. package/src/debts/index.ts +4 -0
  288. package/src/debts/store/DebtsStore.ts +20 -0
  289. package/src/debts/utils/DebtStore.ts +75 -0
  290. package/src/debts/utils/DebtsWidget.ts +32 -0
  291. package/src/debts/utils/SnowballCard.tsx +48 -0
  292. package/src/goals/GoalsWidget.tsx +128 -0
  293. package/src/goals/api/GoalApi.ts +29 -0
  294. package/src/goals/components/GoalDetails.tsx +240 -0
  295. package/src/goals/components/GoalList.tsx +101 -0
  296. package/src/goals/components/GoalStatusCard.tsx +87 -0
  297. package/src/goals/components/TabTitle.tsx +21 -0
  298. package/src/goals/constants/CopyKeys.ts +29 -0
  299. package/src/goals/index.ts +2 -0
  300. package/src/goals/stores/GoalStore.ts +47 -0
  301. package/src/goals/util/GoalsUtil.ts +61 -0
  302. package/src/index.ts +17 -0
  303. package/src/insights/README.md +16 -0
  304. package/src/insights/contexts/ToastContext.tsx +62 -0
  305. package/src/insights/index.ts +5 -0
  306. package/src/insights/settings/SettingsDrawer.tsx +40 -0
  307. package/src/insights/settings/__tests__/SettingsDrawer.test.tsx +50 -0
  308. package/src/insights/settings/components/PulseSubheaderRow.tsx +34 -0
  309. package/src/insights/settings/components/SettingsItem.tsx +55 -0
  310. package/src/insights/settings/components/Toast.tsx +69 -0
  311. package/src/insights/settings/hiddeninsights/__tests__/HiddenInsightsDrawer.test.tsx +108 -0
  312. package/src/insights/settings/hiddeninsights/__tests__/SubCategoryDrawer.test.tsx +150 -0
  313. package/src/insights/settings/hiddeninsights/components/CategoryEmptyState.tsx +50 -0
  314. package/src/insights/settings/hiddeninsights/components/HiddenInsightsDrawer.tsx +222 -0
  315. package/src/insights/settings/hiddeninsights/components/HiddenInsightsDrawerWrapper.tsx +24 -0
  316. package/src/insights/settings/hiddeninsights/components/SubCategoryDrawer.tsx +256 -0
  317. package/src/insights/settings/hiddeninsights/images/no-insights.png +0 -0
  318. package/src/insights/settings/hiddeninsights/types/index.ts +74 -0
  319. package/src/insights/settings/manageaccounts/__tests__/AccountGroup.test.tsx +92 -0
  320. package/src/insights/settings/manageaccounts/__tests__/ManageAccountsDrawer.test.tsx +83 -0
  321. package/src/insights/settings/manageaccounts/components/AccountGroup.tsx +109 -0
  322. package/src/insights/settings/manageaccounts/components/ManageAccountsDrawer.tsx +63 -0
  323. package/src/insights/settings/manageaccounts/types/index.ts +13 -0
  324. package/src/insights/settings/types/index.ts +4 -0
  325. package/src/insights/store/BeatStore.ts +25 -0
  326. package/src/insights/utils/beatTemplateCategories.ts +103 -0
  327. package/src/merchants/api/MerchantApi.ts +33 -0
  328. package/src/merchants/components/MerchantLookup.tsx +117 -0
  329. package/src/merchants/index.ts +2 -0
  330. package/src/merchants/stores/MerchantStore.ts +42 -0
  331. package/src/microinsights/analytics.ts +31 -0
  332. package/src/microinsights/components/beatCard/BeatCard.tsx +124 -0
  333. package/src/microinsights/components/beaticons/BeatCategoryIcon.tsx +20 -0
  334. package/src/microinsights/components/beaticons/BeatIcon.tsx +45 -0
  335. package/src/microinsights/components/beaticons/BeatMerchantLogo.tsx +33 -0
  336. package/src/microinsights/components/beaticons/ChartFilledIcon.tsx +37 -0
  337. package/src/microinsights/components/beaticons/MonthlySpendComparisonIcon.tsx +30 -0
  338. package/src/microinsights/components/beaticons/ZeroStateIcon.tsx +558 -0
  339. package/src/microinsights/components/beaticons/index.tsx +7 -0
  340. package/src/microinsights/components/carouselheader/CarouselHeader.tsx +111 -0
  341. package/src/microinsights/components/insightsmicrowidget/InsightsMicroWidget.tsx +163 -0
  342. package/src/microinsights/components/microBeatCarousel/CarouselControls.tsx +99 -0
  343. package/src/microinsights/components/microBeatCarousel/MicroBeatCarousel.tsx +207 -0
  344. package/src/microinsights/components/microInsightCard/MicroInsightCard.tsx +173 -0
  345. package/src/microinsights/components/noRelevantInsightsCard/NoRelevantInsightsCard.tsx +89 -0
  346. package/src/microinsights/components/spinner/Spinner.tsx +21 -0
  347. package/src/microinsights/components/viewMoreMicroCard/ViewMoreMicroCard.tsx +101 -0
  348. package/src/microinsights/components/zeroStateCard/ZeroStateCard.tsx +62 -0
  349. package/src/microinsights/constants/Analytics.ts +192 -0
  350. package/src/microinsights/constants/App.ts +53 -0
  351. package/src/microinsights/constants/Insights.tsx +3 -0
  352. package/src/microinsights/constants/OnClickEvents.ts +3 -0
  353. package/src/microinsights/context/InsightsMicroWidgetDataProvider.tsx +24 -0
  354. package/src/microinsights/context/hooks.tsx +65 -0
  355. package/src/microinsights/index.ts +16 -0
  356. package/src/microinsights/interfaces.ts +28 -0
  357. package/src/microinsights/stores/AppStore.ts +34 -0
  358. package/src/microinsights/stores/CopyStore.ts +38 -0
  359. package/src/microinsights/stores/InsightsMicroWidgetStore.ts +61 -0
  360. package/src/microinsights/types/BeatUIComponent.ts +5 -0
  361. package/src/microinsights/utils/DataSeries.ts +20 -0
  362. package/src/networth/NetWorthWidget.tsx +171 -0
  363. package/src/networth/__tests__/AssetsLiabilitiesDetail.test.tsx +94 -0
  364. package/src/networth/__tests__/NetWorthChart.test.tsx +31 -0
  365. package/src/networth/__tests__/NetWorthList.test.tsx +33 -0
  366. package/src/networth/components/AssetsLiabilitiesDetail.tsx +146 -0
  367. package/src/networth/components/GainsLossesDetail.tsx +110 -0
  368. package/src/networth/components/NetWorthChange.tsx +51 -0
  369. package/src/networth/components/NetWorthChart.tsx +71 -0
  370. package/src/networth/components/NetWorthList.tsx +91 -0
  371. package/src/networth/components/NetWorthListItem.tsx +72 -0
  372. package/src/networth/components/NetWorthSummary.tsx +36 -0
  373. package/src/networth/index.ts +5 -0
  374. package/src/networth/stores/NetWorthStore.ts +99 -0
  375. package/src/networth/stores/__tests__/NetWorthStore.test.ts +32 -0
  376. package/src/networth/types/NetWorth.ts +59 -0
  377. package/src/networth/utils/NetWorthUtils.ts +177 -0
  378. package/src/networth/utils/__tests__/NetWorthUtils.test.ts +198 -0
  379. package/src/notifications/__tests__/NotificationList.test.tsx +67 -0
  380. package/src/notifications/components/DateRow.tsx +21 -0
  381. package/src/notifications/components/NotificationBadge.tsx +51 -0
  382. package/src/notifications/components/NotificationCard.tsx +63 -0
  383. package/src/notifications/components/NotificationList.tsx +65 -0
  384. package/src/notifications/constants/NotificationConstants.ts +104 -0
  385. package/src/notifications/index.ts +3 -0
  386. package/src/notifications/stores/NotificationStore.ts +62 -0
  387. package/src/notifications/utils/NotificationUtils.ts +21 -0
  388. package/src/recurringactivity/RecurringActivityMiniWidget.tsx +45 -0
  389. package/src/recurringactivity/RecurringActivityWidget.tsx +89 -0
  390. package/src/recurringactivity/__tests__/BuildActivities.test.ts +30 -0
  391. package/src/recurringactivity/__tests__/BuildNewActivity.test.ts +59 -0
  392. package/src/recurringactivity/__tests__/RecurringActivityWidget.test.tsx +33 -0
  393. package/src/recurringactivity/components/ActivityBadges.tsx +40 -0
  394. package/src/recurringactivity/components/ActivityDetails.tsx +196 -0
  395. package/src/recurringactivity/components/ActivityList.tsx +141 -0
  396. package/src/recurringactivity/components/ActivityRow.tsx +161 -0
  397. package/src/recurringactivity/components/ActivityStatus.tsx +82 -0
  398. package/src/recurringactivity/components/MiniWidgetContent.tsx +61 -0
  399. package/src/recurringactivity/components/RecurringActivity.tsx +165 -0
  400. package/src/recurringactivity/components/actions/FrequencyAction.tsx +130 -0
  401. package/src/recurringactivity/components/actions/PaymentDateAction.tsx +99 -0
  402. package/src/recurringactivity/components/activitycalendar/ActivityCalendar.tsx +100 -0
  403. package/src/recurringactivity/components/activitycalendar/ActivityDay.tsx +88 -0
  404. package/src/recurringactivity/components/activitycalendar/Legend.tsx +42 -0
  405. package/src/recurringactivity/components/shared/ActivitySettings.tsx +43 -0
  406. package/src/recurringactivity/components/shared/activitysettings/AddActivity.tsx +175 -0
  407. package/src/recurringactivity/components/shared/activitysettings/AddActivityDetails.tsx +148 -0
  408. package/src/recurringactivity/components/shared/activitysettings/ManageExpenses.tsx +84 -0
  409. package/src/recurringactivity/components/shared/activitysettings/ManageIncome.tsx +102 -0
  410. package/src/recurringactivity/components/shared/activitysettings/SelectTransaction.tsx +45 -0
  411. package/src/recurringactivity/index.ts +5 -0
  412. package/src/recurringactivity/stores/RecurringActivityStore.ts +312 -0
  413. package/src/recurringactivity/util/RecurringActivityUtils.ts +40 -0
  414. package/src/recurringactivity/util/buildActivities.ts +334 -0
  415. package/src/recurringactivity/util/buildNewActivity.ts +111 -0
  416. package/src/recurringactivity/util/getRecurrence.ts +50 -0
  417. package/src/recurringactivity/util/getStatus.ts +32 -0
  418. package/src/recurringactivity/util/updateActivity.ts +66 -0
  419. package/src/spending/SpendingMiniWidget.tsx +23 -0
  420. package/src/spending/SpendingWidget.tsx +71 -0
  421. package/src/spending/__tests__/MiniSpendingChart.test.tsx +43 -0
  422. package/src/spending/__tests__/SpendingData.test.ts +38 -0
  423. package/src/spending/__tests__/SpendingMiniWidget.test.tsx +49 -0
  424. package/src/spending/__tests__/SpendingWidget.test.tsx +49 -0
  425. package/src/spending/components/MiniSpendingChart.tsx +125 -0
  426. package/src/spending/components/Spending.tsx +175 -0
  427. package/src/spending/components/SpendingChart.tsx +74 -0
  428. package/src/spending/components/SpendingDonut.tsx +125 -0
  429. package/src/spending/components/SpendingLegend.tsx +41 -0
  430. package/src/spending/components/SpendingList.tsx +112 -0
  431. package/src/spending/components/SpendingTabLabel.tsx +25 -0
  432. package/src/spending/index.ts +2 -0
  433. package/src/spending/utils/SpendingData.ts +196 -0
  434. package/src/transactions/TransactionWidget.tsx +319 -0
  435. package/src/transactions/analytics.ts +12 -0
  436. package/src/transactions/api/TransactionApi.ts +204 -0
  437. package/src/transactions/api/__mocks__/TransactionApi.ts +20 -0
  438. package/src/transactions/components/shared/TransactionDetails.tsx +140 -0
  439. package/src/transactions/components/shared/TransactionList.tsx +124 -0
  440. package/src/transactions/components/shared/TransactionTable.tsx +123 -0
  441. package/src/transactions/components/shared/transactiondetails/Description.tsx +97 -0
  442. package/src/transactions/components/shared/transactiondetails/FlagTransaction.tsx +63 -0
  443. package/src/transactions/components/shared/transactiondetails/ManualTransactionDetails.tsx +148 -0
  444. package/src/transactions/components/shared/transactiondetails/TransactionAmountHeader.tsx +39 -0
  445. package/src/transactions/components/shared/transactiondetails/actions/CategoryAction.tsx +149 -0
  446. package/src/transactions/components/shared/transactiondetails/actions/DateAction.tsx +119 -0
  447. package/src/transactions/components/shared/transactiondetails/actions/DeleteAction.tsx +85 -0
  448. package/src/transactions/components/shared/transactiondetails/actions/DeleteLogoAction.tsx +88 -0
  449. package/src/transactions/components/shared/transactiondetails/actions/HideAction.tsx +126 -0
  450. package/src/transactions/components/shared/transactiondetails/actions/MemoAction.tsx +112 -0
  451. package/src/transactions/components/shared/transactiondetails/actions/SplitAction.tsx +234 -0
  452. package/src/transactions/components/shared/transactiondetails/actions/TagsAction.tsx +119 -0
  453. package/src/transactions/components/shared/transactiondetails/actions/index.ts +8 -0
  454. package/src/transactions/components/shared/transactionlist/DateRow.tsx +33 -0
  455. package/src/transactions/components/shared/transactionlist/TransactionRow.tsx +92 -0
  456. package/src/transactions/components/shared/transactionlist/ZeroState.tsx +36 -0
  457. package/src/transactions/components/shared/transactiontable/cells/AccountCell.tsx +12 -0
  458. package/src/transactions/components/shared/transactiontable/cells/AmountCell.tsx +35 -0
  459. package/src/transactions/components/shared/transactiontable/cells/CategoryCell.tsx +37 -0
  460. package/src/transactions/components/shared/transactiontable/cells/DateCell.tsx +17 -0
  461. package/src/transactions/components/shared/transactiontable/cells/FlagCell.tsx +43 -0
  462. package/src/transactions/components/shared/transactiontable/cells/HeaderCell.tsx +11 -0
  463. package/src/transactions/components/shared/transactiontable/cells/PayeeCell.tsx +21 -0
  464. package/src/transactions/components/shared/transactiontable/cells/index.ts +7 -0
  465. package/src/transactions/components/splitmanager/SplitManager.tsx +93 -0
  466. package/src/transactions/components/splitmanager/SplitRow.tsx +149 -0
  467. package/src/transactions/components/splitmanager/index.ts +1 -0
  468. package/src/transactions/components/tagmanager/Header.tsx +100 -0
  469. package/src/transactions/components/tagmanager/SearchBox.tsx +60 -0
  470. package/src/transactions/components/tagmanager/TagManager.tsx +51 -0
  471. package/src/transactions/components/tagmanager/TagRow.tsx +145 -0
  472. package/src/transactions/components/tagmanager/index.ts +1 -0
  473. package/src/transactions/components/transactionwidget/AddAccountModal.tsx +30 -0
  474. package/src/transactions/components/transactionwidget/actions/AddTransactionAction.tsx +74 -0
  475. package/src/transactions/components/transactionwidget/actions/EditCategoryAction.tsx +80 -0
  476. package/src/transactions/components/transactionwidget/actions/ExportCsvAction.tsx +32 -0
  477. package/src/transactions/constants/Actions.ts +28 -0
  478. package/src/transactions/constants/Analytics.ts +272 -0
  479. package/src/transactions/constants/OnClickEvents.ts +45 -0
  480. package/src/transactions/constants/Transaction.ts +32 -0
  481. package/src/transactions/constants/TransactionsTable.ts +26 -0
  482. package/src/transactions/context/hooks.tsx +12 -0
  483. package/src/transactions/index.ts +12 -0
  484. package/src/transactions/stores/TransactionStore.ts +327 -0
  485. package/src/transactions/stores/UiStore.ts +72 -0
  486. package/src/transactions/stores/__tests__/TransactionStore.test.ts +80 -0
  487. package/src/transactions/utils/Filters.ts +35 -0
  488. package/src/transactions/utils/Transactions.ts +22 -0
  489. package/src/transactions/utils/buildDetailedTransactions.ts +66 -0
  490. package/src/transactions/utils/exportTransactionsToCSV.ts +85 -0
  491. package/src/transactions/utils/sortAndFilterTransactions.ts +127 -0
  492. package/src/trends/TrendsFullWidget.tsx +286 -0
  493. package/src/trends/TrendsMiniWidget.tsx +49 -0
  494. package/src/trends/__tests__/TrendsFullWidget.test.tsx +45 -0
  495. package/src/trends/__tests__/TrendsMiniWidget.test.tsx +35 -0
  496. package/src/trends/components/SpendingChart.tsx +29 -0
  497. package/src/trends/components/TrendsChart.tsx +75 -0
  498. package/src/trends/components/TrendsDrawer.tsx +74 -0
  499. package/src/trends/components/TrendsTable.tsx +161 -0
  500. package/src/trends/components/__tests__/SpendingChart.test.tsx +37 -0
  501. package/src/trends/components/trendstable/AmountCell.tsx +14 -0
  502. package/src/trends/components/trendstable/CategoryCell.tsx +39 -0
  503. package/src/trends/components/trendstable/HeaderCell.tsx +8 -0
  504. package/src/trends/index.ts +2 -0
  505. package/src/trends/mocks.ts +423 -0
  506. package/src/trends/utils/SpendingData.ts +76 -0
  507. package/src/trends/utils/TrendsData.ts +127 -0
  508. package/src/trends/utils/shared.ts +39 -0
@@ -0,0 +1,561 @@
1
+ import React, { act } from 'react'
2
+ import { beforeEach, describe, expect, it, vi } from 'vitest'
3
+ import { render, RenderResult, screen, within } from '@testing-library/react'
4
+ import userEvent from '@testing-library/user-event'
5
+
6
+ import members from '../../../mock/data/Members.json'
7
+
8
+ import AccountsFullView from '../AccountsWidget'
9
+ import DataProvider from '../../common/context/__mocks__/GlobalDataProvider'
10
+
11
+ import { GlobalStore } from '../../common/stores/GlobalStore'
12
+
13
+ const globalStore = new GlobalStore()
14
+
15
+ vi.mock('@mui/x-charts', () => ({
16
+ ResponsiveChartContainer: vi.fn().mockImplementation(({ children }) => children),
17
+ LinePlot: vi.fn().mockImplementation(({ children }) => children),
18
+ AreaPlot: vi.fn().mockImplementation(({ children }) => children),
19
+ BarPlot: vi.fn().mockImplementation(({ children }) => children),
20
+ MarkPlot: vi.fn().mockImplementation(({ children }) => children),
21
+ ChartsLegend: vi.fn().mockImplementation(({ children }) => children),
22
+ ChartsReferenceLine: vi.fn().mockImplementation(({ children }) => children),
23
+ ChartsXAxis: vi.fn().mockImplementation(({ children }) => children),
24
+ ChartsYAxis: vi.fn().mockImplementation(({ children }) => children),
25
+ }))
26
+
27
+ describe('AccountsFullView', () => {
28
+ let docBody: RenderResult
29
+
30
+ act(() => {
31
+ if (!globalStore.isInitialized) {
32
+ globalStore.initialize('/', 'sessionToken')
33
+ }
34
+ })
35
+
36
+ beforeEach(() => {
37
+ docBody = render(
38
+ <DataProvider globalStore={globalStore}>
39
+ <AccountsFullView />
40
+ </DataProvider>,
41
+ )
42
+ })
43
+
44
+ it('renders correct heading and subtitles in correct order', () => {
45
+ const listItems = docBody.queryAllByRole('listitem')
46
+ const mainChecking = listItems[0]
47
+ expect(within(mainChecking).queryByText('Available balance')).toBeTruthy()
48
+ expect(within(mainChecking).queryByText('Current balance')).toBeTruthy()
49
+ expect(within(mainChecking).queryByText('Gringotts Checking *5768')).toBeTruthy()
50
+
51
+ const manualAccount = listItems[1]
52
+ expect(within(manualAccount).queryByText('Available balance')).toBeFalsy()
53
+ expect(within(manualAccount).queryByText('Current balance')).toBeTruthy()
54
+ expect(within(manualAccount).queryByText('Manual account')).toBeTruthy()
55
+
56
+ const otherChecking = listItems[2]
57
+ expect(within(otherChecking).queryByText('Available balance')).toBeTruthy()
58
+ expect(within(otherChecking).queryByText('Current balance')).toBeTruthy()
59
+ expect(within(otherChecking).queryByText('Other Checking *1234')).toBeTruthy()
60
+
61
+ const emergencySavings = listItems[3]
62
+ expect(within(emergencySavings).queryByText('Available balance')).toBeFalsy()
63
+ expect(within(emergencySavings).queryByText('Current balance')).toBeTruthy()
64
+ expect(within(emergencySavings).queryByText('Emergency Savings 1')).toBeTruthy()
65
+
66
+ const healthSavings = listItems[4]
67
+ expect(within(healthSavings).queryByText('Available balance')).toBeTruthy()
68
+ expect(within(healthSavings).queryByText('Current balance')).toBeTruthy()
69
+ expect(within(healthSavings).queryByText('Health Savings *1098')).toBeTruthy()
70
+
71
+ const rainyDaySavings = listItems[5]
72
+ expect(within(rainyDaySavings).queryByText('Available balance')).toBeFalsy()
73
+ expect(within(rainyDaySavings).queryByText('Current balance')).toBeTruthy()
74
+ expect(within(rainyDaySavings).queryByText('Rainy Day Savings *5432')).toBeTruthy()
75
+
76
+ const creditCard1 = listItems[6]
77
+ expect(creditCard1.querySelector('strong')).toBeTruthy()
78
+ expect(within(creditCard1).queryByText('Available balance')).toBeFalsy()
79
+ expect(within(creditCard1).queryByText('Current balance')).toBeTruthy()
80
+ expect(within(creditCard1).queryByText('Credit Card')).toBeTruthy()
81
+
82
+ const creditCard2 = listItems[7]
83
+ expect(within(creditCard2).queryByText('Available credit')).toBeTruthy()
84
+ expect(within(creditCard2).queryByText('Current balance')).toBeTruthy()
85
+ expect(within(creditCard2).queryByText('Credit Card 2')).toBeTruthy()
86
+
87
+ const investments = listItems[8]
88
+ expect(within(investments).queryByText('Available balance')).toBeFalsy()
89
+ expect(within(investments).queryByText('Current balance')).toBeTruthy()
90
+ expect(within(investments).queryByText('Investments *7654')).toBeTruthy()
91
+
92
+ const mortgage = listItems[9]
93
+ expect(within(mortgage).queryByText('Available balance')).toBeFalsy()
94
+ expect(within(mortgage).queryByText('Current balance')).toBeTruthy()
95
+ expect(within(mortgage).queryByText('Loan Number: *1738')).toBeTruthy()
96
+
97
+ const property = listItems[10]
98
+ expect(within(property).queryByText('Available balance')).toBeFalsy()
99
+ expect(within(property).queryByText('Current balance')).toBeTruthy()
100
+ expect(within(property).queryByText('Hope Diamond')).toBeTruthy()
101
+ })
102
+
103
+ it('correctly filters accounts', async () => {
104
+ // 1. Ensure it's in the DOM (since we'll test that it gets filtered out)
105
+ expect(screen.queryByText('Gringotts Checking *5768')).toBeTruthy()
106
+
107
+ // 2. Trigger the account filter popover
108
+ const filterAccountsButton = screen.queryAllByRole('button')[0]
109
+ await act(() => userEvent.click(filterAccountsButton))
110
+
111
+ // 3. De-select Main Checking
112
+ const mainCheckingToggle = screen.queryAllByRole('checkbox')[0]
113
+ await act(() => userEvent.click(mainCheckingToggle))
114
+
115
+ // 4. Apply the filter
116
+ const filterButton = screen.queryAllByRole('button')[13]
117
+ await act(() => userEvent.click(filterButton))
118
+
119
+ expect(screen.queryByText('Main Checking *5768')).toBeFalsy()
120
+ })
121
+
122
+ describe('account details chart', () => {
123
+ it('1st account (checking)', async () => {
124
+ const mainChecking = docBody.queryAllByRole('listitem')[0].firstChild
125
+ await act(() => userEvent.click(mainChecking))
126
+ expect(screen.getByTestId('TrendsChart')).toBeInTheDocument()
127
+ })
128
+ it('2nd account (manual)', async () => {
129
+ const manualAccount = docBody.queryAllByRole('listitem')[1].firstChild
130
+ await act(() => userEvent.click(manualAccount))
131
+ expect(screen.getByTestId('TrendsChart')).toBeInTheDocument()
132
+ })
133
+ it('3rd account (checking)', async () => {
134
+ const otherChecking = docBody.queryAllByRole('listitem')[2].firstChild
135
+ await act(() => userEvent.click(otherChecking))
136
+ expect(screen.queryByTestId('TrendsChart')).toBeInTheDocument()
137
+ })
138
+ it('4th account (savings)', async () => {
139
+ const emergencySavings = docBody.queryAllByRole('listitem')[3].firstChild
140
+ await act(() => userEvent.click(emergencySavings))
141
+ expect(screen.queryByTestId('TrendsChart')).toBeInTheDocument()
142
+ })
143
+ it('5th account (savings)', async () => {
144
+ const healthSavings = docBody.queryAllByRole('listitem')[4].firstChild
145
+ await act(() => userEvent.click(healthSavings))
146
+ expect(screen.queryByTestId('TrendsChart')).toBeInTheDocument()
147
+ })
148
+ it('6th account (savings)', async () => {
149
+ const rainyDaySavings = docBody.queryAllByRole('listitem')[5].firstChild
150
+ await act(() => userEvent.click(rainyDaySavings))
151
+ expect(screen.queryByTestId('TrendsChart')).toBeInTheDocument()
152
+ })
153
+ it('7th account (credit card)', async () => {
154
+ const creditCard1 = docBody.queryAllByRole('listitem')[6].firstChild
155
+ await act(() => userEvent.click(creditCard1))
156
+ expect(screen.queryByTestId('TrendsChart')).toBeInTheDocument()
157
+ })
158
+ it('8th account (credit card)', async () => {
159
+ const creditCard2 = docBody.queryAllByRole('listitem')[7].firstChild
160
+ await act(() => userEvent.click(creditCard2))
161
+ expect(screen.queryByTestId('TrendsChart')).toBeInTheDocument()
162
+ })
163
+ it('9th account (investments)', async () => {
164
+ const investments = docBody.queryAllByRole('listitem')[8].firstChild
165
+ await act(() => userEvent.click(investments))
166
+ expect(screen.queryByTestId('TrendsChart')).not.toBeInTheDocument()
167
+ })
168
+ it('10th account (mortgage)', async () => {
169
+ const mortgage = docBody.queryAllByRole('listitem')[9].firstChild
170
+ await act(() => userEvent.click(mortgage))
171
+ expect(screen.queryByTestId('TrendsChart')).toBeInTheDocument()
172
+ })
173
+ it('11th account (property)', async () => {
174
+ const property = docBody.queryAllByRole('listitem')[10].firstChild
175
+ await act(() => userEvent.click(property))
176
+ expect(screen.queryByTestId('TrendsChart')).not.toBeInTheDocument()
177
+ })
178
+ })
179
+
180
+ describe('account details tab', () => {
181
+ describe('main details', () => {
182
+ it('1st account', async () => {
183
+ expect(screen.queryByText('Account Details')).toBeFalsy()
184
+
185
+ // find first account button and click it
186
+ const account1 = docBody.queryAllByRole('listitem')[0].firstChild
187
+ await act(() => userEvent.click(account1))
188
+
189
+ expect(screen.queryAllByText('Account Details')).toBeTruthy()
190
+ expect(screen.getByText('Connection failed')).toBeInTheDocument()
191
+ expect(screen.getByRole('alert')).toBeInTheDocument()
192
+ expect(screen.getByText(members[3].institution_url)).toBeInTheDocument()
193
+ expect(screen.getByText('Hide Account')).toBeInTheDocument()
194
+ expect(screen.getByText('Mark as Closed')).toBeInTheDocument()
195
+ })
196
+
197
+ it('2nd account', async () => {
198
+ expect(screen.queryByText('Account Details')).toBeFalsy()
199
+
200
+ // find first account button and click it
201
+ const account2 = docBody.queryAllByRole('listitem')[1].firstChild
202
+ await act(() => userEvent.click(account2))
203
+
204
+ const accountDetailsTab = docBody.queryAllByRole('tab')[1]
205
+ await act(() => userEvent.click(accountDetailsTab))
206
+
207
+ expect(screen.queryAllByText('Account Details')).toBeTruthy()
208
+ expect(screen.getByText('Connected')).toBeInTheDocument()
209
+ expect(screen.queryByText('Tap to resolve')).toBeFalsy()
210
+ expect(screen.queryByRole('alert')).toBeFalsy()
211
+ })
212
+
213
+ it('3rd account', async () => {
214
+ expect(screen.queryByText('Account Details')).toBeFalsy()
215
+
216
+ // find first account button and click it
217
+ const account3 = docBody.queryAllByRole('listitem')[2].firstChild
218
+ await act(() => userEvent.click(account3))
219
+
220
+ const accountDetailsTab = docBody.queryAllByRole('tab')[1]
221
+ await act(() => userEvent.click(accountDetailsTab))
222
+
223
+ expect(screen.queryAllByText('Account Details')).toBeTruthy()
224
+ expect(screen.getByText('Connected')).toBeInTheDocument()
225
+ expect(screen.queryByText('Tap to resolve')).toBeFalsy()
226
+ expect(screen.queryByRole('alert')).toBeFalsy()
227
+ expect(screen.getByText(members[2].institution_url)).toBeInTheDocument()
228
+ })
229
+
230
+ it('4th account', async () => {
231
+ expect(screen.queryByText('Account Details')).toBeFalsy()
232
+
233
+ // find first account button and click it
234
+ const account4 = docBody.queryAllByRole('listitem')[3].firstChild
235
+ await act(() => userEvent.click(account4))
236
+
237
+ const accountDetailsTab = docBody.queryAllByRole('tab')[1]
238
+ await act(() => userEvent.click(accountDetailsTab))
239
+
240
+ expect(screen.queryAllByText('Account Details')).toBeTruthy()
241
+ expect(screen.getByText('Connected')).toBeInTheDocument()
242
+ expect(screen.queryByText('Tap to resolve')).toBeFalsy()
243
+ expect(screen.queryByRole('alert')).toBeFalsy()
244
+ expect(screen.getByText(members[0].institution_url)).toBeInTheDocument()
245
+ })
246
+
247
+ it('5th account', async () => {
248
+ expect(screen.queryByText('Account Details')).toBeFalsy()
249
+
250
+ // find first account button and click it
251
+ const account5 = docBody.queryAllByRole('listitem')[4].firstChild
252
+ await act(() => userEvent.click(account5))
253
+
254
+ const accountDetailsTab = docBody.queryAllByRole('tab')[1]
255
+ await act(() => userEvent.click(accountDetailsTab))
256
+
257
+ expect(screen.queryAllByText('Account Details')).toBeTruthy()
258
+ expect(screen.getByText('Connected')).toBeInTheDocument()
259
+ expect(screen.queryByText('Tap to resolve')).toBeFalsy()
260
+ expect(screen.queryByRole('alert')).toBeFalsy()
261
+ expect(screen.getByText(members[4].institution_url)).toBeInTheDocument()
262
+ })
263
+
264
+ it('6th account', async () => {
265
+ expect(screen.queryByText('Account Details')).toBeFalsy()
266
+
267
+ // find first account button and click it
268
+ const account6 = docBody.queryAllByRole('listitem')[5].firstChild
269
+ await act(() => userEvent.click(account6))
270
+
271
+ const accountDetailsTab = docBody.queryAllByRole('tab')[1]
272
+ await act(() => userEvent.click(accountDetailsTab))
273
+
274
+ expect(screen.queryAllByText('Account Details')).toBeTruthy()
275
+ expect(screen.getByText('Challenged')).toBeInTheDocument()
276
+ expect(screen.getByRole('alert')).toBeInTheDocument()
277
+ expect(screen.getByText(members[1].institution_url)).toBeInTheDocument()
278
+ })
279
+
280
+ it('7th account', async () => {
281
+ expect(screen.queryByText('Account Details')).toBeFalsy()
282
+
283
+ // find first account button and click it
284
+ const account7 = docBody.queryAllByRole('listitem')[6].firstChild
285
+ await act(() => userEvent.click(account7))
286
+
287
+ const accountDetailsTab = docBody.queryAllByRole('tab')[1]
288
+ await act(() => userEvent.click(accountDetailsTab))
289
+
290
+ expect(screen.queryAllByText('Account Details')).toBeTruthy()
291
+ expect(screen.getByText('Connected')).toBeInTheDocument()
292
+ expect(screen.queryByText('Tap to resolve')).toBeFalsy()
293
+ expect(screen.queryByRole('alert')).toBeFalsy()
294
+ expect(screen.getByText(members[2].institution_url)).toBeInTheDocument()
295
+ })
296
+
297
+ it('8th account', async () => {
298
+ expect(screen.queryByText('Account Details')).toBeFalsy()
299
+
300
+ // find first account button and click it
301
+ const account8 = docBody.queryAllByRole('listitem')[5].firstChild
302
+ await act(() => userEvent.click(account8))
303
+
304
+ expect(screen.queryAllByText('Account Details')).toBeTruthy()
305
+ expect(screen.getByText('Challenged')).toBeInTheDocument()
306
+ expect(screen.getByRole('alert')).toBeInTheDocument()
307
+ expect(screen.getByText(members[1].institution_url)).toBeInTheDocument()
308
+ })
309
+
310
+ it('9th account', async () => {
311
+ expect(screen.queryByText('Account Details')).toBeFalsy()
312
+
313
+ // find first account button and click it
314
+ const account9 = docBody.queryAllByRole('listitem')[8].firstChild
315
+ await act(() => userEvent.click(account9))
316
+
317
+ const accountDetailsTab = docBody.queryAllByRole('tab')[1]
318
+ await act(() => userEvent.click(accountDetailsTab))
319
+
320
+ expect(screen.queryAllByText('Account Details')).toBeTruthy()
321
+ expect(screen.getByText('Credentials expired')).toBeInTheDocument()
322
+ expect(screen.queryAllByText('Tap to resolve')).toBeTruthy()
323
+ expect(screen.queryByRole('alert')).toBeTruthy()
324
+ expect(screen.getByText(members[5].institution_url)).toBeInTheDocument()
325
+ })
326
+
327
+ it('10th account', async () => {
328
+ expect(screen.queryByText('Account Details')).toBeFalsy()
329
+
330
+ // find first account button and click it
331
+ const account10 = docBody.queryAllByRole('listitem')[9].firstChild
332
+ await act(() => userEvent.click(account10))
333
+
334
+ const accountDetailsTab = docBody.queryAllByRole('tab')[1]
335
+ await act(() => userEvent.click(accountDetailsTab))
336
+
337
+ expect(screen.queryAllByText('Account Details')).toBeTruthy()
338
+ expect(screen.getByText('Connected')).toBeInTheDocument()
339
+ expect(screen.queryByText('Tap to resolve')).toBeFalsy()
340
+ expect(screen.queryByRole('alert')).toBeFalsy()
341
+ expect(screen.getByText(members[8].institution_url)).toBeInTheDocument()
342
+ })
343
+
344
+ it('11th account', async () => {
345
+ expect(screen.queryByText('Account Details')).toBeFalsy()
346
+
347
+ // find first account button and click it
348
+ const account11 = docBody.queryAllByRole('listitem')[10].firstChild
349
+ await act(() => userEvent.click(account11))
350
+
351
+ const accountDetailsTab = docBody.queryAllByRole('tab')[1]
352
+ await act(() => userEvent.click(accountDetailsTab))
353
+
354
+ expect(screen.queryAllByText('Account Details')).toBeTruthy()
355
+ expect(screen.getByText('Incorrect information')).toBeInTheDocument()
356
+ expect(screen.queryAllByText('Tap to resolve')).toBeTruthy()
357
+ expect(screen.queryByRole('alert')).toBeTruthy()
358
+ expect(screen.getByText(members[3].institution_url)).toBeInTheDocument()
359
+ })
360
+ })
361
+ describe('account actions', () => {
362
+ it('1st account', async () => {
363
+ const account1 = docBody.queryAllByRole('listitem')[0].firstChild
364
+ await act(() => userEvent.click(account1))
365
+
366
+ const hideAccountButton = screen.queryAllByRole('button')[3]
367
+ const markAsClosedButton = screen.queryAllByRole('button')[4]
368
+
369
+ // Hide/unhide account
370
+ await act(() => userEvent.click(hideAccountButton))
371
+ expect(screen.getByText('Unhide Account')).toBeInTheDocument()
372
+
373
+ await act(() => userEvent.click(hideAccountButton))
374
+ expect(screen.getByText('Hide Account')).toBeInTheDocument()
375
+
376
+ // Close/open account
377
+ await act(() => userEvent.click(markAsClosedButton))
378
+ expect(screen.getByText('Mark as Closed')).toBeInTheDocument()
379
+ expect(screen.getByText('Confirm Mark as Closed')).toBeInTheDocument()
380
+ // console.log('buttons', screen.queryAllByRole('button'));
381
+
382
+ const confirmButton = screen.queryAllByRole('button')[2]
383
+ await act(() => userEvent.click(confirmButton))
384
+
385
+ // await userEvent.click(markAsClosedButton)
386
+ expect(screen.getByText('Mark as Open')).toBeInTheDocument()
387
+ expect(screen.queryByText('Confirm Mark as Closed')).not.toBeInTheDocument()
388
+
389
+ // Duplicate/merge account
390
+ expect(screen.queryByText('Mark as Duplicate')).not.toBeInTheDocument()
391
+ })
392
+ it('2nd account', async () => {
393
+ const account2 = docBody.queryAllByRole('listitem')[1].firstChild
394
+ await act(() => userEvent.click(account2))
395
+
396
+ const accountDetailsTab = docBody.queryAllByRole('tab')[1]
397
+ await act(() => userEvent.click(accountDetailsTab))
398
+
399
+ const hideAccountButton = screen.queryAllByRole('button')[5]
400
+ const markAsClosedButton = screen.queryAllByRole('button')[6]
401
+
402
+ // Hide/unhide account
403
+ await userEvent.click(hideAccountButton)
404
+
405
+ // Close/open account
406
+ await act(() => userEvent.click(markAsClosedButton))
407
+ expect(screen.getByText('Mark as Closed')).toBeInTheDocument()
408
+ expect(screen.getByText('Confirm Mark as Closed')).toBeInTheDocument()
409
+
410
+ const confirmButton = screen.queryAllByRole('button')[2]
411
+ await act(() => userEvent.click(confirmButton))
412
+
413
+ // await userEvent.click(markAsClosedButton)
414
+ expect(screen.getByText('Mark as Open')).toBeInTheDocument()
415
+ expect(screen.queryByText('Confirm Mark as Closed')).not.toBeInTheDocument()
416
+
417
+ // Duplicate/merge account
418
+ expect(screen.queryByText('Mark as Duplicate')).not.toBeInTheDocument()
419
+ })
420
+ it('3rd account', async () => {
421
+ const account3 = docBody.queryAllByRole('listitem')[2].firstChild
422
+ await act(() => userEvent.click(account3))
423
+
424
+ const accountDetailsTab = docBody.queryAllByRole('tab')[1]
425
+ await act(() => userEvent.click(accountDetailsTab))
426
+
427
+ const hideAccountButton = screen.queryAllByRole('button')[1]
428
+ const markAsClosedButton = screen.queryAllByRole('button')[2]
429
+ const markAsDuplicateButton = screen.queryAllByRole('button')[3]
430
+
431
+ // Hide/unhide account
432
+ await act(() => userEvent.click(hideAccountButton))
433
+ expect(screen.getByText('Unhide Account')).toBeInTheDocument()
434
+
435
+ await act(() => userEvent.click(hideAccountButton))
436
+
437
+ expect(screen.getByText('Hide Account')).toBeInTheDocument()
438
+
439
+ // Close/open account
440
+ await act(() => userEvent.click(markAsClosedButton))
441
+ expect(screen.getByText('Mark as Closed')).toBeInTheDocument()
442
+ expect(screen.getByText('Confirm Mark as Closed')).toBeInTheDocument()
443
+
444
+ const confirmButton = screen.queryAllByRole('button')[2]
445
+ await act(() => userEvent.click(confirmButton))
446
+
447
+ // await userEvent.click(markAsClosedButton)
448
+ expect(screen.getByText('Mark as Open')).toBeInTheDocument()
449
+ expect(screen.queryByText('Confirm Mark as Closed')).not.toBeInTheDocument()
450
+
451
+ // Duplicate/merge account
452
+ await act(() => userEvent.click(markAsDuplicateButton))
453
+ await act(() => userEvent.click(screen.queryAllByRole('button')[1]))
454
+ expect(screen.queryByText('Confirm merge')).toBeInTheDocument()
455
+ })
456
+ it('4th account', async () => {
457
+ const account4 = docBody.queryAllByRole('listitem')[3].firstChild
458
+ await act(() => userEvent.click(account4))
459
+
460
+ const accountDetailsTab = docBody.queryAllByRole('tab')[1]
461
+ await act(() => userEvent.click(accountDetailsTab))
462
+
463
+ const hideAccountButton = screen.queryAllByRole('button')[1]
464
+ const markAsClosedButton = screen.queryAllByRole('button')[2]
465
+
466
+ // Hide/unhide account
467
+ await act(() => userEvent.click(hideAccountButton))
468
+ expect(screen.getByText('Unhide Account')).toBeInTheDocument()
469
+
470
+ await act(() => userEvent.click(hideAccountButton))
471
+
472
+ expect(screen.getByText('Hide Account')).toBeInTheDocument()
473
+
474
+ // Close/open account
475
+ await act(() => userEvent.click(markAsClosedButton))
476
+ expect(screen.getByText('Mark as Closed')).toBeInTheDocument()
477
+ expect(screen.getByText('Confirm Mark as Closed')).toBeInTheDocument()
478
+
479
+ const confirmButton = screen.queryAllByRole('button')[2]
480
+ await act(() => userEvent.click(confirmButton))
481
+
482
+ // await userEvent.click(markAsClosedButton)
483
+ expect(screen.getByText('Mark as Open')).toBeInTheDocument()
484
+ expect(screen.queryByText('Confirm Mark as Closed')).not.toBeInTheDocument()
485
+
486
+ // Duplicate/merge account
487
+ expect(screen.queryByText('Mark as Duplicate')).not.toBeInTheDocument()
488
+ })
489
+ it('5th account', async () => {
490
+ const account5 = docBody.queryAllByRole('listitem')[4].firstChild
491
+ await act(() => userEvent.click(account5))
492
+
493
+ const accountDetailsTab = docBody.queryAllByRole('tab')[1]
494
+ await act(() => userEvent.click(accountDetailsTab))
495
+
496
+ const hideAccountButton = screen.queryAllByRole('button')[3]
497
+ const markAsClosedButton = screen.queryAllByRole('button')[4]
498
+
499
+ // Hide/unhide account
500
+ await act(() => userEvent.click(hideAccountButton))
501
+ expect(screen.getByText('Unhide Account')).toBeInTheDocument()
502
+
503
+ await act(() => userEvent.click(hideAccountButton))
504
+
505
+ expect(screen.getByText('Hide Account')).toBeInTheDocument()
506
+
507
+ // Close/open account
508
+ await act(() => userEvent.click(markAsClosedButton))
509
+ expect(screen.getByText('Mark as Closed')).toBeInTheDocument()
510
+ expect(screen.getByText('Confirm Mark as Closed')).toBeInTheDocument()
511
+
512
+ const confirmButton = screen.queryAllByRole('button')[2]
513
+ await act(() => userEvent.click(confirmButton))
514
+
515
+ // await userEvent.click(markAsClosedButton)
516
+ expect(screen.getByText('Mark as Open')).toBeInTheDocument()
517
+ expect(screen.queryByText('Confirm Mark as Closed')).not.toBeInTheDocument()
518
+
519
+ // Duplicate/merge account
520
+ expect(screen.queryByText('Mark as Duplicate')).not.toBeInTheDocument()
521
+ })
522
+ it('6th account', async () => {
523
+ const account6 = docBody.queryAllByRole('listitem')[5].firstChild
524
+ await act(() => userEvent.click(account6))
525
+
526
+ const accountDetailsTab = docBody.queryAllByRole('tab')[1]
527
+ await act(() => userEvent.click(accountDetailsTab))
528
+
529
+ const hideAccountButton = screen.queryAllByRole('button')[4]
530
+ const markAsClosedButton = screen.queryAllByRole('button')[5]
531
+ const markAsDuplicateButton = screen.queryAllByRole('button')[6]
532
+
533
+ // Hide/unhide account
534
+ await act(() => userEvent.click(hideAccountButton))
535
+ // docBody.debug(undefined, Infinity)
536
+ expect(screen.getByText('Unhide Account')).toBeInTheDocument()
537
+
538
+ await act(() => userEvent.click(hideAccountButton))
539
+
540
+ expect(screen.getByText('Hide Account')).toBeInTheDocument()
541
+
542
+ // Close/open account
543
+ await act(() => userEvent.click(markAsClosedButton))
544
+ expect(screen.getByText('Mark as Closed')).toBeInTheDocument()
545
+ expect(screen.getByText('Confirm Mark as Closed')).toBeInTheDocument()
546
+
547
+ const confirmButton = screen.queryAllByRole('button')[2]
548
+ await act(() => userEvent.click(confirmButton))
549
+
550
+ // await userEvent.click(markAsClosedButton)
551
+ expect(screen.getByText('Mark as Open')).toBeInTheDocument()
552
+ expect(screen.queryByText('Confirm Mark as Closed')).not.toBeInTheDocument()
553
+
554
+ // Duplicate/merge account
555
+ await act(() => userEvent.click(markAsDuplicateButton))
556
+ await act(() => userEvent.click(screen.queryAllByRole('button')[1]))
557
+ expect(screen.queryByText('Confirm merge')).toBeInTheDocument()
558
+ })
559
+ })
560
+ })
561
+ })
@@ -0,0 +1,74 @@
1
+ import Fetch from '../../common/utils/Fetch'
2
+
3
+ import { ApiEndpoints } from '../../common/constants'
4
+ import type { Account } from '../../common'
5
+
6
+ export class AccountApi {
7
+ fetchInstance: Fetch
8
+
9
+ constructor(endpoint: string, token: string) {
10
+ this.fetchInstance = new Fetch(endpoint, token)
11
+ }
12
+
13
+ createAccount = async (account: Account) => {
14
+ return this.fetchInstance
15
+ .post(ApiEndpoints.ACCOUNTS, account)
16
+ .then((data) => data.account)
17
+ .catch((error) => error)
18
+ }
19
+
20
+ deleteAccount = async (accountGuid: string) => {
21
+ return this.fetchInstance
22
+ .delete(`${ApiEndpoints.ACCOUNTS}/${accountGuid}`)
23
+ .catch((error) => error)
24
+ }
25
+
26
+ getAccounts = async () => {
27
+ return this.fetchInstance
28
+ .get(ApiEndpoints.ACCOUNTS)
29
+ .then((data) => data.accounts)
30
+ .catch((error) => error)
31
+ }
32
+
33
+ getInstitutions = async () => {
34
+ return this.fetchInstance
35
+ .get(ApiEndpoints.INSTITUTIONS)
36
+ .then((data) => data)
37
+ .catch((error) => error)
38
+ }
39
+
40
+ getMembers = async () => {
41
+ return this.fetchInstance
42
+ .get(ApiEndpoints.MEMBERS)
43
+ .then((data) => data.members)
44
+ .catch((error) => error)
45
+ }
46
+
47
+ getMonthlyAccountBalances = async (guid: string) => {
48
+ return this.fetchInstance
49
+ .get(`${ApiEndpoints.ACCOUNTS}/${guid}/monthly_account_balances`)
50
+ .then((data) => data.monthly_account_balances)
51
+ .catch((error) => error)
52
+ }
53
+
54
+ mergeAccounts = async (accountGuids: string[]) => {
55
+ return this.fetchInstance
56
+ .put(`${ApiEndpoints.ACCOUNTS}/merge`, { accounts: accountGuids })
57
+ .then((data) => data)
58
+ .catch((error) => error)
59
+ }
60
+
61
+ refreshAllMembers = async () => {
62
+ return this.fetchInstance
63
+ .get(`${ApiEndpoints.MEMBERS}/refresh_all`)
64
+ .then((data) => data)
65
+ .catch((error) => error)
66
+ }
67
+
68
+ updateAccount = async (account: Account) => {
69
+ return this.fetchInstance
70
+ .put(`${ApiEndpoints.ACCOUNTS}/${account.guid}`, account)
71
+ .then((data) => data.account)
72
+ .catch((error) => error)
73
+ }
74
+ }
@@ -0,0 +1,46 @@
1
+ import accounts from '../../../../mock/Accounts'
2
+ import institutions from '../../../../mock/data/Institutions.json'
3
+ import members from '../../../../mock/data/Members.json'
4
+ import balances from '../../../../mock/data/MonthlyAccountBalances.json'
5
+
6
+ export class AccountApi {
7
+ createAccount(account) {
8
+ return account
9
+ }
10
+
11
+ deleteAccount() {
12
+ return null
13
+ }
14
+
15
+ getAccounts() {
16
+ return accounts
17
+ }
18
+
19
+ getInstitutions() {
20
+ return institutions
21
+ }
22
+
23
+ getMembers() {
24
+ return members
25
+ }
26
+
27
+ getMonthlyAccountBalances() {
28
+ return balances
29
+ }
30
+
31
+ mergeAccounts(accountGuids: string[]) {
32
+ const firstAccount = accounts.findIndex((account) => account.guid === accountGuids[0])
33
+ return accounts[firstAccount]
34
+ }
35
+
36
+ refreshAllMembers() {
37
+ return null
38
+ }
39
+
40
+ updateAccount(account) {
41
+ return {
42
+ ...account,
43
+ name: account.user_name,
44
+ }
45
+ }
46
+ }