@mx-cartographer/experiences 9.1.3 → 9.1.4-alpha.al1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +0 -6
- package/dist/{AccountDetailsDrawer-Cq4kiiKD.mjs → AccountDetailsDrawer-Da1-Y86z.mjs} +10 -10
- package/dist/{AccountDetailsDrawer-Cq4kiiKD.mjs.map → AccountDetailsDrawer-Da1-Y86z.mjs.map} +1 -1
- package/dist/{AccountDetailsHeader-BliEZhz7.mjs → AccountDetailsHeader-CE0HYbRA.mjs} +4 -4
- package/dist/{AccountDetailsHeader-BliEZhz7.mjs.map → AccountDetailsHeader-CE0HYbRA.mjs.map} +1 -1
- package/dist/{Analytics-CkYXKvco.mjs → Analytics-BJDUP2qI.mjs} +2 -2
- package/dist/{Analytics-CkYXKvco.mjs.map → Analytics-BJDUP2qI.mjs.map} +1 -1
- package/dist/{CategorySelectorDrawer-NJsFsKP1.mjs → CategorySelectorDrawer-BM5mKt7P.mjs} +2 -2
- package/dist/{CategorySelectorDrawer-NJsFsKP1.mjs.map → CategorySelectorDrawer-BM5mKt7P.mjs.map} +1 -1
- package/dist/{Connect-BH0Pt6zc.mjs → Connect-JoOkCXSZ.mjs} +2 -2
- package/dist/{Connect-BH0Pt6zc.mjs.map → Connect-JoOkCXSZ.mjs.map} +1 -1
- package/dist/{ConnectCard-D7uxoH5Y.mjs → ConnectCard-DnZHCv3m.mjs} +2 -2
- package/dist/{ConnectCard-D7uxoH5Y.mjs.map → ConnectCard-DnZHCv3m.mjs.map} +1 -1
- package/dist/{ConnectDrawer-CW4LA3H3.mjs → ConnectDrawer-Btol_U7o.mjs} +3 -3
- package/dist/{ConnectDrawer-CW4LA3H3.mjs.map → ConnectDrawer-Btol_U7o.mjs.map} +1 -1
- package/dist/{ConnectionsDrawer-CZU9ku-k.mjs → ConnectionsDrawer-DGv6aJ6x.mjs} +3 -3
- package/dist/{ConnectionsDrawer-CZU9ku-k.mjs.map → ConnectionsDrawer-DGv6aJ6x.mjs.map} +1 -1
- package/dist/{CurrencyInput-DaGEQaLW.mjs → CurrencyInput-CxAsTGg2.mjs} +2 -2
- package/dist/{CurrencyInput-DaGEQaLW.mjs.map → CurrencyInput-CxAsTGg2.mjs.map} +1 -1
- package/dist/{EmbeddedCard-DCOQnTz-.mjs → EmbeddedCard-Dwj1CkBK.mjs} +3 -3
- package/dist/{EmbeddedCard-DCOQnTz-.mjs.map → EmbeddedCard-Dwj1CkBK.mjs.map} +1 -1
- package/dist/{Error-Dtw6yxkf.mjs → Error-BMVsnvtd.mjs} +2 -2
- package/dist/{Error-Dtw6yxkf.mjs.map → Error-BMVsnvtd.mjs.map} +1 -1
- package/dist/ErrorBoundary-C7BlHx04.mjs +27 -0
- package/dist/ErrorBoundary-C7BlHx04.mjs.map +1 -0
- package/dist/{ExportCsvAction-C-IisDcv.mjs → ExportCsvAction-B23U4xj8.mjs} +3 -3
- package/dist/{ExportCsvAction-C-IisDcv.mjs.map → ExportCsvAction-B23U4xj8.mjs.map} +1 -1
- package/dist/{GlobalAccountFilter-BhzR5Vb1.mjs → GlobalAccountFilter-1NlROwU8.mjs} +2 -2
- package/dist/{GlobalAccountFilter-BhzR5Vb1.mjs.map → GlobalAccountFilter-1NlROwU8.mjs.map} +1 -1
- package/dist/GlobalCopyApi-Tz10hezK.mjs +130 -0
- package/dist/GlobalCopyApi-Tz10hezK.mjs.map +1 -0
- package/dist/{Help-zVZdcmlk.mjs → Help-BC5OU0yX.mjs} +145 -145
- package/dist/Help-BC5OU0yX.mjs.map +1 -0
- package/dist/{LineChart-CUfiH86G.mjs → LineChart-YCIQN3ho.mjs} +2 -2
- package/dist/{LineChart-CUfiH86G.mjs.map → LineChart-YCIQN3ho.mjs.map} +1 -1
- package/dist/{ListItemAction-BqUCLj_w.mjs → ListItemAction-D-XYTjj4.mjs} +2 -2
- package/dist/{ListItemAction-BqUCLj_w.mjs.map → ListItemAction-D-XYTjj4.mjs.map} +1 -1
- package/dist/{ListItemWrapper-DRse79Iu.mjs → ListItemWrapper-XiustNlS.mjs} +2 -2
- package/dist/{ListItemWrapper-DRse79Iu.mjs.map → ListItemWrapper-XiustNlS.mjs.map} +1 -1
- package/dist/{ManageIncome-B_8i71mE.mjs → ManageIncome-CWr2Eij2.mjs} +32 -32
- package/dist/{ManageIncome-B_8i71mE.mjs.map → ManageIncome-CWr2Eij2.mjs.map} +1 -1
- package/dist/{MicroWidgetContainer-B2NnKBgW.mjs → MicroWidgetContainer-u1hE4nVI.mjs} +2 -2
- package/dist/{MicroWidgetContainer-B2NnKBgW.mjs.map → MicroWidgetContainer-u1hE4nVI.mjs.map} +1 -1
- package/dist/{MiniWidgetContainer-Bmv_WeUd.mjs → MiniWidgetContainer-DFUhI7Ok.mjs} +2 -2
- package/dist/{MiniWidgetContainer-Bmv_WeUd.mjs.map → MiniWidgetContainer-DFUhI7Ok.mjs.map} +1 -1
- package/dist/{NotificationSettings-CW7okUrk.mjs → NotificationSettings-1OxkZpn7.mjs} +33 -33
- package/dist/{NotificationSettings-CW7okUrk.mjs.map → NotificationSettings-1OxkZpn7.mjs.map} +1 -1
- package/dist/{OriginalBalanceAction-YrvxBYAl.mjs → OriginalBalanceAction-BmuKAlKl.mjs} +4 -4
- package/dist/{OriginalBalanceAction-YrvxBYAl.mjs.map → OriginalBalanceAction-BmuKAlKl.mjs.map} +1 -1
- package/dist/{RecurringSettings-hs0YUp83.mjs → RecurringSettings-CMspUOGC.mjs} +3 -3
- package/dist/{RecurringSettings-hs0YUp83.mjs.map → RecurringSettings-CMspUOGC.mjs.map} +1 -1
- package/dist/{SpendingLegend-CxvNOg3c.mjs → SpendingLegend-CqLSaAYE.mjs} +2 -2
- package/dist/{SpendingLegend-CxvNOg3c.mjs.map → SpendingLegend-CqLSaAYE.mjs.map} +1 -1
- package/dist/{TransactionDetails-DT-MQqOB.mjs → TransactionDetails-DsWYPMCj.mjs} +5 -5
- package/dist/{TransactionDetails-DT-MQqOB.mjs.map → TransactionDetails-DsWYPMCj.mjs.map} +1 -1
- package/dist/{UserStore-E5WvBXaY.mjs → UserStore-CL_kIDzt.mjs} +367 -317
- package/dist/UserStore-CL_kIDzt.mjs.map +1 -0
- package/dist/{ViewMoreMicroCard-fnwE0hqd.mjs → ViewMoreMicroCard-CJckyYda.mjs} +4 -4
- package/dist/{ViewMoreMicroCard-fnwE0hqd.mjs.map → ViewMoreMicroCard-CJckyYda.mjs.map} +1 -1
- package/dist/{WidgetContainer-CjdCY4sj.mjs → WidgetContainer-C4PFkL6g.mjs} +3 -3
- package/dist/{WidgetContainer-CjdCY4sj.mjs.map → WidgetContainer-C4PFkL6g.mjs.map} +1 -1
- package/dist/accounts/index.es.js +11 -11
- package/dist/analytics/index.es.js +2 -2
- package/dist/budgets/index.es.js +10 -10
- package/dist/cashflow/index.es.js +70 -70
- package/dist/categories/index.es.js +1 -1
- package/dist/common/components/ErrorBoundary.d.ts +2 -0
- package/dist/common/components/ErrorTestButtons.d.ts +3 -0
- package/dist/common/components/index.d.ts +1 -0
- package/dist/common/context/GlobalDataProvider.d.ts +2 -1
- package/dist/common/context/hooks.d.ts +3 -0
- package/dist/common/context/index.d.ts +1 -1
- package/dist/common/index.es.js +252 -224
- package/dist/common/index.es.js.map +1 -1
- package/dist/core/api/AccountApi.d.ts +2 -2
- package/dist/core/api/AnalyticsApi.d.ts +2 -2
- package/dist/core/api/AppDataApi.d.ts +2 -2
- package/dist/core/api/BeatApi.d.ts +2 -2
- package/dist/core/api/BudgetsApi.d.ts +2 -2
- package/dist/core/api/CategoryApi.d.ts +2 -2
- package/dist/core/api/FinstrongApi.d.ts +2 -2
- package/dist/core/api/GlobalCopyApi.d.ts +2 -2
- package/dist/core/api/GoalApi.d.ts +2 -2
- package/dist/core/api/HelpApi.d.ts +2 -2
- package/dist/core/api/HoldingApi.d.ts +2 -2
- package/dist/core/api/MerchantApi.d.ts +2 -2
- package/dist/core/api/NotificationApi.d.ts +2 -2
- package/dist/core/api/RepeatingTransactionsApi.d.ts +2 -2
- package/dist/core/api/ScheduledPaymentsApi.d.ts +2 -2
- package/dist/core/api/SettingsApi.d.ts +2 -2
- package/dist/core/api/TransactionApi.d.ts +2 -2
- package/dist/core/api/UserApi.d.ts +2 -2
- package/dist/core/index.es.js +95 -95
- package/dist/core/index.es.js.map +1 -1
- package/dist/core/stores/GlobalStore.d.ts +4 -2
- package/dist/core/types/Handlers.d.ts +1 -0
- package/dist/core/types/index.d.ts +1 -1
- package/dist/core/utils/Fetch.d.ts +3 -2
- package/dist/dashboard/index.es.js +4 -4
- package/dist/debts/index.es.js +8 -8
- package/dist/finstrong/index.es.js +12 -12
- package/dist/goals/index.es.js +9 -9
- package/dist/help/index.es.js +4 -4
- package/dist/hooks-Chcgk3F2.mjs +83 -0
- package/dist/hooks-Chcgk3F2.mjs.map +1 -0
- package/dist/insights/index.es.js +4 -4
- package/dist/investments/index.es.js +4 -4
- package/dist/merchants/index.es.js +1 -1
- package/dist/microinsights/index.es.js +1 -1
- package/dist/networth/index.es.js +6 -6
- package/dist/notifications/index.es.js +8 -8
- package/dist/recurringtransactions/index.es.js +38 -38
- package/dist/settings/index.es.js +27 -27
- package/dist/spending/index.es.js +7 -7
- package/dist/transactions/index.es.js +11 -11
- package/dist/trends/index.es.js +12 -12
- package/dist/{useAccountDisplayName-BsiXA0qf.mjs → useAccountDisplayName-BC5i7pMh.mjs} +2 -2
- package/dist/{useAccountDisplayName-BsiXA0qf.mjs.map → useAccountDisplayName-BC5i7pMh.mjs.map} +1 -1
- package/dist/{useInsightsEnabled-D5Sdm0TJ.mjs → useInsightsEnabled-BpBk6YYj.mjs} +2 -2
- package/dist/{useInsightsEnabled-D5Sdm0TJ.mjs.map → useInsightsEnabled-BpBk6YYj.mjs.map} +1 -1
- package/dist/{useWidgetLoadTimer-B0tB-yzL.mjs → useWidgetLoadTimer-D0bW29qj.mjs} +2 -2
- package/dist/{useWidgetLoadTimer-B0tB-yzL.mjs.map → useWidgetLoadTimer-D0bW29qj.mjs.map} +1 -1
- package/package.json +1 -1
- package/dist/ErrorBoundary-CsdOcnJ9.mjs +0 -24
- package/dist/ErrorBoundary-CsdOcnJ9.mjs.map +0 -1
- package/dist/GlobalCopyApi-wcnDUzMV.mjs +0 -129
- package/dist/GlobalCopyApi-wcnDUzMV.mjs.map +0 -1
- package/dist/Help-zVZdcmlk.mjs.map +0 -1
- package/dist/UserStore-E5WvBXaY.mjs.map +0 -1
- package/dist/hooks-97sNJ_lf.mjs +0 -78
- package/dist/hooks-97sNJ_lf.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UserStore-E5WvBXaY.mjs","sources":["../src/core/api/AccountApi.ts","../src/core/api/AppDataApi.ts","../src/core/api/BannerApi.ts","../src/core/api/BudgetsApi.ts","../src/core/api/CategoryApi.ts","../src/core/api/FinstrongApi.ts","../src/core/api/GoalApi.ts","../src/core/api/HelpApi.ts","../src/core/api/HoldingApi.ts","../src/core/api/MerchantApi.ts","../src/core/api/NotificationApi.ts","../src/core/api/RepeatingTransactionsApi.ts","../src/core/api/SettingsApi.ts","../src/core/api/TransactionApi.ts","../src/core/api/UserApi.ts","../src/core/api/WidgetApi.ts","../src/core/stores/AccountStore.ts","../src/core/stores/AppDataStore.ts","../src/core/stores/AnalyticsStore.ts","../src/core/utils/BeatUtils.ts","../src/core/stores/BeatStore.ts","../src/core/stores/BudgetsStore.ts","../src/core/stores/CashflowStore.ts","../src/core/stores/CategoryStore.ts","../src/core/stores/ConnectStore.ts","../src/core/stores/DebtsStore.ts","../src/core/utils/FinstrongUtils.ts","../src/core/stores/FinstrongStore.ts","../src/core/constants/DefaultConfig.ts","../src/core/stores/GlobalStore.ts","../src/core/stores/GlobalUiStore.ts","../src/core/stores/GlobalCopyStore.ts","../src/core/stores/GoalStore.ts","../src/core/utils/HelpUtil.ts","../src/core/stores/HelpStore.ts","../src/core/stores/HoldingStore.ts","../src/core/stores/MerchantStore.ts","../src/core/stores/NetWorthStore.ts","../src/core/stores/NotificationStore.ts","../src/core/stores/RecurringTransactionsStore.ts","../src/core/utils/SettingsUtil.ts","../src/core/stores/SettingsStore.ts","../src/core/stores/TransactionStore.ts","../src/core/stores/TrendsStore.ts","../src/core/stores/UserStore.ts"],"sourcesContent":["import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport type { Account, GlobalErrorHandler } from '..'\n\nexport class AccountApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n createAccount = async (account: Account) => {\n return this.fetchInstance\n .post(ApiEndpoints.ACCOUNTS, account)\n .then((data) => data.account)\n .catch((error) => error)\n }\n\n deleteAccount = async (accountGuid: string) => {\n return this.fetchInstance\n .delete(`${ApiEndpoints.ACCOUNTS}/${accountGuid}`)\n .catch((error) => error)\n }\n\n getAccounts = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.ACCOUNTS)\n .then((data) => data.accounts)\n .catch((error) => error)\n }\n\n getInstitutions = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.INSTITUTIONS)\n .then((data) => data)\n .catch((error) => error)\n }\n\n getMembers = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.MEMBERS)\n .then((data) => data.members)\n .catch((error) => error)\n }\n\n getMonthlyAccountBalances = async (guid: string) => {\n return this.fetchInstance\n .get(`${ApiEndpoints.ACCOUNTS}/${guid}/monthly_account_balances`)\n .then((data) => data.monthly_account_balances)\n .catch((error) => error)\n }\n\n mergeAccounts = async (accountGuids: string[]) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.ACCOUNTS}/merge`, { accounts: accountGuids })\n .then((data) => data)\n .catch((error) => error)\n }\n\n refreshAllMembers = async () => {\n return this.fetchInstance\n .get(`${ApiEndpoints.MEMBERS}/refresh_all`)\n .then((data) => data)\n .catch((error) => error)\n }\n\n updateAccount = async (account: Account) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.ACCOUNTS}/${account.guid}`, account)\n .then((data) => data.account)\n .catch((error) => error)\n }\n}\n","import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport type { AppData, GlobalErrorHandler } from '..'\n\nexport class AppDataApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n getAppData = async () => {\n return this.fetchInstance.get(ApiEndpoints.APP_DATA).then((data): AppData => data)\n }\n}\n","import { Fetch } from '../utils'\n\nexport class BannerApi {\n fetchInstance: Fetch | null\n\n constructor(bullseyeEndpoint: string) {\n // Override headers without MD-Session-Token to avoid CORS error in bullseye\n this.fetchInstance = new Fetch(bullseyeEndpoint, '', {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n })\n }\n\n getBanner = async (userGuid: string) => {\n try {\n const path = `/banner/${userGuid}/account_widget_banner`\n return this.fetchInstance?.get(path).then((data) => data.banner) ?? {}\n } catch (error) {\n console.error('Error fetching banner:', error)\n return null\n }\n }\n}\n","import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport type { GlobalErrorHandler, Budget, Category } from '..'\n\nexport class BudgetsApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n addBudget = async (category: Category, amount: number, parentGuid: string | null = null) => {\n return this.fetchInstance\n .post(ApiEndpoints.BUDGETS, {\n amount,\n category_guid: category.guid,\n category_name: category.name,\n parent_guid: parentGuid,\n })\n .then((data) => data.budget)\n .catch((error) => {\n throw error\n })\n }\n\n deleteBudget = async (guid: string) => {\n return this.fetchInstance\n .delete(`${ApiEndpoints.BUDGETS}/${guid}`)\n .then((data) => data)\n .catch((error) => {\n throw error\n })\n }\n\n getBudgets = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.BUDGETS)\n .then((data) => data.budgets)\n .catch((error) => error)\n }\n\n updateBudget = async (budget: Budget) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.BUDGETS}/${budget.guid}`, budget)\n .then((data) => data.budget)\n .catch((error) => {\n throw error\n })\n }\n\n addMerchantBudget = async (merchantGuid: string, amount: number) => {\n return this.fetchInstance\n .post(ApiEndpoints.MERCHANT_BUDGETS, {\n amount,\n merchant_guid: merchantGuid,\n })\n .then((data) => data.merchant_budget)\n .catch((error) => {\n throw error\n })\n }\n\n updateMerchantBudget = async (merchantBudgetGuid: string, amount: number) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.MERCHANT_BUDGETS}/${merchantBudgetGuid}`, {\n amount,\n })\n .then((data) => data.merchant_budget)\n .catch((error) => {\n throw error\n })\n }\n\n deleteMerchantBudget = async (merchantBudgetGuid: string) => {\n return this.fetchInstance\n .delete(`${ApiEndpoints.MERCHANT_BUDGETS}/${merchantBudgetGuid}`)\n .then((data) => data)\n .catch((error) => {\n throw error\n })\n }\n}\n","import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport type { Account, Category, GlobalErrorHandler } from '..'\n\nexport class CategoryApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n addCategory = async (category: Category) => {\n return this.fetchInstance.post(ApiEndpoints.CATEGORIES, category).then((data) => data.category)\n }\n\n getCategories = async () => {\n return this.fetchInstance.get(ApiEndpoints.CATEGORIES).then((data) => data.categories)\n }\n\n getDateRangeCategoryTotals = async (startDate: number, endDate: number, accounts: Account[]) => {\n // If no accounts are selected, return an empty array\n if (accounts.length === 0) return []\n return this.fetchInstance\n .post(`${ApiEndpoints.DATE_RANGE_CATEGORY_TOTALS}/from/${startDate}/to/${endDate}`, {\n account_guid: accounts.map((account) => account.guid),\n })\n .then((data) => data.date_range_category_totals)\n }\n\n getMonthlyCategoryTotals = async (startDate: number, endDate: number, accounts?: Account[]) => {\n try {\n const url = `${ApiEndpoints.MONTHLY_CATEGORY_TOTALS}/from/${startDate}/to/${endDate}`\n if (accounts) {\n const accountGuids = accounts.length === 0 ? [''] : accounts.map((account) => account.guid)\n const response = await this.fetchInstance.post(url, { account_guid: accountGuids })\n return response.monthly_category_totals\n } else {\n const response = await this.fetchInstance.get(url)\n return response.monthly_category_totals\n }\n } catch (error) {\n console.error('Error fetching monthly category totals:', error)\n throw error // Re-throw the error for the caller to handle\n }\n }\n removeCategory = async (guid: string) => {\n return this.fetchInstance.delete(`${ApiEndpoints.CATEGORIES}/${guid}`)\n }\n\n updateCategory = async (category: Category) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.CATEGORIES}/${category.guid}`, category)\n .then((data) => data.category)\n }\n}\n","import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport type { GlobalErrorHandler } from '..'\n\nexport class FinstrongApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n calculateHealthScore = async () => {\n return this.fetchInstance\n .post(`${ApiEndpoints.HEALTH_SCORES}/calculate`)\n .then((data) => data.health_score)\n }\n\n getAverageHealthScores = async () => {\n return this.fetchInstance\n .get(`${ApiEndpoints.HEALTH_SCORES}/monthly_averages`)\n .then((data) => data)\n }\n\n getDebtSpend = async () => {\n return this.fetchInstance\n .get(`${ApiEndpoints.HEALTH_SCORES}/transactions/debt_spend`)\n .then((data) => data)\n }\n\n getIncome = async () => {\n return this.fetchInstance\n .get(`${ApiEndpoints.HEALTH_SCORES}/transactions/income`)\n .then((data) => data)\n }\n\n getMonthlySummaries = async () => {\n return this.fetchInstance\n .get(`${ApiEndpoints.HEALTH_SCORES}/monthly_summaries`)\n .then((data) => data)\n }\n\n getHealthScoreChangeReports = async (startDate: number, endDate: number) => {\n return this.fetchInstance\n .get(`${ApiEndpoints.HEALTH_SCORES}/change_report/from/${startDate}/to/${endDate}`)\n .then((data) => data)\n }\n\n getPeerScore = async (birthYear: string) => {\n return this.fetchInstance\n .get(`${ApiEndpoints.HEALTH_SCORES}/average/${birthYear}`)\n .then((data) => data)\n }\n\n getSpendingFeeTransactions = async () => {\n return this.fetchInstance\n .get(`${ApiEndpoints.HEALTH_SCORES}/transactions/spending_fee`)\n .then((data) => data)\n }\n\n getStandardSpend = async () => {\n return this.fetchInstance\n .get(`${ApiEndpoints.HEALTH_SCORES}/transactions/standard_spend`)\n .then((data) => data)\n }\n}\n","import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport { MonthlyCashFlowProfile, RetirementGoalAccount } from '..'\nimport type { GlobalErrorHandler, Goal } from '..'\n\nexport class GoalApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n addGoal = async (goal: Goal) => {\n return this.fetchInstance.post(ApiEndpoints.GOALS, goal).then((data) => data.goal)\n }\n\n addRetirementGoal = async (goal: Goal) => {\n return this.fetchInstance\n .post(ApiEndpoints.RETIREMENT_GOALS, goal)\n .then((data) => data.retirement_goal)\n }\n\n addRetirementGoalAccount = async (retirementAccount: RetirementGoalAccount) => {\n return this.fetchInstance\n .post(ApiEndpoints.RETIREMENT_GOAL_ACCOUNTS, retirementAccount)\n .then((data) => data.retirement_goal_account)\n }\n\n getGoalByGuid = async (guid: string) => {\n return this.fetchInstance.get(`${ApiEndpoints.GOALS}/${guid}`).then((data) => data.goal)\n }\n\n getGoals = async () => {\n return this.fetchInstance.get(ApiEndpoints.GOALS).then((data) => data.goals)\n }\n\n getMonthlyCashFlowProfile = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.MONTHLY_CASH_FLOW_PROFILE)\n .then((data) => data.monthly_cash_flow_profile)\n }\n\n getRetirementGoals = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.RETIREMENT_GOALS)\n .then((data) => data.retirement_goals)\n }\n\n getRetirementGoalAccounts = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.RETIREMENT_GOAL_ACCOUNTS)\n .then((data) => data.retirement_goal_accounts)\n }\n\n removeGoal = async (guid: string) => {\n return this.fetchInstance.delete(`${ApiEndpoints.GOALS}/${guid}`).then((data) => data)\n }\n\n removeRetirementGoal = async (guid: string) => {\n return this.fetchInstance\n .delete(`${ApiEndpoints.RETIREMENT_GOALS}/${guid}`)\n .then((data) => data)\n }\n\n removeRetirementGoalAccount = async (guid: string) => {\n return this.fetchInstance\n .delete(`${ApiEndpoints.RETIREMENT_GOAL_ACCOUNTS}/${guid}`)\n .then((data) => data)\n }\n\n reorderGoals = async (goals: Goal[]) => {\n return this.fetchInstance\n .post(`${ApiEndpoints.GOALS}/reposition`, { goals: goals })\n .then((data) => data.goals)\n }\n\n updateGoal = async (goal: Goal) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.GOALS}/${goal.guid}`, goal)\n .then((data) => data.goal)\n }\n\n updateMonthlyCashFlowProfile = async (profile: MonthlyCashFlowProfile) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.MONTHLY_CASH_FLOW_PROFILE}`, profile)\n .then((data) => data.monthly_cash_flow_profile)\n }\n\n updateRetirementGoal = async (goal: Goal) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.RETIREMENT_GOALS}/${goal.guid}`, goal)\n .then((data) => data.retirement_goal)\n }\n}\n","import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport type { GlobalErrorHandler, Ticket } from '..'\n\nexport class HelpApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n createSupportTicket = async (ticket: Ticket) => {\n return this.fetchInstance.post(ApiEndpoints.SUPPORT_TICKETS, ticket).then((data) => data)\n }\n}\n","import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport type { GlobalErrorHandler, Holding } from '..'\n\nexport class HoldingApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n getHoldings = async () => {\n return this.fetchInstance.get(ApiEndpoints.HOLDINGS).then((data) => data.holdings)\n }\n\n updateHoldings = async (holding: Holding) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.HOLDINGS}/${holding.guid}`, holding)\n .then((data) => data.holding)\n }\n}\n","import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport type { GlobalErrorHandler } from '..'\n\nexport class MerchantApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n getMerchants = async (\n searchValues = [] as string[],\n guids = [] as string[],\n page = 1,\n perPage = 25,\n ) => {\n let url = ApiEndpoints.MERCHANTS\n url += `?page=${page}&per_page=${perPage}`\n\n if (searchValues.length) {\n searchValues.forEach((value) => (url += `&fuzzy_name[]=${value}`))\n }\n\n if (guids.length) {\n guids.forEach((guid) => (url += `&guid[]=${guid}`))\n }\n\n return this.fetchInstance.get(url).then((data) => data.merchants)\n }\n\n getMerchantByGuid = async (guid: string) => {\n return this.fetchInstance.get(`${ApiEndpoints.MERCHANTS}/${guid}`).then((data) => data.merchant)\n }\n}\n","import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport type { Notification, GlobalErrorHandler } from '..'\n\nexport class NotificationApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n getNotifications = () => {\n return this.fetchInstance\n .get(ApiEndpoints.NOTIFICATIONS)\n .then((data) =>\n data.notifications.map((obj: { notification: Notification }) => obj.notification),\n )\n .finally()\n }\n\n updateNotification = (notification: Notification) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.NOTIFICATIONS}/${notification.guid}`, {\n guid: notification.guid,\n has_been_viewed: notification.has_been_viewed,\n })\n .then((data) => data.notification)\n .finally()\n }\n\n // Note: The notifications/mark_all_as_viewed endpoint is broken, but still returns 202.\n // A bug ticket has been filed to fix it, but should not require any changes here.\n markAllAsViewed = (channel?: number) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.NOTIFICATIONS}/mark_all_as_viewed`, { channel })\n .finally()\n }\n}\n","import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport type { GlobalErrorHandler, RepeatingTransaction } from '..'\n\nexport class RepeatingTransactionsApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n addRepeatingTransaction = async (repeatingTransaction: RepeatingTransaction) => {\n return this.fetchInstance\n .post(ApiEndpoints.REPEATING_TRANSACTIONS, repeatingTransaction)\n .then((data) => data.repeating_transaction)\n }\n\n getRepeatingTransactions = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.REPEATING_TRANSACTIONS)\n .then((data) => data.repeating_transactions)\n }\n\n updateRepeatingTransaction = async (repeatingTransaction: RepeatingTransaction) => {\n return this.fetchInstance\n .put(\n `${ApiEndpoints.REPEATING_TRANSACTIONS}/${repeatingTransaction.guid}`,\n repeatingTransaction,\n )\n .then((data) => data.repeating_transaction)\n }\n\n deleteRepeatingTransaction = async (guid: string) => {\n return this.fetchInstance\n .delete(`${ApiEndpoints.REPEATING_TRANSACTIONS}/${guid}`)\n .then((data) => data)\n }\n}\n","import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport { UserCommunicationProfile } from '..'\nimport type { Device, GlobalErrorHandler, NotificationProfile } from '..'\n\nexport class SettingsApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n deleteDevice = async (guid: string) => {\n return this.fetchInstance.delete(`${ApiEndpoints.DEVICES}/${guid}`).then((data) => data)\n }\n\n generateDeviceToken = async () => {\n return this.fetchInstance\n .get(`${ApiEndpoints.USER}/mobile_token`)\n .then((data) => data.mobile_token)\n }\n\n getDevices = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.DEVICES)\n .then((data) => data.map((item: { device: Device }) => item.device))\n }\n\n getNotificationProfiles = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.NOTIFICATION_PROFILES)\n .then((data) => data.notification_profiles)\n }\n\n // verifications endpoints respond with HTTP status codes; they error otherwise\n sendEmailVerification = async () => {\n return this.fetchInstance.post(ApiEndpoints.EMAIL_VERIFICATIONS)\n }\n\n sendPhoneVerification = async () => {\n return this.fetchInstance.post(ApiEndpoints.PHONE_VERIFICATIONS + '/deliver')\n }\n\n verifyPhoneToken = async (sms_verification_token: string) => {\n return this.fetchInstance\n .post(ApiEndpoints.PHONE_VERIFICATIONS + '/verify', { sms_verification_token })\n .then((res) => ({ verified: res.verified }))\n }\n\n updateDevice = async (device: Device) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.DEVICES}/${device.guid}`, device)\n .then((data) => data.device)\n }\n\n updateNotificationProfile = async (notificationProfile: NotificationProfile) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.NOTIFICATION_PROFILES}/${notificationProfile.guid}`, notificationProfile)\n .then((data) => data.notification_profile)\n }\n\n updateUserCommunicationProfile = async (userCommunicationProfile: UserCommunicationProfile) => {\n return this.fetchInstance\n .put(ApiEndpoints.USER_COMMUNICATION_PROFILE, userCommunicationProfile)\n .then((data) => data.user_communication_profile)\n }\n\n getInsightsNotificationProfiles = async () => {\n return this.fetchInstance\n .get(`${ApiEndpoints.NOTIFICATION_PROFILES}/${ApiEndpoints.INSIGHTS_NOTIFICATION_PROFILES}`)\n .then((data) => data)\n }\n}\n","import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport type { GlobalErrorHandler, Tag, Tagging, Transaction, TransactionRule } from '..'\n\nexport class TransactionApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n addTag = async (tag: Tag) => {\n return this.fetchInstance\n .post(ApiEndpoints.TAGS, tag)\n .then((data) => data.tag)\n .catch((error) => error)\n }\n\n addTagging = async (tagging: Tagging) => {\n return this.fetchInstance\n .post(ApiEndpoints.TAGGINGS, tagging)\n .then((data) => data.tagging)\n .catch((error) => error)\n }\n\n addTransaction = async (transaction: Transaction) => {\n return this.fetchInstance\n .post(ApiEndpoints.TRANSACTIONS, transaction)\n .then((data) => data.transaction)\n .catch((error) => error)\n }\n\n addTransactionRule = async (rule: TransactionRule) => {\n return this.fetchInstance\n .post(ApiEndpoints.TRANSACTION_RULES, rule)\n .then((data) => data)\n .catch((error) => error)\n }\n\n getTaggings = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.TAGGINGS)\n .then((data) => data.map((item: { tagging: Tagging }) => item.tagging))\n }\n\n getTags = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.TAGS)\n .then((data) => data.map((item: { tag: Tag }) => item.tag))\n }\n\n getTransactionRules = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.TRANSACTION_RULES)\n .then((data) => data.transaction_rules)\n }\n\n getTransactionsByDateRange = async (startDate: number, endDate: number) => {\n return this.fetchInstance\n .get(`${ApiEndpoints.TRANSACTIONS}/by_date/${startDate}/${endDate}`)\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n // DEPRECATED\n getTransactionsByAccountsAndDateRange = async (\n accountGuids: string[],\n beginDate: number,\n endDate: number,\n ) => {\n console.warn('DEPRECATED: getTransactionsByAccountsAndDateRange will be removed')\n const accountsList = accountGuids.reduce(\n (acc: string, guid: string, i: number) =>\n `${acc}account_guids[]=${guid}${i !== accountGuids.length - 1 ? '&' : ''}`,\n '',\n )\n\n return this.fetchInstance\n .get(`${ApiEndpoints.TRANSACTIONS}/by_date/${beginDate}/${endDate}?${accountsList}`)\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n // DEPRECATED\n getTransactionsByGuids = async (guids: string[]) => {\n console.warn('DEPRECATED: getTransactionsByGuids will be removed')\n return this.fetchInstance\n .post(`${ApiEndpoints.TRANSACTIONS}/by_guids`, { guids: guids.join('+') })\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n // DEPRECATED\n getTransactionsByCategoryAndDate = async (\n categoryGuid: string,\n beginDate: number,\n endDate: number,\n ) => {\n console.warn('DEPRECATED: getTransactionsByCategoryAndDate will be removed')\n return this.fetchInstance\n .get(\n `${ApiEndpoints.TRANSACTIONS}/by_category_guid/${categoryGuid}/by_date/${beginDate}/${endDate}`,\n )\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n // DEPRECATED\n getTransactionsByCategoryDateAndAccounts = async (\n categoryGuid: string,\n beginDate: number,\n endDate: number,\n accountGuids: string[],\n ) => {\n console.warn('DEPRECATED: getTransactionsByCategoryDateAndAccounts will be removed')\n const accountsList = accountGuids.reduce(\n (acc: string, guid: string, i: number) =>\n `${acc}account_guids[]=${guid}${i !== accountGuids.length - 1 ? '&' : ''}`,\n '',\n )\n\n return this.fetchInstance\n .get(\n `${ApiEndpoints.TRANSACTIONS}/by_category_guid/${categoryGuid}/by_date/${beginDate}/${endDate}?${accountsList}`,\n )\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n // DEPRECATED\n getTransactionsByCategoriesDateAndAccounts = async (\n categoryGuids: string[],\n beginDate: number,\n endDate: number,\n accountGuids: string[],\n ) => {\n console.warn('DEPRECATED: getTransactionsByCategoriesDateAndAccounts will be removed')\n const accountsList = accountGuids.reduce(\n (acc: string, guid: string, i: number) =>\n `${acc}account_guids[]=${guid}${i !== accountGuids.length - 1 ? '&' : ''}`,\n '',\n )\n\n return this.fetchInstance\n .get(\n `${ApiEndpoints.TRANSACTIONS}/by_category_guids/${categoryGuids.join(\n '+',\n )}/by_date/${beginDate}/${endDate}?${accountsList}`,\n )\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n /**\n * DEPRECATED\n * Get all transactions by the top level category, between begin date and end date, and optionally\n * filtered by accounts\n * @param categoryGuid The top level category guid\n * @param beginDate the start date\n * @param endDate the end date\n * @param accountGuids an optional list of account guids\n */\n getTransactionsByTopLevelCategoryAndDate = async (\n categoryGuid: string,\n beginDate: number,\n endDate: number,\n accountGuids: string[] = [],\n ) => {\n console.warn('DEPRECATED: getTransactionsByTopLevelCategoryAndDate will be removed')\n let url = `${ApiEndpoints.TRANSACTIONS}/by_top_level_category_guid/${categoryGuid}/by_date/${beginDate}/${endDate}`\n\n if (accountGuids.length > 0) {\n const accountsList = accountGuids.reduce(\n (acc: string, guid: string, i: number) =>\n `${acc}account_guids[]=${guid}${i !== accountGuids.length - 1 ? '&' : ''}`,\n '',\n )\n url += `?${accountsList}`\n }\n\n return this.fetchInstance\n .get(url)\n .then((data) => data.map((item: { transaction: Transaction }) => item.transaction))\n }\n\n removeTag = async (guid: string) => {\n return this.fetchInstance\n .delete(`${ApiEndpoints.TAGS}/${guid}`)\n .then((data) => data)\n .catch((error) => error)\n }\n\n removeTagging = async (guid: string) => {\n return this.fetchInstance\n .delete(`${ApiEndpoints.TAGGINGS}/${guid}`)\n .then((data) => data)\n .catch((error) => error)\n }\n\n removeTransaction = async (guid: string) => {\n return this.fetchInstance.delete(`${ApiEndpoints.TRANSACTIONS}/${guid}`).then((data) => data)\n }\n\n removeTransactionRule = async (guid: string) => {\n return this.fetchInstance\n .delete(`${ApiEndpoints.TRANSACTION_RULES}/${guid}`)\n .catch((error) => error)\n }\n\n removeTransactionSplit = async (guid: string) => {\n return this.fetchInstance\n .delete(`${ApiEndpoints.TRANSACTIONS}/${guid}/unsplit`)\n .then((data) => data)\n .catch((error) => error)\n }\n\n updateTransactionRule = async (rule: TransactionRule) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.TRANSACTION_RULES}/${rule.guid}`, rule)\n .then((data) => data)\n .catch((error) => error)\n }\n\n updateTag = async (tag: Tag) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.TAGS}/${tag.guid}`, tag)\n .then((data) => data.tag)\n .catch((error) => error)\n }\n\n updateTransaction = async (transaction: Transaction) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.TRANSACTIONS}/${transaction.guid}`, transaction)\n .then((data) => data.transaction)\n .catch((error) => error)\n }\n}\n","import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\nimport type { GlobalErrorHandler, User, UserProfile } from '..'\n\nexport class UserApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string, onError?: GlobalErrorHandler) {\n this.fetchInstance = new Fetch(endpoint, token, undefined, onError)\n }\n\n getUserFeatures = async () => {\n return this.fetchInstance\n .get(ApiEndpoints.USER_FEATURES)\n .then((data) => data.user_features)\n .catch((e) => e)\n }\n\n updateUser = async (user: User) => {\n return this.fetchInstance.put(ApiEndpoints.USER, user).then((data) => data.user)\n }\n\n updateUserProfile = async (userProfile: UserProfile) => {\n return this.fetchInstance\n .put(`${ApiEndpoints.USER_PROFILES}/${userProfile.guid}`, userProfile)\n .then((data) => data.user_profile)\n }\n}\n","import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\n\nexport class WidgetApi {\n fetchInstance: Fetch\n\n constructor(endpoint: string, token: string) {\n this.fetchInstance = new Fetch(endpoint, token)\n }\n\n requestWidgetUrl = async (req: any) => {\n return this.fetchInstance.post(ApiEndpoints.WIDGET_URLS, req).then((data) => data.widget_url)\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\n\nimport { AccountApi } from '../api'\nimport {\n type Account,\n type DetailedAccount,\n type Institution,\n type Member,\n AccountType,\n AccountSubType,\n} from '../types'\nimport { augmentAccounts } from '../utils/AccountUtils'\nimport { isFeatureEnabled } from '../utils/UserUtils'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class AccountStore {\n globalStore: GlobalStore\n api: AccountApi = new AccountApi('/', '')\n\n accounts: Account[] = []\n accountsLoaded: boolean = false\n accountsLoading: boolean = false\n institutions: Institution[] = []\n institutionsLoaded: boolean = false\n institutionsLoading: boolean = false\n members: Member[] = []\n membersLoaded: boolean = false\n membersLoading: boolean = false\n uiStore: UiStore\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.uiStore = new UiStore()\n this.api = new AccountApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n\n makeAutoObservable(this)\n }\n\n loadAccountData = async () => {\n await Promise.all([this.loadAccounts(), this.loadMembers(), this.loadInstitutions()])\n }\n\n get isAccountDataLoaded(): boolean {\n return this.accountsLoaded && this.membersLoaded && this.institutionsLoaded\n }\n\n get detailedAccounts(): DetailedAccount[] {\n const userFeatures = this.globalStore.userStore.userFeatures\n const excludeExternal = isFeatureEnabled(userFeatures, 'MD_EXCLUDE_EXTERNAL_ACCOUNTS')\n\n // Hide held account when this flag is toggled and this is the individual accounts widget\n const excludeHeld =\n this.globalStore.appConfig.config.display_only_external_accounts_in_accounts &&\n this.globalStore.appConfig.options.subtype === 'accounts' // Indicates this is an individual widget\n\n return augmentAccounts(\n this.accounts,\n this.institutions,\n this.members,\n excludeExternal,\n excludeHeld,\n )\n }\n\n get accountsByTypeMap(): Map<AccountType, DetailedAccount[]> {\n return this.detailedAccounts.reduce((typeMap: Map<AccountType, DetailedAccount[]>, account) => {\n const accountType = account.account_type\n\n let accounts = typeMap.get(accountType)\n if (!accounts) {\n accounts = []\n }\n accounts.push(account)\n typeMap.set(accountType, accounts)\n\n return typeMap\n }, new Map<AccountType, DetailedAccount[]>())\n }\n\n get cashAccounts(): DetailedAccount[] {\n return this.detailedAccounts.filter(\n (account: Account) =>\n account.account_type === AccountType.CASH ||\n account.account_type === AccountType.CHECKING ||\n account.account_type === AccountType.PREPAID ||\n account.account_type === AccountType.SAVINGS ||\n account.account_type === AccountType.CHECKING_LINE_OF_CREDIT,\n )\n }\n\n get cashBalance(): number {\n return this.cashAccounts.reduce((total, account) => total + (account?.balance || 0), 0)\n }\n\n get checkingAccounts(): DetailedAccount[] {\n return this.detailedAccounts.filter((a: Account) => a.account_type === AccountType.CHECKING)\n }\n\n get debtAccounts(): DetailedAccount[] {\n return this.detailedAccounts.filter(\n (account: Account) =>\n account.account_type === AccountType.CREDIT_CARD ||\n account.account_type === AccountType.LOAN ||\n account.account_type === AccountType.MORTGAGE ||\n account.account_type === AccountType.LINE_OF_CREDIT ||\n account.account_type === AccountType.CHECKING_LINE_OF_CREDIT,\n )\n }\n\n get finstrongAccounts(): DetailedAccount[] {\n const eligibleTypes = new Set([\n AccountType.CHECKING,\n AccountType.SAVINGS,\n AccountType.CREDIT_CARD,\n AccountType.INVESTMENT,\n ])\n\n return this.detailedAccounts.filter((account) => eligibleTypes.has(account.account_type))\n }\n\n get investmentAccounts(): DetailedAccount[] {\n return this.detailedAccounts.filter(\n (account: Account) => account.account_type === AccountType.INVESTMENT,\n )\n }\n\n get manualAccounts(): DetailedAccount[] {\n return this.detailedAccounts.filter((account) => account.is_manual)\n }\n\n get savingsAccounts(): DetailedAccount[] {\n return this.detailedAccounts.filter((a: Account) => a.account_type === AccountType.SAVINGS)\n }\n\n get retirementAccounts(): Account[] {\n return this.detailedAccounts.filter(\n (account: Account) =>\n account.account_type === AccountType.INVESTMENT ||\n account.account_type === AccountType.SAVINGS ||\n account.account_type === AccountType.CHECKING ||\n account.account_type === AccountType.CASH ||\n account.account_type === AccountType.PROPERTY ||\n (account.account_type === AccountType.INSURANCE &&\n (account.account_subtype === AccountSubType.WHOLE_LIFE ||\n account.account_subtype === AccountSubType.UNIVERSAL_LIFE ||\n account.account_subtype === AccountSubType.VARIABLE_UNIVERSAL_LIFE)),\n )\n }\n\n get visibleAccounts(): DetailedAccount[] {\n return this.detailedAccounts.filter((a: Account) => !a.is_hidden && !a.is_closed)\n }\n\n get visibleCashAccounts(): DetailedAccount[] {\n return this.cashAccounts.filter((account: Account) => !account.is_hidden)\n }\n\n get visibleCashBalance(): number {\n return this.visibleCashAccounts.reduce((total, account) => total + (account?.balance || 0), 0)\n }\n\n get visibleCheckingAccounts(): DetailedAccount[] {\n return this.checkingAccounts.filter((account: Account) => !account.is_hidden)\n }\n\n get visibleDebtAccounts(): DetailedAccount[] {\n return this.debtAccounts.filter((account: Account) => !account.is_hidden)\n }\n\n get visibleFinstrongAccounts(): DetailedAccount[] {\n return this.finstrongAccounts.filter(\n (account: Account) => !(account.is_closed || account.is_deleted || account.is_hidden),\n )\n }\n\n get visibleRetirementAccounts(): Account[] {\n return this.retirementAccounts.filter((account: Account) => !account.is_hidden)\n }\n\n get visibleInvestmentAccounts(): DetailedAccount[] {\n return this.investmentAccounts.filter((account: Account) => !account.is_hidden)\n }\n\n get visibleSavingsAccounts(): DetailedAccount[] {\n return this.savingsAccounts.filter((account: Account) => !account.is_hidden)\n }\n\n get savingsAndCheckingAccountsBalance(): number {\n const savingsAndCheckingAccountsList = this.savingsAndCheckingAccounts\n\n return savingsAndCheckingAccountsList.reduce(\n (total, account) => total + (account?.balance || 0),\n 0,\n )\n }\n\n get savingsAndCheckingAccounts(): Account[] {\n const savingsAndCheckingAccounts = this.accounts.filter(\n (account: Account) =>\n account.account_type === AccountType.SAVINGS ||\n account.account_type === AccountType.CHECKING,\n )\n\n return savingsAndCheckingAccounts\n }\n\n setAccounts = (accounts: Account[]) => {\n this.accounts = accounts\n this.accountsLoading = false\n this.accountsLoaded = true\n }\n\n setMembers = (members: Member[]) => {\n this.members = members\n this.membersLoading = false\n this.membersLoaded = true\n }\n\n setInstitutions = (institutions: Institution[]) => {\n this.institutions = institutions\n this.institutionsLoading = false\n this.institutionsLoaded = true\n }\n\n addAccount = async (account: Account) => {\n try {\n const newAccount = await this.api.createAccount(account)\n\n runInAction(() => {\n this.accounts = [...this.accounts, newAccount]\n })\n } catch (error) {\n console.error(`Error occurred while adding an account: ${error}`)\n }\n }\n\n loadAccounts = async () => {\n if (this.accountsLoading) return\n\n this.accountsLoading = true\n try {\n const accounts = await this.api.getAccounts()\n this.setAccounts(accounts)\n } catch (error) {\n console.error(`Error occurred while loading accounts: ${error}`)\n }\n }\n\n loadInstitutions = async () => {\n if (this.institutionsLoading) return\n\n this.institutionsLoading = true\n try {\n const institutions = await this.api.getInstitutions()\n this.setInstitutions(institutions)\n } catch (error) {\n console.error(`Error occurred while loading institutions: ${error}`)\n }\n }\n\n loadMembers = async () => {\n if (this.membersLoading) return\n\n this.membersLoading = true\n try {\n const members = await this.api.getMembers()\n this.setMembers(members)\n } catch (error) {\n console.error(`Error occurred while loading members: ${error}`)\n }\n }\n\n mergeAccounts = async (accountGuids: string[]) => {\n try {\n const response = await this.api.mergeAccounts(accountGuids)\n // the response from the api is a funky database key here, so this is essentially just getting the first item in the returned object\n // to prevent making multiple api calls here\n const mergedAccount = response[Object.keys(response)[0]]\n\n runInAction(() => {\n const account2Index = this.accounts.findIndex((account) => account.guid === accountGuids[1])\n this.accounts.splice(account2Index, 1)\n\n const account1Index = this.accounts.findIndex((account) => account.guid === accountGuids[0])\n this.accounts.splice(account1Index, 1, mergedAccount)\n })\n } catch (error) {\n console.error(`Error occurred while merging accounts: ${error}`)\n }\n }\n\n /**\n * DEPRECATED: Use loadAccountData instead\n */\n refreshAccounts = async () => {\n await Promise.all([this.loadAccounts(), this.loadInstitutions(), this.loadMembers()])\n }\n\n refreshMembers = async () => {\n try {\n await this.api.refreshAllMembers()\n } catch (error) {\n console.error(`Error occurredwhile refreshing members: ${error}`)\n }\n }\n\n removeAccount = async (accountGuid: string) => {\n try {\n await this.api.deleteAccount(accountGuid)\n\n const deletedIndex = this.accounts.findIndex((account) => account.guid === accountGuid)\n this.accounts.splice(deletedIndex, 1)\n } catch (error) {\n console.error(`Error occurred while removing an account: ${error}`)\n }\n }\n\n updateAccount = async (account: Account) => {\n try {\n const updatedAccount = await this.api.updateAccount(account)\n\n const updatedAccountIndex = this.accounts.findIndex(\n (account) => account.guid === updatedAccount.guid,\n )\n\n this.accounts.splice(updatedAccountIndex, 1, updatedAccount)\n } catch (error) {\n console.error(`Error occurred while updating account: ${error}`)\n }\n }\n\n updateAccountBalance = (accountGuid: string, balanceChange: number) => {\n const account = this.accounts.find((a) => a.guid === accountGuid)\n\n if (account) {\n runInAction(() => {\n account.balance = (account.balance || 0) + balanceChange\n })\n }\n }\n\n updateAccountFilter = async (accountMap: Map<string, boolean>) => {\n const accountUpdates: Promise<Account>[] = []\n for (const [guid, isSelected] of accountMap.entries()) {\n const account = this.accounts.find((acc) => acc.guid === guid)\n\n if (account && account.is_excluded_from_accounts === isSelected) {\n account.is_excluded_from_accounts = !isSelected\n accountUpdates.push(this.api.updateAccount(account))\n }\n }\n\n const updatedAccounts: Account[] = await Promise.all(accountUpdates)\n\n const accounts = [...this.accounts]\n for (const updatedAccount of updatedAccounts) {\n const index = accounts.findIndex((acc) => acc.guid === updatedAccount.guid)\n if (index !== -1) {\n accounts.splice(index, 1, updatedAccount)\n }\n }\n this.setAccounts(accounts)\n }\n}\n\n// TODO: Move into AccountStore\nclass UiStore {\n selectedAccount: Account = {} as Account\n selectedMember: Member = {} as Member\n\n constructor() {\n makeAutoObservable(this)\n }\n\n setSelectedAccount = (account: Account) => (this.selectedAccount = account)\n setSelectedMember = (member: Member) => (this.selectedMember = member)\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\n\nimport { AppDataApi, BannerApi } from '../api'\nimport type {\n AppConfig,\n AppData,\n Banner,\n User,\n UserCommunicationProfile,\n UserProfile,\n} from '../types'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class AppDataStore {\n globalStore: GlobalStore\n api: AppDataApi = new AppDataApi('/', '')\n bannerApi: BannerApi = new BannerApi('/')\n\n appData: AppData = {} as AppData\n isAppDataLoaded: boolean = false\n banner: Banner = {}\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new AppDataApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n\n makeAutoObservable(this)\n }\n\n get appConfig(): AppConfig {\n return this.globalStore.appConfig\n }\n\n get clientCommunicationProfile() {\n return this.appData.client_communication_profile\n }\n\n get clientInsightProfile() {\n return this.appData.client_insight_profile\n }\n\n get user() {\n return this.appData.user\n }\n\n get userCommunicationProfile() {\n return this.appData.user_communication_profile\n }\n\n get userProfile() {\n return this.appData.user_profile\n }\n\n setAppData = (appData: AppData) => {\n this.appData = appData\n this.bannerApi = new BannerApi(appData.address?.bullseye || '/')\n this.isAppDataLoaded = true\n }\n\n loadAppData = async () => {\n try {\n const appData = await this.api.getAppData()\n this.setAppData(appData)\n } catch (error) {\n console.error(`Error loading app data: ${error}`)\n }\n }\n\n loadBanner = async () => {\n try {\n const userGuid = this.user?.guid ?? null\n const banner = userGuid ? await this.bannerApi.getBanner(userGuid) : {}\n\n runInAction(() => {\n this.banner = banner\n })\n } catch (error) {\n console.error(`Error loading banner: ${error}`)\n }\n }\n\n setUser = (user: User) => (this.appData.user = user)\n\n setUserCommunicationProfile = (profile: UserCommunicationProfile) =>\n (this.appData.user_communication_profile = profile)\n\n setUserProfile = (userProfile: UserProfile) => (this.appData.user_profile = userProfile)\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\nimport posthog, { Survey, SurveyQuestion } from 'posthog-js'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class AnalyticsStore {\n globalStore: GlobalStore\n survey: Survey | null = null\n currentQuestionIndex: number = 0\n question: SurveyQuestion | null = null\n response: number | string | null = null\n responses: Record<string, number | string | null> = {}\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n makeAutoObservable(this)\n }\n\n get isLastQuestion() {\n return this.currentQuestionIndex === this.surveyQuestions.length - 1\n }\n\n get questionCount() {\n return `${this.currentQuestionIndex + 1}/${this.surveyQuestions.length}`\n }\n\n get responsePayload() {\n return {\n $survey_id: this.surveyId,\n ...this.responses,\n }\n }\n\n // TODO hardcode elsewhere\n get surveyId() {\n const posthogKey = window.app?.postHogPublicKey\n\n return posthogKey === 'phc_KclQGnOZEaYCttkpiVpuyOYeBlixGo6xNphYgWV4CXo'\n ? '0196caa6-9b37-0000-98a7-f04e8d56faf5'\n : '0196a6b0-ccde-0000-b980-0b84ea2fef4a'\n }\n\n get surveyQuestions() {\n return this.survey ? this.survey.questions : ([] as SurveyQuestion[])\n }\n\n loadSurvey = (forceReload: boolean = false) => {\n posthog.getActiveMatchingSurveys((surveys) => {\n runInAction(() => {\n if (surveys.length > 0) {\n const survey = surveys.find((s) => s.id === this.surveyId)\n if (survey) {\n this.survey = survey\n this.currentQuestionIndex = 0\n this.question = survey.questions[0]\n this.response = null\n this.responses = {}\n }\n }\n })\n }, forceReload)\n }\n\n nextQuestion = () => {\n if (this.currentQuestionIndex < this.surveyQuestions.length - 1) {\n this.currentQuestionIndex += 1\n }\n this.response = null\n this.question = this.surveyQuestions[this.currentQuestionIndex]\n }\n\n resetStore = () => {\n this.survey = null\n this.currentQuestionIndex = 0\n this.question = null\n this.response = null\n this.responses = {}\n }\n\n setResponse = (response: number | string | null) => {\n this.response = response\n if (this.question) {\n this.responses[`$survey_response_${this.question.id}`] = response\n }\n }\n}\n","import { Offer } from '../types'\n\ntype SortOrder = 'asc' | 'desc'\n\nexport function orderArray<T>(arr1: T[], arr2: T[], prop: keyof T, order: SortOrder = 'asc'): T[] {\n const direction = order === 'desc' ? -1 : 1\n return [...arr1, ...arr2].sort((item1, item2) => {\n if (item1[prop] < item2[prop]) return -1 * direction\n if (item1[prop] > item2[prop]) return 1 * direction\n return 0\n })\n}\n\nexport const transformOfferIntoBeatLikeObject = (offer: Offer) => {\n return {\n ...offer, //fields that are offer specific, adding here for visibility\n image_url: offer.image_url,\n guid: offer.guid,\n created_at: offer.created_at,\n dismissed_at: offer.dismissed_at,\n active_at: offer.campaign_activated_at,\n displayed_at: offer.has_been_viewed,\n post_message_secondary: offer.pulse_post_message_secondary, //offer fields mapped to beat fields for functionality\n title: offer.pulse_title || offer.campaign_name,\n html_title: offer.pulse_title || offer.campaign_name,\n short_title: offer.pulse_title || offer.campaign_name,\n html_short_title: offer.pulse_title || offer.campaign_name,\n micro_title: offer.pulse_title || offer.campaign_name,\n html_micro_title: offer.pulse_title || offer.campaign_name,\n supporting_action: offer.pulse_call_to_action_text_secondary,\n description: offer.pulse_body,\n html_description: offer.pulse_body,\n micro_description: offer.pulse_body,\n html_micro_description: offer.pulse_body,\n call_to_action: offer.pulse_call_to_action_text,\n html_micro_call_to_action: offer.pulse_call_to_action_text,\n micro_call_to_action: offer.pulse_call_to_action_text,\n is_dismissed: offer.has_been_dismissed,\n icon_type: 5,\n template: 'MarketingOffer',\n //beat fields we null out\n account_guids: [],\n data_series: {},\n has_been_displayed: false,\n is_obsolete: false,\n is_refreshable: false,\n is_sampled: false,\n merchant_guids: [],\n payload: {},\n pulse_campaign_name: offer.campaign_name,\n scheduled_payment_guids: [],\n transaction_guids: [],\n user_guid: '',\n user_verification: 0,\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\n\nimport { BeatApi } from '../api'\nimport type { Beat, Offer } from '../types'\nimport { orderArray, transformOfferIntoBeatLikeObject } from '../utils/BeatUtils'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class BeatStore {\n globalStore: GlobalStore\n api: BeatApi = new BeatApi('/', '')\n beats: Beat[] = []\n isLoading = false\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new BeatApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n\n makeAutoObservable(this)\n }\n\n loadBeats = async () => {\n this.isLoading = true\n const beats = await this.api.getBeats()\n const offers = await this.api.getOffers()\n const beatLikeOffers = offers.map((o: Offer) => transformOfferIntoBeatLikeObject(o))\n\n runInAction(() => {\n this.beats = orderArray(beats, beatLikeOffers, 'active_at', 'desc')\n this.isLoading = false\n })\n }\n\n getFilteredBeats(filter: { categoryGuids?: string[]; templates?: string[] }): Beat[] {\n const { categoryGuids, templates } = filter\n let filteredBeats = this.beats\n if (categoryGuids) filteredBeats = this.filterBeatsByCategory(filteredBeats, categoryGuids)\n if (templates) filteredBeats = this.filterBeatsByTemplate(filteredBeats, templates)\n return filteredBeats\n }\n\n // Return beats with any beat.category_guids that are in categoryGuids\n filterBeatsByCategory(beats: Beat[], categoryGuids: string[]): Beat[] {\n return beats.filter((beat) => {\n return beat.category_guids?.some((guid) => categoryGuids.includes(guid))\n })\n }\n\n // Return beats with a beat.template that is in templates\n filterBeatsByTemplate(beats: Beat[], templates: string[]): Beat[] {\n return beats.filter((beat) => {\n return templates.some((template) => beat.template === template)\n })\n }\n}\n","import { makeAutoObservable, reaction, runInAction } from 'mobx'\n\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\n\nimport { Theme } from '@mui/system'\n\nimport { BudgetsApi } from '../api'\nimport { CategoryGuids } from '../constants'\nimport { augmentBudgets, findBudget, findSubBudget } from '../utils/BudgetUtil'\n\nimport { GlobalStore } from './GlobalStore'\n\nimport type {\n Budget,\n Category,\n DateRange,\n DetailedBudget,\n DetailedCategory,\n MerchantBudget,\n} from '../types'\n\nexport class BudgetsStore {\n api: BudgetsApi = new BudgetsApi('/', '')\n\n globalStore: GlobalStore\n\n alert: string = ''\n dateRange: DateRange = { start: startOfMonth(startOfToday()), end: endOfMonth(startOfToday()) }\n budgets: Budget[] = []\n selectedBudget: DetailedBudget | undefined\n selectedSubBudget: DetailedBudget | undefined\n isDataLoaded = false\n theme = {} as Theme\n merchantBudgets: MerchantBudget[] = []\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new BudgetsApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n\n makeAutoObservable(this)\n }\n\n loadBudgetData = async () => {\n if (!this.globalStore.recurringTransactionsStore.isDataLoaded) {\n await this.globalStore.recurringTransactionsStore.loadRepeatingTransactionData()\n }\n await this.loadBudgets()\n\n /** Reaction to update the selected budget/sub-budget if detailedBudgets is updated **/\n reaction(\n () => this.detailedBudgets,\n (detailedBudgets) => {\n if (detailedBudgets) {\n const budget = this.selectedBudget\n if (budget) {\n this.selectedBudget = findBudget(detailedBudgets, budget.guid)\n }\n\n const subBudget = this.selectedSubBudget\n if (subBudget && subBudget.parent_guid) {\n this.selectedSubBudget = findSubBudget(\n detailedBudgets,\n subBudget.guid,\n subBudget.parent_guid,\n )\n }\n }\n },\n )\n }\n\n get detailedBudgets(): DetailedBudget[] {\n return augmentBudgets(\n this.budgets.filter(\n (budget: Budget) =>\n budget.category_guid !== CategoryGuids.INCOME &&\n budget.category_guid !== CategoryGuids.TRANSFER &&\n budget.category_guid !== CategoryGuids.INVESTMENTS,\n ),\n this.globalStore.categoryStore.detailedCategories,\n this.globalStore.copyStore.copy.budgets,\n this.theme,\n ).sort((a, b) => {\n if (a.percentage > b.percentage) return -1\n if (a.percentage < b.percentage) return 1\n return 0\n })\n }\n\n // TODO: Replace this with income from recurring transactions. Income budgets are deprecated.\n get incomeBudget(): number | undefined {\n const filteredBudgets = augmentBudgets(\n this.budgets.filter((budget: Budget) => !budget.parent_guid),\n this.globalStore.categoryStore.detailedCategories,\n this.globalStore.copyStore.copy.budgets,\n this.theme,\n )\n\n const incomeBudget = filteredBudgets.reduce(\n (acc, curr) => {\n if (curr.category_guid !== CategoryGuids.INCOME) return acc\n if (!acc || curr.percentage > acc.percentage) return curr\n return acc\n },\n undefined as DetailedBudget | undefined,\n )\n\n return incomeBudget?.amount\n }\n\n get unbudgetedCategories(): DetailedCategory[] {\n return this.globalStore.categoryStore.spendCategories.filter(\n (category) => !this.detailedBudgets.find((budget) => budget.category_guid === category.guid),\n )\n }\n\n get totalBudgeted(): number {\n return this.detailedBudgets.reduce((total, budget) => total + budget.amount, 0)\n }\n\n addBudget = async (category: Category, amount: number, parentGuid: string | null = null) => {\n try {\n const budget = await this.api.addBudget(category, amount, parentGuid)\n runInAction(() => {\n this.budgets.push(budget)\n })\n } catch (error) {\n console.error(`Error adding budget: ${error}`)\n }\n }\n\n deleteBudget = async (guid: string) => {\n try {\n await this.api.deleteBudget(guid)\n\n runInAction(() => {\n const index = this.budgets.findIndex((budget) => budget.guid === guid)\n if (index >= 0) {\n this.budgets.splice(index, 1)\n }\n })\n } catch (error) {\n console.error(`Error deleting budget: ${error}`)\n }\n }\n\n loadBudgets = async () => {\n try {\n const budgets = await this.api.getBudgets()\n this.setBudgets(budgets)\n } catch (error) {\n console.error(`Error occurred while loading budgets: ${error}`)\n throw error\n }\n }\n\n setAlert = (alert: string) => (this.alert = alert)\n\n setBudgets = (budgets: Budget[]) => {\n this.budgets = budgets\n this.isDataLoaded = true\n }\n\n setDateRange = (dateRange: DateRange) => (this.dateRange = dateRange)\n\n setSelectedBudget = (budget: DetailedBudget | undefined) => (this.selectedBudget = budget)\n\n setSelectedSubBudget = (budget: DetailedBudget | undefined) => (this.selectedSubBudget = budget)\n\n setTheme = (theme: Theme) => (this.theme = theme)\n\n /**\n * Recalculate budget by using the average amount from top-level categories\n * @param categories Detailed categories\n */\n recalculateBudgets = async (categories: DetailedCategory[]) => {\n try {\n for (const category of categories) {\n const budget = this.budgets.find((budget) => budget.category_guid === category.guid)\n if (budget) {\n await this.api.updateBudget({\n ...budget,\n amount: category.totalAverageAmount,\n })\n } else {\n await this.api.addBudget(category, category.totalAverageAmount)\n }\n }\n const budgetsToDelete = this.budgets.filter(\n (budget) => !categories.find((c) => c.guid === budget.category_guid),\n )\n\n for (const budgetToDelete of budgetsToDelete) {\n await this.api.deleteBudget(budgetToDelete.guid)\n }\n\n await this.loadBudgets()\n\n return { data: this.budgets, isSuccess: true }\n } catch (error) {\n console.error('error recalculating budgets', error)\n return { data: [], isSuccess: false }\n }\n }\n\n updateBudget = async (budget: Budget) => {\n try {\n const updatedBudget = await this.api.updateBudget(budget)\n\n runInAction(() => {\n const index = this.budgets.findIndex((b) => b.guid === budget.guid)\n if (index >= 0) {\n this.budgets[index] = updatedBudget\n }\n })\n } catch (error) {\n console.error(`Error updating budget: ${error}`)\n }\n }\n\n getMerchantBudgetByMerchantGuid = (merchantGuid: string): MerchantBudget | undefined => {\n return this.merchantBudgets.find(\n (eachMerchantBudget) => eachMerchantBudget?.merchant_guid === merchantGuid,\n )\n }\n\n setMerchantBudgets = (merchantBudgets: MerchantBudget[]) => {\n this.merchantBudgets = merchantBudgets\n }\n\n addMerchantBudget = async (merchantGuid: string, amount: number) => {\n try {\n const newMerchantBudget = await this.api.addMerchantBudget(merchantGuid, amount)\n\n runInAction(() => {\n this.merchantBudgets.push(newMerchantBudget)\n })\n return { isSuccess: true }\n } catch (error) {\n console.error(`Error adding merchant budget: ${error}`)\n return { isSuccess: false }\n }\n }\n\n updateMerchantBudget = async (merchantBudget: MerchantBudget) => {\n try {\n const { guid: merchantBudgetGuid, amount } = merchantBudget\n const updatedMerchantBudget = await this.api.updateMerchantBudget(merchantBudgetGuid, amount)\n\n runInAction(() => {\n const index = this.merchantBudgets.findIndex((b) => b.guid === merchantBudget.guid)\n if (index >= 0) {\n this.merchantBudgets[index] = updatedMerchantBudget\n }\n })\n return { isSuccess: true }\n } catch (error) {\n console.error(`Error updating merchant budget: ${error}`)\n return { isSuccess: false }\n }\n }\n\n deleteMerchantBudget = async (merchantBudgetGuid: string) => {\n try {\n await this.api.deleteMerchantBudget(merchantBudgetGuid)\n\n runInAction(() => {\n this.merchantBudgets = this.merchantBudgets.filter((b) => b.guid !== merchantBudgetGuid)\n })\n return { isSuccess: true }\n } catch (error) {\n console.error(`Error deleting merchant budget: ${error}`)\n return { isSuccess: false }\n }\n }\n}\n","import { makeAutoObservable } from 'mobx'\nimport { addDays } from 'date-fns/addDays'\nimport { differenceInDays } from 'date-fns/differenceInDays'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { isBefore } from 'date-fns/isBefore'\nimport { startOfToday } from 'date-fns/startOfToday'\n\nimport type { Account, Recurrence, UserProfile } from '../types'\nimport { getAccountStartingBalance } from '../utils/AccountUtils'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class CashflowStore {\n globalStore: GlobalStore\n uiStore: UiStore\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.uiStore = new UiStore(globalStore)\n\n makeAutoObservable(this)\n }\n\n completeOnboarding = async () => {\n const updatedUserProfile = {\n ...this.globalStore.userStore.userProfile,\n has_completed_cash_flow_onboarding: true,\n } as UserProfile\n\n await this.globalStore.userStore.updateUserProfile(updatedUserProfile)\n }\n}\n\nclass UiStore {\n globalStore: GlobalStore\n\n // Cashflow is hard-coded to display 30 days starting from today. This is the\n // single source of truth for Cash Flow's window; it intentionally does NOT\n // mutate RecurringTransactionsStore.dateRange, so Cash Flow stays decoupled\n // from other widgets (e.g. Recurring Transactions) that drive that shared range.\n dateRange = { start: startOfToday(), end: addDays(startOfToday(), 30) }\n isDirty = false\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n\n makeAutoObservable(this)\n }\n\n // Recurrence data scoped to Cash Flow's own dateRange, sourced from the\n // range-parameterized helpers on RecurringTransactionsStore. Computeds (not\n // component state) per the project's MobX conventions.\n get income(): Recurrence[] {\n return this.globalStore.recurringTransactionsStore.incomeForRange(this.dateRange)\n }\n\n get upcomingIncome(): Recurrence[] {\n return this.globalStore.recurringTransactionsStore.upcomingIncomeForRange(this.dateRange)\n }\n\n get upcomingExpenses(): Recurrence[] {\n return this.globalStore.recurringTransactionsStore.upcomingExpensesForRange(this.dateRange)\n }\n\n get nextIncome(): Recurrence | undefined {\n return this.globalStore.recurringTransactionsStore.nextIncomeForRange(this.dateRange)\n }\n\n // Visible cash accounts that are currently selected in the account filter.\n // Computed (single source of truth) so it stays in sync with account data and\n // the filter without effect-based syncing in components.\n get selectedCashAccounts(): Account[] {\n const { selectedAccountGuids } = this.globalStore.globalUiStore\n return this.globalStore.accountStore.visibleCashAccounts.filter((account) =>\n selectedAccountGuids.includes(account.guid),\n )\n }\n\n // Total spendable/starting balance across the selected cash accounts, using\n // the shared per-account balance rule (available vs current balance).\n get selectedCashBalance(): number {\n const showAvailableBalance =\n this.globalStore.appConfig.config.display_available_balance_in_accounts\n return this.selectedCashAccounts.reduce(\n (total, account) => total + getAccountStartingBalance(account, showAvailableBalance),\n 0,\n )\n }\n // Returns the number of days until the next income activity or 0 if there is no income activity\n get daysUntilNextIncome() {\n return this.nextIncome\n ? Math.abs(differenceInDays(startOfToday(), this.nextIncome.expectedDate))\n : 0\n }\n\n // Returns the expenses (Activities) until the next income activity or the end of the month\n // if there is no income activity\n get expensesTilNextIncome() {\n return this.upcomingExpenses.filter((a) =>\n isBefore(a.expectedDate, this.nextIncome?.expectedDate || endOfMonth(new Date())),\n )\n }\n}\n","import { makeAutoObservable } from 'mobx'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { subMonths } from 'date-fns/subMonths'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { endOfMonth } from 'date-fns/endOfMonth'\n\nimport { CategoryGuids, CategoryGuidToName } from '../constants'\nimport { CategoryApi } from '../api'\n\nimport { GlobalStore } from './GlobalStore'\n\nimport type {\n Account,\n Category,\n DetailedCategory,\n DetailedCategoryWithTransactions,\n DateRangeCategoryTotals,\n MonthlyCategoryTotals,\n} from '../types'\n\nimport { augmentCategories, getDetailedCategoryTransactions } from '../utils/CategoryUtil'\n\nexport class CategoryStore {\n globalStore: GlobalStore\n uiStore: UiStore\n api = new CategoryApi('/', '')\n\n categories: Category[] = []\n categoriesLoaded: boolean = false\n categoriesLoading: boolean = false\n dateRangeCategoryTotals: DateRangeCategoryTotals[] = []\n monthlyCategoryTotals: MonthlyCategoryTotals[] = []\n\n dateRangeTotalsLoaded = false\n dateRangeTotalsLoading = false\n monthlyTotalsLoaded = false\n monthlyTotalsLoading = false\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.uiStore = new UiStore()\n this.api = new CategoryApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n\n makeAutoObservable(this)\n }\n\n get detailedCategories(): DetailedCategory[] {\n if (!this.globalStore.isInitialized) return []\n return augmentCategories(\n this.categories,\n this.globalStore.copyStore.copy.categories,\n this.dateRangeCategoryTotals,\n this.monthlyCategoryTotals,\n )\n }\n\n get detailedCategoriesWithTransactions(): DetailedCategoryWithTransactions[] {\n return getDetailedCategoryTransactions(\n this.detailedCategories,\n this.globalStore.transactionStore.sortedTransactions,\n )\n }\n\n get incomeCategories(): DetailedCategory[] {\n return this.detailedCategories.filter((c) => c.is_income)\n }\n\n get spendCategories(): DetailedCategory[] {\n return this.detailedCategories.filter(\n (c) => !c.is_income && !c.isTransfer && c.guid !== CategoryGuids.INVESTMENTS,\n )\n }\n\n get transferCategories(): DetailedCategory[] {\n return this.detailedCategories.filter((c) => c.isTransfer)\n }\n\n setCategories = (categories: Category[]) => {\n this.categories = categories\n this.categoriesLoading = false\n this.categoriesLoaded = true\n }\n\n setMonthlyCategoryTotals = (totals: MonthlyCategoryTotals[]) => {\n this.monthlyCategoryTotals = totals\n this.monthlyTotalsLoading = false\n this.monthlyTotalsLoaded = true\n }\n\n setDateRangeCategoryTotals = (totals: DateRangeCategoryTotals[]) => {\n this.dateRangeCategoryTotals = totals\n this.dateRangeTotalsLoading = false\n this.dateRangeTotalsLoaded = true\n }\n\n get trendsCategories(): DetailedCategory[] {\n return this.detailedCategories\n .filter((c) => c.totalAmount !== 0)\n .filter((c) => c.guid !== CategoryGuids.INVESTMENTS && c.guid !== CategoryGuids.TRANSFER)\n }\n\n addCategory = async (name: string, parentGuid: string) => {\n const category = { name, parent_guid: parentGuid } as Category\n\n try {\n await this.api.addCategory(category)\n await this.loadCategories()\n } catch (error) {\n console.error(`Error occurred while adding category: ${error}`)\n }\n }\n\n loadCategories = async () => {\n if (this.categoriesLoading) return\n\n this.categoriesLoading = true\n try {\n const categories = await this.api.getCategories()\n this.setCategories(categories)\n } catch (error) {\n console.error(`Error occurred while getting categories: ${error}`)\n }\n }\n\n loadDateRangeCategoryTotals = async (accounts: Account[], startDate: Date, endDate: Date) => {\n if (this.dateRangeTotalsLoading) return\n\n this.dateRangeTotalsLoading = true\n try {\n const totals = await this.api.getDateRangeCategoryTotals(\n getUnixTime(startDate),\n getUnixTime(endDate),\n accounts,\n )\n this.setDateRangeCategoryTotals(totals)\n } catch (error) {\n console.error(`Error occurred while getting date range category totals: ${error}`)\n }\n }\n\n loadMonthlyCategoryTotals = async (\n accounts: Account[] = this.globalStore.globalUiStore.selectedAccounts,\n startDate?: Date,\n endDate?: Date,\n ) => {\n if (this.monthlyTotalsLoading) return\n\n this.monthlyTotalsLoading = true\n const start = getUnixTime(startOfMonth(startDate ?? subMonths(new Date(), 11)))\n const end = getUnixTime(endOfMonth(endDate ?? new Date()))\n\n try {\n const totals = await this.api.getMonthlyCategoryTotals(start, end, accounts)\n this.setMonthlyCategoryTotals(totals)\n } catch (error) {\n console.error(`Error occurred while getting monthly category totals: ${error}`)\n }\n }\n\n reloadCategoryTotals = async (accounts: Account[], startDate?: Date, endDate?: Date) => {\n const start = startDate ?? subMonths(new Date(), 11)\n const end = endDate ?? endOfMonth(new Date())\n try {\n await Promise.all([\n this.loadMonthlyCategoryTotals(accounts, start, end),\n this.loadDateRangeCategoryTotals(accounts, start, end),\n ])\n } catch (error) {\n console.error(`Error occurred while getting category totals: ${error}`)\n }\n }\n\n removeCategory = async (guid: string) => {\n try {\n await this.api.removeCategory(guid)\n await this.loadCategories()\n } catch (error) {\n console.error(`Error occurred while removing category: ${error}`)\n }\n }\n\n updateCategory = async (category: Category) => {\n try {\n await this.api.updateCategory(category)\n await this.loadCategories()\n } catch (error) {\n console.error(`Error occurred while updating category: ${error}`)\n }\n }\n\n // TODO: Remove this after refactoring Trends components to use detailedCategories\n getCategoryName = (guid: string) => {\n const category = this.categories.find((c) => c.guid === guid)\n return category?.name ?? CategoryGuidToName[guid]\n }\n}\n\n// TODO: Move into CategoryStore\nclass UiStore {\n expandedGuid: string | null = null\n selectedGuid: string | null = null\n searchValue = ''\n showSelected = true\n shouldDisableDrawerScroll = false\n unselectable: string[] = []\n unselectableText = ''\n\n savedOnSelect: any // todo\n\n constructor() {\n makeAutoObservable(this)\n }\n\n setExpandedGuid = (guid: string | null) => (this.expandedGuid = guid)\n\n setSelectedGuid = (guid: string | null) => (this.selectedGuid = guid)\n\n setSearchValue = (value: string) => (this.searchValue = value)\n\n setShouldDisableDrawerScroll = (shouldDisable: boolean) =>\n (this.shouldDisableDrawerScroll = shouldDisable)\n\n setShowSelected = (showSelected: boolean) => (this.showSelected = showSelected)\n\n setUnselectable = (unselectable: string[]) => (this.unselectable = unselectable)\n\n setUnselectableText = (text: string) => (this.unselectableText = text)\n\n onSelect = (guid: string) => this.savedOnSelect(guid)\n\n setOnSelect = (callback: any) => (this.savedOnSelect = callback)\n}\n","import { makeAutoObservable } from 'mobx'\n\nimport { WidgetApi } from '../api'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class ConnectStore {\n globalStore: GlobalStore\n widgetApi: WidgetApi = new WidgetApi('/', '')\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.widgetApi = new WidgetApi(globalStore.endpoint, globalStore.sessionToken)\n\n makeAutoObservable(this)\n }\n\n loadWidget = async ({ widget = 'connect_widget', mode = 'light', ...rest }) => {\n return await this.widgetApi.requestWidgetUrl({\n widget_url: { widget_type: widget, color_scheme: mode, ...rest },\n })\n }\n}\n","import { makeAutoObservable } from 'mobx'\n\nimport { type Debt } from '../types'\nimport { loadDebts, type DebtChartData } from '../utils/DebtUtils'\nimport { DebtPriority } from '../constants/Debts'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class DebtsStore {\n globalStore: GlobalStore\n uiStore: UiStore\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.uiStore = new UiStore()\n makeAutoObservable(this)\n }\n\n get debts(): Debt[] {\n const { visibleDebtAccounts: debtAccounts } = this.globalStore.accountStore\n const { selectedAccountGuids } = this.globalStore.globalUiStore\n const { debtGoals } = this.globalStore.goalStore\n\n const filteredDebtAccounts = selectedAccountGuids.length\n ? debtAccounts.filter((acc) => selectedAccountGuids.includes(acc.guid))\n : debtAccounts\n\n return loadDebts(filteredDebtAccounts, debtGoals)\n }\n\n get totalMonthlyPayments(): number {\n const payments = this.debts.map((d) => Number(d.monthly_payment)).filter((p) => !isNaN(p))\n return payments.reduce((total, payment) => total + payment, 0)\n }\n}\n\nexport class UiStore {\n isLoading = false\n selectedDebtChartData: DebtChartData = {} as DebtChartData\n selectedDebtPriority: DebtPriority = DebtPriority.LOWEST_BALANCE\n\n constructor() {\n makeAutoObservable(this)\n }\n\n get showError() {\n const { interest_rate, monthly_payment } = this.selectedDebtChartData\n return interest_rate === undefined || monthly_payment === undefined\n }\n\n get showCompleted() {\n return this.selectedDebtChartData.is_paid_off\n }\n\n setIsLoading = (isLoading: boolean) => (this.isLoading = isLoading)\n\n setSelectedDebtChartData = (data: DebtChartData) => (this.selectedDebtChartData = data)\n\n setSelectedDebtPriority = (priority: DebtPriority) => (this.selectedDebtPriority = priority)\n}\n","import { DATE_FORMATS_INTL, formatDate } from '../constants'\nimport { type Transaction } from '../types'\nimport type { SpendingFeeTransaction, MonthlyHealthScoreItem } from '../../core/types/Finstrong'\n\nexport const augmentChartData = (averageHealthScores: MonthlyHealthScoreItem[]) => {\n return averageHealthScores\n .sort((a, b) => {\n // Sort by year first, then by month\n if (a.monthly_health_score_average.year !== b.monthly_health_score_average.year) {\n return a.monthly_health_score_average.year - b.monthly_health_score_average.year\n }\n return a.monthly_health_score_average.month - b.monthly_health_score_average.month\n })\n .map((item) => ({\n x: formatDate(\n new Date(0, item.monthly_health_score_average.month - 1, 1),\n DATE_FORMATS_INTL.MONTH_SHORT,\n ),\n y: Math.round(item.monthly_health_score_average.average_health_score),\n }))\n}\n\nexport const augmentSpendingFeeTransactions = (\n spendingFeeTransactions: SpendingFeeTransaction[],\n): Transaction[] => {\n const organizedSpendingFeeTransactions = spendingFeeTransactions\n .map(({ transaction }: SpendingFeeTransaction) => {\n return {\n ...transaction,\n }\n })\n .sort((a, b) => b.date - a.date)\n\n return organizedSpendingFeeTransactions\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\n\nimport { format } from 'date-fns/format'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { subMonths } from 'date-fns/subMonths'\n\nimport { FinstrongApi } from '../api'\nimport type {\n MonthlySummaries,\n HealthScore,\n HealthScoreReport,\n MonthlyHealthScore,\n Transaction,\n} from '../types'\nimport type { FinstrongTransaction, PeerAverage } from '../types/Finstrong'\nimport { augmentChartData, augmentSpendingFeeTransactions } from '../utils/FinstrongUtils'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class FinstrongStore {\n api = new FinstrongApi('/', '')\n augmentedChartData: { x: string; y: number }[] = []\n averageHealthScores: MonthlyHealthScore[] = []\n monthlySummaries: MonthlySummaries[] = []\n incomeTransactions: FinstrongTransaction[] = []\n debtSpendTransactions: FinstrongTransaction[] = []\n spendingFeeTransactions: Transaction[] = []\n spendTransactions: FinstrongTransaction[] = []\n globalStore: GlobalStore\n healthScore: HealthScore = {} as HealthScore\n healthScoreChange?: number\n healthScoreChangeReports: HealthScoreReport[] = []\n peerScore: PeerAverage | null = null\n isSpendingInitialized: boolean = false\n isIncomeInitialized: boolean = false\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new FinstrongApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n makeAutoObservable(this)\n }\n\n setSpendingInitialized = (isSpendingInitialized: boolean) => {\n this.isSpendingInitialized = isSpendingInitialized\n }\n\n setIncomeInitialized = (isIncomeInitialized: boolean) => {\n this.isIncomeInitialized = isIncomeInitialized\n }\n\n calculateHealthScore = async (needHealthScoreChangeReport: boolean = true) => {\n try {\n const healthScore = await this.api.calculateHealthScore()\n\n let healthScoreChange = 0\n\n if (needHealthScoreChangeReport) {\n await this.loadHealthScoreChangeReports()\n }\n\n const currentScore = healthScore?.health_score || 0\n const oldScore = this.healthScoreChangeReports.at(-1)?.older_health_score || 0\n healthScoreChange = currentScore - oldScore\n\n runInAction(() => {\n this.healthScore = healthScore\n this.healthScoreChange = healthScoreChange\n })\n } catch (e) {\n console.error('Error calculating health score:', e)\n }\n }\n\n loadAverageHealthScores = async () => {\n try {\n const averageHealthScores = await this.api.getAverageHealthScores()\n runInAction(() => {\n this.averageHealthScores = averageHealthScores\n })\n } catch (e) {\n console.error('Error loading average health scores:', e)\n }\n }\n\n loadMonthlySummaries = async () => {\n try {\n const monthlySummaries = await this.api.getMonthlySummaries()\n runInAction(() => {\n this.monthlySummaries = monthlySummaries\n })\n } catch (e) {\n console.error('Error loading monthly summaries:', e)\n }\n }\n\n loadDebtSpend = async () => {\n try {\n const debtSpend = await this.api.getDebtSpend()\n runInAction(() => {\n this.debtSpendTransactions = debtSpend\n })\n } catch (e) {\n console.error('Error loading debt spend:', e)\n }\n }\n\n loadIncome = async () => {\n this.setIncomeInitialized(false)\n try {\n const income = await this.api.getIncome()\n runInAction(() => {\n this.incomeTransactions = income\n this.setIncomeInitialized(true)\n })\n } catch (e) {\n console.error('Error loading income:', e)\n }\n }\n\n loadHealthScoreChangeReports = async () => {\n const startDate = getUnixTime(subMonths(new Date(), 2))\n const endDate = getUnixTime(new Date())\n\n try {\n const healthScoreChangeReports = await this.api.getHealthScoreChangeReports(\n startDate,\n endDate,\n )\n runInAction(() => {\n this.healthScoreChangeReports = healthScoreChangeReports\n })\n } catch (e) {\n console.error('Error loading health score change reports:', e)\n }\n }\n\n loadPeerScore = async () => {\n const birthYear = format(fromUnixTime(this.globalStore.appDataStore.user.birthday!), 'yyyy')\n\n try {\n const peerScore = await this.api.getPeerScore(birthYear)\n runInAction(() => {\n this.peerScore = peerScore\n })\n } catch (e) {\n console.error('Error loading peer score:', e)\n }\n }\n\n loadAugmentedChartData = async () => {\n try {\n const augmentedChartData = await this.api.getAverageHealthScores()\n\n runInAction(() => {\n this.augmentedChartData = augmentChartData(augmentedChartData)\n })\n } catch (error) {\n console.error(`Error occurred while getting augmented chart data: ${error}`)\n }\n }\n\n getSpendingFeeTransactions = async () => {\n try {\n const spendingFeeTransaction = await this.api.getSpendingFeeTransactions()\n const organizedSpendingFeeTransactions =\n augmentSpendingFeeTransactions(spendingFeeTransaction)\n runInAction(() => {\n this.spendingFeeTransactions = organizedSpendingFeeTransactions\n })\n } catch (error) {\n console.error(`Error occurred while getting spending fee transactions: ${error}`)\n }\n }\n\n loadSpendTransactions = async () => {\n this.setSpendingInitialized(false)\n try {\n const spendTransaction = await this.api.getStandardSpend()\n runInAction(() => {\n this.spendTransactions = [...spendTransaction]\n this.setSpendingInitialized(true)\n })\n } catch (e) {\n console.error('Error loading spend transactions:', e)\n }\n }\n\n get spendAndDebtTransactions() {\n return [...this.spendTransactions, ...this.debtSpendTransactions]\n }\n\n get allTransactions() {\n return {\n income: this.incomeTransactions,\n debtSpend: this.debtSpendTransactions,\n spendingFee: this.spendingFeeTransactions,\n spend: this.spendTransactions,\n }\n }\n handleFinstrongWidgetPrimaryCtaClick = (value: string) => () => {\n // eslint-disable-next-line no-void\n void value\n }\n}\n","import type { AppConfig } from '../types'\n\nexport const DefaultAppConfig: AppConfig = {\n clientConfig: {},\n clientStyleProfile: {},\n config: {\n assets_prefix: '/assets',\n bundle: 'widgetLoader',\n client_guid: '',\n dashboard_accounts_index: 6,\n dashboard_accounts_location: 0,\n dashboard_activity_index: 2,\n dashboard_activity_location: 0,\n dashboard_budgets_index: 5,\n dashboard_budgets_location: 1,\n dashboard_cash_flow_index: 0,\n dashboard_cash_flow_location: 0,\n dashboard_connect_index: 7,\n dashboard_connect_location: 1,\n dashboard_insights_index: 3,\n dashboard_insights_location: 1,\n dashboard_spending_index: 1,\n dashboard_spending_location: 1,\n dashboard_survey_index: 8,\n dashboard_survey_location: 1,\n dashboard_trends_index: 4,\n dashboard_trends_location: 0,\n display_account_number_in_accounts: true,\n display_add_manual_transaction_in_transactions: true,\n display_available_balance_in_accounts: true,\n display_email_edit_field_in_settings: true,\n display_mobile_devices_in_settings: true,\n display_notification_settings_in_settings: true,\n display_only_external_accounts_in_accounts: false,\n display_password_options_in_settings: true,\n display_sms_edit_field_in_settings: true,\n display_terms_and_conditions: true,\n display_user_profile_in_settings: true,\n display_user_transaction_rules_in_settings: true,\n display_widget_headings: true,\n enable_add_account_in_zero_state: true,\n enable_aggregation_prompts: true,\n enable_external_accounts_in_goals_widget: true,\n enable_funds_transfers_in_goals_widget: false,\n enable_manual_accounts: true,\n enable_mark_account_closed_for_held_accounts: true,\n enable_mark_account_duplicate_for_held_accounts: true,\n enable_renaming_home_accounts: true,\n enable_support_requests: false,\n language: 'en-US',\n product_name: 'Money Dashboard',\n session_token: '',\n show_account_nicknames_in_master: false,\n show_accounts_widget_in_master: true,\n show_budgets_widget_in_master: true,\n show_carousel_card_border_in_pulse_micro_widget: false,\n show_cash_flow_widget_in_master: true,\n show_connections_widget_in_master: true,\n show_debts_widget_in_master: true,\n show_finstrong_widget_in_master: true,\n show_full_experience_link_in_pulse_micro_widget: false,\n show_full_experience_link_in_pulse_mini_widget: false,\n show_goals_widget_in_master: true,\n show_help_widget_in_master: true,\n show_horizontal_padding_in_pulse_micro_widget: true,\n show_icon_in_pulse_micro_widget: true,\n show_insights_widget_in_master: true,\n show_investments_widget_in_master: false,\n show_mx_branding: true,\n show_navigation_controls_in_pulse_micro_widget: true,\n show_net_worth_widget_in_master: true,\n show_notifications_widget_in_master: true,\n show_recurring_transactions_widget_in_master: true,\n show_settings_widget_in_master: true,\n show_spending_plan_widget_in_master: false,\n show_spending_widget_in_master: true,\n show_transactions_widget_in_master: true,\n show_trends_widget_in_master: true,\n type: 'money-dashboard',\n websocket: {\n hmac: '',\n token: '',\n url: '',\n },\n widgets_display_name: 'Money Dashboard ',\n },\n honeyBadgerPublicKey: '',\n options: {\n assets_prefix: '/assets',\n brokaw_auth: {\n token: '',\n hmac: '',\n url: '',\n },\n brokaw_websocket_url: '',\n bundle: 'widgetLoader',\n custom_copy_namespace: '',\n language: 'en-US',\n product_name: 'Master Widget',\n session_token: '',\n subtype: 'master',\n type: 'money_dashboard',\n },\n postHogPublicKey: 'phc_1fVYJICC69TpW4wagp9o2XqQ8E7X98cAmcR5psSpfkE',\n userFeatures: [],\n}\n","import { autorun, makeAutoObservable } from 'mobx'\n\nimport { DefaultAppConfig } from '../constants/DefaultConfig'\n\nimport {\n AccountStore,\n AnalyticsStore,\n AppDataStore,\n BeatStore,\n BudgetsStore,\n CashflowStore,\n CategoryStore,\n ConnectStore,\n DebtsStore,\n FinstrongStore,\n GlobalCopyStore,\n GlobalUiStore,\n GoalStore,\n HelpStore,\n HoldingStore,\n MerchantStore,\n NetWorthStore,\n NotificationStore,\n RecurringTransactionsStore,\n SettingsStore,\n TransactionStore,\n TrendsStore,\n UserStore,\n} from '../stores'\n\nimport type {\n Account,\n Category,\n Institution,\n Member,\n AppConfig,\n AppData,\n Beat,\n GlobalErrorHandler,\n MerchantBudget,\n Tag,\n Tagging,\n Transaction,\n TransactionRule,\n UserFeature,\n} from '../types'\n\ninterface LoadDataProps {\n accounts?: Account[]\n appData?: AppData\n associatedBeats?: Beat[]\n categories?: Category[]\n institutions?: Institution[]\n members?: Member[]\n merchantBudgets?: MerchantBudget[]\n taggings?: Tagging[]\n tags?: Tag[]\n transactionRules?: TransactionRule[]\n transactions?: Transaction[]\n userFeatures?: UserFeature[]\n}\n\ntype OnStoreUpdate = (update: ObservedUpdate) => void\ntype ObservedUpdate = {\n transactions: Transaction[]\n}\nexport class GlobalStore {\n // Global properties\n appConfig: AppConfig = DefaultAppConfig\n endpoint: string = '/'\n sessionToken: string = ''\n onError?: GlobalErrorHandler\n onStoreUpdate?: OnStoreUpdate\n\n // Data Stores\n accountStore: AccountStore\n appDataStore: AppDataStore\n analyticsStore: AnalyticsStore\n beatStore: BeatStore\n budgetsStore: BudgetsStore\n cashflowStore: CashflowStore\n categoryStore: CategoryStore\n connectStore: ConnectStore\n copyStore: GlobalCopyStore\n debtsStore: DebtsStore\n finstrongStore: FinstrongStore\n goalStore: GoalStore\n helpStore: HelpStore\n holdingStore: HoldingStore\n merchantStore: MerchantStore\n netWorthStore: NetWorthStore\n notificationStore: NotificationStore\n recurringTransactionsStore: RecurringTransactionsStore\n settingsStore: SettingsStore\n transactionStore: TransactionStore\n trendsStore: TrendsStore\n userStore: UserStore\n\n // UI Stores\n globalUiStore: GlobalUiStore\n\n constructor(\n appConfig: AppConfig = DefaultAppConfig,\n endpoint: string = '/',\n onError?: GlobalErrorHandler,\n onStoreUpdate?: OnStoreUpdate,\n ) {\n this.appConfig = appConfig\n this.endpoint = endpoint\n this.sessionToken = appConfig.options.session_token ?? ''\n this.onError = onError\n this.onStoreUpdate = onStoreUpdate\n\n this.accountStore = new AccountStore(this)\n this.appDataStore = new AppDataStore(this)\n this.analyticsStore = new AnalyticsStore(this)\n this.beatStore = new BeatStore(this)\n this.budgetsStore = new BudgetsStore(this)\n this.cashflowStore = new CashflowStore(this)\n this.categoryStore = new CategoryStore(this)\n this.connectStore = new ConnectStore(this)\n this.copyStore = new GlobalCopyStore(this)\n this.debtsStore = new DebtsStore(this)\n this.finstrongStore = new FinstrongStore(this)\n this.goalStore = new GoalStore(this)\n this.helpStore = new HelpStore(this)\n this.holdingStore = new HoldingStore(this)\n this.merchantStore = new MerchantStore(this)\n this.netWorthStore = new NetWorthStore(this)\n this.notificationStore = new NotificationStore(this)\n this.recurringTransactionsStore = new RecurringTransactionsStore(this)\n this.settingsStore = new SettingsStore(this)\n this.transactionStore = new TransactionStore(this)\n this.trendsStore = new TrendsStore(this)\n this.userStore = new UserStore(this)\n\n this.globalUiStore = new GlobalUiStore(this)\n\n makeAutoObservable(this)\n\n // detects a change based on an observed value\n autorun(() => {\n // destructure or assign new variables to observe changes to them\n // in this case we are observing changes to `transactions`\n const { transactions } = this.transactionStore\n this.emitUpdate({\n transactions,\n })\n })\n }\n\n get isInitialized() {\n return this.globalUiStore.isInitialized\n }\n\n // emits change triggered in the autorun\n emitUpdate = (change: ObservedUpdate) => {\n this.onStoreUpdate?.(change)\n }\n\n loadConfigData = async () => {\n await Promise.all([\n // Load copy, config and user data\n this.copyStore.loadCopy(),\n this.appDataStore.loadAppData(),\n this.accountStore.refreshMembers(),\n this.userStore.loadUserFeatures(),\n ])\n }\n\n loadData = async ({\n accounts,\n appData,\n associatedBeats,\n categories,\n institutions,\n transactionRules,\n transactions,\n userFeatures,\n merchantBudgets,\n }: LoadDataProps = {}) => {\n if (!appData || !userFeatures) {\n await this.loadConfigData()\n }\n\n // Keep for backwards compatibility for Insights\n if (appData) {\n this.appDataStore.setAppData(appData)\n }\n\n if (userFeatures) {\n this.userStore.setUserFeatures(userFeatures)\n }\n\n if (accounts) {\n await this.accountStore.loadMembers()\n if (institutions) {\n this.accountStore.setInstitutions(institutions)\n }\n this.accountStore.setAccounts(accounts)\n }\n\n if (associatedBeats) {\n this.transactionStore.setAssociatedBeats(associatedBeats)\n }\n\n if (categories) {\n this.categoryStore.setCategories(categories)\n }\n\n if (transactions) {\n this.transactionStore.setTransactions(transactions)\n }\n\n if (transactionRules) {\n this.transactionStore.setTransactionRules(transactionRules)\n }\n\n if (merchantBudgets) {\n this.budgetsStore.setMerchantBudgets(merchantBudgets)\n }\n }\n}\n","import { makeAutoObservable, reaction } from 'mobx'\n\nimport { addMonths } from 'date-fns/addMonths'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { getMonth } from 'date-fns/getMonth'\nimport { startOfMonth } from 'date-fns/startOfMonth'\n\nimport { Account } from '../types'\n\nimport type { GlobalStore } from './GlobalStore'\n\nexport class GlobalUiStore {\n globalStore: GlobalStore\n\n accountFilterMap: Map<string, boolean> = new Map()\n\n displayedDate = new Date()\n displayedDateRange = {\n start: startOfMonth(this.displayedDate),\n end: endOfMonth(this.displayedDate),\n }\n\n constructor(globalStore: GlobalStore) {\n makeAutoObservable(this)\n this.globalStore = globalStore\n\n reaction(\n () => this.globalStore.accountStore.visibleAccounts,\n (visibleAccounts) => {\n this.populateAccountFilterMap(visibleAccounts)\n },\n )\n }\n\n get allSelectedAccounts() {\n return this.globalStore.accountStore.detailedAccounts.filter(\n (account: Account) => !account.is_excluded_from_accounts,\n )\n }\n\n get selectedAccounts() {\n return this.globalStore.accountStore.visibleAccounts.filter(\n (account: Account) => !account.is_excluded_from_accounts,\n )\n }\n\n get selectedAccountGuids() {\n return this.selectedAccounts.map((account) => account.guid)\n }\n\n get isCopyLoaded() {\n return this.globalStore.copyStore.isInitialized\n }\n\n get isConfigLoaded() {\n return this.globalStore.appDataStore.isAppDataLoaded\n }\n\n get areUserFeaturesLoaded() {\n return this.globalStore.userStore.userFeaturesLoaded\n }\n\n get isInitialized() {\n return this.isCopyLoaded && this.isConfigLoaded && this.areUserFeaturesLoaded\n }\n\n populateAccountFilterMap = (accounts: Account[]) => {\n if (accounts) {\n accounts.forEach((account) => {\n this.accountFilterMap.set(account.guid, !account.is_excluded_from_accounts)\n })\n }\n }\n\n resetAccountFilterMap = () => {\n this.accountFilterMap.clear()\n this.populateAccountFilterMap(this.globalStore.accountStore.visibleAccounts)\n }\n\n updateAccountFilterMap = (guid: string, isIncluded: boolean) => {\n this.accountFilterMap.set(guid, isIncluded)\n }\n\n setDisplayedDate = (startDate: Date, endDate: Date) => {\n this.displayedDate = endDate\n this.displayedDateRange = {\n start: startDate,\n end: endDate,\n }\n }\n\n get shouldDisableNextDate() {\n const selectedMonth = getMonth(this.displayedDate)\n const nextMonth = getMonth(addMonths(new Date(), 1))\n\n return selectedMonth === nextMonth\n }\n\n get shouldDisablePrevDate() {\n const selectedMonth = getMonth(this.displayedDate)\n const currentMonth = getMonth(new Date())\n\n return selectedMonth === currentMonth\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\n\nimport { GlobalCopyApi } from '../api'\nimport { GlobalCopy } from '../types'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class GlobalCopyStore {\n globalStore: GlobalStore\n api: GlobalCopyApi = new GlobalCopyApi('/', '')\n\n copy: GlobalCopy = {} as GlobalCopy\n featureNamespace = 'experiences'\n\n isInitialized = false\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new GlobalCopyApi(\n globalStore.endpoint,\n globalStore.sessionToken,\n globalStore.onError,\n )\n\n makeAutoObservable(this)\n }\n\n loadCopy = async () => {\n await this.getCopy(this.featureNamespace)\n\n runInAction(() => {\n this.isInitialized = true\n })\n }\n\n getCopy = async (namespace: string, translationKey: string = '') => {\n try {\n const newCopy = await this.api.getGlobalCopy(namespace, translationKey)\n\n runInAction(() => {\n this.copy = newCopy[namespace]\n })\n } catch (error) {\n console.error(`Error occurred while fetching ${this.featureNamespace} copy: ${error}`)\n }\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\n\nimport { GoalApi } from '../api'\n\nimport {\n type Goal,\n type MonthlyCashFlowProfile,\n type RetirementGoalAccount,\n TrackType,\n} from '../types'\nimport { getProjectedRetirementDate } from '../utils/GoalsUtil'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class GoalStore {\n globalStore: GlobalStore\n api = new GoalApi('/', '')\n\n goals: Goal[] = []\n goalsLoaded: boolean = false\n retirementGoals: Goal[] = []\n retirementGoalsLoaded: boolean = false\n retirementGoalAccounts: RetirementGoalAccount[] = []\n retirementGoalAccountsLoaded: boolean = false\n monthlyCashFlowProfile: MonthlyCashFlowProfile | undefined = undefined\n monthlyCashFlowProfileLoaded: boolean = false\n\n newRetirementGoalAccounts: RetirementGoalAccount[] = []\n\n alert: string = ''\n selectedGoal: Goal | undefined = undefined\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new GoalApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n\n makeAutoObservable(this)\n }\n\n get allGoals(): Goal[] {\n if (!this.isAllGoalDataLoaded) return []\n\n const goalsCopy = this.globalStore.copyStore.copy.goals\n const userBirthday = this.globalStore.userStore.user.birthday\n return [\n ...this.goals,\n ...this.retirementGoals.map((goal: Goal) => ({\n ...goal,\n amount: goal.target_amount,\n name: goalsCopy.retirement,\n track_type: TrackType.RETIREMENT_TRACK,\n projected_to_complete_at:\n goal.retirement_age && userBirthday\n ? getProjectedRetirementDate(goal.retirement_age, userBirthday)\n : undefined,\n })),\n ] as Goal[]\n }\n\n get orderedGoals(): Goal[] {\n return this.allGoals.slice().sort((a, b) => a.position - b.position)\n }\n\n get debtGoals() {\n return this.orderedGoals.filter((goal) => goal.track_type === TrackType.DEBT_TRACK)\n }\n\n get retirmentGoals() {\n return this.orderedGoals.filter((goal) => goal.track_type === TrackType.RETIREMENT_TRACK)\n }\n\n get savingGoals() {\n return this.orderedGoals.filter((goal) => goal.track_type === TrackType.SAVINGS_TRACK)\n }\n\n get ongoingGoalsForMicroWidget() {\n const ongoingGoals = this.allGoals.filter(\n (goal) =>\n !goal.is_complete &&\n goal.track_type !== TrackType.EMERGENCY_FUND_TRACK &&\n goal.track_type !== null,\n )\n const priorityOrder = [\n TrackType.SAVINGS_TRACK,\n TrackType.DEBT_TRACK,\n TrackType.RETIREMENT_TRACK,\n ]\n return ongoingGoals\n .sort((a, b) => {\n const aIndex = a.track_type ? priorityOrder.indexOf(a.track_type) : -1\n const bIndex = b.track_type ? priorityOrder.indexOf(b.track_type) : -1\n return aIndex - bIndex\n })\n .slice(0, 3)\n }\n\n get isAllGoalDataLoaded() {\n return (\n this.goalsLoaded &&\n this.retirementGoalsLoaded &&\n this.retirementGoalAccountsLoaded &&\n this.monthlyCashFlowProfileLoaded\n )\n }\n\n setGoals = (goals: Goal[]) => {\n this.goals = goals\n this.goalsLoaded = true\n }\n\n setRetirementGoals = (goals: Goal[]) => {\n this.retirementGoals = goals\n this.retirementGoalsLoaded = true\n }\n\n setRetirementGoalAccounts = (accounts: RetirementGoalAccount[]) => {\n this.retirementGoalAccounts = accounts\n this.retirementGoalAccountsLoaded = true\n }\n\n setMonthlyCashFlowProfile = (profile: MonthlyCashFlowProfile) => {\n this.monthlyCashFlowProfile = profile\n this.monthlyCashFlowProfileLoaded = true\n }\n\n loadGoalData = async () => {\n await Promise.all([\n this.loadGoals(),\n this.loadRetirementGoals(),\n this.loadRetirementGoalAccounts(),\n this.loadMonthlyCashFlowProfile(),\n ])\n }\n\n loadGoals = async () => {\n try {\n const goals = await this.api.getGoals()\n this.setGoals(goals)\n } catch (error) {\n console.error(`Error occured while getting goals: ${error}`)\n }\n }\n\n loadRetirementGoals = async () => {\n try {\n const retirementGoals = await this.api.getRetirementGoals()\n this.setRetirementGoals(retirementGoals)\n } catch (error) {\n console.error(`Error occurred while loading retirement goals: ${error}`)\n }\n }\n\n loadRetirementGoalAccounts = async () => {\n try {\n const retirementGoalAccounts = await this.api.getRetirementGoalAccounts()\n this.setRetirementGoalAccounts(retirementGoalAccounts)\n } catch (error) {\n console.error(`Error occurred while loading retirement goal accounts: ${error}`)\n }\n }\n\n loadMonthlyCashFlowProfile = async () => {\n try {\n const monthlyCashFlowProfile = await this.api.getMonthlyCashFlowProfile()\n this.setMonthlyCashFlowProfile(monthlyCashFlowProfile)\n } catch (error) {\n console.error(`Error occurred while loading monthly cash flow profile: ${error}`)\n }\n }\n\n addGoal = async (goal: Goal) => {\n try {\n const newGoal = await this.api.addGoal(goal)\n this.setGoals([...this.goals, newGoal])\n } catch (error) {\n console.error(`Error occurred while adding goal: ${error}`)\n }\n }\n\n addRetirementGoal = async (goal: Goal) => {\n const goalsCopy = this.globalStore.copyStore.copy.goals\n try {\n const newGoal: Goal = await this.api.addRetirementGoal(goal)\n const newAccounts = [] as RetirementGoalAccount[]\n const userBirthday = this.globalStore.userStore.user.birthday\n for (const account of this.newRetirementGoalAccounts) {\n const newAccount = await this.api.addRetirementGoalAccount({\n ...account,\n retirement_goal_guid: newGoal.guid,\n })\n newAccounts.push(newAccount)\n }\n this.setNewRetirementGoalAccounts([])\n\n this.retirementGoals = [\n ...this.retirementGoals,\n {\n ...newGoal,\n amount: newGoal.target_amount,\n name: goalsCopy.retirement,\n track_type: TrackType.RETIREMENT_TRACK,\n projected_to_complete_at:\n newGoal.retirement_age && userBirthday\n ? getProjectedRetirementDate(newGoal.retirement_age, userBirthday)\n : undefined,\n } as Goal,\n ]\n this.setRetirementGoalAccounts([...this.retirementGoalAccounts, ...newAccounts])\n } catch (error) {\n console.error(`Error occurred while adding retirement goal: ${error}`)\n }\n }\n\n addRetirementGoalAccount = async (account: RetirementGoalAccount) => {\n try {\n const newAccount = await this.api.addRetirementGoalAccount(account)\n\n runInAction(() => {\n this.retirementGoalAccounts = [...this.retirementGoalAccounts, newAccount]\n })\n } catch (error) {\n console.error(`Error occurred while adding retirement goal account: ${error}`)\n }\n }\n\n deleteGoal = async (guid: string) => {\n try {\n await this.api.removeGoal(guid)\n\n const index = this.goals.findIndex((g) => g.guid === guid)\n if (index >= 0) {\n this.goals.splice(index, 1)\n }\n } catch (error) {\n console.error(`Error occured while deleting goal: ${error}`)\n }\n }\n\n deleteRetirementGoal = async (goal: Goal) => {\n try {\n const accounts = this.retirementGoalAccounts.filter(\n (g) => g.retirement_goal_guid === goal.guid,\n )\n for (const account of accounts) {\n await this.deleteRetirementGoalAccount(account.guid)\n }\n await this.api.removeRetirementGoal(goal.guid)\n\n const index = this.retirementGoals.findIndex((g) => g.guid === goal.guid)\n if (index >= 0) {\n this.retirementGoals.splice(index, 1)\n }\n } catch (error) {\n console.error(`Error deleting retirement goal: ${error}`)\n }\n }\n\n deleteRetirementGoalAccount = async (guid: string) => {\n try {\n await this.api.removeRetirementGoalAccount(guid)\n\n const index = this.retirementGoalAccounts.findIndex((rga) => rga.guid === guid)\n if (index >= 0) {\n this.retirementGoalAccounts.splice(index, 1)\n }\n } catch (error) {\n console.error(`Error deleting retirement goal account: ${error}`)\n }\n }\n\n reorderGoals = async (goals: Goal[]) => {\n try {\n const reordered = (await this.api.reorderGoals(goals)) as Goal[]\n\n runInAction(() => {\n for (const goal of reordered) {\n const index = this.goals.findIndex((g) => g.guid === goal.guid)\n if (index >= 0) {\n this.goals[index].position = goal.position\n }\n }\n })\n } catch (error) {\n console.error(`Error reordering goals: ${error}`)\n }\n }\n\n setAlert = (alert: string) => (this.alert = alert)\n\n setNewRetirementGoalAccounts = (accounts: RetirementGoalAccount[]) => {\n this.newRetirementGoalAccounts = accounts\n }\n\n setSelectedGoal = (goal: Goal | undefined) => (this.selectedGoal = goal)\n\n updateGoal = async (goal: Goal) => {\n try {\n const updatedGoal = await this.api.updateGoal(goal)\n\n runInAction(() => {\n const index = this.goals.findIndex((g) => g.guid === goal.guid)\n if (index >= 0) {\n this.goals[index] = updatedGoal\n }\n if (this.selectedGoal?.guid === goal.guid) {\n this.setSelectedGoal(updatedGoal)\n }\n })\n } catch (error) {\n console.error(`Error occurred while updating goal: ${error}`)\n }\n }\n\n updateRetirementGoal = async (goal: Goal) => {\n try {\n const updatedRetirementGoal = await this.api.updateRetirementGoal({\n ...goal,\n target_amount: goal.amount,\n })\n\n runInAction(() => {\n const index = this.retirementGoals.findIndex((g) => g.guid === goal.guid)\n if (index >= 0) {\n this.retirementGoals[index] = updatedRetirementGoal\n }\n\n if (this.selectedGoal?.guid === goal.guid) {\n this.setSelectedGoal(this.allGoals.find((g) => g.guid === goal.guid))\n }\n })\n } catch (error) {\n console.error(`Error occurred while updating goal: ${error}`)\n }\n }\n\n updateMonthlyCashFlowProfile = async (profile: MonthlyCashFlowProfile) => {\n try {\n const updatedProfile = await this.api.updateMonthlyCashFlowProfile(profile)\n this.setMonthlyCashFlowProfile(updatedProfile)\n } catch (error) {\n console.error(`Error occurred while updating monthly Cash Flow profile: ${error}`)\n }\n }\n}\n","import type { HelpCategory, Profile } from '../types/Help'\nimport { CategoryList } from '../types/localization/HelpCopy'\nimport { HELP_CATEGORIES } from '../constants/Help'\n\nconst isCategoryAccessibleByProfile = (category: HelpCategory, profile: Profile): boolean => {\n if (category.guid === 'general' || category.guid === 'insights') return true\n if (!category.flags) return false\n return category.flags.every((flag) => profile[flag as keyof Profile])\n}\n\nexport const HelpUtil = (profile: Profile, categoryList: CategoryList): HelpCategory[] => {\n const accessibleCategories: HelpCategory[] = []\n\n for (const el of HELP_CATEGORIES) {\n const category = categoryList[el.guid as keyof CategoryList]\n if (!category) continue\n\n const updatedCategory = {\n ...el,\n title: category.label,\n topics: el.topics.map(({ topicKey }, index) => ({\n topicKey,\n label: category.topics[index],\n })),\n }\n if (isCategoryAccessibleByProfile(updatedCategory, profile))\n accessibleCategories.push(updatedCategory)\n }\n\n return accessibleCategories\n}\n","import { makeAutoObservable } from 'mobx'\n\nimport { HelpApi } from '../api'\nimport type { Config, HelpCopy, HelpAlertProps, Ticket } from '../types'\nimport { HelpUtil } from '../utils/HelpUtil'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class HelpStore {\n alert: HelpAlertProps = { message: '', severity: undefined }\n api = new HelpApi('/', '')\n appConfig: Config | undefined\n globalStore: GlobalStore\n isLoading: boolean = false\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new HelpApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n\n makeAutoObservable(this)\n }\n\n createSupportTicket = async (ticket: Ticket) => {\n try {\n this.isLoading = true\n await this.api.createSupportTicket(ticket)\n this.setAlert(this.copy.request_support_submit_success_message, 'success')\n } catch (error) {\n this.setAlert(this.copy.request_support_submit_failure_message, 'error')\n console.error(`Error occurred while submitting:`, error)\n } finally {\n this.isLoading = false\n }\n }\n\n setAlert = (message: string, severity: HelpAlertProps['severity'] = undefined) =>\n (this.alert = { message, severity })\n\n get copy(): HelpCopy {\n return this.globalStore.copyStore.copy.help\n }\n\n get helpCategories() {\n const { client_communication_profile, client_profile } = this.globalStore.appDataStore.appData\n\n const {\n help: { category_list },\n } = this.globalStore.copyStore.copy\n\n return HelpUtil(\n {\n ...client_communication_profile,\n ...client_profile,\n ...this.globalStore.appConfig.config,\n },\n category_list,\n )\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\n\nimport { HoldingApi } from '../api'\nimport { AnalysisType } from '../constants/Investments'\nimport { type Holding } from '../types'\nimport {\n analysisChartData,\n analysisDetailsData,\n mapDataToPercentageGrid,\n} from '../utils/InvestmentUtil'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class HoldingStore {\n analysisType: AnalysisType = AnalysisType.Stocks\n api = new HoldingApi('/', '')\n holdings: Holding[] = []\n holdingsLoaded = false\n globalStore: GlobalStore\n showConnectionsWidget = false\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new HoldingApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n\n makeAutoObservable(this)\n }\n\n get analysisChartData() {\n return mapDataToPercentageGrid(analysisChartData(this.visibleHoldings), this.analysisType)\n }\n\n get analysisDetails() {\n return analysisDetailsData(this.visibleHoldings)[this.analysisType] || {}\n }\n\n get visibleHoldings() {\n return this.holdings.filter((holding) =>\n this.globalStore.globalUiStore.selectedAccountGuids.includes(holding.account_guid),\n )\n }\n\n setHoldings = (holdings: Holding[]) => {\n this.holdings = holdings\n this.holdingsLoaded = true\n }\n\n setShowConnectionsWidget = (value: boolean) => {\n this.showConnectionsWidget = value\n }\n\n loadHoldings = async () => {\n try {\n const holdings = await this.api.getHoldings()\n this.setHoldings(holdings)\n } catch (error) {\n console.error(`Error occured while getting holdings: ${error}`)\n }\n }\n\n setAnalysisType = (analysisType: AnalysisType) => {\n this.analysisType = analysisType\n }\n\n updateHoldings = async (holding: Holding) => {\n this.holdingsLoaded = false\n try {\n const updatedHolding = await this.api.updateHoldings(holding)\n const updatedIndex = this.holdings.findIndex(({ guid }) => guid === holding.guid)\n\n if (updatedIndex >= 0) {\n const holdings = [...this.holdings]\n holdings[updatedIndex] = updatedHolding\n\n runInAction(() => {\n this.holdings = holdings\n this.holdingsLoaded = true\n })\n }\n } catch (error) {\n console.error(`Error occurred while updating holding: ${error}`)\n }\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\n\nimport { MerchantApi } from '../api'\nimport type { Merchant } from '../types'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport interface CopyObject {\n [key: string]: string\n}\n\nexport class MerchantStore {\n globalStore: GlobalStore\n api: MerchantApi = new MerchantApi('/', '')\n\n merchant: Merchant | null = null\n merchants: Merchant[] = []\n isLoading = false\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new MerchantApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n\n makeAutoObservable(this)\n }\n\n loadMerchants = async (searchValue = '') => {\n this.isLoading = true\n\n const merchants = await this.api.getMerchants([searchValue])\n\n runInAction(() => {\n this.merchants = merchants\n this.isLoading = false\n })\n }\n\n loadMerchantByGuid = async (guid: string) => {\n const merchant = await this.api.getMerchantByGuid(guid)\n\n runInAction(() => (this.merchant = merchant))\n }\n}\n","import { makeAutoObservable } from 'mobx'\n\nimport { AccountApi } from '../api'\nimport type {\n Account,\n AssetsLiabilities,\n DetailedAccount,\n GainsLosses,\n MonthlyAccountBalance,\n NetWorth,\n NetWorthData,\n} from '../types'\nimport {\n filterAccounts,\n flattenBalances,\n buildAssetsLiabilities,\n buildChartData,\n buildGainsLosses,\n getLatestNetWorthData,\n sortByYearMonthAscending,\n} from '../utils/NetWorthUtils'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class NetWorthStore {\n globalStore: GlobalStore\n accountsApi: AccountApi = new AccountApi('/', '')\n\n monthlyAccountBalances: MonthlyAccountBalance[] = []\n monthlyAccountBalancesLoaded: boolean = false\n hoveredIndex: number = -1\n selectedIndex: number = -1\n timeframe: number = 6 // default timeframe is 6 months\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.accountsApi = new AccountApi(\n globalStore.endpoint,\n globalStore.sessionToken,\n globalStore.onError,\n )\n makeAutoObservable(this)\n }\n\n get isNetWorthDataLoaded(): boolean {\n return this.globalStore.accountStore.isAccountDataLoaded && this.monthlyAccountBalancesLoaded\n }\n\n get netWorthAccounts(): DetailedAccount[] {\n return filterAccounts(\n this.globalStore.globalUiStore.selectedAccounts,\n this.globalStore.accountStore.members,\n )\n }\n\n get netWorthData(): NetWorthData {\n return {\n accounts: this.netWorthAccounts,\n monthlyAccountBalances: this.monthlyAccountBalances,\n }\n }\n\n get netWorthChartData(): NetWorth[] {\n return buildChartData(this.netWorthAccounts, this.monthlyAccountBalances, this.timeframe)\n }\n\n get selectedData(): NetWorth | undefined {\n if (!this.netWorthChartData || this.netWorthChartData.length === 0) return undefined\n return this.selectedIndex === -1\n ? getLatestNetWorthData(this.netWorthChartData)\n : this.netWorthChartData[this.selectedIndex]\n }\n\n get hoveredData(): NetWorth | undefined {\n return this.hoveredIndex >= 0 ? this.netWorthChartData[this.hoveredIndex] : undefined\n }\n\n get gainsLosses(): GainsLosses {\n return buildGainsLosses(this.selectedData)\n }\n\n get assetsLiabilities(): AssetsLiabilities {\n const { assets, liabilities, totalAssets, totalLiabilities } = buildAssetsLiabilities(\n this.netWorthData.accounts,\n )\n return {\n netWorth: getLatestNetWorthData(this.netWorthChartData),\n assets,\n liabilities,\n totalAssets,\n totalLiabilities,\n }\n }\n\n loadNetWorthData = async () => {\n if (!this.globalStore.accountStore.isAccountDataLoaded) {\n await this.globalStore.accountStore.loadAccountData()\n }\n\n const accountBalances = await Promise.all(\n this.netWorthAccounts.map((account: Account) => this.getMonthlyAccountBalances(account.guid)),\n )\n\n const monthlyAccountBalances = accountBalances\n .reduce(flattenBalances, [])\n .sort(sortByYearMonthAscending)\n\n this.setMonthlyAccountBalances(monthlyAccountBalances)\n }\n\n getMonthlyAccountBalances = async (accountGuid: string) => {\n try {\n const balances = await this.accountsApi.getMonthlyAccountBalances(accountGuid)\n return balances as MonthlyAccountBalance[]\n } catch (error) {\n console.error(`Error occured while fetching monthly account balances: ${error}`)\n return []\n }\n }\n\n setHoveredIndex = (index: number) => (this.hoveredIndex = index)\n\n setMonthlyAccountBalances = (balances: MonthlyAccountBalance[]) => {\n this.monthlyAccountBalances = balances\n this.monthlyAccountBalancesLoaded = true\n }\n\n setSelectedIndex = (index: number) => (this.selectedIndex = index)\n setTimeframe = (months: number) => (this.timeframe = months)\n}\n","import { makeAutoObservable, observable, runInAction } from 'mobx'\n\nimport { NotificationApi } from '../api'\nimport { type Notification } from '../types'\nimport { filterRecentNotifications } from '../utils/NotificationUtils'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class NotificationStore {\n globalStore: GlobalStore\n api = new NotificationApi('/', '')\n\n isLoading: boolean = true\n notifications: Notification[] = []\n notificationsLoaded: boolean = false\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new NotificationApi(\n globalStore.endpoint,\n globalStore.sessionToken,\n globalStore.onError,\n )\n\n makeAutoObservable(this, { notifications: observable })\n }\n\n // Used in Money Dashboard\n get newNotifications(): Notification[] {\n return this.recentNotifications.filter((n) => !n.has_been_viewed)\n }\n\n get recentNotifications(): Notification[] {\n return filterRecentNotifications(this.notifications)\n }\n\n setNotifications = (notifications: Notification[]) => {\n this.notifications = notifications\n this.notificationsLoaded = true\n }\n\n loadNotifications = async () => {\n this.isLoading = true\n try {\n const notifications = await this.api.getNotifications()\n this.setNotifications(notifications)\n } catch (error) {\n console.error(`Error occurred while loading notifications: ${error}`)\n } finally {\n runInAction(() => {\n this.isLoading = false\n })\n }\n }\n\n markAllAsViewed = async () => {\n // Update on the server\n await this.api.markAllAsViewed()\n }\n\n updateNotification = async (notification: Notification) => {\n notification.has_been_viewed = true\n await this.api.updateNotification(notification)\n }\n}\n","import { type AlertProps } from '@mui/material'\nimport { makeAutoObservable, runInAction } from 'mobx'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { isAfter } from 'date-fns/isAfter'\nimport { isBefore } from 'date-fns/isBefore'\nimport { isSameDay } from 'date-fns/isSameDay'\nimport { isWithinInterval } from 'date-fns/isWithinInterval'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subDays } from 'date-fns/subDays'\n\nimport { RepeatingTransactionsApi } from '../api'\nimport {\n type Recurrence,\n type RecurringCopy,\n type RepeatingTransaction,\n type Transaction,\n RecurrenceStatus,\n RecurrenceType,\n type DateRange,\n} from '../types'\nimport {\n augmentRepeatingTransactions,\n buildAllRecurrences,\n} from '../utils/RecurringTransactionsUtil'\n\nimport { GlobalStore } from './GlobalStore'\n\nconst currentMonthFilter = (date: DateRange, recurrence: Recurrence) =>\n isWithinInterval(recurrence.expectedDate, date)\n\nconst recurrenceTotalReducer = (total: number, recurrence: Recurrence) => total + recurrence.amount\n\ninterface RecurringAlertProps {\n message: string\n severity: AlertProps['severity']\n}\n\nexport class RecurringTransactionsStore {\n globalStore: GlobalStore\n api = new RepeatingTransactionsApi('/', '')\n\n repeatingTransactions: RepeatingTransaction[] = []\n isDataLoaded: boolean = false\n\n selectedDay: Date | undefined\n dateRange: DateRange = { start: startOfMonth(startOfToday()), end: endOfMonth(startOfToday()) }\n selectedRepeatingTransactionGuid: string | null = null\n selectedRecurrence: Recurrence | null = null\n\n alert: RecurringAlertProps = { message: '', severity: undefined }\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new RepeatingTransactionsApi(\n globalStore.endpoint,\n globalStore.sessionToken,\n globalStore.onError,\n )\n\n // The *ForRange helpers are parameterized computeds: they must stay plain\n // methods (not actions) so observable reads inside them remain tracked when\n // invoked from an observer/derivation. makeAutoObservable would otherwise\n // annotate them as actions, which do not track reads.\n makeAutoObservable(this, {\n recurrencesForRange: false,\n upcomingExpensesForRange: false,\n upcomingIncomeForRange: false,\n incomeForRange: false,\n nextIncomeForRange: false,\n })\n }\n\n get copy(): RecurringCopy {\n return this.globalStore.copyStore.copy.recurring\n }\n\n get detailedRepeatingTransactions(): RepeatingTransaction[] {\n return augmentRepeatingTransactions(\n this.globalStore.accountStore.visibleAccounts,\n this.repeatingTransactions,\n this.globalStore.transactionStore.transactions,\n )\n }\n\n /**\n * Returns all recurrences built from repeating transactions and filtered by\n * accounts, scoped to the supplied date range. This is the range-parameterized\n * core used by both the shared getters (which pass this.dateRange) and by\n * consumers such as Cash Flow that need their own independent window without\n * mutating the shared dateRange.\n */\n recurrencesForRange = (dateRange: DateRange): Recurrence[] => {\n const accounts = this.globalStore.accountStore.visibleAccounts\n\n return buildAllRecurrences(this.detailedRepeatingTransactions, dateRange)\n .filter((r) => accounts.some((a) => a.guid === r.accountGuid && !a.is_excluded_from_accounts))\n .filter((r) => isWithinInterval(r.expectedDate, dateRange))\n }\n\n /**\n * Returns the upcoming expense recurrences scoped to the supplied date range.\n */\n upcomingExpensesForRange = (dateRange: DateRange): Recurrence[] => {\n return this.recurrencesForRange(dateRange).filter(\n (recurrence: Recurrence) =>\n recurrence.type === RecurrenceType.Expense &&\n recurrence.status === RecurrenceStatus.Upcoming,\n )\n }\n\n /**\n * Returns the income recurrences scoped to the supplied date range.\n */\n incomeForRange = (dateRange: DateRange): Recurrence[] => {\n return this.recurrencesForRange(dateRange).filter(\n (recurrence: Recurrence) => recurrence.type === RecurrenceType.Income,\n )\n }\n\n /**\n * Returns the upcoming income recurrences scoped to the supplied date range.\n */\n upcomingIncomeForRange = (dateRange: DateRange): Recurrence[] => {\n return this.incomeForRange(dateRange).filter(\n (recurrence: Recurrence) => recurrence.status === RecurrenceStatus.Upcoming,\n )\n }\n\n /**\n * Returns the next upcoming income recurrence scoped to the supplied range.\n */\n nextIncomeForRange = (dateRange: DateRange): Recurrence | undefined => {\n return this.upcomingIncomeForRange(dateRange).find((r) =>\n isAfter(r.expectedDate, startOfToday()),\n )\n }\n\n /**\n * Returns all recurrences built from repeating transactions and filtered by accounts.\n */\n get recurrences(): Recurrence[] {\n return this.recurrencesForRange(this.dateRange)\n }\n\n /**\n * Returns all recurrences that have occurred in the past, including those that are paid or missed\n */\n get pastRecurrences(): Recurrence[] {\n return this.recurrences.filter(\n (recurrence: Recurrence) =>\n recurrence.status === RecurrenceStatus.Paid ||\n recurrence.status === RecurrenceStatus.Missed,\n )\n }\n\n /**\n * Returns all recurrences that are expected to occur through the end of the month\n * or should have occurred in the last 3 days.\n */\n get upcomingRecurrences(): Recurrence[] {\n return this.recurrences.filter(\n (r) =>\n isAfter(r.expectedDate, subDays(startOfToday(), 3)) &&\n isBefore(r.expectedDate, this.dateRange.end) &&\n r.status === RecurrenceStatus.Upcoming,\n )\n }\n\n /**\n * Returns all expense recurrences.\n */\n get expenses(): Recurrence[] {\n return this.recurrences.filter(\n (recurrence: Recurrence) => recurrence.type === RecurrenceType.Expense,\n )\n }\n\n /**\n * Returns the upcoming expense recurrences.\n */\n get upcomingExpenses(): Recurrence[] {\n return this.expenses.filter(\n (recurrence: Recurrence) => recurrence.status === RecurrenceStatus.Upcoming,\n )\n }\n\n /**\n * Returns all income recurrences.\n */\n get income(): Recurrence[] {\n return this.recurrences.filter(\n (recurrence: Recurrence) => recurrence.type === RecurrenceType.Income,\n )\n }\n\n /**\n * Returns the upcoming income recurrences.\n */\n get upcomingIncome(): Recurrence[] {\n return this.income.filter(\n (recurrence: Recurrence) => recurrence.status === RecurrenceStatus.Upcoming,\n )\n }\n\n get nextIncomeRecurrence() {\n return this.upcomingIncome.find((r) => isAfter(r.expectedDate, startOfToday()))\n }\n\n /**\n * Returns the expense recurrences for the current month.\n */\n get currentMonthExpenses(): Recurrence[] {\n return this.expenses.filter((recurrence: Recurrence) =>\n currentMonthFilter(this.dateRange, recurrence),\n )\n }\n\n /**\n * Returns the income recurrences for the current month.\n */\n get currentMonthIncome(): Recurrence[] {\n return this.income.filter((recurrence: Recurrence) =>\n currentMonthFilter(this.dateRange, recurrence),\n )\n }\n\n /**\n * Calculates the total amount of all expenses for the current month.\n */\n get expenseTotal(): number {\n return this.currentMonthExpenses.reduce(recurrenceTotalReducer, 0)\n }\n\n /**\n * Calculates the total amount of all paid expenses for the current month.\n */\n get paidExpenseTotal(): number {\n return this.currentMonthExpenses\n .filter((recurrence: Recurrence) => recurrence.status === RecurrenceStatus.Paid)\n .reduce(recurrenceTotalReducer, 0)\n }\n\n /**\n * Calculates the total amount of all missed expenses for the current month.\n */\n get missedExpenseTotal(): number {\n return this.currentMonthExpenses\n .filter((recurrence: Recurrence) => recurrence.status === RecurrenceStatus.Missed)\n .reduce(recurrenceTotalReducer, 0)\n }\n\n /**\n * Calculates the total amount of all upcoming expenses for the current month.\n */\n get upcomingExpenseTotal(): number {\n return this.currentMonthExpenses\n .filter((recurrence: Recurrence) => recurrence.status === RecurrenceStatus.Upcoming)\n .reduce(recurrenceTotalReducer, 0)\n }\n\n /**\n * Calculates the total amount of all income for the current month.\n */\n get incomeTotal(): number {\n return this.currentMonthIncome.reduce(recurrenceTotalReducer, 0)\n }\n\n /**\n * Calculates the total amount of all paid income for the current month.\n */\n get paidIncomeTotal(): number {\n return this.currentMonthIncome\n .filter((recurrence: Recurrence) => recurrence.status === RecurrenceStatus.Paid)\n .reduce(recurrenceTotalReducer, 0)\n }\n\n /**\n * Calculates the total amount of all upcoming income for the current month.\n */\n get upcomingIncomeTotal(): number {\n return this.currentMonthIncome\n .filter((recurrence: Recurrence) => recurrence.status === RecurrenceStatus.Upcoming)\n .reduce(recurrenceTotalReducer, 0)\n }\n\n /**\n * Get the recurrences for the currently selected day.\n */\n get selectedDayRecurrences(): Recurrence[] | undefined {\n return (\n this.selectedDay &&\n this.recurrences.filter(\n (recurrence: Recurrence) =>\n this.selectedDay &&\n isSameDay(recurrence.occurredOnDate || recurrence.expectedDate, this.selectedDay),\n )\n )\n }\n\n get selectedRepeatingTransaction(): RepeatingTransaction | undefined {\n return this.selectedRepeatingTransactionGuid\n ? this.detailedRepeatingTransactions.find(\n (rt) => rt.guid === this.selectedRepeatingTransactionGuid,\n )\n : undefined\n }\n\n setSelectedRepeatingTransactionGuid = (guid: string | null) =>\n (this.selectedRepeatingTransactionGuid = guid)\n\n setSelectedRecurrence = (recurrence: Recurrence | null) => (this.selectedRecurrence = recurrence)\n\n setRepeatingTransactions = (repeating: RepeatingTransaction[]) => {\n this.repeatingTransactions = repeating\n this.isDataLoaded = true\n }\n\n /**\n * Set the date range for filtering recurrences.\n * @param dateRange - The date range to set.\n */\n setDateRange = (dateRange: DateRange) => (this.dateRange = dateRange)\n\n /**\n * Set the currently selected day.\n * @param day - The day to select.\n */\n setSelectedDay = (day: Date) => {\n this.selectedDay = this.selectedDay && isSameDay(day, this.selectedDay) ? undefined : day\n }\n\n loadRepeatingTransactionData = async () => {\n await Promise.all([\n this.globalStore.accountStore.loadAccountData(),\n this.globalStore.categoryStore.loadCategories(),\n this.globalStore.transactionStore.loadTransactionData(),\n ])\n await this.loadRepeatingTransactions()\n }\n\n /**\n * Load repeating transactions and augment them with additional data.\n */\n loadRepeatingTransactions = async () => {\n try {\n const repeatingTransactions = await this.api.getRepeatingTransactions()\n this.setRepeatingTransactions(repeatingTransactions)\n } catch (error) {\n console.error(`Error occurred while getting repeating transactions: ${error}`)\n }\n }\n\n /**\n * Add a new repeating transaction and link it to the associated transaction.\n * @param repeatingTransaction - The repeating transaction to add.\n * @param transaction - The transaction associated with the repeating transaction.\n */\n addRepeatingTransaction = async (\n repeatingTransaction: RepeatingTransaction,\n transaction: Transaction,\n ) => {\n try {\n const newRepeating = await this.api.addRepeatingTransaction(repeatingTransaction)\n\n await this.globalStore.transactionStore.updateTransaction({\n ...transaction,\n repeating_transaction_guid: newRepeating.guid,\n })\n\n runInAction(() => {\n this.repeatingTransactions = [\n ...this.repeatingTransactions,\n ...augmentRepeatingTransactions(\n this.globalStore.accountStore.visibleAccounts,\n [newRepeating],\n this.globalStore.transactionStore.transactions,\n ),\n ]\n })\n } catch (error) {\n console.error(`Error occurred while adding repeating transaction: ${error}`)\n }\n }\n\n /**\n * Delete a repeating transaction by its GUID.\n * @param guid - The GUID of the repeating transaction to delete.\n */\n deleteRepeatingTransaction = async (guid: string) => {\n try {\n await this.api.deleteRepeatingTransaction(guid)\n\n runInAction(() => {\n this.repeatingTransactions = [\n ...this.repeatingTransactions.filter((rt) => rt.guid !== guid),\n ]\n })\n } catch (error) {\n console.error(`Error occurred while deleting repeating transaction: ${error}`)\n }\n }\n\n /**\n * Update an existing repeating transaction.\n * @param transaction - The repeating transaction to update.\n */\n updateRepeatingTransaction = async (transaction: RepeatingTransaction) => {\n try {\n const updatedTransaction = await this.api.updateRepeatingTransaction(transaction)\n\n const index = this.repeatingTransactions.findIndex(\n (rt) => rt.guid === updatedTransaction.guid,\n )\n if (index < 0) return\n\n runInAction(() => {\n this.repeatingTransactions = [\n ...this.repeatingTransactions.slice(0, index),\n ...augmentRepeatingTransactions(\n this.globalStore.accountStore.visibleAccounts,\n [updatedTransaction],\n this.globalStore.transactionStore.transactions,\n ),\n ...this.repeatingTransactions.slice(index + 1),\n ]\n })\n } catch (error) {\n console.error(`Error occurred while updating repeating transaction: ${error}`)\n }\n }\n\n /**\n * Mark a recurrence as paid by linking a transaction to the repeating transaction.\n * @param repeatingTransactionGuid - The GUID of the repeating transaction.\n * @param transaction - The transaction to link.\n */\n markRecurrenceAsPaid = async (repeatingTransactionGuid: string, transaction: Transaction) => {\n try {\n await this.globalStore.transactionStore.updateTransaction({\n ...transaction,\n repeating_transaction_guid: repeatingTransactionGuid,\n })\n\n await this.loadRepeatingTransactions()\n this.setSelectedRecurrence(null)\n this.setAlert(this.copy.link_transaction_success, 'success')\n } catch (error) {\n console.error(`Error occurred while marking recurrence as paid: ${error}`)\n this.setAlert(this.copy.link_transaction_error, 'error')\n }\n }\n\n /**\n * Mark a recurrence as unpaid by unlinking the associated transaction from the repeating transaction.\n * @param transaction - The transaction to unlink.\n */\n markRecurrenceAsUnpaid = async (transaction: Transaction) => {\n try {\n await this.globalStore.transactionStore.updateTransaction({\n ...transaction,\n repeating_transaction_guid: null,\n })\n\n await this.loadRepeatingTransactions()\n this.setSelectedRecurrence(null)\n this.setAlert(this.copy.unlink_transaction_success, 'success')\n } catch (error) {\n console.error(`Error occurred while marking recurrence as unpaid: ${error}`)\n this.setAlert(this.copy.unlink_transaction_error, 'error')\n }\n }\n\n setAlert = (message: string, severity: RecurringAlertProps['severity'] = undefined) =>\n (this.alert = { message, severity })\n}\n","import {\n type Account,\n type ClientCommunicationProfile,\n type DetailedNotificationProfile,\n type NotificationProfile,\n type SettingsCopy,\n type User,\n type UserCommunicationProfile,\n AccountNotificationTypes,\n BudgetNotificationTypes,\n InsightNotificationTypes,\n} from '../types'\n\nconst PARENT_ENTITY = 'PARENT-ENTITY'\n\nconst getProfileLabel = (notificationType: number, copy: SettingsCopy) => {\n const labelMap: Record<number, string> = {\n [BudgetNotificationTypes.BudgetExceeded]: copy.notification_budget_exceeded,\n [BudgetNotificationTypes.BudgetOffTarget]: copy.notification_budget_off_target,\n [AccountNotificationTypes.DebtPaymentReminder]: copy.notification_debt_payment_reminder,\n [AccountNotificationTypes.AccountBalanceLow]: copy.notification_low_balance,\n [AccountNotificationTypes.AccountDepositLargePosted]: copy.notification_large_deposit,\n [AccountNotificationTypes.AccountDepositLarge]: copy.notification_large_deposit,\n [AccountNotificationTypes.TransactionExpenseLarge]: copy.notification_large_expense,\n [AccountNotificationTypes.TransactionFeeCharge]: copy.notification_transaction_fee,\n [AccountNotificationTypes.InternationalTransaction]:\n copy.notification_transaction_is_international,\n [InsightNotificationTypes.AccountBalanceLow]: copy.account_balance_low,\n [InsightNotificationTypes.BillAmountNotStandard]: copy.bill_amount_not_standard,\n [InsightNotificationTypes.CategorySpending]: copy.category_spending,\n [InsightNotificationTypes.CreditCardCloseToLimit]: copy.credit_card_close_to_limit,\n [InsightNotificationTypes.DebtPaymentReminder]: copy.debt_payment_reminder,\n [InsightNotificationTypes.DuplicatePayment]: copy.duplicate_payment,\n [InsightNotificationTypes.MonthlySpendComparison]: copy.monthly_spend_comparison,\n [InsightNotificationTypes.MonthlySpendToIncomeComparison]:\n copy.monthly_spend_to_income_comparison,\n [InsightNotificationTypes.MonthlySubscriptionAggregate]: copy.monthly_subscription_aggregate,\n [InsightNotificationTypes.MonthlyTopMerchantSpending]: copy.monthly_top_merchant_spending,\n [InsightNotificationTypes.SaveAnExtra100Dollars]: copy.save_an_extra_100_dollars,\n [InsightNotificationTypes.SavingsOpportunity]: copy.savings_opportunity,\n [InsightNotificationTypes.SetUpDirectDeposit]: copy.set_up_direct_deposit,\n [InsightNotificationTypes.SwitchDirectDeposit]: copy.switch_direct_deposit,\n [InsightNotificationTypes.UncategorizedTransactions]: copy.uncategorized_transactions,\n [InsightNotificationTypes.UnifiedDeposit]: copy.unified_deposit,\n [InsightNotificationTypes.UpcomingBill]: copy.upcoming_bill,\n [InsightNotificationTypes.WeekendSpendingSummary]: copy.weekend_spending_summary,\n [InsightNotificationTypes.WeeklyNewMerchants]: copy.weekly_new_merchants,\n [InsightNotificationTypes.DiscoveredAccounts]: copy.discovered_account,\n [InsightNotificationTypes.TransactionExpenseLarge]: copy.large_transaction,\n [InsightNotificationTypes.PromotionalCampaignMessages]: copy.promotional_campaign_messages,\n [InsightNotificationTypes.TransparentOverdraft]: copy.transparent_overdraft,\n }\n\n return labelMap[notificationType] || ''\n}\n\nexport const augmentNotificationProfiles = (\n accounts: Account[],\n clientCommunicationsProfile: ClientCommunicationProfile,\n copy: SettingsCopy,\n profiles: NotificationProfile[],\n userCommunicationsProfile: UserCommunicationProfile,\n user: User,\n) => {\n const detailedProfiles = [] as DetailedNotificationProfile[]\n const {\n email_notifications_enabled: clientEmailEnabled,\n sms_notifications_enabled: clientSmsEnabled,\n push_notifications_enabled: clientPushEnabled,\n } = clientCommunicationsProfile\n\n const {\n opted_out_of_email_notifications: userEmailOptedOut,\n opted_out_of_sms_notifications: userSmsOptedOut,\n opted_out_of_push_notifications: userPushOptedOut,\n } = userCommunicationsProfile\n\n for (const profile of profiles.filter((profile) => profile.entity_guid === PARENT_ENTITY)) {\n const label = getProfileLabel(profile.notification_type, copy)\n const children = profiles.filter(\n (child) =>\n child.entity_guid !== PARENT_ENTITY &&\n child.notification_type === profile.notification_type &&\n accounts.some((account) => account.guid === child.entity_guid),\n )\n\n const deliveryMethods = [] as string[]\n if (clientEmailEnabled && !userEmailOptedOut && profile.email_channel && user.email) {\n deliveryMethods.push(copy.delivery_method_email_label)\n }\n if (clientSmsEnabled && !userSmsOptedOut && profile.sms_channel && user.phone) {\n deliveryMethods.push(copy.delivery_method_sms_label)\n }\n if (clientPushEnabled && !userPushOptedOut && profile.push_channel) {\n deliveryMethods.push(copy.delivery_method_push_label)\n }\n\n detailedProfiles.push({\n ...profile,\n children: children.map((child) => ({\n ...child,\n account: accounts.find((a) => a.guid === child.entity_guid),\n label,\n })),\n deliveryMethodsLabel: deliveryMethods.join(', '),\n label,\n })\n }\n\n return detailedProfiles\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\n\nimport { AlertProps } from '@mui/material'\n\nimport {\n AccountNotificationTypes,\n BudgetNotificationTypes,\n InsightNotificationTypes,\n} from '../types'\n\nimport type {\n DetailedNotificationProfile,\n Device,\n NotificationProfile,\n SettingsCopy,\n TransactionRule,\n User,\n UserCommunicationProfile,\n} from '../types'\n\nimport { SettingsApi, TransactionApi } from '../api'\nimport { augmentNotificationProfiles } from '../utils/SettingsUtil'\n\nimport { GlobalStore } from './GlobalStore'\n\ninterface SettingsAlertProps {\n message: string\n severity: AlertProps['severity']\n}\n\nexport class SettingsStore {\n globalStore: GlobalStore\n api: SettingsApi = new SettingsApi('/', '')\n transactionApi: TransactionApi = new TransactionApi('/', '')\n\n alert: SettingsAlertProps = { message: '', severity: undefined }\n devices: Device[] = []\n notificationProfiles: NotificationProfile[] = []\n selectedRule: TransactionRule | undefined = undefined\n transactionRules: TransactionRule[] = []\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new SettingsApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n this.transactionApi = new TransactionApi(\n globalStore.endpoint,\n globalStore.sessionToken,\n globalStore.onError,\n )\n\n makeAutoObservable(this)\n }\n\n get accountProfiles() {\n const ccp = this.globalStore.appDataStore.clientCommunicationProfile\n\n // TODO: There has to be a better way to do this, but for now, it works\n return this.detailedNotificationProfiles.filter(\n (np) =>\n (np.notification_type === AccountNotificationTypes.DebtPaymentReminder &&\n ccp.debt_payment_reminder_notifications_enabled) ||\n (np.notification_type === AccountNotificationTypes.AccountBalanceLow &&\n ccp.low_balance_notifications_enabled) ||\n (np.notification_type === AccountNotificationTypes.AccountDepositLarge &&\n ccp.large_deposit_notifications_enabled) ||\n (np.notification_type === AccountNotificationTypes.TransactionExpenseLarge &&\n ccp.large_expense_notifications_enabled) ||\n (np.notification_type === AccountNotificationTypes.TransactionFeeCharge &&\n ccp.transaction_fee_notifications_enabled) ||\n (np.notification_type === AccountNotificationTypes.InternationalTransaction &&\n ccp.transaction_is_international_notifications_enabled) ||\n (np.notification_type === AccountNotificationTypes.AccountDepositLargePosted &&\n ccp.large_deposit_posted_notifications_enabled),\n )\n }\n\n get budgetProfiles() {\n const ccp = this.globalStore.appDataStore.clientCommunicationProfile\n\n // TODO: There has to be a better way to do this, but for now, it works\n return this.detailedNotificationProfiles.filter(\n (np) =>\n (np.notification_type === BudgetNotificationTypes.BudgetExceeded &&\n ccp.budget_exceeded_notifications_enabled) ||\n (np.notification_type === BudgetNotificationTypes.BudgetOffTarget &&\n ccp.budget_off_target_notifications_enabled),\n )\n }\n\n get insightsProfiles() {\n return this.detailedNotificationProfiles.filter((np) =>\n Object.values(InsightNotificationTypes).includes(np.notification_type),\n )\n }\n\n get clientCommunicationProfile() {\n return this.globalStore.appDataStore.clientCommunicationProfile\n }\n\n get copy(): SettingsCopy {\n return this.globalStore.copyStore.copy.settings\n }\n\n get detailedNotificationProfiles(): DetailedNotificationProfile[] {\n // Don't attempt to augment profile if global store is not initialized\n if (!this.globalStore.isInitialized) return []\n\n return augmentNotificationProfiles(\n this.globalStore.accountStore.accounts,\n this.clientCommunicationProfile,\n this.copy,\n this.notificationProfiles,\n this.userCommunicationsProfile,\n this.globalStore.userStore.user,\n )\n }\n\n get userCommunicationsProfile() {\n return this.globalStore.appDataStore.userCommunicationProfile\n }\n\n deleteDevice = async (guid: string) => {\n try {\n await this.api.deleteDevice(guid)\n\n const index = this.devices.findIndex((d) => d.guid === guid)\n if (index >= 0) {\n runInAction(() => {\n this.devices.splice(index, 1)\n })\n }\n\n return { success: true }\n } catch (error) {\n console.error(`Error deleting device: ${guid}`)\n return { success: false }\n }\n }\n\n deleteTransactionRule = async () => {\n if (!this.selectedRule) {\n return\n }\n this.transactionApi\n .removeTransactionRule(this.selectedRule?.guid)\n .then(() => {\n this.setAlert(this.copy.delete_rule_success, 'success')\n this.loadTransactionRules()\n })\n .catch(() => {\n this.setAlert(this.copy.delete_rule_error, 'error')\n })\n }\n\n generateDeviceToken = async () => {\n try {\n return await this.api.generateDeviceToken()\n } catch (error) {\n console.error(`Error generating device token: ${error}`)\n }\n return undefined\n }\n\n loadDevices = async () => {\n try {\n const devices = await this.api.getDevices()\n\n runInAction(() => {\n this.devices = devices\n })\n } catch (error) {\n console.error(`Error loading devices: ${error}`)\n }\n }\n\n loadNotificationProfiles = async () => {\n try {\n const profiles = await this.api.getNotificationProfiles()\n\n runInAction(() => {\n this.notificationProfiles = profiles\n })\n } catch (error) {\n console.error(`Error loading notification profiles: ${error}`)\n }\n }\n\n loadTransactionRules = async () => {\n try {\n const rules = await this.transactionApi.getTransactionRules()\n\n runInAction(() => {\n this.transactionRules = rules\n })\n } catch (error) {\n console.error(`Error loading transaction rules: ${error}`)\n }\n }\n\n sendEmailVerification = async () => {\n try {\n await this.api.sendEmailVerification()\n this.setAlert(this.copy.verification_sent_success, 'success')\n } catch (error) {\n console.error(`Error sending email verification: ${error}`)\n this.setAlert(this.copy.verification_sent_error, 'error')\n }\n }\n\n sendPhoneVerification = async () => {\n try {\n await this.api.sendPhoneVerification()\n this.setAlert(this.copy.verification_sent_success, 'success')\n } catch (error) {\n console.error(`Error sending phone verification: ${error}`)\n this.setAlert(this.copy.verification_sent_error, 'error')\n }\n }\n\n setAlert = (message: string, severity: SettingsAlertProps['severity'] = undefined) =>\n (this.alert = { message, severity })\n\n setSelectedRule = (rule?: TransactionRule) => {\n this.selectedRule = rule\n }\n\n updateDevice = async (device: Device) => {\n try {\n const updatedDevice = await this.api.updateDevice(device)\n\n const index = this.devices.findIndex((d) => d.guid === device.guid)\n if (index >= 0) {\n runInAction(() => {\n this.devices[index] = updatedDevice\n })\n }\n return { success: true }\n } catch (error) {\n console.error(`Error updating device: ${error}`)\n return { success: false }\n }\n }\n\n updateNotificationProfile = async (profile: NotificationProfile) => {\n try {\n const updatedProfile = await this.api.updateNotificationProfile(profile)\n\n const index = this.notificationProfiles.findIndex((p) => p.guid === profile.guid)\n if (index >= 0) {\n runInAction(() => {\n this.notificationProfiles[index] = updatedProfile\n })\n }\n } catch (error) {\n console.error(`Error updating notification profile: ${error}`)\n }\n }\n\n updateRuleCategory = async (rule: TransactionRule) => {\n this.transactionApi.updateTransactionRule(rule).then(() => {\n this.loadTransactionRules()\n })\n }\n\n updateRulePayee = async (rule: TransactionRule) => {\n this.transactionApi\n .updateTransactionRule(rule)\n .then(() => {\n this.setAlert(this.copy.edit_payee_success, 'success')\n this.loadTransactionRules()\n })\n .catch(() => {\n this.setAlert(this.copy.edit_payee_error, 'error')\n })\n }\n\n updateUser = async (user: User) => {\n this.globalStore.userStore\n .updateUser(user)\n .then(() => {\n this.setAlert(this.copy.information_updated_success, 'success')\n })\n .catch(() => {\n this.setAlert(this.copy.information_updated_error, 'error')\n })\n }\n\n updateUserCommunicationProfile = async (profile: UserCommunicationProfile) => {\n try {\n const updatedProfile = await this.api.updateUserCommunicationProfile(profile)\n\n this.globalStore.appDataStore.setUserCommunicationProfile(updatedProfile)\n } catch (error) {\n console.error(`Error occurred while updating user communication profile: ${error}`)\n }\n }\n\n verifyPhoneToken = async (sms_verification_token: string) => {\n try {\n const { verified } = await this.api.verifyPhoneToken(sms_verification_token)\n if (!verified) {\n throw new Error()\n }\n this.setAlert(this.copy.verified_phone_success, 'success')\n } catch (error) {\n console.error(`Error verifying phone token: ${error}`)\n this.setAlert(this.copy.verified_phone_error, 'error')\n }\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { endOfToday } from 'date-fns/endOfToday'\nimport { formatISO } from 'date-fns/formatISO'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { isBefore } from 'date-fns/isBefore'\nimport { startOfMonth } from 'date-fns/startOfMonth'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subDays } from 'date-fns/subDays'\n\nimport { BeatApi, TransactionApi } from '../api'\nimport { TABLE_CONST } from '../constants/Table'\nimport { COLUMN_NAMES, DEFAULT_TRANSACTION } from '../constants/Transaction'\nimport { TransactionType } from '../types'\nimport type { Beat, Tag, Tagging, Transaction, TransactionRule } from '../types'\nimport {\n buildDetailedTransactions,\n flattenTransactionsWithSplits,\n sortAndFilterTransactions,\n} from '../utils/TransactionUtils'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport type TransactionFilter = {\n accounts?: string[]\n dateRange?: { start: Date; end: Date }\n custom?: (value: Transaction) => boolean\n searchTerm?: string\n showSplits?: boolean\n}\n\nexport class TransactionStore {\n globalStore: GlobalStore\n uiStore: UiStore\n api = new TransactionApi('/', '')\n beatApi = new BeatApi('/', '')\n\n associatedBeats: Beat[] = []\n associatedBeatsLoaded: boolean = false\n associatedBeatsLoading: boolean = false\n transactions: Transaction[] = []\n transactionsLoaded: boolean = false\n transactionsLoading: boolean = false\n taggings: Tagging[] = []\n taggingsLoaded: boolean = false\n taggingsLoading: boolean = false\n tags: Tag[] = []\n tagsLoaded: boolean = false\n tagsLoading: boolean = false\n transactionRules: TransactionRule[] = []\n transactionRulesLoaded: boolean = false\n transactionRulesLoading: boolean = false\n transactionSplitting: boolean = false\n\n cachedStartDate: Date = subDays(startOfToday(), 90)\n filter: TransactionFilter = {}\n isLoading = true\n\n alert = ''\n\n sortColumn = COLUMN_NAMES.DATE\n sortDirection = TABLE_CONST.DESC\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.uiStore = new UiStore()\n this.api = new TransactionApi(\n globalStore.endpoint,\n globalStore.sessionToken,\n globalStore.onError,\n )\n this.beatApi = new BeatApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n\n makeAutoObservable(this)\n }\n\n loadTransactionData = async () => {\n if (!this.globalStore.accountStore.isAccountDataLoaded) {\n await this.globalStore.accountStore.loadAccountData()\n }\n if (!this.globalStore.categoryStore.categoriesLoaded) {\n await this.globalStore.categoryStore.loadCategories()\n }\n await Promise.all([\n this.loadAssociatedBeats(startOfMonth(new Date())),\n this.loadTags(),\n this.loadTaggings(),\n this.loadTransactionRules(),\n // By default loads 90 days of transactions\n this.loadTransactions(this.cachedStartDate),\n ])\n }\n\n get isTransactionDataLoaded(): boolean {\n return (\n this.associatedBeatsLoaded &&\n this.tagsLoaded &&\n this.taggingsLoaded &&\n this.transactionRulesLoaded &&\n this.transactionsLoaded\n )\n }\n\n get detailedTransactions(): Transaction[] {\n return this.isTransactionDataLoaded\n ? buildDetailedTransactions(\n this.transactions,\n this.globalStore.accountStore.visibleAccounts,\n this.globalStore.categoryStore.categories,\n this.taggings,\n )\n : []\n }\n\n get sortedTransactions(): Transaction[] {\n return sortAndFilterTransactions(\n this.filter,\n this.uiStore.expandedSplits,\n this.sortColumn,\n this.sortDirection,\n this.tags,\n this.detailedTransactions,\n )\n }\n\n get sortedTransactionsWithSplits(): Transaction[] {\n return flattenTransactionsWithSplits(this.sortedTransactions, this.detailedTransactions)\n }\n\n setAssociatedBeats = (beats: Beat[]) => {\n this.associatedBeats = beats\n this.associatedBeatsLoading = false\n this.associatedBeatsLoaded = true\n }\n\n setTaggings = (taggings: Tagging[]) => {\n this.taggings = taggings\n this.taggingsLoading = false\n this.taggingsLoaded = true\n }\n\n setTags = (tags: Tag[]) => {\n this.tags = tags\n this.tagsLoading = false\n this.tagsLoaded = true\n }\n\n setTransactionRules = (transactionRules: TransactionRule[]) => {\n this.transactionRules = transactionRules\n this.transactionRulesLoading = false\n this.transactionRulesLoaded = true\n }\n\n setTransactions = (transactions: Transaction[]) => {\n this.transactions = transactions\n this.transactionsLoading = false\n this.transactionsLoaded = true\n }\n\n setAlert = (alert: string) => {\n this.alert = alert\n }\n\n addTag = async (name: string) => {\n await this.api.addTag({ name } as Tag)\n await this.loadTags()\n }\n\n addTagging = async (tagGuid: string, transactionGuid: string) => {\n await this.api.addTagging({\n tag_guid: tagGuid,\n transaction_guid: transactionGuid,\n } as Tagging)\n }\n\n addOrUpdateTransactionRule = async (categoryGuid: string, transaction: Transaction) => {\n const existingRule = this.transactionRules.find(\n (rule: TransactionRule) => rule.guid === transaction.user_transaction_rule_guid,\n ) as TransactionRule | undefined\n\n if (existingRule) {\n await this.api.updateTransactionRule({\n ...existingRule,\n category_guid: categoryGuid,\n description: transaction.description,\n } as TransactionRule)\n } else {\n await this.api.addTransactionRule({\n category_guid: categoryGuid,\n description: transaction.description,\n match_description: transaction.description,\n } as TransactionRule)\n }\n await this.loadTransactionRules()\n }\n\n addTransaction = async (transaction: Transaction) => {\n const newTransaction = await this.api.addTransaction(transaction)\n\n if (newTransaction) {\n this.setTransactions([newTransaction, ...this.transactions])\n\n // Update the related account balance\n const balanceChange =\n newTransaction.transaction_type === TransactionType.CREDIT\n ? newTransaction.amount\n : -newTransaction.amount\n\n this.globalStore.accountStore.updateAccountBalance(newTransaction.account_guid, balanceChange)\n }\n }\n\n loadAssociatedBeats = async (fromDate?: Date) => {\n if (this.associatedBeatsLoading) return\n\n this.associatedBeatsLoading = true\n const fromDateISO = fromDate ? formatISO(fromDate, { representation: 'date' }) : undefined\n try {\n const beats = await this.beatApi.getBeatsWithAssociatedTransaction(fromDateISO)\n this.setAssociatedBeats(beats)\n } catch (error) {\n console.error(`Error occurred while loading associated beats: ${error}`)\n } finally {\n // Clear the in-flight flag even on failure so a later load (e.g. a widget\n // remount) can retry instead of being no-oped by the guard above, which would\n // leave isTransactionDataLoaded false and the list empty until a hard refresh.\n runInAction(() => {\n this.associatedBeatsLoading = false\n })\n }\n }\n\n loadTags = async () => {\n if (this.tagsLoading) return\n\n this.tagsLoading = true\n try {\n const tags = await this.api.getTags()\n this.setTags(tags)\n } catch (error) {\n console.error(`Error occurred while loading tags: ${error}`)\n } finally {\n runInAction(() => {\n this.tagsLoading = false\n })\n }\n }\n\n loadTaggings = async () => {\n if (this.taggingsLoading) return\n\n this.taggingsLoading = true\n try {\n const taggings = await this.api.getTaggings()\n this.setTaggings(taggings)\n } catch (error) {\n console.error(`Error occurred while loading taggings: ${error}`)\n } finally {\n runInAction(() => {\n this.taggingsLoading = false\n })\n }\n }\n\n loadTransactionRules = async () => {\n if (this.transactionRulesLoading) return\n\n this.transactionRulesLoading = true\n try {\n const transactionRules = await this.api.getTransactionRules()\n this.setTransactionRules(transactionRules)\n } catch (error) {\n // Catch so a rejection can't abort the Promise.all in loadTransactionData.\n console.error(`Error occurred while loading transaction rules: ${error}`)\n } finally {\n runInAction(() => {\n this.transactionRulesLoading = false\n })\n }\n }\n\n loadTransactions = async (startDate: Date = this.cachedStartDate) => {\n if (this.transactionsLoading) return\n\n this.setIsLoading(true)\n this.transactionsLoading = true\n\n try {\n const transactions = await this.api.getTransactionsByDateRange(\n getUnixTime(startDate),\n getUnixTime(endOfToday()),\n )\n this.setTransactions(transactions)\n // Advance the cache only after the range is actually loaded, so the invariant\n // \"we hold transactions back to cachedStartDate\" always holds.\n runInAction(() => {\n this.cachedStartDate = startDate\n })\n } catch (error) {\n console.error(`Error occurred while loading transactions: ${error}`)\n } finally {\n // See loadAssociatedBeats: clear the flag on failure so retries aren't no-oped.\n runInAction(() => {\n this.transactionsLoading = false\n })\n this.setIsLoading(false)\n }\n }\n\n modifyTransactionByAccountGuid = (guid: string, updates: Partial<Transaction>) => {\n this.transactions = this.transactions.map((txn) =>\n txn.account_guid === guid ? { ...txn, ...updates } : txn,\n )\n }\n\n removeTag = async (tagGuid: string) => {\n await this.api.removeTag(tagGuid)\n await this.loadTags()\n }\n\n removeTagging = async (taggingGuid: string) => {\n await this.api.removeTagging(taggingGuid)\n }\n\n removeTransaction = async (transactionGuid: string) => {\n await this.api.removeTransaction(transactionGuid)\n\n const index = this.transactions.findIndex((t: Transaction) => t.guid === transactionGuid)\n\n if (index >= 0) {\n const updatedTransactions = [...this.transactions]\n updatedTransactions.splice(index, 1)\n this.setTransactions(updatedTransactions)\n }\n }\n\n setFilter = (filter: TransactionFilter) => {\n this.filter = filter\n\n // Only reload if the new start date is prior to the cached start date; end date\n // is always today. loadTransactions advances cachedStartDate on success, so we\n // must not advance it here (a skipped/failed load would leave the list empty).\n if (filter.dateRange && isBefore(filter.dateRange.start, this.cachedStartDate)) {\n this.loadTransactions(filter.dateRange.start)\n }\n }\n\n setIsLoading = (isLoading: boolean) => (this.isLoading = isLoading)\n\n splitTransaction = async (transaction: Transaction, splits: Transaction[]) => {\n if (this.transactionSplitting) return\n this.transactionSplitting = true\n\n try {\n const updatedTransaction = await this.api.updateTransaction(transaction)\n const children = [] as Transaction[]\n\n for (let i = 0; i < splits.length; i++) {\n const child = await this.api.addTransaction(splits[i])\n children.push(child)\n }\n\n const index = this.transactions.findIndex((t: Transaction) => t.guid === transaction.guid)\n\n if (index >= 0) {\n // Remove old parent and any existing children\n const filtered = this.transactions.filter(\n (t) => t.guid !== transaction.guid && t.parent_guid !== transaction.guid,\n )\n\n // Insert updated parent + new children at original position\n this.setTransactions([\n ...filtered.slice(0, index),\n updatedTransaction,\n ...children,\n ...filtered.slice(index),\n ])\n }\n } finally {\n this.transactionSplitting = false\n }\n }\n\n unSplitTransaction = async (guid: string) => {\n const children = this.transactions.filter((t) => t.parent_guid === guid)\n\n await this.api.removeTransactionSplit(guid)\n\n // Remove children\n const transactions = [...this.transactions]\n children.forEach((child) => {\n const index = transactions.findIndex((t) => t.guid === child.guid)\n\n if (index >= 0) {\n transactions.splice(index, 1)\n }\n })\n\n // Update parent\n const index = transactions.findIndex((t) => t.guid === guid)\n const transaction = transactions[index]\n transaction.has_been_split = false\n if (index >= 0) {\n this.setTransactions([\n ...transactions.slice(0, index),\n transaction,\n ...transactions.slice(index + 1),\n ])\n }\n }\n\n updateTaggings = async (tagGuids: string[], transactionGuid: string) => {\n const currentTaggings = this.taggings.filter((t) => t.transaction_guid === transactionGuid)\n\n const currentTagGuids = new Set(currentTaggings.map((t) => t.tag_guid))\n const incomingTagGuids = new Set(tagGuids)\n\n // Add new taggings that don't already exist\n for (const tagGuid of tagGuids) {\n if (!currentTagGuids.has(tagGuid)) {\n await this.addTagging(tagGuid, transactionGuid)\n }\n }\n\n // Remove taggings that are no longer needed\n for (const tagging of currentTaggings) {\n if (!incomingTagGuids.has(tagging.tag_guid)) {\n await this.removeTagging(tagging.guid)\n }\n }\n\n await this.loadTaggings()\n }\n\n updateTag = async (tag: Tag) => {\n await this.api.updateTag(tag)\n await this.loadTags()\n }\n\n updateTransaction = async (transaction: Transaction) => {\n const updatedTransaction = await this.api.updateTransaction(transaction)\n\n const index = this.transactions.findIndex((t: Transaction) => t.guid === transaction.guid)\n\n if (index >= 0) {\n this.setTransactions([\n ...this.transactions.slice(0, index),\n updatedTransaction,\n ...this.transactions.slice(index + 1),\n ])\n }\n }\n\n // This is used for loading the transactions list on demand, on clicking the different transactions of the insightful beats.\n loadEmbeddedInstanceTransactions = async (fromDate: Date) => {\n try {\n const transactions = await this.api.getTransactionsByDateRange(\n getUnixTime(fromDate),\n getUnixTime(endOfToday()),\n )\n this.cachedStartDate = fromDate\n this.transactions = transactions\n } catch (error) {\n console.error(`Error occurred while loading embedded instance transactions: ${error}`)\n }\n }\n}\n\nexport class UiStore {\n beginDate = startOfMonth(new Date())\n endDate = endOfMonth(new Date())\n\n expandedSplits = [] as string[]\n height = 550\n width = 1000\n shouldDisableDrawerScroll = false\n\n searchValue = ''\n selectedAccountGuids = [] as string[]\n\n manualTransaction: Transaction = DEFAULT_TRANSACTION\n isAmountValid = false\n\n showInsights = false\n\n constructor() {\n makeAutoObservable(this)\n }\n\n setDateRange = (beginDate: Date, endDate: Date) => {\n this.beginDate = beginDate\n this.endDate = endDate\n }\n\n setIsAmountValid = (valid: boolean) => (this.isAmountValid = valid)\n\n setSearchValue = (searchValue: string) => (this.searchValue = searchValue)\n\n setSelectedAccountGuids = (accountGuids: string[]) => (this.selectedAccountGuids = accountGuids)\n\n setShouldDisableDrawerScroll = (shouldDisable: boolean) =>\n (this.shouldDisableDrawerScroll = shouldDisable)\n\n setShowInsights = (showInsights: boolean) => {\n this.showInsights = showInsights\n }\n\n setSize = (height: number, width: number) => {\n this.height = height\n this.width = width\n }\n\n toggleSplit = (guid: string) => {\n const expandedSplits = [...this.expandedSplits]\n const index = this.expandedSplits.findIndex((splitGuid) => splitGuid === guid)\n\n if (index >= 0) {\n expandedSplits.splice(index, 1)\n } else {\n expandedSplits.push(guid)\n }\n\n this.expandedSplits = expandedSplits\n }\n\n clearExpandedSplits = () => {\n if (this.expandedSplits.length === 0) return\n this.expandedSplits = []\n }\n\n updateManualTransaction = (manualTransaction: Transaction) => {\n this.manualTransaction = manualTransaction\n }\n}\n","import { makeAutoObservable } from 'mobx'\nimport { addSeconds } from 'date-fns/addSeconds'\nimport { differenceInCalendarMonths } from 'date-fns/differenceInCalendarMonths'\nimport { endOfMonth } from 'date-fns/endOfMonth'\nimport { subMonths } from 'date-fns/subMonths'\n\nimport type { DateRange, DetailedCategoryWithTransactions } from '../types'\nimport { DATE_FORMATS_INTL, formatDate } from '../constants'\nimport {\n buildCategoryDetailsChartData,\n filterAndSortCategoriesWithTransactions,\n} from '../utils/TrendsUtil'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class TrendsStore {\n globalStore: GlobalStore\n selectedCategoryData: DetailedCategoryWithTransactions | null = null\n selectedDateRange: DateRange\n visibleListLength: number = 5\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.selectedDateRange = {\n start: addSeconds(endOfMonth(subMonths(new Date(), 6)), 1),\n end: endOfMonth(new Date()),\n }\n makeAutoObservable(this)\n }\n\n setSelectedCategoryData = (data: DetailedCategoryWithTransactions | null) => {\n this.selectedCategoryData = data\n }\n\n setSelectedDateRange = (dateRange: DateRange) => {\n this.selectedDateRange = dateRange\n }\n\n setVisibleListLength = (length: number) => {\n this.visibleListLength = length\n }\n\n get sortedDetailedCategoriesWithTransactions(): DetailedCategoryWithTransactions[] {\n return filterAndSortCategoriesWithTransactions(\n this.globalStore.categoryStore.detailedCategoriesWithTransactions,\n )\n }\n\n get selectedDateRangeMonthCount(): number {\n return differenceInCalendarMonths(this.selectedDateRange.end, this.selectedDateRange.start) + 1\n }\n\n get selectedDateRangeMonthRange(): string {\n const startMonth = formatDate(this.selectedDateRange.start, DATE_FORMATS_INTL.MONTH_LONG)\n const endMonth = formatDate(this.selectedDateRange.end, DATE_FORMATS_INTL.MONTH_LONG)\n return `${startMonth} - ${endMonth}`\n }\n\n get visibleCategories(): DetailedCategoryWithTransactions[] {\n return this.sortedDetailedCategoriesWithTransactions.slice(0, this.visibleListLength)\n }\n\n get collapsedCategories(): DetailedCategoryWithTransactions[] {\n return this.sortedDetailedCategoriesWithTransactions.slice(this.visibleListLength)\n }\n\n get categoryDetailsChartData() {\n return buildCategoryDetailsChartData(\n this.selectedCategoryData,\n this.selectedDateRangeMonthCount,\n )\n }\n}\n","import { makeAutoObservable } from 'mobx'\n\nimport { UserApi } from '../api'\nimport type { User, UserFeature, UserProfile } from '../types'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class UserStore {\n globalStore: GlobalStore\n api: UserApi = new UserApi('/', '')\n\n userFeatures: UserFeature[] = []\n userFeaturesLoaded: boolean = false\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new UserApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n\n makeAutoObservable(this)\n }\n\n get userProfile() {\n return this.globalStore.appDataStore.userProfile\n }\n\n get user() {\n return this.globalStore.appDataStore.user\n }\n\n setUserFeatures = (features: UserFeature[]) => {\n this.userFeatures = features\n this.userFeaturesLoaded = true\n }\n\n loadUserFeatures = async () => {\n try {\n const features = await this.api.getUserFeatures()\n this.setUserFeatures(features)\n } catch (e) {\n console.error(`Error occurred while loading user features: ${e}`)\n }\n }\n\n updateUser = async (user: User) => {\n try {\n const updatedUser = await this.api.updateUser(user)\n\n this.globalStore.appDataStore.setUser(updatedUser)\n } catch (error) {\n console.error(`Error updating User: ${error}`)\n }\n }\n\n updateUserProfile = async (userProfile: UserProfile) => {\n try {\n const updatedProfile = await this.api.updateUserProfile(userProfile)\n\n this.globalStore.appDataStore.setUserProfile(updatedProfile)\n } catch (error) {\n console.error(`Error occurred while updating user profile: ${error}`)\n }\n }\n}\n"],"names":["AccountApi","endpoint","token","onError","Fetch","account","ApiEndpoints","data","error","accountGuid","guid","accountGuids","AppDataApi","BannerApi","bullseyeEndpoint","userGuid","path","BudgetsApi","category","amount","parentGuid","budget","merchantGuid","merchantBudgetGuid","CategoryApi","startDate","endDate","accounts","url","FinstrongApi","birthYear","GoalApi","goal","retirementAccount","goals","profile","HelpApi","ticket","HoldingApi","holding","MerchantApi","searchValues","guids","page","perPage","value","NotificationApi","obj","notification","channel","RepeatingTransactionsApi","repeatingTransaction","SettingsApi","item","sms_verification_token","res","device","notificationProfile","userCommunicationProfile","TransactionApi","tag","tagging","transaction","rule","beginDate","accountsList","acc","i","categoryGuid","categoryGuids","UserApi","e","user","userProfile","WidgetApi","req","AccountStore","globalStore","UiStore","makeAutoObservable","userFeatures","excludeExternal","isFeatureEnabled","excludeHeld","augmentAccounts","typeMap","accountType","AccountType","total","a","eligibleTypes","AccountSubType","members","institutions","newAccount","runInAction","response","mergedAccount","account2Index","account1Index","deletedIndex","updatedAccount","updatedAccountIndex","balanceChange","accountMap","accountUpdates","isSelected","updatedAccounts","index","UiStore$4","member","AppDataStore","appData","banner","AnalyticsStore","forceReload","posthog","surveys","survey","s","orderArray","arr1","arr2","prop","order","direction","item1","item2","transformOfferIntoBeatLikeObject","offer","BeatStore","BeatApi","beats","beatLikeOffers","o","filter","templates","filteredBeats","beat","template","BudgetsStore","startOfMonth","startOfToday","endOfMonth","reaction","detailedBudgets","findBudget","subBudget","findSubBudget","augmentBudgets","CategoryGuids","b","curr","budgets","alert","dateRange","theme","categories","budgetsToDelete","c","budgetToDelete","updatedBudget","eachMerchantBudget","merchantBudgets","newMerchantBudget","merchantBudget","updatedMerchantBudget","CashflowStore","updatedUserProfile","UiStore$3","addDays","selectedAccountGuids","showAvailableBalance","getAccountStartingBalance","differenceInDays","isBefore","CategoryStore","augmentCategories","getDetailedCategoryTransactions","totals","name","getUnixTime","start","subMonths","end","CategoryGuidToName","UiStore$2","shouldDisable","showSelected","unselectable","text","callback","ConnectStore","widget","mode","rest","DebtsStore","debtAccounts","debtGoals","filteredDebtAccounts","loadDebts","d","p","payment","UiStore$1","DebtPriority","interest_rate","monthly_payment","isLoading","priority","augmentChartData","averageHealthScores","formatDate","DATE_FORMATS_INTL","augmentSpendingFeeTransactions","spendingFeeTransactions","FinstrongStore","isSpendingInitialized","isIncomeInitialized","needHealthScoreChangeReport","healthScore","healthScoreChange","currentScore","oldScore","monthlySummaries","debtSpend","income","healthScoreChangeReports","format","fromUnixTime","peerScore","augmentedChartData","spendingFeeTransaction","organizedSpendingFeeTransactions","spendTransaction","DefaultAppConfig","GlobalStore","appConfig","onStoreUpdate","GlobalCopyStore","GoalStore","HelpStore","HoldingStore","MerchantStore","NetWorthStore","NotificationStore","RecurringTransactionsStore","SettingsStore","TransactionStore","TrendsStore","UserStore","GlobalUiStore","autorun","transactions","change","associatedBeats","transactionRules","visibleAccounts","isIncluded","selectedMonth","getMonth","nextMonth","addMonths","currentMonth","GlobalCopyApi","namespace","translationKey","newCopy","goalsCopy","userBirthday","TrackType","getProjectedRetirementDate","ongoingGoals","priorityOrder","aIndex","bIndex","retirementGoals","retirementGoalAccounts","monthlyCashFlowProfile","newGoal","newAccounts","g","rga","reordered","updatedGoal","updatedRetirementGoal","updatedProfile","isCategoryAccessibleByProfile","flag","HelpUtil","categoryList","accessibleCategories","el","HELP_CATEGORIES","updatedCategory","topicKey","message","severity","client_communication_profile","client_profile","category_list","AnalysisType","mapDataToPercentageGrid","analysisChartData","analysisDetailsData","holdings","analysisType","updatedHolding","updatedIndex","searchValue","merchants","merchant","filterAccounts","buildChartData","getLatestNetWorthData","buildGainsLosses","assets","liabilities","totalAssets","totalLiabilities","buildAssetsLiabilities","monthlyAccountBalances","flattenBalances","sortByYearMonthAscending","balances","months","observable","n","filterRecentNotifications","notifications","currentMonthFilter","date","recurrence","isWithinInterval","recurrenceTotalReducer","augmentRepeatingTransactions","buildAllRecurrences","r","RecurrenceType","RecurrenceStatus","isAfter","subDays","isSameDay","rt","repeating","day","repeatingTransactions","newRepeating","updatedTransaction","repeatingTransactionGuid","PARENT_ENTITY","getProfileLabel","notificationType","copy","BudgetNotificationTypes","AccountNotificationTypes","InsightNotificationTypes","augmentNotificationProfiles","clientCommunicationsProfile","profiles","userCommunicationsProfile","detailedProfiles","clientEmailEnabled","clientSmsEnabled","clientPushEnabled","userEmailOptedOut","userSmsOptedOut","userPushOptedOut","label","children","child","deliveryMethods","ccp","np","devices","rules","updatedDevice","verified","COLUMN_NAMES","TABLE_CONST","buildDetailedTransactions","sortAndFilterTransactions","flattenTransactionsWithSplits","taggings","tags","tagGuid","transactionGuid","existingRule","newTransaction","TransactionType","fromDate","fromDateISO","formatISO","endOfToday","updates","txn","taggingGuid","t","updatedTransactions","splits","filtered","tagGuids","currentTaggings","currentTagGuids","incomingTagGuids","DEFAULT_TRANSACTION","valid","showInsights","height","width","expandedSplits","splitGuid","manualTransaction","addSeconds","length","filterAndSortCategoriesWithTransactions","differenceInCalendarMonths","startMonth","endMonth","buildCategoryDetailsChartData","features","updatedUser"],"mappings":"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"}
|