@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 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 _store_useApp_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../store/useApp.js */ "./src/client/store/useApp.js");
480
- /* harmony import */ var _store_useChatSdk_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../store/useChatSdk.js */ "./src/client/store/useChatSdk.js");
481
- /* harmony import */ var _hooks_useFocusedElements_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../hooks/useFocusedElements.js */ "./src/client/hooks/useFocusedElements.js");
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,_store_useApp_js__WEBPACK_IMPORTED_MODULE_7__.useApp)();
510
+ } = (0,_store_useApp_js__WEBPACK_IMPORTED_MODULE_8__.useApp)();
504
511
  const {
505
512
  fetchThread,
506
513
  fetchMessages
507
- } = (0,_store_useChatSdk_js__WEBPACK_IMPORTED_MODULE_8__.useChatSdk)(sdk);
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,_hooks_useFocusedElements_js__WEBPACK_IMPORTED_MODULE_9__.useFocusedElements)(screen);
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
- setScreen: setScreen,
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 _reducer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reducer.js */ "./src/client/store/reducer.js");
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
- const AppContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(_reducer_js__WEBPACK_IMPORTED_MODULE_2__.initialState);
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)(_reducer_js__WEBPACK_IMPORTED_MODULE_2__.reducer, _reducer_js__WEBPACK_IMPORTED_MODULE_2__.initialState);
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(_reducer_js__WEBPACK_IMPORTED_MODULE_2__.CUSTOMER_ID_STORAGE_KEY));
1184
- setThreadId(window.localStorage.getItem(_reducer_js__WEBPACK_IMPORTED_MODULE_2__.THREAD_ID_STORAGE_KEY));
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 _reducer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./reducer */ "./src/client/store/reducer.js");
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(_reducer__WEBPACK_IMPORTED_MODULE_1__.CUSTOMER_ID_STORAGE_KEY, payload);
1446
+ window.localStorage.setItem(_constants__WEBPACK_IMPORTED_MODULE_1__.CUSTOMER_ID_STORAGE_KEY, payload);
1276
1447
  } else {
1277
- window.localStorage.removeItem(_reducer__WEBPACK_IMPORTED_MODULE_1__.CUSTOMER_ID_STORAGE_KEY);
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(_reducer__WEBPACK_IMPORTED_MODULE_1__.THREAD_ID_STORAGE_KEY, payload);
1457
+ window.localStorage.setItem(_constants__WEBPACK_IMPORTED_MODULE_1__.THREAD_ID_STORAGE_KEY, payload);
1287
1458
  } else {
1288
- window.localStorage.removeItem(_reducer__WEBPACK_IMPORTED_MODULE_1__.THREAD_ID_STORAGE_KEY);
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 _store_reducer_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./store/reducer.js */ "./src/client/store/reducer.js");
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(_store_reducer_js__WEBPACK_IMPORTED_MODULE_6__.CUSTOMER_ID_STORAGE_KEY) || '',
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
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_availability_availability_jsx__WEBPACK_IMPORTED_MODULE_3__.Availability, {
1658
- availability: availability
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
 
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra/flood-webchat",
3
- "version": "0.0.1-beta.17",
3
+ "version": "0.0.1-beta.18",
4
4
  "description": "",
5
5
  "main": "dist/server.js",
6
6
  "browser": "dist/client.js",
@@ -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>
@@ -7,6 +7,7 @@ export function PanelHeader () {
7
7
  const onClose = e => {
8
8
  e.preventDefault()
9
9
  setChatVisibility(false)
10
+ thread.lastMessageSeen()
10
11
  setUnseenCount(0)
11
12
  }
12
13
 
@@ -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 setScreen={setScreen} onEndChat={onEndChat} />
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' role='dialog' tabIndex='-1' aria-modal='true' aria-labelledby='wc-header-title'>
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
+ }
@@ -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/reducer.js'
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 availability={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 { initialState, reducer, CUSTOMER_ID_STORAGE_KEY, THREAD_ID_STORAGE_KEY } from './reducer.js'
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 './reducer'
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,
@@ -0,0 +1,3 @@
1
+ export const SETTINGS_STORAGE_KEY = 'webchat_settings'
2
+ export const CUSTOMER_ID_STORAGE_KEY = 'webchat_customer_id'
3
+ export const THREAD_ID_STORAGE_KEY = 'webchat_thread_id'
@@ -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) => {