pager-widget 1.0.11-alpha.9 → 1.0.13

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 (79) hide show
  1. package/dist/index.css +1 -1
  2. package/dist/index.html +40 -0
  3. package/dist/index.js +8 -8
  4. package/dist/react-parcel.9f367d21.css +2970 -0
  5. package/dist/react-parcel.9f367d21.css.map +1 -0
  6. package/dist/react-parcel.js +231527 -0
  7. package/dist/react-parcel.js.map +1 -0
  8. package/dist/server.html +33 -39
  9. package/out/AgentFeedbackButtonWrapper.js +15 -0
  10. package/out/App.js +28 -0
  11. package/out/BotMain.js +91 -0
  12. package/out/ButtonsWrapper.js +29 -0
  13. package/out/ChatPage.js +9 -0
  14. package/out/ChatPageContent.js +131 -0
  15. package/out/ChatPageHeader.js +267 -0
  16. package/out/ChatPageInput.js +29 -0
  17. package/out/ChatWidget.js +17 -0
  18. package/out/Consent.js +66 -0
  19. package/out/CountryDropdown.js +31 -0
  20. package/out/Form.js +238 -0
  21. package/out/HomePage.js +11 -0
  22. package/out/HomePageContent.js +32 -0
  23. package/out/HomePageFooter.js +87 -0
  24. package/out/HomePageHeader.js +66 -0
  25. package/out/InputField.js +80 -0
  26. package/out/Markdown.js +126 -0
  27. package/out/Message.js +197 -0
  28. package/out/MessagesT.js +2 -0
  29. package/out/NewRecentMessagePage.js +525 -0
  30. package/out/NewRecentMessageTab.js +23 -0
  31. package/out/ReceivedMessage.js +211 -0
  32. package/out/RecentMessageDetail.js +178 -0
  33. package/out/RecentMessageList.js +112 -0
  34. package/out/RecentMessageListCard.js +20 -0
  35. package/out/RecentMessageListHeader.js +156 -0
  36. package/out/RecentMessagePage.js +183 -0
  37. package/out/RecentMessageTab.js +35 -0
  38. package/out/WidgetMessage.js +14 -0
  39. package/out/WidgetToggleButton.js +191 -0
  40. package/out/WidgetType.js +2 -0
  41. package/out/assets/icons/pikaicons-react.js +17475 -0
  42. package/out/components/ConsentForm.js +7 -0
  43. package/out/components/CustomTooltip.js +34 -0
  44. package/out/hooks/useChatHistoryExists.js +32 -0
  45. package/out/hooks/useChatHistoryListExist.js +81 -0
  46. package/out/hooks/useChatScroll.js +14 -0
  47. package/out/hooks/useCurrentConversationExists.js +88 -0
  48. package/out/hooks/useInitialMessage.js +33 -0
  49. package/out/hooks/useMessage.js +230 -0
  50. package/out/hooks/useMessageReceiver.js +183 -0
  51. package/out/hooks/usePopupAnimation.js +20 -0
  52. package/out/hooks/useSocket.js +19 -0
  53. package/out/hooks/useSocketContext.js +81 -0
  54. package/out/hooks/useWidgetDimension.js +41 -0
  55. package/out/hooks/useWidgetToggle.js +22 -0
  56. package/out/index.js +31 -0
  57. package/out/markdown/CodeCopy.js +22 -0
  58. package/out/markdown/CodeHighlight.js +58 -0
  59. package/out/markdown/PagerMarkdown.js +36 -0
  60. package/out/markdown/pager_md.js +152 -0
  61. package/out/onscreenNotificationPopup.js +23 -0
  62. package/out/socket.js +11 -0
  63. package/out/utils/checkConversationExit.js +24 -0
  64. package/out/utils/convertTime.js +43 -0
  65. package/out/utils/sendInitialMessage.js +82 -0
  66. package/out/widget.js +21 -0
  67. package/out/widgetConfigStore.js +205 -0
  68. package/out/widgetConfigStore2.js +569 -0
  69. package/out/widgetControlstore.js +23 -0
  70. package/out/widgetStateHandler.js +106 -0
  71. package/out/widgetStore.js +171 -0
  72. package/out/widgetUserStore.js +47 -0
  73. package/package.json +3 -3
  74. package/server.html +33 -39
  75. package/.husky/pre-commit +0 -4
  76. package/docs/issues/001-use-widget-resize-hook.md +0 -51
  77. package/docs/issues/002-embed-snippet-container-resize.md +0 -81
  78. package/docs/prd/0001-iframe-resize-scroll-through.md +0 -333
  79. package/test-iframe-resize.html +0 -74
