@defra/flood-webchat 0.0.1-beta.17 → 0.0.1-beta.18
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/dist/client.js +222 -33
- package/dist/client.js.map +1 -1
- package/package.json +1 -1
- package/src/client/components/chat/chat.jsx +5 -3
- package/src/client/components/panel/panel-header.jsx +1 -0
- package/src/client/components/panel/panel.jsx +7 -2
- package/src/client/components/screens/settings.jsx +67 -0
- package/src/client/index.jsx +3 -3
- package/src/client/lib/message-notification.js +36 -0
- package/src/client/store/AppProvider.jsx +19 -2
- package/src/client/store/actions-map.js +15 -1
- package/src/client/store/constants.js +3 -0
- package/src/client/store/reducer.js +2 -4
package/dist/client.js
CHANGED
|
@@ -131,7 +131,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
131
131
|
|
|
132
132
|
|
|
133
133
|
function Chat({
|
|
134
|
-
onEndChat
|
|
134
|
+
onEndChat,
|
|
135
|
+
onSettings
|
|
135
136
|
}) {
|
|
136
137
|
const {
|
|
137
138
|
availability,
|
|
@@ -139,13 +140,14 @@ function Chat({
|
|
|
139
140
|
messages,
|
|
140
141
|
agent,
|
|
141
142
|
agentStatus,
|
|
142
|
-
isAgentTyping
|
|
143
|
+
isAgentTyping,
|
|
144
|
+
settings
|
|
143
145
|
} = (0,_store_useApp_js__WEBPACK_IMPORTED_MODULE_5__.useApp)();
|
|
144
146
|
const [userMessage, setUserMessage] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
|
|
145
147
|
const messageRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();
|
|
146
148
|
(0,_hooks_useTextareaAutosize_js__WEBPACK_IMPORTED_MODULE_6__.useTextareaAutosize)(messageRef.current, userMessage);
|
|
147
149
|
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
|
|
148
|
-
if (messages.length !== 0) {
|
|
150
|
+
if (settings.scroll && messages.length !== 0) {
|
|
149
151
|
const chatBody = document.querySelector('.wc-body');
|
|
150
152
|
chatBody.scrollTop = chatBody.scrollHeight;
|
|
151
153
|
}
|
|
@@ -271,8 +273,10 @@ function Chat({
|
|
|
271
273
|
className: "wc-footer__settings"
|
|
272
274
|
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
|
|
273
275
|
href: "#",
|
|
276
|
+
id: "wc-settings",
|
|
274
277
|
className: "wc-footer__settings-link",
|
|
275
|
-
"data-module": "govuk-button"
|
|
278
|
+
"data-module": "govuk-button",
|
|
279
|
+
onClick: onSettings
|
|
276
280
|
}, "Settings"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
|
|
277
281
|
href: "#",
|
|
278
282
|
id: "transcript-download",
|
|
@@ -415,6 +419,7 @@ function PanelHeader() {
|
|
|
415
419
|
const onClose = e => {
|
|
416
420
|
e.preventDefault();
|
|
417
421
|
setChatVisibility(false);
|
|
422
|
+
thread.lastMessageSeen();
|
|
418
423
|
setUnseenCount(0);
|
|
419
424
|
};
|
|
420
425
|
let ButtonComponent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
|
|
@@ -476,9 +481,11 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
476
481
|
/* harmony import */ var _chat_chat_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../chat/chat.jsx */ "./src/client/components/chat/chat.jsx");
|
|
477
482
|
/* harmony import */ var _screens_unavailable_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../screens/unavailable.jsx */ "./src/client/components/screens/unavailable.jsx");
|
|
478
483
|
/* harmony import */ var _screens_end_chat_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../screens/end-chat.jsx */ "./src/client/components/screens/end-chat.jsx");
|
|
479
|
-
/* harmony import */ var
|
|
480
|
-
/* harmony import */ var
|
|
481
|
-
/* harmony import */ var
|
|
484
|
+
/* harmony import */ var _screens_settings_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../screens/settings.jsx */ "./src/client/components/screens/settings.jsx");
|
|
485
|
+
/* harmony import */ var _store_useApp_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../store/useApp.js */ "./src/client/store/useApp.js");
|
|
486
|
+
/* harmony import */ var _store_useChatSdk_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../store/useChatSdk.js */ "./src/client/store/useChatSdk.js");
|
|
487
|
+
/* harmony import */ var _hooks_useFocusedElements_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../hooks/useFocusedElements.js */ "./src/client/hooks/useFocusedElements.js");
|
|
488
|
+
|
|
482
489
|
|
|
483
490
|
|
|
484
491
|
|
|
@@ -500,13 +507,13 @@ function Panel() {
|
|
|
500
507
|
setChatVisibility,
|
|
501
508
|
setMessages,
|
|
502
509
|
setUnseenCount
|
|
503
|
-
} = (0,
|
|
510
|
+
} = (0,_store_useApp_js__WEBPACK_IMPORTED_MODULE_8__.useApp)();
|
|
504
511
|
const {
|
|
505
512
|
fetchThread,
|
|
506
513
|
fetchMessages
|
|
507
|
-
} = (0,
|
|
514
|
+
} = (0,_store_useChatSdk_js__WEBPACK_IMPORTED_MODULE_9__.useChatSdk)(sdk);
|
|
508
515
|
const [screen, setScreen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(threadId ? 2 : 0);
|
|
509
|
-
(0,
|
|
516
|
+
(0,_hooks_useFocusedElements_js__WEBPACK_IMPORTED_MODULE_10__.useFocusedElements)(screen);
|
|
510
517
|
|
|
511
518
|
/**
|
|
512
519
|
* Initializes the eventListener for pressing the escape key
|
|
@@ -558,6 +565,7 @@ function Panel() {
|
|
|
558
565
|
const onBack = handleScreenChange(screen - 1);
|
|
559
566
|
const onEndChat = handleScreenChange(3);
|
|
560
567
|
const onResume = handleScreenChange(2);
|
|
568
|
+
const onSettings = handleScreenChange(5);
|
|
561
569
|
const onEndChatConfirm = e => {
|
|
562
570
|
e.preventDefault();
|
|
563
571
|
console.log('confirmed end chat');
|
|
@@ -576,7 +584,7 @@ function Panel() {
|
|
|
576
584
|
break;
|
|
577
585
|
case 2:
|
|
578
586
|
ScreenComponent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_chat_chat_jsx__WEBPACK_IMPORTED_MODULE_4__.Chat, {
|
|
579
|
-
|
|
587
|
+
onSettings: onSettings,
|
|
580
588
|
onEndChat: onEndChat
|
|
581
589
|
});
|
|
582
590
|
break;
|
|
@@ -586,6 +594,11 @@ function Panel() {
|
|
|
586
594
|
onEndChatConfirm: onEndChatConfirm
|
|
587
595
|
});
|
|
588
596
|
break;
|
|
597
|
+
case 5:
|
|
598
|
+
ScreenComponent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_screens_settings_jsx__WEBPACK_IMPORTED_MODULE_7__.Settings, {
|
|
599
|
+
onCancel: onResume
|
|
600
|
+
});
|
|
601
|
+
break;
|
|
589
602
|
default:
|
|
590
603
|
ScreenComponent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_screens_pre_chat_jsx__WEBPACK_IMPORTED_MODULE_2__.PreChat, {
|
|
591
604
|
onForward: onForward
|
|
@@ -596,8 +609,8 @@ function Panel() {
|
|
|
596
609
|
}
|
|
597
610
|
const Component = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
|
|
598
611
|
id: "wc-panel",
|
|
599
|
-
className: "wc-panel",
|
|
600
612
|
role: "dialog",
|
|
613
|
+
className: "wc-panel",
|
|
601
614
|
tabIndex: "-1",
|
|
602
615
|
"aria-modal": "true",
|
|
603
616
|
"aria-labelledby": "wc-header-title"
|
|
@@ -862,6 +875,97 @@ function RequestChat({
|
|
|
862
875
|
|
|
863
876
|
/***/ }),
|
|
864
877
|
|
|
878
|
+
/***/ "./src/client/components/screens/settings.jsx":
|
|
879
|
+
/*!****************************************************!*\
|
|
880
|
+
!*** ./src/client/components/screens/settings.jsx ***!
|
|
881
|
+
\****************************************************/
|
|
882
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
883
|
+
|
|
884
|
+
__webpack_require__.r(__webpack_exports__);
|
|
885
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
886
|
+
/* harmony export */ Settings: () => (/* binding */ Settings)
|
|
887
|
+
/* harmony export */ });
|
|
888
|
+
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
|
|
889
|
+
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
|
890
|
+
/* harmony import */ var _panel_panel_header_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../panel/panel-header.jsx */ "./src/client/components/panel/panel-header.jsx");
|
|
891
|
+
/* harmony import */ var _store_useApp_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store/useApp.js */ "./src/client/store/useApp.js");
|
|
892
|
+
|
|
893
|
+
|
|
894
|
+
|
|
895
|
+
function Settings({
|
|
896
|
+
onCancel
|
|
897
|
+
}) {
|
|
898
|
+
const {
|
|
899
|
+
settings,
|
|
900
|
+
setSettings
|
|
901
|
+
} = (0,_store_useApp_js__WEBPACK_IMPORTED_MODULE_2__.useApp)();
|
|
902
|
+
const [optionAudio, setOptionAudio] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(settings.audio);
|
|
903
|
+
const [optionScroll, setOptionScroll] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(settings.scroll);
|
|
904
|
+
const onSave = e => {
|
|
905
|
+
e.preventDefault();
|
|
906
|
+
setSettings({
|
|
907
|
+
audio: optionAudio,
|
|
908
|
+
scroll: optionScroll
|
|
909
|
+
});
|
|
910
|
+
onCancel(e);
|
|
911
|
+
};
|
|
912
|
+
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_panel_panel_header_jsx__WEBPACK_IMPORTED_MODULE_1__.PanelHeader, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
|
|
913
|
+
className: "wc-body"
|
|
914
|
+
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("fieldset", {
|
|
915
|
+
className: "govuk-fieldset govuk-!-margin-bottom-4"
|
|
916
|
+
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("legend", {
|
|
917
|
+
className: "govuk-fieldset__legend govuk-fieldset__legend"
|
|
918
|
+
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h3", {
|
|
919
|
+
id: "wc-subtitle",
|
|
920
|
+
className: "govuk-heading-s"
|
|
921
|
+
}, "Change settings")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
|
|
922
|
+
className: "govuk-checkboxes govuk-checkboxes--small",
|
|
923
|
+
"data-module": "govuk-checkboxes"
|
|
924
|
+
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
|
|
925
|
+
className: "govuk-checkboxes__item"
|
|
926
|
+
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
|
|
927
|
+
id: "audio",
|
|
928
|
+
name: "audio",
|
|
929
|
+
type: "checkbox",
|
|
930
|
+
value: "audio",
|
|
931
|
+
className: "govuk-checkboxes__input",
|
|
932
|
+
defaultChecked: optionAudio,
|
|
933
|
+
onChange: () => setOptionAudio(!optionAudio)
|
|
934
|
+
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
|
|
935
|
+
className: "govuk-label govuk-checkboxes__label govuk-!-font-size-16",
|
|
936
|
+
htmlFor: "audio"
|
|
937
|
+
}, "Play a sound when receiving a new message")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
|
|
938
|
+
className: "govuk-checkboxes__item"
|
|
939
|
+
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
|
|
940
|
+
id: "scroll",
|
|
941
|
+
name: "scroll",
|
|
942
|
+
type: "checkbox",
|
|
943
|
+
value: "scroll",
|
|
944
|
+
className: "govuk-checkboxes__input",
|
|
945
|
+
defaultChecked: optionScroll,
|
|
946
|
+
onChange: () => setOptionScroll(!optionScroll)
|
|
947
|
+
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
|
|
948
|
+
className: "govuk-label govuk-checkboxes__label govuk-!-font-size-16",
|
|
949
|
+
htmlFor: "scroll"
|
|
950
|
+
}, "Scroll automatically to a new message")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
|
|
951
|
+
className: "govuk-button-group"
|
|
952
|
+
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
|
|
953
|
+
id: "settings-save",
|
|
954
|
+
href: "#",
|
|
955
|
+
className: "govuk-button govuk-!-font-size-16",
|
|
956
|
+
"data-module": "govuk-button",
|
|
957
|
+
onClick: onSave
|
|
958
|
+
}, "Save"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
|
|
959
|
+
id: "settings-cancel",
|
|
960
|
+
href: "#",
|
|
961
|
+
className: "govuk-link govuk-!-font-size-16",
|
|
962
|
+
"data-module": "govuk-button",
|
|
963
|
+
onClick: onCancel
|
|
964
|
+
}, "Cancel"))));
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
/***/ }),
|
|
968
|
+
|
|
865
969
|
/***/ "./src/client/components/screens/unavailable.jsx":
|
|
866
970
|
/*!*******************************************************!*\
|
|
867
971
|
!*** ./src/client/components/screens/unavailable.jsx ***!
|
|
@@ -1023,6 +1127,44 @@ const classnames = (...classes) => classes.filter(classname => classname && type
|
|
|
1023
1127
|
|
|
1024
1128
|
/***/ }),
|
|
1025
1129
|
|
|
1130
|
+
/***/ "./src/client/lib/message-notification.js":
|
|
1131
|
+
/*!************************************************!*\
|
|
1132
|
+
!*** ./src/client/lib/message-notification.js ***!
|
|
1133
|
+
\************************************************/
|
|
1134
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1135
|
+
|
|
1136
|
+
__webpack_require__.r(__webpack_exports__);
|
|
1137
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1138
|
+
/* harmony export */ messageNotification: () => (/* binding */ messageNotification)
|
|
1139
|
+
/* harmony export */ });
|
|
1140
|
+
const messageNotification = audioUrl => {
|
|
1141
|
+
let buffer;
|
|
1142
|
+
const context = new (window.AudioContext || window.webkitAudioContext)();
|
|
1143
|
+
if (context.state === 'suspended') {
|
|
1144
|
+
const events = ['touchstart', 'touchend', 'mousedown', 'wheel', 'keydown', 'click'];
|
|
1145
|
+
const unlock = _e => {
|
|
1146
|
+
events.forEach(event => {
|
|
1147
|
+
document.body.removeEventListener(event, unlock);
|
|
1148
|
+
});
|
|
1149
|
+
context.resume();
|
|
1150
|
+
};
|
|
1151
|
+
events.forEach(event => {
|
|
1152
|
+
document.body.addEventListener(event, unlock, false);
|
|
1153
|
+
});
|
|
1154
|
+
}
|
|
1155
|
+
fetch(audioUrl).then(response => response.arrayBuffer()).then(data => context.decodeAudioData(data)).then(decodedData => {
|
|
1156
|
+
buffer = decodedData;
|
|
1157
|
+
}).catch(console.error);
|
|
1158
|
+
return () => {
|
|
1159
|
+
const source = context.createBufferSource();
|
|
1160
|
+
source.buffer = buffer;
|
|
1161
|
+
source.connect(context.destination);
|
|
1162
|
+
source.start();
|
|
1163
|
+
};
|
|
1164
|
+
};
|
|
1165
|
+
|
|
1166
|
+
/***/ }),
|
|
1167
|
+
|
|
1026
1168
|
/***/ "./src/client/lib/transform-messages.js":
|
|
1027
1169
|
/*!**********************************************!*\
|
|
1028
1170
|
!*** ./src/client/lib/transform-messages.js ***!
|
|
@@ -1092,17 +1234,23 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
1092
1234
|
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
|
|
1093
1235
|
/* harmony import */ var _nice_devone_nice_cxone_chat_web_sdk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @nice-devone/nice-cxone-chat-web-sdk */ "@nice-devone/nice-cxone-chat-web-sdk");
|
|
1094
1236
|
/* harmony import */ var _nice_devone_nice_cxone_chat_web_sdk__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_nice_devone_nice_cxone_chat_web_sdk__WEBPACK_IMPORTED_MODULE_1__);
|
|
1095
|
-
/* harmony import */ var
|
|
1237
|
+
/* harmony import */ var _lib_message_notification_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../lib/message-notification.js */ "./src/client/lib/message-notification.js");
|
|
1238
|
+
/* harmony import */ var _reducer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./reducer.js */ "./src/client/store/reducer.js");
|
|
1239
|
+
/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./constants.js */ "./src/client/store/constants.js");
|
|
1096
1240
|
|
|
1097
1241
|
|
|
1098
1242
|
|
|
1099
|
-
|
|
1243
|
+
|
|
1244
|
+
|
|
1245
|
+
const AppContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(_reducer_js__WEBPACK_IMPORTED_MODULE_3__.initialState);
|
|
1100
1246
|
const AppProvider = ({
|
|
1101
1247
|
sdk,
|
|
1102
1248
|
availability,
|
|
1249
|
+
options,
|
|
1103
1250
|
children
|
|
1104
1251
|
}) => {
|
|
1105
|
-
const [state, dispatch] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(
|
|
1252
|
+
const [state, dispatch] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_reducer_js__WEBPACK_IMPORTED_MODULE_3__.reducer, _reducer_js__WEBPACK_IMPORTED_MODULE_3__.initialState);
|
|
1253
|
+
const playSound = (0,_lib_message_notification_js__WEBPACK_IMPORTED_MODULE_2__.messageNotification)(options.audioUrl);
|
|
1106
1254
|
|
|
1107
1255
|
/**
|
|
1108
1256
|
* SDK event handlers
|
|
@@ -1156,6 +1304,10 @@ const AppProvider = ({
|
|
|
1156
1304
|
type: 'SET_UNSEEN_COUNT',
|
|
1157
1305
|
payload: e.detail.data.case.customerStatistics.unseenMessagesCount
|
|
1158
1306
|
});
|
|
1307
|
+
const isAudioOn = JSON.parse(window.localStorage.getItem(_constants_js__WEBPACK_IMPORTED_MODULE_4__.SETTINGS_STORAGE_KEY)).audio;
|
|
1308
|
+
if (isAudioOn && e.detail.data.message.direction === 'outbound') {
|
|
1309
|
+
playSound();
|
|
1310
|
+
}
|
|
1159
1311
|
};
|
|
1160
1312
|
const onContactStatusChanged = e => {
|
|
1161
1313
|
dispatch({
|
|
@@ -1180,8 +1332,9 @@ const AppProvider = ({
|
|
|
1180
1332
|
type: 'SET_AVAILABILITY',
|
|
1181
1333
|
payload: availability
|
|
1182
1334
|
});
|
|
1183
|
-
setCustomerId(window.localStorage.getItem(
|
|
1184
|
-
setThreadId(window.localStorage.getItem(
|
|
1335
|
+
setCustomerId(window.localStorage.getItem(_constants_js__WEBPACK_IMPORTED_MODULE_4__.CUSTOMER_ID_STORAGE_KEY));
|
|
1336
|
+
setThreadId(window.localStorage.getItem(_constants_js__WEBPACK_IMPORTED_MODULE_4__.THREAD_ID_STORAGE_KEY));
|
|
1337
|
+
setSettings(JSON.parse(window.localStorage.getItem(_constants_js__WEBPACK_IMPORTED_MODULE_4__.SETTINGS_STORAGE_KEY)) || state.settings);
|
|
1185
1338
|
if (window.location.hash === '#webchat') {
|
|
1186
1339
|
setChatVisibility(true);
|
|
1187
1340
|
}
|
|
@@ -1223,6 +1376,12 @@ const AppProvider = ({
|
|
|
1223
1376
|
payload: messages
|
|
1224
1377
|
});
|
|
1225
1378
|
};
|
|
1379
|
+
const setSettings = data => {
|
|
1380
|
+
dispatch({
|
|
1381
|
+
type: 'SET_SETTINGS',
|
|
1382
|
+
payload: data
|
|
1383
|
+
});
|
|
1384
|
+
};
|
|
1226
1385
|
const setUnseenCount = unseenCount => {
|
|
1227
1386
|
dispatch({
|
|
1228
1387
|
type: 'SET_UNSEEN_COUNT',
|
|
@@ -1236,6 +1395,7 @@ const AppProvider = ({
|
|
|
1236
1395
|
const store = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => ({
|
|
1237
1396
|
...state,
|
|
1238
1397
|
sdk,
|
|
1398
|
+
setSettings,
|
|
1239
1399
|
setCustomerId,
|
|
1240
1400
|
setThreadId,
|
|
1241
1401
|
setThread,
|
|
@@ -1267,14 +1427,25 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
1267
1427
|
/* harmony export */ actionsMap: () => (/* binding */ actionsMap)
|
|
1268
1428
|
/* harmony export */ });
|
|
1269
1429
|
/* harmony import */ var _lib_transform_messages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib/transform-messages */ "./src/client/lib/transform-messages.js");
|
|
1270
|
-
/* harmony import */ var
|
|
1430
|
+
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ "./src/client/store/constants.js");
|
|
1271
1431
|
|
|
1272
1432
|
|
|
1433
|
+
const setSettings = (state, payload) => {
|
|
1434
|
+
if (payload) {
|
|
1435
|
+
window.localStorage.setItem(_constants__WEBPACK_IMPORTED_MODULE_1__.SETTINGS_STORAGE_KEY, JSON.stringify(payload));
|
|
1436
|
+
} else {
|
|
1437
|
+
window.localStorage.removeItem(_constants__WEBPACK_IMPORTED_MODULE_1__.SETTINGS_STORAGE_KEY);
|
|
1438
|
+
}
|
|
1439
|
+
return {
|
|
1440
|
+
...state,
|
|
1441
|
+
settings: payload
|
|
1442
|
+
};
|
|
1443
|
+
};
|
|
1273
1444
|
const setCustomerId = (state, payload) => {
|
|
1274
1445
|
if (payload) {
|
|
1275
|
-
window.localStorage.setItem(
|
|
1446
|
+
window.localStorage.setItem(_constants__WEBPACK_IMPORTED_MODULE_1__.CUSTOMER_ID_STORAGE_KEY, payload);
|
|
1276
1447
|
} else {
|
|
1277
|
-
window.localStorage.removeItem(
|
|
1448
|
+
window.localStorage.removeItem(_constants__WEBPACK_IMPORTED_MODULE_1__.CUSTOMER_ID_STORAGE_KEY);
|
|
1278
1449
|
}
|
|
1279
1450
|
return {
|
|
1280
1451
|
...state,
|
|
@@ -1283,9 +1454,9 @@ const setCustomerId = (state, payload) => {
|
|
|
1283
1454
|
};
|
|
1284
1455
|
const setThreadId = (state, payload) => {
|
|
1285
1456
|
if (payload) {
|
|
1286
|
-
window.localStorage.setItem(
|
|
1457
|
+
window.localStorage.setItem(_constants__WEBPACK_IMPORTED_MODULE_1__.THREAD_ID_STORAGE_KEY, payload);
|
|
1287
1458
|
} else {
|
|
1288
|
-
window.localStorage.removeItem(
|
|
1459
|
+
window.localStorage.removeItem(_constants__WEBPACK_IMPORTED_MODULE_1__.THREAD_ID_STORAGE_KEY);
|
|
1289
1460
|
}
|
|
1290
1461
|
return {
|
|
1291
1462
|
...state,
|
|
@@ -1349,6 +1520,7 @@ const setUnseenCount = (state, payload) => {
|
|
|
1349
1520
|
const actionsMap = {
|
|
1350
1521
|
SET_CHAT_VISIBILITY: setChatVisibility,
|
|
1351
1522
|
SET_AVAILABILITY: setAvailability,
|
|
1523
|
+
SET_SETTINGS: setSettings,
|
|
1352
1524
|
SET_CUSTOMER_ID: setCustomerId,
|
|
1353
1525
|
SET_THREAD_ID: setThreadId,
|
|
1354
1526
|
SET_THREAD: setThread,
|
|
@@ -1362,6 +1534,24 @@ const actionsMap = {
|
|
|
1362
1534
|
|
|
1363
1535
|
/***/ }),
|
|
1364
1536
|
|
|
1537
|
+
/***/ "./src/client/store/constants.js":
|
|
1538
|
+
/*!***************************************!*\
|
|
1539
|
+
!*** ./src/client/store/constants.js ***!
|
|
1540
|
+
\***************************************/
|
|
1541
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1542
|
+
|
|
1543
|
+
__webpack_require__.r(__webpack_exports__);
|
|
1544
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1545
|
+
/* harmony export */ CUSTOMER_ID_STORAGE_KEY: () => (/* binding */ CUSTOMER_ID_STORAGE_KEY),
|
|
1546
|
+
/* harmony export */ SETTINGS_STORAGE_KEY: () => (/* binding */ SETTINGS_STORAGE_KEY),
|
|
1547
|
+
/* harmony export */ THREAD_ID_STORAGE_KEY: () => (/* binding */ THREAD_ID_STORAGE_KEY)
|
|
1548
|
+
/* harmony export */ });
|
|
1549
|
+
const SETTINGS_STORAGE_KEY = 'webchat_settings';
|
|
1550
|
+
const CUSTOMER_ID_STORAGE_KEY = 'webchat_customer_id';
|
|
1551
|
+
const THREAD_ID_STORAGE_KEY = 'webchat_thread_id';
|
|
1552
|
+
|
|
1553
|
+
/***/ }),
|
|
1554
|
+
|
|
1365
1555
|
/***/ "./src/client/store/reducer.js":
|
|
1366
1556
|
/*!*************************************!*\
|
|
1367
1557
|
!*** ./src/client/store/reducer.js ***!
|
|
@@ -1370,15 +1560,11 @@ const actionsMap = {
|
|
|
1370
1560
|
|
|
1371
1561
|
__webpack_require__.r(__webpack_exports__);
|
|
1372
1562
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1373
|
-
/* harmony export */ CUSTOMER_ID_STORAGE_KEY: () => (/* binding */ CUSTOMER_ID_STORAGE_KEY),
|
|
1374
|
-
/* harmony export */ THREAD_ID_STORAGE_KEY: () => (/* binding */ THREAD_ID_STORAGE_KEY),
|
|
1375
1563
|
/* harmony export */ initialState: () => (/* binding */ initialState),
|
|
1376
1564
|
/* harmony export */ reducer: () => (/* binding */ reducer)
|
|
1377
1565
|
/* harmony export */ });
|
|
1378
1566
|
/* harmony import */ var _actions_map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actions-map */ "./src/client/store/actions-map.js");
|
|
1379
1567
|
|
|
1380
|
-
const CUSTOMER_ID_STORAGE_KEY = 'webchat_customer_id';
|
|
1381
|
-
const THREAD_ID_STORAGE_KEY = 'webchat_thread_id';
|
|
1382
1568
|
const initialState = {
|
|
1383
1569
|
availability: null,
|
|
1384
1570
|
customerId: null,
|
|
@@ -1389,7 +1575,11 @@ const initialState = {
|
|
|
1389
1575
|
agent: null,
|
|
1390
1576
|
agentStatus: null,
|
|
1391
1577
|
isAgentTyping: false,
|
|
1392
|
-
isChatOpen: false
|
|
1578
|
+
isChatOpen: false,
|
|
1579
|
+
settings: {
|
|
1580
|
+
audio: true,
|
|
1581
|
+
scroll: true
|
|
1582
|
+
}
|
|
1393
1583
|
};
|
|
1394
1584
|
const reducer = (state, action) => {
|
|
1395
1585
|
const {
|
|
@@ -1628,7 +1818,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
1628
1818
|
/* harmony import */ var _components_availability_availability_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/availability/availability.jsx */ "./src/client/components/availability/availability.jsx");
|
|
1629
1819
|
/* harmony import */ var _lib_check_availability__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/check-availability */ "./src/client/lib/check-availability.js");
|
|
1630
1820
|
/* harmony import */ var _store_AppProvider_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./store/AppProvider.jsx */ "./src/client/store/AppProvider.jsx");
|
|
1631
|
-
/* harmony import */ var
|
|
1821
|
+
/* harmony import */ var _store_constants_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./store/constants.js */ "./src/client/store/constants.js");
|
|
1632
1822
|
|
|
1633
1823
|
|
|
1634
1824
|
|
|
@@ -1640,7 +1830,7 @@ async function init(container, options) {
|
|
|
1640
1830
|
const sdk = new _nice_devone_nice_cxone_chat_web_sdk__WEBPACK_IMPORTED_MODULE_2__.ChatSdk({
|
|
1641
1831
|
brandId: options.brandId,
|
|
1642
1832
|
channelId: options.channelId,
|
|
1643
|
-
customerId: window.localStorage.getItem(
|
|
1833
|
+
customerId: window.localStorage.getItem(_store_constants_js__WEBPACK_IMPORTED_MODULE_6__.CUSTOMER_ID_STORAGE_KEY) || '',
|
|
1644
1834
|
environment: options.environment
|
|
1645
1835
|
});
|
|
1646
1836
|
const root = (0,react_dom_client__WEBPACK_IMPORTED_MODULE_1__.createRoot)(container);
|
|
@@ -1653,10 +1843,9 @@ async function init(container, options) {
|
|
|
1653
1843
|
}
|
|
1654
1844
|
root.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_store_AppProvider_jsx__WEBPACK_IMPORTED_MODULE_5__.AppProvider, {
|
|
1655
1845
|
sdk: sdk,
|
|
1656
|
-
availability: availability
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
})));
|
|
1846
|
+
availability: availability,
|
|
1847
|
+
options: options
|
|
1848
|
+
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_availability_availability_jsx__WEBPACK_IMPORTED_MODULE_3__.Availability, null)));
|
|
1660
1849
|
}
|
|
1661
1850
|
})();
|
|
1662
1851
|
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","mappings":"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","sources":["webpack://@defra/flood-webchat/./src/client/components/availability/availability.jsx","webpack://@defra/flood-webchat/./src/client/components/chat/chat.jsx","webpack://@defra/flood-webchat/./src/client/components/errorSummary/error-summary.jsx","webpack://@defra/flood-webchat/./src/client/components/message/message.jsx","webpack://@defra/flood-webchat/./src/client/components/panel/panel-footer.jsx","webpack://@defra/flood-webchat/./src/client/components/panel/panel-header.jsx","webpack://@defra/flood-webchat/./src/client/components/panel/panel.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/end-chat.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/pre-chat.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/request-chat.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/unavailable.jsx","webpack://@defra/flood-webchat/./src/client/hooks/useFocusedElements.js","webpack://@defra/flood-webchat/./src/client/hooks/useTextareaAutosize.js","webpack://@defra/flood-webchat/./src/client/lib/check-availability.js","webpack://@defra/flood-webchat/./src/client/lib/classnames.js","webpack://@defra/flood-webchat/./src/client/lib/transform-messages.js","webpack://@defra/flood-webchat/./src/client/store/AppProvider.jsx","webpack://@defra/flood-webchat/./src/client/store/actions-map.js","webpack://@defra/flood-webchat/./src/client/store/reducer.js","webpack://@defra/flood-webchat/./src/client/store/useApp.js","webpack://@defra/flood-webchat/./src/client/store/useChatSdk.js","webpack://@defra/flood-webchat/external commonjs \"@nice-devone/nice-cxone-chat-web-sdk\"","webpack://@defra/flood-webchat/external commonjs \"luxon\"","webpack://@defra/flood-webchat/external commonjs \"react\"","webpack://@defra/flood-webchat/external commonjs \"react-dom\"","webpack://@defra/flood-webchat/external commonjs \"react-dom/client\"","webpack://@defra/flood-webchat/external commonjs \"sanitize-html\"","webpack://@defra/flood-webchat/external commonjs \"uuid\"","webpack://@defra/flood-webchat/webpack/bootstrap","webpack://@defra/flood-webchat/webpack/runtime/compat get default export","webpack://@defra/flood-webchat/webpack/runtime/define property getters","webpack://@defra/flood-webchat/webpack/runtime/hasOwnProperty shorthand","webpack://@defra/flood-webchat/webpack/runtime/make namespace object","webpack://@defra/flood-webchat/./src/client/index.jsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react'\n\nimport { classnames } from '../../lib/classnames'\nimport { Panel } from '../panel/panel.jsx'\nimport { useApp } from '../../store/useApp'\n\nexport function Availability () {\n const { availability, messages, isChatOpen, setChatVisibility, unseenCount } = useApp()\n\n const [isFixed, setIsFixed] = useState(false)\n const buttonRef = useRef()\n\n const onClick = () => {\n setChatVisibility(!isChatOpen)\n }\n\n const onKeyDown = event => {\n if (event.key === ' ') {\n event.preventDefault()\n }\n }\n\n const onKeyUp = event => {\n if (event.key === ' ') {\n setChatVisibility(!isChatOpen)\n }\n }\n\n const intersectionCallback = entries => {\n const [entry] = entries\n const isBelowFold = !entry.isIntersecting && entry.boundingClientRect.top > 0\n setIsFixed(!isChatOpen && isBelowFold)\n }\n\n useEffect(() => {\n const observer = new window.IntersectionObserver(intersectionCallback, {\n rootMargin: '35px'\n })\n\n const parentElement = buttonRef.current?.parentElement\n\n if (parentElement) {\n observer.observe(parentElement)\n }\n\n return () => {\n if (parentElement) {\n observer.unobserve(parentElement)\n }\n }\n }, [buttonRef, isChatOpen])\n\n useEffect(() => {\n document.documentElement.classList.toggle('wc-scroll-padding', isFixed)\n document.body.classList.toggle('wc-scroll-padding', isFixed)\n }, [isFixed])\n\n let TextComponent = (<>Show Chat</>)\n\n if (!messages.length) {\n TextComponent = (<>Start Chat</>)\n }\n\n switch (availability) {\n case 'AVAILABLE':\n return (\n <>\n <div\n className={classnames('wc-availability', isFixed && 'wc-availability--fixed', isChatOpen && 'wc-open')}\n ref={buttonRef}\n >\n <div className='wc-availability__inner'>\n <a\n className='wc-availability__link'\n href='#webchat'\n draggable='false'\n onClick={onClick}\n onKeyUp={onKeyUp}\n onKeyDown={onKeyDown}\n >\n {TextComponent}\n {unseenCount > 0 && !isChatOpen ? <span className='wc-open-btn__unseen'>{unseenCount}</span> : null}\n </a>\n </div>\n </div>\n {isChatOpen && <Panel />}\n </>\n )\n case 'EXISTING':\n case 'UNAVAILABLE':\n return (\n <p className='govuk-body'>When it is available, a 'start chat' link will appear.</p>\n )\n default:\n return (\n <p className='govuk-body'>Checking availability</p>\n )\n }\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport sanitizeHtml from 'sanitize-html'\n\nimport { PanelHeader } from '../panel/panel-header.jsx'\nimport { PanelFooter } from '../panel/panel-footer.jsx'\nimport { Message } from '../message/message.jsx'\n\nimport { useApp } from '../../store/useApp.js'\nimport { useTextareaAutosize } from '../../hooks/useTextareaAutosize.js'\nimport { formatTranscript } from '../../lib/transform-messages.js'\n\nexport function Chat ({ onEndChat }) {\n const { availability, thread, messages, agent, agentStatus, isAgentTyping } = useApp()\n\n const [userMessage, setUserMessage] = useState('')\n\n const messageRef = useRef()\n\n useTextareaAutosize(messageRef.current, userMessage)\n\n useEffect(() => {\n if (messages.length !== 0) {\n const chatBody = document.querySelector('.wc-body')\n chatBody.scrollTop = chatBody.scrollHeight\n }\n }, [messages, isAgentTyping])\n\n useEffect(() => {\n const label = document.querySelector('.wc-form__label')\n\n if (userMessage.length === 0) {\n label.classList.remove('govuk-visually-hidden')\n } else {\n label.classList.add('govuk-visually-hidden')\n }\n }, [userMessage])\n\n const onChange = e => {\n setUserMessage(e.target?.value)\n }\n\n const agentName = agent?.nickname || agent?.firstName\n\n let connectionHeadlineText = 'Connecting to Floodline'\n\n if (agentStatus === 'closed') {\n connectionHeadlineText = agentName ? `${agentName} ended the session` : 'Session ended by advisor'\n } else if (agentStatus) {\n if (agentName) {\n connectionHeadlineText = `You are speaking with ${agentName}`\n } else {\n connectionHeadlineText = 'No advisers currently available'\n }\n }\n\n if (availability === 'UNAVAILABLE') {\n connectionHeadlineText = 'Webchat is not currently available'\n }\n\n const sendMessage = e => {\n e.preventDefault()\n\n if (messageRef.current.value.length === 0) {\n return\n }\n\n try {\n thread.sendTextMessage(sanitizeHtml(messageRef.current.value.trim()))\n } catch (err) {\n console.log('[Chat Error] sendMessage', err)\n }\n\n setUserMessage('')\n }\n\n const saveChat = () => {\n const transcript = formatTranscript(messages)\n\n const saveChatLink = document.querySelector('#transcript-download')\n\n saveChatLink.setAttribute('href', `data:text/plain;charset=utf-8,${transcript}`)\n saveChatLink.click()\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-status'>\n <p className='wc-status__availability govuk-body-s'>{connectionHeadlineText}</p>\n <a className='wc-status__link govuk-!-font-size-16' href='#' data-module='govuk-button' onClick={onEndChat}>End chat</a>\n </div>\n\n <div className='wc-body'>\n <div className='wc-chat__body'>\n <ul className='wc-chat__messages'>\n {messages.length\n ? messages.map((msg, index) => <Message key={msg.id} message={msg} previousMessage={messages[index - 1]} />)\n : null}\n {isAgentTyping\n ? (\n <li className='wc-chat__message govuk-body outbound'>\n <div className='wc-chat__from govuk-!-font-size-14'>{agentName} is typing</div>\n <div className='wc-chat__text outbound'>\n <svg width='28' height='16' x='0px' y='0px' viewBox='0 0 28 16'>\n <circle stroke='none' cx='3' cy='8' r='3' fill='currentColor' />\n <circle stroke='none' cx='14' cy='8' r='3' fill='currentColor' />\n <circle stroke='none' cx='25' cy='8' r='3' fill='currentColor' />\n </svg>\n </div>\n </li>\n )\n : null}\n </ul>\n </div>\n </div>\n\n <PanelFooter>\n <div className='wc-footer__input'>\n <form className='wc-form' noValidate>\n <label className='govuk-label wc-form__label govuk-!-font-size-16' htmlFor='wc-form-textarea'>\n Your message<span className='govuk-visually-hidden'> (enter key submits)</span>\n </label>\n\n <textarea\n ref={messageRef}\n rows='1'\n aria-required='true'\n className='wc-form__textarea govuk-textarea govuk-!-font-size-16'\n id='wc-form-textarea'\n name='message'\n onChange={onChange}\n value={userMessage}\n />\n\n <input\n type='submit'\n className='wc-form__button govuk-button govuk-!-font-size-16'\n value='Send'\n data-prevent-double-click='true'\n onClick={sendMessage}\n />\n </form>\n </div>\n\n <div className='wc-footer__settings'>\n <a\n href='#'\n className='wc-footer__settings-link'\n data-module='govuk-button'\n >\n Settings\n </a>\n <a\n href='#'\n id='transcript-download'\n className='wc-footer__settings-link'\n data-module='govuk-button'\n download='floodline-webchat-transcript.txt'\n onClick={saveChat}\n >\n Save chat\n </a>\n </div>\n </PanelFooter>\n </>\n )\n}\n","import React from 'react'\n\nexport const ErrorSummary = ({ errors }) => {\n const errs = Object.keys(errors)\n\n const goToInput = e => {\n e.preventDefault()\n const key = e.target.getAttribute('data-key')\n document.querySelector(`#wc-${key}`).focus()\n }\n\n if (errs.length === 0) {\n return null\n }\n\n return (\n <div className='govuk-error-summary govuk-!-static-margin-bottom-7' data-module='govuk-error-summary' tabIndex='-1'>\n <div role='alert'>\n <h2 id='wc-error' className='govuk-error-summary__title'>\n There is a problem\n </h2>\n <div className='govuk-error-summary__body'>\n <ul className='govuk-list govuk-error-summary__list'>\n {errs.map(key => (\n <li key={key}>\n <a href='#' data-key={key} onClick={goToInput}>{errors[key]}</a>\n </li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { classnames } from '../../lib/classnames'\n\nexport function Message ({ message, previousMessage }) {\n const outbound = message.direction === 'outbound'\n\n const messageOwnerSameAsPrevious = message?.direction === previousMessage?.direction\n\n return (\n <li className={classnames('wc-chat__message govuk-body', outbound ? 'outbound' : 'inbound')}>\n <div className='wc-chat__from govuk-!-font-size-14'>\n {messageOwnerSameAsPrevious ? null : <span>{outbound ? message.assignee : 'You'}</span>}\n <span className='govuk-visually-hidden'>:</span>\n </div>\n <p className={classnames('wc-chat__text', 'govuk-body-s', outbound ? 'outbound' : 'inbound')}>\n {message.text}\n </p>\n </li>\n )\n}\n","import React from 'react'\n\nexport function PanelFooter ({ children }) {\n return (\n <div className='wc-footer'>\n {children}\n </div>\n )\n}\n","import React from 'react'\nimport { useApp } from '../../store/useApp.js'\n\nexport function PanelHeader () {\n const { thread, setChatVisibility, setUnseenCount } = useApp()\n\n const onClose = e => {\n e.preventDefault()\n setChatVisibility(false)\n setUnseenCount(0)\n }\n\n let ButtonComponent = (\n <button className='wc-header__close' aria-label='Close the webchat' onClick={onClose}>\n <svg aria-hidden='true' focusable='false' width='20' height='20' viewBox='0 0 20 20'>\n <path d='M10,8.6L15.6,3L17,4.4L11.4,10L17,15.6L15.6,17L10,11.4L4.4,17L3,15.6L8.6,10L3,4.4L4.4,3L10,8.6Z' fill='currentColor' />\n </svg>\n </button>\n )\n\n if (thread) {\n ButtonComponent = (\n <button className='wc-header__hide' aria-label='Minimise the webchat' onClick={onClose}>\n <svg aria-hidden='true' focusable='false' width='20' height='20' viewBox='0 0 20 20'>\n <path d='M10 14.4l-7-7L4.4 6l5.6 5.6L15.6 6 17 7.4l-7 7z' fill='currentColor' />\n </svg>\n </button>\n )\n }\n\n return (\n <div className='wc-header'>\n <h2 id='wc-header-title' className='wc-header__title govuk-heading-s'>\n Floodline Webchat\n </h2>\n\n {ButtonComponent}\n </div>\n )\n}\n","import React, { useEffect, useState, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { PreChat } from '../screens/pre-chat.jsx'\nimport { RequestChat } from '../screens/request-chat.jsx'\nimport { Chat } from '../chat/chat.jsx'\nimport { Unavailable } from '../screens/unavailable.jsx'\nimport { EndChat } from '../screens/end-chat.jsx'\n\nimport { useApp } from '../../store/useApp.js'\nimport { useChatSdk } from '../../store/useChatSdk.js'\nimport { useFocusedElements } from '../../hooks/useFocusedElements.js'\n\nexport function Panel () {\n const { sdk, availability, thread, threadId, setThread, setThreadId, setChatVisibility, setMessages, setUnseenCount } = useApp()\n const { fetchThread, fetchMessages } = useChatSdk(sdk)\n\n const [screen, setScreen] = useState(threadId ? 2 : 0)\n\n useFocusedElements(screen)\n\n /**\n * Initializes the eventListener for pressing the escape key\n */\n useEffect(() => {\n const escapeKeyEvent = document.addEventListener('keydown', onEscapeKey)\n\n return () => {\n document.removeEventListener('keydown', escapeKeyEvent)\n }\n }, [])\n\n /**\n * Recovers the thread if there is a threadId but no thread loaded in to state\n */\n useEffect(() => {\n const recover = async () => {\n try {\n const fetchedThread = await fetchThread(threadId)\n setThread(fetchedThread)\n\n const fetchedMessages = await fetchMessages(fetchedThread, threadId)\n setMessages(fetchedMessages)\n } catch (err) {\n console.log('[Chat Error] fetchThread', err)\n\n setThreadId()\n setThread()\n setScreen(0)\n }\n }\n\n if (threadId) {\n if (thread) {\n thread.lastMessageSeen()\n setUnseenCount(0)\n setScreen(2)\n } else {\n recover()\n }\n }\n }, [thread, threadId])\n\n const onEscapeKey = useCallback(e => {\n if (e.key === 'Escape' || e.key === 'Esc') {\n setChatVisibility(false)\n }\n }, [])\n\n const handleScreenChange = newScreen => e => {\n e.preventDefault()\n setScreen(newScreen)\n }\n\n const onForward = handleScreenChange(screen + 1)\n const onBack = handleScreenChange(screen - 1)\n const onEndChat = handleScreenChange(3)\n const onResume = handleScreenChange(2)\n\n const onEndChatConfirm = e => {\n e.preventDefault()\n console.log('confirmed end chat')\n }\n\n let ScreenComponent\n\n switch (screen) {\n case 0:\n ScreenComponent = <PreChat onForward={onForward} />\n break\n case 1:\n ScreenComponent = <RequestChat onBack={onBack} />\n break\n case 2:\n ScreenComponent = <Chat setScreen={setScreen} onEndChat={onEndChat} />\n break\n case 3:\n ScreenComponent = <EndChat onResume={onResume} onEndChatConfirm={onEndChatConfirm} />\n break\n default:\n ScreenComponent = <PreChat onForward={onForward} />\n }\n\n if (availability === 'UNAVAILABLE') {\n ScreenComponent = <Unavailable />\n }\n\n const Component = (\n <div id='wc-panel' className='wc-panel' role='dialog' tabIndex='-1' aria-modal='true' aria-labelledby='wc-header-title'>\n {ScreenComponent}\n </div>\n )\n\n return (\n <>\n {createPortal(Component, document.body)}\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function EndChat ({ onResume, onEndChatConfirm }) {\n return (\n <>\n <PanelHeader />\n <div className='wc-body'>\n <h3 className='govuk-heading-s' aria-live='polite'>Are you sure you want to end the chat?</h3>\n <div className='govuk-button-group'>\n <a href='#' className='govuk-button govuk-!-font-size-16' data-module='govuk-button' onClick={onEndChatConfirm}>Yes, end chat</a>\n <a href='#' className='govuk-link govuk-!-font-size-16' onClick={onResume}>No, resume chat</a>\n </div>\n </div>\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function PreChat ({ onForward }) {\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <h3 className='govuk-heading-s' aria-live='polite'>What you can use webchat for</h3>\n <p className='govuk-body-s'>Webchat lets you talk directly to a Floodline adviser.</p>\n\n <p className='govuk-body-s'>You can use webchat to get:</p>\n <ul className='govuk-list govuk-list--bullet govuk-body-s'>\n <li>current flood warnings and alerts in your area</li>\n <li>information on the flood warning service</li>\n <li>advice on what to do before, during and after a flood</li>\n </ul>\n\n <p className='govuk-body-s'>\n {\n 'There are other ways to '\n }\n <a className='govuk-link' href='https://www.gov.uk/sign-up-for-flood-warnings'>\n sign up for flood warnings\n </a>\n {\n ' and '\n }\n <a className='govuk-link' href='https://www.fws.environment-agency.gov.uk/app/olr/login'>\n manage your flood warnings account\n </a>.\n </p>\n <p className='govuk-body-s'>Do not use webchat to <a className='govuk-link' href='https://www.gov.uk/report-flood-cause'>report a flood</a>.</p>\n\n <button className='govuk-button govuk-!-font-size-16' data-module='govuk-button' onClick={onForward}>Continue</button>\n\n <h3 className='govuk-heading-s'>Other flood information</h3>\n\n <p className='govuk-body-s'>Call Floodline for all other flood and flood warning information.</p>\n <p className='govuk-body-s'>\n <strong>Floodline helpline</strong>\n <br />\n Telephone: 0345 988 1188\n <br />\n Textphone: 0345 602 6340\n <br />\n Open 24 hours a day, 7 days a week\n <br />\n <a className='govuk-link' href='https://gov.uk/call-charges'>Find out more about call charges</a>\n </p>\n </div>\n </>\n )\n}\n","import React, { useRef, useState, useEffect } from 'react'\nimport * as uuid from 'uuid'\n\nimport { classnames } from '../../lib/classnames.js'\nimport { PanelHeader } from '../panel/panel-header.jsx'\nimport { useApp } from '../../store/useApp.js'\nimport { useChatSdk } from '../../store/useChatSdk.js'\nimport { ErrorSummary } from '../errorSummary/error-summary.jsx'\n\nconst QUESTION_MAX_LENGTH = 500\n\nexport function RequestChat ({ onBack }) {\n const { sdk, setCustomerId, setThreadId, setThread } = useApp()\n const { fetchCustomerId, fetchThread } = useChatSdk(sdk)\n\n const [errors, setErrors] = useState({})\n const [questionLength, setQuestionLength] = useState(0)\n\n const nameRef = useRef()\n const questionRef = useRef()\n\n useEffect(() => {\n if (Object.keys(errors).length) {\n document.querySelector('.govuk-error-summary')?.focus()\n }\n }, [errors])\n\n const onQuestionChange = e => {\n setQuestionLength(e.target.value.length)\n }\n\n const onRequestChat = async e => {\n e.preventDefault()\n\n const errs = {}\n\n if (nameRef.current.value.length === 0) {\n errs.name = 'Enter your name'\n }\n\n if (questionRef.current.value.length === 0) {\n errs.question = 'Enter your question'\n }\n\n if (questionRef.current.value.length > QUESTION_MAX_LENGTH) {\n errs.question = 'Your question must be 500 characters or less'\n }\n\n if (Object.keys(errs).length === 0) {\n try {\n const threadId = uuid.v4()\n const customerId = await fetchCustomerId()\n const thread = await fetchThread(threadId)\n\n sdk.getCustomer().setName(nameRef.current.value)\n\n await thread.startChat(questionRef.current.value || 'Begin conversation')\n\n setCustomerId(customerId)\n setThreadId(threadId)\n setThread(thread)\n } catch (err) {\n console.log('[Request Chat Error]', err)\n }\n }\n\n setErrors(errs)\n }\n\n const isQuestionLengthValid = QUESTION_MAX_LENGTH >= questionLength\n const questionLengthRemaining = QUESTION_MAX_LENGTH - questionLength\n const questionLengthExceeded = questionLength - QUESTION_MAX_LENGTH\n\n let questionHint = `You have ${questionLengthRemaining} characters remaining`\n\n if (!isQuestionLengthValid) {\n questionHint = `You have ${questionLengthExceeded} characters too many`\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <a href='#' className='wc-back-link govuk-back-link' onClick={onBack}>\n What you can use webchat for\n </a>\n\n <ErrorSummary errors={errors} />\n\n <h3 className='govuk-heading-s' aria-live='polite'>\n Your name and question\n </h3>\n\n <form>\n <div className={classnames('govuk-form-group', errors.name && 'govuk-form-group--error')}>\n <label className='govuk-label' htmlFor='wc-name'>\n Your name\n </label>\n {errors.name && (\n <p className='govuk-error-message'>\n <span className='govuk-visually-hidden'>Error:</span> {errors.name}\n </p>\n )}\n <input\n ref={nameRef}\n className={classnames('govuk-input', errors.name && 'govuk-input--error')}\n id='wc-name'\n name='name'\n type='text'\n data-testid='request-chat-user-name'\n />\n </div>\n\n <div className='govuk-character-count' data-module='govuk-character-count' data-maxlength='500'>\n <div className={classnames('govuk-form-group', errors.question && 'govuk-form-group--error')}>\n <label className='govuk-label' htmlFor='wc-question'>\n Your question\n </label>\n {errors.question && (\n <p className='govuk-error-message'>\n <span className='govuk-visually-hidden'>Error:</span>\n {errors.question}\n </p>\n )}\n <textarea\n ref={questionRef}\n id='wc-question'\n name='question'\n rows='5'\n aria-describedby='wc-question-info'\n onChange={onQuestionChange}\n className={classnames('govuk-textarea', 'govuk-js-character-count', !isQuestionLengthValid || errors.question ? 'govuk-textarea--error' : '')}\n data-testid='request-chat-user-question'\n />\n <div id='wc-question-info' className='govuk-hint govuk-character-count__message' style={{ color: `${!isQuestionLengthValid ? '#d4351c' : ''}` }} aria-hidden='true'>\n {questionHint}\n </div>\n <div className='govuk-character-count__sr-status govuk-visually-hidden' aria-live='polite'>\n {questionHint}\n </div>\n </div>\n </div>\n\n <button\n className='govuk-button govuk-!-margin-top-1 govuk-!-font-size-16'\n data-module='govuk-button'\n onClick={onRequestChat}\n >\n Request chat\n </button>\n </form>\n </div>\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function Unavailable () {\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <h3 id='wc-subtitle' className='govuk-heading-m'>Webchat is currently not available</h3>\n <p className='govuk-body-s'>Try again later, or call Floodline:</p>\n <p className='govuk-body-s'>\n <strong>Floodline helpline</strong>\n <br />Telephone: 0345 988 1188\n <br />Textphone: 0345 602 6340\n <br />Open 24 hours a day, 7 days a week\n <br /><a className='govuk-link' href='https://gov.uk/call-charges'>Find out more about call charges</a>\n </p>\n <p className='govuk-body-s'>We're running webchat as a trial, it will not always be available.</p>\n </div>\n </>\n )\n}\n","import { useState, useEffect, useCallback } from 'react'\n\nconst setAriaHidden = bool => {\n for (const node of document.body.children) {\n if (node.id !== 'wc-panel') {\n (bool) ? node.setAttribute('aria-hidden', 'true') : node.removeAttribute('aria-hidden')\n }\n }\n}\n\nexport const getFocusableElements = () => {\n const selectors = [\n '#wc-panel a:not([disabled])',\n '#wc-panel button:not([disabled])',\n '#wc-panel select:not([disabled])',\n '#wc-panel input:not([disabled])',\n '#wc-panel textarea:not([disabled])',\n '#wc-panel *[tabindex=\"0\"]:not([disabled])'\n ]\n\n const elements = document.body.querySelectorAll(selectors.join(','))\n return Array.from(elements).filter(e => !e.closest('[hidden]') && !e.closest('[aria-hidden=\"true\"]'))\n}\n\nconst useFocusedElements = screen => {\n const [panelElements, setPanelElements] = useState([])\n\n const onKeyDown = useCallback(e => {\n const webchatPanelElement = document.querySelector('#wc-panel')\n\n if (e.key === 'Tab') {\n if (webchatPanelElement && !document.activeElement.closest('#wc-panel')) {\n webchatPanelElement.focus()\n }\n\n if (e.shiftKey) {\n if (document.activeElement === panelElements[0]) {\n panelElements[panelElements.length - 1].focus()\n e.preventDefault()\n } else if (document.activeElement === document.querySelector('#wc-panel')) {\n panelElements[panelElements.length - 1]?.focus()\n e.preventDefault()\n }\n } else if (document.activeElement === panelElements[panelElements.length - 1]) {\n panelElements[0].focus()\n e.preventDefault()\n }\n }\n }, [panelElements])\n\n useEffect(() => {\n setPanelElements(getFocusableElements())\n }, [screen])\n\n useEffect(() => {\n setAriaHidden(true)\n\n const panelElement = document.querySelector('#wc-panel')\n panelElement.focus()\n\n document.addEventListener('keydown', onKeyDown)\n\n return () => {\n setAriaHidden()\n document.body.querySelector('.wc-availability__link')?.focus()\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [panelElements])\n}\n\nexport { useFocusedElements }\n","import { useEffect } from 'react'\n\nexport const useTextareaAutosize = (textAreaRef, value) => {\n useEffect(() => {\n if (textAreaRef) {\n textAreaRef.style.height = '0px'\n\n const scrollHeight = textAreaRef.scrollHeight\n\n textAreaRef.style.height = `${scrollHeight}px`\n }\n }, [textAreaRef, value])\n}\n","export async function checkAvailability (endpoint) {\n const response = await fetch(endpoint)\n const data = await response.json()\n\n return {\n availability: data.availability || 'UNAVAILABLE'\n }\n}\n","export const classnames = (...classes) => classes.filter(classname => classname && typeof classname === 'string').join(' ')\n","import * as uuid from 'uuid'\nimport sanitizeHtml from 'sanitize-html'\nimport { DateTime } from 'luxon'\n\nexport const transformMessage = message => {\n return {\n id: message.id,\n text: sanitizeHtml(message.messageContent?.text),\n createdAt: new Date(message.createdAt),\n user: message.authorEndUserIdentity?.fullName?.trim() || null,\n assignee: message.authorUser?.firstName || null,\n direction: message.direction\n }\n}\n\nexport const transformMessages = messages => messages.map(message => transformMessage(message))\n\nexport const formatTranscript = messages => {\n const now = DateTime.local()\n now.setZone('Europe/London')\n\n let string = `Floodline webchat transcript, ${now.toFormat('HH:mm:ss a, dd LLLL yyyy')}, (ID: ${uuid.v4().split('-')[0]})\\n\\n`\n\n for (const message of messages) {\n const { text, direction, user, assignee, createdAt } = message\n\n const author = direction === 'inbound' ? user : `${assignee} (Floodline adviser)`\n const date = DateTime.fromJSDate(new Date(createdAt)).setZone('Europe/London').toFormat('HH:mm:ss a, dd LLLL yyyy')\n\n string += `[${date}] ${author}: \\n${text}\\n\\n`\n }\n\n string = string.replace(/<a\\b[^>]*>/i, '').replace(/<\\/a>/i, '')\n\n return encodeURIComponent(string)\n}\n","import React, { createContext, useEffect, useReducer, useMemo } from 'react'\nimport { ChatEvent } from '@nice-devone/nice-cxone-chat-web-sdk'\n\nimport { initialState, reducer, CUSTOMER_ID_STORAGE_KEY, THREAD_ID_STORAGE_KEY } from './reducer.js'\n\nexport const AppContext = createContext(initialState)\n\nexport const AppProvider = ({ sdk, availability, children }) => {\n const [state, dispatch] = useReducer(reducer, initialState)\n\n /**\n * SDK event handlers\n */\n const onLiveChatRecovered = e => {\n dispatch({ type: 'SET_AGENT', payload: e.detail.data.inboxAssignee })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.contact.status })\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: e.detail.data.contact.customerStatistics.unseenMessagesCount })\n }\n\n const onAssignedAgentChanged = e => {\n dispatch({ type: 'SET_AGENT', payload: e.detail.data.inboxAssignee })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n }\n\n const onAgentTypingStarted = () => {\n dispatch({ type: 'SET_AGENT_TYPING', payload: true })\n }\n\n const onAgentTypingEnded = () => {\n dispatch({ type: 'SET_AGENT_TYPING', payload: false })\n }\n\n const onMessageCreated = e => {\n dispatch({ type: 'SET_MESSAGE', payload: e.detail.data.message })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: e.detail.data.case.customerStatistics.unseenMessagesCount })\n }\n\n const onContactStatusChanged = e => {\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n }\n\n useEffect(() => {\n sdk.onChatEvent(ChatEvent.LIVECHAT_RECOVERED, onLiveChatRecovered)\n sdk.onChatEvent(ChatEvent.MESSAGE_CREATED, onMessageCreated)\n sdk.onChatEvent(ChatEvent.AGENT_TYPING_STARTED, onAgentTypingStarted)\n sdk.onChatEvent(ChatEvent.AGENT_TYPING_ENDED, onAgentTypingEnded)\n sdk.onChatEvent(ChatEvent.ASSIGNED_AGENT_CHANGED, onAssignedAgentChanged)\n sdk.onChatEvent(ChatEvent.CONTACT_STATUS_CHANGED, onContactStatusChanged)\n }, [sdk])\n\n /**\n * Initialize customerId, threadId and whether the webchat should be open\n */\n useEffect(() => {\n dispatch({ type: 'SET_AVAILABILITY', payload: availability })\n\n setCustomerId(window.localStorage.getItem(CUSTOMER_ID_STORAGE_KEY))\n setThreadId(window.localStorage.getItem(THREAD_ID_STORAGE_KEY))\n\n if (window.location.hash === '#webchat') {\n setChatVisibility(true)\n }\n }, [])\n\n /**\n * State update functions\n */\n const setChatVisibility = payload => {\n if (!payload) {\n window.location.hash = ''\n }\n\n dispatch({ type: 'SET_CHAT_VISIBILITY', payload })\n }\n\n const setCustomerId = customerId => {\n dispatch({ type: 'SET_CUSTOMER_ID', payload: customerId })\n }\n\n const setThreadId = threadId => {\n dispatch({ type: 'SET_THREAD_ID', payload: threadId })\n }\n\n const setThread = thread => {\n dispatch({ type: 'SET_THREAD', payload: thread })\n }\n\n const setMessages = messages => {\n dispatch({ type: 'SET_MESSAGES', payload: messages })\n }\n\n const setUnseenCount = unseenCount => {\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: unseenCount })\n }\n\n /**\n * Application-wide state and state functions\n */\n const store = useMemo(() => ({\n ...state,\n sdk,\n setCustomerId,\n setThreadId,\n setThread,\n setMessages,\n setUnseenCount,\n setChatVisibility,\n onLiveChatRecovered,\n onAssignedAgentChanged,\n onAgentTypingStarted,\n onAgentTypingEnded,\n onMessageCreated,\n onContactStatusChanged\n }))\n\n return (\n <AppContext.Provider value={store}>\n {children}\n </AppContext.Provider>\n )\n}\n","import { transformMessages, transformMessage } from '../lib/transform-messages'\nimport { CUSTOMER_ID_STORAGE_KEY, THREAD_ID_STORAGE_KEY } from './reducer'\n\nconst setCustomerId = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(CUSTOMER_ID_STORAGE_KEY, payload)\n } else {\n window.localStorage.removeItem(CUSTOMER_ID_STORAGE_KEY)\n }\n\n return {\n ...state,\n customerId: payload\n }\n}\n\nconst setThreadId = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(THREAD_ID_STORAGE_KEY, payload)\n } else {\n window.localStorage.removeItem(THREAD_ID_STORAGE_KEY)\n }\n\n return {\n ...state,\n threadId: payload\n }\n}\n\nconst setChatVisibility = (state, payload) => {\n return {\n ...state,\n isChatOpen: payload\n }\n}\n\nconst setAvailability = (state, payload) => {\n return {\n ...state,\n availability: payload\n }\n}\n\nconst setThread = (state, payload) => {\n return {\n ...state,\n thread: payload\n }\n}\n\nconst setMessage = (state, payload) => {\n return {\n ...state,\n messages: [...state.messages, transformMessage(payload)]\n }\n}\n\nconst setMessages = (state, payload) => {\n return {\n ...state,\n messages: transformMessages(payload).reverse()\n }\n}\n\nconst setAgent = (state, payload) => {\n return {\n ...state,\n agent: payload\n }\n}\n\nconst setAgentIsTyping = (state, payload) => {\n return {\n ...state,\n isAgentTyping: payload\n }\n}\n\nconst setAgentStatus = (state, payload) => {\n return {\n ...state,\n agentStatus: payload\n }\n}\n\nconst setUnseenCount = (state, payload) => {\n return {\n ...state,\n unseenCount: payload\n }\n}\n\nexport const actionsMap = {\n SET_CHAT_VISIBILITY: setChatVisibility,\n SET_AVAILABILITY: setAvailability,\n SET_CUSTOMER_ID: setCustomerId,\n SET_THREAD_ID: setThreadId,\n SET_THREAD: setThread,\n SET_MESSAGE: setMessage,\n SET_MESSAGES: setMessages,\n SET_AGENT: setAgent,\n SET_AGENT_TYPING: setAgentIsTyping,\n SET_AGENT_STATUS: setAgentStatus,\n SET_UNSEEN_COUNT: setUnseenCount\n}\n","import { actionsMap } from './actions-map'\n\nexport const CUSTOMER_ID_STORAGE_KEY = 'webchat_customer_id'\nexport const THREAD_ID_STORAGE_KEY = 'webchat_thread_id'\n\nexport const initialState = {\n availability: null,\n customerId: null,\n threadId: null,\n thread: null,\n messages: [],\n unseenCount: 0,\n agent: null,\n agentStatus: null,\n isAgentTyping: false,\n isChatOpen: false\n}\n\nexport const reducer = (state, action) => {\n const { type, payload } = action\n\n const fn = actionsMap[type]\n\n if (fn) {\n const actionFunction = fn.bind(this, state, payload)\n return actionFunction()\n }\n\n return state\n}\n","import { useContext } from 'react'\n\nimport { AppContext } from './AppProvider.jsx'\n\nexport const useApp = () => useContext(AppContext)\n","export const useChatSdk = sdk => {\n const connect = async () => sdk.authorize()\n\n const fetchCustomerId = async () => {\n const response = await connect()\n return response?.consumerIdentity.idOnExternalPlatform\n }\n\n const fetchThread = async threadId => {\n await connect()\n return sdk.getThread(threadId)\n }\n\n const fetchMessages = async (thread, threadId) => {\n await connect()\n\n const recovered = await thread.recover(threadId)\n\n const allMessages = []\n let fetchedMessages = recovered.messages\n\n while (fetchedMessages.length) {\n fetchedMessages.map(msg => allMessages.push(msg))\n\n try {\n const response = await thread.loadMoreMessages()\n fetchedMessages = response.data.messages\n } catch (err) {\n fetchedMessages = []\n }\n }\n\n return allMessages\n }\n\n return { connect, fetchCustomerId, fetchThread, fetchMessages }\n}\n","module.exports = require(\"@nice-devone/nice-cxone-chat-web-sdk\");","module.exports = require(\"luxon\");","module.exports = require(\"react\");","module.exports = require(\"react-dom\");","module.exports = require(\"react-dom/client\");","module.exports = require(\"sanitize-html\");","module.exports = require(\"uuid\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { ChatSdk } from '@nice-devone/nice-cxone-chat-web-sdk'\nimport { Availability } from './components/availability/availability.jsx'\nimport { checkAvailability } from './lib/check-availability'\nimport { AppProvider } from './store/AppProvider.jsx'\nimport { CUSTOMER_ID_STORAGE_KEY } from './store/reducer.js'\n\nexport async function init (container, options) {\n const sdk = new ChatSdk({\n brandId: options.brandId,\n channelId: options.channelId,\n customerId: window.localStorage.getItem(CUSTOMER_ID_STORAGE_KEY) || '',\n environment: options.environment\n })\n\n const root = createRoot(container)\n let availability\n try {\n const result = await checkAvailability(options.availabilityEndpoint)\n availability = result.availability\n } catch (e) {\n availability = 'UNAVAILABLE'\n }\n root.render(\n <AppProvider sdk={sdk} availability={availability}>\n <Availability availability={availability} />\n </AppProvider>\n )\n}\n"],"names":["React","useEffect","useRef","useState","classnames","Panel","useApp","Availability","availability","messages","isChatOpen","setChatVisibility","unseenCount","isFixed","setIsFixed","buttonRef","onClick","onKeyDown","event","key","preventDefault","onKeyUp","intersectionCallback","entries","entry","isBelowFold","isIntersecting","boundingClientRect","top","observer","window","IntersectionObserver","rootMargin","parentElement","current","observe","unobserve","document","documentElement","classList","toggle","body","TextComponent","createElement","Fragment","length","className","ref","href","draggable","sanitizeHtml","PanelHeader","PanelFooter","Message","useTextareaAutosize","formatTranscript","Chat","onEndChat","thread","agent","agentStatus","isAgentTyping","userMessage","setUserMessage","messageRef","chatBody","querySelector","scrollTop","scrollHeight","label","remove","add","onChange","e","target","value","agentName","nickname","firstName","connectionHeadlineText","sendMessage","sendTextMessage","trim","err","console","log","saveChat","transcript","saveChatLink","setAttribute","click","map","msg","index","id","message","previousMessage","width","height","x","y","viewBox","stroke","cx","cy","r","fill","noValidate","htmlFor","rows","name","type","download","ErrorSummary","errors","errs","Object","keys","goToInput","getAttribute","focus","tabIndex","role","outbound","direction","messageOwnerSameAsPrevious","assignee","text","children","setUnseenCount","onClose","ButtonComponent","focusable","d","useCallback","createPortal","PreChat","RequestChat","Unavailable","EndChat","useChatSdk","useFocusedElements","sdk","threadId","setThread","setThreadId","setMessages","fetchThread","fetchMessages","screen","setScreen","escapeKeyEvent","addEventListener","onEscapeKey","removeEventListener","recover","fetchedThread","fetchedMessages","lastMessageSeen","handleScreenChange","newScreen","onForward","onBack","onResume","onEndChatConfirm","ScreenComponent","Component","uuid","QUESTION_MAX_LENGTH","setCustomerId","fetchCustomerId","setErrors","questionLength","setQuestionLength","nameRef","questionRef","onQuestionChange","onRequestChat","question","v4","customerId","getCustomer","setName","startChat","isQuestionLengthValid","questionLengthRemaining","questionLengthExceeded","questionHint","style","color","setAriaHidden","bool","node","removeAttribute","getFocusableElements","selectors","elements","querySelectorAll","join","Array","from","filter","closest","panelElements","setPanelElements","webchatPanelElement","activeElement","shiftKey","panelElement","textAreaRef","checkAvailability","endpoint","response","fetch","data","json","classes","classname","DateTime","transformMessage","messageContent","createdAt","Date","user","authorEndUserIdentity","fullName","authorUser","transformMessages","now","local","setZone","string","toFormat","split","author","date","fromJSDate","replace","encodeURIComponent","createContext","useReducer","useMemo","ChatEvent","initialState","reducer","CUSTOMER_ID_STORAGE_KEY","THREAD_ID_STORAGE_KEY","AppContext","AppProvider","state","dispatch","onLiveChatRecovered","payload","detail","inboxAssignee","contact","status","customerStatistics","unseenMessagesCount","onAssignedAgentChanged","case","onAgentTypingStarted","onAgentTypingEnded","onMessageCreated","onContactStatusChanged","onChatEvent","LIVECHAT_RECOVERED","MESSAGE_CREATED","AGENT_TYPING_STARTED","AGENT_TYPING_ENDED","ASSIGNED_AGENT_CHANGED","CONTACT_STATUS_CHANGED","localStorage","getItem","location","hash","store","Provider","setItem","removeItem","setAvailability","setMessage","reverse","setAgent","setAgentIsTyping","setAgentStatus","actionsMap","SET_CHAT_VISIBILITY","SET_AVAILABILITY","SET_CUSTOMER_ID","SET_THREAD_ID","SET_THREAD","SET_MESSAGE","SET_MESSAGES","SET_AGENT","SET_AGENT_TYPING","SET_AGENT_STATUS","SET_UNSEEN_COUNT","action","fn","actionFunction","bind","useContext","connect","authorize","consumerIdentity","idOnExternalPlatform","getThread","recovered","allMessages","push","loadMoreMessages","createRoot","ChatSdk","init","container","options","brandId","channelId","environment","root","result","availabilityEndpoint","render"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"client.js","mappings":"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","sources":["webpack://@defra/flood-webchat/./src/client/components/availability/availability.jsx","webpack://@defra/flood-webchat/./src/client/components/chat/chat.jsx","webpack://@defra/flood-webchat/./src/client/components/errorSummary/error-summary.jsx","webpack://@defra/flood-webchat/./src/client/components/message/message.jsx","webpack://@defra/flood-webchat/./src/client/components/panel/panel-footer.jsx","webpack://@defra/flood-webchat/./src/client/components/panel/panel-header.jsx","webpack://@defra/flood-webchat/./src/client/components/panel/panel.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/end-chat.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/pre-chat.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/request-chat.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/settings.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/unavailable.jsx","webpack://@defra/flood-webchat/./src/client/hooks/useFocusedElements.js","webpack://@defra/flood-webchat/./src/client/hooks/useTextareaAutosize.js","webpack://@defra/flood-webchat/./src/client/lib/check-availability.js","webpack://@defra/flood-webchat/./src/client/lib/classnames.js","webpack://@defra/flood-webchat/./src/client/lib/message-notification.js","webpack://@defra/flood-webchat/./src/client/lib/transform-messages.js","webpack://@defra/flood-webchat/./src/client/store/AppProvider.jsx","webpack://@defra/flood-webchat/./src/client/store/actions-map.js","webpack://@defra/flood-webchat/./src/client/store/constants.js","webpack://@defra/flood-webchat/./src/client/store/reducer.js","webpack://@defra/flood-webchat/./src/client/store/useApp.js","webpack://@defra/flood-webchat/./src/client/store/useChatSdk.js","webpack://@defra/flood-webchat/external commonjs \"@nice-devone/nice-cxone-chat-web-sdk\"","webpack://@defra/flood-webchat/external commonjs \"luxon\"","webpack://@defra/flood-webchat/external commonjs \"react\"","webpack://@defra/flood-webchat/external commonjs \"react-dom\"","webpack://@defra/flood-webchat/external commonjs \"react-dom/client\"","webpack://@defra/flood-webchat/external commonjs \"sanitize-html\"","webpack://@defra/flood-webchat/external commonjs \"uuid\"","webpack://@defra/flood-webchat/webpack/bootstrap","webpack://@defra/flood-webchat/webpack/runtime/compat get default export","webpack://@defra/flood-webchat/webpack/runtime/define property getters","webpack://@defra/flood-webchat/webpack/runtime/hasOwnProperty shorthand","webpack://@defra/flood-webchat/webpack/runtime/make namespace object","webpack://@defra/flood-webchat/./src/client/index.jsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react'\n\nimport { classnames } from '../../lib/classnames'\nimport { Panel } from '../panel/panel.jsx'\nimport { useApp } from '../../store/useApp'\n\nexport function Availability () {\n const { availability, messages, isChatOpen, setChatVisibility, unseenCount } = useApp()\n\n const [isFixed, setIsFixed] = useState(false)\n const buttonRef = useRef()\n\n const onClick = () => {\n setChatVisibility(!isChatOpen)\n }\n\n const onKeyDown = event => {\n if (event.key === ' ') {\n event.preventDefault()\n }\n }\n\n const onKeyUp = event => {\n if (event.key === ' ') {\n setChatVisibility(!isChatOpen)\n }\n }\n\n const intersectionCallback = entries => {\n const [entry] = entries\n const isBelowFold = !entry.isIntersecting && entry.boundingClientRect.top > 0\n setIsFixed(!isChatOpen && isBelowFold)\n }\n\n useEffect(() => {\n const observer = new window.IntersectionObserver(intersectionCallback, {\n rootMargin: '35px'\n })\n\n const parentElement = buttonRef.current?.parentElement\n\n if (parentElement) {\n observer.observe(parentElement)\n }\n\n return () => {\n if (parentElement) {\n observer.unobserve(parentElement)\n }\n }\n }, [buttonRef, isChatOpen])\n\n useEffect(() => {\n document.documentElement.classList.toggle('wc-scroll-padding', isFixed)\n document.body.classList.toggle('wc-scroll-padding', isFixed)\n }, [isFixed])\n\n let TextComponent = (<>Show Chat</>)\n\n if (!messages.length) {\n TextComponent = (<>Start Chat</>)\n }\n\n switch (availability) {\n case 'AVAILABLE':\n return (\n <>\n <div\n className={classnames('wc-availability', isFixed && 'wc-availability--fixed', isChatOpen && 'wc-open')}\n ref={buttonRef}\n >\n <div className='wc-availability__inner'>\n <a\n className='wc-availability__link'\n href='#webchat'\n draggable='false'\n onClick={onClick}\n onKeyUp={onKeyUp}\n onKeyDown={onKeyDown}\n >\n {TextComponent}\n {unseenCount > 0 && !isChatOpen ? <span className='wc-open-btn__unseen'>{unseenCount}</span> : null}\n </a>\n </div>\n </div>\n {isChatOpen && <Panel />}\n </>\n )\n case 'EXISTING':\n case 'UNAVAILABLE':\n return (\n <p className='govuk-body'>When it is available, a 'start chat' link will appear.</p>\n )\n default:\n return (\n <p className='govuk-body'>Checking availability</p>\n )\n }\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport sanitizeHtml from 'sanitize-html'\n\nimport { PanelHeader } from '../panel/panel-header.jsx'\nimport { PanelFooter } from '../panel/panel-footer.jsx'\nimport { Message } from '../message/message.jsx'\n\nimport { useApp } from '../../store/useApp.js'\nimport { useTextareaAutosize } from '../../hooks/useTextareaAutosize.js'\nimport { formatTranscript } from '../../lib/transform-messages.js'\n\nexport function Chat ({ onEndChat, onSettings }) {\n const { availability, thread, messages, agent, agentStatus, isAgentTyping, settings } = useApp()\n\n const [userMessage, setUserMessage] = useState('')\n\n const messageRef = useRef()\n\n useTextareaAutosize(messageRef.current, userMessage)\n\n useEffect(() => {\n if (settings.scroll && messages.length !== 0) {\n const chatBody = document.querySelector('.wc-body')\n chatBody.scrollTop = chatBody.scrollHeight\n }\n }, [messages, isAgentTyping])\n\n useEffect(() => {\n const label = document.querySelector('.wc-form__label')\n\n if (userMessage.length === 0) {\n label.classList.remove('govuk-visually-hidden')\n } else {\n label.classList.add('govuk-visually-hidden')\n }\n }, [userMessage])\n\n const onChange = e => {\n setUserMessage(e.target?.value)\n }\n\n const agentName = agent?.nickname || agent?.firstName\n\n let connectionHeadlineText = 'Connecting to Floodline'\n\n if (agentStatus === 'closed') {\n connectionHeadlineText = agentName ? `${agentName} ended the session` : 'Session ended by advisor'\n } else if (agentStatus) {\n if (agentName) {\n connectionHeadlineText = `You are speaking with ${agentName}`\n } else {\n connectionHeadlineText = 'No advisers currently available'\n }\n }\n\n if (availability === 'UNAVAILABLE') {\n connectionHeadlineText = 'Webchat is not currently available'\n }\n\n const sendMessage = e => {\n e.preventDefault()\n\n if (messageRef.current.value.length === 0) {\n return\n }\n\n try {\n thread.sendTextMessage(sanitizeHtml(messageRef.current.value.trim()))\n } catch (err) {\n console.log('[Chat Error] sendMessage', err)\n }\n\n setUserMessage('')\n }\n\n const saveChat = () => {\n const transcript = formatTranscript(messages)\n\n const saveChatLink = document.querySelector('#transcript-download')\n\n saveChatLink.setAttribute('href', `data:text/plain;charset=utf-8,${transcript}`)\n saveChatLink.click()\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-status'>\n <p className='wc-status__availability govuk-body-s'>{connectionHeadlineText}</p>\n <a className='wc-status__link govuk-!-font-size-16' href='#' data-module='govuk-button' onClick={onEndChat}>End chat</a>\n </div>\n\n <div className='wc-body'>\n <div className='wc-chat__body'>\n <ul className='wc-chat__messages'>\n {messages.length\n ? messages.map((msg, index) => <Message key={msg.id} message={msg} previousMessage={messages[index - 1]} />)\n : null}\n {isAgentTyping\n ? (\n <li className='wc-chat__message govuk-body outbound'>\n <div className='wc-chat__from govuk-!-font-size-14'>{agentName} is typing</div>\n <div className='wc-chat__text outbound'>\n <svg width='28' height='16' x='0px' y='0px' viewBox='0 0 28 16'>\n <circle stroke='none' cx='3' cy='8' r='3' fill='currentColor' />\n <circle stroke='none' cx='14' cy='8' r='3' fill='currentColor' />\n <circle stroke='none' cx='25' cy='8' r='3' fill='currentColor' />\n </svg>\n </div>\n </li>\n )\n : null}\n </ul>\n </div>\n </div>\n\n <PanelFooter>\n <div className='wc-footer__input'>\n <form className='wc-form' noValidate>\n <label className='govuk-label wc-form__label govuk-!-font-size-16' htmlFor='wc-form-textarea'>\n Your message<span className='govuk-visually-hidden'> (enter key submits)</span>\n </label>\n\n <textarea\n ref={messageRef}\n rows='1'\n aria-required='true'\n className='wc-form__textarea govuk-textarea govuk-!-font-size-16'\n id='wc-form-textarea'\n name='message'\n onChange={onChange}\n value={userMessage}\n />\n\n <input\n type='submit'\n className='wc-form__button govuk-button govuk-!-font-size-16'\n value='Send'\n data-prevent-double-click='true'\n onClick={sendMessage}\n />\n </form>\n </div>\n\n <div className='wc-footer__settings'>\n <a\n href='#'\n id='wc-settings'\n className='wc-footer__settings-link'\n data-module='govuk-button'\n onClick={onSettings}\n >\n Settings\n </a>\n <a\n href='#'\n id='transcript-download'\n className='wc-footer__settings-link'\n data-module='govuk-button'\n download='floodline-webchat-transcript.txt'\n onClick={saveChat}\n >\n Save chat\n </a>\n </div>\n </PanelFooter>\n </>\n )\n}\n","import React from 'react'\n\nexport const ErrorSummary = ({ errors }) => {\n const errs = Object.keys(errors)\n\n const goToInput = e => {\n e.preventDefault()\n const key = e.target.getAttribute('data-key')\n document.querySelector(`#wc-${key}`).focus()\n }\n\n if (errs.length === 0) {\n return null\n }\n\n return (\n <div className='govuk-error-summary govuk-!-static-margin-bottom-7' data-module='govuk-error-summary' tabIndex='-1'>\n <div role='alert'>\n <h2 id='wc-error' className='govuk-error-summary__title'>\n There is a problem\n </h2>\n <div className='govuk-error-summary__body'>\n <ul className='govuk-list govuk-error-summary__list'>\n {errs.map(key => (\n <li key={key}>\n <a href='#' data-key={key} onClick={goToInput}>{errors[key]}</a>\n </li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { classnames } from '../../lib/classnames'\n\nexport function Message ({ message, previousMessage }) {\n const outbound = message.direction === 'outbound'\n\n const messageOwnerSameAsPrevious = message?.direction === previousMessage?.direction\n\n return (\n <li className={classnames('wc-chat__message govuk-body', outbound ? 'outbound' : 'inbound')}>\n <div className='wc-chat__from govuk-!-font-size-14'>\n {messageOwnerSameAsPrevious ? null : <span>{outbound ? message.assignee : 'You'}</span>}\n <span className='govuk-visually-hidden'>:</span>\n </div>\n <p className={classnames('wc-chat__text', 'govuk-body-s', outbound ? 'outbound' : 'inbound')}>\n {message.text}\n </p>\n </li>\n )\n}\n","import React from 'react'\n\nexport function PanelFooter ({ children }) {\n return (\n <div className='wc-footer'>\n {children}\n </div>\n )\n}\n","import React from 'react'\nimport { useApp } from '../../store/useApp.js'\n\nexport function PanelHeader () {\n const { thread, setChatVisibility, setUnseenCount } = useApp()\n\n const onClose = e => {\n e.preventDefault()\n setChatVisibility(false)\n thread.lastMessageSeen()\n setUnseenCount(0)\n }\n\n let ButtonComponent = (\n <button className='wc-header__close' aria-label='Close the webchat' onClick={onClose}>\n <svg aria-hidden='true' focusable='false' width='20' height='20' viewBox='0 0 20 20'>\n <path d='M10,8.6L15.6,3L17,4.4L11.4,10L17,15.6L15.6,17L10,11.4L4.4,17L3,15.6L8.6,10L3,4.4L4.4,3L10,8.6Z' fill='currentColor' />\n </svg>\n </button>\n )\n\n if (thread) {\n ButtonComponent = (\n <button className='wc-header__hide' aria-label='Minimise the webchat' onClick={onClose}>\n <svg aria-hidden='true' focusable='false' width='20' height='20' viewBox='0 0 20 20'>\n <path d='M10 14.4l-7-7L4.4 6l5.6 5.6L15.6 6 17 7.4l-7 7z' fill='currentColor' />\n </svg>\n </button>\n )\n }\n\n return (\n <div className='wc-header'>\n <h2 id='wc-header-title' className='wc-header__title govuk-heading-s'>\n Floodline Webchat\n </h2>\n\n {ButtonComponent}\n </div>\n )\n}\n","import React, { useEffect, useState, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { PreChat } from '../screens/pre-chat.jsx'\nimport { RequestChat } from '../screens/request-chat.jsx'\nimport { Chat } from '../chat/chat.jsx'\nimport { Unavailable } from '../screens/unavailable.jsx'\nimport { EndChat } from '../screens/end-chat.jsx'\nimport { Settings } from '../screens/settings.jsx'\n\nimport { useApp } from '../../store/useApp.js'\nimport { useChatSdk } from '../../store/useChatSdk.js'\nimport { useFocusedElements } from '../../hooks/useFocusedElements.js'\n\nexport function Panel () {\n const { sdk, availability, thread, threadId, setThread, setThreadId, setChatVisibility, setMessages, setUnseenCount } = useApp()\n const { fetchThread, fetchMessages } = useChatSdk(sdk)\n\n const [screen, setScreen] = useState(threadId ? 2 : 0)\n\n useFocusedElements(screen)\n\n /**\n * Initializes the eventListener for pressing the escape key\n */\n useEffect(() => {\n const escapeKeyEvent = document.addEventListener('keydown', onEscapeKey)\n\n return () => {\n document.removeEventListener('keydown', escapeKeyEvent)\n }\n }, [])\n\n /**\n * Recovers the thread if there is a threadId but no thread loaded in to state\n */\n useEffect(() => {\n const recover = async () => {\n try {\n const fetchedThread = await fetchThread(threadId)\n setThread(fetchedThread)\n\n const fetchedMessages = await fetchMessages(fetchedThread, threadId)\n setMessages(fetchedMessages)\n } catch (err) {\n console.log('[Chat Error] fetchThread', err)\n\n setThreadId()\n setThread()\n setScreen(0)\n }\n }\n\n if (threadId) {\n if (thread) {\n thread.lastMessageSeen()\n setUnseenCount(0)\n setScreen(2)\n } else {\n recover()\n }\n }\n }, [thread, threadId])\n\n const onEscapeKey = useCallback(e => {\n if (e.key === 'Escape' || e.key === 'Esc') {\n setChatVisibility(false)\n }\n }, [])\n\n const handleScreenChange = newScreen => e => {\n e.preventDefault()\n setScreen(newScreen)\n }\n\n const onForward = handleScreenChange(screen + 1)\n const onBack = handleScreenChange(screen - 1)\n const onEndChat = handleScreenChange(3)\n const onResume = handleScreenChange(2)\n const onSettings = handleScreenChange(5)\n\n const onEndChatConfirm = e => {\n e.preventDefault()\n console.log('confirmed end chat')\n }\n\n let ScreenComponent\n\n switch (screen) {\n case 0:\n ScreenComponent = <PreChat onForward={onForward} />\n break\n case 1:\n ScreenComponent = <RequestChat onBack={onBack} />\n break\n case 2:\n ScreenComponent = <Chat onSettings={onSettings} onEndChat={onEndChat} />\n break\n case 3:\n ScreenComponent = <EndChat onResume={onResume} onEndChatConfirm={onEndChatConfirm} />\n break\n case 5:\n ScreenComponent = <Settings onCancel={onResume} />\n break\n default:\n ScreenComponent = <PreChat onForward={onForward} />\n }\n\n if (availability === 'UNAVAILABLE') {\n ScreenComponent = <Unavailable />\n }\n\n const Component = (\n <div id='wc-panel' role='dialog' className='wc-panel' tabIndex='-1' aria-modal='true' aria-labelledby='wc-header-title'>\n {ScreenComponent}\n </div>\n )\n\n return (\n <>\n {createPortal(Component, document.body)}\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function EndChat ({ onResume, onEndChatConfirm }) {\n return (\n <>\n <PanelHeader />\n <div className='wc-body'>\n <h3 className='govuk-heading-s' aria-live='polite'>Are you sure you want to end the chat?</h3>\n <div className='govuk-button-group'>\n <a href='#' className='govuk-button govuk-!-font-size-16' data-module='govuk-button' onClick={onEndChatConfirm}>Yes, end chat</a>\n <a href='#' className='govuk-link govuk-!-font-size-16' onClick={onResume}>No, resume chat</a>\n </div>\n </div>\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function PreChat ({ onForward }) {\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <h3 className='govuk-heading-s' aria-live='polite'>What you can use webchat for</h3>\n <p className='govuk-body-s'>Webchat lets you talk directly to a Floodline adviser.</p>\n\n <p className='govuk-body-s'>You can use webchat to get:</p>\n <ul className='govuk-list govuk-list--bullet govuk-body-s'>\n <li>current flood warnings and alerts in your area</li>\n <li>information on the flood warning service</li>\n <li>advice on what to do before, during and after a flood</li>\n </ul>\n\n <p className='govuk-body-s'>\n {\n 'There are other ways to '\n }\n <a className='govuk-link' href='https://www.gov.uk/sign-up-for-flood-warnings'>\n sign up for flood warnings\n </a>\n {\n ' and '\n }\n <a className='govuk-link' href='https://www.fws.environment-agency.gov.uk/app/olr/login'>\n manage your flood warnings account\n </a>.\n </p>\n <p className='govuk-body-s'>Do not use webchat to <a className='govuk-link' href='https://www.gov.uk/report-flood-cause'>report a flood</a>.</p>\n\n <button className='govuk-button govuk-!-font-size-16' data-module='govuk-button' onClick={onForward}>Continue</button>\n\n <h3 className='govuk-heading-s'>Other flood information</h3>\n\n <p className='govuk-body-s'>Call Floodline for all other flood and flood warning information.</p>\n <p className='govuk-body-s'>\n <strong>Floodline helpline</strong>\n <br />\n Telephone: 0345 988 1188\n <br />\n Textphone: 0345 602 6340\n <br />\n Open 24 hours a day, 7 days a week\n <br />\n <a className='govuk-link' href='https://gov.uk/call-charges'>Find out more about call charges</a>\n </p>\n </div>\n </>\n )\n}\n","import React, { useRef, useState, useEffect } from 'react'\nimport * as uuid from 'uuid'\n\nimport { classnames } from '../../lib/classnames.js'\nimport { PanelHeader } from '../panel/panel-header.jsx'\nimport { useApp } from '../../store/useApp.js'\nimport { useChatSdk } from '../../store/useChatSdk.js'\nimport { ErrorSummary } from '../errorSummary/error-summary.jsx'\n\nconst QUESTION_MAX_LENGTH = 500\n\nexport function RequestChat ({ onBack }) {\n const { sdk, setCustomerId, setThreadId, setThread } = useApp()\n const { fetchCustomerId, fetchThread } = useChatSdk(sdk)\n\n const [errors, setErrors] = useState({})\n const [questionLength, setQuestionLength] = useState(0)\n\n const nameRef = useRef()\n const questionRef = useRef()\n\n useEffect(() => {\n if (Object.keys(errors).length) {\n document.querySelector('.govuk-error-summary')?.focus()\n }\n }, [errors])\n\n const onQuestionChange = e => {\n setQuestionLength(e.target.value.length)\n }\n\n const onRequestChat = async e => {\n e.preventDefault()\n\n const errs = {}\n\n if (nameRef.current.value.length === 0) {\n errs.name = 'Enter your name'\n }\n\n if (questionRef.current.value.length === 0) {\n errs.question = 'Enter your question'\n }\n\n if (questionRef.current.value.length > QUESTION_MAX_LENGTH) {\n errs.question = 'Your question must be 500 characters or less'\n }\n\n if (Object.keys(errs).length === 0) {\n try {\n const threadId = uuid.v4()\n const customerId = await fetchCustomerId()\n const thread = await fetchThread(threadId)\n\n sdk.getCustomer().setName(nameRef.current.value)\n\n await thread.startChat(questionRef.current.value || 'Begin conversation')\n\n setCustomerId(customerId)\n setThreadId(threadId)\n setThread(thread)\n } catch (err) {\n console.log('[Request Chat Error]', err)\n }\n }\n\n setErrors(errs)\n }\n\n const isQuestionLengthValid = QUESTION_MAX_LENGTH >= questionLength\n const questionLengthRemaining = QUESTION_MAX_LENGTH - questionLength\n const questionLengthExceeded = questionLength - QUESTION_MAX_LENGTH\n\n let questionHint = `You have ${questionLengthRemaining} characters remaining`\n\n if (!isQuestionLengthValid) {\n questionHint = `You have ${questionLengthExceeded} characters too many`\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <a href='#' className='wc-back-link govuk-back-link' onClick={onBack}>\n What you can use webchat for\n </a>\n\n <ErrorSummary errors={errors} />\n\n <h3 className='govuk-heading-s' aria-live='polite'>\n Your name and question\n </h3>\n\n <form>\n <div className={classnames('govuk-form-group', errors.name && 'govuk-form-group--error')}>\n <label className='govuk-label' htmlFor='wc-name'>\n Your name\n </label>\n {errors.name && (\n <p className='govuk-error-message'>\n <span className='govuk-visually-hidden'>Error:</span> {errors.name}\n </p>\n )}\n <input\n ref={nameRef}\n className={classnames('govuk-input', errors.name && 'govuk-input--error')}\n id='wc-name'\n name='name'\n type='text'\n data-testid='request-chat-user-name'\n />\n </div>\n\n <div className='govuk-character-count' data-module='govuk-character-count' data-maxlength='500'>\n <div className={classnames('govuk-form-group', errors.question && 'govuk-form-group--error')}>\n <label className='govuk-label' htmlFor='wc-question'>\n Your question\n </label>\n {errors.question && (\n <p className='govuk-error-message'>\n <span className='govuk-visually-hidden'>Error:</span>\n {errors.question}\n </p>\n )}\n <textarea\n ref={questionRef}\n id='wc-question'\n name='question'\n rows='5'\n aria-describedby='wc-question-info'\n onChange={onQuestionChange}\n className={classnames('govuk-textarea', 'govuk-js-character-count', !isQuestionLengthValid || errors.question ? 'govuk-textarea--error' : '')}\n data-testid='request-chat-user-question'\n />\n <div id='wc-question-info' className='govuk-hint govuk-character-count__message' style={{ color: `${!isQuestionLengthValid ? '#d4351c' : ''}` }} aria-hidden='true'>\n {questionHint}\n </div>\n <div className='govuk-character-count__sr-status govuk-visually-hidden' aria-live='polite'>\n {questionHint}\n </div>\n </div>\n </div>\n\n <button\n className='govuk-button govuk-!-margin-top-1 govuk-!-font-size-16'\n data-module='govuk-button'\n onClick={onRequestChat}\n >\n Request chat\n </button>\n </form>\n </div>\n </>\n )\n}\n","import React, { useState } from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nimport { useApp } from '../../store/useApp.js'\n\nexport function Settings ({ onCancel }) {\n const { settings, setSettings } = useApp()\n\n const [optionAudio, setOptionAudio] = useState(settings.audio)\n const [optionScroll, setOptionScroll] = useState(settings.scroll)\n\n const onSave = e => {\n e.preventDefault()\n\n setSettings({ audio: optionAudio, scroll: optionScroll })\n onCancel(e)\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <fieldset className='govuk-fieldset govuk-!-margin-bottom-4'>\n <legend className='govuk-fieldset__legend govuk-fieldset__legend'>\n <h3 id='wc-subtitle' className='govuk-heading-s'>Change settings</h3>\n </legend>\n <div className='govuk-checkboxes govuk-checkboxes--small' data-module='govuk-checkboxes'>\n <div className='govuk-checkboxes__item'>\n <input\n id='audio'\n name='audio'\n type='checkbox'\n value='audio'\n className='govuk-checkboxes__input'\n defaultChecked={optionAudio}\n onChange={() => setOptionAudio(!optionAudio)}\n />\n <label className='govuk-label govuk-checkboxes__label govuk-!-font-size-16' htmlFor='audio'>\n Play a sound when receiving a new message\n </label>\n </div>\n <div className='govuk-checkboxes__item'>\n <input\n id='scroll'\n name='scroll'\n type='checkbox'\n value='scroll'\n className='govuk-checkboxes__input'\n defaultChecked={optionScroll}\n onChange={() => setOptionScroll(!optionScroll)}\n />\n <label className='govuk-label govuk-checkboxes__label govuk-!-font-size-16' htmlFor='scroll'>\n Scroll automatically to a new message\n </label>\n </div>\n </div>\n </fieldset>\n\n <div className='govuk-button-group'>\n <a id='settings-save' href='#' className='govuk-button govuk-!-font-size-16' data-module='govuk-button' onClick={onSave}>Save</a>\n <a id='settings-cancel' href='#' className='govuk-link govuk-!-font-size-16' data-module='govuk-button' onClick={onCancel}>Cancel</a>\n </div>\n </div>\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function Unavailable () {\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <h3 id='wc-subtitle' className='govuk-heading-m'>Webchat is currently not available</h3>\n <p className='govuk-body-s'>Try again later, or call Floodline:</p>\n <p className='govuk-body-s'>\n <strong>Floodline helpline</strong>\n <br />Telephone: 0345 988 1188\n <br />Textphone: 0345 602 6340\n <br />Open 24 hours a day, 7 days a week\n <br /><a className='govuk-link' href='https://gov.uk/call-charges'>Find out more about call charges</a>\n </p>\n <p className='govuk-body-s'>We're running webchat as a trial, it will not always be available.</p>\n </div>\n </>\n )\n}\n","import { useState, useEffect, useCallback } from 'react'\n\nconst setAriaHidden = bool => {\n for (const node of document.body.children) {\n if (node.id !== 'wc-panel') {\n (bool) ? node.setAttribute('aria-hidden', 'true') : node.removeAttribute('aria-hidden')\n }\n }\n}\n\nexport const getFocusableElements = () => {\n const selectors = [\n '#wc-panel a:not([disabled])',\n '#wc-panel button:not([disabled])',\n '#wc-panel select:not([disabled])',\n '#wc-panel input:not([disabled])',\n '#wc-panel textarea:not([disabled])',\n '#wc-panel *[tabindex=\"0\"]:not([disabled])'\n ]\n\n const elements = document.body.querySelectorAll(selectors.join(','))\n return Array.from(elements).filter(e => !e.closest('[hidden]') && !e.closest('[aria-hidden=\"true\"]'))\n}\n\nconst useFocusedElements = screen => {\n const [panelElements, setPanelElements] = useState([])\n\n const onKeyDown = useCallback(e => {\n const webchatPanelElement = document.querySelector('#wc-panel')\n\n if (e.key === 'Tab') {\n if (webchatPanelElement && !document.activeElement.closest('#wc-panel')) {\n webchatPanelElement.focus()\n }\n\n if (e.shiftKey) {\n if (document.activeElement === panelElements[0]) {\n panelElements[panelElements.length - 1].focus()\n e.preventDefault()\n } else if (document.activeElement === document.querySelector('#wc-panel')) {\n panelElements[panelElements.length - 1]?.focus()\n e.preventDefault()\n }\n } else if (document.activeElement === panelElements[panelElements.length - 1]) {\n panelElements[0].focus()\n e.preventDefault()\n }\n }\n }, [panelElements])\n\n useEffect(() => {\n setPanelElements(getFocusableElements())\n }, [screen])\n\n useEffect(() => {\n setAriaHidden(true)\n\n const panelElement = document.querySelector('#wc-panel')\n panelElement.focus()\n\n document.addEventListener('keydown', onKeyDown)\n\n return () => {\n setAriaHidden()\n document.body.querySelector('.wc-availability__link')?.focus()\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [panelElements])\n}\n\nexport { useFocusedElements }\n","import { useEffect } from 'react'\n\nexport const useTextareaAutosize = (textAreaRef, value) => {\n useEffect(() => {\n if (textAreaRef) {\n textAreaRef.style.height = '0px'\n\n const scrollHeight = textAreaRef.scrollHeight\n\n textAreaRef.style.height = `${scrollHeight}px`\n }\n }, [textAreaRef, value])\n}\n","export async function checkAvailability (endpoint) {\n const response = await fetch(endpoint)\n const data = await response.json()\n\n return {\n availability: data.availability || 'UNAVAILABLE'\n }\n}\n","export const classnames = (...classes) => classes.filter(classname => classname && typeof classname === 'string').join(' ')\n","export const messageNotification = audioUrl => {\n let buffer\n\n const context = new (window.AudioContext || window.webkitAudioContext)()\n\n if (context.state === 'suspended') {\n const events = ['touchstart', 'touchend', 'mousedown', 'wheel', 'keydown', 'click']\n\n const unlock = _e => {\n events.forEach(event => {\n document.body.removeEventListener(event, unlock)\n })\n\n context.resume()\n }\n\n events.forEach(event => {\n document.body.addEventListener(event, unlock, false)\n })\n }\n\n fetch(audioUrl)\n .then(response => response.arrayBuffer())\n .then(data => context.decodeAudioData(data))\n .then(decodedData => {\n buffer = decodedData\n })\n .catch(console.error)\n\n return () => {\n const source = context.createBufferSource()\n source.buffer = buffer\n source.connect(context.destination)\n source.start()\n }\n}\n","import * as uuid from 'uuid'\nimport sanitizeHtml from 'sanitize-html'\nimport { DateTime } from 'luxon'\n\nexport const transformMessage = message => {\n return {\n id: message.id,\n text: sanitizeHtml(message.messageContent?.text),\n createdAt: new Date(message.createdAt),\n user: message.authorEndUserIdentity?.fullName?.trim() || null,\n assignee: message.authorUser?.firstName || null,\n direction: message.direction\n }\n}\n\nexport const transformMessages = messages => messages.map(message => transformMessage(message))\n\nexport const formatTranscript = messages => {\n const now = DateTime.local()\n now.setZone('Europe/London')\n\n let string = `Floodline webchat transcript, ${now.toFormat('HH:mm:ss a, dd LLLL yyyy')}, (ID: ${uuid.v4().split('-')[0]})\\n\\n`\n\n for (const message of messages) {\n const { text, direction, user, assignee, createdAt } = message\n\n const author = direction === 'inbound' ? user : `${assignee} (Floodline adviser)`\n const date = DateTime.fromJSDate(new Date(createdAt)).setZone('Europe/London').toFormat('HH:mm:ss a, dd LLLL yyyy')\n\n string += `[${date}] ${author}: \\n${text}\\n\\n`\n }\n\n string = string.replace(/<a\\b[^>]*>/i, '').replace(/<\\/a>/i, '')\n\n return encodeURIComponent(string)\n}\n","import React, { createContext, useEffect, useReducer, useMemo } from 'react'\nimport { ChatEvent } from '@nice-devone/nice-cxone-chat-web-sdk'\n\nimport { messageNotification } from '../lib/message-notification.js'\n\nimport { initialState, reducer } from './reducer.js'\nimport { CUSTOMER_ID_STORAGE_KEY, THREAD_ID_STORAGE_KEY, SETTINGS_STORAGE_KEY } from './constants.js'\n\nexport const AppContext = createContext(initialState)\n\nexport const AppProvider = ({ sdk, availability, options, children }) => {\n const [state, dispatch] = useReducer(reducer, initialState)\n\n const playSound = messageNotification(options.audioUrl)\n\n /**\n * SDK event handlers\n */\n const onLiveChatRecovered = e => {\n dispatch({ type: 'SET_AGENT', payload: e.detail.data.inboxAssignee })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.contact.status })\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: e.detail.data.contact.customerStatistics.unseenMessagesCount })\n }\n\n const onAssignedAgentChanged = e => {\n dispatch({ type: 'SET_AGENT', payload: e.detail.data.inboxAssignee })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n }\n\n const onAgentTypingStarted = () => {\n dispatch({ type: 'SET_AGENT_TYPING', payload: true })\n }\n\n const onAgentTypingEnded = () => {\n dispatch({ type: 'SET_AGENT_TYPING', payload: false })\n }\n\n const onMessageCreated = e => {\n dispatch({ type: 'SET_MESSAGE', payload: e.detail.data.message })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: e.detail.data.case.customerStatistics.unseenMessagesCount })\n\n const isAudioOn = JSON.parse(window.localStorage.getItem(SETTINGS_STORAGE_KEY)).audio\n\n if (isAudioOn && e.detail.data.message.direction === 'outbound') {\n playSound()\n }\n }\n\n const onContactStatusChanged = e => {\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n }\n\n useEffect(() => {\n sdk.onChatEvent(ChatEvent.LIVECHAT_RECOVERED, onLiveChatRecovered)\n sdk.onChatEvent(ChatEvent.MESSAGE_CREATED, onMessageCreated)\n sdk.onChatEvent(ChatEvent.AGENT_TYPING_STARTED, onAgentTypingStarted)\n sdk.onChatEvent(ChatEvent.AGENT_TYPING_ENDED, onAgentTypingEnded)\n sdk.onChatEvent(ChatEvent.ASSIGNED_AGENT_CHANGED, onAssignedAgentChanged)\n sdk.onChatEvent(ChatEvent.CONTACT_STATUS_CHANGED, onContactStatusChanged)\n }, [sdk])\n\n /**\n * Initialize customerId, threadId and whether the webchat should be open\n */\n useEffect(() => {\n dispatch({ type: 'SET_AVAILABILITY', payload: availability })\n\n setCustomerId(window.localStorage.getItem(CUSTOMER_ID_STORAGE_KEY))\n setThreadId(window.localStorage.getItem(THREAD_ID_STORAGE_KEY))\n setSettings(JSON.parse(window.localStorage.getItem(SETTINGS_STORAGE_KEY)) || state.settings)\n\n if (window.location.hash === '#webchat') {\n setChatVisibility(true)\n }\n }, [])\n\n /**\n * State update functions\n */\n const setChatVisibility = payload => {\n if (!payload) {\n window.location.hash = ''\n }\n\n dispatch({ type: 'SET_CHAT_VISIBILITY', payload })\n }\n\n const setCustomerId = customerId => {\n dispatch({ type: 'SET_CUSTOMER_ID', payload: customerId })\n }\n\n const setThreadId = threadId => {\n dispatch({ type: 'SET_THREAD_ID', payload: threadId })\n }\n\n const setThread = thread => {\n dispatch({ type: 'SET_THREAD', payload: thread })\n }\n\n const setMessages = messages => {\n dispatch({ type: 'SET_MESSAGES', payload: messages })\n }\n\n const setSettings = data => {\n dispatch({ type: 'SET_SETTINGS', payload: data })\n }\n\n const setUnseenCount = unseenCount => {\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: unseenCount })\n }\n\n /**\n * Application-wide state and state functions\n */\n const store = useMemo(() => ({\n ...state,\n sdk,\n setSettings,\n setCustomerId,\n setThreadId,\n setThread,\n setMessages,\n setUnseenCount,\n setChatVisibility,\n onLiveChatRecovered,\n onAssignedAgentChanged,\n onAgentTypingStarted,\n onAgentTypingEnded,\n onMessageCreated,\n onContactStatusChanged\n }))\n\n return (\n <AppContext.Provider value={store}>\n {children}\n </AppContext.Provider>\n )\n}\n","import { transformMessages, transformMessage } from '../lib/transform-messages'\nimport { CUSTOMER_ID_STORAGE_KEY, THREAD_ID_STORAGE_KEY, SETTINGS_STORAGE_KEY } from './constants'\n\nconst setSettings = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(SETTINGS_STORAGE_KEY, JSON.stringify(payload))\n } else {\n window.localStorage.removeItem(SETTINGS_STORAGE_KEY)\n }\n\n return {\n ...state,\n settings: payload\n }\n}\n\nconst setCustomerId = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(CUSTOMER_ID_STORAGE_KEY, payload)\n } else {\n window.localStorage.removeItem(CUSTOMER_ID_STORAGE_KEY)\n }\n\n return {\n ...state,\n customerId: payload\n }\n}\n\nconst setThreadId = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(THREAD_ID_STORAGE_KEY, payload)\n } else {\n window.localStorage.removeItem(THREAD_ID_STORAGE_KEY)\n }\n\n return {\n ...state,\n threadId: payload\n }\n}\n\nconst setChatVisibility = (state, payload) => {\n return {\n ...state,\n isChatOpen: payload\n }\n}\n\nconst setAvailability = (state, payload) => {\n return {\n ...state,\n availability: payload\n }\n}\n\nconst setThread = (state, payload) => {\n return {\n ...state,\n thread: payload\n }\n}\n\nconst setMessage = (state, payload) => {\n return {\n ...state,\n messages: [...state.messages, transformMessage(payload)]\n }\n}\n\nconst setMessages = (state, payload) => {\n return {\n ...state,\n messages: transformMessages(payload).reverse()\n }\n}\n\nconst setAgent = (state, payload) => {\n return {\n ...state,\n agent: payload\n }\n}\n\nconst setAgentIsTyping = (state, payload) => {\n return {\n ...state,\n isAgentTyping: payload\n }\n}\n\nconst setAgentStatus = (state, payload) => {\n return {\n ...state,\n agentStatus: payload\n }\n}\n\nconst setUnseenCount = (state, payload) => {\n return {\n ...state,\n unseenCount: payload\n }\n}\n\nexport const actionsMap = {\n SET_CHAT_VISIBILITY: setChatVisibility,\n SET_AVAILABILITY: setAvailability,\n SET_SETTINGS: setSettings,\n SET_CUSTOMER_ID: setCustomerId,\n SET_THREAD_ID: setThreadId,\n SET_THREAD: setThread,\n SET_MESSAGE: setMessage,\n SET_MESSAGES: setMessages,\n SET_AGENT: setAgent,\n SET_AGENT_TYPING: setAgentIsTyping,\n SET_AGENT_STATUS: setAgentStatus,\n SET_UNSEEN_COUNT: setUnseenCount\n}\n","export const SETTINGS_STORAGE_KEY = 'webchat_settings'\nexport const CUSTOMER_ID_STORAGE_KEY = 'webchat_customer_id'\nexport const THREAD_ID_STORAGE_KEY = 'webchat_thread_id'\n","import { actionsMap } from './actions-map'\n\nexport const initialState = {\n availability: null,\n customerId: null,\n threadId: null,\n thread: null,\n messages: [],\n unseenCount: 0,\n agent: null,\n agentStatus: null,\n isAgentTyping: false,\n isChatOpen: false,\n settings: { audio: true, scroll: true }\n}\n\nexport const reducer = (state, action) => {\n const { type, payload } = action\n\n const fn = actionsMap[type]\n\n if (fn) {\n const actionFunction = fn.bind(this, state, payload)\n return actionFunction()\n }\n\n return state\n}\n","import { useContext } from 'react'\n\nimport { AppContext } from './AppProvider.jsx'\n\nexport const useApp = () => useContext(AppContext)\n","export const useChatSdk = sdk => {\n const connect = async () => sdk.authorize()\n\n const fetchCustomerId = async () => {\n const response = await connect()\n return response?.consumerIdentity.idOnExternalPlatform\n }\n\n const fetchThread = async threadId => {\n await connect()\n return sdk.getThread(threadId)\n }\n\n const fetchMessages = async (thread, threadId) => {\n await connect()\n\n const recovered = await thread.recover(threadId)\n\n const allMessages = []\n let fetchedMessages = recovered.messages\n\n while (fetchedMessages.length) {\n fetchedMessages.map(msg => allMessages.push(msg))\n\n try {\n const response = await thread.loadMoreMessages()\n fetchedMessages = response.data.messages\n } catch (err) {\n fetchedMessages = []\n }\n }\n\n return allMessages\n }\n\n return { connect, fetchCustomerId, fetchThread, fetchMessages }\n}\n","module.exports = require(\"@nice-devone/nice-cxone-chat-web-sdk\");","module.exports = require(\"luxon\");","module.exports = require(\"react\");","module.exports = require(\"react-dom\");","module.exports = require(\"react-dom/client\");","module.exports = require(\"sanitize-html\");","module.exports = require(\"uuid\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { ChatSdk } from '@nice-devone/nice-cxone-chat-web-sdk'\nimport { Availability } from './components/availability/availability.jsx'\nimport { checkAvailability } from './lib/check-availability'\nimport { AppProvider } from './store/AppProvider.jsx'\nimport { CUSTOMER_ID_STORAGE_KEY } from './store/constants.js'\n\nexport async function init (container, options) {\n const sdk = new ChatSdk({\n brandId: options.brandId,\n channelId: options.channelId,\n customerId: window.localStorage.getItem(CUSTOMER_ID_STORAGE_KEY) || '',\n environment: options.environment\n })\n\n const root = createRoot(container)\n let availability\n try {\n const result = await checkAvailability(options.availabilityEndpoint)\n availability = result.availability\n } catch (e) {\n availability = 'UNAVAILABLE'\n }\n root.render(\n <AppProvider sdk={sdk} availability={availability} options={options}>\n <Availability />\n </AppProvider>\n )\n}\n"],"names":["React","useEffect","useRef","useState","classnames","Panel","useApp","Availability","availability","messages","isChatOpen","setChatVisibility","unseenCount","isFixed","setIsFixed","buttonRef","onClick","onKeyDown","event","key","preventDefault","onKeyUp","intersectionCallback","entries","entry","isBelowFold","isIntersecting","boundingClientRect","top","observer","window","IntersectionObserver","rootMargin","parentElement","current","observe","unobserve","document","documentElement","classList","toggle","body","TextComponent","createElement","Fragment","length","className","ref","href","draggable","sanitizeHtml","PanelHeader","PanelFooter","Message","useTextareaAutosize","formatTranscript","Chat","onEndChat","onSettings","thread","agent","agentStatus","isAgentTyping","settings","userMessage","setUserMessage","messageRef","scroll","chatBody","querySelector","scrollTop","scrollHeight","label","remove","add","onChange","e","target","value","agentName","nickname","firstName","connectionHeadlineText","sendMessage","sendTextMessage","trim","err","console","log","saveChat","transcript","saveChatLink","setAttribute","click","map","msg","index","id","message","previousMessage","width","height","x","y","viewBox","stroke","cx","cy","r","fill","noValidate","htmlFor","rows","name","type","download","ErrorSummary","errors","errs","Object","keys","goToInput","getAttribute","focus","tabIndex","role","outbound","direction","messageOwnerSameAsPrevious","assignee","text","children","setUnseenCount","onClose","lastMessageSeen","ButtonComponent","focusable","d","useCallback","createPortal","PreChat","RequestChat","Unavailable","EndChat","Settings","useChatSdk","useFocusedElements","sdk","threadId","setThread","setThreadId","setMessages","fetchThread","fetchMessages","screen","setScreen","escapeKeyEvent","addEventListener","onEscapeKey","removeEventListener","recover","fetchedThread","fetchedMessages","handleScreenChange","newScreen","onForward","onBack","onResume","onEndChatConfirm","ScreenComponent","onCancel","Component","uuid","QUESTION_MAX_LENGTH","setCustomerId","fetchCustomerId","setErrors","questionLength","setQuestionLength","nameRef","questionRef","onQuestionChange","onRequestChat","question","v4","customerId","getCustomer","setName","startChat","isQuestionLengthValid","questionLengthRemaining","questionLengthExceeded","questionHint","style","color","setSettings","optionAudio","setOptionAudio","audio","optionScroll","setOptionScroll","onSave","defaultChecked","setAriaHidden","bool","node","removeAttribute","getFocusableElements","selectors","elements","querySelectorAll","join","Array","from","filter","closest","panelElements","setPanelElements","webchatPanelElement","activeElement","shiftKey","panelElement","textAreaRef","checkAvailability","endpoint","response","fetch","data","json","classes","classname","messageNotification","audioUrl","buffer","context","AudioContext","webkitAudioContext","state","events","unlock","_e","forEach","resume","then","arrayBuffer","decodeAudioData","decodedData","catch","error","source","createBufferSource","connect","destination","start","DateTime","transformMessage","messageContent","createdAt","Date","user","authorEndUserIdentity","fullName","authorUser","transformMessages","now","local","setZone","string","toFormat","split","author","date","fromJSDate","replace","encodeURIComponent","createContext","useReducer","useMemo","ChatEvent","initialState","reducer","CUSTOMER_ID_STORAGE_KEY","THREAD_ID_STORAGE_KEY","SETTINGS_STORAGE_KEY","AppContext","AppProvider","options","dispatch","playSound","onLiveChatRecovered","payload","detail","inboxAssignee","contact","status","customerStatistics","unseenMessagesCount","onAssignedAgentChanged","case","onAgentTypingStarted","onAgentTypingEnded","onMessageCreated","isAudioOn","JSON","parse","localStorage","getItem","onContactStatusChanged","onChatEvent","LIVECHAT_RECOVERED","MESSAGE_CREATED","AGENT_TYPING_STARTED","AGENT_TYPING_ENDED","ASSIGNED_AGENT_CHANGED","CONTACT_STATUS_CHANGED","location","hash","store","Provider","setItem","stringify","removeItem","setAvailability","setMessage","reverse","setAgent","setAgentIsTyping","setAgentStatus","actionsMap","SET_CHAT_VISIBILITY","SET_AVAILABILITY","SET_SETTINGS","SET_CUSTOMER_ID","SET_THREAD_ID","SET_THREAD","SET_MESSAGE","SET_MESSAGES","SET_AGENT","SET_AGENT_TYPING","SET_AGENT_STATUS","SET_UNSEEN_COUNT","action","fn","actionFunction","bind","useContext","authorize","consumerIdentity","idOnExternalPlatform","getThread","recovered","allMessages","push","loadMoreMessages","createRoot","ChatSdk","init","container","brandId","channelId","environment","root","result","availabilityEndpoint","render"],"sourceRoot":""}
|
package/package.json
CHANGED
|
@@ -9,8 +9,8 @@ import { useApp } from '../../store/useApp.js'
|
|
|
9
9
|
import { useTextareaAutosize } from '../../hooks/useTextareaAutosize.js'
|
|
10
10
|
import { formatTranscript } from '../../lib/transform-messages.js'
|
|
11
11
|
|
|
12
|
-
export function Chat ({ onEndChat }) {
|
|
13
|
-
const { availability, thread, messages, agent, agentStatus, isAgentTyping } = useApp()
|
|
12
|
+
export function Chat ({ onEndChat, onSettings }) {
|
|
13
|
+
const { availability, thread, messages, agent, agentStatus, isAgentTyping, settings } = useApp()
|
|
14
14
|
|
|
15
15
|
const [userMessage, setUserMessage] = useState('')
|
|
16
16
|
|
|
@@ -19,7 +19,7 @@ export function Chat ({ onEndChat }) {
|
|
|
19
19
|
useTextareaAutosize(messageRef.current, userMessage)
|
|
20
20
|
|
|
21
21
|
useEffect(() => {
|
|
22
|
-
if (messages.length !== 0) {
|
|
22
|
+
if (settings.scroll && messages.length !== 0) {
|
|
23
23
|
const chatBody = document.querySelector('.wc-body')
|
|
24
24
|
chatBody.scrollTop = chatBody.scrollHeight
|
|
25
25
|
}
|
|
@@ -146,8 +146,10 @@ export function Chat ({ onEndChat }) {
|
|
|
146
146
|
<div className='wc-footer__settings'>
|
|
147
147
|
<a
|
|
148
148
|
href='#'
|
|
149
|
+
id='wc-settings'
|
|
149
150
|
className='wc-footer__settings-link'
|
|
150
151
|
data-module='govuk-button'
|
|
152
|
+
onClick={onSettings}
|
|
151
153
|
>
|
|
152
154
|
Settings
|
|
153
155
|
</a>
|
|
@@ -6,6 +6,7 @@ import { RequestChat } from '../screens/request-chat.jsx'
|
|
|
6
6
|
import { Chat } from '../chat/chat.jsx'
|
|
7
7
|
import { Unavailable } from '../screens/unavailable.jsx'
|
|
8
8
|
import { EndChat } from '../screens/end-chat.jsx'
|
|
9
|
+
import { Settings } from '../screens/settings.jsx'
|
|
9
10
|
|
|
10
11
|
import { useApp } from '../../store/useApp.js'
|
|
11
12
|
import { useChatSdk } from '../../store/useChatSdk.js'
|
|
@@ -76,6 +77,7 @@ export function Panel () {
|
|
|
76
77
|
const onBack = handleScreenChange(screen - 1)
|
|
77
78
|
const onEndChat = handleScreenChange(3)
|
|
78
79
|
const onResume = handleScreenChange(2)
|
|
80
|
+
const onSettings = handleScreenChange(5)
|
|
79
81
|
|
|
80
82
|
const onEndChatConfirm = e => {
|
|
81
83
|
e.preventDefault()
|
|
@@ -92,11 +94,14 @@ export function Panel () {
|
|
|
92
94
|
ScreenComponent = <RequestChat onBack={onBack} />
|
|
93
95
|
break
|
|
94
96
|
case 2:
|
|
95
|
-
ScreenComponent = <Chat
|
|
97
|
+
ScreenComponent = <Chat onSettings={onSettings} onEndChat={onEndChat} />
|
|
96
98
|
break
|
|
97
99
|
case 3:
|
|
98
100
|
ScreenComponent = <EndChat onResume={onResume} onEndChatConfirm={onEndChatConfirm} />
|
|
99
101
|
break
|
|
102
|
+
case 5:
|
|
103
|
+
ScreenComponent = <Settings onCancel={onResume} />
|
|
104
|
+
break
|
|
100
105
|
default:
|
|
101
106
|
ScreenComponent = <PreChat onForward={onForward} />
|
|
102
107
|
}
|
|
@@ -106,7 +111,7 @@ export function Panel () {
|
|
|
106
111
|
}
|
|
107
112
|
|
|
108
113
|
const Component = (
|
|
109
|
-
<div id='wc-panel' className='wc-panel'
|
|
114
|
+
<div id='wc-panel' role='dialog' className='wc-panel' tabIndex='-1' aria-modal='true' aria-labelledby='wc-header-title'>
|
|
110
115
|
{ScreenComponent}
|
|
111
116
|
</div>
|
|
112
117
|
)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import React, { useState } from 'react'
|
|
2
|
+
import { PanelHeader } from '../panel/panel-header.jsx'
|
|
3
|
+
|
|
4
|
+
import { useApp } from '../../store/useApp.js'
|
|
5
|
+
|
|
6
|
+
export function Settings ({ onCancel }) {
|
|
7
|
+
const { settings, setSettings } = useApp()
|
|
8
|
+
|
|
9
|
+
const [optionAudio, setOptionAudio] = useState(settings.audio)
|
|
10
|
+
const [optionScroll, setOptionScroll] = useState(settings.scroll)
|
|
11
|
+
|
|
12
|
+
const onSave = e => {
|
|
13
|
+
e.preventDefault()
|
|
14
|
+
|
|
15
|
+
setSettings({ audio: optionAudio, scroll: optionScroll })
|
|
16
|
+
onCancel(e)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<>
|
|
21
|
+
<PanelHeader />
|
|
22
|
+
|
|
23
|
+
<div className='wc-body'>
|
|
24
|
+
<fieldset className='govuk-fieldset govuk-!-margin-bottom-4'>
|
|
25
|
+
<legend className='govuk-fieldset__legend govuk-fieldset__legend'>
|
|
26
|
+
<h3 id='wc-subtitle' className='govuk-heading-s'>Change settings</h3>
|
|
27
|
+
</legend>
|
|
28
|
+
<div className='govuk-checkboxes govuk-checkboxes--small' data-module='govuk-checkboxes'>
|
|
29
|
+
<div className='govuk-checkboxes__item'>
|
|
30
|
+
<input
|
|
31
|
+
id='audio'
|
|
32
|
+
name='audio'
|
|
33
|
+
type='checkbox'
|
|
34
|
+
value='audio'
|
|
35
|
+
className='govuk-checkboxes__input'
|
|
36
|
+
defaultChecked={optionAudio}
|
|
37
|
+
onChange={() => setOptionAudio(!optionAudio)}
|
|
38
|
+
/>
|
|
39
|
+
<label className='govuk-label govuk-checkboxes__label govuk-!-font-size-16' htmlFor='audio'>
|
|
40
|
+
Play a sound when receiving a new message
|
|
41
|
+
</label>
|
|
42
|
+
</div>
|
|
43
|
+
<div className='govuk-checkboxes__item'>
|
|
44
|
+
<input
|
|
45
|
+
id='scroll'
|
|
46
|
+
name='scroll'
|
|
47
|
+
type='checkbox'
|
|
48
|
+
value='scroll'
|
|
49
|
+
className='govuk-checkboxes__input'
|
|
50
|
+
defaultChecked={optionScroll}
|
|
51
|
+
onChange={() => setOptionScroll(!optionScroll)}
|
|
52
|
+
/>
|
|
53
|
+
<label className='govuk-label govuk-checkboxes__label govuk-!-font-size-16' htmlFor='scroll'>
|
|
54
|
+
Scroll automatically to a new message
|
|
55
|
+
</label>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
</fieldset>
|
|
59
|
+
|
|
60
|
+
<div className='govuk-button-group'>
|
|
61
|
+
<a id='settings-save' href='#' className='govuk-button govuk-!-font-size-16' data-module='govuk-button' onClick={onSave}>Save</a>
|
|
62
|
+
<a id='settings-cancel' href='#' className='govuk-link govuk-!-font-size-16' data-module='govuk-button' onClick={onCancel}>Cancel</a>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
</>
|
|
66
|
+
)
|
|
67
|
+
}
|
package/src/client/index.jsx
CHANGED
|
@@ -4,7 +4,7 @@ import { ChatSdk } from '@nice-devone/nice-cxone-chat-web-sdk'
|
|
|
4
4
|
import { Availability } from './components/availability/availability.jsx'
|
|
5
5
|
import { checkAvailability } from './lib/check-availability'
|
|
6
6
|
import { AppProvider } from './store/AppProvider.jsx'
|
|
7
|
-
import { CUSTOMER_ID_STORAGE_KEY } from './store/
|
|
7
|
+
import { CUSTOMER_ID_STORAGE_KEY } from './store/constants.js'
|
|
8
8
|
|
|
9
9
|
export async function init (container, options) {
|
|
10
10
|
const sdk = new ChatSdk({
|
|
@@ -23,8 +23,8 @@ export async function init (container, options) {
|
|
|
23
23
|
availability = 'UNAVAILABLE'
|
|
24
24
|
}
|
|
25
25
|
root.render(
|
|
26
|
-
<AppProvider sdk={sdk} availability={availability}>
|
|
27
|
-
<Availability
|
|
26
|
+
<AppProvider sdk={sdk} availability={availability} options={options}>
|
|
27
|
+
<Availability />
|
|
28
28
|
</AppProvider>
|
|
29
29
|
)
|
|
30
30
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export const messageNotification = audioUrl => {
|
|
2
|
+
let buffer
|
|
3
|
+
|
|
4
|
+
const context = new (window.AudioContext || window.webkitAudioContext)()
|
|
5
|
+
|
|
6
|
+
if (context.state === 'suspended') {
|
|
7
|
+
const events = ['touchstart', 'touchend', 'mousedown', 'wheel', 'keydown', 'click']
|
|
8
|
+
|
|
9
|
+
const unlock = _e => {
|
|
10
|
+
events.forEach(event => {
|
|
11
|
+
document.body.removeEventListener(event, unlock)
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
context.resume()
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
events.forEach(event => {
|
|
18
|
+
document.body.addEventListener(event, unlock, false)
|
|
19
|
+
})
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
fetch(audioUrl)
|
|
23
|
+
.then(response => response.arrayBuffer())
|
|
24
|
+
.then(data => context.decodeAudioData(data))
|
|
25
|
+
.then(decodedData => {
|
|
26
|
+
buffer = decodedData
|
|
27
|
+
})
|
|
28
|
+
.catch(console.error)
|
|
29
|
+
|
|
30
|
+
return () => {
|
|
31
|
+
const source = context.createBufferSource()
|
|
32
|
+
source.buffer = buffer
|
|
33
|
+
source.connect(context.destination)
|
|
34
|
+
source.start()
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import React, { createContext, useEffect, useReducer, useMemo } from 'react'
|
|
2
2
|
import { ChatEvent } from '@nice-devone/nice-cxone-chat-web-sdk'
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { messageNotification } from '../lib/message-notification.js'
|
|
5
|
+
|
|
6
|
+
import { initialState, reducer } from './reducer.js'
|
|
7
|
+
import { CUSTOMER_ID_STORAGE_KEY, THREAD_ID_STORAGE_KEY, SETTINGS_STORAGE_KEY } from './constants.js'
|
|
5
8
|
|
|
6
9
|
export const AppContext = createContext(initialState)
|
|
7
10
|
|
|
8
|
-
export const AppProvider = ({ sdk, availability, children }) => {
|
|
11
|
+
export const AppProvider = ({ sdk, availability, options, children }) => {
|
|
9
12
|
const [state, dispatch] = useReducer(reducer, initialState)
|
|
10
13
|
|
|
14
|
+
const playSound = messageNotification(options.audioUrl)
|
|
15
|
+
|
|
11
16
|
/**
|
|
12
17
|
* SDK event handlers
|
|
13
18
|
*/
|
|
@@ -34,6 +39,12 @@ export const AppProvider = ({ sdk, availability, children }) => {
|
|
|
34
39
|
dispatch({ type: 'SET_MESSAGE', payload: e.detail.data.message })
|
|
35
40
|
dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })
|
|
36
41
|
dispatch({ type: 'SET_UNSEEN_COUNT', payload: e.detail.data.case.customerStatistics.unseenMessagesCount })
|
|
42
|
+
|
|
43
|
+
const isAudioOn = JSON.parse(window.localStorage.getItem(SETTINGS_STORAGE_KEY)).audio
|
|
44
|
+
|
|
45
|
+
if (isAudioOn && e.detail.data.message.direction === 'outbound') {
|
|
46
|
+
playSound()
|
|
47
|
+
}
|
|
37
48
|
}
|
|
38
49
|
|
|
39
50
|
const onContactStatusChanged = e => {
|
|
@@ -57,6 +68,7 @@ export const AppProvider = ({ sdk, availability, children }) => {
|
|
|
57
68
|
|
|
58
69
|
setCustomerId(window.localStorage.getItem(CUSTOMER_ID_STORAGE_KEY))
|
|
59
70
|
setThreadId(window.localStorage.getItem(THREAD_ID_STORAGE_KEY))
|
|
71
|
+
setSettings(JSON.parse(window.localStorage.getItem(SETTINGS_STORAGE_KEY)) || state.settings)
|
|
60
72
|
|
|
61
73
|
if (window.location.hash === '#webchat') {
|
|
62
74
|
setChatVisibility(true)
|
|
@@ -90,6 +102,10 @@ export const AppProvider = ({ sdk, availability, children }) => {
|
|
|
90
102
|
dispatch({ type: 'SET_MESSAGES', payload: messages })
|
|
91
103
|
}
|
|
92
104
|
|
|
105
|
+
const setSettings = data => {
|
|
106
|
+
dispatch({ type: 'SET_SETTINGS', payload: data })
|
|
107
|
+
}
|
|
108
|
+
|
|
93
109
|
const setUnseenCount = unseenCount => {
|
|
94
110
|
dispatch({ type: 'SET_UNSEEN_COUNT', payload: unseenCount })
|
|
95
111
|
}
|
|
@@ -100,6 +116,7 @@ export const AppProvider = ({ sdk, availability, children }) => {
|
|
|
100
116
|
const store = useMemo(() => ({
|
|
101
117
|
...state,
|
|
102
118
|
sdk,
|
|
119
|
+
setSettings,
|
|
103
120
|
setCustomerId,
|
|
104
121
|
setThreadId,
|
|
105
122
|
setThread,
|
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
import { transformMessages, transformMessage } from '../lib/transform-messages'
|
|
2
|
-
import { CUSTOMER_ID_STORAGE_KEY, THREAD_ID_STORAGE_KEY } from './
|
|
2
|
+
import { CUSTOMER_ID_STORAGE_KEY, THREAD_ID_STORAGE_KEY, SETTINGS_STORAGE_KEY } from './constants'
|
|
3
|
+
|
|
4
|
+
const setSettings = (state, payload) => {
|
|
5
|
+
if (payload) {
|
|
6
|
+
window.localStorage.setItem(SETTINGS_STORAGE_KEY, JSON.stringify(payload))
|
|
7
|
+
} else {
|
|
8
|
+
window.localStorage.removeItem(SETTINGS_STORAGE_KEY)
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
return {
|
|
12
|
+
...state,
|
|
13
|
+
settings: payload
|
|
14
|
+
}
|
|
15
|
+
}
|
|
3
16
|
|
|
4
17
|
const setCustomerId = (state, payload) => {
|
|
5
18
|
if (payload) {
|
|
@@ -93,6 +106,7 @@ const setUnseenCount = (state, payload) => {
|
|
|
93
106
|
export const actionsMap = {
|
|
94
107
|
SET_CHAT_VISIBILITY: setChatVisibility,
|
|
95
108
|
SET_AVAILABILITY: setAvailability,
|
|
109
|
+
SET_SETTINGS: setSettings,
|
|
96
110
|
SET_CUSTOMER_ID: setCustomerId,
|
|
97
111
|
SET_THREAD_ID: setThreadId,
|
|
98
112
|
SET_THREAD: setThread,
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { actionsMap } from './actions-map'
|
|
2
2
|
|
|
3
|
-
export const CUSTOMER_ID_STORAGE_KEY = 'webchat_customer_id'
|
|
4
|
-
export const THREAD_ID_STORAGE_KEY = 'webchat_thread_id'
|
|
5
|
-
|
|
6
3
|
export const initialState = {
|
|
7
4
|
availability: null,
|
|
8
5
|
customerId: null,
|
|
@@ -13,7 +10,8 @@ export const initialState = {
|
|
|
13
10
|
agent: null,
|
|
14
11
|
agentStatus: null,
|
|
15
12
|
isAgentTyping: false,
|
|
16
|
-
isChatOpen: false
|
|
13
|
+
isChatOpen: false,
|
|
14
|
+
settings: { audio: true, scroll: true }
|
|
17
15
|
}
|
|
18
16
|
|
|
19
17
|
export const reducer = (state, action) => {
|