@mx-cartographer/experiences 9.3.5 → 9.3.7-alpha.al0

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 CHANGED
@@ -1,3 +1,11 @@
1
+ ## [9.3.7] - 08-19-2026
2
+
3
+ - **FIXED** - Duplicate budget bubbles rendered when creating a budget due to a race condition between the HTTP POST response and the concurrent WebSocket creation event; `BudgetsStore` now performs idempotent upserts and deduplicates budgets and merchant budgets by GUID
4
+
5
+ ## [9.3.6] - 08-12-2026
6
+
7
+ - **ADDED** - Creating the new TransparentOverdraftV2 insight
8
+
1
9
  ## [9.3.5] - 08-12-2026
2
10
 
3
11
  - **FIXED** - Transaction detail view showed transfer/credit amounts (e.g. an account-to-account transfer deposit) as an unsigned, default-colored amount because the header keyed off `isIncome` (true only for the Income category) while the list keyed off `transaction_type`; the detail view now uses `transaction_type === CREDIT` so credits render as `+$Amount` in success green, consistent with the transactions list (MEW-3703)
@@ -1,17 +1,17 @@
1
- import { CategoryGuids as i } from "../constants/Category.es.js";
1
+ import { CategoryGuids as a } from "../constants/Category.es.js";
2
2
  import { BudgetsApi as o } from "../api/BudgetsApi.es.js";
3
- import { augmentBudgets as u, findBudget as c, findSubBudget as h } from "../utils/BudgetUtil.es.js";
3
+ import { augmentBudgets as g, findBudget as c, findSubBudget as h } from "../utils/BudgetUtil.es.js";
4
4
  import { endOfMonth as l } from "date-fns/endOfMonth";
