@defra/flood-webchat 0.0.1-beta.15 → 0.0.1-beta.17

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
@@ -26,7 +26,8 @@ function Availability() {
26
26
  availability,
27
27
  messages,
28
28
  isChatOpen,
29
- setChatVisibility
29
+ setChatVisibility,
30
+ unseenCount
30
31
  } = (0,_store_useApp__WEBPACK_IMPORTED_MODULE_3__.useApp)();
31
32
  const [isFixed, setIsFixed] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
32
33
  const buttonRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();
@@ -84,7 +85,9 @@ function Availability() {
84
85
  onClick: onClick,
85
86
  onKeyUp: onKeyUp,
86
87
  onKeyDown: onKeyDown
87
- }, TextComponent))), isChatOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_panel_panel_jsx__WEBPACK_IMPORTED_MODULE_2__.Panel, null));
88
+ }, TextComponent, unseenCount > 0 && !isChatOpen ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
89
+ className: "wc-open-btn__unseen"
90
+ }, unseenCount) : null))), isChatOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_panel_panel_jsx__WEBPACK_IMPORTED_MODULE_2__.Panel, null));
88
91
  case 'EXISTING':
89
92
  case 'UNAVAILABLE':
90
93
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", {
@@ -118,6 +121,8 @@ __webpack_require__.r(__webpack_exports__);
118
121
  /* harmony import */ var _message_message_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../message/message.jsx */ "./src/client/components/message/message.jsx");
119
122
  /* harmony import */ var _store_useApp_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../store/useApp.js */ "./src/client/store/useApp.js");
120
123
  /* harmony import */ var _hooks_useTextareaAutosize_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../hooks/useTextareaAutosize.js */ "./src/client/hooks/useTextareaAutosize.js");
124
+ /* harmony import */ var _lib_transform_messages_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib/transform-messages.js */ "./src/client/lib/transform-messages.js");
125
+
121
126
 
122
127
 
123
128
 
@@ -182,6 +187,12 @@ function Chat({
182
187
  }
183
188
  setUserMessage('');
184
189
  };
190
+ const saveChat = () => {
191
+ const transcript = (0,_lib_transform_messages_js__WEBPACK_IMPORTED_MODULE_7__.formatTranscript)(messages);
192
+ const saveChatLink = document.querySelector('#transcript-download');
193
+ saveChatLink.setAttribute('href', `data:text/plain;charset=utf-8,${transcript}`);
194
+ saveChatLink.click();
195
+ };
185
196
  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_2__.PanelHeader, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
186
197
  className: "wc-status"
187
198
  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", {
@@ -264,9 +275,11 @@ function Chat({
264
275
  "data-module": "govuk-button"
265
276
  }, "Settings"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
266
277
  href: "#",
278
+ id: "transcript-download",
267
279
  className: "wc-footer__settings-link",
268
280
  "data-module": "govuk-button",
269
- download: "transcript.txt"
281
+ download: "floodline-webchat-transcript.txt",
282
+ onClick: saveChat
270
283
  }, "Save chat"))));
271
284
  }
272
285
 
@@ -396,11 +409,13 @@ __webpack_require__.r(__webpack_exports__);
396
409
  function PanelHeader() {
397
410
  const {
398
411
  thread,
399
- setChatVisibility
412
+ setChatVisibility,
413
+ setUnseenCount
400
414
  } = (0,_store_useApp_js__WEBPACK_IMPORTED_MODULE_1__.useApp)();
401
415
  const onClose = e => {
402
416
  e.preventDefault();
403
417
  setChatVisibility(false);
418
+ setUnseenCount(0);
404
419
  };
405
420
  let ButtonComponent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
406
421
  className: "wc-header__close",
@@ -483,7 +498,8 @@ function Panel() {
483
498
  setThread,
484
499
  setThreadId,
485
500
  setChatVisibility,
486
- setMessages
501
+ setMessages,
502
+ setUnseenCount
487
503
  } = (0,_store_useApp_js__WEBPACK_IMPORTED_MODULE_7__.useApp)();
488
504
  const {
489
505
  fetchThread,
@@ -520,7 +536,13 @@ function Panel() {
520
536
  }
521
537
  };
522
538
  if (threadId) {
523
- thread ? setScreen(2) : recover();
539
+ if (thread) {
540
+ thread.lastMessageSeen();
541
+ setUnseenCount(0);
542
+ setScreen(2);
543
+ } else {
544
+ recover();
545
+ }
524
546
  }
525
547
  }, [thread, threadId]);