@@ -0,0 +1,152 @@
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.parseUrlAndString = parseUrlAndString;
7
+ exports.evalNormalOrJoinText = evalNormalOrJoinText;
8
+ exports.default = PagerMd;
9
+ const jsx_runtime_1 = require("react/jsx-runtime");
10
+ /* eslint-disable @typescript-eslint/no-explicit-any */
11
+ const react_1 = __importDefault(require("react"));
12
+ const URL_REGEX = /https?:\/\/(?:www\.)?[a-zA-Z0-9@:%._+~#=-]{2,256}\.[a-z]{2,6}\b[-a-zA-Z0-9@:%_+.~#?&/=]*/;
13
+ // const URL_REGEX =
14
+ // /[(http(s)?):\/\/(www\.)?a-zA-Z0-9@:%._\+~#=-]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/
15
+ function parseUrlAndString(str) {
16
+ const results = [];
17
+ let remaining = str;
18
+ while (remaining) {
19
+ const match = remaining.match(URL_REGEX);
20
+ if (!match) {
21
+ results.push({ type: 'normal_str', value: remaining });
22
+ break;
23
+ }
24
+ if (match.index !== 0) {
25
+ results.push({
26
+ type: 'normal_str',
27
+ value: remaining.slice(0, match.index),
28
+ });
29
+ results.push({ type: 'url', value: match[0] });
30
+ remaining = remaining.slice(match.index + match[0].length);
31
+ continue;
32
+ }
33
+ results.push({ type: 'url', value: match[0] });
34
+ remaining = remaining.slice(match[0].length);
35
+ }
36
+ return results;
37
+ }
38
+ // const style = {
39
+ // fontFamily: "'Inter', 'Open Sans'",
40
+ // }
41
+ const DisplayWithSpace = ({ text }) => ((0, jsx_runtime_1.jsx)("span", { style: {
42
+ whiteSpace: 'pre-wrap',
43
+ fontSize: 'clamp(0.875rem, calc(0.625rem + 0.3125vw))',
44
+ // fontStyle: 'normal',
45
+ lineHeight: '20px',
46
+ // color: '#020618',
47
+ // ...style,
48
+ }, children: text }));
49
+ const DisplayLineBreaks = ({ text }) => {
50
+ const texts = text.split('\n');
51
+ const lastOne = texts[texts.length - 1];
52
+ const exceptLastOne = texts.slice(0, -1);
53
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [exceptLastOne.map((t, i) => ((0, jsx_runtime_1.jsxs)(react_1.default.Fragment, { children: [(0, jsx_runtime_1.jsx)(DisplayWithSpace, { text: t }), (0, jsx_runtime_1.jsx)("br", {})] }, i))), (0, jsx_runtime_1.jsx)(DisplayWithSpace, { text: lastOne })] }));
54
+ };
55
+ const DisplayURL = ({ text }) => {
56
+ const parsed = parseUrlAndString(text);
57
+ return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: parsed.map(({ type, value }, i) => type === 'url' ? ((0, jsx_runtime_1.jsx)("a", { href: value, target: "_blank", rel: "noreferrer", children: value }, i)) : ((0, jsx_runtime_1.jsx)(DisplayLineBreaks, { text: value }, i))) }));
58
+ };
59
+ function NormalTextMd({ mdText }) {
60
+ if (typeof mdText === 'string')
61
+ return (0, jsx_runtime_1.jsx)(DisplayURL, { text: mdText });
62
+ if (typeof mdText.value === 'string')
63
+ return (0, jsx_runtime_1.jsx)(DisplayURL, { text: mdText.value });
64
+ return (0, jsx_runtime_1.jsx)(PagerMd, { mdText: mdText.value });
65
+ }
66
+ function HyperLinkMd({ mdText }) {
67
+ if (typeof mdText !== 'object' || !mdText.href)
68
+ return null;
69
+ const value = mdText.link?.value ?? mdText.value ?? '';
70
+ return ((0, jsx_runtime_1.jsx)("a", { href: mdText.href, target: "_blank", rel: "noreferrer", className: "text-sm opacity-90 hover:opacity-100 underline cursor-pointer text-[#4B2FFF] hover:text-[#3517f7]", children: (0, jsx_runtime_1.jsx)(PagerMd, { mdText: value }) }));
71
+ }
72
+ // const normalWrapper =
73
+ // (TagName: keyof JSX.IntrinsicElements) =>
74
+ // ({ mdText }: { mdText: { value: MarkdownText } }) => (
75
+ // <TagName>
76
+ // <PagerMd mdText={mdText.value} />
77
+ // </TagName>
78
+ // )
79
+ const mdElementStyles = (tagName) => {
80
+ switch (tagName) {
81
+ case 'strong':
82
+ return '-mt-[1px] text-sm font-semibold';
83
+ case 'em':
84
+ return '-mt-[1px] text-sm italic';
85
+ case 'u':
86
+ return '-mt-[1px] text-sm underline';
87
+ case 's':
88
+ return '-mt-[1px] text-sm line-through';
89
+ default:
90
+ return '';
91
+ }
92
+ };
93
+ const normalWrapper = (Tag) => {
94
+ const Wrapped = ({ mdText }) => ((0, jsx_runtime_1.jsx)(Tag, { className: mdElementStyles(Tag), children: (0, jsx_runtime_1.jsx)(PagerMd, { mdText: mdText.value }) }));
95
+ Wrapped.displayName = `normalWrapper(${Tag})`;
96
+ return Wrapped; // <-- a proper React component now
97
+ };
98
+ const listWrapper = (Tag) => {
99
+ const Wrapped = ({ mdText }) => ((0, jsx_runtime_1.jsx)(Tag, { children: mdText.value.map((item, i) => ((0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsx)(PagerMd, { mdText: item }) }, i))) }));
100
+ Wrapped.displayName = `listWrapper(${Tag})`;
101
+ return Wrapped; // <- React component with a name
102
+ };
103
+ // const listWrapper =
104
+ // (TagName: keyof JSX.IntrinsicElements) =>
105
+ // ({ mdText }: { mdText: { value: MarkdownText[] } }) => (
106
+ // <TagName>
107
+ // {mdText.value.map((item, index) => (
108
+ // <li key={index}>
109
+ // <PagerMd mdText={item} />
110
+ // </li>
111
+ // ))}
112
+ // </TagName>
113
+ // )
114
+ function JoinMd({ mdText }) {
115
+ const normalText = joinAsNormalText(mdText.lhs, mdText.rhs);
116
+ return normalText ? ((0, jsx_runtime_1.jsx)(NormalTextMd, { mdText: normalText })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(PagerMd, { mdText: mdText.lhs }), (0, jsx_runtime_1.jsx)(PagerMd, { mdText: mdText.rhs })] }));
117
+ }
118
+ function joinAsNormalText(lhs, rhs) {
119
+ const left = evalNormalOrJoinText(lhs);
120
+ const right = evalNormalOrJoinText(rhs);
121
+ return left !== null && right !== null ? `${left}${right}` : null;
122
+ }
123
+ function evalNormalOrJoinText(mdText) {
124
+ if (typeof mdText === 'string')
125
+ return mdText;
126
+ if (mdText.markdown_text === 'normal_text')
127
+ return mdText.normal_text ?? null;
128
+ if (mdText.markdown_text === 'join') {
129
+ const lhs = mdText.join?.lhs ?? null;
130
+ const rhs = mdText.join?.rhs ?? null;
131
+ return lhs && rhs ? joinAsNormalText(lhs, rhs) : null;
132
+ }
133
+ return null;
134
+ }
135
+ const mdTypeRenderers = {
136
+ text: NormalTextMd,
137
+ bold: normalWrapper('strong'),
138
+ italic: normalWrapper('em'),
139
+ underline: normalWrapper('u'),
140
+ hyperlink: HyperLinkMd,
141
+ order_list: listWrapper('ol'),
142
+ unorder_list: listWrapper('ul'),
143
+ new_line: () => (0, jsx_runtime_1.jsx)("div", { className: "h-2.5 w-full" }),
144
+ join: JoinMd,
145
+ };
146
+ function PagerMd({ mdText }) {
147
+ console.log(mdText, 'here md text');
148
+ if (typeof mdText === 'string')
149
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: mdText });
150
+ const Renderer = mdTypeRenderers[mdText?.type];
151
+ return Renderer ? (0, jsx_runtime_1.jsx)(Renderer, { mdText: mdText }) : null;
152
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OnScreenNotificationPopup = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const widgetConfigStore2_1 = require("./widgetConfigStore2");
7
+ const pikaicons_react_1 = require("./assets/icons/pikaicons-react");
8
+ const OnScreenNotificationPopup = () => {
9
+ const widget = (0, widgetConfigStore2_1.useWidgetData)();
10
+ const { status } = widget;
11
+ const [closeNotification, setCloseNotification] = (0, react_1.useState)(false);
12
+ if (!(status !== 'NOT_STARTED' &&
13
+ status !== 'WIDGET_LOADING' &&
14
+ status !== 'INVALID_STATE')) {
15
+ return null;
16
+ }
17
+ const handleCloseNotification = () => {
18
+ setCloseNotification(true);
19
+ };
20
+ return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: widget?.data?.onscreen_notification &&
21
+ closeNotification == false && ((0, jsx_runtime_1.jsx)("div", { className: "flex flex-col items-start gap-2.5 px-5 py-0 relative self-stretch w-full", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-start gap-2 pl-3 pr-2.5 py-2.5 relative self-stretch w-full rounded-lg border border-solid border-zinc-200 bg-white", children: [(0, jsx_runtime_1.jsx)("div", { className: "inline-flex items-center gap-2.5 relative pt-px", children: (0, jsx_runtime_1.jsx)(pikaicons_react_1.PiInformationCircleStroke, { className: "w-3.5 h-3.5 text-slate-600" }) }), (0, jsx_runtime_1.jsx)("p", { className: "relative flex-1 mt-[-1.00px] font-regular text-[#1d293d] text-xs tracking-[0] leading-[18px]", children: widget?.data?.onscreen_notification }), (0, jsx_runtime_1.jsx)("button", { className: "inline-flex items-center gap-2.5 p-0 h-[18px] w-[18px] justify-center cursor-pointer hover:bg-slate-100 rounded-xl overflow-hidden", onClick: handleCloseNotification, children: (0, jsx_runtime_1.jsx)(pikaicons_react_1.PiMultipleCrossCancelDefaultStroke, { className: "h-4 w-4 cursor-pointer text-slate-600" }) })] }) })) }));
22
+ };
23
+ exports.OnScreenNotificationPopup = OnScreenNotificationPopup;
package/out/socket.js ADDED
@@ -0,0 +1,11 @@
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.createSocket = void 0;
7
+ const socket_io_client_1 = __importDefault(require("socket.io-client"));
8
+ const createSocket = (url, path) => {
9
+ return (0, socket_io_client_1.default)(url, { path });
10
+ };
11
+ exports.createSocket = createSocket;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ // import { useState } from "react"
3
+ // import { LocalEventStore, ExitEvent } from "../widgetStateHandler"
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ // export const checkIsConversationExited = () => {
6
+ // const [isExit, setIsExit] = useState<boolean>(false)
7
+ // try{
8
+ // const raw = localStorage.getItem('DUMMY')
9
+ // if(raw){
10
+ // const parsed:LocalEventStore = JSON.parse(raw)
11
+ // const exitEvent = parsed.events.find(
12
+ // (e): e is ExitEvent => e.type === 'SESSION_EXITED'
13
+ // )
14
+ // if(exitEvent){
15
+ // setIsExit(true)
16
+ // }
17
+ // else{
18
+ // setIsExit(false)
19
+ // }
20
+ // }
21
+ // }
22
+ // catch(error){
23
+ // }
24
+ // }
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatTimeAMPM = void 0;
4
+ const formatTimeAMPM = (dateInString) => {
5
+ console.log(dateInString, 'tatatat');
6
+ if (!dateInString) {
7
+ console.warn('No date string provided to formatTimeAMPM');
8
+ return '';
9
+ }
10
+ const date = new Date(dateInString);
11
+ if (isNaN(date.getTime())) {
12
+ console.warn(`Invalid date string: ${dateInString}`);
13
+ return '';
14
+ }
15
+ // Format time
16
+ let hours = date.getHours();
17
+ const minutes = date.getMinutes();
18
+ const ampm = hours >= 12 ? 'pm' : 'am';
19
+ hours = hours % 12 || 12;
20
+ const minutesInString = minutes < 10 ? '0' + minutes : minutes.toString();
21
+ const timeString = `${hours}:${minutesInString} ${ampm}`;
22
+ // Format date
23
+ const day = date.getDate();
24
+ const monthNames = [
25
+ 'Jan',
26
+ 'Feb',
27
+ 'Mar',
28
+ 'Apr',
29
+ 'May',
30
+ 'Jun',
31
+ 'Jul',
32
+ 'Aug',
33
+ 'Sep',
34
+ 'Oct',
35
+ 'Nov',
36
+ 'Dec',
37
+ ];
38
+ const month = monthNames[date.getMonth()];
39
+ const year = date.getFullYear();
40
+ const dateString = `${day} ${month} ${year}`;
41
+ return `${timeString} | ${dateString}`;
42
+ };
43
+ exports.formatTimeAMPM = formatTimeAMPM;
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendInitialMessage = void 0;
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ const uuid_1 = require("uuid");
6
+ const sendInitialMessage = ({ socket, widget_id, context, msg, setMessages, }) => {
7
+ // const{}=useM
8
+ const { SYS_FirstName, SYS_LastName, SYS_UserEmail } = context;
9
+ console.log(context, 'contextcontext');
10
+ const conversationId = (0, uuid_1.v4)();
11
+ const systemData = msg
12
+ ? {
13
+ conversationId: conversationId,
14
+ user: SYS_UserEmail
15
+ ? {
16
+ user_id: SYS_UserEmail || (0, uuid_1.v4)(),
17
+ firstName: SYS_FirstName,
18
+ lastName: SYS_LastName,
19
+ email: SYS_UserEmail,
20
+ }
21
+ : undefined,
22
+ }
23
+ : {
24
+ conversationId: conversationId,
25
+ user: SYS_UserEmail
26
+ ? {
27
+ user_id: SYS_UserEmail || (0, uuid_1.v4)(),
28
+ firstName: SYS_FirstName,
29
+ lastName: SYS_LastName,
30
+ email: SYS_UserEmail,
31
+ }
32
+ : undefined,
33
+ };
34
+ const sentMessage = {
35
+ type: 'sent',
36
+ message: {
37
+ input: {
38
+ type: 'text',
39
+ value: msg,
40
+ },
41
+ system: systemData,
42
+ },
43
+ time: new Date(),
44
+ };
45
+ console.log(systemData, 'systemData');
46
+ console.log('conversation id emit to greeet', conversationId);
47
+ socket.emit('greeting', {
48
+ widget_id,
49
+ context: {
50
+ input: {
51
+ type: 'text',
52
+ value: msg ? msg : '',
53
+ },
54
+ ...context,
55
+ system: systemData,
56
+ },
57
+ });
58
+ if (msg !== '') {
59
+ setMessages([sentMessage]);
60
+ }
61
+ const key = `CONVERSATION::${widget_id}`;
62
+ localStorage.setItem('CURRENT_CONVERSATION', conversationId);
63
+ const storedConversation = localStorage.getItem(key);
64
+ if (storedConversation) {
65
+ console.log('Conversation already exists:', storedConversation);
66
+ }
67
+ else {
68
+ console.log('No conversation found. Creating new one...');
69
+ // Only add event if message is not empty
70
+ const events = [];
71
+ if (msg.trim() !== '') {
72
+ events.push(sentMessage); // push only valid sent message
73
+ }
74
+ localStorage.setItem(key, JSON.stringify({
75
+ widget_id,
76
+ conversation_id: conversationId,
77
+ user_state: 'ALLOW_MESSAGE',
78
+ events,
79
+ }));
80
+ }
81
+ };
82
+ exports.sendInitialMessage = sendInitialMessage;
package/out/widget.js ADDED
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Widget = exports.MyContext = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const ChatWidget_1 = require("./ChatWidget");
7
+ const WidgetToggleButton_1 = require("./WidgetToggleButton");
8
+ const useWidgetToggle_1 = require("./hooks/useWidgetToggle");
9
+ const widgetConfigStore2_1 = require("./widgetConfigStore2");
10
+ exports.MyContext = (0, react_1.createContext)(null);
11
+ const Widget = (widgetConfig) => {
12
+ const widget = (0, widgetConfigStore2_1.useWidgetData)();
13
+ const widgetData = (0, widgetConfigStore2_1.widgetHasData)(widget) ? widget.data : null;
14
+ const [initialUserMessage, setInitialUserMessage] = (0, react_1.useState)(null);
15
+ if (widgetData?.openby_default === undefined) {
16
+ return null;
17
+ }
18
+ const [chatWindowStatus, toggleChatWindow] = (0, useWidgetToggle_1.useWidgetToggle)(widgetData?.openby_default);
19
+ return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsxs)("div", { className: "fixed bottom-0 right-4 flex flex-col items-end space-y-2", children: [(0, jsx_runtime_1.jsx)(exports.MyContext.Provider, { value: { initialUserMessage, setInitialUserMessage }, children: (0, jsx_runtime_1.jsx)(ChatWidget_1.ChatWidget, { widgetToggleState: chatWindowStatus, toggleWidget: toggleChatWindow, widgetConfig: widgetConfig }) }), (0, jsx_runtime_1.jsx)(WidgetToggleButton_1.WidgetToggleButton, { setUserInitialMessage: setInitialUserMessage, widgetToggleState: chatWindowStatus, toggleWidget: toggleChatWindow })] }) }));
20
+ };
21
+ exports.Widget = Widget;
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useWidgetInitializer = exports.useWidgetData = void 0;
4
+ const store_1 = require("@xstate/store");
5
+ const react_1 = require("@xstate/store/react");
6
+ const react_2 = require("react");
7
+ const widgetFetchStore = (0, store_1.createStore)({
8
+ context: {
9
+ widget: { status: 'not-started' },
10
+ // currentMachineState: 'WIDGET_NOT_LOADED' as States,
11
+ },
12
+ on: {
13
+ setWidgetError: (context, event) => {
14
+ if (context.widget.status === 'loading' ||
15
+ context.widget.status === 'success') {
16
+ return {
17
+ widget: {
18
+ status: 'error',
19
+ config: context.widget.config,
20
+ error: event.error,
21
+ },
22
+ };
23
+ }
24
+ return context;
25
+ },
26
+ setWidgetData: (context, event) => {
27
+ if (context.widget.status === 'loading' ||
28
+ context.widget.status === 'error') {
29
+ let consent;
30
+ const data = event.data;
31
+ if (data.user_consent === true) {
32
+ consent = {
33
+ type: 'CONSENT_NEEDED',
34
+ consent_display_data: data.consent_data,
35
+ };
36
+ }
37
+ else {
38
+ consent = {
39
+ type: 'NO_CONSENT_NEEDED',
40
+ };
41
+ }
42
+ // data.user_consent === true
43
+ // ? (consent = {
44
+ // type: 'CONSENT_NEEDED',
45
+ // consent_display_data: data.consent_data,
46
+ // })
47
+ // : (consent = {
48
+ // type: 'NO_CONSENT_NEEDED',
49
+ // })
50
+ return {
51
+ widget: {
52
+ status: 'success',
53
+ config: context.widget.config,
54
+ data: event.data,
55
+ consent,
56
+ },
57
+ };
58
+ }
59
+ return context;
60
+ },
61
+ setFetchConfig: (_, event, enqueueAction) => {
62
+ const widgetId = event.widget_id;
63
+ const endpoint = event.endpoint;
64
+ enqueueAction.effect(async () => {
65
+ const result = await fetchWidget(endpoint, widgetId);
66
+ if (result.status === 'error') {
67
+ widgetFetchStore.trigger.setWidgetError({
68
+ error: result.error,
69
+ });
70
+ return;
71
+ }
72
+ widgetFetchStore.trigger.setWidgetData({
73
+ data: result.data,
74
+ });
75
+ });
76
+ return {
77
+ widget: {
78
+ status: 'loading',
79
+ config: event,
80
+ },
81
+ };
82
+ },
83
+ },
84
+ });
85
+ const useWidgetData = () => (0, react_1.useSelector)(widgetFetchStore, (state) => {
86
+ if (state.context.widget.status === 'success') {
87
+ return state.context.widget.data;
88
+ }
89
+ return null;
90
+ });
91
+ exports.useWidgetData = useWidgetData;
92
+ const useWidgetInitializer = (config, debug = false) => {
93
+ (0, react_2.useEffect)(() => {
94
+ widgetFetchStore.trigger.setFetchConfig({
95
+ widget_id: config.widget_id,
96
+ endpoint: config.endpoint,
97
+ });
98
+ if (debug) {
99
+ widgetFetchStore.inspect((inspectionEvent) => {
100
+ console.log('INSPECTION:: ', inspectionEvent);
101
+ });
102
+ }
103
+ }, []);
104
+ };
105
+ exports.useWidgetInitializer = useWidgetInitializer;
106
+ const fetchWidget = async (endpoint, widgetId) => {
107
+ try {
108
+ const response = await fetch(`${endpoint}/public/${widgetId}`, {
109
+ credentials: 'include',
110
+ });
111
+ if (response.ok) {
112
+ const data = await response.json();
113
+ return {
114
+ status: 'success',
115
+ data,
116
+ };
117
+ }
118
+ else if (response.status === 404) {
119
+ return {
120
+ status: 'error',
121
+ error: 'Given widget does not exist',
122
+ };
123
+ }
124
+ else {
125
+ return {
126
+ status: 'error',
127
+ error: 'Something went wrong',
128
+ };
129
+ }
130
+ }
131
+ catch (_) {
132
+ console.error('Fetch error:', _);
133
+ return {
134
+ status: 'error',
135
+ error: 'Fetch error',
136
+ };
137
+ }
138
+ };
139
+ // #region old widget fetched Details
140
+ // export type WidgetDataT = unknown & { _tag: 'widgetdata' }
141
+ // export const useWidgetData = WidgetConfigStore.select((state) => state.widgetData)
142
+ // type FetchWidgetProps = {
143
+ // endpoint: string
144
+ // widget_id: string
145
+ // }
146
+ // export const widgetStore = createStore({
147
+ // context: {
148
+ // widget: null as WidgetDataT | null,
149
+ // loading: false,
150
+ // error: null as string | null,
151
+ // },
152
+ // on: {
153
+ // setWidget: (ctx, event: { data: WidgetDataT }) => ({
154
+ // ...ctx,
155
+ // widget: event.data,
156
+ // loading: false,
157
+ // error: null,
158
+ // }),
159
+ // setLoading: (ctx) => ({
160
+ // ...ctx,
161
+ // loading: true,
162
+ // error: null,
163
+ // }),
164
+ // setError: (ctx, event: { error: string }) => ({
165
+ // ...ctx,
166
+ // loading: false,
167
+ // error: event.error,
168
+ // }),
169
+ // },
170
+ // })
171
+ // export const useFetchWidget = ({ widget_id, endpoint }: FetchWidgetProps) => {
172
+ // // const [widget, setWidget] = useState()
173
+ // const widget = useSelector(widgetStore, (state) => state.context.widget)
174
+ // useEffect(() => {
175
+ // const fetchWidget = async () => {
176
+ // try {
177
+ // const response = await fetch(
178
+ // `${endpoint}/public/${widget_id}`,
179
+ // {
180
+ // credentials: 'include',
181
+ // }
182
+ // )
183
+ //
184
+ // if (response.ok) {
185
+ // const data = await response.json()
186
+ // // setWidget(data);
187
+ // widgetStore.trigger.setWidget({
188
+ // data,
189
+ // })
190
+ // } else if (response.status === 404) {
191
+ // console.error('Given widget does not exist')
192
+ // } else {
193
+ // console.error('Something went wrong', response)
194
+ // }
195
+ // } catch (error) {
196
+ // console.error('Fetch error:', error)
197
+ // }
198
+ // }
199
+ // fetchWidget()
200
+ // }, [])
201
+ //
202
+ // console.log('widget', widget)
203
+ // return { widget }
204
+ // }
205
+ // #endregion