5
- import { startOfMonth as p } from "date-fns/startOfMonth";
6
- import { startOfToday as g } from "date-fns/startOfToday";
7
- import { makeAutoObservable as B, reaction as S, runInAction as d } from "mobx";
8
- var x = class {
5
+ import { startOfMonth as B } from "date-fns/startOfMonth";
6
+ import { startOfToday as n } from "date-fns/startOfToday";
7
+ import { makeAutoObservable as p, reaction as f, runInAction as i } from "mobx";
8
+ var M = class {
9
9
  api = new o("/", "");
10
10
  globalStore;
11
11
  alert = "";
12
12
  dateRange = {
13
- start: p(g()),
14
- end: l(g())
13
+ start: B(n()),
14
+ end: l(n())
15
15
  };
16
16
  budgets = [];
17
17
  selectedBudget;
@@ -20,10 +20,10 @@ var x = class {
20
20
  theme = {};
21
21
  merchantBudgets = [];
22
22
  constructor(t) {
23
- this.globalStore = t, this.api = new o(t.endpoint, t.sessionToken, t.onError), B(this);
23
+ this.globalStore = t, this.api = new o(t.endpoint, t.sessionToken, t.onError), p(this);
24
24
  }
25
25
  loadBudgetData = async () => {
26
- this.globalStore.recurringTransactionsStore.isDataLoaded || await this.globalStore.recurringTransactionsStore.loadRepeatingTransactionData(), await this.loadBudgets(), S(() => this.detailedBudgets, (t) => {
26
+ this.globalStore.recurringTransactionsStore.isDataLoaded || await this.globalStore.recurringTransactionsStore.loadRepeatingTransactionData(), await this.loadBudgets(), f(() => this.detailedBudgets, (t) => {
27
27
  if (t) {
28
28
  const e = this.selectedBudget;
29
29
  e && (this.selectedBudget = c(t, e.guid));
@@ -33,10 +33,10 @@ var x = class {
33
33
  });
34
34
  };
35
35
  get detailedBudgets() {
36
- return u(this.budgets.filter((t) => t.category_guid !== i.INCOME && t.category_guid !== i.TRANSFER && t.category_guid !== i.INVESTMENTS), this.globalStore.categoryStore.detailedCategories, this.globalStore.copyStore.copy.budgets, this.theme).sort((t, e) => t.percentage > e.percentage ? -1 : t.percentage < e.percentage ? 1 : 0);
36
+ return g(this.budgets.filter((t) => t.category_guid !== a.INCOME && t.category_guid !== a.TRANSFER && t.category_guid !== a.INVESTMENTS), this.globalStore.categoryStore.detailedCategories, this.globalStore.copyStore.copy.budgets, this.theme).sort((t, e) => t.percentage > e.percentage ? -1 : t.percentage < e.percentage ? 1 : 0);
37
37
  }
38
38
  get incomeBudget() {
39
- return u(this.budgets.filter((t) => !t.parent_guid), this.globalStore.categoryStore.detailedCategories, this.globalStore.copyStore.copy.budgets, this.theme).reduce((t, e) => e.category_guid !== i.INCOME ? t : !t || e.percentage > t.percentage ? e : t, void 0)?.amount;
39
+ return g(this.budgets.filter((t) => !t.parent_guid), this.globalStore.categoryStore.detailedCategories, this.globalStore.copyStore.copy.budgets, this.theme).reduce((t, e) => e.category_guid !== a.INCOME ? t : !t || e.percentage > t.percentage ? e : t, void 0)?.amount;
40
40
  }
41
41
  get unbudgetedCategories() {
42
42
  return this.globalStore.categoryStore.spendCategories.filter((t) => !this.detailedBudgets.find((e) => e.category_guid === t.guid));
@@ -47,8 +47,9 @@ var x = class {
47
47
  addBudget = async (t, e, r = null) => {
48
48
  try {
49
49
  const s = await this.api.addBudget(t, e, r);
50
- d(() => {
51
- this.budgets.push(s);
50
+ i(() => {
51
+ const d = this.budgets.findIndex((u) => u.guid === s.guid);
52
+ d >= 0 ? this.budgets[d] = s : this.budgets.push(s);
52
53
  });
53
54
  } catch (s) {
54
55
  console.error("Error adding budget:", s), this.globalStore.captureException(s, { store: "BudgetsStore" });
@@ -56,7 +57,7 @@ var x = class {
56
57
  };
57
58
  deleteBudget = async (t) => {
58
59
  try {
59
- await this.api.deleteBudget(t), d(() => {
60
+ await this.api.deleteBudget(t), i(() => {
60
61
  const e = this.budgets.findIndex((r) => r.guid === t);
61
62
  e >= 0 && this.budgets.splice(e, 1);
62
63
  });
@@ -74,7 +75,8 @@ var x = class {
74
75
  };
75
76
  setAlert = (t) => this.alert = t;
76
77
  setBudgets = (t) => {
77
- this.budgets = t, this.isDataLoaded = !0;
78
+ const e = /* @__PURE__ */ new Set();
79
+ this.budgets = t.filter((r) => !r.guid || !e.has(r.guid) ? (r.guid && e.add(r.guid), !0) : !1), this.isDataLoaded = !0;
78
80
  };
79
81
  setDateRange = (t) => this.dateRange = t;
80
82
  setSelectedBudget = (t) => this.selectedBudget = t;
@@ -83,7 +85,7 @@ var x = class {
83
85
  recalculateBudgets = async (t) => {
84
86
  try {
85
87
  for (const r of t) {
86
- const s = this.budgets.find((a) => a.category_guid === r.guid);
88
+ const s = this.budgets.find((d) => d.category_guid === r.guid);
87
89
  s ? await this.api.updateBudget({
88
90
  ...s,
89
91
  amount: r.totalAverageAmount
@@ -105,7 +107,7 @@ var x = class {
105
107
  updateBudget = async (t) => {
106
108
  try {
107
109
  const e = await this.api.updateBudget(t);
108
- d(() => {
110
+ i(() => {
109
111
  const r = this.budgets.findIndex((s) => s.guid === t.guid);
110
112
  r >= 0 && (this.budgets[r] = e);
111
113
  });
@@ -115,13 +117,15 @@ var x = class {
115
117
  };
116
118
  getMerchantBudgetByMerchantGuid = (t) => this.merchantBudgets.find((e) => e?.merchant_guid === t);
117
119
  setMerchantBudgets = (t) => {
118
- this.merchantBudgets = t;
120
+ const e = /* @__PURE__ */ new Set();
121
+ this.merchantBudgets = t.filter((r) => !r.guid || !e.has(r.guid) ? (r.guid && e.add(r.guid), !0) : !1);
119
122
  };
120
123
  addMerchantBudget = async (t, e) => {
121
124
  try {
122
125
  const r = await this.api.addMerchantBudget(t, e);
123
- return d(() => {
124
- this.merchantBudgets.push(r);
126
+ return i(() => {
127
+ const s = this.merchantBudgets.findIndex((d) => d.guid === r.guid);
128
+ s >= 0 ? this.merchantBudgets[s] = r : this.merchantBudgets.push(r);
125
129
  }), { isSuccess: !0 };
126
130
  } catch (r) {
127
131
  return console.error("Error adding merchant budget:", r), this.globalStore.captureException(r, { store: "BudgetsStore" }), { isSuccess: !1 };
@@ -130,9 +134,9 @@ var x = class {
130
134
  updateMerchantBudget = async (t) => {
131
135
  try {
132
136
  const { guid: e, amount: r } = t, s = await this.api.updateMerchantBudget(e, r);
133
- return d(() => {
134
- const a = this.merchantBudgets.findIndex((n) => n.guid === t.guid);
135
- a >= 0 && (this.merchantBudgets[a] = s);
137
+ return i(() => {
138
+ const d = this.merchantBudgets.findIndex((u) => u.guid === t.guid);
139
+ d >= 0 && (this.merchantBudgets[d] = s);
136
140
  }), { isSuccess: !0 };
137
141
  } catch (e) {
138
142
  return console.error("Error updating merchant budget:", e), this.globalStore.captureException(e, { store: "BudgetsStore" }), { isSuccess: !1 };
@@ -140,7 +144,7 @@ var x = class {
140
144
  };
141
145
  deleteMerchantBudget = async (t) => {
142
146
  try {
143
- return await this.api.deleteMerchantBudget(t), d(() => {
147
+ return await this.api.deleteMerchantBudget(t), i(() => {
144
148
  this.merchantBudgets = this.merchantBudgets.filter((e) => e.guid !== t);
145
149
  }), { isSuccess: !0 };
146
150
  } catch (e) {
@@ -149,7 +153,7 @@ var x = class {
149
153
  };
150
154
  };
151
155
  export {
152
- x as BudgetsStore
156
+ M as BudgetsStore
153
157
  };
154
158
 
155
159
  //# sourceMappingURL=BudgetsStore.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BudgetsStore.es.js","names":[],"sources":["../../../src/core/stores/BudgetsStore.ts"],"sourcesContent":["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 this.globalStore.captureException(error, { store: 'BudgetsStore' })\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 this.globalStore.captureException(error, { store: 'BudgetsStore' })\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 this.globalStore.captureException(error, { store: 'BudgetsStore' })\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 this.globalStore.captureException(error, { store: 'BudgetsStore' })\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 this.globalStore.captureException(error, { store: 'BudgetsStore' })\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 this.globalStore.captureException(error, { store: 'BudgetsStore' })\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 this.globalStore.captureException(error, { store: 'BudgetsStore' })\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 this.globalStore.captureException(error, { store: 'BudgetsStore' })\n return { isSuccess: false }\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"BudgetsStore.es.js","names":[],"sources":["../../../src/core/stores/BudgetsStore.ts"],"sourcesContent":["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 const index = this.budgets.findIndex((b) => b.guid === budget.guid)\n if (index >= 0) {\n this.budgets[index] = budget\n } else {\n this.budgets.push(budget)\n }\n })\n } catch (error) {\n console.error('Error adding budget:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\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 this.globalStore.captureException(error, { store: 'BudgetsStore' })\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 this.globalStore.captureException(error, { store: 'BudgetsStore' })\n throw error\n }\n }\n\n setAlert = (alert: string) => (this.alert = alert)\n\n setBudgets = (budgets: Budget[]) => {\n const seen = new Set<string>()\n this.budgets = budgets.filter((budget) => {\n if (!budget.guid || !seen.has(budget.guid)) {\n if (budget.guid) seen.add(budget.guid)\n return true\n }\n return false\n })\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 this.globalStore.captureException(error, { store: 'BudgetsStore' })\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 this.globalStore.captureException(error, { store: 'BudgetsStore' })\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 const seen = new Set<string>()\n this.merchantBudgets = merchantBudgets.filter((mb) => {\n if (!mb.guid || !seen.has(mb.guid)) {\n if (mb.guid) seen.add(mb.guid)\n return true\n }\n return false\n })\n }\n\n addMerchantBudget = async (merchantGuid: string, amount: number) => {\n try {\n const newMerchantBudget = await this.api.addMerchantBudget(merchantGuid, amount)\n\n runInAction(() => {\n const index = this.merchantBudgets.findIndex((b) => b.guid === newMerchantBudget.guid)\n if (index >= 0) {\n this.merchantBudgets[index] = newMerchantBudget\n } else {\n this.merchantBudgets.push(newMerchantBudget)\n }\n })\n return { isSuccess: true }\n } catch (error) {\n console.error('Error adding merchant budget:', error)\n this.globalStore.captureException(error, { store: 'BudgetsStore' })\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 this.globalStore.captureException(error, { store: 'BudgetsStore' })\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 this.globalStore.captureException(error, { store: 'BudgetsStore' })\n return { isSuccess: false }\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { default as React } from 'react';
2
+ import { CommonBeatProps } from '../../../types/CommonBeat';
3
+ export interface TransparentOverdraftV2Props extends CommonBeatProps {
4
+ accountName: string;
5
+ formattedProjectedBalance: string;
6
+ projectedBalanceLabel: string;
7
+ }
8
+ export declare const TransparentOverdraftV2: React.FC<TransparentOverdraftV2Props>;
@@ -0,0 +1,50 @@
1
+ import { InsightButton as i } from "../../shared/InsightsCard/InsightButton.es.js";
2
+ import { BeatCardMUI as s } from "../../shared/InsightsCard/BeatCardMUI.es.js";
3
+ import { TransparentOverdraftV2Body as c } from "./TransparentOverdraftV2Body.es.js";
4
+ import "react";
5
+ import n from "@mui/material/Stack";
6
+ import { Text as f } from "@mxenabled/mxui";
7
+ import { jsx as r, jsxs as h } from "react/jsx-runtime";
8
+ var T = ({ accountName: m, beat: t, buttonProps: e, formattedProjectedBalance: d, isMini: o, projectedBalanceLabel: p, ...a }) => /* @__PURE__ */ r(s, {
9
+ ...a,
10
+ beat: t,
11
+ button: /* @__PURE__ */ h(n, {
12
+ sx: { gap: 8 },
13
+ children: [/* @__PURE__ */ r(i, {
14
+ ...e,
15
+ beat: t
16
+ }), /* @__PURE__ */ r(i, {
17
+ ...e,
18
+ beat: t,
19
+ hide: !t.supporting_action,
20
+ primary: !1
21
+ })]
22
+ }),
23
+ header: {
24
+ ...a.header,
25
+ subHeader: /* @__PURE__ */ r(n, {
26
+ alignItems: "center",
27
+ direction: "row",
28
+ sx: {
29
+ gap: 4,
30
+ mt: 4
31
+ },
32
+ children: /* @__PURE__ */ r(f, {
33
+ sx: { color: "text.secondary" },
34
+ variant: "body2",
35
+ children: m
36
+ })
37
+ })
38
+ },
39
+ isMini: o,
40
+ children: /* @__PURE__ */ r(c, {
41
+ formattedProjectedBalance: d,
42
+ isMini: o ?? !1,
43
+ projectedBalanceLabel: p
44
+ })
45
+ });
46
+ export {
47
+ T as TransparentOverdraftV2
48
+ };
49
+
50
+ //# sourceMappingURL=TransparentOverdraftV2.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransparentOverdraftV2.es.js","names":[],"sources":["../../../../../src/insights/components/insights/TransparentOverdraftV2/TransparentOverdraftV2.tsx"],"sourcesContent":["import React from 'react'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport Stack from '@mui/material/Stack'\n\nimport { CommonBeatProps } from '../../../types/CommonBeat'\nimport { BeatCardMUI } from '../../shared/InsightsCard/BeatCardMUI'\nimport { InsightButton } from '../../shared/InsightsCard/InsightButton'\n\nimport { TransparentOverdraftV2Body } from './TransparentOverdraftV2Body'\n\nexport interface TransparentOverdraftV2Props extends CommonBeatProps {\n accountName: string\n formattedProjectedBalance: string\n projectedBalanceLabel: string\n}\n\nexport const TransparentOverdraftV2: React.FC<TransparentOverdraftV2Props> = ({\n accountName,\n beat,\n buttonProps,\n formattedProjectedBalance,\n isMini,\n projectedBalanceLabel,\n ...restProps\n}) => {\n return (\n <BeatCardMUI\n {...restProps}\n beat={beat}\n button={\n <Stack sx={{ gap: 8 }}>\n <InsightButton {...buttonProps} beat={beat} />\n <InsightButton\n {...buttonProps}\n beat={beat}\n hide={!beat.supporting_action}\n primary={false}\n />\n </Stack>\n }\n header={{\n ...restProps.header,\n subHeader: (\n <Stack alignItems=\"center\" direction=\"row\" sx={{ gap: 4, mt: 4 }}>\n {/* Remove InstitutionLogo until the V2 payload carries institution_guid */}\n <Text sx={{ color: 'text.secondary' }} variant=\"body2\">\n {accountName}\n </Text>\n </Stack>\n ),\n }}\n isMini={isMini}\n >\n <TransparentOverdraftV2Body\n formattedProjectedBalance={formattedProjectedBalance}\n isMini={isMini ?? false}\n projectedBalanceLabel={projectedBalanceLabel}\n />\n </BeatCardMUI>\n )\n}\n"],"mappings":";;;;;;;AAkBA,IAAa,IAAA,CAAiE,EAC5E,aAAA,GACA,MAAA,GACA,aAAA,GACA,2BAAA,GACA,QAAA,GACA,uBAAA,GACA,GAAG,EAAA,MAGD,gBAAA,EAAC,GAAD;AAAA,EACE,GAAI;AAAA,EACE,MAAA;AAAA,EACN,QACE,gBAAA,EAAC,GAAD;AAAA,IAAO,IAAI,EAAE,KAAK,EAAE;AAAA,IAApB,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,MAAe,GAAI;AAAA,MAAmB,MAAA;AAAA,IAAO,CAAA,GAC7C,gBAAA,EAAC,GAAD;AAAA,MACE,GAAI;AAAA,MACE,MAAA;AAAA,MACN,MAAM,CAAC,EAAK;AAAA,MACZ,SAAS;AAAA,IACV,CAAA,CACI;AAAA;EAET,QAAQ;AAAA,IACN,GAAG,EAAU;AAAA,IACb,WACE,gBAAA,EAAC,GAAD;AAAA,MAAO,YAAW;AAAA,MAAS,WAAU;AAAA,MAAM,IAAI;AAAA,QAAE,KAAK;AAAA,QAAG,IAAI;AAAA,MAAE;AAAA,MAE7D,UAAA,gBAAA,EAAC,GAAD;AAAA,QAAM,IAAI,EAAE,OAAO,iBAAiB;AAAA,QAAG,SAAQ;AAAA,QAC5C,UAAA;AAAA,MACG,CAAA;AAAA,IACD,CAAA;AAAA,EAEX;AAAA,EACQ,QAAA;AAAA,EAER,UAAA,gBAAA,EAAC,GAAD;AAAA,IAC6B,2BAAA;AAAA,IAC3B,QAAQ,KAAU;AAAA,IACK,uBAAA;AAAA,EACxB,CAAA;AACU,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { default as React } from 'react';
2
+ interface TransparentOverdraftV2BodyProps {
3
+ formattedProjectedBalance: string;
4
+ isMini: boolean;
5
+ projectedBalanceLabel: string;
6
+ }
7
+ export declare const TransparentOverdraftV2Body: React.FC<TransparentOverdraftV2BodyProps>;
8
+ export {};
@@ -0,0 +1,68 @@
1
+ import "react";
2
+ import e from "@mui/material/Stack";
3
+ import { P as c, Text as m } from "@mxenabled/mxui";
4
+ import { Icon as s } from "@mxenabled/mx-icons";
5
+ import { jsx as r, jsxs as n } from "react/jsx-runtime";
6
+ import d from "@mui/material/Card";
7
+ var y = ({ formattedProjectedBalance: i, isMini: o = !1, projectedBalanceLabel: a }) => {
8
+ const t = {
9
+ boxContainer: {
10
+ bgcolor: "warning.light",
11
+ marginBottom: o ? 0 : 24,
12
+ py: 16,
13
+ px: 24,
14
+ width: "100%"
15
+ },
16
+ card: {
17
+ alignItems: "center",
18
+ borderRadius: 2,
19
+ display: "flex",
20
+ flexDirection: "column",
21
+ justifyContent: "center",
22
+ p: 16,
23
+ width: "100%"
24
+ }
25
+ };
26
+ return /* @__PURE__ */ r(e, {
27
+ sx: t.boxContainer,
28
+ children: /* @__PURE__ */ n(d, {
29
+ sx: {
30
+ ...t.card,
31
+ bgcolor: "background.paper"
32
+ },
33
+ children: [/* @__PURE__ */ r(m, {
34
+ component: "span",
35
+ sx: {
36
+ color: "text.primary",
37
+ fontWeight: 700,
38
+ mb: 4
39
+ },
40
+ variant: o ? "h2" : "h1",
41
+ children: i
42
+ }), /* @__PURE__ */ n(e, {
43
+ alignItems: "center",
44
+ direction: "row",
45
+ sx: { gap: 4 },
46
+ children: [/* @__PURE__ */ r(s, {
47
+ "aria-hidden": "true",
48
+ fill: !0,
49
+ name: "error",
50
+ size: 16,
51
+ sx: { color: "warning.main" }
52
+ }), /* @__PURE__ */ r(c, {
53
+ sx: {
54
+ color: "text.secondary",
55
+ fontWeight: 400
56
+ },
57
+ variant: "body2",
58
+ children: a
59
+ })]
60
+ })]
61
+ })
62
+ });
63
+ };
64
+ export {
65
+ y as TransparentOverdraftV2Body
66
+ };
67
+
68
+ //# sourceMappingURL=TransparentOverdraftV2Body.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransparentOverdraftV2Body.es.js","names":[],"sources":["../../../../../src/insights/components/insights/TransparentOverdraftV2/TransparentOverdraftV2Body.tsx"],"sourcesContent":["import React from 'react'\n\nimport { Icon } from '@mxenabled/mx-icons'\nimport { P, Text } from '@mxenabled/mxui'\n\nimport Card from '@mui/material/Card'\nimport Stack from '@mui/material/Stack'\n\ninterface TransparentOverdraftV2BodyProps {\n formattedProjectedBalance: string\n isMini: boolean\n projectedBalanceLabel: string\n}\n\nexport const TransparentOverdraftV2Body: React.FC<TransparentOverdraftV2BodyProps> = ({\n formattedProjectedBalance,\n isMini = false,\n projectedBalanceLabel,\n}) => {\n const styles = {\n boxContainer: {\n bgcolor: 'warning.light',\n marginBottom: isMini ? 0 : 24,\n py: 16,\n px: 24,\n width: '100%',\n },\n card: {\n alignItems: 'center',\n borderRadius: 2,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n p: 16,\n width: '100%',\n },\n }\n\n return (\n <Stack sx={styles.boxContainer}>\n <Card\n sx={{\n ...styles.card,\n bgcolor: 'background.paper',\n }}\n >\n <Text\n component=\"span\"\n sx={{ color: 'text.primary', fontWeight: 700, mb: 4 }}\n variant={isMini ? 'h2' : 'h1'}\n >\n {formattedProjectedBalance}\n </Text>\n\n <Stack alignItems=\"center\" direction=\"row\" sx={{ gap: 4 }}>\n <Icon\n aria-hidden=\"true\"\n fill={true}\n name=\"error\"\n size={16}\n sx={{ color: 'warning.main' }}\n />\n <P sx={{ color: 'text.secondary', fontWeight: 400 }} variant=\"body2\">\n {projectedBalanceLabel}\n </P>\n </Stack>\n </Card>\n </Stack>\n )\n}\n"],"mappings":";;;;;;AAcA,IAAa,IAAA,CAAyE,EACpF,2BAAA,GACA,QAAA,IAAS,IACT,uBAAA,EAAA,MACI;AACJ,QAAM,IAAS;AAAA,IACb,cAAc;AAAA,MACZ,SAAS;AAAA,MACT,cAAc,IAAS,IAAI;AAAA,MAC3B,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,IACT;AAAA,IACA,MAAM;AAAA,MACJ,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,SAAS;AAAA,MACT,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,GAAG;AAAA,MACH,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SACE,gBAAA,EAAC,GAAD;AAAA,IAAO,IAAI,EAAO;AAAA,IAChB,UAAA,gBAAA,EAAC,GAAD;AAAA,MACE,IAAI;AAAA,QACF,GAAG,EAAO;AAAA,QACV,SAAS;AAAA,MACX;AAAA,MAJF,UAAA,CAME,gBAAA,EAAC,GAAD;AAAA,QACE,WAAU;AAAA,QACV,IAAI;AAAA,UAAE,OAAO;AAAA,UAAgB,YAAY;AAAA,UAAK,IAAI;AAAA,QAAE;AAAA,QACpD,SAAS,IAAS,OAAO;AAAA,QAExB,UAAA;AAAA,MACG,CAAA,GAEN,gBAAA,EAAC,GAAD;AAAA,QAAO,YAAW;AAAA,QAAS,WAAU;AAAA,QAAM,IAAI,EAAE,KAAK,EAAE;AAAA,QAAxD,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,UACE,eAAY;AAAA,UACZ,MAAM;AAAA,UACN,MAAK;AAAA,UACL,MAAM;AAAA,UACN,IAAI,EAAE,OAAO,eAAe;AAAA,QAC7B,CAAA,GACD,gBAAA,EAAC,GAAD;AAAA,UAAG,IAAI;AAAA,YAAE,OAAO;AAAA,YAAkB,YAAY;AAAA,UAAI;AAAA,UAAG,SAAQ;AAAA,UAC1D,UAAA;AAAA,QACA,CAAA,CACE;AAAA,MACH,CAAA,CAAA;AAAA;EACD,CAAA;AAEX"}
@@ -0,0 +1 @@
1
+ export * from './TransparentOverdraftV2';
@@ -19,6 +19,7 @@ export * from './P2pCategorization';
19
19
  export * from './SavingsAccountBalancesSummary';
20
20
  export * from './SetUpDirectDeposit';
21
21
  export * from './SwitchDirectDeposit';
22
+ export * from './TransparentOverdraftV2';
22
23
  export * from './UnifiedDeposit';
23
24
  export * from './WeeklyNoSpendDays';
24
25
  export * from './MarketingHub';
@@ -17,7 +17,7 @@ import { MiniInsightCard as U } from "./components/shared/MiniInsightCard.es.js"
17
17
  import { MenuAction as H } from "./components/shared/MenuAction.es.js";
18
18
  import w from "./components/shared/P2P/P2PMultipleCategorization.es.js";
19
19
  import V from "./components/shared/SaveEnoughToLiveOnBottomSection.es.js";
20
- import O from "./components/shared/SaveEnoughToLiveOnTopSection.es.js";
20
+ import z from "./components/shared/SaveEnoughToLiveOnTopSection.es.js";
21
21
  import W from "./components/shared/StatusIndicator.es.js";
22
22
  import R from "./components/shared/TransactionCard.es.js";
23
23
  import { DirectDeposit as X } from "./components/shared/DirectDeposit/DirectDeposit.es.js";
@@ -43,7 +43,7 @@ import { LinedCardZeroState as ko } from "./components/shared/ZeroState/LinedCar
43
43
  import { ErrorCard as Eo } from "./components/shared/ErrorCard/ErrorCard.es.js";
44
44
  import { FeedbackHeader as Lo } from "./components/shared/GenericFeedback/FeedbackHeader.es.js";
45
45
  import { FeedbackButtons as xo } from "./components/shared/GenericFeedback/FeedbackButtons.es.js";
46
- import { FeedbackDescription as zo } from "./components/shared/GenericFeedback/FeedbackDescription.es.js";
46
+ import { FeedbackDescription as Oo } from "./components/shared/GenericFeedback/FeedbackDescription.es.js";
47
47
  import { FeedbackOptions as No } from "./components/shared/GenericFeedback/FeedbackOptions.es.js";
48
48
  import { BeatFeedbackText as Go } from "./components/shared/GenericFeedback/FeedbackText.es.js";
49
49
  import { AccountDiscoverability as jo } from "./components/insights/AccountDiscoverability/AccountDiscoverability.es.js";
@@ -70,7 +70,7 @@ import { MonthlyEmergencyFundReviewBody as kr } from "./components/insights/Mont
70
70
  import { LastMonthsContributionSection as Er } from "./components/insights/MonthlyEmergencyFundReview/LastMonthsContributionSection.es.js";
71
71
  import { ProjectedCompletionSection as Lr } from "./components/insights/MonthlyEmergencyFundReview/ProjectedCompletionSection.es.js";
72
72
  import { TotalSavedSection as xr } from "./components/insights/MonthlyEmergencyFundReview/TotalSection.es.js";
73
- import { MonthlySavingsToIncomeComparison as zr } from "./components/insights/MonthlySavingsToIncomeComparison/MonthlySavingsToIncomeComparison.es.js";
73
+ import { MonthlySavingsToIncomeComparison as Or } from "./components/insights/MonthlySavingsToIncomeComparison/MonthlySavingsToIncomeComparison.es.js";
74
74
  import { MonthlySpendingComparisonV2 as Nr } from "./components/insights/MonthlySpendingComparisonV2/MonthlySpendingComparisonV2.es.js";
75
75
  import { MonthlySpendToIncomeComparisonV2 as Gr } from "./components/insights/MonthlySpendToIncomeComparisonV2/MonthlySpendToIncomeComparisonV2.es.js";
76
76
  import { P2pCategorization as jr } from "./components/insights/P2pCategorization/P2pCategorization.es.js";
@@ -81,14 +81,15 @@ import { SetUpDirectDepositBody as _r } from "./components/insights/SetUpDirectD
81
81
  import { AccountBox as ot } from "./components/insights/SwitchDirectDeposit/AccountBox.es.js";
82
82
  import { SwitchDirectDepositMainContainer as tt } from "./components/insights/SwitchDirectDeposit/SwitchDirectDepositMainContainer.es.js";
83
83
  import { SwitchDirectDepositBody as mt } from "./components/insights/SwitchDirectDeposit/SwitchDirectDepositBody.es.js";
84
- import { UnifiedDeposit as at } from "./components/insights/UnifiedDeposit/UnifiedDeposit.es.js";
85
- import { WeeklyNoSpendDays as nt } from "./components/insights/WeeklyNoSpendDays/WeeklyNoSpendDays.es.js";
86
- import { UserFeedback as dt } from "./components/insights/UserFeedback/UserFeedback.es.js";
87
- import { DirectDepositDeepLink as st } from "./components/shared/DeepLinks/DirectDeposit/DirectDepositDeepLink.es.js";
88
- import { Header as lt } from "./components/feed/Header.es.js";
89
- import { P2PCategorizationSingleAccount as ut } from "./components/shared/P2PCategorizationSingleAccount/P2PCategorizationSingleAccount.es.js";
90
- import { DrillDownCalculation as Bt, variants as gt } from "./components/shared/DrillDownCalculation/DrillDownCalculation.es.js";
91
- import { SaveAnExtra100 as yt } from "./components/shared/SaveAnExtra100/SaveAnExtra100.es.js";
84
+ import { TransparentOverdraftV2 as at } from "./components/insights/TransparentOverdraftV2/TransparentOverdraftV2.es.js";
85
+ import { UnifiedDeposit as nt } from "./components/insights/UnifiedDeposit/UnifiedDeposit.es.js";
86
+ import { WeeklyNoSpendDays as dt } from "./components/insights/WeeklyNoSpendDays/WeeklyNoSpendDays.es.js";
87
+ import { UserFeedback as st } from "./components/insights/UserFeedback/UserFeedback.es.js";
88
+ import { DirectDepositDeepLink as lt } from "./components/shared/DeepLinks/DirectDeposit/DirectDepositDeepLink.es.js";
89
+ import { Header as ut } from "./components/feed/Header.es.js";
90
+ import { P2PCategorizationSingleAccount as Bt } from "./components/shared/P2PCategorizationSingleAccount/P2PCategorizationSingleAccount.es.js";
91
+ import { DrillDownCalculation as ht, variants as yt } from "./components/shared/DrillDownCalculation/DrillDownCalculation.es.js";
92
+ import { SaveAnExtra100 as Tt } from "./components/shared/SaveAnExtra100/SaveAnExtra100.es.js";
92
93
  export {
93
94
  ot as AccountBox,
94
95
  jo as AccountDiscoverability,
@@ -122,7 +123,7 @@ export {
122
123
  sr as CustomTransaction,
123
124
  Mo as Description,
124
125
  X as DirectDeposit,
125
- st as DirectDepositDeepLink,
126
+ lt as DirectDepositDeepLink,
126
127
  q as DirectDepositSubHeader,
127
128
  ur as DiscoveredAccountsBody,
128
129
  T as DiscoveredAccountsConnect,
@@ -130,7 +131,7 @@ export {
130
131
  hr as DiscoveredAccountsMiniInsight,
131
132
  f as DoubleBarChart,
132
133
  c as DoubleBarChartMXUI,
133
- Bt as DrillDownCalculation,
134
+ ht as DrillDownCalculation,
134
135
  vo as EmbeddedCard,
135
136
  C as EmptyBarChart,
136
137
  Eo as ErrorCard,
@@ -138,11 +139,11 @@ export {
138
139
  vr as FederalBankHolidayMUI,
139
140
  xo as FeedbackButtons,
140
141
  Ao as FeedbackCard,
141
- zo as FeedbackDescription,
142
+ Oo as FeedbackDescription,
142
143
  Lo as FeedbackHeader,
143
144
  No as FeedbackOptions,
144
145
  K as FullFeedBodyHeader,
145
- lt as Header,
146
+ ut as Header,
146
147
  Fo as InsightButton,
147
148
  Er as LastMonthsContributionSection,
148
149
  Y as LeftBox,
@@ -153,11 +154,11 @@ export {
153
154
  U as MiniInsightCard,
154
155
  Fr as MonthlyDebtToIncomeComparisonV2,
155
156
  kr as MonthlyEmergencyFundReviewBody,
156
- zr as MonthlySavingsToIncomeComparison,
157
+ Or as MonthlySavingsToIncomeComparison,
157
158
  Gr as MonthlySpendToIncomeComparisonV2,
158
159
  Nr as MonthlySpendingComparisonV2,
159
160
  Ar as Offer,
160
- ut as P2PCategorizationSingleAccount,
161
+ Bt as P2PCategorizationSingleAccount,
161
162
  w as P2PMultipleCategorization,
162
163
  jr as P2pCategorization,
163
164
  Zr as P2pCategorizationMultipleTransactions,
@@ -167,9 +168,9 @@ export {
167
168
  I as PulseGraidentBox,
168
169
  b as PulseProgressBar,
169
170
  ro as RightBox,
170
- yt as SaveAnExtra100,
171
+ Tt as SaveAnExtra100,
171
172
  V as SaveEnoughToLiveOnBottomSection,
172
- O as SaveEnoughToLiveOnTopSection,
173
+ z as SaveEnoughToLiveOnTopSection,
173
174
  Qr as SavingsAccountBalancesSummary,
174
175
  _r as SetUpDirectDepositBody,
175
176
  lr as SharedDeposit,
@@ -178,8 +179,9 @@ export {
178
179
  tt as SwitchDirectDepositMainContainer,
179
180
  xr as TotalSavedSection,
180
181
  R as TransactionCard,
181
- at as UnifiedDeposit,
182
- dt as UserFeedback,
183
- nt as WeeklyNoSpendDays,
184
- gt as variants
182
+ at as TransparentOverdraftV2,
183
+ nt as UnifiedDeposit,
184
+ st as UserFeedback,
185
+ dt as WeeklyNoSpendDays,
186
+ yt as variants
185
187
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mx-cartographer/experiences",
3
- "version": "9.3.5",
3
+ "version": "9.3.7-alpha.al0",
4
4
  "description": "Library containing experience widgets",
5
5
  "author": "MX",
6
6
  "license": "MIT",