@mx-cartographer/experiences 9.6.7 → 9.6.8

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,7 @@
1
+ ## [9.6.8] - 10-13-2026
2
+
3
+ - **ADDED** - Dashboard banner can open the Connect widget in-app: a connect-type banner (`deep_link_type`) opens `ConnectDrawer` instead of an external link, with banner and connect-widget analytics (MEW-3504)
4
+
1
5
  ## [9.6.7] - 10-13-2026
2
6
 
3
7
  - **ADDED** - `debts_block` component block for the Debt Payoff Strategies beat, registered through `BlockType` and the `blocks` registry. Renders the new presentational `DebtPayoffCard` (account row with an optional strategy pill, current balance, and projected payoff / monthly payment / interest rate rows) from facts carried flat on `instance_slot`: `payoff_date`, `monthly_payment` and `interest_rate` are new optional `InstanceSlot` fields beside the shared `amount`, `account_*`, `institution_*` and `status_text`. One look for now (`instance_slot.variant` is not read until a second design branch exists); the logo falls back to a card glyph for credit-card debt and the bank glyph otherwise. Row labels come from a new `insights_feed.debts_block` copy namespace; until a host ships it, the card renders the account row only and warns once (`debts_block: copy namespace missing`), and a slot with no `amount` renders no balance rather than `$0.00`. Mock payloads, beats fixtures, stories and tests (WEC-1298)
