@webex/cc-digital-channels 0.0.0-next.1

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.
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.DigitalChannelsComponent = void 0;
40
+ const react_1 = __importStar(require("react"));
41
+ const cc_digital_interactions_1 = __importDefault(require("cc-digital-interactions"));
42
+ require("@momentum-ui/web-components");
43
+ /**
44
+ * Presentation component for Digital Channels.
45
+ * Renders the Engage widget with proper theming.
46
+ */
47
+ const DigitalChannelsComponent = ({ conversationId, jwtToken, dataCenter, currentTheme = 'LIGHT', }) => {
48
+ // Create a stable key based on critical props to force remount when they change
49
+ // This prevents issues with the Froala editor trying to cleanup/reinitialize improperly
50
+ const componentKey = (0, react_1.useMemo)(() => {
51
+ return `${conversationId}-${jwtToken.slice(-8)}-${dataCenter}`;
52
+ }, [conversationId, jwtToken, dataCenter]);
53
+ const isDarkTheme = currentTheme === 'DARK';
54
+ return (react_1.default.createElement("div", null,
55
+ react_1.default.createElement("md-theme", Object.assign({ id: "app-theme", theme: "momentumV2" }, (isDarkTheme ? { darktheme: true } : { lighttheme: true })),
56
+ react_1.default.createElement(cc_digital_interactions_1.default, { key: componentKey, conversationId: conversationId, jwtToken: jwtToken, dataCenter: dataCenter, interactionId: "", readonly: false, theme: isDarkTheme ? 'dark' : 'light', isVisualRebrand: true }))));
57
+ };
58
+ exports.DigitalChannelsComponent = DigitalChannelsComponent;
59
+ //# sourceMappingURL=DigitalChannelsComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DigitalChannelsComponent.js","sourceRoot":"","sources":["../../src/digital-channels/DigitalChannelsComponent.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAqC;AACrC,sFAA6C;AAE7C,uCAAqC;AAGrC;;;GAGG;AACH,MAAM,wBAAwB,GAA2D,CAAC,EACxF,cAAc,EACd,QAAQ,EACR,UAAU,EACV,YAAY,GAAG,OAAO,GACvB,EAAE,EAAE;IACH,gFAAgF;IAChF,wFAAwF;IACxF,MAAM,YAAY,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QAChC,OAAO,GAAG,cAAc,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC;IACjE,CAAC,EAAE,CAAC,cAAc,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAE3C,MAAM,WAAW,GAAG,YAAY,KAAK,MAAM,CAAC;IAE5C,OAAO,CACL;QACE,0DAAU,EAAE,EAAC,WAAW,EAAC,KAAK,EAAC,YAAY,IAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC,EAAC,UAAU,EAAE,IAAI,EAAC,CAAC;YACpG,8BAAC,iCAAM,IACL,GAAG,EAAE,YAAY,EACjB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAC,EAAE,EAChB,QAAQ,EAAE,KAAK,EACf,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EACrC,eAAe,EAAE,IAAI,GACrB,CACO,CACP,CACP,CAAC;AACJ,CAAC,CAAC;AAEM,4DAAwB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=digital-channels.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digital-channels.types.js","sourceRoot":"","sources":["../../src/digital-channels/digital-channels.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DigitalChannels = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const mobx_react_lite_1 = require("mobx-react-lite");
9
+ const react_error_boundary_1 = require("react-error-boundary");
10
+ const cc_store_1 = __importDefault(require("@webex/cc-store"));
11
+ const helper_1 = require("../helper");
12
+ const DigitalChannelsComponent_1 = require("./DigitalChannelsComponent");
13
+ const DigitalChannelsInternal = (0, mobx_react_lite_1.observer)(({ currentTheme }) => {
14
+ const { logger, currentTask, isDigitalChannelsInitialized, setDigitalChannelsInitialized, getAccessToken, dataCenter } = cc_store_1.default;
15
+ // Fetch JWT token and conversation ID
16
+ const { jwtToken, conversationId, hasError } = (0, helper_1.useDigitalChannelsData)({
17
+ getAccessToken,
18
+ currentTask,
19
+ logger,
20
+ });
21
+ // Initialize Digital Channels app once we have all required data
22
+ const { initialized } = (0, helper_1.useDigitalChannelsInit)({
23
+ currentTask: currentTask || {},
24
+ jwtToken: jwtToken || '',
25
+ dataCenter: dataCenter || '',
26
+ logger,
27
+ isDigitalChannelsInitialized,
28
+ setDigitalChannelsInitialized,
29
+ // Skip initialization if we don't have required data
30
+ skipInit: !currentTask || !jwtToken || !dataCenter,
31
+ });
32
+ // Early return after all hooks are called
33
+ if (!currentTask || !jwtToken || !dataCenter || hasError || !initialized || !conversationId) {
34
+ return null;
35
+ }
36
+ return (react_1.default.createElement(DigitalChannelsComponent_1.DigitalChannelsComponent, { conversationId: conversationId, jwtToken: jwtToken, dataCenter: dataCenter, currentTheme: currentTheme }));
37
+ });
38
+ const DigitalChannels = (props) => {
39
+ return (react_1.default.createElement(react_error_boundary_1.ErrorBoundary, { fallbackRender: () => react_1.default.createElement(react_1.default.Fragment, null), onError: (error) => {
40
+ if (cc_store_1.default.onErrorCallback)
41
+ cc_store_1.default.onErrorCallback('DigitalChannels', error);
42
+ } },
43
+ react_1.default.createElement(DigitalChannelsInternal, Object.assign({}, props))));
44
+ };
45
+ exports.DigitalChannels = DigitalChannels;
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/digital-channels/index.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,qDAAyC;AACzC,+DAAmD;AAEnD,+DAAoC;AACpC,sCAAyE;AACzE,yEAAoE;AAGpE,MAAM,uBAAuB,GAAkD,IAAA,0BAAQ,EAAC,CAAC,EAAC,YAAY,EAAC,EAAE,EAAE;IACzG,MAAM,EAAC,MAAM,EAAE,WAAW,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,cAAc,EAAE,UAAU,EAAC,GAClH,kBAAK,CAAC;IAER,sCAAsC;IACtC,MAAM,EAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAC,GAAG,IAAA,+BAAsB,EAAC;QAClE,cAAc;QACd,WAAW;QACX,MAAM;KACP,CAAC,CAAC;IAEH,iEAAiE;IACjE,MAAM,EAAC,WAAW,EAAC,GAAG,IAAA,+BAAsB,EAAC;QAC3C,WAAW,EAAE,WAAW,IAAK,EAAyB;QACtD,QAAQ,EAAE,QAAQ,IAAI,EAAE;QACxB,UAAU,EAAE,UAAU,IAAI,EAAE;QAC5B,MAAM;QACN,4BAA4B;QAC5B,6BAA6B;QAC7B,qDAAqD;QACrD,QAAQ,EAAE,CAAC,WAAW,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU;KACnD,CAAC,CAAC;IAEH,0CAA0C;IAC1C,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,IAAI,QAAQ,IAAI,CAAC,WAAW,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,8BAAC,mDAAwB,IACvB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,GAC1B,CACH,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,eAAe,GAAkD,CAAC,KAAK,EAAE,EAAE;IAC/E,OAAO,CACL,8BAAC,oCAAa,IACZ,cAAc,EAAE,GAAG,EAAE,CAAC,6DAAK,EAC3B,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;YACxB,IAAI,kBAAK,CAAC,eAAe;gBAAE,kBAAK,CAAC,eAAe,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QAC7E,CAAC;QAED,8BAAC,uBAAuB,oBAAK,KAAK,EAAI,CACxB,CACjB,CAAC;AACJ,CAAC,CAAC;AAEM,0CAAe"}
package/dist/helper.js ADDED
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.useDigitalChannelsData = exports.useDigitalChannelsInit = void 0;
13
+ const react_1 = require("react");
14
+ const cc_digital_interactions_1 = require("cc-digital-interactions");
15
+ /**
16
+ * Hook to handle Digital Channels initialization.
17
+ * Ensures initialization happens only once per session using store flag.
18
+ */
19
+ const useDigitalChannelsInit = (props) => {
20
+ const { currentTask, jwtToken, dataCenter, logger, isDigitalChannelsInitialized, setDigitalChannelsInitialized, skipInit = false, } = props;
21
+ const [initialized, setInitialized] = (0, react_1.useState)(isDigitalChannelsInitialized);
22
+ (0, react_1.useEffect)(() => {
23
+ // Skip initialization if required data is not available
24
+ if (skipInit) {
25
+ return;
26
+ }
27
+ const initialize = () => __awaiter(void 0, void 0, void 0, function* () {
28
+ // Initialize the digital channels app only once per session
29
+ if (!isDigitalChannelsInitialized) {
30
+ logger.log(`[DIGITAL_CHANNELS_INIT] Starting Digital Channels initialization for the FIRST TIME (dataCenter: ${dataCenter})...`, {
31
+ module: 'cc-digital-channels',
32
+ method: 'useDigitalChannelsInit',
33
+ });
34
+ try {
35
+ yield (0, cc_digital_interactions_1.initializeApp)(dataCenter, jwtToken);
36
+ setDigitalChannelsInitialized(true);
37
+ setInitialized(true);
38
+ logger.log('[DIGITAL_CHANNELS_INIT] ✅ Digital Channels app initialized SUCCESSFULLY', {
39
+ module: 'cc-digital-channels',
40
+ method: 'useDigitalChannelsInit',
41
+ });
42
+ }
43
+ catch (error) {
44
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
45
+ logger.error(`[DIGITAL_CHANNELS_INIT] ❌ Failed to initialize Digital Channels app: ${errorMessage}`, {
46
+ module: 'cc-digital-channels',
47
+ method: 'useDigitalChannelsInit',
48
+ error,
49
+ });
50
+ }
51
+ }
52
+ else {
53
+ logger.log('[DIGITAL_CHANNELS_INIT] ✅ App already initialized. Skipping re-initialization.', {
54
+ module: 'cc-digital-channels',
55
+ method: 'useDigitalChannelsInit',
56
+ });
57
+ setInitialized(true);
58
+ }
59
+ });
60
+ initialize();
61
+ }, [currentTask, skipInit, jwtToken]);
62
+ return { initialized };
63
+ };
64
+ exports.useDigitalChannelsInit = useDigitalChannelsInit;
65
+ /**
66
+ * Hook to handle fetching Digital Channels data (token and conversationId).
67
+ * Centralizes token fetching logic to keep the component clean.
68
+ */
69
+ const useDigitalChannelsData = (props) => {
70
+ const { getAccessToken, currentTask, logger } = props;
71
+ const [jwtToken, setJwtToken] = (0, react_1.useState)('');
72
+ const [tokenError, setTokenError] = (0, react_1.useState)(false);
73
+ // Fetch access token from the store
74
+ (0, react_1.useEffect)(() => {
75
+ const fetchToken = () => __awaiter(void 0, void 0, void 0, function* () {
76
+ try {
77
+ const token = yield getAccessToken();
78
+ setJwtToken(token);
79
+ }
80
+ catch (error) {
81
+ logger === null || logger === void 0 ? void 0 : logger.error('[DIGITAL_CHANNELS] ❌ Failed to get access token', {
82
+ module: 'cc-digital-channels',
83
+ method: 'useDigitalChannelsData.fetchToken',
84
+ error,
85
+ });
86
+ setTokenError(true);
87
+ }
88
+ });
89
+ fetchToken();
90
+ }, [getAccessToken, logger]);
91
+ // Extract conversationId from currentTask (always call this, return empty string if no task)
92
+ const conversationId = (0, react_1.useMemo)(() => {
93
+ var _a;
94
+ if (!currentTask)
95
+ return '';
96
+ return (((_a = currentTask.data.interaction.callAssociatedDetails) === null || _a === void 0 ? void 0 : _a.mediaResourceId) || '');
97
+ }, [currentTask]);
98
+ const hasError = tokenError;
99
+ return {
100
+ jwtToken,
101
+ conversationId,
102
+ tokenError,
103
+ hasError,
104
+ };
105
+ };
106
+ exports.useDigitalChannelsData = useDigitalChannelsData;
107
+ //# sourceMappingURL=helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helper.js","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"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"}