526
548
  const onEscapeKey = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(e => {
@@ -1009,16 +1031,23 @@ const classnames = (...classes) => classes.filter(classname => classname && type
1009
1031
 
1010
1032
  __webpack_require__.r(__webpack_exports__);
1011
1033
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1034
+ /* harmony export */ formatTranscript: () => (/* binding */ formatTranscript),
1012
1035
  /* harmony export */ transformMessage: () => (/* binding */ transformMessage),
1013
1036
  /* harmony export */ transformMessages: () => (/* binding */ transformMessages)
1014
1037
  /* harmony export */ });
1015
- /* harmony import */ var sanitize_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! sanitize-html */ "sanitize-html");
1016
- /* harmony import */ var sanitize_html__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(sanitize_html__WEBPACK_IMPORTED_MODULE_0__);
1038
+ /* harmony import */ var uuid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! uuid */ "uuid");
1039
+ /* harmony import */ var uuid__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(uuid__WEBPACK_IMPORTED_MODULE_0__);
1040
+ /* harmony import */ var sanitize_html__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! sanitize-html */ "sanitize-html");
1041
+ /* harmony import */ var sanitize_html__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(sanitize_html__WEBPACK_IMPORTED_MODULE_1__);
1042
+ /* harmony import */ var luxon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! luxon */ "luxon");
1043
+ /* harmony import */ var luxon__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(luxon__WEBPACK_IMPORTED_MODULE_2__);
1044
+
1045
+
1017
1046
 
1018
1047
  const transformMessage = message => {
1019
1048
  return {
1020
1049
  id: message.id,
1021
- text: sanitize_html__WEBPACK_IMPORTED_MODULE_0___default()(message.messageContent?.text),
1050
+ text: sanitize_html__WEBPACK_IMPORTED_MODULE_1___default()(message.messageContent?.text),
1022
1051
  createdAt: new Date(message.createdAt),
1023
1052
  user: message.authorEndUserIdentity?.fullName?.trim() || null,
1024
1053
  assignee: message.authorUser?.firstName || null,
@@ -1026,6 +1055,25 @@ const transformMessage = message => {
1026
1055
  };
1027
1056
  };
1028
1057
  const transformMessages = messages => messages.map(message => transformMessage(message));
1058
+ const formatTranscript = messages => {
1059
+ const now = luxon__WEBPACK_IMPORTED_MODULE_2__.DateTime.local();
1060
+ now.setZone('Europe/London');
1061
+ let string = `Floodline webchat transcript, ${now.toFormat('HH:mm:ss a, dd LLLL yyyy')}, (ID: ${uuid__WEBPACK_IMPORTED_MODULE_0__.v4().split('-')[0]})\n\n`;
1062
+ for (const message of messages) {
1063
+ const {
1064
+ text,
1065
+ direction,
1066
+ user,
1067
+ assignee,
1068
+ createdAt
1069
+ } = message;
1070
+ const author = direction === 'inbound' ? user : `${assignee} (Floodline adviser)`;
1071
+ const date = luxon__WEBPACK_IMPORTED_MODULE_2__.DateTime.fromJSDate(new Date(createdAt)).setZone('Europe/London').toFormat('HH:mm:ss a, dd LLLL yyyy');
1072
+ string += `[${date}] ${author}: \n${text}\n\n`;
1073
+ }
1074
+ string = string.replace(/<a\b[^>]*>/i, '').replace(/<\/a>/i, '');
1075
+ return encodeURIComponent(string);
1076
+ };
1029
1077
 
1030
1078
  /***/ }),
1031
1079
 
@@ -1068,6 +1116,10 @@ const AppProvider = ({
1068
1116
  type: 'SET_AGENT_STATUS',
1069
1117
  payload: e.detail.data.contact.status
1070
1118
  });
1119
+ dispatch({
1120
+ type: 'SET_UNSEEN_COUNT',
1121
+ payload: e.detail.data.contact.customerStatistics.unseenMessagesCount
1122
+ });
1071
1123
  };
