@mx-cartographer/experiences 9.6.13 → 9.6.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/common/components/CurrencyDialog.d.ts +6 -1
  3. package/dist/common/components/CurrencyDialog.es.js +24 -23
  4. package/dist/common/components/CurrencyDialog.es.js.map +1 -1
  5. package/dist/insights-v2/actionBlocks/ActionBlockLayer.es.js +3 -3
  6. package/dist/insights-v2/actionBlocks/AmountInputModalBlock/AmountInputModalBlock.es.js +64 -59
  7. package/dist/insights-v2/actionBlocks/AmountInputModalBlock/AmountInputModalBlock.es.js.map +1 -1
  8. package/dist/insights-v2/actionBlocks/ConnectWidgetActionBlock.es.js +17 -11
  9. package/dist/insights-v2/actionBlocks/ConnectWidgetActionBlock.es.js.map +1 -1
  10. package/dist/insights-v2/actionBlocks/TransactionHistoryBlock/TransactionHistoryBlock.es.js +63 -57
  11. package/dist/insights-v2/actionBlocks/TransactionHistoryBlock/TransactionHistoryBlock.es.js.map +1 -1
  12. package/dist/insights-v2/analytics/analyticsEventsConfig.d.ts +67 -0
  13. package/dist/insights-v2/analytics/analyticsEventsConfig.es.js +59 -0
  14. package/dist/insights-v2/analytics/analyticsEventsConfig.es.js.map +1 -0
  15. package/dist/insights-v2/analytics/index.d.ts +3 -0
  16. package/dist/insights-v2/analytics/resolveAnalyticsEvent.d.ts +5 -0
  17. package/dist/insights-v2/analytics/resolveAnalyticsEvent.es.js +19 -0
  18. package/dist/insights-v2/analytics/resolveAnalyticsEvent.es.js.map +1 -0
  19. package/dist/insights-v2/analytics/useAnalyticsEvent.d.ts +3 -0
  20. package/dist/insights-v2/analytics/useAnalyticsEvent.es.js +20 -0
  21. package/dist/insights-v2/analytics/useAnalyticsEvent.es.js.map +1 -0
  22. package/dist/insights-v2/beatActions.d.ts +18 -13
  23. package/dist/insights-v2/beatActions.es.js.map +1 -1
  24. package/dist/insights-v2/blocks/ChartBlocks/BarchartBlock/BarchartBlock.es.js +24 -22
  25. package/dist/insights-v2/blocks/ChartBlocks/BarchartBlock/BarchartBlock.es.js.map +1 -1
  26. package/dist/insights-v2/components/BaseLayout.es.js +89 -79
  27. package/dist/insights-v2/components/BaseLayout.es.js.map +1 -1
  28. package/dist/insights-v2/ctaActions/ctaHandlers.d.ts +1 -6
  29. package/dist/insights-v2/ctaActions/ctaHandlers.es.js.map +1 -1
  30. package/dist/insights-v2/ctaActions/index.d.ts +1 -1
  31. package/dist/insights-v2/ctaActions/runCtaAction.d.ts +20 -5
  32. package/dist/insights-v2/ctaActions/runCtaAction.es.js +63 -41
  33. package/dist/insights-v2/ctaActions/runCtaAction.es.js.map +1 -1
  34. package/dist/insights-v2/ctaActions/types.d.ts +6 -5
  35. package/dist/insights-v2/index.es.js +84 -84
  36. package/dist/insights-v2/mappings/blocks.es.js +2 -2
  37. package/package.json +1 -1