@@ -1,39 +1,79 @@
1
- import { useGlobalStore as l } from "../context/hooks.es.js";
2
- import i from "react";
3
- import { observer as n } from "mobx-react-lite";
4
- import m from "@mui/material/Stack";
5
- import { jsx as e } from "react/jsx-runtime";
6
- import { useTheme as s } from "@mui/material/styles";
7
- var b = n(() => {
8
- const t = s(), { appDataStore: { banner: r, loadBanner: a, user: o } } = l();
9
- return i.useEffect(() => {
10
- a().finally();
11
- }, [o]), r?.image_url ? /* @__PURE__ */ e(m, {
1
+ import { useEvent as f, useGlobalCopyStore as g, useGlobalStore as C } from "../context/hooks.es.js";
2
+ import { ANALYTICS_EVENTS as s } from "../constants/Analytics.es.js";
3
+ import { CONNECT_WIDGET_SOURCES as b, DEEP_LINK_TYPE as y } from "../constants/Connect.es.js";
4
+ import E from "./ConnectDrawer.es.js";
5
+ import t from "react";
6
+ import { observer as h } from "mobx-react-lite";
7
+ import k from "@mui/material/Stack";
8
+ import { jsx as r, jsxs as N } from "react/jsx-runtime";
9
+ import { useTheme as S } from "@mui/material/styles";
10
+ var P = h(() => {
11
+ const d = S(), { appDataStore: { banner: e, loadBanner: p, markBannerClicked: m, user: u } } = C(), { onEvent: n } = f(), { connect: _ } = g(), [o, i] = t.useState(!1);
12
+ if (t.useEffect(() => {
13
+ p();
14
+ }, [u]), t.useEffect(() => {
15
+ e?.image_url && n(s.BANNER_VIEW, {
16
+ banner_guid: e.guid,
17
+ deep_link_type: e.deep_link_type
18
+ });
19
+ }, [e?.guid, e?.image_url]), !e?.image_url) return null;
20
+ const l = e.deep_link_type === y.CONNECT, a = () => {
21
+ n(s.BANNER_CLICK, {
22
+ banner_guid: e.guid,
23
+ deep_link_type: e.deep_link_type
24
+ }), l && (e.guid && m(e.guid), i(!0));
25
+ }, c = /* @__PURE__ */ r("img", {
26
+ alt: "",
27
+ referrerPolicy: "no-referrer",
28
+ src: e.image_url,
29
+ style: {
30
+ width: "100%",
31
+ height: "auto",
32
+ border: `1px solid ${d.palette.grey[300]}`,
33
+ display: "block"
34
+ }
35
+ });
36
+ return /* @__PURE__ */ N(t.Fragment, { children: [/* @__PURE__ */ r(k, {
12
37
  sx: {
13
38
  alignItems: "center",
14
39
  width: "100%",
15
40
  mb: 24
16
41
  },
17
- children: /* @__PURE__ */ e("a", {
42
+ children: l ? /* @__PURE__ */ r("button", {
43
+ "aria-label": "Banner",
44
+ onClick: a,
45
+ style: {
46
+ background: "none",
47
+ border: "none",
48
+ cursor: "pointer",
49
+ display: "block",
50
+ padding: 0,
51
+ width: "100%"
52
+ },
53
+ type: "button",
54
+ children: c
55
+ }) : /* @__PURE__ */ r("a", {
18
56
  "aria-label": "Banner",
19
- href: r?.redirect_url,
20
- rel: "noreferrer",
21
- style: { width: "100%" },
57
+ href: e.redirect_url,
58
+ onClick: a,
59
+ referrerPolicy: "no-referrer",
60
+ rel: "noopener noreferrer",
61
+ style: {
62
+ display: "block",
63
+ width: "100%"
64
+ },
22
65
  target: "_blank",
23
- children: /* @__PURE__ */ e("img", {
24
- alt: "",
25
- src: r.image_url,
26
- style: {
27
- width: "100%",
28
- height: "auto",
29
- border: `1px solid ${t.palette.grey[300]}`
30
- }
31
- })
66
+ children: c
32
67
  })
33
- }) : null;
68
+ }), o && /* @__PURE__ */ r(E, {
69
+ onClose: () => i(!1),
70
+ showConnectWidget: o,
71
+ source: b.BANNER,
72
+ title: _?.mini_title ?? ""
73
+ })] });
34
74
  });
35
75
  export {
36
- b as Banner
76
+ P as Banner
37
77
  };
38
78
 
39
79
  //# sourceMappingURL=Banner.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Banner.es.js","names":[],"sources":["../../../src/common/components/Banner.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport { useTheme } from '@mui/material/styles'\nimport Stack from '@mui/material/Stack'\n\nimport { useGlobalStore } from '..'\n\nexport const Banner = observer(() => {\n const theme = useTheme()\n const {\n appDataStore: { banner, loadBanner, user },\n } = useGlobalStore()\n\n React.useEffect(() => {\n loadBanner().finally()\n }, [user])\n\n if (!banner?.image_url) {\n return null\n }\n\n return (\n <Stack\n sx={{\n alignItems: 'center',\n width: '100%',\n mb: 24,\n }}\n >\n <a\n aria-label=\"Banner\"\n href={banner?.redirect_url}\n rel=\"noreferrer\"\n style={{\n width: '100%',\n }}\n target=\"_blank\"\n >\n <img\n alt=\"\"\n src={banner.image_url}\n style={{\n width: '100%',\n height: 'auto',\n border: `1px solid ${theme.palette.grey['300']}`,\n }}\n />\n </a>\n </Stack>\n )\n})\n"],"mappings":";;;;;;AAQA,IAAa,IAAS,EAAA,MAAe;AACnC,QAAM,IAAQ,EAAS,GACjB,EACJ,cAAc,EAAE,QAAA,GAAQ,YAAA,GAAY,MAAA,EAAA,EAAA,IAClC,EAAe;AAMnB,SAJA,EAAM,UAAA,MAAgB;AACpB,IAAA,EAAW,EAAE,QAAQ;AAAA,EACvB,GAAG,CAAC,CAAI,CAAC,GAEJ,GAAQ,YAKX,gBAAA,EAAC,GAAD;AAAA,IACE,IAAI;AAAA,MACF,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,IAAI;AAAA,IACN;AAAA,IAEA,UAAA,gBAAA,EAAC,KAAD;AAAA,MACE,cAAW;AAAA,MACX,MAAM,GAAQ;AAAA,MACd,KAAI;AAAA,MACJ,OAAO,EACL,OAAO,OACT;AAAA,MACA,QAAO;AAAA,MAEP,UAAA,gBAAA,EAAC,OAAD;AAAA,QACE,KAAI;AAAA,QACJ,KAAK,EAAO;AAAA,QACZ,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ,aAAa,EAAM,QAAQ,KAAK,GAAA,CAAA;AAAA,QAC1C;AAAA,MACD,CAAA;AAAA,IACA,CAAA;AAAA,EACE,CAAA,IA9BA;AAgCX,CAAC"}
1
+ {"version":3,"file":"Banner.es.js","names":[],"sources":["../../../src/common/components/Banner.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport { useTheme } from '@mui/material/styles'\nimport Stack from '@mui/material/Stack'\n\nimport ConnectDrawer from './ConnectDrawer'\nimport { useGlobalCopyStore, useGlobalStore } from '..'\nimport { useEvent } from '../context/hooks'\nimport { ANALYTICS_EVENTS, CONNECT_WIDGET_SOURCES, DEEP_LINK_TYPE } from '../constants'\n\nexport const Banner = observer(() => {\n const theme = useTheme()\n const {\n appDataStore: { banner, loadBanner, markBannerClicked, user },\n } = useGlobalStore()\n const { onEvent } = useEvent()\n const { connect: connectCopy } = useGlobalCopyStore()\n const [showConnectWidget, setShowConnectWidget] = React.useState(false)\n\n React.useEffect(() => {\n void loadBanner()\n }, [user])\n\n React.useEffect(() => {\n if (banner?.image_url) {\n onEvent(ANALYTICS_EVENTS.BANNER_VIEW, {\n banner_guid: banner.guid,\n deep_link_type: banner.deep_link_type,\n })\n }\n }, [banner?.guid, banner?.image_url])\n\n if (!banner?.image_url) {\n return null\n }\n\n const isConnect = banner.deep_link_type === DEEP_LINK_TYPE.CONNECT\n\n const handleClick = () => {\n onEvent(ANALYTICS_EVENTS.BANNER_CLICK, {\n banner_guid: banner.guid,\n deep_link_type: banner.deep_link_type,\n })\n\n if (isConnect) {\n // Record the click server-side (see AppDataStore.markBannerClicked).\n if (banner.guid) markBannerClicked(banner.guid)\n setShowConnectWidget(true)\n }\n }\n\n const image = (\n <img\n alt=\"\"\n referrerPolicy=\"no-referrer\"\n src={banner.image_url}\n style={{\n width: '100%',\n height: 'auto',\n border: `1px solid ${theme.palette.grey['300']}`,\n display: 'block',\n }}\n />\n )\n\n return (\n <React.Fragment>\n <Stack\n sx={{\n alignItems: 'center',\n width: '100%',\n mb: 24,\n }}\n >\n {isConnect ? (\n // Connect opens the drawer in-app, so render a button with no href/target:\n // there is no external destination to middle-click or open in a new tab,\n // so every interaction is forced through onClick.\n <button\n aria-label=\"Banner\"\n onClick={handleClick}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n display: 'block',\n padding: 0,\n width: '100%',\n }}\n type=\"button\"\n >\n {image}\n </button>\n ) : (\n // Every other type (incl. today's API, which omits deep_link_type) is a\n // real external link, keeping native middle-click / open-in-new-tab.\n <a\n aria-label=\"Banner\"\n href={banner.redirect_url}\n onClick={handleClick}\n referrerPolicy=\"no-referrer\"\n rel=\"noopener noreferrer\"\n style={{ display: 'block', width: '100%' }}\n target=\"_blank\"\n >\n {image}\n </a>\n )}\n </Stack>\n {showConnectWidget && (\n <ConnectDrawer\n onClose={() => setShowConnectWidget(false)}\n showConnectWidget={showConnectWidget}\n source={CONNECT_WIDGET_SOURCES.BANNER}\n title={connectCopy?.mini_title ?? ''}\n />\n )}\n </React.Fragment>\n )\n})\n"],"mappings":";;;;;;;;;AAWA,IAAa,IAAS,EAAA,MAAe;AACnC,QAAM,IAAQ,EAAS,GACjB,EACJ,cAAc,EAAE,QAAA,GAAQ,YAAA,GAAY,mBAAA,GAAmB,MAAA,EAAA,EAAA,IACrD,EAAe,GACb,EAAE,SAAA,EAAA,IAAY,EAAS,GACvB,EAAE,SAAS,EAAA,IAAgB,EAAmB,GAC9C,CAAC,GAAmB,CAAA,IAAwB,EAAM,SAAS,EAAK;AAetE,MAbA,EAAM,UAAA,MAAgB;AACpB,IAAA,EAAgB;AAAA,EAClB,GAAG,CAAC,CAAI,CAAC,GAET,EAAM,UAAA,MAAgB;AACpB,IAAI,GAAQ,aACV,EAAQ,EAAiB,aAAa;AAAA,MACpC,aAAa,EAAO;AAAA,MACpB,gBAAgB,EAAO;AAAA,IACzB,CAAC;AAAA,EAEL,GAAG,CAAC,GAAQ,MAAM,GAAQ,SAAS,CAAC,GAEhC,CAAC,GAAQ,UACX,QAAO;AAGT,QAAM,IAAY,EAAO,mBAAmB,EAAe,SAErD,IAAA,MAAoB;AACxB,IAAA,EAAQ,EAAiB,cAAc;AAAA,MACrC,aAAa,EAAO;AAAA,MACpB,gBAAgB,EAAO;AAAA,IACzB,CAAC,GAEG,MAEE,EAAO,QAAM,EAAkB,EAAO,IAAI,GAC9C,EAAqB,EAAI;AAAA,EAE7B,GAEM,IACJ,gBAAA,EAAC,OAAD;AAAA,IACE,KAAI;AAAA,IACJ,gBAAe;AAAA,IACf,KAAK,EAAO;AAAA,IACZ,OAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ,aAAa,EAAM,QAAQ,KAAK,GAAA,CAAA;AAAA,MACxC,SAAS;AAAA,IACX;AAAA,EACD,CAAA;AAGH,SACE,gBAAA,EAAC,EAAM,UAAP,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,IACE,IAAI;AAAA,MACF,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,IAAI;AAAA,IACN;AAAA,IAEC,UAAA,IAIC,gBAAA,EAAC,UAAD;AAAA,MACE,cAAW;AAAA,MACX,SAAS;AAAA,MACT,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,MACA,MAAK;AAAA,MAEJ,UAAA;AAAA,IACK,CAAA,IAIR,gBAAA,EAAC,KAAD;AAAA,MACE,cAAW;AAAA,MACX,MAAM,EAAO;AAAA,MACb,SAAS;AAAA,MACT,gBAAe;AAAA,MACf,KAAI;AAAA,MACJ,OAAO;AAAA,QAAE,SAAS;AAAA,QAAS,OAAO;AAAA,MAAO;AAAA,MACzC,QAAO;AAAA,MAEN,UAAA;AAAA,IACA,CAAA;AAAA,EAEA,CAAA,GACN,KACC,gBAAA,EAAC,GAAD;AAAA,IACE,SAAA,MAAe,EAAqB,EAAK;AAAA,IACtB,mBAAA;AAAA,IACnB,QAAQ,EAAuB;AAAA,IAC/B,OAAO,GAAa,cAAc;AAAA,EACnC,CAAA,CAEW,EAAA,CAAA;AAEpB,CAAC"}
@@ -1,8 +1,10 @@
1
1
  import { default as React } from 'react';
2
+ import { ConnectWidgetSource } from '../constants/Connect';
2
3
  interface ConnectDrawerProps {
3
4
  loadWidgetProps?: object;
4
5
  onClose: () => void;
5
6
  showConnectWidget: boolean;
7
+ source?: ConnectWidgetSource;
6
8
  title: string;
7
9
  }
8
10
  declare const _default: React.FunctionComponent<ConnectDrawerProps>;
@@ -1,26 +1,27 @@
1
- import { useAccountStore as i, useGlobalCopyStore as m } from "../context/hooks.es.js";
2
- import s from "./drawer/Drawer.es.js";
3
- import l from "./ConnectWidgetPanel.es.js";
1
+ import { useAccountStore as m, useGlobalCopyStore as s } from "../context/hooks.es.js";
2
+ import l from "./drawer/Drawer.es.js";
3
+ import f from "./ConnectWidgetPanel.es.js";
4
4
  import "react";
5
- import { observer as f } from "mobx-react-lite";
5
+ import { observer as p } from "mobx-react-lite";
6
6
  import { jsx as r } from "react/jsx-runtime";
7
- var p = ({ loadWidgetProps: e, onClose: t, showConnectWidget: o, title: n }) => {
8
- const { refreshAccounts: a } = i(), { connect: c } = m();
9
- return /* @__PURE__ */ r(s, {
10
- ariaLabelClose: c.close_manage_connection_aria,
7
+ var u = ({ loadWidgetProps: e, onClose: t, showConnectWidget: o, source: n, title: a }) => {
8
+ const { refreshAccounts: c } = m(), { connect: i } = s();
9
+ return /* @__PURE__ */ r(l, {
10
+ ariaLabelClose: i.close_manage_connection_aria,
11
11
  isOpen: o,
12
12
  onClose: () => {
13
- t(), a();
13
+ t(), c();
14
14
  },
15
- title: n,
16
- children: /* @__PURE__ */ r(l, {
15
+ title: a,
16
+ children: /* @__PURE__ */ r(f, {
17
17
  isActive: o,
18
- loadWidgetProps: e
18
+ loadWidgetProps: e,
19
+ source: n
19
20
  })
20
21
  });
21
- }, D = f(p);
22
+ }, w = p(u);
22
23
  export {
23
- D as default
24
+ w as default
24
25
  };
25
26
 
26
27
  //# sourceMappingURL=ConnectDrawer.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConnectDrawer.es.js","names":[],"sources":["../../../src/common/components/ConnectDrawer.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport ConnectWidgetPanel from './ConnectWidgetPanel'\nimport { Drawer, useAccountStore, useGlobalCopyStore } from '../../common'\n\ninterface ConnectDrawerProps {\n loadWidgetProps?: object\n onClose: () => void\n showConnectWidget: boolean\n title: string\n}\n\n/**\n * Drawer wrapper around `ConnectWidgetPanel` (SSO url via ConnectStore, the\n * iframe-based `@mxenabled/web-widget-sdk` ConnectWidget, loading/error\n * statuses) with an account refresh on close. Unchanged behaviour for its\n * existing callers; `ConnectWidgetActionBlock` renders `ConnectWidgetPanel`\n * directly instead, since `ActionBlockLayer` already supplies its own Drawer.\n */\nconst ConnectDrawer: React.FC<ConnectDrawerProps> = ({\n loadWidgetProps,\n onClose,\n showConnectWidget,\n title,\n}) => {\n const { refreshAccounts } = useAccountStore()\n const { connect: connectCopy } = useGlobalCopyStore()\n\n return (\n <Drawer\n ariaLabelClose={connectCopy.close_manage_connection_aria}\n isOpen={showConnectWidget}\n onClose={() => {\n onClose()\n refreshAccounts()\n }}\n title={title}\n >\n <ConnectWidgetPanel isActive={showConnectWidget} loadWidgetProps={loadWidgetProps} />\n </Drawer>\n )\n}\n\nexport default observer(ConnectDrawer)\n"],"mappings":";;;;;;AAoBA,IAAM,IAAA,CAA+C,EACnD,iBAAA,GACA,SAAA,GACA,mBAAA,GACA,OAAA,EAAA,MACI;AACJ,QAAM,EAAE,iBAAA,EAAA,IAAoB,EAAgB,GACtC,EAAE,SAAS,EAAA,IAAgB,EAAmB;AAEpD,SACE,gBAAA,EAAC,GAAD;AAAA,IACE,gBAAgB,EAAY;AAAA,IAC5B,QAAQ;AAAA,IACR,SAAA,MAAe;AACb,MAAA,EAAQ,GACR,EAAgB;AAAA,IAClB;AAAA,IACO,OAAA;AAAA,IAEP,UAAA,gBAAA,EAAC,GAAD;AAAA,MAAoB,UAAU;AAAA,MAAoC,iBAAA;AAAA,IAAkB,CAAA;AAAA,EAC9E,CAAA;AAEZ,GAEA,IAAe,EAAS,CAAa"}
1
+ {"version":3,"file":"ConnectDrawer.es.js","names":[],"sources":["../../../src/common/components/ConnectDrawer.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\n\nimport ConnectWidgetPanel from './ConnectWidgetPanel'\nimport { Drawer, useAccountStore, useGlobalCopyStore } from '../../common'\nimport { type ConnectWidgetSource } from '../constants/Connect'\n\ninterface ConnectDrawerProps {\n loadWidgetProps?: object\n onClose: () => void\n showConnectWidget: boolean\n // Optional entry point; forwarded to ConnectWidgetPanel for lifecycle analytics.\n source?: ConnectWidgetSource\n title: string\n}\n\n/**\n * Drawer wrapper around `ConnectWidgetPanel` (SSO url via ConnectStore, the\n * iframe-based `@mxenabled/web-widget-sdk` ConnectWidget, loading/error\n * statuses) with an account refresh on close. Unchanged behaviour for its\n * existing callers; `ConnectWidgetActionBlock` renders `ConnectWidgetPanel`\n * directly instead, since `ActionBlockLayer` already supplies its own Drawer.\n */\nconst ConnectDrawer: React.FC<ConnectDrawerProps> = ({\n loadWidgetProps,\n onClose,\n showConnectWidget,\n source,\n title,\n}) => {\n const { refreshAccounts } = useAccountStore()\n const { connect: connectCopy } = useGlobalCopyStore()\n\n return (\n <Drawer\n ariaLabelClose={connectCopy.close_manage_connection_aria}\n isOpen={showConnectWidget}\n onClose={() => {\n onClose()\n refreshAccounts()\n }}\n title={title}\n >\n <ConnectWidgetPanel\n isActive={showConnectWidget}\n loadWidgetProps={loadWidgetProps}\n source={source}\n />\n </Drawer>\n )\n}\n\nexport default observer(ConnectDrawer)\n"],"mappings":";;;;;;AAuBA,IAAM,IAAA,CAA+C,EACnD,iBAAA,GACA,SAAA,GACA,mBAAA,GACA,QAAA,GACA,OAAA,EAAA,MACI;AACJ,QAAM,EAAE,iBAAA,EAAA,IAAoB,EAAgB,GACtC,EAAE,SAAS,EAAA,IAAgB,EAAmB;AAEpD,SACE,gBAAA,EAAC,GAAD;AAAA,IACE,gBAAgB,EAAY;AAAA,IAC5B,QAAQ;AAAA,IACR,SAAA,MAAe;AACb,MAAA,EAAQ,GACR,EAAgB;AAAA,IAClB;AAAA,IACO,OAAA;AAAA,IAEP,UAAA,gBAAA,EAAC,GAAD;AAAA,MACE,UAAU;AAAA,MACO,iBAAA;AAAA,MACT,QAAA;AAAA,IACT,CAAA;AAAA,EACK,CAAA;AAEZ,GAEA,IAAe,EAAS,CAAa"}
@@ -1,8 +1,10 @@
1
1
  import { default as React } from 'react';
2
+ import { ConnectWidgetSource } from '../constants';
2
3
  export interface ConnectWidgetPanelProps {
3
4
  loadWidgetProps?: object;
4
5
  /** Mounts/unmounts the underlying iframe-based ConnectWidget. */
5
6
  isActive: boolean;
7
+ source?: ConnectWidgetSource;
6
8
  }
7
9
  declare const _default: React.FunctionComponent<ConnectWidgetPanelProps>;
8
10
  export default _default;
@@ -1,44 +1,53 @@
1
- import { useConnectStore as g } from "../context/hooks.es.js";
2
- import { CONNECT_WIDGET_ID as s, MemberConnectionStatus as a } from "../constants/Connect.es.js";
3
- import i from "./ConnectStatus.es.js";
4
- import o from "react";
5
- import { observer as h } from "mobx-react-lite";
6
- import { jsx as l, jsxs as C } from "react/jsx-runtime";
7
- import { useTheme as E } from "@mui/material/styles";
8
- import { ConnectWidget as W } from "@mxenabled/web-widget-sdk";
9
- var x = ({ isActive: r, loadWidgetProps: d }) => {
10
- let n;
11
- const { loadWidget: f } = g(), [m, e] = o.useState(!1), [u, t] = o.useState(!1), { palette: { mode: c } } = E();
12
- return o.useEffect(() => (r ? (e(!0), f({
13
- mode: c,
14
- ...d
15
- }).then((p) => {
16
- n = new W({
17
- container: `#${s}`,
18
- style: {
19
- border: "none",
20
- height: "calc(100% - 62px)",
21
- maxWidth: "450px",
22
- position: "absolute",
23
- width: "100%"
24
- },
25
- url: p.url,
26
- onSsoUrlLoadError: () => {
27
- e(!1), t(!0);
28
- },
29
- onLoad: () => {
30
- e(!1), t(!1);
31
- }
32
- });
33
- })) : (e(!1), t(!1)), () => {
34
- n?.unmount();
35
- }), [r]), /* @__PURE__ */ C("div", {
36
- id: s,
37
- children: [u && /* @__PURE__ */ l(i, { status: a.Error }), m && /* @__PURE__ */ l(i, { status: a.Loading })]
1
+ import { useConnectStore as D, useEvent as W } from "../context/hooks.es.js";
2
+ import { ANALYTICS_EVENTS as n } from "../constants/Analytics.es.js";
3
+ import { CONNECT_WIDGET_ID as d, MemberConnectionStatus as u } from "../constants/Connect.es.js";
4
+ import c from "./ConnectStatus.es.js";
5
+ import t from "react";
6
+ import { observer as g } from "mobx-react-lite";
7
+ import { jsx as C, jsxs as O } from "react/jsx-runtime";
8
+ import { useTheme as I } from "@mui/material/styles";
9
+ import { ConnectWidget as S } from "@mxenabled/web-widget-sdk";
10
+ var L = ({ isActive: a, loadWidgetProps: N, source: e }) => {
11
+ let E;
12
+ const { loadWidget: p } = D(), { onEvent: r } = W(), [T, o] = t.useState(!1), [s, f] = t.useState(!1), i = t.useRef(!1), l = t.useRef(s);
13
+ l.current = s;
14
+ const { palette: { mode: _ } } = I();
15
+ return t.useEffect(() => {
16
+ const m = () => {
17
+ o(!1), f(!0), e && r(n.CONNECT_WIDGET_ERRORED, { source: e });
18
+ };
19
+ return a ? (i.current = !1, e && r(n.CONNECT_WIDGET_OPENED, { source: e }), o(!0), p({
20
+ mode: _,
21
+ ...N
22
+ }).then((h) => {
23
+ E = new S({
24
+ container: `#${d}`,
25
+ style: {
26
+ border: "none",
27
+ height: "calc(100% - 62px)",
28
+ maxWidth: "450px",
29
+ position: "absolute",
30
+ width: "100%"
31
+ },
32
+ url: h.url,
33
+ onSsoUrlLoadError: m,
34
+ onLoad: () => {
35
+ o(!1), f(!1);
36
+ },
37
+ onMemberConnected: () => {
38
+ i.current = !0, e && r(n.CONNECT_WIDGET_COMPLETED, { source: e });
39
+ }
40
+ });
41
+ }).catch(m)) : (o(!1), f(!1)), () => {
42
+ E?.unmount(), a && e && !i.current && !l.current && r(n.CONNECT_WIDGET_ABANDONED, { source: e });
43
+ };
44
+ }, [a]), /* @__PURE__ */ O("div", {
45
+ id: d,
46
+ children: [s && /* @__PURE__ */ C(c, { status: u.Error }), T && /* @__PURE__ */ C(c, { status: u.Loading })]
38
47
  });
39
- }, w = h(x);
48
+ }, A = g(L);
40
49
  export {
41
- w as default
50
+ A as default
42
51
  };
43
52
 
44
53
  //# sourceMappingURL=ConnectWidgetPanel.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConnectWidgetPanel.es.js","names":[],"sources":["../../../src/common/components/ConnectWidgetPanel.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { useTheme } from '@mui/material/styles'\nimport { ConnectWidget } from '@mxenabled/web-widget-sdk'\n\nimport ConnectStatus from './ConnectStatus'\nimport { CONNECT_WIDGET_ID, MemberConnectionStatus } from '../constants/Connect'\nimport { useConnectStore } from '../context/hooks'\n\nexport interface ConnectWidgetPanelProps {\n loadWidgetProps?: object\n /** Mounts/unmounts the underlying iframe-based ConnectWidget. */\n isActive: boolean\n}\n\n/**\n * The Connect widget itself (SSO url via ConnectStore, the iframe-based\n * `@mxenabled/web-widget-sdk` ConnectWidget, loading/error statuses) with no\n * `Drawer` of its own — content-only, so a caller can put it inside any\n * container (a `Drawer`, as `ConnectDrawer` does, or directly inside another\n * drawer's content slot, as `ConnectWidgetActionBlock` does).\n *\n * Extracted from `ConnectDrawer` so `ConnectWidgetActionBlock` can render just\n * the widget without nesting a second `Drawer` inside `ActionBlockLayer`'s.\n */\nconst ConnectWidgetPanel: React.FC<ConnectWidgetPanelProps> = ({ isActive, loadWidgetProps }) => {\n let connectWidget: ConnectWidget\n\n const { loadWidget } = useConnectStore()\n const [isLoading, setIsLoading] = React.useState(false)\n const [hasError, setHasError] = React.useState(false)\n const {\n palette: { mode },\n } = useTheme()\n\n React.useEffect(() => {\n if (isActive) {\n setIsLoading(true)\n loadWidget({ mode: mode, ...loadWidgetProps }).then((res) => {\n connectWidget = new ConnectWidget({\n container: `#${CONNECT_WIDGET_ID}`,\n style: {\n border: 'none',\n height: 'calc(100% - 62px)',\n maxWidth: '450px',\n position: 'absolute',\n width: '100%',\n },\n url: res.url,\n onSsoUrlLoadError: () => {\n setIsLoading(false)\n setHasError(true)\n },\n onLoad: () => {\n setIsLoading(false)\n setHasError(false)\n },\n })\n })\n } else {\n setIsLoading(false)\n setHasError(false)\n }\n\n return () => {\n connectWidget?.unmount()\n }\n }, [isActive])\n\n return (\n <div id={CONNECT_WIDGET_ID}>\n {hasError && <ConnectStatus status={MemberConnectionStatus.Error} />}\n {isLoading && <ConnectStatus status={MemberConnectionStatus.Loading} />}\n </div>\n )\n}\n\nexport default observer(ConnectWidgetPanel)\n"],"mappings":";;;;;;;;AAyBA,IAAM,IAAA,CAAyD,EAAE,UAAA,GAAU,iBAAA,EAAA,MAAsB;AAC/F,MAAI;AAEJ,QAAM,EAAE,YAAA,EAAA,IAAe,EAAgB,GACjC,CAAC,GAAW,CAAA,IAAgB,EAAM,SAAS,EAAK,GAChD,CAAC,GAAU,CAAA,IAAe,EAAM,SAAS,EAAK,GAC9C,EACJ,SAAS,EAAE,MAAA,EAAA,EAAA,IACT,EAAS;AAEb,SAAA,EAAM,UAAA,OACA,KACF,EAAa,EAAI,GACjB,EAAW;AAAA,IAAQ,MAAA;AAAA,IAAM,GAAG;AAAA,EAAgB,CAAC,EAAE,KAAA,CAAM,MAAQ;AAC3D,IAAA,IAAgB,IAAI,EAAc;AAAA,MAChC,WAAW,IAAI,CAAA;AAAA,MACf,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,MACT;AAAA,MACA,KAAK,EAAI;AAAA,MACT,mBAAA,MAAyB;AACvB,QAAA,EAAa,EAAK,GAClB,EAAY,EAAI;AAAA,MAClB;AAAA,MACA,QAAA,MAAc;AACZ,QAAA,EAAa,EAAK,GAClB,EAAY,EAAK;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,CAAC,MAED,EAAa,EAAK,GAClB,EAAY,EAAK,IAGnB,MAAa;AACX,IAAA,GAAe,QAAQ;AAAA,EACzB,IACC,CAAC,CAAQ,CAAC,GAGX,gBAAA,EAAC,OAAD;AAAA,IAAK,IAAI;AAAA,IAAT,UAAA,CACG,KAAY,gBAAA,EAAC,GAAD,EAAe,QAAQ,EAAuB,MAAQ,CAAA,GAClE,KAAa,gBAAA,EAAC,GAAD,EAAe,QAAQ,EAAuB,QAAU,CAAA,CACnE;AAAA;AAET,GAEA,IAAe,EAAS,CAAkB"}
1
+ {"version":3,"file":"ConnectWidgetPanel.es.js","names":[],"sources":["../../../src/common/components/ConnectWidgetPanel.tsx"],"sourcesContent":["import React from 'react'\nimport { observer } from 'mobx-react-lite'\nimport { useTheme } from '@mui/material/styles'\nimport { ConnectWidget } from '@mxenabled/web-widget-sdk'\n\nimport ConnectStatus from './ConnectStatus'\nimport {\n ANALYTICS_EVENTS,\n CONNECT_WIDGET_ID,\n MemberConnectionStatus,\n type ConnectWidgetSource,\n} from '../constants'\nimport { useConnectStore, useEvent } from '../context/hooks'\n\nexport interface ConnectWidgetPanelProps {\n loadWidgetProps?: object\n /** Mounts/unmounts the underlying iframe-based ConnectWidget. */\n isActive: boolean\n // Optional entry point. When set, the widget lifecycle emits PostHog events:\n // opened on open, completed on member-connect, errored on load failure, and\n // abandoned when an open session ends (close/unmount) without connecting or\n // erroring. Emits nothing when unset, so existing call sites are unaffected.\n source?: ConnectWidgetSource\n}\n\n/**\n * The Connect widget itself (SSO url via ConnectStore, the iframe-based\n * `@mxenabled/web-widget-sdk` ConnectWidget, loading/error statuses) with no\n * `Drawer` of its own — content-only, so a caller can put it inside any\n * container (a `Drawer`, as `ConnectDrawer` does, or directly inside another\n * drawer's content slot, as `ConnectWidgetActionBlock` does).\n *\n * Extracted from `ConnectDrawer` so `ConnectWidgetActionBlock` can render just\n * the widget without nesting a second `Drawer` inside `ActionBlockLayer`'s.\n */\nconst ConnectWidgetPanel: React.FC<ConnectWidgetPanelProps> = ({\n isActive,\n loadWidgetProps,\n source,\n}) => {\n let connectWidget: ConnectWidget\n\n const { loadWidget } = useConnectStore()\n const { onEvent } = useEvent()\n const [isLoading, setIsLoading] = React.useState(false)\n const [hasError, setHasError] = React.useState(false)\n const hasConnectedMember = React.useRef(false)\n // Latest-value mirror of hasError so the effect cleanup's `abandoned` check\n // reads the current error, not the stale value captured when the effect ran.\n const hasErrorRef = React.useRef(hasError)\n hasErrorRef.current = hasError\n const {\n palette: { mode },\n } = useTheme()\n\n React.useEffect(() => {\n // Terminal failure path (SSO url fetch rejects or the widget reports a load\n // error): show the error state and close the funnel with an errored event.\n const handleError = () => {\n setIsLoading(false)\n setHasError(true)\n if (source) onEvent(ANALYTICS_EVENTS.CONNECT_WIDGET_ERRORED, { source })\n }\n\n if (isActive) {\n hasConnectedMember.current = false\n if (source) onEvent(ANALYTICS_EVENTS.CONNECT_WIDGET_OPENED, { source })\n setIsLoading(true)\n loadWidget({ mode: mode, ...loadWidgetProps })\n .then((res) => {\n connectWidget = new ConnectWidget({\n container: `#${CONNECT_WIDGET_ID}`,\n style: {\n border: 'none',\n height: 'calc(100% - 62px)',\n maxWidth: '450px',\n position: 'absolute',\n width: '100%',\n },\n url: res.url,\n onSsoUrlLoadError: handleError,\n onLoad: () => {\n setIsLoading(false)\n setHasError(false)\n },\n onMemberConnected: () => {\n hasConnectedMember.current = true\n if (source) onEvent(ANALYTICS_EVENTS.CONNECT_WIDGET_COMPLETED, { source })\n },\n })\n })\n .catch(handleError)\n } else {\n setIsLoading(false)\n setHasError(false)\n }\n\n return () => {\n connectWidget?.unmount()\n // Only an open session's cleanup (isActive captured true) is an abandonment;\n // skip initial-mount cleanup and completed/errored runs (the latter already\n // emitted their own terminal event).\n if (isActive && source && !hasConnectedMember.current && !hasErrorRef.current) {\n onEvent(ANALYTICS_EVENTS.CONNECT_WIDGET_ABANDONED, { source })\n }\n }\n }, [isActive])\n\n return (\n <div id={CONNECT_WIDGET_ID}>\n {hasError && <ConnectStatus status={MemberConnectionStatus.Error} />}\n {isLoading && <ConnectStatus status={MemberConnectionStatus.Loading} />}\n </div>\n )\n}\n\nexport default observer(ConnectWidgetPanel)\n"],"mappings":";;;;;;;;;AAmCA,IAAM,IAAA,CAAyD,EAC7D,UAAA,GACA,iBAAA,GACA,QAAA,EAAA,MACI;AACJ,MAAI;AAEJ,QAAM,EAAE,YAAA,EAAA,IAAe,EAAgB,GACjC,EAAE,SAAA,EAAA,IAAY,EAAS,GACvB,CAAC,GAAW,CAAA,IAAgB,EAAM,SAAS,EAAK,GAChD,CAAC,GAAU,CAAA,IAAe,EAAM,SAAS,EAAK,GAC9C,IAAqB,EAAM,OAAO,EAAK,GAGvC,IAAc,EAAM,OAAO,CAAQ;AACzC,EAAA,EAAY,UAAU;AACtB,QAAM,EACJ,SAAS,EAAE,MAAA,EAAA,EAAA,IACT,EAAS;AAEb,SAAA,EAAM,UAAA,MAAgB;AAGpB,UAAM,IAAA,MAAoB;AACxB,MAAA,EAAa,EAAK,GAClB,EAAY,EAAI,GACZ,KAAQ,EAAQ,EAAiB,wBAAwB,EAAE,QAAA,EAAO,CAAC;AAAA,IACzE;AAEA,WAAI,KACF,EAAmB,UAAU,IACzB,KAAQ,EAAQ,EAAiB,uBAAuB,EAAE,QAAA,EAAO,CAAC,GACtE,EAAa,EAAI,GACjB,EAAW;AAAA,MAAQ,MAAA;AAAA,MAAM,GAAG;AAAA,IAAgB,CAAC,EAC1C,KAAA,CAAM,MAAQ;AACb,MAAA,IAAgB,IAAI,EAAc;AAAA,QAChC,WAAW,IAAI,CAAA;AAAA,QACf,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,UAAU;AAAA,UACV,OAAO;AAAA,QACT;AAAA,QACA,KAAK,EAAI;AAAA,QACT,mBAAmB;AAAA,QACnB,QAAA,MAAc;AACZ,UAAA,EAAa,EAAK,GAClB,EAAY,EAAK;AAAA,QACnB;AAAA,QACA,mBAAA,MAAyB;AACvB,UAAA,EAAmB,UAAU,IACzB,KAAQ,EAAQ,EAAiB,0BAA0B,EAAE,QAAA,EAAO,CAAC;AAAA,QAC3E;AAAA,MACF,CAAC;AAAA,IACH,CAAC,EACA,MAAM,CAAW,MAEpB,EAAa,EAAK,GAClB,EAAY,EAAK,IAGnB,MAAa;AACX,MAAA,GAAe,QAAQ,GAInB,KAAY,KAAU,CAAC,EAAmB,WAAW,CAAC,EAAY,WACpE,EAAQ,EAAiB,0BAA0B,EAAE,QAAA,EAAO,CAAC;AAAA,IAEjE;AAAA,EACF,GAAG,CAAC,CAAQ,CAAC,GAGX,gBAAA,EAAC,OAAD;AAAA,IAAK,IAAI;AAAA,IAAT,UAAA,CACG,KAAY,gBAAA,EAAC,GAAD,EAAe,QAAQ,EAAuB,MAAQ,CAAA,GAClE,KAAa,gBAAA,EAAC,GAAD,EAAe,QAAQ,EAAuB,QAAU,CAAA,CACnE;AAAA;AAET,GAEA,IAAe,EAAS,CAAkB"}
@@ -132,4 +132,10 @@ export declare const ANALYTICS_EVENTS: {
132
132
  TRENDS_LOAD_WIDGET: string;
133
133
  TRENDS_VIEW_TRANSACTIONS: string;
134
134
  WIDGET_SIZE_CHANGED: string;
135
+ BANNER_VIEW: string;
136
+ BANNER_CLICK: string;
137
+ CONNECT_WIDGET_OPENED: string;
138
+ CONNECT_WIDGET_COMPLETED: string;
139
+ CONNECT_WIDGET_ABANDONED: string;
140
+ CONNECT_WIDGET_ERRORED: string;
135
141
  };
@@ -131,7 +131,13 @@ var _ = {
131
131
  TRENDS_HOVER_LEGEND: "trends_hover_ChartLegend",
132
132
  TRENDS_LOAD_WIDGET: "trends_load_widget",
133
133
  TRENDS_VIEW_TRANSACTIONS: "trends_view_transactions",
134
- WIDGET_SIZE_CHANGED: "widget_size_changed"
134
+ WIDGET_SIZE_CHANGED: "widget_size_changed",
135
+ BANNER_VIEW: "viewed_banner",
136
+ BANNER_CLICK: "clicked_banner",
137
+ CONNECT_WIDGET_OPENED: "opened_connect_widget",
138
+ CONNECT_WIDGET_COMPLETED: "completed_connect_widget",
139
+ CONNECT_WIDGET_ABANDONED: "abandoned_connect_widget",
140
+ CONNECT_WIDGET_ERRORED: "errored_connect_widget"
135
141
  };
136
142
  export {
137
143
  _ as ANALYTICS_EVENTS
@@ -1 +1 @@
1
- {"version":3,"file":"Analytics.es.js","names":[],"sources":["../../../src/common/constants/Analytics.ts"],"sourcesContent":["export const ANALYTICS_EVENTS = {\n ACCOUNTS_CLICK_ACCOUNT: 'accounts_widget_click_account',\n ACCOUNTS_CLICK_CONNECT: 'accounts_widget_click_connect_accounts',\n ACCOUNTS_CLICK_FILTER: 'accounts_widget_click_filter_accounts',\n ACCOUNTS_CLICK_SYNC: 'accounts_widget_click_sync',\n ACCOUNT_DETAILS_CLICK_HIDE: 'account_details_click_hide_account',\n ACCOUNT_DETAILS_CLICK_MARK_CLOSED: 'account_details_click_mark_as_closed',\n ACCOUNT_DETAILS_CLICK_MARK_DUPLICATE: 'account_details_click_mark_as_duplicate',\n ACCOUNT_DETAILS_CLICK_TRANSACTION: 'account_details_click_transaction',\n ACCOUNT_DETAILS_VIEW: 'account_details',\n ACCOUNT_DETAILS_VIEW_TRANSACTIONS: 'account_details_transactions',\n BUDGETS_CLICK_ADD: 'budgets_widget_click_add_budget',\n BUDGETS_CLICK_BUDGET_CATEGORY: 'budgets_widget_click_budget_category',\n BUDGETS_CLICK_EDIT_INCOME: 'budgets_widget_click_edit_income',\n BUDGETS_CLICK_FILTER: 'budgets_widget_click_filter_accounts',\n BUDGETS_VIEW: 'budgets',\n CASH_FLOW_CLICK_FILTER: 'cash_flow_widget_click_filter_accounts',\n CASH_FLOW_CLICK_SETTINGS: 'cash_flow_widget_click_settings',\n DEBTS_CLICK_CHART_AREA: 'debts_widget_click_chart_area',\n DEBTS_CLICK_FILTER: 'debts_widget_click_filter_accounts',\n DEBTS_CLICK_PAYDOWN: 'debts_widget_click_paydown',\n DEBTS_CLICK_PRIORITY: 'debts_widget_click_priority',\n DEBTS_CLICK_PRIORITIZE: 'debts_widget_click_prioritize',\n DEBTS_CLICK_SNOWBALL_CTA: 'debts_widget_click_snowball_cta',\n DEBTS_CLICK_TABLE_ROW: 'debts_widget_click_table_row',\n DEBTS_CLICK_TABLE_SORT: 'debts_widget_click_table_sort',\n DEBTS_SAVE_BALANCE_ACTION: 'debts_widget_click_balance_action',\n DEBTS_SAVE_PAYDOWN_ACTION: 'debts_widget_click_paydown_action',\n DEBTS_SAVE_PAYMENT_ACTION: 'debts_widget_click_payment_action',\n DEBTS_SAVE_RATE_ACTION: 'debts_widget_click_rate_action',\n DEBTS_VIEW: 'debts',\n DEBT_DETAILS_VIEW: 'debt_details',\n DEBT_SCHEDULE_VIEW: 'debt_schedule',\n GOALS_CLICK_ADD: 'goals_widget_click_add',\n GOALS_CLICK_FILTER: 'goals_widget_click_filter_accounts',\n GOALS_VIEW: 'goals',\n GOALS_MICRO_WIDGET_CTA: 'goals_micro_widget_click_see_details_cta',\n HELP_CLICK_CATEGORY: 'help_click_category',\n HELP_CLICK_NEED_MORE_ASSISTANCE: 'help_click_needMoreAssistance',\n HELP_CLICK_OPEN_CASE: 'help_click_openCase',\n HELP_CLICK_REQUEST_SUPPORT: 'help_click_requestSupport',\n HELP_CLICK_SUPPORT_FOR_INSTITUTION: 'help_click_supportForInstitution',\n HELP_CLICK_SUPPORT_FOR_MISSING_INSTITUTION: 'help_click_supportForMissingInstitution',\n HELP_CLICK_SUPPORT_TOPIC: 'help_click_supportTopic',\n HELP_CLICK_TOPIC: 'help_click_topic',\n HELP_EXPAND_CATEGORY: 'help_expand_category',\n HELP_EXPAND_TOPIC: 'help_expand_topic',\n HELP_SUBMIT_SUPPORT_REQUEST: 'help_submit_supportRequest',\n INVESTMENTS: 'Investments',\n INVESTMENT_WIDGET_ACCOUNT_FILTER_CLICK: 'investment_widget_account_filter_click',\n INVESTMENT_WIDGET_ALLOCATION_CLICK: 'investment_widget_allocation_click',\n INVESTMENT_WIDGET_ANALYSIS_CLICK: 'investment_widget_analysis_click',\n INVESTMENT_WIDGET_DETAILS_CLICK: 'investment_widget_details_click',\n NET_WORTH_VIEW: 'netWorth',\n NETWORTH_MICRO_WIDGET_CTA: 'net_worth_micro_widget_click_see_details_cta',\n NET_WORTH_WIDGET_CLICK_ASSETS_LIABILITIES: 'net_worth_widget_click_view_assets_liabilities',\n NET_WORTH_WIDGET_CLICK_FILTER: 'net_worth_widget_click_filter_accounts',\n NET_WORTH_WIDGET_CLICK_TIMEFRAME: 'netWorth_click_timePeriod',\n RECURRING_ACTIVITY_CLICK_ADD_EXPENSE:\n 'recurring_transactions_widget_manage_expenses_click_add_expense',\n RECURRING_ACTIVITY_CLICK_ADD_INCOME:\n 'recurring_transactions_widget_income_details_click_add_income',\n RECURRING_ACTIVITY_CLICK_CALENDAR_RIGHT: 'recurring_transactions_widget_click_calendar_right',\n RECURRING_ACTIVITY_CLICK_EXPENSE: 'recurring_transactions_widget_manage_expenses_click_expense',\n RECURRING_ACTIVITY_CLICK_FILTER: 'recurring_transactions_widget_click_filter_accounts',\n RECURRING_ACTIVITY_CLICK_INCOME: 'recurring_transactions_widget_click_income',\n RECURRING_ACTIVITY_CLICK_PAID: 'recurring_transactions_widget_click_paid_expense',\n RECURRING_ACTIVITY_CLICK_SETTINGS: 'recurring_transactions_widget_click_settings',\n RECURRING_ACTIVITY_CLICK_UPCOMING: 'recurring_transactions_widget_click_upcoming_transaction',\n RECURRING_TRANSACTIONS_CLICK_ADD_EXPENSE:\n 'recurring_transactions_widget_manage_expenses_click_add_expense',\n RECURRING_TRANSACTIONS_CLICK_ADD_INCOME:\n 'recurring_transactions_widget_income_details_click_add_income',\n RECURRING_TRANSACTIONS_CLICK_CALENDAR_RIGHT: 'recurring_transactions_widget_click_calendar_right',\n RECURRING_TRANSACTIONS_CLICK_EXPENSE:\n 'recurring_transactions_widget_manage_expenses_click_expense',\n RECURRING_TRANSACTIONS_CLICK_FILTER: 'recurring_transactions_widget_click_filter_accounts',\n RECURRING_TRANSACTIONS_CLICK_INCOME: 'recurring_transactions_widget_click_income',\n RECURRING_TRANSACTIONS_CLICK_PAID: 'recurring_transactions_widget_click_paid_expense',\n RECURRING_TRANSACTIONS_CLICK_SETTINGS: 'recurring_transactions_widget_click_settings',\n RECURRING_TRANSACTIONS_CLICK_UPCOMING: 'recurring_transactions_widget_click_upcoming_transaction',\n RECURRING_TRANSACTIONS_DETAILS_CLICK_DELETE: 'recurring_transactions_widget_details_click_delete',\n RECURRING_TRANSACTIONS_DETAILS_CLICK_PAYMENT_SCHEDULE:\n 'recurring_transactions_widget_details_click_payment_schedule',\n RECURRING_TRANSACTIONS_LIST_CLICK_MARK_AS_PAID:\n 'recurring_transactions_widget_list_click_mark_as_paid',\n RECURRING_TRANSACTIONS_LIST_CLICK_MARK_AS_UNPAID:\n 'recurring_transactions_widget_list_click_mark_as_unpaid',\n RECURRING_TRANSACTIONS_LIST_CLICK_MORE_MENU: 'recurring_transactions_widget_list_click_more_menu',\n RECURRING_TRANSACTIONS_MICRO_WIDGET_CTA: 'recurring_transactions_micro_widget_click_view_all_cta',\n SPENDING_CLICK_FILTER: 'spending_widget_click_filter_accounts',\n SPENDING_VIEW: 'spending',\n TRANSACTIONS_ADD_MANUAL_ACCOUNT_MODAL: 'transactions_add_manual_account_modal',\n TRANSACTIONS_CLICK_ADD: 'transactions_click_add_transaction',\n TRANSACTIONS_CLICK_DETAILS: 'transactions_click_transaction_details',\n TRANSACTIONS_CLICK_EXPORT: 'transactions_click_export_csv',\n TRANSACTIONS_CLICK_FILTER: 'transactions_click_filter_accounts',\n TRANSACTIONS_CLICK_SEARCH: 'transactions_click_search',\n TRANSACTIONS_VIEW: 'transactions',\n TRANSACTION_DETAILS_CLICK_AMOUNT: 'transaction_details_click_transaction_amount',\n TRANSACTION_DETAILS_CLICK_CATEGORY: 'transaction_details_click_category',\n TRANSACTION_DETAILS_CLICK_DATE: 'transaction_details_click_date',\n TRANSACTION_DETAILS_CLICK_DELETE_LOGO: 'transaction_details_click_delete_merchant_logo',\n TRANSACTION_DETAILS_CLICK_DESCRIPTION: 'transaction_details_click_edit_description',\n TRANSACTION_DETAILS_CLICK_FLAG: 'transaction_details_click_flag_transaction',\n TRANSACTION_DETAILS_CLICK_MEMO: 'transaction_details_click_memo',\n TRANSACTION_DETAILS_CLICK_SPLIT: 'transaction_details_click_split_transaction',\n TRANSACTION_DETAILS_CLICK_TAGS: 'transaction_details_click_tags',\n TRANSACTION_DETAILS_CLICK_UNSPLIT: 'transaction_details_click_unsplit_transaction',\n TRANSACTION_DETAILS_VIEW: 'transaction_details',\n TRANSACTIONS_TABLE_CLICK_CATEGORY: 'transactions_table_click_category',\n WIDGET_BACK_CLICK: 'widget_back_button_click',\n\n // NEW ANAYTICS EVENT FORMAT\n // widget_action_subject\n GOALS_CLICK_GET_STARTED: 'goals_click_getStarted',\n GOALS_CLICK_VIEW_DETAILS: 'goals_click_viewDetails',\n GOALS_LOAD_WIDGET: 'goals_load_widget',\n NET_WORTH_CLICK_GET_STARTED: 'netWorth_click_getStarted',\n NET_WORTH_CLICK_VIEW_DETAILS: 'netWorth_click_viewDetails',\n NET_WORTH_LOAD_WIDGET: 'netWorth_load_widget',\n RECURRING_TRANSACTIONS_CLICK_GET_STARTED: 'recurringTransactions_click_getStarted',\n RECURRING_TRANSACTIONS_CLICK_VIEW_ALL: 'recurringTransactions_click_viewAll',\n RECURRING_TRANSACTIONS_LOAD_WIDGET: 'recurringTransactions_load_widget',\n TRENDS_CLICK_ALL_CATEGORIES: 'trends_click_allCategories',\n TRENDS_CLICK_BACK: 'trends_click_back',\n TRENDS_CLICK_CHART: 'trends_click_chart',\n TRENDS_CLICK_CONNECT_ACCOUNTS: 'trends_click_connectAccounts',\n TRENDS_CLICK_EXPORT_CSV: 'trends_click_exportCSV',\n TRENDS_CLICK_FILTER: 'trends_click_filter',\n TRENDS_CLICK_GET_STARTED: 'trends_click_getStarted',\n TRENDS_CLICK_INSIGHT: 'trends_click_insight',\n TRENDS_CLICK_LEGEND: 'trends_click_legend',\n TRENDS_CLICK_LIST_ITEM: 'trends_click_listItem',\n TRENDS_CLICK_TABLE_SORT: 'trends_click_tableSort',\n TRENDS_CLICK_TIME_WINDOW: 'trends_click_timeWindow',\n TRENDS_CLICK_TOGGLE_VIEW: 'trends_click_toggleView',\n TRENDS_CLICK_VIEW_MORE: 'trends_click_viewMore',\n TRENDS_CLICK_VIEW_TRANSACTIONS: 'trends_click_viewTransactions',\n TRENDS_HOVER_AREA: 'trends_hover_chartArea',\n TRENDS_HOVER_POINT: 'trends_hover_chartPoint',\n TRENDS_HOVER_LEGEND: 'trends_hover_ChartLegend',\n TRENDS_LOAD_WIDGET: 'trends_load_widget',\n TRENDS_VIEW_TRANSACTIONS: 'trends_view_transactions',\n WIDGET_SIZE_CHANGED: 'widget_size_changed',\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Analytics.es.js","names":[],"sources":["../../../src/common/constants/Analytics.ts"],"sourcesContent":["export const ANALYTICS_EVENTS = {\n ACCOUNTS_CLICK_ACCOUNT: 'accounts_widget_click_account',\n ACCOUNTS_CLICK_CONNECT: 'accounts_widget_click_connect_accounts',\n ACCOUNTS_CLICK_FILTER: 'accounts_widget_click_filter_accounts',\n ACCOUNTS_CLICK_SYNC: 'accounts_widget_click_sync',\n ACCOUNT_DETAILS_CLICK_HIDE: 'account_details_click_hide_account',\n ACCOUNT_DETAILS_CLICK_MARK_CLOSED: 'account_details_click_mark_as_closed',\n ACCOUNT_DETAILS_CLICK_MARK_DUPLICATE: 'account_details_click_mark_as_duplicate',\n ACCOUNT_DETAILS_CLICK_TRANSACTION: 'account_details_click_transaction',\n ACCOUNT_DETAILS_VIEW: 'account_details',\n ACCOUNT_DETAILS_VIEW_TRANSACTIONS: 'account_details_transactions',\n BUDGETS_CLICK_ADD: 'budgets_widget_click_add_budget',\n BUDGETS_CLICK_BUDGET_CATEGORY: 'budgets_widget_click_budget_category',\n BUDGETS_CLICK_EDIT_INCOME: 'budgets_widget_click_edit_income',\n BUDGETS_CLICK_FILTER: 'budgets_widget_click_filter_accounts',\n BUDGETS_VIEW: 'budgets',\n CASH_FLOW_CLICK_FILTER: 'cash_flow_widget_click_filter_accounts',\n CASH_FLOW_CLICK_SETTINGS: 'cash_flow_widget_click_settings',\n DEBTS_CLICK_CHART_AREA: 'debts_widget_click_chart_area',\n DEBTS_CLICK_FILTER: 'debts_widget_click_filter_accounts',\n DEBTS_CLICK_PAYDOWN: 'debts_widget_click_paydown',\n DEBTS_CLICK_PRIORITY: 'debts_widget_click_priority',\n DEBTS_CLICK_PRIORITIZE: 'debts_widget_click_prioritize',\n DEBTS_CLICK_SNOWBALL_CTA: 'debts_widget_click_snowball_cta',\n DEBTS_CLICK_TABLE_ROW: 'debts_widget_click_table_row',\n DEBTS_CLICK_TABLE_SORT: 'debts_widget_click_table_sort',\n DEBTS_SAVE_BALANCE_ACTION: 'debts_widget_click_balance_action',\n DEBTS_SAVE_PAYDOWN_ACTION: 'debts_widget_click_paydown_action',\n DEBTS_SAVE_PAYMENT_ACTION: 'debts_widget_click_payment_action',\n DEBTS_SAVE_RATE_ACTION: 'debts_widget_click_rate_action',\n DEBTS_VIEW: 'debts',\n DEBT_DETAILS_VIEW: 'debt_details',\n DEBT_SCHEDULE_VIEW: 'debt_schedule',\n GOALS_CLICK_ADD: 'goals_widget_click_add',\n GOALS_CLICK_FILTER: 'goals_widget_click_filter_accounts',\n GOALS_VIEW: 'goals',\n GOALS_MICRO_WIDGET_CTA: 'goals_micro_widget_click_see_details_cta',\n HELP_CLICK_CATEGORY: 'help_click_category',\n HELP_CLICK_NEED_MORE_ASSISTANCE: 'help_click_needMoreAssistance',\n HELP_CLICK_OPEN_CASE: 'help_click_openCase',\n HELP_CLICK_REQUEST_SUPPORT: 'help_click_requestSupport',\n HELP_CLICK_SUPPORT_FOR_INSTITUTION: 'help_click_supportForInstitution',\n HELP_CLICK_SUPPORT_FOR_MISSING_INSTITUTION: 'help_click_supportForMissingInstitution',\n HELP_CLICK_SUPPORT_TOPIC: 'help_click_supportTopic',\n HELP_CLICK_TOPIC: 'help_click_topic',\n HELP_EXPAND_CATEGORY: 'help_expand_category',\n HELP_EXPAND_TOPIC: 'help_expand_topic',\n HELP_SUBMIT_SUPPORT_REQUEST: 'help_submit_supportRequest',\n INVESTMENTS: 'Investments',\n INVESTMENT_WIDGET_ACCOUNT_FILTER_CLICK: 'investment_widget_account_filter_click',\n INVESTMENT_WIDGET_ALLOCATION_CLICK: 'investment_widget_allocation_click',\n INVESTMENT_WIDGET_ANALYSIS_CLICK: 'investment_widget_analysis_click',\n INVESTMENT_WIDGET_DETAILS_CLICK: 'investment_widget_details_click',\n NET_WORTH_VIEW: 'netWorth',\n NETWORTH_MICRO_WIDGET_CTA: 'net_worth_micro_widget_click_see_details_cta',\n NET_WORTH_WIDGET_CLICK_ASSETS_LIABILITIES: 'net_worth_widget_click_view_assets_liabilities',\n NET_WORTH_WIDGET_CLICK_FILTER: 'net_worth_widget_click_filter_accounts',\n NET_WORTH_WIDGET_CLICK_TIMEFRAME: 'netWorth_click_timePeriod',\n RECURRING_ACTIVITY_CLICK_ADD_EXPENSE:\n 'recurring_transactions_widget_manage_expenses_click_add_expense',\n RECURRING_ACTIVITY_CLICK_ADD_INCOME:\n 'recurring_transactions_widget_income_details_click_add_income',\n RECURRING_ACTIVITY_CLICK_CALENDAR_RIGHT: 'recurring_transactions_widget_click_calendar_right',\n RECURRING_ACTIVITY_CLICK_EXPENSE: 'recurring_transactions_widget_manage_expenses_click_expense',\n RECURRING_ACTIVITY_CLICK_FILTER: 'recurring_transactions_widget_click_filter_accounts',\n RECURRING_ACTIVITY_CLICK_INCOME: 'recurring_transactions_widget_click_income',\n RECURRING_ACTIVITY_CLICK_PAID: 'recurring_transactions_widget_click_paid_expense',\n RECURRING_ACTIVITY_CLICK_SETTINGS: 'recurring_transactions_widget_click_settings',\n RECURRING_ACTIVITY_CLICK_UPCOMING: 'recurring_transactions_widget_click_upcoming_transaction',\n RECURRING_TRANSACTIONS_CLICK_ADD_EXPENSE:\n 'recurring_transactions_widget_manage_expenses_click_add_expense',\n RECURRING_TRANSACTIONS_CLICK_ADD_INCOME:\n 'recurring_transactions_widget_income_details_click_add_income',\n RECURRING_TRANSACTIONS_CLICK_CALENDAR_RIGHT: 'recurring_transactions_widget_click_calendar_right',\n RECURRING_TRANSACTIONS_CLICK_EXPENSE:\n 'recurring_transactions_widget_manage_expenses_click_expense',\n RECURRING_TRANSACTIONS_CLICK_FILTER: 'recurring_transactions_widget_click_filter_accounts',\n RECURRING_TRANSACTIONS_CLICK_INCOME: 'recurring_transactions_widget_click_income',\n RECURRING_TRANSACTIONS_CLICK_PAID: 'recurring_transactions_widget_click_paid_expense',\n RECURRING_TRANSACTIONS_CLICK_SETTINGS: 'recurring_transactions_widget_click_settings',\n RECURRING_TRANSACTIONS_CLICK_UPCOMING: 'recurring_transactions_widget_click_upcoming_transaction',\n RECURRING_TRANSACTIONS_DETAILS_CLICK_DELETE: 'recurring_transactions_widget_details_click_delete',\n RECURRING_TRANSACTIONS_DETAILS_CLICK_PAYMENT_SCHEDULE:\n 'recurring_transactions_widget_details_click_payment_schedule',\n RECURRING_TRANSACTIONS_LIST_CLICK_MARK_AS_PAID:\n 'recurring_transactions_widget_list_click_mark_as_paid',\n RECURRING_TRANSACTIONS_LIST_CLICK_MARK_AS_UNPAID:\n 'recurring_transactions_widget_list_click_mark_as_unpaid',\n RECURRING_TRANSACTIONS_LIST_CLICK_MORE_MENU: 'recurring_transactions_widget_list_click_more_menu',\n RECURRING_TRANSACTIONS_MICRO_WIDGET_CTA: 'recurring_transactions_micro_widget_click_view_all_cta',\n SPENDING_CLICK_FILTER: 'spending_widget_click_filter_accounts',\n SPENDING_VIEW: 'spending',\n TRANSACTIONS_ADD_MANUAL_ACCOUNT_MODAL: 'transactions_add_manual_account_modal',\n TRANSACTIONS_CLICK_ADD: 'transactions_click_add_transaction',\n TRANSACTIONS_CLICK_DETAILS: 'transactions_click_transaction_details',\n TRANSACTIONS_CLICK_EXPORT: 'transactions_click_export_csv',\n TRANSACTIONS_CLICK_FILTER: 'transactions_click_filter_accounts',\n TRANSACTIONS_CLICK_SEARCH: 'transactions_click_search',\n TRANSACTIONS_VIEW: 'transactions',\n TRANSACTION_DETAILS_CLICK_AMOUNT: 'transaction_details_click_transaction_amount',\n TRANSACTION_DETAILS_CLICK_CATEGORY: 'transaction_details_click_category',\n TRANSACTION_DETAILS_CLICK_DATE: 'transaction_details_click_date',\n TRANSACTION_DETAILS_CLICK_DELETE_LOGO: 'transaction_details_click_delete_merchant_logo',\n TRANSACTION_DETAILS_CLICK_DESCRIPTION: 'transaction_details_click_edit_description',\n TRANSACTION_DETAILS_CLICK_FLAG: 'transaction_details_click_flag_transaction',\n TRANSACTION_DETAILS_CLICK_MEMO: 'transaction_details_click_memo',\n TRANSACTION_DETAILS_CLICK_SPLIT: 'transaction_details_click_split_transaction',\n TRANSACTION_DETAILS_CLICK_TAGS: 'transaction_details_click_tags',\n TRANSACTION_DETAILS_CLICK_UNSPLIT: 'transaction_details_click_unsplit_transaction',\n TRANSACTION_DETAILS_VIEW: 'transaction_details',\n TRANSACTIONS_TABLE_CLICK_CATEGORY: 'transactions_table_click_category',\n WIDGET_BACK_CLICK: 'widget_back_button_click',\n\n // NEW ANAYTICS EVENT FORMAT\n // widget_action_subject\n GOALS_CLICK_GET_STARTED: 'goals_click_getStarted',\n GOALS_CLICK_VIEW_DETAILS: 'goals_click_viewDetails',\n GOALS_LOAD_WIDGET: 'goals_load_widget',\n NET_WORTH_CLICK_GET_STARTED: 'netWorth_click_getStarted',\n NET_WORTH_CLICK_VIEW_DETAILS: 'netWorth_click_viewDetails',\n NET_WORTH_LOAD_WIDGET: 'netWorth_load_widget',\n RECURRING_TRANSACTIONS_CLICK_GET_STARTED: 'recurringTransactions_click_getStarted',\n RECURRING_TRANSACTIONS_CLICK_VIEW_ALL: 'recurringTransactions_click_viewAll',\n RECURRING_TRANSACTIONS_LOAD_WIDGET: 'recurringTransactions_load_widget',\n TRENDS_CLICK_ALL_CATEGORIES: 'trends_click_allCategories',\n TRENDS_CLICK_BACK: 'trends_click_back',\n TRENDS_CLICK_CHART: 'trends_click_chart',\n TRENDS_CLICK_CONNECT_ACCOUNTS: 'trends_click_connectAccounts',\n TRENDS_CLICK_EXPORT_CSV: 'trends_click_exportCSV',\n TRENDS_CLICK_FILTER: 'trends_click_filter',\n TRENDS_CLICK_GET_STARTED: 'trends_click_getStarted',\n TRENDS_CLICK_INSIGHT: 'trends_click_insight',\n TRENDS_CLICK_LEGEND: 'trends_click_legend',\n TRENDS_CLICK_LIST_ITEM: 'trends_click_listItem',\n TRENDS_CLICK_TABLE_SORT: 'trends_click_tableSort',\n TRENDS_CLICK_TIME_WINDOW: 'trends_click_timeWindow',\n TRENDS_CLICK_TOGGLE_VIEW: 'trends_click_toggleView',\n TRENDS_CLICK_VIEW_MORE: 'trends_click_viewMore',\n TRENDS_CLICK_VIEW_TRANSACTIONS: 'trends_click_viewTransactions',\n TRENDS_HOVER_AREA: 'trends_hover_chartArea',\n TRENDS_HOVER_POINT: 'trends_hover_chartPoint',\n TRENDS_HOVER_LEGEND: 'trends_hover_ChartLegend',\n TRENDS_LOAD_WIDGET: 'trends_load_widget',\n TRENDS_VIEW_TRANSACTIONS: 'trends_view_transactions',\n WIDGET_SIZE_CHANGED: 'widget_size_changed',\n\n // Banner ads & connect-widget lifecycle funnel (entry point in the `source`\n // property). Names are the contract with PostHog/Insights — do not rename.\n BANNER_VIEW: 'viewed_banner',\n BANNER_CLICK: 'clicked_banner',\n CONNECT_WIDGET_OPENED: 'opened_connect_widget',\n CONNECT_WIDGET_COMPLETED: 'completed_connect_widget',\n CONNECT_WIDGET_ABANDONED: 'abandoned_connect_widget',\n CONNECT_WIDGET_ERRORED: 'errored_connect_widget',\n}\n"],"mappings":"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"}
@@ -4,3 +4,10 @@ export declare enum MemberConnectionStatus {
4
4
  Loading = "loading",
5
5
  Error = "error"
6
6
  }
7
+ export declare const DEEP_LINK_TYPE: {
8
+ readonly CONNECT: 2;
9
+ };
10
+ export declare const CONNECT_WIDGET_SOURCES: {
11
+ readonly BANNER: "banner";
12
+ };
13
+ export type ConnectWidgetSource = (typeof CONNECT_WIDGET_SOURCES)[keyof typeof CONNECT_WIDGET_SOURCES];
@@ -1,9 +1,11 @@
1
- var n = "connect_widget", o = "connections_widget", _ = /* @__PURE__ */ (function(r) {
1
+ var E = "connect_widget", N = "connections_widget", _ = /* @__PURE__ */ (function(r) {
2
2
  return r.Loading = "loading", r.Error = "error", r;
3
- })({});
3
+ })({}), n = { CONNECT: 2 }, C = { BANNER: "banner" };
4
4
  export {
5
- o as CONNECTIONS_WIDGET_ID,
6
- n as CONNECT_WIDGET_ID,
5
+ N as CONNECTIONS_WIDGET_ID,
6
+ E as CONNECT_WIDGET_ID,
7
+ C as CONNECT_WIDGET_SOURCES,
8
+ n as DEEP_LINK_TYPE,
7
9
  _ as MemberConnectionStatus
8
10
  };
9
11
 
@@ -1 +1 @@
1
- {"version":3,"file":"Connect.es.js","names":[],"sources":["../../../src/common/constants/Connect.ts"],"sourcesContent":["export const CONNECT_WIDGET_ID = 'connect_widget'\nexport const CONNECTIONS_WIDGET_ID = 'connections_widget'\n\n// Connection state shared by the foundational `common` layer (ConnectDrawer /\n// ConnectStatus) and the accounts widget. Lives in `common` so `common` does not\n// have to depend on `accounts` (which created a common->accounts layering\n// violation and blocked per-widget code splitting).\nexport enum MemberConnectionStatus {\n Loading = 'loading',\n Error = 'error',\n}\n"],"mappings":"AAAA,IAAa,IAAoB,kBACpB,IAAwB,sBAMzB,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,UAAA,WACA,EAAA,QAAA;AACF,GAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"Connect.es.js","names":[],"sources":["../../../src/common/constants/Connect.ts"],"sourcesContent":["export const CONNECT_WIDGET_ID = 'connect_widget'\nexport const CONNECTIONS_WIDGET_ID = 'connections_widget'\n\n// Connection state shared by the foundational `common` layer (ConnectDrawer /\n// ConnectStatus) and the accounts widget. Lives in `common` so `common` does not\n// have to depend on `accounts` (which created a common->accounts layering\n// violation and blocked per-widget code splitting).\nexport enum MemberConnectionStatus {\n Loading = 'loading',\n Error = 'error',\n}\n\n// In-app destination advertised by a banner ad (`Banner.deep_link_type`). Value\n// matches bullseye's DeepLinkType enum (CONNECT_WIDGET = 2). Longbow does not\n// surface it in the banner response yet, so until it does every banner falls\n// back to its external `redirect_url` and this path stays inert.\nexport const DEEP_LINK_TYPE = {\n CONNECT: 2,\n} as const\n\n// Entry point a ConnectDrawer was opened from, sent as `source` on the\n// connect-widget lifecycle events. Call sites with no source emit no events.\nexport const CONNECT_WIDGET_SOURCES = {\n BANNER: 'banner',\n} as const\n\nexport type ConnectWidgetSource =\n (typeof CONNECT_WIDGET_SOURCES)[keyof typeof CONNECT_WIDGET_SOURCES]\n"],"mappings":"AAAA,IAAa,IAAoB,kBACpB,IAAwB,sBAMzB,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,UAAA,WACA,EAAA,QAAA;AACF,GAAA,CAAA,CAAA,GAMa,IAAiB,EAC5B,SAAS,EACX,GAIa,IAAyB,EACpC,QAAQ,SACV"}
@@ -1,5 +1,6 @@
1
1
  export { ANALYTICS_EVENTS } from './Analytics';
2
- export { CONNECT_WIDGET_ID, CONNECTIONS_WIDGET_ID, MemberConnectionStatus } from './Connect';
2
+ export { CONNECT_WIDGET_ID, CONNECT_WIDGET_SOURCES, CONNECTIONS_WIDGET_ID, DEEP_LINK_TYPE, MemberConnectionStatus, } from './Connect';
3
+ export type { ConnectWidgetSource } from './Connect';
3
4
  export { INCOME_ACCOUNT_TYPES, PAYMENT_ACCOUNT_TYPES, SPENDING_ACCOUNT_TYPES } from './Account';
4
5
  export { RECURRENCE_COPY } from './ScheduledPayment';
5
6
  export { LOADING_STATUS } from './SpendingPlan';
@@ -4,9 +4,9 @@ import a from "./components/charts/StatusBar.es.js";
4
4
  import p from "./components/charts/Donut.es.js";
5
5
  import u from "./hooks/useAccountDisplayName.es.js";
6
6
  import { useCombineEvents as C, useCombinePageviews as S } from "./hooks/useCombineEvents.es.js";
7
- import { GlobalDataContext as c, GlobalDataProvider as d } from "./context/GlobalDataProvider.es.js";
8
- import { WidgetContainerContext as E, WidgetContainerProvider as D } from "./context/WidgetContainerProvider.es.js";
9
- import { useAccountStore as I, useActionContext as N, useAppConfig as P, useBudgetsStore as y, useCashflowStore as A, useCategoryStore as b, useDebtStore as O, useError as W, useEvent as G, useFinstrongStore as L, useGlobalCopyStore as R, useGlobalStore as U, useGlobalUiStore as v, useGoalStore as B, useHelpStore as h, useHoldingStore as w, useInsightsV2Store as x, useLoad as M, useMerchantStore as Y, useNetWorthStore as H, useNotificationStore as F, usePageView as z, useRecurringTransactionsStore as V, useSettingsStore as Z, useTransactionStore as k, useTrendsStore as q, useUserStore as K, useWidgetContainerProvider as j } from "./context/hooks.es.js";
7
+ import { GlobalDataContext as c, GlobalDataProvider as T } from "./context/GlobalDataProvider.es.js";
8
+ import { WidgetContainerContext as d, WidgetContainerProvider as D } from "./context/WidgetContainerProvider.es.js";
9
+ import { useAccountStore as I, useActionContext as N, useAppConfig as P, useBudgetsStore as y, useCashflowStore as A, useCategoryStore as O, useDebtStore as b, useError as W, useEvent as G, useFinstrongStore as L, useGlobalCopyStore as R, useGlobalStore as U, useGlobalUiStore as v, useGoalStore as B, useHelpStore as h, useHoldingStore as w, useInsightsV2Store as x, useLoad as M, useMerchantStore as Y, useNetWorthStore as H, useNotificationStore as F, usePageView as z, useRecurringTransactionsStore as V, useSettingsStore as Z, useTransactionStore as K, useTrendsStore as k, useUserStore as q, useWidgetContainerProvider as j } from "./context/hooks.es.js";
10
10
  import { useInsightsEnabled as Q } from "./hooks/useInsightsEnabled.es.js";
11
11
  import { useScreenSize as $ } from "./hooks/useScreenSize.es.js";
12
12
  import ro from "./hooks/usePrevious.es.js";
@@ -18,112 +18,114 @@ import co from "./components/dialog/Dialog.es.js";
18
18
  import Eo from "./components/drawer/Drawer.es.js";
19
19
  import _o from "./components/daterangeselector/DateRangeSelector.es.js";
20
20
  import { ANALYTICS_EVENTS as No } from "./constants/Analytics.es.js";
21
- import { CONNECTIONS_WIDGET_ID as yo, CONNECT_WIDGET_ID as Ao, MemberConnectionStatus as bo } from "./constants/Connect.es.js";
22
- import { GlobalStore as Wo } from "../core/stores/GlobalStore.es.js";
23
- import { INCOME_ACCOUNT_TYPES as Lo, PAYMENT_ACCOUNT_TYPES as Ro, SPENDING_ACCOUNT_TYPES as Uo } from "./constants/Account.es.js";
24
- import { RECURRENCE_COPY as Bo } from "./constants/ScheduledPayment.es.js";
25
- import { LOADING_STATUS as wo } from "./constants/SpendingPlan.es.js";
26
- import { DEFAULT_DONUT_SIZE as Mo, DEFAULT_STROKE_WIDTH as Yo } from "./constants/Donut.es.js";
27
- import { Sizes as Fo, TOUCH_TARGET as zo } from "./constants/Sizes.es.js";
28
- import Zo from "./components/donuts/MultiSegmentDonut.es.js";
29
- import qo from "./components/donuts/SingleSegmentDonut.es.js";
30
- import jo from "./components/ErrorBoundary.es.js";
31
- import Qo from "./components/Error.es.js";
32
- import $o from "./components/MicroWidgetContainer.es.js";
33
- import rr from "./components/MiniWidgetContainer.es.js";
34
- import { GlobalAccountFilter as er } from "./components/GlobalAccountFilter.es.js";
35
- import mr from "./components/Loader.es.js";
36
- import { WidgetContainer as ar } from "./components/WidgetContainer.es.js";
37
- import pr from "./components/ConnectWidgetPanel.es.js";
38
- import ur from "./components/ConnectDrawer.es.js";
39
- import Cr from "./components/CurrencyDialog.es.js";
40
- import gr from "./components/CurrencyInput.es.js";
21
+ import { CONNECTIONS_WIDGET_ID as yo, CONNECT_WIDGET_ID as Ao, CONNECT_WIDGET_SOURCES as Oo, DEEP_LINK_TYPE as bo, MemberConnectionStatus as Wo } from "./constants/Connect.es.js";
22
+ import { GlobalStore as Lo } from "../core/stores/GlobalStore.es.js";
23
+ import { INCOME_ACCOUNT_TYPES as Uo, PAYMENT_ACCOUNT_TYPES as vo, SPENDING_ACCOUNT_TYPES as Bo } from "./constants/Account.es.js";
24
+ import { RECURRENCE_COPY as wo } from "./constants/ScheduledPayment.es.js";
25
+ import { LOADING_STATUS as Mo } from "./constants/SpendingPlan.es.js";
26
+ import { DEFAULT_DONUT_SIZE as Ho, DEFAULT_STROKE_WIDTH as Fo } from "./constants/Donut.es.js";
27
+ import { Sizes as Vo, TOUCH_TARGET as Zo } from "./constants/Sizes.es.js";
28
+ import ko from "./components/donuts/MultiSegmentDonut.es.js";
29
+ import jo from "./components/donuts/SingleSegmentDonut.es.js";
30
+ import Qo from "./components/ErrorBoundary.es.js";
31
+ import $o from "./components/Error.es.js";
32
+ import rr from "./components/MicroWidgetContainer.es.js";
33
+ import er from "./components/MiniWidgetContainer.es.js";
34
+ import { GlobalAccountFilter as mr } from "./components/GlobalAccountFilter.es.js";
35
+ import ar from "./components/Loader.es.js";
36
+ import { WidgetContainer as pr } from "./components/WidgetContainer.es.js";
37
+ import ur from "./components/ConnectWidgetPanel.es.js";
38
+ import Cr from "./components/ConnectDrawer.es.js";
39
+ import gr from "./components/CurrencyDialog.es.js";
40
+ import Tr from "./components/CurrencyInput.es.js";
41
41
  import dr from "./components/ResponsiveButton.es.js";
42
- import Er from "./components/SearchBox.es.js";
43
- import _r from "./components/SelectionBox.es.js";
44
- import Nr from "./components/TabContentContainer.es.js";
45
- import yr from "./components/IconBacking.es.js";
46
- import br from "./components/DataRow.es.js";
47
- import Wr from "./components/ZeroState.es.js";
48
- import Lr from "./components/InformationTooltip.es.js";
49
- import { ConnectCard as Ur } from "./components/ConnectCard.es.js";
50
- import { CurrencyText as Br } from "./components/CurrencyText.es.js";
51
- import { EmptyState as wr } from "./components/EmptyState.es.js";
52
- import { ListItemAction as Mr } from "./components/ListItemAction.es.js";
53
- import { ListItemRow as Hr } from "./components/ListItemRow.es.js";
54
- import { ListItemWrapper as zr } from "./components/ListItemWrapper.es.js";
55
- import { Select as Zr } from "./components/Select.es.js";
56
- import { ToggleButtonListItem as qr } from "./components/listitems/ToggleButtonListItem.es.js";
57
- import { ToggleListItem as jr } from "./components/listitems/ToggleListItem.es.js";
58
- import { analyticsSession as Qr } from "./utils/Analytics.es.js";
59
- import { getClientComponentOverrides as $r, getClientCustomizations as ot, getClientPaletteOptions as rt, getClientTheme as tt } from "./utils/Theme.es.js";
42
+ import _r from "./components/SearchBox.es.js";
43
+ import Nr from "./components/SelectionBox.es.js";
44
+ import yr from "./components/TabContentContainer.es.js";
45
+ import Or from "./components/IconBacking.es.js";
46
+ import Wr from "./components/DataRow.es.js";
47
+ import Lr from "./components/ZeroState.es.js";
48
+ import Ur from "./components/InformationTooltip.es.js";
49
+ import { ConnectCard as Br } from "./components/ConnectCard.es.js";
50
+ import { CurrencyText as wr } from "./components/CurrencyText.es.js";
51
+ import { EmptyState as Mr } from "./components/EmptyState.es.js";
52
+ import { ListItemAction as Hr } from "./components/ListItemAction.es.js";
53
+ import { ListItemRow as zr } from "./components/ListItemRow.es.js";
54
+ import { ListItemWrapper as Zr } from "./components/ListItemWrapper.es.js";
55
+ import { Select as kr } from "./components/Select.es.js";
56
+ import { ToggleButtonListItem as jr } from "./components/listitems/ToggleButtonListItem.es.js";
57
+ import { ToggleListItem as Qr } from "./components/listitems/ToggleListItem.es.js";
58
+ import { analyticsSession as $r } from "./utils/Analytics.es.js";
59
+ import { getClientComponentOverrides as rt, getClientCustomizations as tt, getClientPaletteOptions as et, getClientTheme as it } from "./utils/Theme.es.js";
60
60
  export {
61
61
  No as ANALYTICS_EVENTS,
62
62
  yo as CONNECTIONS_WIDGET_ID,
63
63
  Ao as CONNECT_WIDGET_ID,
64
+ Oo as CONNECT_WIDGET_SOURCES,
64
65
  i as Calendar,
65
66
  m as CalendarSelectionTypes,
66
- Ur as ConnectCard,
67
- ur as ConnectDrawer,
68
- pr as ConnectWidgetPanel,
69
- Cr as CurrencyDialog,
70
- gr as CurrencyInput,
71
- Br as CurrencyText,
72
- Mo as DEFAULT_DONUT_SIZE,
73
- Yo as DEFAULT_STROKE_WIDTH,
74
- br as DataRow,
67
+ Br as ConnectCard,
68
+ Cr as ConnectDrawer,
69
+ ur as ConnectWidgetPanel,
70
+ gr as CurrencyDialog,
71
+ Tr as CurrencyInput,
72
+ wr as CurrencyText,
73
+ bo as DEEP_LINK_TYPE,
74
+ Ho as DEFAULT_DONUT_SIZE,
75
+ Fo as DEFAULT_STROKE_WIDTH,
76
+ Wr as DataRow,
75
77
  _o as DateRangeSelector,
76
78
  co as Dialog,
77
79
  p as Donut,
78
80
  Eo as Drawer,
79
- wr as EmptyState,
80
- Qo as Error,
81
- jo as ErrorBoundary,
82
- er as GlobalAccountFilter,
81
+ Mr as EmptyState,
82
+ $o as Error,
83
+ Qo as ErrorBoundary,
84
+ mr as GlobalAccountFilter,
83
85
  c as GlobalDataContext,
84
- d as GlobalDataProvider,
85
- Wo as GlobalStore,
86
- Lo as INCOME_ACCOUNT_TYPES,
87
- yr as IconBacking,
88
- Lr as InformationTooltip,
89
- wo as LOADING_STATUS,
90
- Mr as ListItemAction,
91
- Hr as ListItemRow,
92
- zr as ListItemWrapper,
93
- mr as Loader,
94
- bo as MemberConnectionStatus,
95
- $o as MicroWidgetContainer,
96
- rr as MiniWidgetContainer,
97
- Zo as MultiSegmentDonut,
98
- Ro as PAYMENT_ACCOUNT_TYPES,
99
- Bo as RECURRENCE_COPY,
86
+ T as GlobalDataProvider,
87
+ Lo as GlobalStore,
88
+ Uo as INCOME_ACCOUNT_TYPES,
89
+ Or as IconBacking,
90
+ Ur as InformationTooltip,
91
+ Mo as LOADING_STATUS,
92
+ Hr as ListItemAction,
93
+ zr as ListItemRow,
94
+ Zr as ListItemWrapper,
95
+ ar as Loader,
96
+ Wo as MemberConnectionStatus,
97
+ rr as MicroWidgetContainer,
98
+ er as MiniWidgetContainer,
99
+ ko as MultiSegmentDonut,
100
+ vo as PAYMENT_ACCOUNT_TYPES,
101
+ wo as RECURRENCE_COPY,
100
102
  dr as ResponsiveButton,
101
- Uo as SPENDING_ACCOUNT_TYPES,
102
- Er as SearchBox,
103
- Zr as Select,
104
- _r as SelectionBox,
105
- qo as SingleSegmentDonut,
106
- Fo as Sizes,
103
+ Bo as SPENDING_ACCOUNT_TYPES,
104
+ _r as SearchBox,
105
+ kr as Select,
106
+ Nr as SelectionBox,
107
+ jo as SingleSegmentDonut,
108
+ Vo as Sizes,
107
109
  a as StatusBar,
108
- zo as TOUCH_TARGET,
109
- Nr as TabContentContainer,
110
- qr as ToggleButtonListItem,
111
- jr as ToggleListItem,
112
- ar as WidgetContainer,
113
- E as WidgetContainerContext,
110
+ Zo as TOUCH_TARGET,
111
+ yr as TabContentContainer,
112
+ jr as ToggleButtonListItem,
113
+ Qr as ToggleListItem,
114
+ pr as WidgetContainer,
115
+ d as WidgetContainerContext,
114
116
  D as WidgetContainerProvider,
115
- Wr as ZeroState,
116
- Qr as analyticsSession,
117
+ Lr as ZeroState,
118
+ $r as analyticsSession,
117
119
  r as buildDynamicCopy,
118
120
  t as buildPluralCopy,
119
121
  eo as formatCurrency,
120
122
  io as formatOrdinal,
121
123
  mo as formatPercentage,
122
124
  no as generateEqualIntervals,
123
- $r as getClientComponentOverrides,
124
- ot as getClientCustomizations,
125
- rt as getClientPaletteOptions,
126
- tt as getClientTheme,
125
+ rt as getClientComponentOverrides,
126
+ tt as getClientCustomizations,
127
+ et as getClientPaletteOptions,
128
+ it as getClientTheme,
127
129
  ao as getCurrencyCodes,
128
130
  so as getPluralRules,
129
131
  u as useAccountDisplayName,
@@ -132,10 +134,10 @@ export {
132
134
  P as useAppConfig,
133
135
  y as useBudgetsStore,
134
136
  A as useCashflowStore,
135
- b as useCategoryStore,
137
+ O as useCategoryStore,
136
138
  C as useCombineEvents,
137
139
  S as useCombinePageviews,
138
- O as useDebtStore,
140
+ b as useDebtStore,
139
141
  W as useError,
140
142
  G as useEvent,
141
143
  L as useFinstrongStore,
@@ -157,9 +159,9 @@ export {
157
159
  fo as useRepeatingTransactionEligibility,
158
160
  $ as useScreenSize,
159
161
  Z as useSettingsStore,
160
- k as useTransactionStore,
161
- q as useTrendsStore,
162
- K as useUserStore,
162
+ K as useTransactionStore,
163
+ k as useTrendsStore,
164
+ q as useUserStore,
163
165
  j as useWidgetContainerProvider,
164
166
  lo as useWidgetHeaderStyles,
165
167
  So as useWidgetLoadTimer
@@ -3,4 +3,5 @@ export declare class BannerApi {
3
3
  fetchInstance: Fetch | null;
4
4
  constructor(bullseyeEndpoint: string);
5
5
  getBanner: (userGuid: string) => Promise<any>;
6
+ markClicked: (guid: string) => Promise<any>;
6
7
  }
@@ -1,5 +1,6 @@
1
+ import { ApiEndpoints as c } from "../constants/ApiEndpoints.es.js";
1
2
  import { Fetch as r } from "../utils/Fetch.es.js";
2
- var a = class {
3
+ var s = class {
3
4
  fetchInstance;
4
5
  constructor(n) {
5
6
  this.fetchInstance = new r(n, "", {
@@ -15,9 +16,10 @@ var a = class {
15
16
  return console.error("Error fetching banner:", t), null;
16
17
  }
17
18
  };
19
+ markClicked = async (n) => this.fetchInstance?.put(`/${c.OFFERS}/${encodeURIComponent(n)}/clicked`, {});
18
20
  };
19
21
  export {
20
- a as BannerApi
22
+ s as BannerApi
21
23
  };
22
24
 
23
25
  //# sourceMappingURL=BannerApi.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BannerApi.es.js","names":[],"sources":["../../../src/core/api/BannerApi.ts"],"sourcesContent":["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"],"mappings":";AAEA,IAAa,IAAb,MAAuB;AAAA,EACrB;AAAA,EAEA,YAAY,GAA0B;AAEpC,SAAK,gBAAgB,IAAI,EAAM,GAAkB,IAAI;AAAA,MACnD,QAAQ;AAAA,MACR,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,YAAY,OAAO,MAAqB;AACtC,QAAI;AACF,YAAM,IAAO,WAAW,CAAA;AACxB,aAAO,KAAK,eAAe,IAAI,CAAI,EAAE,KAAA,CAAM,MAAS,EAAK,MAAM,KAAK,CAAC;AAAA,IACvE,SAAS,GAAO;AACd,qBAAQ,MAAM,0BAA0B,CAAK,GACtC;AAAA,IACT;AAAA,EACF;AACF"}
1
+ {"version":3,"file":"BannerApi.es.js","names":[],"sources":["../../../src/core/api/BannerApi.ts"],"sourcesContent":["import { Fetch } from '../utils'\nimport { ApiEndpoints } from '../constants'\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 // Records a banner click server-side. The deep-link path needs this because it\n // never hits `redirect_url`, which is what records the click for external\n // banners. Rejections propagate so AppDataStore can report them via its\n // captureException handler instead of being silently swallowed here.\n markClicked = async (guid: string) =>\n this.fetchInstance?.put(`/${ApiEndpoints.OFFERS}/${encodeURIComponent(guid)}/clicked`, {})\n}\n"],"mappings":";;AAGA,IAAa,IAAb,MAAuB;AAAA,EACrB;AAAA,EAEA,YAAY,GAA0B;AAEpC,SAAK,gBAAgB,IAAI,EAAM,GAAkB,IAAI;AAAA,MACnD,QAAQ;AAAA,MACR,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,YAAY,OAAO,MAAqB;AACtC,QAAI;AACF,YAAM,IAAO,WAAW,CAAA;AACxB,aAAO,KAAK,eAAe,IAAI,CAAI,EAAE,KAAA,CAAM,MAAS,EAAK,MAAM,KAAK,CAAC;AAAA,IACvE,SAAS,GAAO;AACd,qBAAQ,MAAM,0BAA0B,CAAK,GACtC;AAAA,IACT;AAAA,EACF;AAAA,EAMA,cAAc,OAAO,MACnB,KAAK,eAAe,IAAI,IAAI,EAAa,MAAA,IAAU,mBAAmB,CAAI,CAAA,YAAa,CAAC,CAAC;AAC7F"}
@@ -18,6 +18,7 @@ export declare class AppDataStore {
18
18
  setAppData: (appData: AppData) => void;
19
19
  loadAppData: () => Promise<void>;
20
20
  loadBanner: () => Promise<void>;
21
+ markBannerClicked: (guid: string) => Promise<void>;
21
22
  setUser: (user: User) => User;
22
23
  setUserCommunicationProfile: (profile: UserCommunicationProfile) => UserCommunicationProfile;
23
24
  setUserProfile: (userProfile: UserProfile) => UserProfile;
@@ -1,7 +1,7 @@
1
1
  import { AppDataApi as a } from "../api/AppDataApi.es.js";
2
2
  import { BannerApi as e } from "../api/BannerApi.es.js";
3
3
  import { makeAutoObservable as i, runInAction as o } from "mobx";
4
- var l = class {
4
+ var c = class {
5
5
  globalStore;
6
6
  api = new a("/", "");
7
7
  bannerApi = new e("/");
@@ -50,12 +50,19 @@ var l = class {
50
50
  console.error("Error loading banner:", t), this.globalStore.captureException(t, { store: "AppDataStore" });
51
51
  }
52
52
  };
53
+ markBannerClicked = async (t) => {
54
+ try {
55
+ await this.bannerApi.markClicked(t);
56
+ } catch (r) {
57
+ console.error("Error marking banner clicked:", r), this.globalStore.captureException(r, { store: "AppDataStore" });
58
+ }
59
+ };
53
60
  setUser = (t) => this.appData.user = t;
54
61
  setUserCommunicationProfile = (t) => this.appData.user_communication_profile = t;
55
62
  setUserProfile = (t) => this.appData.user_profile = t;
56
63
  };
57
64
  export {
58
- l as AppDataStore
65
+ c as AppDataStore
59
66
  };
60
67
 
61
68
  //# sourceMappingURL=AppDataStore.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AppDataStore.es.js","names":[],"sources":["../../../src/core/stores/AppDataStore.ts"],"sourcesContent":["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 this.globalStore.captureException(error, { store: 'AppDataStore' })\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 this.globalStore.captureException(error, { store: 'AppDataStore' })\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"],"mappings":";;;AAcA,IAAa,IAAb,MAA0B;AAAA,EACxB;AAAA,EACA,MAAkB,IAAI,EAAW,KAAK,EAAE;AAAA,EACxC,YAAuB,IAAI,EAAU,GAAG;AAAA,EAExC,UAAmB,CAAC;AAAA,EACpB,kBAA2B;AAAA,EAC3B,SAAiB,CAAC;AAAA,EAElB,YAAY,GAA0B;AACpC,SAAK,cAAc,GACnB,KAAK,MAAM,IAAI,EAAW,EAAY,UAAU,EAAY,cAAc,EAAY,OAAO,GAE7F,EAAmB,IAAI;AAAA,EACzB;AAAA,EAEA,IAAI,YAAuB;AACzB,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,IAAI,6BAA6B;AAC/B,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,uBAAuB;AACzB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,2BAA2B;AAC7B,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,aAAA,CAAc,MAAqB;AACjC,SAAK,UAAU,GACf,KAAK,YAAY,IAAI,EAAU,EAAQ,SAAS,YAAY,GAAG,GAC/D,KAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,cAAc,YAAY;AACxB,QAAI;AACF,YAAM,IAAU,MAAM,KAAK,IAAI,WAAW;AAC1C,WAAK,WAAW,CAAO;AAAA,IACzB,SAAS,GAAO;AACd,cAAQ,MAAM,2BAA2B,CAAK,GAC9C,KAAK,YAAY,iBAAiB,GAAO,EAAE,OAAO,eAAe,CAAC;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,aAAa,YAAY;AACvB,QAAI;AACF,YAAM,IAAW,KAAK,MAAM,QAAQ,MAC9B,IAAS,IAAW,MAAM,KAAK,UAAU,UAAU,CAAQ,IAAI,CAAC;AAEtE,MAAA,EAAA,MAAkB;AAChB,aAAK,SAAS;AAAA,MAChB,CAAC;AAAA,IACH,SAAS,GAAO;AACd,cAAQ,MAAM,yBAAyB,CAAK,GAC5C,KAAK,YAAY,iBAAiB,GAAO,EAAE,OAAO,eAAe,CAAC;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,UAAA,CAAW,MAAgB,KAAK,QAAQ,OAAO;AAAA,EAE/C,8BAAA,CAA+B,MAC5B,KAAK,QAAQ,6BAA6B;AAAA,EAE7C,iBAAA,CAAkB,MAA8B,KAAK,QAAQ,eAAe;AAC9E"}
1
+ {"version":3,"file":"AppDataStore.es.js","names":[],"sources":["../../../src/core/stores/AppDataStore.ts"],"sourcesContent":["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 this.globalStore.captureException(error, { store: 'AppDataStore' })\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 this.globalStore.captureException(error, { store: 'AppDataStore' })\n }\n }\n\n // Fire-and-forget click receipt for the deep-link banner path (see BannerApi).\n markBannerClicked = async (guid: string) => {\n try {\n await this.bannerApi.markClicked(guid)\n } catch (error) {\n console.error('Error marking banner clicked:', error)\n this.globalStore.captureException(error, { store: 'AppDataStore' })\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"],"mappings":";;;AAcA,IAAa,IAAb,MAA0B;AAAA,EACxB;AAAA,EACA,MAAkB,IAAI,EAAW,KAAK,EAAE;AAAA,EACxC,YAAuB,IAAI,EAAU,GAAG;AAAA,EAExC,UAAmB,CAAC;AAAA,EACpB,kBAA2B;AAAA,EAC3B,SAAiB,CAAC;AAAA,EAElB,YAAY,GAA0B;AACpC,SAAK,cAAc,GACnB,KAAK,MAAM,IAAI,EAAW,EAAY,UAAU,EAAY,cAAc,EAAY,OAAO,GAE7F,EAAmB,IAAI;AAAA,EACzB;AAAA,EAEA,IAAI,YAAuB;AACzB,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,IAAI,6BAA6B;AAC/B,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,uBAAuB;AACzB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,2BAA2B;AAC7B,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,aAAA,CAAc,MAAqB;AACjC,SAAK,UAAU,GACf,KAAK,YAAY,IAAI,EAAU,EAAQ,SAAS,YAAY,GAAG,GAC/D,KAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,cAAc,YAAY;AACxB,QAAI;AACF,YAAM,IAAU,MAAM,KAAK,IAAI,WAAW;AAC1C,WAAK,WAAW,CAAO;AAAA,IACzB,SAAS,GAAO;AACd,cAAQ,MAAM,2BAA2B,CAAK,GAC9C,KAAK,YAAY,iBAAiB,GAAO,EAAE,OAAO,eAAe,CAAC;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,aAAa,YAAY;AACvB,QAAI;AACF,YAAM,IAAW,KAAK,MAAM,QAAQ,MAC9B,IAAS,IAAW,MAAM,KAAK,UAAU,UAAU,CAAQ,IAAI,CAAC;AAEtE,MAAA,EAAA,MAAkB;AAChB,aAAK,SAAS;AAAA,MAChB,CAAC;AAAA,IACH,SAAS,GAAO;AACd,cAAQ,MAAM,yBAAyB,CAAK,GAC5C,KAAK,YAAY,iBAAiB,GAAO,EAAE,OAAO,eAAe,CAAC;AAAA,IACpE;AAAA,EACF;AAAA,EAGA,oBAAoB,OAAO,MAAiB;AAC1C,QAAI;AACF,YAAM,KAAK,UAAU,YAAY,CAAI;AAAA,IACvC,SAAS,GAAO;AACd,cAAQ,MAAM,iCAAiC,CAAK,GACpD,KAAK,YAAY,iBAAiB,GAAO,EAAE,OAAO,eAAe,CAAC;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,UAAA,CAAW,MAAgB,KAAK,QAAQ,OAAO;AAAA,EAE/C,8BAAA,CAA+B,MAC5B,KAAK,QAAQ,6BAA6B;AAAA,EAE7C,iBAAA,CAAkB,MAA8B,KAAK,QAAQ,eAAe;AAC9E"}
@@ -27,8 +27,10 @@ export interface AppConfig {
27
27
  userFeatures: UserFeature[];
28
28
  }
29
29
  export interface Banner {
30
+ guid?: string;
30
31
  image_url?: string;
31
32
  redirect_url?: string;
33
+ deep_link_type?: number | null;
32
34
  }
33
35
  interface TransactionConfig {
34
36
  selected_account_guid?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mx-cartographer/experiences",
3
- "version": "9.6.7",
3
+ "version": "9.6.8",
4
4
  "description": "Library containing experience widgets",
5
5
  "author": "MX",
6
6
  "license": "MIT",