1072
1124
  const onAssignedAgentChanged = e => {
1073
1125
  dispatch({
@@ -1100,6 +1152,10 @@ const AppProvider = ({
1100
1152
  type: 'SET_AGENT_STATUS',
1101
1153
  payload: e.detail.data.case.status
1102
1154
  });
1155
+ dispatch({
1156
+ type: 'SET_UNSEEN_COUNT',
1157
+ payload: e.detail.data.case.customerStatistics.unseenMessagesCount
1158
+ });
1103
1159
  };
1104
1160
  const onContactStatusChanged = e => {
1105
1161
  dispatch({
@@ -1167,6 +1223,12 @@ const AppProvider = ({
1167
1223
  payload: messages
1168
1224
  });
1169
1225
  };
1226
+ const setUnseenCount = unseenCount => {
1227
+ dispatch({
1228
+ type: 'SET_UNSEEN_COUNT',
1229
+ payload: unseenCount
1230
+ });
1231
+ };
1170
1232
 
1171
1233
  /**
1172
1234
  * Application-wide state and state functions
@@ -1178,6 +1240,7 @@ const AppProvider = ({
1178
1240
  setThreadId,
1179
1241
  setThread,
1180
1242
  setMessages,
1243
+ setUnseenCount,
1181
1244
  setChatVisibility,
1182
1245
  onLiveChatRecovered,
1183
1246
  onAssignedAgentChanged,
@@ -1277,6 +1340,12 @@ const setAgentStatus = (state, payload) => {
1277
1340
  agentStatus: payload
1278
1341
  };
1279
1342
  };
1343
+ const setUnseenCount = (state, payload) => {
1344
+ return {
1345
+ ...state,
1346
+ unseenCount: payload
1347
+ };
1348
+ };
1280
1349
  const actionsMap = {
1281
1350
  SET_CHAT_VISIBILITY: setChatVisibility,
1282
1351
  SET_AVAILABILITY: setAvailability,
@@ -1287,7 +1356,8 @@ const actionsMap = {
1287
1356
  SET_MESSAGES: setMessages,
1288
1357
  SET_AGENT: setAgent,
1289
1358
  SET_AGENT_TYPING: setAgentIsTyping,
1290
- SET_AGENT_STATUS: setAgentStatus
1359
+ SET_AGENT_STATUS: setAgentStatus,
1360
+ SET_UNSEEN_COUNT: setUnseenCount
1291
1361
  };
1292
1362
 
1293
1363
  /***/ }),
@@ -1315,6 +1385,7 @@ const initialState = {
1315
1385
  threadId: null,
1316
1386
  thread: null,
1317
1387
  messages: [],
1388
+ unseenCount: 0,
1318
1389
  agent: null,
1319
1390
  agentStatus: null,
1320
1391
  isAgentTyping: false,
@@ -1410,6 +1481,16 @@ module.exports = require("@nice-devone/nice-cxone-chat-web-sdk");
1410
1481
 
1411
1482
  /***/ }),
1412
1483
 
1484
+ /***/ "luxon":
1485
+ /*!************************!*\
1486
+ !*** external "luxon" ***!
1487
+ \************************/
1488
+ /***/ ((module) => {
1489
+
1490
+ module.exports = require("luxon");
1491
+
1492
+ /***/ }),
1493
+
1413
1494
  /***/ "react":
1414
1495
  /*!************************!*\
1415
1496
  !*** external "react" ***!
@@ -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 \"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 } = 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 </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'\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 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 href='#' className='wc-footer__settings-link' data-module='govuk-button'>Settings</a>\n <a href='#' className='wc-footer__settings-link' data-module='govuk-button' download='transcript.txt'>Save chat</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 } = useApp()\n\n const onClose = e => {\n e.preventDefault()\n setChatVisibility(false)\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 } = 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 (thread) ? setScreen(2) : recover()\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 sanitizeHtml from 'sanitize-html'\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","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 }\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 }\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 /**\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 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\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}\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 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(\"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","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","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","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","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","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","setAttribute","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","transformMessage","messageContent","createdAt","Date","user","authorEndUserIdentity","fullName","authorUser","transformMessages","createContext","useReducer","useMemo","ChatEvent","initialState","reducer","CUSTOMER_ID_STORAGE_KEY","THREAD_ID_STORAGE_KEY","AppContext","AppProvider","state","dispatch","onLiveChatRecovered","payload","detail","inboxAssignee","contact","status","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","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/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":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra/flood-webchat",
3
- "version": "0.0.1-beta.15",
3
+ "version": "0.0.1-beta.17",
4
4
  "description": "",
5
5
  "main": "dist/server.js",
6
6
  "browser": "dist/client.js",
@@ -5,7 +5,7 @@ import { Panel } from '../panel/panel.jsx'
5
5
  import { useApp } from '../../store/useApp'
6
6
 
7
7
  export function Availability () {
8
- const { availability, messages, isChatOpen, setChatVisibility } = useApp()
8
+ const { availability, messages, isChatOpen, setChatVisibility, unseenCount } = useApp()
9
9
 
10
10
  const [isFixed, setIsFixed] = useState(false)
11
11
  const buttonRef = useRef()
@@ -79,6 +79,7 @@ export function Availability () {
79
79
  onKeyDown={onKeyDown}
80
80
  >
81
81
  {TextComponent}
82
+ {unseenCount > 0 && !isChatOpen ? <span className='wc-open-btn__unseen'>{unseenCount}</span> : null}
82
83
  </a>
83
84
  </div>
84
85
  </div>
@@ -34,10 +34,6 @@
34
34
  margin-bottom: 0;
35
35
  fill: govuk-colour('black');
36
36
 
37
- @include mq ($from: tablet) {
38
- margin-right: 10px;
39
- }
40
-
41
37
  .govuk-visually-hidden, .wc-availability__unseen {
42
38
  pointer-events: none;
43
39
  }
@@ -86,4 +82,108 @@
86
82
  padding-left: 7px;
87
83
  padding-right: 7px;
88
84
  }
89
- }
85
+ }
86
+
87
+ // Define a mixin for the common styles
88
+ @mixin link-icon-styles {
89
+ position: relative;
90
+ display: inline-block;
91
+ margin-right: 5px;
92
+ fill: govuk-colour('black');
93
+ @include govuk-font($size: 19);
94
+
95
+ &:last-of-type {
96
+ margin-right: 0;
97
+ }
98
+
99
+ @include mq ($from: tablet) {
100
+ margin-right: 10px;
101
+ }
102
+
103
+ &__icon {
104
+ color: govuk-colour('black');
105
+ }
106
+
107
+ svg {
108
+ position: relative;
109
+ display: inline-block;
110
+ color: currentcolor;
111
+ vertical-align: top;
112
+ margin-right: 7px;
113
+ top: 1px;
114
+
115
+ @include mq ($from: tablet) {
116
+ margin-right: 8px;
117
+ top: 4px;
118
+ }
119
+ }
120
+
121
+ &:hover {
122
+ color: $govuk-link-hover-colour;
123
+ }
124
+
125
+ &:active {
126
+ color: govuk-colour('black');
127
+ }
128
+ }
129
+
130
+ .defra-link-icon {
131
+ @include link-icon-styles;
132
+ }
133
+
134
+ .wc-open-btn {
135
+ @include link-icon-styles;
136
+ margin-bottom: 0;
137
+
138
+ &:visited {
139
+ color: $govuk-link-colour;
140
+ }
141
+
142
+ span {
143
+ pointer-events: none;
144
+ }
145
+
146
+ svg {
147
+ @include mq ($from: 'tablet') {
148
+ top: 3px;
149
+ }
150
+ color: govuk-colour('black');
151
+ pointer-events: none;
152
+ }
153
+
154
+ &:focus {
155
+ box-shadow: none;
156
+ background-color: transparent;
157
+ text-decoration: underline;
158
+ color: $govuk-focus-colour;
159
+ }
160
+
161
+ &:hover:not(:focus):not(:active) {
162
+ color: $govuk-link-hover-colour;
163
+
164
+ svg {
165
+ color: govuk-colour('dark-blue');
166
+ }
167
+
168
+ .wc-open-btn__unseen {
169
+ background-color: govuk-colour('dark-blue');
170
+ }
171
+ }
172
+
173
+ &__unseen {
174
+ display: inline-block;
175
+ position: relative;
176
+ border-radius: 10px;
177
+ background-color: govuk-colour('black');
178
+ color: #ffffff;
179
+ font-weight: bold;
180
+ font-size: 14px;
181
+ padding: 0 6px;
182
+ margin-left: 5px;
183
+ @include mq ($from: tablet) {
184
+ top: -1px;
185
+ padding-left: 7px;
186
+ padding-right: 7px;
187
+ }
188
+ }
189
+ }
@@ -7,6 +7,7 @@ import { Message } from '../message/message.jsx'
7
7
 
8
8
  import { useApp } from '../../store/useApp.js'
9
9
  import { useTextareaAutosize } from '../../hooks/useTextareaAutosize.js'
10
+ import { formatTranscript } from '../../lib/transform-messages.js'
10
11
 
11
12
  export function Chat ({ onEndChat }) {
12
13
  const { availability, thread, messages, agent, agentStatus, isAgentTyping } = useApp()
@@ -72,6 +73,15 @@ export function Chat ({ onEndChat }) {
72
73
  setUserMessage('')
73
74
  }
74
75
 
76
+ const saveChat = () => {
77
+ const transcript = formatTranscript(messages)
78
+
79
+ const saveChatLink = document.querySelector('#transcript-download')
80
+
81
+ saveChatLink.setAttribute('href', `data:text/plain;charset=utf-8,${transcript}`)
82
+ saveChatLink.click()
83
+ }
84
+
75
85
  return (
76
86
  <>
77
87
  <PanelHeader />
@@ -134,8 +144,23 @@ export function Chat ({ onEndChat }) {
134
144
  </div>
135
145
 
136
146
  <div className='wc-footer__settings'>
137
- <a href='#' className='wc-footer__settings-link' data-module='govuk-button'>Settings</a>
138
- <a href='#' className='wc-footer__settings-link' data-module='govuk-button' download='transcript.txt'>Save chat</a>
147
+ <a
148
+ href='#'
149
+ className='wc-footer__settings-link'
150
+ data-module='govuk-button'
151
+ >
152
+ Settings
153
+ </a>
154
+ <a
155
+ href='#'
156
+ id='transcript-download'
157
+ className='wc-footer__settings-link'
158
+ data-module='govuk-button'
159
+ download='floodline-webchat-transcript.txt'
160
+ onClick={saveChat}
161
+ >
162
+ Save chat
163
+ </a>
139
164
  </div>
140
165
  </PanelFooter>
141
166
  </>
@@ -2,11 +2,12 @@ import React from 'react'
2
2
  import { useApp } from '../../store/useApp.js'
3
3
 
4
4
  export function PanelHeader () {
5
- const { thread, setChatVisibility } = useApp()
5
+ const { thread, setChatVisibility, setUnseenCount } = useApp()
6
6
 
7
7
  const onClose = e => {
8
8
  e.preventDefault()
9
9
  setChatVisibility(false)
10
+ setUnseenCount(0)
10
11
  }
11
12
 
12
13
  let ButtonComponent = (
@@ -12,7 +12,7 @@ import { useChatSdk } from '../../store/useChatSdk.js'
12
12
  import { useFocusedElements } from '../../hooks/useFocusedElements.js'
13
13
 
14
14
  export function Panel () {
15
- const { sdk, availability, thread, threadId, setThread, setThreadId, setChatVisibility, setMessages } = useApp()
15
+ const { sdk, availability, thread, threadId, setThread, setThreadId, setChatVisibility, setMessages, setUnseenCount } = useApp()
16
16
  const { fetchThread, fetchMessages } = useChatSdk(sdk)
17
17
 
18
18
  const [screen, setScreen] = useState(threadId ? 2 : 0)
@@ -51,7 +51,13 @@ export function Panel () {
51
51
  }
52
52
 
53
53
  if (threadId) {
54
- (thread) ? setScreen(2) : recover()
54
+ if (thread) {
55
+ thread.lastMessageSeen()
56
+ setUnseenCount(0)
57
+ setScreen(2)
58
+ } else {
59
+ recover()
60
+ }
55
61
  }
56
62
  }, [thread, threadId])
57
63
 
@@ -1,4 +1,6 @@
1
+ import * as uuid from 'uuid'
1
2
  import sanitizeHtml from 'sanitize-html'
3
+ import { DateTime } from 'luxon'
2
4
 
3
5
  export const transformMessage = message => {
4
6
  return {
@@ -12,3 +14,23 @@ export const transformMessage = message => {
12
14
  }
13
15
 
14
16
  export const transformMessages = messages => messages.map(message => transformMessage(message))
17
+
18
+ export const formatTranscript = messages => {
19
+ const now = DateTime.local()
20
+ now.setZone('Europe/London')
21
+
22
+ let string = `Floodline webchat transcript, ${now.toFormat('HH:mm:ss a, dd LLLL yyyy')}, (ID: ${uuid.v4().split('-')[0]})\n\n`
23
+
24
+ for (const message of messages) {
25
+ const { text, direction, user, assignee, createdAt } = message
26
+
27
+ const author = direction === 'inbound' ? user : `${assignee} (Floodline adviser)`
28
+ const date = DateTime.fromJSDate(new Date(createdAt)).setZone('Europe/London').toFormat('HH:mm:ss a, dd LLLL yyyy')
29
+
30
+ string += `[${date}] ${author}: \n${text}\n\n`
31
+ }
32
+
33
+ string = string.replace(/<a\b[^>]*>/i, '').replace(/<\/a>/i, '')
34
+
35
+ return encodeURIComponent(string)
36
+ }
@@ -14,6 +14,7 @@ export const AppProvider = ({ sdk, availability, children }) => {
14
14
  const onLiveChatRecovered = e => {
15
15
  dispatch({ type: 'SET_AGENT', payload: e.detail.data.inboxAssignee })
16
16
  dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.contact.status })
17
+ dispatch({ type: 'SET_UNSEEN_COUNT', payload: e.detail.data.contact.customerStatistics.unseenMessagesCount })
17
18
  }
18
19
 
19
20
  const onAssignedAgentChanged = e => {
@@ -32,6 +33,7 @@ export const AppProvider = ({ sdk, availability, children }) => {
32
33
  const onMessageCreated = e => {
33
34
  dispatch({ type: 'SET_MESSAGE', payload: e.detail.data.message })
34
35
  dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })
36
+ dispatch({ type: 'SET_UNSEEN_COUNT', payload: e.detail.data.case.customerStatistics.unseenMessagesCount })
35
37
  }
36
38
 
37
39
  const onContactStatusChanged = e => {
@@ -88,6 +90,10 @@ export const AppProvider = ({ sdk, availability, children }) => {
88
90
  dispatch({ type: 'SET_MESSAGES', payload: messages })
89
91
  }
90
92
 
93
+ const setUnseenCount = unseenCount => {
94
+ dispatch({ type: 'SET_UNSEEN_COUNT', payload: unseenCount })
95
+ }
96
+
91
97
  /**
92
98
  * Application-wide state and state functions
93
99
  */
@@ -98,6 +104,7 @@ export const AppProvider = ({ sdk, availability, children }) => {
98
104
  setThreadId,
99
105
  setThread,
100
106
  setMessages,
107
+ setUnseenCount,
101
108
  setChatVisibility,
102
109
  onLiveChatRecovered,
103
110
  onAssignedAgentChanged,
@@ -83,6 +83,13 @@ const setAgentStatus = (state, payload) => {
83
83
  }
84
84
  }
85
85
 
86
+ const setUnseenCount = (state, payload) => {
87
+ return {
88
+ ...state,
89
+ unseenCount: payload
90
+ }
91
+ }
92
+
86
93
  export const actionsMap = {
87
94
  SET_CHAT_VISIBILITY: setChatVisibility,
88
95
  SET_AVAILABILITY: setAvailability,
@@ -93,5 +100,6 @@ export const actionsMap = {
93
100
  SET_MESSAGES: setMessages,
94
101
  SET_AGENT: setAgent,
95
102
  SET_AGENT_TYPING: setAgentIsTyping,
96
- SET_AGENT_STATUS: setAgentStatus
103
+ SET_AGENT_STATUS: setAgentStatus,
104
+ SET_UNSEEN_COUNT: setUnseenCount
97
105
  }
@@ -9,6 +9,7 @@ export const initialState = {
9
9
  threadId: null,
10
10
  thread: null,
11
11
  messages: [],
12
+ unseenCount: 0,
12
13
  agent: null,
13
14
  agentStatus: null,
14
15
  isAgentTyping: false,