@@ -1,40 +1,58 @@
1
- import { sendBeatCta as l } from "../../common/utils/PostMessage.es.js";
2
- import { HOST_ACTIONS as f } from "./hostActions.es.js";
3
- import { ctaActions as m } from "./ctaConfig.es.js";
4
- import { ctaHandlers as C } from "./ctaHandlers.es.js";
5
- import { resolveCtaMetadata as v } from "./ctaPostMessages.es.js";
6
- import { hasDrawerBlock as g } from "../mappings/hasDrawerBlock.es.js";
7
- var w = {}, o = ({ cta: t }) => t.action_key && m[t.action_key] || w, H = (t) => {
8
- const a = o(t);
1
+ import { sendBeatCta as m } from "../../common/utils/PostMessage.es.js";
2
+ import { ANALYTICS_EVENTS_CONFIG as n } from "../analytics/analyticsEventsConfig.es.js";
3
+ import { resolveAnalyticsEvent as f } from "../analytics/resolveAnalyticsEvent.es.js";
4
+ import { HOST_ACTIONS as v } from "./hostActions.es.js";
5
+ import { ctaActions as _ } from "./ctaConfig.es.js";
6
+ import { ctaHandlers as A } from "./ctaHandlers.es.js";
7
+ import { resolveCtaMetadata as E } from "./ctaPostMessages.es.js";
8
+ import { hasDrawerBlock as S } from "../mappings/hasDrawerBlock.es.js";
9
+ var y = {}, c = ({ cta: t }) => t.action_key && _[t.action_key] || y, B = (t) => {
10
+ const a = c(t);
9
11
  return { disabled: t.stores.insightsV2Store.ctaStatus[t.beat.guid] === "pending" || (a.disabledWhen?.(t) ?? !1) };
10
- }, n = ({ beat: t, slot: a, stores: r }) => {
12
+ }, l = ({ beat: t, slot: a, stores: r }) => {
11
13
  r.insightsV2Store.openCtaDrawer(t.guid, a === "primary" ? "primaryCta" : "secondaryCta");
12
14
  }, h = ({ beat: t, stores: a }, r) => {
13
- const { is_mobile_webview: e, clientConfig: s } = a.appDataStore.appConfig, { event: i, action: d, payload: p } = r;
14
- l(t, {
15
+ const { is_mobile_webview: e, clientConfig: s } = a.appDataStore.appConfig, { event: i, action: u, payload: C } = r;
16
+ m(t, {
15
17
  event: i ?? void 0,
16
- op: d ?? void 0,
17
- extras: p ?? void 0,
18
+ op: u ?? void 0,
19
+ extras: C ?? void 0,
18
20
  isMobileWebview: e,
19
21
  webviewScheme: s?.master?.ui_message_webview_url_scheme,
20
22
  userGuid: t.insights_payload?.user_guid ?? t.user_guid
21
23
  });
22
- }, S = (t) => {
23
- g(t.cta.block) && n(t);
24
- }, _ = (t, { beat: a, stores: r }) => {
24
+ }, g = (t) => {
25
+ S(t.cta.block) && l(t);
26
+ }, w = (t, { beat: a, stores: r }) => {
25
27
  t === "refreshBeat" && r.emitUpdate({ staleBeatGuid: a.guid });
26
- }, y = ({ beat: t, slot: a, hostActions: r }) => {
27
- a !== "primary" || t.cta_clicked_at || Promise.resolve().then(() => r.onCtaAction?.({
28
- beatGuid: t.guid,
29
- name: f.markCtaClicked
30
- })).catch(() => {
31
- });
32
- }, c = async (t, a, r) => {
33
- const e = C[a];
28
+ }, o = (t, a) => {
29
+ try {
30
+ t.hostActions.onAnalyticsEvent?.(f(a, t.beat));
31
+ } catch (r) {
32
+ t.stores.captureException(r, {
33
+ store: "ctaActions",
34
+ template: t.beat.template,
35
+ handler: "sendCtaAnalytics"
36
+ });
37
+ }
38
+ }, k = (t) => {
39
+ const { beat: a, slot: r, hostActions: e, stores: s } = t;
40
+ r !== "primary" || a.cta_clicked_at || (o(t, n.FIRST_TIME_PRIMARY_ACTION_SELECTED), Promise.resolve().then(() => e.onCtaAction?.({
41
+ beatGuid: a.guid,
42
+ name: v.markCtaClicked
43
+ })).catch((i) => s.captureException(i, {
44
+ store: "ctaActions",
45
+ template: a.template,
46
+ handler: "markCtaClicked"
47
+ })));
48
+ }, T = (t, { skipCtaClicked: a = !1 } = {}) => {
49
+ o(t, t.slot === "primary" ? n.PRIMARY_ACTION_SELECTED : n.SECONDARY_ACTION_SELECTED), a || k(t);
50
+ }, p = async (t, a, r) => {
51
+ const e = A[a];
34
52
  if (!e) throw new Error(`Unknown CTA handler "${a}"`);
35
53
  await e(t);
36
- for (const s of r) _(s, t);
37
- }, u = async ({ beat: t, stores: a }, r, e = {}) => {
54
+ for (const s of r) w(s, t);
55
+ }, d = async ({ beat: t, stores: a }, r, e = {}) => {
38
56
  const { insightsV2Store: s } = a;
39
57
  s.setCtaStatus(t.guid, "pending");
40
58
  try {
@@ -46,37 +64,41 @@ var w = {}, o = ({ cta: t }) => t.action_key && m[t.action_key] || w, H = (t) =>
46
64
  ...e
47
65
  }), !1;
48
66
  }
49
- }, G = async (t) => {
50
- const a = o(t), r = typeof a.params == "function" ? a.params(t) : a.params, e = {
67
+ }, F = async (t) => {
68
+ const a = c(t), r = typeof a.params == "function" ? a.params(t) : a.params, e = {
51
69
  ...t,
52
70
  params: {
53
71
  ...r,
54
72
  ...t.params
55
73
  }
56
74
  };
57
- a.skipCtaClicked || y(e), await u(e, async () => {
58
- a.run && await c(e, a.run, a.onSuccess ?? []);
59
- const s = v(e);
75
+ T(e, { skipCtaClicked: a.skipCtaClicked }), await d(e, async () => {
76
+ a.run && await p(e, a.run, a.onSuccess ?? []), a.analytics && o(e, a.analytics);
77
+ const s = E(e);
60
78
  s && h(e, s);
61
79
  const i = a.next ?? (a.run ? "none" : "default");
62
- i === "default" ? S(e) : i === "drawer" && n(e);
80
+ i === "default" ? g(e) : i === "drawer" && l(e);
63
81
  });
64
- }, k = {
82
+ }, b = {
65
83
  label: "",
66
84
  block: ""
67
- }, M = (t, a, { onSuccess: r = [] } = {}) => {
68
- const e = {
85
+ }, G = (t, a, { onSuccess: r = [], analytics: e } = {}) => {
86
+ const s = {
69
87
  ...t,
70
- cta: k,
88
+ cta: b,
71
89
  slot: "primary"
72
90
  };
73
- return u(e, () => c(e, a, r), { handler: a });
91
+ return d(s, async () => {
92
+ await p(s, a, r), e && o(s, e);
93
+ }, { handler: a });
74
94
  };
75
95
  export {
76
- H as resolveCtaState,
77
- o as resolveStep,
78
- G as runCtaAction,
79
- M as runCtaHandler
96
+ T as reportCtaClick,
97
+ B as resolveCtaState,
98
+ c as resolveStep,
99
+ F as runCtaAction,
100
+ G as runCtaHandler,
101
+ o as sendCtaAnalytics
80
102
  };
81
103
 
82
104
  //# sourceMappingURL=runCtaAction.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runCtaAction.es.js","names":[],"sources":["../../../src/insights-v2/ctaActions/runCtaAction.ts"],"sourcesContent":["import { sendBeatCta } from '../../common/utils/PostMessage'\nimport { hasDrawerBlock } from '../mappings/hasDrawerBlock'\nimport { ctaActions } from './ctaConfig'\nimport { resolveCtaMetadata } from './ctaPostMessages'\nimport { ctaHandlers, type CtaHandlerName } from './ctaHandlers'\nimport { HOST_ACTIONS } from './hostActions'\nimport type { CtaPostMessageMetadata } from '../../core'\nimport type {\n CtaContext,\n CtaEffect,\n CtaHandler,\n CtaHandlerContext,\n CtaState,\n CtaStateContext,\n CtaStep,\n RunHandlerOptions,\n} from './types'\n\nconst DEFAULT_STEP: CtaStep = {}\n\n// ─── Resolution ─────────────────────────────────────────────────────────────\n\n/** The beat's own context (input a block collected for it), `{}` until something is written. */\nexport const beatContextOf = ({ beat, stores }: Pick<CtaStateContext, 'beat' | 'stores'>) =>\n stores.insightsV2Store.beatContext[beat.guid] ?? {}\n\n/** The step named by the CTA's `action_key`, or the empty default (no key / unknown key). */\nexport const resolveStep = ({ cta }: Pick<CtaStateContext, 'cta'>): CtaStep =>\n (cta.action_key && ctaActions[cta.action_key]) || DEFAULT_STEP\n\n/** Pending always disables; the step's `disabledWhen` may add to that. */\nexport const resolveCtaState = (ctx: CtaStateContext): CtaState => {\n const step = resolveStep(ctx)\n const pending = ctx.stores.insightsV2Store.ctaStatus[ctx.beat.guid] === 'pending'\n\n return { disabled: pending || (step.disabledWhen?.(ctx) ?? false) }\n}\n\n// ─── Targets and effects ────────────────────────────────────────────────────\n\n/** Opens the beat's drawer for whichever slot triggered the current step. */\nconst openDrawerForSlot = ({\n beat,\n slot,\n stores,\n}: Pick<CtaContext, 'beat' | 'slot' | 'stores'>) => {\n stores.insightsV2Store.openCtaDrawer(\n beat.guid,\n slot === 'primary' ? 'primaryCta' : 'secondaryCta',\n )\n}\n\n/**\n * Posts this CTA's resolved message (event, op and beat-specific payload, from the backend's\n * `cta.metadata` or the template's `ctaPostMessages` entry) to the host.\n */\nconst postCtaMessage = ({ beat, stores }: CtaContext, metadata: CtaPostMessageMetadata) => {\n const { is_mobile_webview, clientConfig } = stores.appDataStore.appConfig\n const { event, action, payload } = metadata\n\n sendBeatCta(beat, {\n event: event ?? undefined,\n op: action ?? undefined,\n extras: payload ?? undefined,\n isMobileWebview: is_mobile_webview,\n webviewScheme: clientConfig?.master?.ui_message_webview_url_scheme,\n userGuid: beat.insights_payload?.user_guid ?? beat.user_guid,\n })\n}\n\n/**\n * Default target: open the drawer for a real block, otherwise nothing. A post message is never\n * implied by a missing block; it is sent only when one resolves (see runCtaAction).\n */\nconst runDefaultTarget = (ctx: CtaContext) => {\n if (hasDrawerBlock(ctx.cta.block)) openDrawerForSlot(ctx)\n}\n\nconst runEffect = (effect: CtaEffect, { beat, stores }: CtaContext) => {\n switch (effect) {\n case 'refreshBeat':\n stores.emitUpdate({ staleBeatGuid: beat.guid })\n break\n }\n}\n\n/**\n * First primary click records `cta_clicked_at` through the host. Fire-and-forget: whatever the\n * host does (reject, throw, return nothing) must never fail the user's action.\n */\nconst markCtaClicked = ({ beat, slot, hostActions }: CtaContext) => {\n if (slot !== 'primary' || beat.cta_clicked_at) return\n\n // Wrapping the call in `.then` turns a synchronous throw into a rejection, and the `.catch`\n // swallows both: a failed cta_clicked_at write is not the user's action.\n Promise.resolve()\n .then(() =>\n hostActions.onCtaAction?.({ beatGuid: beat.guid, name: HOST_ACTIONS.markCtaClicked }),\n )\n .catch(() => {})\n}\n\n// ─── Shared bookkeeping ─────────────────────────────────────────────────────\n\n/** Runs a named handler, then its `onSuccess` effects. Shared by card CTAs and drawer saves. */\nconst runHandlerWithEffects = async (\n ctx: CtaContext,\n handlerName: CtaHandlerName,\n onSuccess: CtaEffect[],\n): Promise<void> => {\n // Names are typed, but the map is still indexed defensively: config can come from anywhere.\n const handler = (ctaHandlers as Record<string, CtaHandler>)[handlerName]\n\n if (!handler) throw new Error(`Unknown CTA handler \"${handlerName}\"`)\n\n await handler(ctx)\n\n for (const effect of onSuccess) runEffect(effect, ctx)\n}\n\n/** Per-beat status around `work`: `pending` -> `done` | `error` (+ captureException). */\nconst withCtaStatus = async (\n { beat, stores }: Pick<CtaContext, 'beat' | 'stores'>,\n work: () => Promise<void>,\n captureContext: Record<string, string> = {},\n): Promise<boolean> => {\n const { insightsV2Store } = stores\n\n insightsV2Store.setCtaStatus(beat.guid, 'pending')\n\n try {\n await work()\n insightsV2Store.setCtaStatus(beat.guid, 'done')\n\n return true\n } catch (error) {\n insightsV2Store.setCtaStatus(beat.guid, 'error')\n stores.captureException(error, {\n store: 'ctaActions',\n template: beat.template,\n ...captureContext,\n })\n\n return false\n }\n}\n\n// ─── Entry points ───────────────────────────────────────────────────────────\n\n/**\n * Runs the CTA's step: `run` handler, `onSuccess` effects, the CTA's post message if one resolves\n * (backend `cta.metadata` or the template's `ctaPostMessages` entry; skipped when the handler\n * throws), then the `next` target. No resolved message = no post.\n */\nexport const runCtaAction = async (ctx: CtaContext): Promise<void> => {\n const step = resolveStep(ctx)\n const stepParams = typeof step.params === 'function' ? step.params(ctx) : step.params\n const stepCtx: CtaContext = { ...ctx, params: { ...stepParams, ...ctx.params } }\n\n if (!step.skipCtaClicked) markCtaClicked(stepCtx)\n\n await withCtaStatus(stepCtx, async () => {\n if (step.run) await runHandlerWithEffects(stepCtx, step.run, step.onSuccess ?? [])\n\n const metadata = resolveCtaMetadata(stepCtx)\n\n if (metadata) postCtaMessage(stepCtx, metadata)\n\n const target = step.next ?? (step.run ? 'none' : 'default')\n\n if (target === 'default') runDefaultTarget(stepCtx)\n else if (target === 'drawer') openDrawerForSlot(stepCtx)\n })\n}\n\n/** Placeholder CTA for handlers run from inside a drawer, where no card slot is involved. */\nconst DIRECT_CTA = { label: '', block: '' }\n\n/** Runs a handler directly (drawer Save buttons): same bookkeeping as a card CTA. True on success. */\nexport const runCtaHandler = (\n ctx: CtaHandlerContext,\n handlerName: CtaHandlerName,\n { onSuccess = [] }: RunHandlerOptions = {},\n): Promise<boolean> => {\n const fullCtx: CtaContext = { ...ctx, cta: DIRECT_CTA, slot: 'primary' }\n\n return withCtaStatus(fullCtx, () => runHandlerWithEffects(fullCtx, handlerName, onSuccess), {\n handler: handlerName,\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"runCtaAction.es.js","names":[],"sources":["../../../src/insights-v2/ctaActions/runCtaAction.ts"],"sourcesContent":["import { sendBeatCta } from '../../common/utils/PostMessage'\nimport {\n ANALYTICS_EVENTS_CONFIG,\n type AnalyticsEventConfigEntry,\n} from '../analytics/analyticsEventsConfig'\nimport { resolveAnalyticsEvent } from '../analytics/resolveAnalyticsEvent'\nimport { hasDrawerBlock } from '../mappings/hasDrawerBlock'\nimport { ctaActions } from './ctaConfig'\nimport { resolveCtaMetadata } from './ctaPostMessages'\nimport { ctaHandlers, type CtaHandlerName } from './ctaHandlers'\nimport { HOST_ACTIONS } from './hostActions'\nimport type { CtaPostMessageMetadata } from '../../core'\nimport type {\n CtaContext,\n CtaEffect,\n CtaHandler,\n CtaHandlerContext,\n CtaState,\n CtaStateContext,\n CtaStep,\n RunHandlerOptions,\n} from './types'\n\nconst DEFAULT_STEP: CtaStep = {}\n\n// ─── Resolution ─────────────────────────────────────────────────────────────\n\n/** The beat's own context (input a block collected for it), `{}` until something is written. */\nexport const beatContextOf = ({ beat, stores }: Pick<CtaStateContext, 'beat' | 'stores'>) =>\n stores.insightsV2Store.beatContext[beat.guid] ?? {}\n\n/** The step named by the CTA's `action_key`, or the empty default (no key / unknown key). */\nexport const resolveStep = ({ cta }: Pick<CtaStateContext, 'cta'>): CtaStep =>\n (cta.action_key && ctaActions[cta.action_key]) || DEFAULT_STEP\n\n/** Pending always disables; the step's `disabledWhen` may add to that. */\nexport const resolveCtaState = (ctx: CtaStateContext): CtaState => {\n const step = resolveStep(ctx)\n const pending = ctx.stores.insightsV2Store.ctaStatus[ctx.beat.guid] === 'pending'\n\n return { disabled: pending || (step.disabledWhen?.(ctx) ?? false) }\n}\n\n// ─── Targets and effects ────────────────────────────────────────────────────\n\n/** Opens the beat's drawer for whichever slot triggered the current step. */\nconst openDrawerForSlot = ({\n beat,\n slot,\n stores,\n}: Pick<CtaContext, 'beat' | 'slot' | 'stores'>) => {\n stores.insightsV2Store.openCtaDrawer(\n beat.guid,\n slot === 'primary' ? 'primaryCta' : 'secondaryCta',\n )\n}\n\n/**\n * Posts this CTA's resolved message (event, op and beat-specific payload, from the backend's\n * `cta.metadata` or the template's `ctaPostMessages` entry) to the host.\n */\nconst postCtaMessage = ({ beat, stores }: CtaContext, metadata: CtaPostMessageMetadata) => {\n const { is_mobile_webview, clientConfig } = stores.appDataStore.appConfig\n const { event, action, payload } = metadata\n\n sendBeatCta(beat, {\n event: event ?? undefined,\n op: action ?? undefined,\n extras: payload ?? undefined,\n isMobileWebview: is_mobile_webview,\n webviewScheme: clientConfig?.master?.ui_message_webview_url_scheme,\n userGuid: beat.insights_payload?.user_guid ?? beat.user_guid,\n })\n}\n\n/**\n * Default target: open the drawer for a real block, otherwise nothing. A post message is never\n * implied by a missing block; it is sent only when one resolves (see runCtaAction).\n */\nconst runDefaultTarget = (ctx: CtaContext) => {\n if (hasDrawerBlock(ctx.cta.block)) openDrawerForSlot(ctx)\n}\n\nconst runEffect = (effect: CtaEffect, { beat, stores }: CtaContext) => {\n switch (effect) {\n case 'refreshBeat':\n stores.emitUpdate({ staleBeatGuid: beat.guid })\n break\n }\n}\n\ntype AnalyticsCtx = Pick<CtaContext, 'beat' | 'stores' | 'hostActions'>\n\n/**\n * The one way to fire a catalogued analytics event. Takes the catalogue entry itself (e.g.\n * `ANALYTICS_EVENTS_CONFIG.PRIMARY_ACTION_SELECTED`), not a lookup key — the call site already\n * has the entry via property access, so there is no key to look up or mistype. Resolves the\n * payload and hands it to the host directly. Never throws: a failed fire is captured, it\n * cannot fail or disable anything.\n */\nexport const sendCtaAnalytics = (ctx: AnalyticsCtx, event: AnalyticsEventConfigEntry): void => {\n try {\n ctx.hostActions.onAnalyticsEvent?.(resolveAnalyticsEvent(event, ctx.beat))\n } catch (error) {\n ctx.stores.captureException(error, {\n store: 'ctaActions',\n template: ctx.beat.template,\n handler: 'sendCtaAnalytics',\n })\n }\n}\n\n// First primary click: fires FIRST_TIME_PRIMARY_ACTION_SELECTED and records cta_clicked_at.\nconst markCtaClicked = (ctx: AnalyticsCtx & Pick<CtaContext, 'slot'>): void => {\n const { beat, slot, hostActions, stores } = ctx\n\n if (slot !== 'primary' || beat.cta_clicked_at) return\n\n sendCtaAnalytics(ctx, ANALYTICS_EVENTS_CONFIG.FIRST_TIME_PRIMARY_ACTION_SELECTED)\n\n // Fire-and-forget; a failed write must not fail the user's action, but still report it.\n Promise.resolve()\n .then(() =>\n hostActions.onCtaAction?.({ beatGuid: beat.guid, name: HOST_ACTIONS.markCtaClicked }),\n )\n .catch((error) =>\n stores.captureException(error, {\n store: 'ctaActions',\n template: beat.template,\n handler: 'markCtaClicked',\n }),\n )\n}\n\n/**\n * Trigger 1 + the first-click bookkeeping together: every CTA press's generic analytics\n * (`Primary/Secondary Action Selected`), plus `FIRST_TIME_PRIMARY_ACTION_SELECTED` /\n * `cta_clicked_at` on the first primary press. The one call site for \"a CTA got pressed\",\n * used by the runner and by the contact-support bypass in `BaseLayout`.\n */\nexport const reportCtaClick = (\n ctx: AnalyticsCtx & Pick<CtaContext, 'slot'>,\n { skipCtaClicked = false }: { skipCtaClicked?: boolean } = {},\n): void => {\n sendCtaAnalytics(\n ctx,\n ctx.slot === 'primary'\n ? ANALYTICS_EVENTS_CONFIG.PRIMARY_ACTION_SELECTED\n : ANALYTICS_EVENTS_CONFIG.SECONDARY_ACTION_SELECTED,\n )\n\n if (!skipCtaClicked) markCtaClicked(ctx)\n}\n\n// ─── Shared bookkeeping ─────────────────────────────────────────────────────\n\n/** Runs a named handler, then its `onSuccess` effects. Shared by card CTAs and drawer saves. */\nconst runHandlerWithEffects = async (\n ctx: CtaContext,\n handlerName: CtaHandlerName,\n onSuccess: CtaEffect[],\n): Promise<void> => {\n // Names are typed, but the map is still indexed defensively: config can come from anywhere.\n const handler = (ctaHandlers as Record<string, CtaHandler>)[handlerName]\n\n if (!handler) throw new Error(`Unknown CTA handler \"${handlerName}\"`)\n\n await handler(ctx)\n\n for (const effect of onSuccess) runEffect(effect, ctx)\n}\n\n/** Per-beat status around `work`: `pending` -> `done` | `error` (+ captureException). */\nconst withCtaStatus = async (\n { beat, stores }: Pick<CtaContext, 'beat' | 'stores'>,\n work: () => Promise<void>,\n captureContext: Record<string, string> = {},\n): Promise<boolean> => {\n const { insightsV2Store } = stores\n\n insightsV2Store.setCtaStatus(beat.guid, 'pending')\n\n try {\n await work()\n insightsV2Store.setCtaStatus(beat.guid, 'done')\n\n return true\n } catch (error) {\n insightsV2Store.setCtaStatus(beat.guid, 'error')\n stores.captureException(error, {\n store: 'ctaActions',\n template: beat.template,\n ...captureContext,\n })\n\n return false\n }\n}\n\n// ─── Entry points ───────────────────────────────────────────────────────────\n\n// Runs the CTA's step: handler, onSuccess effects, post message, then the next target.\nexport const runCtaAction = async (ctx: CtaContext): Promise<void> => {\n const step = resolveStep(ctx)\n const stepParams = typeof step.params === 'function' ? step.params(ctx) : step.params\n const stepCtx: CtaContext = { ...ctx, params: { ...stepParams, ...ctx.params } }\n\n reportCtaClick(stepCtx, { skipCtaClicked: step.skipCtaClicked })\n\n await withCtaStatus(stepCtx, async () => {\n if (step.run) await runHandlerWithEffects(stepCtx, step.run, step.onSuccess ?? [])\n\n // For future ctaConfig entries; none define `analytics` yet.\n if (step.analytics) sendCtaAnalytics(stepCtx, step.analytics)\n\n const metadata = resolveCtaMetadata(stepCtx)\n\n if (metadata) postCtaMessage(stepCtx, metadata)\n\n const target = step.next ?? (step.run ? 'none' : 'default')\n\n if (target === 'default') runDefaultTarget(stepCtx)\n else if (target === 'drawer') openDrawerForSlot(stepCtx)\n })\n}\n\n/** Placeholder CTA for handlers run from inside a drawer, where no card slot is involved. */\nconst DIRECT_CTA = { label: '', block: '' }\n\n/** Runs a handler directly (drawer Save buttons). True on success. */\nexport const runCtaHandler = (\n ctx: CtaHandlerContext,\n handlerName: CtaHandlerName,\n { onSuccess = [], analytics }: RunHandlerOptions = {},\n): Promise<boolean> => {\n const fullCtx: CtaContext = { ...ctx, cta: DIRECT_CTA, slot: 'primary' }\n\n return withCtaStatus(\n fullCtx,\n async () => {\n await runHandlerWithEffects(fullCtx, handlerName, onSuccess)\n\n // Success-time analytics for drawer Saves.\n if (analytics) sendCtaAnalytics(fullCtx, analytics)\n },\n { handler: handlerName },\n )\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { Beat, PrimaryCTA, SecondaryCTA } from '../../core';
2
2
  import { GlobalStore } from '../../core/stores/GlobalStore';
3
+ import { AnalyticsEventConfigEntry } from '../analytics/analyticsEventsConfig';
3
4
  import { BeatActions } from '../beatActions';
4
5
  import { CtaHandlerName } from './ctaHandlers';
5
6
  export type CtaSlot = 'primary' | 'secondary';
@@ -26,14 +27,12 @@ export type CtaEffect = 'refreshBeat';
26
27
  export interface CtaStep {
27
28
  /** Handler to await first (typed: a misspelt name fails typecheck). */
28
29
  run?: CtaHandlerName;
29
- /**
30
- * Forwarded to the handler as `ctx.params`. A function computes them at press time from the
31
- * beat and stores (e.g. a user pick from `beatContextOf(ctx)`); keep it to reading values, the
32
- * backend picks behaviour per state via `action_key`.
33
- */
30
+ /** Forwarded to the handler as ctx.params; may compute from beat/stores at press time. */
34
31
  params?: CtaParams | ((ctx: CtaStateContext) => CtaParams);
35
32
  /** Effects executed after `run` resolves successfully. */
36
33
  onSuccess?: CtaEffect[];
34
+ /** Fired after `run` succeeds. No ctaConfig entry uses it yet. */
35
+ analytics?: AnalyticsEventConfigEntry;
37
36
  /**
38
37
  * After `run`: `default` = drawer if the CTA has a block, else nothing; `drawer` forces the
39
38
  * drawer; `none` stops. Omitted = `none` with `run`, `default` without.
@@ -52,6 +51,8 @@ export type CtaHandlerContext = Omit<CtaContext, 'cta' | 'slot'>;
52
51
  export interface RunHandlerOptions {
53
52
  /** Runner-owned effects executed after the handler resolves. */
54
53
  onSuccess?: CtaEffect[];
54
+ /** Catalogue entry (e.g. ANALYTICS_EVENTS_CONFIG.X) fired after the handler resolves (drawer Saves). */
55
+ analytics?: AnalyticsEventConfigEntry;
55
56
  }
56
57
  /** A named side effect. Must throw (or reject) on failure so the runner can report it. */
57
58
  export type CtaHandler = (ctx: CtaContext) => Promise<void> | void;
@@ -8,46 +8,46 @@ import d, { isLogoGuid as B } from "./components/LogoFromGuid.es.js";
8
8
  import g from "./components/StatusBadge.es.js";
9
9
  import k from "./components/CompactInsightCard.es.js";
10
10
  import h from "./components/InsightErrorCard.es.js";
11
- import { BAR_CHART_VARIANTS as b, barChartVariant as A, buildChartData as T, buildDataSeries as I } from "./blocks/ChartBlocks/BarchartBlock/utils.es.js";
12
- import { BarchartBlock as v } from "./blocks/ChartBlocks/BarchartBlock/BarchartBlock.es.js";
13
- import { DoubleBarChartBlock as O } from "./blocks/ChartBlocks/DoubleBarChartBlock/DoubleBarChartBlock.es.js";
14
- import y from "./blocks/ChartBlocks/StepChartBlock/StepChartBlock.es.js";
15
- import P from "./blocks/ChartBlocks/DonutChartBlock/DonutChartBlock.es.js";
16
- import R from "./blocks/ChartBlocks/DoubleProgressBarBlock/DoubleProgressBarBlock.es.js";
17
- import V from "./blocks/ComponentBlocks/AccountBlock/AccountBlock.es.js";
18
- import G from "./components/TransferLogoCard.es.js";
19
- import _ from "./blocks/ComponentBlocks/AccountSwitchBlock/AccountSwitchBlock.es.js";
20
- import W from "./components/AccountHeroCard.es.js";
21
- import q from "./components/DirectDepositCard.es.js";
22
- import J from "./blocks/ComponentBlocks/DirectDepositBlock/DirectDepositBlock.es.js";
23
- import { BudgetBlock as Q } from "./blocks/ComponentBlocks/BudgetBlock/BudgetBlock.es.js";
24
- import Y from "./components/DebtPayoffCard.es.js";
25
- import $ from "./components/UpcomingBillCard.es.js";
26
- import ro from "./blocks/ComponentBlocks/UpcomingBillBlock/UpcomingBillBlock.es.js";
27
- import mo from "./blocks/ComponentBlocks/DebtsBlock/DebtsBlock.es.js";
28
- import ao from "./components/SaveAnExtraCard.es.js";
29
- import fo from "./blocks/ComponentBlocks/SaveExtraBlock/SaveExtraBlock.es.js";
30
- import no from "./components/SavingsOpportunityCard.es.js";
31
- import lo from "./blocks/ComponentBlocks/SavingsOpportunityBlock/SavingsOpportunityBlock.es.js";
32
- import Bo from "./components/InsightTransactionRow.es.js";
33
- import go from "./components/TransactionListCard.es.js";
34
- import { transactionBlockVariant as ko } from "./blocks/ComponentBlocks/TransactionBlock/layout.es.js";
35
- import { TransactionBlock as ho } from "./blocks/ComponentBlocks/TransactionBlock/TransactionBlock.es.js";
36
- import bo from "./components/AmountPill.es.js";
37
- import To from "./components/SubscriptionHeroCard.es.js";
38
- import Lo from "./blocks/ComponentBlocks/UpcomingSubscriptionBlock/UpcomingSubscriptionBlock.es.js";
39
- import Ho from "./components/WithdrawalCard.es.js";
40
- import wo from "./blocks/ComponentBlocks/WithdrawalBlock/WithdrawalBlock.es.js";
41
- import { SVGImageBlock as Mo } from "./blocks/ImageBlocks/SVGImageBlock/SVGImageBlock.es.js";
42
- import Eo from "./components/ConnectionDetailDrillDown.es.js";
43
- import Fo from "./components/DesignateEmergencySavingsCard.es.js";
44
- import xo from "./components/shared/StatusSnackbar.es.js";
45
- import Uo from "./components/FeedbackDialog.es.js";
46
- import No from "./components/FeedbackModal.es.js";
47
- import jo from "./components/SurveyModal.es.js";
48
- import { ErrorCard as zo } from "./components/ErrorCard.es.js";
49
- import { HOST_ACTIONS as Ko } from "./ctaActions/hostActions.es.js";
50
- import { useBeatCtaActions as Xo, useCtaHandler as Yo } from "./ctaActions/useCtaAction.es.js";
11
+ import { HOST_ACTIONS as b } from "./ctaActions/hostActions.es.js";
12
+ import { useBeatCtaActions as T, useCtaHandler as I } from "./ctaActions/useCtaAction.es.js";
13
+ import { BAR_CHART_VARIANTS as v, barChartVariant as H, buildChartData as O, buildDataSeries as w } from "./blocks/ChartBlocks/BarchartBlock/utils.es.js";
14
+ import { BarchartBlock as M } from "./blocks/ChartBlocks/BarchartBlock/BarchartBlock.es.js";
15
+ import { DoubleBarChartBlock as E } from "./blocks/ChartBlocks/DoubleBarChartBlock/DoubleBarChartBlock.es.js";
16
+ import F from "./blocks/ChartBlocks/StepChartBlock/StepChartBlock.es.js";
17
+ import x from "./blocks/ChartBlocks/DonutChartBlock/DonutChartBlock.es.js";
18
+ import U from "./blocks/ChartBlocks/DoubleProgressBarBlock/DoubleProgressBarBlock.es.js";
19
+ import N from "./blocks/ComponentBlocks/AccountBlock/AccountBlock.es.js";
20
+ import j from "./components/TransferLogoCard.es.js";
21
+ import z from "./blocks/ComponentBlocks/AccountSwitchBlock/AccountSwitchBlock.es.js";
22
+ import K from "./components/AccountHeroCard.es.js";
23
+ import X from "./components/DirectDepositCard.es.js";
24
+ import Z from "./blocks/ComponentBlocks/DirectDepositBlock/DirectDepositBlock.es.js";
25
+ import { BudgetBlock as oo } from "./blocks/ComponentBlocks/BudgetBlock/BudgetBlock.es.js";
26
+ import to from "./components/DebtPayoffCard.es.js";
27
+ import io from "./components/UpcomingBillCard.es.js";
28
+ import po from "./blocks/ComponentBlocks/UpcomingBillBlock/UpcomingBillBlock.es.js";
29
+ import eo from "./blocks/ComponentBlocks/DebtsBlock/DebtsBlock.es.js";
30
+ import co from "./components/SaveAnExtraCard.es.js";
31
+ import so from "./blocks/ComponentBlocks/SaveExtraBlock/SaveExtraBlock.es.js";
32
+ import Co from "./components/SavingsOpportunityCard.es.js";
33
+ import uo from "./blocks/ComponentBlocks/SavingsOpportunityBlock/SavingsOpportunityBlock.es.js";
34
+ import So from "./components/InsightTransactionRow.es.js";
35
+ import Do from "./components/TransactionListCard.es.js";
36
+ import { transactionBlockVariant as Ao } from "./blocks/ComponentBlocks/TransactionBlock/layout.es.js";
37
+ import { TransactionBlock as Io } from "./blocks/ComponentBlocks/TransactionBlock/TransactionBlock.es.js";
38
+ import vo from "./components/AmountPill.es.js";
39
+ import Oo from "./components/SubscriptionHeroCard.es.js";
40
+ import yo from "./blocks/ComponentBlocks/UpcomingSubscriptionBlock/UpcomingSubscriptionBlock.es.js";
41
+ import Po from "./components/WithdrawalCard.es.js";
42
+ import Ro from "./blocks/ComponentBlocks/WithdrawalBlock/WithdrawalBlock.es.js";
43
+ import { SVGImageBlock as Vo } from "./blocks/ImageBlocks/SVGImageBlock/SVGImageBlock.es.js";
44
+ import Go from "./components/ConnectionDetailDrillDown.es.js";
45
+ import _o from "./components/DesignateEmergencySavingsCard.es.js";
46
+ import Wo from "./components/shared/StatusSnackbar.es.js";
47
+ import qo from "./components/FeedbackDialog.es.js";
48
+ import Jo from "./components/FeedbackModal.es.js";
49
+ import Qo from "./components/SurveyModal.es.js";
50
+ import { ErrorCard as Yo } from "./components/ErrorCard.es.js";
51
51
  import { FeedbackBar as $o } from "./components/FeedbackBar.es.js";
52
52
  import { DismissInsightDialog as rr } from "./components/DismissInsightDialog.es.js";
53
53
  import { HiddenConfirmationCard as mr } from "./components/HiddenConfirmationCard.es.js";
@@ -60,35 +60,35 @@ import Cr from "./components/LogoClusterCard.es.js";
60
60
  import ur from "./components/MerchantHighlightCard.es.js";
61
61
  import Sr from "./components/P2PLogoStack.es.js";
62
62
  export {
63
- V as AccountBlock,
64
- W as AccountHeroCard,
65
- _ as AccountSwitchBlock,
66
- bo as AmountPill,
67
- b as BAR_CHART_VARIANTS,
63
+ N as AccountBlock,
64
+ K as AccountHeroCard,
65
+ z as AccountSwitchBlock,
66
+ vo as AmountPill,
67
+ v as BAR_CHART_VARIANTS,
68
68
  f as BadgedTile,
69
- v as BarchartBlock,
69
+ M as BarchartBlock,
70
70
  nr as BaseLayout,
71
- Q as BudgetBlock,
71
+ oo as BudgetBlock,
72
72
  k as CompactInsightCard,
73
- Eo as ConnectionDetailDrillDown,
74
- Y as DebtPayoffCard,
75
- mo as DebtsBlock,
76
- Fo as DesignateEmergencySavingsCard,
77
- J as DirectDepositBlock,
78
- q as DirectDepositCard,
73
+ Go as ConnectionDetailDrillDown,
74
+ to as DebtPayoffCard,
75
+ eo as DebtsBlock,
76
+ _o as DesignateEmergencySavingsCard,
77
+ Z as DirectDepositBlock,
78
+ X as DirectDepositCard,
79
79
  rr as DismissInsightDialog,
80
- P as DonutChartBlock,
81
- O as DoubleBarChartBlock,
82
- R as DoubleProgressBarBlock,
83
- zo as ErrorCard,
80
+ x as DonutChartBlock,
81
+ E as DoubleBarChartBlock,
82
+ U as DoubleProgressBarBlock,
83
+ Yo as ErrorCard,
84
84
  $o as FeedbackBar,
85
- Uo as FeedbackDialog,
86
- No as FeedbackModal,
87
- Ko as HOST_ACTIONS,
85
+ qo as FeedbackDialog,
86
+ Jo as FeedbackModal,
87
+ b as HOST_ACTIONS,
88
88
  mr as HiddenConfirmationCard,
89
89
  h as InsightErrorCard,
90
90
  l as InsightOptionsMenu,
91
- Bo as InsightTransactionRow,
91
+ So as InsightTransactionRow,
92
92
  ar as LoadingCard,
93
93
  Cr as LogoClusterCard,
94
94
  d as LogoFromGuid,
@@ -97,33 +97,33 @@ export {
97
97
  fr as ObsolesceBanner,
98
98
  n as OverflowMenu,
99
99
  Sr as P2PLogoStack,
100
- Mo as SVGImageBlock,
101
- ao as SaveAnExtraCard,
102
- fo as SaveExtraBlock,
103
- lo as SavingsOpportunityBlock,
104
- no as SavingsOpportunityCard,
100
+ Vo as SVGImageBlock,
101
+ co as SaveAnExtraCard,
102
+ so as SaveExtraBlock,
103
+ uo as SavingsOpportunityBlock,
104
+ Co as SavingsOpportunityCard,
105
105
  g as StatusBadge,
106
106
  lr as StatusMessageCard,
107
107
  r as StatusPill,
108
- xo as StatusSnackbar,
109
- y as StepChartBlock,
110
- To as SubscriptionHeroCard,
111
- jo as SurveyModal,
112
- ho as TransactionBlock,
113
- go as TransactionListCard,
114
- G as TransferLogoCard,
115
- ro as UpcomingBillBlock,
116
- $ as UpcomingBillCard,
117
- Lo as UpcomingSubscriptionBlock,
118
- wo as WithdrawalBlock,
119
- Ho as WithdrawalCard,
120
- A as barChartVariant,
121
- T as buildChartData,
122
- I as buildDataSeries,
108
+ Wo as StatusSnackbar,
109
+ F as StepChartBlock,
110
+ Oo as SubscriptionHeroCard,
111
+ Qo as SurveyModal,
112
+ Io as TransactionBlock,
113
+ Do as TransactionListCard,
114
+ j as TransferLogoCard,
115
+ po as UpcomingBillBlock,
116
+ io as UpcomingBillCard,
117
+ yo as UpcomingSubscriptionBlock,
118
+ Ro as WithdrawalBlock,
119
+ Po as WithdrawalCard,
120
+ H as barChartVariant,
121
+ O as buildChartData,
122
+ w as buildDataSeries,
123
123
  B as isLogoGuid,
124
124
  m as resolveInsightRender,
125
- ko as transactionBlockVariant,
125
+ Ao as transactionBlockVariant,
126
126
  a as useBeatActions,
127
- Xo as useBeatCtaActions,
128
- Yo as useCtaHandler
127
+ T as useBeatCtaActions,
128
+ I as useCtaHandler
129
129
  };
@@ -1,5 +1,6 @@
1
1
  import { ContactSupportActionBlock as n } from "../actionBlocks/ContactSupportActionBlock.es.js";
2
2
  import { actionBlocksKey as o } from "./actionBlocksKey.es.js";
3
+ import { hasDrawerBlock as W } from "./hasDrawerBlock.es.js";
3
4
  import { BarchartBlock as m } from "../blocks/ChartBlocks/BarchartBlock/BarchartBlock.es.js";
4
5
  import { DoubleBarChartBlock as l } from "../blocks/ChartBlocks/DoubleBarChartBlock/DoubleBarChartBlock.es.js";
5
6
  import p from "../blocks/ChartBlocks/StepChartBlock/StepChartBlock.es.js";
@@ -33,7 +34,6 @@ import { useRecurringTransactionPrepare as a } from "../actionBlocks/RecurringTr
33
34
  import { RecurringTransactionBlock as w } from "../actionBlocks/RecurringTransactionBlock/RecurringTransactionBlock.es.js";
34
35
  import { TransactionListBlock as y } from "../actionBlocks/TransactionListBlock/TransactionListBlock.es.js";
35
36
  import { RemainingCashBlock as U } from "../actionBlocks/RemainingCashBlock/RemainingCashBlock.es.js";
36
- import { hasDrawerBlock as No } from "./hasDrawerBlock.es.js";
37
37
  import { AmountInputModalBlock as H } from "../actionBlocks/AmountInputModalBlock/AmountInputModalBlock.es.js";
38
38
  var r = (e) => {
39
39
  }, go = {
@@ -124,7 +124,7 @@ var r = (e) => {
124
124
  export {
125
125
  go as actionBlocks,
126
126
  Lo as blocks,
127
- No as hasDrawerBlock
127
+ W as hasDrawerBlock
128
128
  };
129
129
 
130
130
  //# sourceMappingURL=blocks.es.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mx-cartographer/experiences",
3
- "version": "9.6.13",
3
+ "version": "9.6.14",
4
4
  "description": "Library containing experience widgets",
5
5
  "author": "MX",
6
6
  "license": "MIT",