@mx-cartographer/experiences 9.4.23 → 9.4.24
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 +5 -0
- package/dist/common/utils/PostMessage.d.ts +51 -0
- package/dist/common/utils/PostMessage.es.js +44 -11
- package/dist/common/utils/PostMessage.es.js.map +1 -1
- package/dist/insights-v2/components/BaseLayout.es.js +69 -62
- package/dist/insights-v2/components/BaseLayout.es.js.map +1 -1
- package/dist/insights-v2/components/SaveAnExtraCard.es.js +11 -11
- package/dist/insights-v2/components/SaveAnExtraCard.es.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
## [9.4.24] - 09-16-2026
|
|
2
|
+
|
|
3
|
+
- **ADDED** - insights-v2 beat CTA post message (ported from Pulse): when a beat CTA has no drilldown drawer `block`, clicking it now notifies the host via a `beat/cta` post message (payload `action`, `beat_guid`, `beat_template`, `action_string?`, `user_guid`) or, on a native mobile webview, navigates to a `scheme://pulse/<event>?metadata=...` URL. New helpers in `common/utils/PostMessage.ts` (`getBaseCtaPostMessage`, `sendBeatPostMessage`, `setWebviewURL`, `dispatchBeatCta`, `BEAT_CTA_EVENT`, `BEAT_OPERATION_1/2/3`); `BaseLayout` CTA buttons route through a `handleCtaClick` helper that opens the drawer for CTAs with a real block and otherwise dispatches the post message. Scoped to the Save an extra $100 beat's "Make a Transfer" CTA (WEC-1805)
|
|
4
|
+
- **CHANGED** - `SaveAnExtraCard` renders the projected-balance footer as-is (the backend now sends it pre-formatted, e.g. "$3,320") instead of re-formatting a parsed number; mock payload and `SaveExtraBlock`/card tests updated to match (WEC-1805)
|
|
5
|
+
|
|
1
6
|
## [9.4.23] - 09-16-2026
|
|
2
7
|
|
|
3
8
|
- **ADDED** - Nested-drawer support for the insights-v2 `TransactionHistoryBlock`: clicking a transaction row in the history drawer opens a second, stacked `TransactionDetailsBlock` drawer scoped to that transaction, via `InsightsV2Store.setActionContext({ transaction_guid })` and `useActionContext<DrilldownPayload>()`. `TransactionDrillDown`'s row click is forwarded through a new `onEachRowClick` prop (WEC-1699)
|
|
@@ -8,3 +8,54 @@ export interface PostMessageData {
|
|
|
8
8
|
export declare function postMessageToParent(message: PostMessageData): boolean;
|
|
9
9
|
export declare function postInsightOnTransaction(beatGuid: string): boolean;
|
|
10
10
|
export declare function postClientConfiguredCta(template: string): boolean;
|
|
11
|
+
export declare const BEAT_CTA_EVENT = "beat/cta";
|
|
12
|
+
export declare const BEAT_OPERATION_1 = "op_1";
|
|
13
|
+
export declare const BEAT_OPERATION_2 = "op_2";
|
|
14
|
+
export declare const BEAT_OPERATION_3 = "op_3";
|
|
15
|
+
/** Minimal beat shape needed to build a CTA post message. */
|
|
16
|
+
export interface BeatCtaSource {
|
|
17
|
+
guid: string;
|
|
18
|
+
template: string;
|
|
19
|
+
payload?: {
|
|
20
|
+
action_string?: string;
|
|
21
|
+
} | null;
|
|
22
|
+
}
|
|
23
|
+
export interface BeatCtaPayload {
|
|
24
|
+
action: string;
|
|
25
|
+
beat_guid: string;
|
|
26
|
+
beat_template: string;
|
|
27
|
+
action_string?: string;
|
|
28
|
+
[key: string]: unknown;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build the `[event, payload]` tuple for a beat CTA post message.
|
|
32
|
+
* Mirrors Pulse's `getBaseCtaPostMessage`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getBaseCtaPostMessage(beat: BeatCtaSource, op?: string): [string, BeatCtaPayload];
|
|
35
|
+
/**
|
|
36
|
+
* Send a beat post message to the parent window. Only posts when embedded in an
|
|
37
|
+
* iframe (`window.self !== window.top`), mirroring Pulse's `sendPostMessage`
|
|
38
|
+
* (default scheme `mx/pulse`). Returns false when not embedded or no target.
|
|
39
|
+
*/
|
|
40
|
+
export declare function sendBeatPostMessage(event: string, data: Record<string, unknown>, scheme?: string): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Navigate a mobile webview to a custom-scheme URL instead of posting a message.
|
|
43
|
+
* Mirrors Pulse's `setWebviewURL` (default scheme `mx`).
|
|
44
|
+
*/
|
|
45
|
+
export declare function setWebviewURL(event: string, data?: Record<string, unknown>, scheme?: string): void;
|
|
46
|
+
export interface SendBeatCtaOptions {
|
|
47
|
+
/** True when running inside a native mobile webview. */
|
|
48
|
+
isMobileWebview?: boolean;
|
|
49
|
+
/** Custom URL scheme for webview navigation (from client config). */
|
|
50
|
+
webviewScheme?: string;
|
|
51
|
+
/** Current user guid, added to the metadata like the Pulse epic does. */
|
|
52
|
+
userGuid?: string;
|
|
53
|
+
/** Operation string sent with the CTA (defaults to op_1). */
|
|
54
|
+
op?: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Send a beat CTA to the host: builds the payload, adds `user_guid`, then either
|
|
58
|
+
* posts a message to the host or navigates the webview. Mirrors the behaviour of
|
|
59
|
+
* Pulse's `postMessages` epic (minus the RxJS buffering).
|
|
60
|
+
*/
|
|
61
|
+
export declare function sendBeatCta(beat: BeatCtaSource, { isMobileWebview, webviewScheme, userGuid, op }?: SendBeatCtaOptions): void;
|
|
@@ -1,29 +1,62 @@
|
|
|
1
|
-
function
|
|
1
|
+
function c() {
|
|
2
2
|
return window.opener && window.opener.location ? window.opener.location.toString() : document.referrer;
|
|
3
3
|
}
|
|
4
|
-
function
|
|
5
|
-
const n =
|
|
4
|
+
function a(e) {
|
|
5
|
+
const n = c().replace(/([^:]+:\/\/[^\/]+).*/, "$1"), t = window.parent || window.opener || !1;
|
|
6
6
|
return t && t.postMessage && n ? (t.postMessage(e, n), !0) : !1;
|
|
7
7
|
}
|
|
8
|
-
function
|
|
9
|
-
return
|
|
8
|
+
function w(e) {
|
|
9
|
+
return a({
|
|
10
10
|
metadata: { beat_guid: e },
|
|
11
11
|
mx: !0,
|
|
12
12
|
type: "mx/moneyDashboard/insightOnTransaction"
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
|
-
function
|
|
16
|
-
return
|
|
15
|
+
function m(e) {
|
|
16
|
+
return a({
|
|
17
17
|
metadata: { template: e },
|
|
18
18
|
mx: !0,
|
|
19
19
|
type: "mx/pulse/client_configured_cta"
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
|
+
var d = "beat/cta", p = "op_1";
|
|
23
|
+
function f(e, n = p) {
|
|
24
|
+
const t = {
|
|
25
|
+
action: n,
|
|
26
|
+
beat_guid: e.guid,
|
|
27
|
+
beat_template: e.template
|
|
28
|
+
};
|
|
29
|
+
return e?.payload?.action_string && (t.action_string = e.payload.action_string), [d, t];
|
|
30
|
+
}
|
|
31
|
+
function l(e, n, t = "mx/pulse") {
|
|
32
|
+
return window.self === window.top ? !1 : a({
|
|
33
|
+
metadata: n,
|
|
34
|
+
mx: !0,
|
|
35
|
+
type: `${t}/${e}`
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function g(e, n, t = "mx") {
|
|
39
|
+
let o = `${t}://pulse/${e}`;
|
|
40
|
+
n && (o += "?metadata=" + encodeURIComponent(JSON.stringify(n))), window.location.href = o;
|
|
41
|
+
}
|
|
42
|
+
function _(e, { isMobileWebview: n, webviewScheme: t, userGuid: o, op: s } = {}) {
|
|
43
|
+
const [r, u] = f(e, s), i = {
|
|
44
|
+
...u,
|
|
45
|
+
...o ? { user_guid: o } : {}
|
|
46
|
+
};
|
|
47
|
+
n ? g(r, i, t) : l(r, i);
|
|
48
|
+
}
|
|
22
49
|
export {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
50
|
+
d as BEAT_CTA_EVENT,
|
|
51
|
+
p as BEAT_OPERATION_1,
|
|
52
|
+
f as getBaseCtaPostMessage,
|
|
53
|
+
c as getReferrer,
|
|
54
|
+
m as postClientConfiguredCta,
|
|
55
|
+
w as postInsightOnTransaction,
|
|
56
|
+
a as postMessageToParent,
|
|
57
|
+
_ as sendBeatCta,
|
|
58
|
+
l as sendBeatPostMessage,
|
|
59
|
+
g as setWebviewURL
|
|
27
60
|
};
|
|
28
61
|
|
|
29
62
|
//# sourceMappingURL=PostMessage.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostMessage.es.js","names":[],"sources":["../../../src/common/utils/PostMessage.ts"],"sourcesContent":["export function getReferrer(): string {\n if (window.opener && window.opener.location) {\n return window.opener.location.toString()\n } else {\n return document.referrer\n }\n}\n\nexport interface PostMessageData {\n metadata?: Record<string, any>\n mx: boolean\n type: string\n [key: string]: any\n}\n\nexport function postMessageToParent(message: PostMessageData): boolean {\n const postUrl = getReferrer().replace(/([^:]+:\\/\\/[^\\/]+).*/, '$1') // eslint-disable-line\n const otherWindow = window.parent || window.opener || false\n\n if (otherWindow && otherWindow.postMessage && postUrl) {\n otherWindow.postMessage(message, postUrl)\n return true\n }\n\n return false\n}\n\nexport function postInsightOnTransaction(beatGuid: string): boolean {\n const message: PostMessageData = {\n metadata: { beat_guid: beatGuid },\n mx: true,\n type: 'mx/moneyDashboard/insightOnTransaction',\n }\n\n return postMessageToParent(message)\n}\n\nexport function postClientConfiguredCta(template: string): boolean {\n const message: PostMessageData = {\n metadata: { template: template },\n mx: true,\n type: 'mx/pulse/client_configured_cta',\n }\n\n return postMessageToParent(message)\n}\n"],"mappings":"AAAA,SAAgB,IAAsB;AACpC,SAAI,OAAO,UAAU,OAAO,OAAO,WAC1B,OAAO,OAAO,SAAS,SAAS,IAEhC,SAAS;AAEpB;AASA,SAAgB,EAAoB,GAAmC;AACrE,QAAM,IAAU,EAAY,EAAE,QAAQ,wBAAwB,IAAI,GAC5D,IAAc,OAAO,UAAU,OAAO,UAAU;AAEtD,SAAI,KAAe,EAAY,eAAe,KAC5C,EAAY,YAAY,GAAS,CAAO,GACjC,MAGF;AACT;AAEA,SAAgB,EAAyB,GAA2B;AAOlE,SAAO,EAAoB;AAAA,IALzB,UAAU,EAAE,WAAW,EAAS;AAAA,IAChC,IAAI;AAAA,IACJ,MAAM;AAAA,EAGmB,CAAO;AACpC;AAEA,SAAgB,EAAwB,GAA2B;AAOjE,SAAO,EAAoB;AAAA,IALzB,UAAU,EAAY,UAAA,EAAS;AAAA,IAC/B,IAAI;AAAA,IACJ,MAAM;AAAA,EAGmB,CAAO;AACpC"}
|
|
1
|
+
{"version":3,"file":"PostMessage.es.js","names":[],"sources":["../../../src/common/utils/PostMessage.ts"],"sourcesContent":["export function getReferrer(): string {\n if (window.opener && window.opener.location) {\n return window.opener.location.toString()\n } else {\n return document.referrer\n }\n}\n\nexport interface PostMessageData {\n metadata?: Record<string, any>\n mx: boolean\n type: string\n [key: string]: any\n}\n\nexport function postMessageToParent(message: PostMessageData): boolean {\n const postUrl = getReferrer().replace(/([^:]+:\\/\\/[^\\/]+).*/, '$1') // eslint-disable-line\n const otherWindow = window.parent || window.opener || false\n\n if (otherWindow && otherWindow.postMessage && postUrl) {\n otherWindow.postMessage(message, postUrl)\n return true\n }\n\n return false\n}\n\nexport function postInsightOnTransaction(beatGuid: string): boolean {\n const message: PostMessageData = {\n metadata: { beat_guid: beatGuid },\n mx: true,\n type: 'mx/moneyDashboard/insightOnTransaction',\n }\n\n return postMessageToParent(message)\n}\n\nexport function postClientConfiguredCta(template: string): boolean {\n const message: PostMessageData = {\n metadata: { template: template },\n mx: true,\n type: 'mx/pulse/client_configured_cta',\n }\n\n return postMessageToParent(message)\n}\n\n// ============================================================================\n// Beat CTA post messages (ported from Pulse: src/utils/PostMessage.js +\n// src/constants/PostMessage.js + src/epics/PostMessage.js).\n//\n// Scope: currently only the Save an extra $100 beat uses this. When a beat CTA\n// has no drilldown drawer, clicking it notifies the host app via a beat/cta\n// post message instead of opening a drawer. Native (mobile webview) hosts can't\n// receive post messages, so we navigate the webview to a custom-scheme URL.\n// ============================================================================\n\nexport const BEAT_CTA_EVENT = 'beat/cta'\nexport const BEAT_OPERATION_1 = 'op_1'\nexport const BEAT_OPERATION_2 = 'op_2'\nexport const BEAT_OPERATION_3 = 'op_3'\n\n/** Minimal beat shape needed to build a CTA post message. */\nexport interface BeatCtaSource {\n guid: string\n template: string\n payload?: { action_string?: string } | null\n}\n\nexport interface BeatCtaPayload {\n action: string\n beat_guid: string\n beat_template: string\n action_string?: string\n [key: string]: unknown\n}\n\n/**\n * Build the `[event, payload]` tuple for a beat CTA post message.\n * Mirrors Pulse's `getBaseCtaPostMessage`.\n */\nexport function getBaseCtaPostMessage(\n beat: BeatCtaSource,\n op: string = BEAT_OPERATION_1,\n): [string, BeatCtaPayload] {\n const payload: BeatCtaPayload = {\n action: op,\n beat_guid: beat.guid,\n beat_template: beat.template,\n }\n\n if (beat?.payload?.action_string) {\n payload.action_string = beat.payload.action_string\n }\n\n return [BEAT_CTA_EVENT, payload]\n}\n\n/**\n * Send a beat post message to the parent window. Only posts when embedded in an\n * iframe (`window.self !== window.top`), mirroring Pulse's `sendPostMessage`\n * (default scheme `mx/pulse`). Returns false when not embedded or no target.\n */\nexport function sendBeatPostMessage(\n event: string,\n data: Record<string, unknown>,\n scheme = 'mx/pulse',\n): boolean {\n if (window.self === window.top) {\n return false\n }\n\n const message: PostMessageData = {\n metadata: data,\n mx: true,\n type: `${scheme}/${event}`,\n }\n\n return postMessageToParent(message)\n}\n\n/**\n * Navigate a mobile webview to a custom-scheme URL instead of posting a message.\n * Mirrors Pulse's `setWebviewURL` (default scheme `mx`).\n */\nexport function setWebviewURL(event: string, data?: Record<string, unknown>, scheme = 'mx'): void {\n let webviewUrl = `${scheme}://pulse/${event}`\n\n if (data) {\n webviewUrl += '?metadata=' + encodeURIComponent(JSON.stringify(data))\n }\n\n window.location.href = webviewUrl\n}\n\nexport interface SendBeatCtaOptions {\n /** True when running inside a native mobile webview. */\n isMobileWebview?: boolean\n /** Custom URL scheme for webview navigation (from client config). */\n webviewScheme?: string\n /** Current user guid, added to the metadata like the Pulse epic does. */\n userGuid?: string\n /** Operation string sent with the CTA (defaults to op_1). */\n op?: string\n}\n\n/**\n * Send a beat CTA to the host: builds the payload, adds `user_guid`, then either\n * posts a message to the host or navigates the webview. Mirrors the behaviour of\n * Pulse's `postMessages` epic (minus the RxJS buffering).\n */\nexport function sendBeatCta(\n beat: BeatCtaSource,\n { isMobileWebview, webviewScheme, userGuid, op }: SendBeatCtaOptions = {},\n): void {\n const [event, basePayload] = getBaseCtaPostMessage(beat, op)\n const metadata: BeatCtaPayload = {\n ...basePayload,\n ...(userGuid ? { user_guid: userGuid } : {}),\n }\n\n if (isMobileWebview) {\n setWebviewURL(event, metadata, webviewScheme)\n } else {\n sendBeatPostMessage(event, metadata)\n }\n}\n"],"mappings":"AAAA,SAAgB,IAAsB;AACpC,SAAI,OAAO,UAAU,OAAO,OAAO,WAC1B,OAAO,OAAO,SAAS,SAAS,IAEhC,SAAS;AAEpB;AASA,SAAgB,EAAoB,GAAmC;AACrE,QAAM,IAAU,EAAY,EAAE,QAAQ,wBAAwB,IAAI,GAC5D,IAAc,OAAO,UAAU,OAAO,UAAU;AAEtD,SAAI,KAAe,EAAY,eAAe,KAC5C,EAAY,YAAY,GAAS,CAAO,GACjC,MAGF;AACT;AAEA,SAAgB,EAAyB,GAA2B;AAOlE,SAAO,EAAoB;AAAA,IALzB,UAAU,EAAE,WAAW,EAAS;AAAA,IAChC,IAAI;AAAA,IACJ,MAAM;AAAA,EAGmB,CAAO;AACpC;AAEA,SAAgB,EAAwB,GAA2B;AAOjE,SAAO,EAAoB;AAAA,IALzB,UAAU,EAAY,UAAA,EAAS;AAAA,IAC/B,IAAI;AAAA,IACJ,MAAM;AAAA,EAGmB,CAAO;AACpC;AAYA,IAAa,IAAiB,YACjB,IAAmB;AAuBhC,SAAgB,EACd,GACA,IAAa,GACa;AAC1B,QAAM,IAA0B;AAAA,IAC9B,QAAQ;AAAA,IACR,WAAW,EAAK;AAAA,IAChB,eAAe,EAAK;AAAA,EACtB;AAEA,SAAI,GAAM,SAAS,kBACjB,EAAQ,gBAAgB,EAAK,QAAQ,gBAGhC,CAAC,GAAgB,CAAO;AACjC;AAOA,SAAgB,EACd,GACA,GACA,IAAS,YACA;AACT,SAAI,OAAO,SAAS,OAAO,MAClB,KASF,EAAoB;AAAA,IALzB,UAAU;AAAA,IACV,IAAI;AAAA,IACJ,MAAM,GAAG,CAAA,IAAU,CAAA;AAAA,EAGM,CAAO;AACpC;AAMA,SAAgB,EAAc,GAAe,GAAgC,IAAS,MAAY;AAChG,MAAI,IAAa,GAAG,CAAA,YAAkB,CAAA;AAEtC,EAAI,MACF,KAAc,eAAe,mBAAmB,KAAK,UAAU,CAAI,CAAC,IAGtE,OAAO,SAAS,OAAO;AACzB;AAkBA,SAAgB,EACd,GACA,EAAE,iBAAA,GAAiB,eAAA,GAAe,UAAA,GAAU,IAAA,EAAA,IAA2B,CAAC,GAClE;AACN,QAAM,CAAC,GAAO,CAAA,IAAe,EAAsB,GAAM,CAAE,GACrD,IAA2B;AAAA,IAC/B,GAAG;AAAA,IACH,GAAI,IAAW,EAAE,WAAW,EAAS,IAAI,CAAC;AAAA,EAC5C;AAEA,EAAI,IACF,EAAc,GAAO,GAAU,CAAa,IAE5C,EAAoB,GAAO,CAAQ;AAEvC"}
|
|
@@ -1,23 +1,24 @@
|
|
|
1
|
-
import { useGlobalCopyStore as
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
1
|
+
import { useAppConfig as B, useGlobalCopyStore as D, useInsightsV2Store as L } from "../../common/context/hooks.es.js";
|
|
2
|
+
import { sendBeatCta as O } from "../../common/utils/PostMessage.es.js";
|
|
3
|
+
import { blocks as T, hasDrawerBlock as F } from "../mappings/blocks.es.js";
|
|
4
|
+
import A from "./Footer.es.js";
|
|
5
|
+
import { BeatActionsProvider as I } from "../beatActions.es.js";
|
|
6
|
+
import E from "./Header.es.js";
|
|
7
|
+
import { FeedbackBar as H } from "./FeedbackBar.es.js";
|
|
8
|
+
import M from "./FeedbackDialog.es.js";
|
|
9
|
+
import { DismissInsightDialog as G } from "./DismissInsightDialog.es.js";
|
|
10
|
+
import { HiddenConfirmationCard as R } from "./HiddenConfirmationCard.es.js";
|
|
11
|
+
import { ObsolesceBanner as j } from "./ObsolesceBanner.es.js";
|
|
12
|
+
import { ActionBlockLayer as z } from "../actionBlocks/ActionBlockLayer.es.js";
|
|
13
|
+
import { useBeatFeedbackFlow as N } from "../hooks/useBeatFeedbackFlow.es.js";
|
|
14
|
+
import { observer as U } from "mobx-react-lite";
|
|
14
15
|
import m from "@mui/material/Stack";
|
|
15
16
|
import d from "@mui/material/Button";
|
|
16
|
-
import { ChevronRight as
|
|
17
|
-
import { Fragment as
|
|
18
|
-
import
|
|
19
|
-
import
|
|
20
|
-
var
|
|
17
|
+
import { ChevronRight as V } from "@mxenabled/mx-icons";
|
|
18
|
+
import { Fragment as P, jsx as o, jsxs as t } from "react/jsx-runtime";
|
|
19
|
+
import W from "@mui/material/Box";
|
|
20
|
+
import X from "@mui/material/Card";
|
|
21
|
+
var Y = {}, q = {
|
|
21
22
|
position: "absolute",
|
|
22
23
|
top: 0,
|
|
23
24
|
left: 0,
|
|
@@ -26,23 +27,29 @@ var z = {}, G = {
|
|
|
26
27
|
backgroundColor: "background.default",
|
|
27
28
|
opacity: 0.7,
|
|
28
29
|
zIndex: 1
|
|
29
|
-
},
|
|
30
|
-
const { openCtaDrawer:
|
|
31
|
-
if (!r ||
|
|
32
|
-
const { instance_slot:
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
}, be = U(({ beat: i, beatActions: b = Y, obsolete: s }) => {
|
|
31
|
+
const { openCtaDrawer: h } = L(), y = D(), { is_mobile_webview: g, clientConfig: k } = B(), e = N(i, b), r = i.insights_payload;
|
|
32
|
+
if (!r || e.cardState === "dismissed") return null;
|
|
33
|
+
const { instance_slot: v, primary_cta: n, secondary_cta: a, subtitle: C, widget_type: _ } = r, { block: x } = v, p = (S, w) => {
|
|
34
|
+
F(S) ? h(i.guid, w) : O(i, {
|
|
35
|
+
isMobileWebview: g,
|
|
36
|
+
webviewScheme: k?.master?.ui_message_webview_url_scheme,
|
|
37
|
+
userGuid: i.user_guid
|
|
38
|
+
});
|
|
39
|
+
}, u = T[x], f = _ === "mini", l = y.insights_feed?.general, c = s?.state === "not_refreshable" && !i.dismissed_at && !!l;
|
|
40
|
+
return /* @__PURE__ */ o(I, {
|
|
41
|
+
value: e.wrappedActions,
|
|
35
42
|
children: /* @__PURE__ */ t(m, {
|
|
36
43
|
sx: { mb: 16 },
|
|
37
44
|
children: [
|
|
38
|
-
|
|
39
|
-
onClose:
|
|
40
|
-
onLeaveFeedback:
|
|
41
|
-
onUndo:
|
|
42
|
-
}) : /* @__PURE__ */ t(
|
|
45
|
+
e.cardState === "confirming" ? /* @__PURE__ */ o(R, {
|
|
46
|
+
onClose: e.collapseConfirmation,
|
|
47
|
+
onLeaveFeedback: e.openHideSurvey,
|
|
48
|
+
onUndo: e.undoDismiss
|
|
49
|
+
}) : /* @__PURE__ */ t(P, { children: [s && l && /* @__PURE__ */ o(j, {
|
|
43
50
|
...s,
|
|
44
51
|
copy: l
|
|
45
|
-
}), /* @__PURE__ */ t(
|
|
52
|
+
}), /* @__PURE__ */ t(X, {
|
|
46
53
|
inert: c,
|
|
47
54
|
sx: { ...c && {
|
|
48
55
|
position: "relative",
|
|
@@ -50,13 +57,13 @@ var z = {}, G = {
|
|
|
50
57
|
pointerEvents: "none"
|
|
51
58
|
} },
|
|
52
59
|
children: [
|
|
53
|
-
c && /* @__PURE__ */
|
|
54
|
-
/* @__PURE__ */
|
|
60
|
+
c && /* @__PURE__ */ o(W, { sx: q }),
|
|
61
|
+
/* @__PURE__ */ o(E, {
|
|
55
62
|
isMini: f,
|
|
56
|
-
subtitle:
|
|
63
|
+
subtitle: C,
|
|
57
64
|
title: i.title
|
|
58
65
|
}),
|
|
59
|
-
u && /* @__PURE__ */
|
|
66
|
+
u && /* @__PURE__ */ o(u, {
|
|
60
67
|
beatGuid: i.guid,
|
|
61
68
|
payload: r
|
|
62
69
|
}),
|
|
@@ -68,11 +75,11 @@ var z = {}, G = {
|
|
|
68
75
|
pr: 16,
|
|
69
76
|
pt: 12
|
|
70
77
|
},
|
|
71
|
-
children: [/* @__PURE__ */
|
|
78
|
+
children: [/* @__PURE__ */ o("div", {
|
|
72
79
|
dangerouslySetInnerHTML: { __html: i.html_description },
|
|
73
80
|
style: { paddingLeft: 4 }
|
|
74
|
-
}), i?.in_description_cta && /* @__PURE__ */
|
|
75
|
-
endIcon: /* @__PURE__ */
|
|
81
|
+
}), i?.in_description_cta && /* @__PURE__ */ o(d, {
|
|
82
|
+
endIcon: /* @__PURE__ */ o(V, {}),
|
|
76
83
|
onClick: () => {
|
|
77
84
|
},
|
|
78
85
|
sx: {
|
|
@@ -89,48 +96,48 @@ var z = {}, G = {
|
|
|
89
96
|
pb: 16,
|
|
90
97
|
px: 16
|
|
91
98
|
},
|
|
92
|
-
children: [/* @__PURE__ */
|
|
93
|
-
onClick: () => n.block
|
|
99
|
+
children: [/* @__PURE__ */ o(d, {
|
|
100
|
+
onClick: () => p(n.block, "primaryCta"),
|
|
94
101
|
variant: "outlined",
|
|
95
102
|
children: n.label
|
|
96
|
-
}), a?.label && /* @__PURE__ */
|
|
103
|
+
}), a?.label && /* @__PURE__ */ o(d, {
|
|
97
104
|
color: "secondary",
|
|
98
|
-
onClick: () => a.block
|
|
105
|
+
onClick: () => p(a.block, "secondaryCta"),
|
|
99
106
|
children: a.label
|
|
100
107
|
})]
|
|
101
108
|
}),
|
|
102
|
-
/* @__PURE__ */
|
|
103
|
-
onTellUsMore:
|
|
104
|
-
show:
|
|
109
|
+
/* @__PURE__ */ o(H, {
|
|
110
|
+
onTellUsMore: e.openRatingSurvey,
|
|
111
|
+
show: e.isFeedbackBarShown
|
|
105
112
|
})
|
|
106
113
|
]
|
|
107
114
|
})] }),
|
|
108
|
-
/* @__PURE__ */
|
|
109
|
-
/* @__PURE__ */
|
|
110
|
-
isOpen:
|
|
111
|
-
onClose:
|
|
112
|
-
onDismiss:
|
|
115
|
+
/* @__PURE__ */ o(z, { beat: i }),
|
|
116
|
+
/* @__PURE__ */ o(G, {
|
|
117
|
+
isOpen: e.isDismissOpen,
|
|
118
|
+
onClose: e.closeDismissDialog,
|
|
119
|
+
onDismiss: e.confirmDismiss
|
|
113
120
|
}),
|
|
114
|
-
|
|
115
|
-
characterLimitLabel:
|
|
116
|
-
closeAriaLabel:
|
|
121
|
+
e.isSurveyOpen && /* @__PURE__ */ o(M, {
|
|
122
|
+
characterLimitLabel: e.survey.characterLimitLabel,
|
|
123
|
+
closeAriaLabel: e.survey.closeAriaLabel,
|
|
117
124
|
isOpen: !0,
|
|
118
|
-
onBackClick:
|
|
119
|
-
onClose:
|
|
120
|
-
onSubmit:
|
|
121
|
-
onTextInputFocus:
|
|
122
|
-
options:
|
|
123
|
-
primaryText:
|
|
124
|
-
secondaryText:
|
|
125
|
-
title:
|
|
125
|
+
onBackClick: e.feedbackDialogCallbacks.onBackClick,
|
|
126
|
+
onClose: e.closeSurvey,
|
|
127
|
+
onSubmit: e.submitSurvey,
|
|
128
|
+
onTextInputFocus: e.feedbackDialogCallbacks.onTextInputFocus,
|
|
129
|
+
options: e.survey.options,
|
|
130
|
+
primaryText: e.survey.submitText,
|
|
131
|
+
secondaryText: e.survey.backText,
|
|
132
|
+
title: e.survey.title
|
|
126
133
|
}),
|
|
127
|
-
|
|
134
|
+
e.cardState === "visible" && r.footer && /* @__PURE__ */ o(A, { footer: r.footer })
|
|
128
135
|
]
|
|
129
136
|
})
|
|
130
137
|
});
|
|
131
138
|
});
|
|
132
139
|
export {
|
|
133
|
-
|
|
140
|
+
be as default
|
|
134
141
|
};
|
|
135
142
|
|
|
136
143
|
//# sourceMappingURL=BaseLayout.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseLayout.es.js","names":[],"sources":["../../../src/insights-v2/components/BaseLayout.tsx"],"sourcesContent":["import { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Button from '@mui/material/Button'\nimport Card from '@mui/material/Card'\nimport Stack from '@mui/material/Stack'\n\nimport { ChevronRight } from '@mxenabled/mx-icons'\n\nimport { blocks } from '../mappings/blocks'\n\nimport Footer from './Footer'\nimport Header from './Header'\nimport FeedbackBar from './FeedbackBar'\nimport FeedbackDialog from './FeedbackDialog'\nimport DismissInsightDialog from './DismissInsightDialog'\nimport HiddenConfirmationCard from './HiddenConfirmationCard'\nimport { ObsolesceBanner, type ObsolesceBannerState } from './ObsolesceBanner'\nimport { useGlobalCopyStore, useInsightsV2Store } from '../../common'\nimport type { Beat } from '../../core'\nimport { BeatActionsProvider, type BeatActions } from '../beatActions'\nimport { ActionBlockLayer } from '../actionBlocks/ActionBlockLayer'\nimport { useBeatFeedbackFlow } from '../hooks/useBeatFeedbackFlow'\n\nexport interface ObsoleteState {\n state: ObsolesceBannerState\n onRefresh: () => void\n onDismiss: () => void\n}\n\ninterface BaseLayoutProps {\n beat: Beat\n beatActions?: BeatActions\n obsolete?: ObsoleteState\n}\n\nconst NO_BEAT_ACTIONS: BeatActions = {}\n\nconst OBSOLETE_OVERLAY_SX = {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n backgroundColor: 'background.default',\n opacity: 0.7,\n zIndex: 1,\n} as const\n\nconst BaseLayout = observer(\n ({ beat, beatActions = NO_BEAT_ACTIONS, obsolete }: BaseLayoutProps) => {\n const { openCtaDrawer } = useInsightsV2Store()\n const copy = useGlobalCopyStore()\n const flow = useBeatFeedbackFlow(beat, beatActions)\n\n const insights_payload = beat.insights_payload\n\n if (!insights_payload) return null\n if (flow.cardState === 'dismissed') return null\n\n const { instance_slot, primary_cta, secondary_cta, subtitle, widget_type } = insights_payload\n const { block } = instance_slot\n\n const Block = blocks[block as keyof typeof blocks]\n\n const isMini = widget_type === 'mini'\n const obsoleteCopy = copy.insights_feed?.general\n const isObsoleteDimmed =\n obsolete?.state === 'not_refreshable' && !beat.dismissed_at && !!obsoleteCopy\n\n return (\n <BeatActionsProvider value={flow.wrappedActions}>\n <Stack sx={{ mb: 16 }}>\n {flow.cardState === 'confirming' ? (\n <HiddenConfirmationCard\n onClose={flow.collapseConfirmation}\n onLeaveFeedback={flow.openHideSurvey}\n onUndo={flow.undoDismiss}\n />\n ) : (\n <>\n {obsolete && obsoleteCopy && <ObsolesceBanner {...obsolete} copy={obsoleteCopy} />}\n <Card\n inert={isObsoleteDimmed}\n sx={{\n ...(isObsoleteDimmed && {\n position: 'relative',\n zIndex: 2,\n pointerEvents: 'none',\n }),\n }}\n >\n {isObsoleteDimmed && <Box sx={OBSOLETE_OVERLAY_SX} />}\n <Header isMini={isMini} subtitle={subtitle} title={beat.title} />\n {Block && <Block beatGuid={beat.guid} payload={insights_payload} />}\n\n <Stack sx={{ gap: 6, pb: 16, pl: 12, pr: 16, pt: 12 }}>\n <div\n dangerouslySetInnerHTML={{\n __html: beat.html_description as string,\n }}\n style={{ paddingLeft: 4 }}\n />\n {beat?.in_description_cta && (\n <Button\n endIcon={<ChevronRight />}\n onClick={() => {}}\n sx={{ height: 24, p: 4, width: 'max-content' }}\n >\n {beat.in_description_cta}\n </Button>\n )}\n </Stack>\n\n {!isMini && primary_cta?.label && (\n <Stack sx={{ gap: 8, pb: 16, px: 16 }}>\n <Button\n onClick={() => primary_cta.block && openCtaDrawer(beat.guid, 'primaryCta')}\n variant=\"outlined\"\n >\n {primary_cta.label}\n </Button>\n {secondary_cta?.label && (\n <Button\n color=\"secondary\"\n onClick={() =>\n secondary_cta.block && openCtaDrawer(beat.guid, 'secondaryCta')\n }\n >\n {secondary_cta.label}\n </Button>\n )}\n </Stack>\n )}\n\n <FeedbackBar onTellUsMore={flow.openRatingSurvey} show={flow.isFeedbackBarShown} />\n </Card>\n </>\n )}\n\n <ActionBlockLayer beat={beat} />\n\n <DismissInsightDialog\n isOpen={flow.isDismissOpen}\n onClose={flow.closeDismissDialog}\n onDismiss={flow.confirmDismiss}\n />\n\n {flow.isSurveyOpen && (\n <FeedbackDialog\n characterLimitLabel={flow.survey.characterLimitLabel}\n closeAriaLabel={flow.survey.closeAriaLabel}\n isOpen={true}\n onBackClick={flow.feedbackDialogCallbacks.onBackClick}\n onClose={flow.closeSurvey}\n onSubmit={flow.submitSurvey}\n onTextInputFocus={flow.feedbackDialogCallbacks.onTextInputFocus}\n options={flow.survey.options}\n primaryText={flow.survey.submitText}\n secondaryText={flow.survey.backText}\n title={flow.survey.title}\n />\n )}\n\n {flow.cardState === 'visible' && insights_payload.footer && (\n <Footer footer={insights_payload.footer} />\n )}\n </Stack>\n </BeatActionsProvider>\n )\n },\n)\n\nexport default BaseLayout\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BaseLayout.es.js","names":[],"sources":["../../../src/insights-v2/components/BaseLayout.tsx"],"sourcesContent":["import { observer } from 'mobx-react-lite'\n\nimport Box from '@mui/material/Box'\nimport Button from '@mui/material/Button'\nimport Card from '@mui/material/Card'\nimport Stack from '@mui/material/Stack'\n\nimport { ChevronRight } from '@mxenabled/mx-icons'\n\nimport { blocks, hasDrawerBlock } from '../mappings/blocks'\n\nimport Footer from './Footer'\nimport Header from './Header'\nimport FeedbackBar from './FeedbackBar'\nimport FeedbackDialog from './FeedbackDialog'\nimport DismissInsightDialog from './DismissInsightDialog'\nimport HiddenConfirmationCard from './HiddenConfirmationCard'\nimport { ObsolesceBanner, type ObsolesceBannerState } from './ObsolesceBanner'\nimport { useAppConfig, useGlobalCopyStore, useInsightsV2Store } from '../../common'\nimport { sendBeatCta } from '../../common/utils/PostMessage'\nimport type { Beat } from '../../core'\nimport { BeatActionsProvider, type BeatActions } from '../beatActions'\nimport { ActionBlockLayer } from '../actionBlocks/ActionBlockLayer'\nimport { useBeatFeedbackFlow } from '../hooks/useBeatFeedbackFlow'\n\nexport interface ObsoleteState {\n state: ObsolesceBannerState\n onRefresh: () => void\n onDismiss: () => void\n}\n\ninterface BaseLayoutProps {\n beat: Beat\n beatActions?: BeatActions\n obsolete?: ObsoleteState\n}\n\nconst NO_BEAT_ACTIONS: BeatActions = {}\n\nconst OBSOLETE_OVERLAY_SX = {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n backgroundColor: 'background.default',\n opacity: 0.7,\n zIndex: 1,\n} as const\n\nconst BaseLayout = observer(\n ({ beat, beatActions = NO_BEAT_ACTIONS, obsolete }: BaseLayoutProps) => {\n const { openCtaDrawer } = useInsightsV2Store()\n const copy = useGlobalCopyStore()\n const { is_mobile_webview, clientConfig } = useAppConfig()\n const flow = useBeatFeedbackFlow(beat, beatActions)\n\n const insights_payload = beat.insights_payload\n\n if (!insights_payload) return null\n if (flow.cardState === 'dismissed') return null\n\n const { instance_slot, primary_cta, secondary_cta, subtitle, widget_type } = insights_payload\n const { block } = instance_slot\n\n // A CTA with a real drilldown `block` opens a drawer; otherwise it notifies\n // the host app via a beat/cta post message (the \"Make a Transfer\" CTA on the\n // Save an extra $100 beat). Mirrors Pulse's SaveAnExtra100Dollars beat.\n const handleCtaClick = (\n ctaBlock: string | null | undefined,\n source: 'primaryCta' | 'secondaryCta',\n ) => {\n if (hasDrawerBlock(ctaBlock)) {\n openCtaDrawer(beat.guid, source)\n } else {\n sendBeatCta(beat, {\n isMobileWebview: is_mobile_webview,\n webviewScheme: clientConfig?.master?.ui_message_webview_url_scheme,\n userGuid: beat.user_guid,\n })\n }\n }\n\n const Block = blocks[block as keyof typeof blocks]\n\n const isMini = widget_type === 'mini'\n const obsoleteCopy = copy.insights_feed?.general\n const isObsoleteDimmed =\n obsolete?.state === 'not_refreshable' && !beat.dismissed_at && !!obsoleteCopy\n\n return (\n <BeatActionsProvider value={flow.wrappedActions}>\n <Stack sx={{ mb: 16 }}>\n {flow.cardState === 'confirming' ? (\n <HiddenConfirmationCard\n onClose={flow.collapseConfirmation}\n onLeaveFeedback={flow.openHideSurvey}\n onUndo={flow.undoDismiss}\n />\n ) : (\n <>\n {obsolete && obsoleteCopy && <ObsolesceBanner {...obsolete} copy={obsoleteCopy} />}\n <Card\n inert={isObsoleteDimmed}\n sx={{\n ...(isObsoleteDimmed && {\n position: 'relative',\n zIndex: 2,\n pointerEvents: 'none',\n }),\n }}\n >\n {isObsoleteDimmed && <Box sx={OBSOLETE_OVERLAY_SX} />}\n <Header isMini={isMini} subtitle={subtitle} title={beat.title} />\n {Block && <Block beatGuid={beat.guid} payload={insights_payload} />}\n\n <Stack sx={{ gap: 6, pb: 16, pl: 12, pr: 16, pt: 12 }}>\n <div\n dangerouslySetInnerHTML={{\n __html: beat.html_description as string,\n }}\n style={{ paddingLeft: 4 }}\n />\n {beat?.in_description_cta && (\n <Button\n endIcon={<ChevronRight />}\n onClick={() => {}}\n sx={{ height: 24, p: 4, width: 'max-content' }}\n >\n {beat.in_description_cta}\n </Button>\n )}\n </Stack>\n\n {!isMini && primary_cta?.label && (\n <Stack sx={{ gap: 8, pb: 16, px: 16 }}>\n <Button\n onClick={() => handleCtaClick(primary_cta.block, 'primaryCta')}\n variant=\"outlined\"\n >\n {primary_cta.label}\n </Button>\n {secondary_cta?.label && (\n <Button\n color=\"secondary\"\n onClick={() => handleCtaClick(secondary_cta.block, 'secondaryCta')}\n >\n {secondary_cta.label}\n </Button>\n )}\n </Stack>\n )}\n\n <FeedbackBar onTellUsMore={flow.openRatingSurvey} show={flow.isFeedbackBarShown} />\n </Card>\n </>\n )}\n\n <ActionBlockLayer beat={beat} />\n\n <DismissInsightDialog\n isOpen={flow.isDismissOpen}\n onClose={flow.closeDismissDialog}\n onDismiss={flow.confirmDismiss}\n />\n\n {flow.isSurveyOpen && (\n <FeedbackDialog\n characterLimitLabel={flow.survey.characterLimitLabel}\n closeAriaLabel={flow.survey.closeAriaLabel}\n isOpen={true}\n onBackClick={flow.feedbackDialogCallbacks.onBackClick}\n onClose={flow.closeSurvey}\n onSubmit={flow.submitSurvey}\n onTextInputFocus={flow.feedbackDialogCallbacks.onTextInputFocus}\n options={flow.survey.options}\n primaryText={flow.survey.submitText}\n secondaryText={flow.survey.backText}\n title={flow.survey.title}\n />\n )}\n\n {flow.cardState === 'visible' && insights_payload.footer && (\n <Footer footer={insights_payload.footer} />\n )}\n </Stack>\n </BeatActionsProvider>\n )\n },\n)\n\nexport default BaseLayout\n"],"mappings":"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"}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { formatCurrency as
|
|
2
|
-
import { getLogoElevation as
|
|
1
|
+
import { formatCurrency as h } from "../../core/utils/NumberFormatting.es.js";
|
|
2
|
+
import { getLogoElevation as m } from "./logoShadow.es.js";
|
|
3
3
|
import { Text as r } from "@mxenabled/mxui";
|
|
4
4
|
import { jsx as o, jsxs as e } from "react/jsx-runtime";
|
|
5
5
|
import t from "@mui/material/Box";
|
|
6
|
-
var C = ({ primaryText:
|
|
7
|
-
const [d, s
|
|
6
|
+
var C = ({ primaryText: i = [], secondaryText: n = [], bgcolor: a = "success.main", sx: c }) => {
|
|
7
|
+
const [l, d, s] = i, [p, x] = n;
|
|
8
8
|
return /* @__PURE__ */ e(t, {
|
|
9
9
|
sx: {
|
|
10
10
|
border: "1px solid",
|
|
11
11
|
borderColor: "success.main",
|
|
12
12
|
borderRadius: 2,
|
|
13
|
-
boxShadow:
|
|
13
|
+
boxShadow: m,
|
|
14
14
|
overflow: "hidden",
|
|
15
|
-
...
|
|
15
|
+
...c
|
|
16
16
|
},
|
|
17
17
|
children: [/* @__PURE__ */ e(t, {
|
|
18
18
|
sx: {
|
|
19
|
-
bgcolor:
|
|
19
|
+
bgcolor: a,
|
|
20
20
|
color: "success.contrastText",
|
|
21
21
|
p: 16,
|
|
22
22
|
pt: 12,
|
|
@@ -26,18 +26,18 @@ var C = ({ primaryText: n = [], secondaryText: a = [], bgcolor: c = "success.mai
|
|
|
26
26
|
/* @__PURE__ */ o(r, {
|
|
27
27
|
color: "inherit",
|
|
28
28
|
variant: "subtitle1",
|
|
29
|
-
children:
|
|
29
|
+
children: l
|
|
30
30
|
}),
|
|
31
31
|
/* @__PURE__ */ o(r, {
|
|
32
32
|
bold: !0,
|
|
33
33
|
color: "inherit",
|
|
34
34
|
variant: "h1",
|
|
35
|
-
children:
|
|
35
|
+
children: h(Number(d ?? "0"), "0,0.00")
|
|
36
36
|
}),
|
|
37
37
|
/* @__PURE__ */ o(r, {
|
|
38
38
|
color: "inherit",
|
|
39
39
|
variant: "caption",
|
|
40
|
-
children:
|
|
40
|
+
children: s
|
|
41
41
|
})
|
|
42
42
|
]
|
|
43
43
|
}), /* @__PURE__ */ e(t, {
|
|
@@ -49,7 +49,7 @@ var C = ({ primaryText: n = [], secondaryText: a = [], bgcolor: c = "success.mai
|
|
|
49
49
|
},
|
|
50
50
|
children: [/* @__PURE__ */ o(r, {
|
|
51
51
|
variant: "h3",
|
|
52
|
-
children:
|
|
52
|
+
children: p
|
|
53
53
|
}), /* @__PURE__ */ o(r, {
|
|
54
54
|
color: "text.secondary",
|
|
55
55
|
variant: "caption",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SaveAnExtraCard.es.js","names":[],"sources":["../../../src/insights-v2/components/SaveAnExtraCard.tsx"],"sourcesContent":["import Box from '@mui/material/Box'\nimport type { SxProps, Theme } from '@mui/material/styles'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport { formatCurrency } from '../../core/utils/NumberFormatting'\n\nimport { getLogoElevation } from './logoShadow'\n\ninterface SaveAnExtraCardProps {\n primaryText?: string[]\n secondaryText?: string[]\n bgcolor?: string\n sx?: SxProps<Theme>\n}\n\nconst SaveAnExtraCard = ({\n primaryText = [],\n secondaryText = [],\n bgcolor = 'success.main',\n sx,\n}: SaveAnExtraCardProps) => {\n const [leadIn, amount, trailingCopy] = primaryText\n const [projected, projectedCaption] = secondaryText\n\n return (\n <Box\n sx={{\n border: '1px solid',\n borderColor: 'success.main',\n borderRadius: 2,\n boxShadow: getLogoElevation,\n overflow: 'hidden',\n ...sx,\n }}\n >\n {/* Green header */}\n <Box\n sx={{\n bgcolor,\n color: 'success.contrastText',\n p: 16,\n pt: 12,\n textAlign: 'center',\n }}\n >\n <Text color=\"inherit\" variant=\"subtitle1\">\n {leadIn}\n </Text>\n <Text bold={true} color=\"inherit\" variant=\"h1\">\n {formatCurrency(Number(amount ?? '0'), '0,0.00')}\n </Text>\n <Text color=\"inherit\" variant=\"caption\">\n {trailingCopy}\n </Text>\n </Box>\n\n {/* White footer with projected amount */}\n <Box sx={{ bgcolor: 'background.paper', px: 16, py: 12, textAlign: 'center' }}>\n <Text variant=\"h3\">{
|
|
1
|
+
{"version":3,"file":"SaveAnExtraCard.es.js","names":[],"sources":["../../../src/insights-v2/components/SaveAnExtraCard.tsx"],"sourcesContent":["import Box from '@mui/material/Box'\nimport type { SxProps, Theme } from '@mui/material/styles'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport { formatCurrency } from '../../core/utils/NumberFormatting'\n\nimport { getLogoElevation } from './logoShadow'\n\ninterface SaveAnExtraCardProps {\n primaryText?: string[]\n secondaryText?: string[]\n bgcolor?: string\n sx?: SxProps<Theme>\n}\n\nconst SaveAnExtraCard = ({\n primaryText = [],\n secondaryText = [],\n bgcolor = 'success.main',\n sx,\n}: SaveAnExtraCardProps) => {\n const [leadIn, amount, trailingCopy] = primaryText\n const [projected, projectedCaption] = secondaryText\n\n return (\n <Box\n sx={{\n border: '1px solid',\n borderColor: 'success.main',\n borderRadius: 2,\n boxShadow: getLogoElevation,\n overflow: 'hidden',\n ...sx,\n }}\n >\n {/* Green header */}\n <Box\n sx={{\n bgcolor,\n color: 'success.contrastText',\n p: 16,\n pt: 12,\n textAlign: 'center',\n }}\n >\n <Text color=\"inherit\" variant=\"subtitle1\">\n {leadIn}\n </Text>\n <Text bold={true} color=\"inherit\" variant=\"h1\">\n {formatCurrency(Number(amount ?? '0'), '0,0.00')}\n </Text>\n <Text color=\"inherit\" variant=\"caption\">\n {trailingCopy}\n </Text>\n </Box>\n\n {/* White footer with projected amount. The projected balance arrives\n pre-formatted from the backend (e.g. \"$3,320\"), so render it as-is. */}\n <Box sx={{ bgcolor: 'background.paper', px: 16, py: 12, textAlign: 'center' }}>\n <Text variant=\"h3\">{projected}</Text>\n <Text color=\"text.secondary\" variant=\"caption\">\n {projectedCaption}\n </Text>\n </Box>\n </Box>\n )\n}\n\nexport default SaveAnExtraCard\n"],"mappings":";;;;;AAgBA,IAAM,IAAA,CAAmB,EACvB,aAAA,IAAc,CAAC,GACf,eAAA,IAAgB,CAAC,GACjB,SAAA,IAAU,gBACV,IAAA,EAAA,MAC0B;AAC1B,QAAM,CAAC,GAAQ,GAAQ,CAAA,IAAgB,GACjC,CAAC,GAAW,CAAA,IAAoB;AAEtC,SACE,gBAAA,EAAC,GAAD;AAAA,IACE,IAAI;AAAA,MACF,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,cAAc;AAAA,MACd,WAAW;AAAA,MACX,UAAU;AAAA,MACV,GAAG;AAAA,IACL;AAAA,IARF,UAAA,CAWE,gBAAA,EAAC,GAAD;AAAA,MACE,IAAI;AAAA,QACF,SAAA;AAAA,QACA,OAAO;AAAA,QACP,GAAG;AAAA,QACH,IAAI;AAAA,QACJ,WAAW;AAAA,MACb;AAAA,MAPF,UAAA;AAAA,QASE,gBAAA,EAAC,GAAD;AAAA,UAAM,OAAM;AAAA,UAAU,SAAQ;AAAA,UAC3B,UAAA;AAAA,QACG,CAAA;AAAA,QACN,gBAAA,EAAC,GAAD;AAAA,UAAM,MAAM;AAAA,UAAM,OAAM;AAAA,UAAU,SAAQ;AAAA,UACvC,UAAA,EAAe,OAAO,KAAU,GAAG,GAAG,QAAQ;AAAA,QAC3C,CAAA;AAAA,QACN,gBAAA,EAAC,GAAD;AAAA,UAAM,OAAM;AAAA,UAAU,SAAQ;AAAA,UAC3B,UAAA;AAAA,QACG,CAAA;AAAA,MACH;AAAA,IAIL,CAAA,GAAA,gBAAA,EAAC,GAAD;AAAA,MAAK,IAAI;AAAA,QAAE,SAAS;AAAA,QAAoB,IAAI;AAAA,QAAI,IAAI;AAAA,QAAI,WAAW;AAAA,MAAS;AAAA,MAA5E,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,QAAM,SAAQ;AAAA,QAAM,UAAA;AAAA,MAAgB,CAAA,GACpC,gBAAA,EAAC,GAAD;AAAA,QAAM,OAAM;AAAA,QAAiB,SAAQ;AAAA,QAClC,UAAA;AAAA,MACG,CAAA,CACH;AAAA,IACF,CAAA,CAAA;AAAA;AAET"}
|