@defra/flood-webchat 0.0.1-beta.27 → 0.0.1-beta.28

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
@@ -17,6 +17,8 @@ __webpack_require__.r(__webpack_exports__);
17
17
  /* harmony import */ var _lib_classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../lib/classnames */ "./src/client/lib/classnames.js");
18
18
  /* harmony import */ var _panel_panel_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../panel/panel.jsx */ "./src/client/components/panel/panel.jsx");
19
19
  /* harmony import */ var _store_useApp__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../store/useApp */ "./src/client/store/useApp.js");
20
+ /* harmony import */ var _lib_history_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib/history.js */ "./src/client/lib/history.js");
21
+
20
22
 
21
23
 
22
24
 
@@ -31,8 +33,10 @@ function Availability() {
31
33
  } = (0,_store_useApp__WEBPACK_IMPORTED_MODULE_3__.useApp)();
32
34
  const [isFixed, setIsFixed] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
33
35
  const buttonRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();
34
- const onClick = () => {
36
+ const onClick = e => {
37
+ e.preventDefault();
35
38
  setChatVisibility(!isChatOpen);
39
+ (0,_lib_history_js__WEBPACK_IMPORTED_MODULE_4__.historyPushState)();
36
40
  };
37
41
  const onKeyDown = event => {
38
42
  if (event.key === ' ') {
@@ -80,12 +84,13 @@ function Availability() {
80
84
  className: "wc-availability__inner"
81
85
  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
82
86
  className: "wc-availability__link",
83
- role: "button",
84
87
  href: "#webchat",
85
88
  draggable: "false",
86
89
  onClick: onClick,
87
90
  onKeyUp: onKeyUp,
88
- onKeyDown: onKeyDown
91
+ onKeyDown: onKeyDown,
92
+ role: "button",
93
+ "data-module": "govuk-button"
89
94
  }, TextComponent, unseenCount > 0 && !isChatOpen ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
90
95
  className: "wc-availability__unseen"
91
96
  }, unseenCount) : null))), isChatOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_panel_panel_jsx__WEBPACK_IMPORTED_MODULE_2__.Panel, null));
@@ -420,24 +425,42 @@ __webpack_require__.r(__webpack_exports__);
420
425
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
421
426
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
422
427
  /* harmony import */ var _store_useApp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../store/useApp.js */ "./src/client/store/useApp.js");
428
+ /* harmony import */ var _lib_history_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../lib/history.js */ "./src/client/lib/history.js");
429
+
423
430
 
424
431
 
425
432
  function PanelHeader() {
426
433
  const {
427
434
  thread,
435
+ threadId,
428
436
  setChatVisibility,
429
437
  setUnseenCount,
430
- threadId
438
+ isMobile
431
439
  } = (0,_store_useApp_js__WEBPACK_IMPORTED_MODULE_1__.useApp)();
432
440
  const onClose = e => {
433
441
  e.preventDefault();
434
442
  setChatVisibility(false);
443
+ (0,_lib_history_js__WEBPACK_IMPORTED_MODULE_2__.historyReplaceState)();
435
444
  if (threadId) {
436
445
  thread?.lastMessageSeen();
437
446
  setUnseenCount(0);
438
447
  }
439
448
  };
440
- let ButtonComponent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
449
+ const BackButtonComponent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
450
+ className: "wc-header__back",
451
+ "aria-label": "Close the webchat",
452
+ onClick: onClose
453
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("svg", {
454
+ "aria-hidden": "true",
455
+ focusable: "false",
456
+ width: "20",
457
+ height: "20",
458
+ viewBox: "0 0 20 20"
459
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", {
460
+ d: "M4.828,11L12.314,18.485L10.899,19.899L1,10L10.899,0.101L12.314,1.515L4.828,9L19,9L19,11L4.828,11Z",
461
+ fill: "currentColor"
462
+ })));
463
+ const CloseButtonComponent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
441
464
  className: "wc-header__close",
442
465
  "aria-label": "Close the webchat",
443
466
  onClick: onClose
@@ -451,28 +474,39 @@ function PanelHeader() {
451
474
  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",
452
475
  fill: "currentColor"
453
476
  })));
477
+ const MinimiseButtonComponent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
478
+ className: "wc-header__hide",
479
+ "aria-label": "Minimise the webchat",
480
+ onClick: onClose
481
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("svg", {
482
+ "aria-hidden": "true",
483
+ focusable: "false",
484
+ width: "20",
485
+ height: "20",
486
+ viewBox: "0 0 20 20"
487
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", {
488
+ d: "M10 14.4l-7-7L4.4 6l5.6 5.6L15.6 6 17 7.4l-7 7z",
489
+ fill: "currentColor"
490
+ })));
491
+ let RightButtonComponent = CloseButtonComponent;
454
492
  if (thread) {
455
- ButtonComponent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
456
- className: "wc-header__hide",
457
- "aria-label": "Minimise the webchat",
458
- onClick: onClose
459
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("svg", {
460
- "aria-hidden": "true",
461
- focusable: "false",
462
- width: "20",
463
- height: "20",
464
- viewBox: "0 0 20 20"
465
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", {
466
- d: "M10 14.4l-7-7L4.4 6l5.6 5.6L15.6 6 17 7.4l-7 7z",
467
- fill: "currentColor"
468
- })));
493
+ RightButtonComponent = MinimiseButtonComponent;
494
+ if (isMobile && !window.history.state) {
495
+ RightButtonComponent = MinimiseButtonComponent;
496
+ }
497
+ }
498
+ if (!thread && isMobile && !window.history.state) {
499
+ RightButtonComponent = CloseButtonComponent;
500
+ }
501
+ if (isMobile && window.history.state) {
502
+ RightButtonComponent = null;
469
503
  }
470
504
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
471
505
  className: "wc-header"
472
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h2", {
506
+ }, window.history.state ? BackButtonComponent : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h2", {
473
507
  id: "wc-header-title",
474
508
  className: "wc-header__title"
475
- }, "Floodline Webchat"), ButtonComponent);
509
+ }, "Floodline Webchat"), RightButtonComponent);
476
510
  }
477
511
 
478
512
  /***/ }),
@@ -501,6 +535,8 @@ __webpack_require__.r(__webpack_exports__);
501
535
  /* harmony import */ var _store_useApp_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../store/useApp.js */ "./src/client/store/useApp.js");
502
536
  /* harmony import */ var _store_useChatSdk_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../store/useChatSdk.js */ "./src/client/store/useChatSdk.js");
503
537
  /* harmony import */ var _hooks_useFocusedElements_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../hooks/useFocusedElements.js */ "./src/client/hooks/useFocusedElements.js");
538
+ /* harmony import */ var _lib_history_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../lib/history.js */ "./src/client/lib/history.js");
539
+
504
540
 
505
541
 
506
542
 
@@ -539,6 +575,7 @@ function Panel() {
539
575
  setUnseenCount(0);
540
576
  }
541
577
  setChatVisibility(false);
578
+ (0,_lib_history_js__WEBPACK_IMPORTED_MODULE_12__.historyReplaceState)();
542
579
  }
543
580
  }, [thread, threadId, setUnseenCount, setChatVisibility]);
544
581
 
@@ -559,9 +596,9 @@ function Panel() {
559
596
  * Initializes the eventListener for pressing the escape key
560
597
  */
561
598
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
562
- const escapeKeyEvent = document.addEventListener('keydown', onEscapeKey);
599
+ document.addEventListener('keydown', onEscapeKey);
563
600
  return () => {
564
- document.removeEventListener('keydown', escapeKeyEvent);
601
+ document.removeEventListener('keydown', onEscapeKey);
565
602
  };
566
603
  }, [onEscapeKey, setChatVisibility]);
567
604
 
@@ -1263,6 +1300,33 @@ const classnames = (...classes) => classes.filter(classname => classname && type
1263
1300
 
1264
1301
  /***/ }),
1265
1302
 
1303
+ /***/ "./src/client/lib/history.js":
1304
+ /*!***********************************!*\
1305
+ !*** ./src/client/lib/history.js ***!
1306
+ \***********************************/
1307
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1308
+
1309
+ __webpack_require__.r(__webpack_exports__);
1310
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1311
+ /* harmony export */ historyPushState: () => (/* binding */ historyPushState),
1312
+ /* harmony export */ historyReplaceState: () => (/* binding */ historyReplaceState)
1313
+ /* harmony export */ });
1314
+ const historyPushState = () => {
1315
+ const url = window.location.href.split('#')[0];
1316
+ window.history.pushState({
1317
+ history: true
1318
+ }, null, `${url}#webchat`);
1319
+ };
1320
+ const historyReplaceState = () => {
1321
+ if (window.history.state?.history) {
1322
+ window.history.back();
1323
+ }
1324
+ const url = window.location.href.split('#')[0];
1325
+ window.history.replaceState(null, null, url);
1326
+ };
1327
+
1328
+ /***/ }),
1329
+
1266
1330
  /***/ "./src/client/lib/message-notification.js":
1267
1331
  /*!************************************************!*\
1268
1332
  !*** ./src/client/lib/message-notification.js ***!
@@ -1493,18 +1557,31 @@ const AppProvider = ({
1493
1557
  setCustomerId(window.localStorage.getItem(_constants_js__WEBPACK_IMPORTED_MODULE_4__.CUSTOMER_ID_STORAGE_KEY));
1494
1558
  setThreadId(window.localStorage.getItem(_constants_js__WEBPACK_IMPORTED_MODULE_4__.THREAD_ID_STORAGE_KEY));
1495
1559
  setSettings(JSON.parse(window.localStorage.getItem(_constants_js__WEBPACK_IMPORTED_MODULE_4__.SETTINGS_STORAGE_KEY)) || state.settings);
1560
+ }, []);
1561
+
1562
+ /**
1563
+ * Set browser history on start chat click
1564
+ */
1565
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
1496
1566
  if (window.location.hash === '#webchat') {
1497
1567
  setChatVisibility(true);
1498
1568
  }
1569
+ const onBrowserNavigation = window.addEventListener('popstate', () => {
1570
+ if (window.location.hash === '#webchat') {
1571
+ setChatVisibility(true);
1572
+ } else {
1573
+ setChatVisibility(false);
1574
+ }
1575
+ });
1576
+ return () => {
1577
+ window.removeEventListener('popstate', onBrowserNavigation);
1578
+ };
1499
1579
  }, []);
1500
1580
 
1501
1581
  /**
1502
1582
  * State update functions
1503
1583
  */
1504
1584
  const setChatVisibility = payload => {
1505
- if (!payload) {
1506
- window.location.hash = '';
1507
- }
1508
1585
  dispatch({
1509
1586
  type: 'SET_CHAT_VISIBILITY',
1510
1587
  payload
@@ -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/feedback.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/pre-chat.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/request-chat.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/settings.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/unavailable.jsx","webpack://@defra/flood-webchat/./src/client/hooks/useFocusedElements.js","webpack://@defra/flood-webchat/./src/client/hooks/useTextareaAutosize.js","webpack://@defra/flood-webchat/./src/client/lib/check-availability.js","webpack://@defra/flood-webchat/./src/client/lib/classnames.js","webpack://@defra/flood-webchat/./src/client/lib/message-notification.js","webpack://@defra/flood-webchat/./src/client/lib/transform-messages.js","webpack://@defra/flood-webchat/./src/client/store/AppProvider.jsx","webpack://@defra/flood-webchat/./src/client/store/actions-map.js","webpack://@defra/flood-webchat/./src/client/store/constants.js","webpack://@defra/flood-webchat/./src/client/store/reducer.js","webpack://@defra/flood-webchat/./src/client/store/useApp.js","webpack://@defra/flood-webchat/./src/client/store/useChatSdk.js","webpack://@defra/flood-webchat/external commonjs \"@nice-devone/nice-cxone-chat-web-sdk\"","webpack://@defra/flood-webchat/external commonjs \"luxon\"","webpack://@defra/flood-webchat/external commonjs \"react\"","webpack://@defra/flood-webchat/external commonjs \"react-dom\"","webpack://@defra/flood-webchat/external commonjs \"react-dom/client\"","webpack://@defra/flood-webchat/external commonjs \"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, isChatOpen, setChatVisibility, unseenCount, threadId } = 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 && threadId)\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-u-scroll-padding', isFixed)\n document.body.classList.toggle('wc-u-scroll-padding', isFixed)\n }, [isFixed])\n\n let TextComponent = (<>Show Chat</>)\n\n if (!threadId) {\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 role='button'\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-availability__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'\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 ({ onEndChatScreen, onSettingsScreen }) {\n const { availability, thread, messages, agent, agentStatus, isAgentTyping, settings, isKeyboard } = useApp()\n\n const [userMessage, setUserMessage] = useState('')\n const [focusVisibleWithin, setFocusVisibleWithin] = useState(false)\n\n const messageRef = useRef()\n\n useTextareaAutosize(messageRef.current, userMessage)\n\n useEffect(() => {\n if (settings.scroll && messages.length !== 0) {\n const chatBody = document.querySelector('.wc-body')\n chatBody.scrollTop = chatBody.scrollHeight\n }\n }, [messages, isAgentTyping])\n\n useEffect(() => {\n const label = document.querySelector('.wc-form__label')\n\n if (userMessage.length === 0) {\n label.classList.remove('govuk-visually-hidden')\n } else {\n label.classList.add('govuk-visually-hidden')\n }\n }, [userMessage])\n\n const onChange = e => {\n setUserMessage(e.target?.value)\n }\n\n const agentName = agent?.nickname || agent?.firstName\n\n let connectionHeadlineText = 'Connecting to Floodline'\n\n if (agentStatus === 'closed') {\n connectionHeadlineText = agentName ? `${agentName} ended the session` : 'Session ended by advisor'\n } else if (agentStatus) {\n if (agentName) {\n connectionHeadlineText = `You are speaking with ${agentName}`\n } else {\n connectionHeadlineText = 'No advisers currently available'\n }\n }\n\n if (availability === 'UNAVAILABLE') {\n connectionHeadlineText = 'Webchat is not currently available'\n }\n\n const sendMessage = () => {\n if (messageRef.current.value.length === 0) {\n return\n }\n\n try {\n thread.sendTextMessage(messageRef.current.value.trim())\n } catch (err) {\n console.log('[Chat Error] sendMessage', err)\n }\n\n setUserMessage('')\n }\n const handleKeyPress = e => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n sendMessage()\n }\n }\n\n const handleSubmit = e => {\n e.preventDefault()\n sendMessage()\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 }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-status'>\n <p className='wc-status__availability'>{connectionHeadlineText}</p>\n <a className='wc-status__link' href='#' data-module='govuk-button' onClick={onEndChatScreen}>End chat</a>\n </div>\n\n <div className='wc-body' tabIndex='0'>\n <ul className='wc-chat'>\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 outbound'>\n <div className='wc-chat__from'>{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\n <PanelFooter>\n <form className={`wc-form${focusVisibleWithin ? ' wc-focus-within' : ''}`} noValidate onSubmit={handleSubmit}>\n <label className='govuk-label wc-form__label' 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'\n id='wc-form-textarea'\n name='message'\n onChange={onChange}\n onKeyDown={handleKeyPress}\n onFocus={() => { setFocusVisibleWithin(isKeyboard) }}\n onBlur={() => { setFocusVisibleWithin(false) }}\n value={userMessage}\n />\n\n <input\n type='submit'\n className='wc-form__button govuk-button'\n value='Send'\n data-prevent-double-click='true'\n />\n </form>\n\n <div className='wc-footer__settings'>\n <a\n href='#'\n id='wc-settings'\n className='wc-footer__settings-link'\n data-module='govuk-button'\n onClick={onSettingsScreen}\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='wc-error-summary__title 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 wc-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', outbound ? 'outbound' : 'inbound')}>\n <div className='wc-chat__from'>\n {messageOwnerSameAsPrevious ? null : <span>{outbound ? message.assignee : 'You'}</span>}\n <span className='govuk-visually-hidden'>:</span>\n </div>\n <div className={classnames('wc-chat__text', outbound ? 'outbound' : 'inbound')}>\n {message.text}\n </div>\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, threadId } = useApp()\n\n const onClose = e => {\n e.preventDefault()\n setChatVisibility(false)\n if (threadId) {\n thread?.lastMessageSeen()\n setUnseenCount(0)\n }\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'>\n Floodline Webchat\n </h2>\n\n {ButtonComponent}\n </div>\n )\n}\n","import React, { useEffect, useState, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { PreChat } from '../screens/pre-chat.jsx'\nimport { RequestChat } from '../screens/request-chat.jsx'\nimport { Chat } from '../chat/chat.jsx'\nimport { Unavailable } from '../screens/unavailable.jsx'\nimport { EndChat } from '../screens/end-chat.jsx'\nimport { Settings } from '../screens/settings.jsx'\nimport { Feedback } from '../screens/feedback.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, isMobile } = useApp()\n const { fetchThread, fetchMessages } = useChatSdk(sdk)\n\n const [screen, setScreen] = useState(threadId ? 2 : 0)\n\n useFocusedElements(screen)\n\n const onEscapeKey = useCallback(e => {\n if (e.key === 'Escape' || e.key === 'Esc') {\n if (threadId) {\n thread?.lastMessageSeen()\n setUnseenCount(0)\n }\n setChatVisibility(false)\n }\n }, [thread, threadId, setUnseenCount, setChatVisibility])\n\n /**\n * We need ammend classes on the body element to handle mobile behaviour\n */\n useEffect(() => {\n document.body.classList.remove('wc-u-hidden')\n document.getElementsByTagName('html')[0].classList.add('wc-u-html')\n document.body.classList.add('wc-u-body')\n return () => {\n document.getElementsByTagName('html')[0].classList.remove('wc-u-html')\n document.body.classList.remove('wc-u-body')\n }\n }, [isMobile])\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 }, [onEscapeKey, setChatVisibility])\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 handleScreenChange = newScreen => e => {\n e.preventDefault()\n setScreen(newScreen)\n }\n\n const goToPreChatScreen = handleScreenChange(0)\n const goToRequestChatScreen = handleScreenChange(1)\n const goToChatScreen = handleScreenChange(2)\n const goToEndChatScreen = handleScreenChange(3)\n const goToFeedbackScreen = handleScreenChange(4)\n const goToSettingsScreen = handleScreenChange(5)\n let ScreenComponent\n\n switch (screen) {\n case 0:\n ScreenComponent = <PreChat onContinue={goToRequestChatScreen} />\n break\n case 1:\n ScreenComponent = <RequestChat onPreChatScreen={goToPreChatScreen} />\n break\n case 2:\n ScreenComponent = <Chat onSettingsScreen={goToSettingsScreen} onEndChatScreen={goToEndChatScreen} />\n break\n case 3:\n ScreenComponent = <EndChat onChatScreen={goToChatScreen} onEndChatConfirm={goToFeedbackScreen} />\n break\n case 4:\n ScreenComponent = <Feedback onCancel={() => setChatVisibility(false)} />\n break\n case 5:\n ScreenComponent = <Settings onCancel={goToChatScreen} />\n break\n default:\n ScreenComponent = <PreChat onContinue={goToRequestChatScreen} />\n }\n\n if (availability === 'UNAVAILABLE') {\n ScreenComponent = <Unavailable />\n }\n\n const Component = (\n <div id='wc-panel' role='dialog' className='wc-panel' tabIndex='-1' aria-modal='true' aria-labelledby='wc-header-title'>\n <div className='wc-panel__inner'>\n {ScreenComponent}\n </div>\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'\nimport { useApp } from '../../store/useApp.js'\n\nexport function EndChat ({ onChatScreen, onEndChatConfirm }) {\n const { setCustomerId, setThreadId, setMessages, agentStatus, thread, setUnseenCount } = useApp()\n\n const confirmEndChat = async e => {\n e.preventDefault()\n\n setThreadId()\n setMessages([])\n setCustomerId()\n thread.lastMessageSeen()\n setUnseenCount(0)\n\n // End chat if still open\n if (agentStatus !== 'closed') {\n thread.endChat()\n }\n\n onEndChatConfirm(e)\n }\n\n return (\n <>\n <PanelHeader />\n <div className='wc-body'>\n <div className='wc-content'>\n <h3 className='wc-heading' aria-live='polite'>Are you sure you want to end the chat?</h3>\n <div className='govuk-button-group'>\n <a href='#endChat' role='button' className='wc-button govuk-button' data-module='govuk-button' id='confirmEndChat' onClick={confirmEndChat}>Yes, end chat</a>\n <a href='#resumeChat' role='button' className='wc-link govuk-link' onClick={onChatScreen}>No, resume chat</a>\n </div>\n </div>\n </div>\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function Feedback ({ onCancel }) {\n const feedbackCancel = async e => {\n onCancel(e)\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <div className='wc-content'>\n <h3 id='wc-subtitle' className='wc-heading'>Give Feedback on Floodline webchat</h3>\n <p>Please note we’re unable to respond to feedback.</p>\n <p><a className='govuk-link' href='#' target='_blank' rel='noreferrer'>Feedback Link</a></p>\n <p><a id='feedback-cancel' className='wc-link govuk-link' href='#' data-module='govuk-button' role='button' onClick={feedbackCancel}>Close</a></p>\n </div>\n </div>\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function PreChat ({ onContinue }) {\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <div className='wc-content'>\n <h3 className='wc-heading' aria-live='polite'>What you can use webchat for</h3>\n <p>Webchat lets you talk directly to a Floodline adviser.</p>\n\n <p>You can use webchat to get:</p>\n <ul className='wc-list'>\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 <p>\n There are other ways to&nbsp;\n <a className='govuk-link' href='https://www.gov.uk/sign-up-for-flood-warnings' target='_blank' rel='noreferrer'>\n sign up for flood warnings\n </a>\n &nbsp;and&nbsp;\n <a className='govuk-link' href='https://www.fws.environment-agency.gov.uk/app/olr/login' target='_blank' rel='noreferrer'>\n manage your flood warnings account\n </a>.\n </p>\n <p>\n Do not use webchat to&nbsp;\n <a\n className='govuk-link'\n href='https://www.gov.uk/report-flood-cause'\n target='_blank'\n rel='noreferrer'\n >\n report a flood\n </a>.\n </p>\n\n <button className='govuk-button wc-button govuk-!-margin-top-1' data-module='govuk-button' onClick={onContinue}>Continue</button>\n\n <h3 className='wc-heading'>Other flood information</h3>\n\n <p>Call Floodline for all other flood and flood warning information.</p>\n <p>\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' target='_blank' rel='noreferrer'>Find out more about call charges</a>\n </p>\n </div>\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 ({ onPreChatScreen }) {\n const { sdk, setCustomerId, setThreadId, setThread } = useApp()\n const { fetchCustomerId, fetchThread } = useChatSdk(sdk)\n const [errors, setErrors] = useState({})\n const [questionLength, setQuestionLength] = useState(0)\n const [isButtonDisabled, setButtonDisabled] = useState(false)\n\n const nameRef = useRef()\n const questionRef = useRef()\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 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 buttonLabel = isButtonDisabled ? 'Requesting...' : 'Request Chat'\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 setButtonDisabled(true)\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 thread.setCustomField('threadid', threadId)\n } catch (err) {\n console.log('[Request Chat Error]', err)\n }\n }\n\n setErrors(errs)\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <div className='wc-content'>\n <a href='#' className='wc-back-link govuk-back-link' onClick={onPreChatScreen}>\n What you can use webchat for\n </a>\n\n <ErrorSummary errors={errors} />\n\n <h3 className='wc-heading' aria-live='polite'>\n Your name and question\n </h3>\n\n <form>\n <div className={classnames('wc-form-group', 'govuk-form-group', errors.name && 'govuk-form-group--error')}>\n <label className='wc-label 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('wc-input', '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='wc-form-group 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='wc-label 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('wc-textarea', 'govuk-textarea', 'govuk-js-character-count', !isQuestionLengthValid || errors.question ? 'govuk-textarea--error' : '')}\n data-testid='request-chat-user-question'\n />\n <div\n id='wc-question-info'\n className='wc-hint govuk-hint govuk-char-count__msg'\n style={{ color: `${!isQuestionLengthValid ? '#d4351c' : ''}` }}\n aria-hidden='true'\n >\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 <div className='wc-inset-text govuk-inset-text'>\n By selecting 'Request chat' you agree to the terms of our&nbsp;\n <a href='https://check-for-flooding.service.gov.uk/privacy-notice' target='_blank' rel='noreferrer' className='govuk-link'>privacy notice</a>.\n </div>\n\n <button\n className='wc-button govuk-button govuk-!-margin-top-1'\n data-module='govuk-button'\n onClick={onRequestChat}\n disabled={isButtonDisabled}\n >\n {buttonLabel}\n </button>\n </form>\n </div>\n </div>\n </>\n )\n}\n","import React, { useState } from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nimport { useApp } from '../../store/useApp.js'\n\nexport function Settings ({ onCancel }) {\n const { settings, setSettings } = useApp()\n\n const [optionAudio, setOptionAudio] = useState(settings.audio)\n const [optionScroll, setOptionScroll] = useState(settings.scroll)\n\n const onSave = e => {\n e.preventDefault()\n\n setSettings({ audio: optionAudio, scroll: optionScroll })\n onCancel(e)\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <div className='wc-content'>\n <fieldset className='govuk-fieldset govuk-!-margin-bottom-4'>\n <legend className='govuk-fieldset__legend govuk-fieldset__legend'>\n <h3 id='wc-subtitle' className='wc-heading'>Change settings</h3>\n </legend>\n <div className='govuk-checkboxes govuk-checkboxes--small' data-module='govuk-checkboxes'>\n <div className='govuk-checkboxes__item'>\n <input\n id='audio'\n name='audio'\n type='checkbox'\n value='audio'\n className='govuk-checkboxes__input'\n defaultChecked={optionAudio}\n onChange={() => setOptionAudio(!optionAudio)}\n />\n <label className='wc-label govuk-label govuk-checkboxes__label' htmlFor='audio'>\n Play a sound when receiving a new message\n </label>\n </div>\n <div className='govuk-checkboxes__item'>\n <input\n id='scroll'\n name='scroll'\n type='checkbox'\n value='scroll'\n className='govuk-checkboxes__input'\n defaultChecked={optionScroll}\n onChange={() => setOptionScroll(!optionScroll)}\n />\n <label className='wc-label govuk-label govuk-checkboxes__label' htmlFor='scroll'>\n Scroll automatically to a new message\n </label>\n </div>\n </div>\n </fieldset>\n\n <div className='govuk-button-group'>\n <a id='settings-save' href='#' className='wc-button govuk-button' data-module='govuk-button' onClick={onSave}>Save</a>\n <a id='settings-cancel' href='#' className='wc-link govuk-link' data-module='govuk-button' onClick={onCancel}>Cancel</a>\n </div>\n </div>\n </div>\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function Unavailable () {\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <h3 id='wc-subtitle' className='govuk-heading-m'>Webchat is currently not available</h3>\n <p className='govuk-body-s'>Try again later, or call Floodline:</p>\n <p className='govuk-body-s'>\n <strong>Floodline helpline</strong>\n <br />Telephone: 0345 988 1188\n <br />Textphone: 0345 602 6340\n <br />Open 24 hours a day, 7 days a week\n <br /><a className='govuk-link' href='https://gov.uk/call-charges'>Find out more about call charges</a>\n </p>\n <p className='govuk-body-s'>We're running webchat as a trial, it will not always be available.</p>\n </div>\n </>\n )\n}\n","import { useState, useEffect, useCallback } from 'react'\n\nconst ariaHidden = 'aria-hidden'\nconst dataWcInert = 'data-wc-inert'\n\nconst setAriaHidden = isInert => {\n for (const node of document.body.children) {\n if (node.id !== 'wc-panel') {\n // We only want to toggle elements that aren't already inert\n if (isInert && !node.getAttribute(ariaHidden)) {\n node.setAttribute(ariaHidden, 'true')\n node.setAttribute(dataWcInert, '')\n } else if (node.hasAttribute(dataWcInert)) {\n node.removeAttribute(ariaHidden)\n node.removeAttribute(dataWcInert)\n }\n }\n }\n}\n\nexport const getFocusableElements = () => {\n const selectors = [\n '#wc-panel a:not([disabled])',\n '#wc-panel button:not([disabled])',\n '#wc-panel select:not([disabled])',\n '#wc-panel input:not([disabled])',\n '#wc-panel textarea:not([disabled])',\n '#wc-panel *[tabindex=\"0\"]:not([disabled])'\n ]\n\n const elements = document.body.querySelectorAll(selectors.join(','))\n return Array.from(elements).filter(e => !e.closest('[hidden]') && !e.closest('[aria-hidden=\"true\"]'))\n}\n\nconst useFocusedElements = screen => {\n const [panelElements, setPanelElements] = useState([])\n\n const onKeyDown = useCallback(e => {\n const webchatPanelElement = document.querySelector('#wc-panel')\n\n if (e.key === 'Tab') {\n if (webchatPanelElement && !document.activeElement.closest('#wc-panel')) {\n webchatPanelElement.focus()\n }\n\n if (e.shiftKey) {\n if (document.activeElement === panelElements[0]) {\n panelElements[panelElements.length - 1].focus()\n e.preventDefault()\n } else if (document.activeElement === document.querySelector('#wc-panel')) {\n panelElements[panelElements.length - 1]?.focus()\n e.preventDefault()\n }\n } else if (document.activeElement === panelElements[panelElements.length - 1]) {\n panelElements[0].focus()\n e.preventDefault()\n }\n }\n }, [panelElements])\n\n useEffect(() => {\n setPanelElements(getFocusableElements())\n }, [screen])\n\n useEffect(() => {\n setAriaHidden(true)\n\n const panelElement = document.querySelector('#wc-panel')\n panelElement.focus()\n\n document.addEventListener('keydown', onKeyDown)\n\n return () => {\n setAriaHidden()\n document.body.querySelector('.wc-availability__link')?.focus()\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [panelElements])\n}\n\nexport { useFocusedElements }\n","import { useEffect } from 'react'\n\nexport const useTextareaAutosize = (textAreaRef, value) => {\n useEffect(() => {\n if (textAreaRef) {\n textAreaRef.style.height = '0px'\n\n const scrollHeight = textAreaRef.scrollHeight\n\n textAreaRef.style.height = `${scrollHeight}px`\n }\n }, [textAreaRef, value])\n}\n","export async function checkAvailability (endpoint) {\n const response = await fetch(endpoint)\n const data = await response.json()\n\n return {\n availability: data.availability || 'UNAVAILABLE'\n }\n}\n","export const classnames = (...classes) => classes.filter(classname => classname && typeof classname === 'string').join(' ')\n","export const messageNotification = audioUrl => {\n let buffer\n\n const context = new (window.AudioContext || window.webkitAudioContext)()\n\n if (context.state === 'suspended') {\n const events = ['touchstart', 'touchend', 'mousedown', 'wheel', 'keydown', 'click']\n\n const unlock = _e => {\n events.forEach(event => {\n document.body.removeEventListener(event, unlock)\n })\n\n context.resume()\n }\n\n events.forEach(event => {\n document.body.addEventListener(event, unlock, false)\n })\n }\n\n fetch(audioUrl)\n .then(response => response.arrayBuffer())\n .then(data => context.decodeAudioData(data))\n .then(decodedData => {\n buffer = decodedData\n })\n .catch(console.error)\n\n return () => {\n const source = context.createBufferSource()\n source.buffer = buffer\n source.connect(context.destination)\n source.start()\n }\n}\n","import { DateTime } from 'luxon'\n\nexport const transformMessage = message => {\n return {\n id: message.id,\n text: 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')}\\n\\n`\n\n for (const message of messages) {\n const { text, direction, user, assignee, createdAt } = message\n\n const author = direction === 'inbound' ? user : `${assignee} (Floodline adviser)`\n const date = DateTime.fromJSDate(new Date(createdAt)).setZone('Europe/London').toFormat('HH:mm:ss a, dd LLLL yyyy')\n\n string += `[${date}] ${author}: \\n${text}\\n\\n`\n }\n\n string = string.replace(/<a\\b[^>]*>/i, '').replace(/<\\/a>/i, '')\n\n return encodeURIComponent(string)\n}\n","import React, { createContext, useEffect, useReducer, useMemo } from 'react'\nimport { ChatEvent } from '@nice-devone/nice-cxone-chat-web-sdk'\n\nimport { messageNotification } from '../lib/message-notification.js'\n\nimport { initialState, reducer } from './reducer.js'\nimport { CUSTOMER_ID_STORAGE_KEY, THREAD_ID_STORAGE_KEY, SETTINGS_STORAGE_KEY } from './constants.js'\n\nexport const AppContext = createContext(initialState)\n\nexport const AppProvider = ({ sdk, availability, options, children }) => {\n const [state, dispatch] = useReducer(reducer, initialState)\n\n const playSound = messageNotification(options.audioUrl)\n\n /**\n * SDK event handlers\n */\n const onLiveChatRecovered = e => {\n dispatch({ type: 'SET_AGENT', payload: e.detail.data.inboxAssignee })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.contact.status })\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: e.detail.data.contact.customerStatistics.unseenMessagesCount })\n }\n\n const onAssignedAgentChanged = e => {\n dispatch({ type: 'SET_AGENT', payload: e.detail.data.inboxAssignee })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n }\n\n const onAgentTypingStarted = () => {\n dispatch({ type: 'SET_AGENT_TYPING', payload: true })\n }\n\n const onAgentTypingEnded = () => {\n dispatch({ type: 'SET_AGENT_TYPING', payload: false })\n }\n\n const onMessageCreated = e => {\n dispatch({ type: 'SET_MESSAGE', payload: e.detail.data.message })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: e.detail.data.case.customerStatistics.unseenMessagesCount })\n\n const isAudioOn = JSON.parse(window.localStorage.getItem(SETTINGS_STORAGE_KEY)).audio\n\n if (isAudioOn && e.detail.data.message.direction === 'outbound') {\n playSound()\n }\n }\n\n const onContactStatusChanged = e => {\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n }\n\n const onMatchMedia = e => {\n dispatch({ type: 'TOGGLE_IS_MOBILE', payload: e.matches })\n }\n\n const onKeydown = () => {\n dispatch({ type: 'TOGGLE_IS_KEYBOARD', payload: true })\n }\n\n const onPointerdown = () => {\n dispatch({ type: 'TOGGLE_IS_KEYBOARD', payload: false })\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 // We need to know if it is a mobile and if it is a keyboard interaction\n window.matchMedia('(max-width: 640px)').addEventListener('change', onMatchMedia)\n window.addEventListener('keydown', onKeydown)\n window.addEventListener('pointerdown', onPointerdown)\n // Tidying up\n return () => {\n window.removeEventListener('change', onMatchMedia)\n window.removeEventListener('keydown', onKeydown)\n window.removeEventListener('pointerdown', onPointerdown)\n }\n }, [sdk])\n\n /**\n * Initialize customerId, threadId and whether the webchat should be open\n */\n useEffect(() => {\n dispatch({ type: 'SET_AVAILABILITY', payload: availability })\n\n setCustomerId(window.localStorage.getItem(CUSTOMER_ID_STORAGE_KEY))\n setThreadId(window.localStorage.getItem(THREAD_ID_STORAGE_KEY))\n setSettings(JSON.parse(window.localStorage.getItem(SETTINGS_STORAGE_KEY)) || state.settings)\n\n if (window.location.hash === '#webchat') {\n setChatVisibility(true)\n }\n }, [])\n\n /**\n * State update functions\n */\n const setChatVisibility = payload => {\n if (!payload) {\n window.location.hash = ''\n }\n\n dispatch({ type: 'SET_CHAT_VISIBILITY', payload })\n }\n\n const setCustomerId = customerId => {\n dispatch({ type: 'SET_CUSTOMER_ID', payload: customerId })\n }\n\n const setThreadId = threadId => {\n dispatch({ type: 'SET_THREAD_ID', payload: threadId })\n }\n\n const setThread = thread => {\n dispatch({ type: 'SET_THREAD', payload: thread })\n }\n\n const setMessages = messages => {\n dispatch({ type: 'SET_MESSAGES', payload: messages })\n }\n\n const setSettings = data => {\n dispatch({ type: 'SET_SETTINGS', payload: data })\n }\n\n const setUnseenCount = unseenCount => {\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: unseenCount })\n }\n\n /**\n * Application-wide state and state functions\n */\n const store = useMemo(() => ({\n ...state,\n sdk,\n setSettings,\n setCustomerId,\n setThreadId,\n setThread,\n setMessages,\n setUnseenCount,\n setChatVisibility,\n onLiveChatRecovered,\n onAssignedAgentChanged,\n onAgentTypingStarted,\n onAgentTypingEnded,\n onMessageCreated,\n onContactStatusChanged\n }))\n\n return (\n <AppContext.Provider value={store}>\n {children}\n </AppContext.Provider>\n )\n}\n","import { transformMessages, transformMessage } from '../lib/transform-messages'\nimport { CUSTOMER_ID_STORAGE_KEY, THREAD_ID_STORAGE_KEY, SETTINGS_STORAGE_KEY } from './constants'\n\nconst setSettings = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(SETTINGS_STORAGE_KEY, JSON.stringify(payload))\n } else {\n window.localStorage.removeItem(SETTINGS_STORAGE_KEY)\n }\n\n return {\n ...state,\n settings: payload\n }\n}\n\nconst setCustomerId = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(CUSTOMER_ID_STORAGE_KEY, payload)\n } else {\n window.localStorage.removeItem(CUSTOMER_ID_STORAGE_KEY)\n }\n\n return {\n ...state,\n customerId: payload\n }\n}\n\nconst setThreadId = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(THREAD_ID_STORAGE_KEY, payload)\n } else {\n window.localStorage.removeItem(THREAD_ID_STORAGE_KEY)\n }\n\n return {\n ...state,\n threadId: payload\n }\n}\n\nconst setChatVisibility = (state, payload) => {\n return {\n ...state,\n isChatOpen: payload\n }\n}\n\nconst setAvailability = (state, payload) => {\n return {\n ...state,\n availability: payload\n }\n}\n\nconst setThread = (state, payload) => {\n return {\n ...state,\n thread: payload\n }\n}\n\nconst setMessage = (state, payload) => {\n return {\n ...state,\n messages: [...state.messages, transformMessage(payload)]\n }\n}\n\nconst setMessages = (state, payload) => {\n return {\n ...state,\n messages: transformMessages(payload).reverse()\n }\n}\n\nconst setAgent = (state, payload) => {\n return {\n ...state,\n agent: payload\n }\n}\n\nconst setAgentIsTyping = (state, payload) => {\n return {\n ...state,\n isAgentTyping: payload\n }\n}\n\nconst setAgentStatus = (state, payload) => {\n return {\n ...state,\n agentStatus: payload\n }\n}\n\nconst setUnseenCount = (state, payload) => {\n return {\n ...state,\n unseenCount: payload\n }\n}\n\nconst toggleIsMobile = (state, payload) => {\n return {\n ...state,\n isMobile: payload\n }\n}\n\nconst toggleIsKeyboard = (state, payload) => {\n return {\n ...state,\n isKeyboard: payload\n }\n}\n\nexport const actionsMap = {\n SET_CHAT_VISIBILITY: setChatVisibility,\n SET_AVAILABILITY: setAvailability,\n SET_SETTINGS: setSettings,\n SET_CUSTOMER_ID: setCustomerId,\n SET_THREAD_ID: setThreadId,\n SET_THREAD: setThread,\n SET_MESSAGE: setMessage,\n SET_MESSAGES: setMessages,\n SET_AGENT: setAgent,\n SET_AGENT_TYPING: setAgentIsTyping,\n SET_AGENT_STATUS: setAgentStatus,\n SET_UNSEEN_COUNT: setUnseenCount,\n TOGGLE_IS_MOBILE: toggleIsMobile,\n TOGGLE_IS_KEYBOARD: toggleIsKeyboard\n}\n","export const SETTINGS_STORAGE_KEY = 'webchat_settings'\nexport const CUSTOMER_ID_STORAGE_KEY = 'webchat_customer_id'\nexport const THREAD_ID_STORAGE_KEY = 'webchat_thread_id'\n","import { actionsMap } from './actions-map'\n\nexport const initialState = {\n availability: null,\n customerId: null,\n threadId: null,\n thread: null,\n messages: [],\n unseenCount: 0,\n agent: null,\n agentStatus: null,\n isAgentTyping: false,\n isChatOpen: false,\n isMobile: window.matchMedia('(max-width: 640px)').matches,\n isKeyboard: false,\n settings: { audio: true, scroll: true }\n}\n\nexport const reducer = (state, action) => {\n const { type, payload } = action\n\n const fn = actionsMap[type]\n\n if (fn) {\n const actionFunction = fn.bind(this, state, payload)\n return actionFunction()\n }\n\n return state\n}\n","import { useContext } from 'react'\n\nimport { AppContext } from './AppProvider.jsx'\n\nexport const useApp = () => useContext(AppContext)\n","export const useChatSdk = sdk => {\n const connect = async () => sdk.authorize()\n\n const fetchCustomerId = async () => {\n const response = await connect()\n return response?.consumerIdentity.idOnExternalPlatform\n }\n\n const fetchThread = async threadId => {\n await connect()\n return sdk.getThread(threadId)\n }\n\n const fetchMessages = async (thread, threadId) => {\n await connect()\n\n const recovered = await thread.recover(threadId)\n\n const allMessages = []\n let fetchedMessages = recovered.messages\n\n while (fetchedMessages.length) {\n fetchedMessages.map(msg => allMessages.push(msg))\n\n try {\n const response = await thread.loadMoreMessages()\n fetchedMessages = response.data.messages\n } catch (err) {\n fetchedMessages = []\n }\n }\n\n return allMessages\n }\n\n return { connect, fetchCustomerId, fetchThread, fetchMessages }\n}\n","module.exports = require(\"@nice-devone/nice-cxone-chat-web-sdk\");","module.exports = require(\"luxon\");","module.exports = require(\"react\");","module.exports = require(\"react-dom\");","module.exports = require(\"react-dom/client\");","module.exports = require(\"uuid\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { ChatSdk } from '@nice-devone/nice-cxone-chat-web-sdk'\nimport { Availability } from './components/availability/availability.jsx'\nimport { checkAvailability } from './lib/check-availability'\nimport { AppProvider } from './store/AppProvider.jsx'\nimport { CUSTOMER_ID_STORAGE_KEY } from './store/constants.js'\n\nexport async function init (container, options) {\n const sdk = new ChatSdk({\n brandId: options.brandId,\n channelId: options.channelId,\n customerId: window.localStorage.getItem(CUSTOMER_ID_STORAGE_KEY) || '',\n environment: options.environment\n })\n\n const root = createRoot(container)\n let availability\n try {\n const result = await checkAvailability(options.availabilityEndpoint)\n availability = result.availability\n } catch (e) {\n availability = 'UNAVAILABLE'\n }\n root.render(\n <AppProvider sdk={sdk} availability={availability} options={options}>\n <Availability />\n </AppProvider>\n )\n}\n"],"names":["React","useEffect","useRef","useState","classnames","Panel","useApp","Availability","availability","isChatOpen","setChatVisibility","unseenCount","threadId","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","className","ref","role","href","draggable","PanelHeader","PanelFooter","Message","useTextareaAutosize","formatTranscript","Chat","onEndChatScreen","onSettingsScreen","thread","messages","agent","agentStatus","isAgentTyping","settings","isKeyboard","userMessage","setUserMessage","focusVisibleWithin","setFocusVisibleWithin","messageRef","scroll","length","chatBody","querySelector","scrollTop","scrollHeight","label","remove","add","onChange","e","target","value","agentName","nickname","firstName","connectionHeadlineText","sendMessage","sendTextMessage","trim","err","console","log","handleKeyPress","shiftKey","handleSubmit","saveChat","transcript","saveChatLink","setAttribute","tabIndex","map","msg","index","id","message","previousMessage","width","height","x","y","viewBox","stroke","cx","cy","r","fill","noValidate","onSubmit","htmlFor","rows","name","onFocus","onBlur","type","download","ErrorSummary","errors","errs","Object","keys","goToInput","getAttribute","focus","outbound","direction","messageOwnerSameAsPrevious","assignee","text","children","setUnseenCount","onClose","lastMessageSeen","ButtonComponent","focusable","d","useCallback","createPortal","PreChat","RequestChat","Unavailable","EndChat","Settings","Feedback","useChatSdk","useFocusedElements","sdk","setThread","setThreadId","setMessages","isMobile","fetchThread","fetchMessages","screen","setScreen","onEscapeKey","getElementsByTagName","escapeKeyEvent","addEventListener","removeEventListener","recover","fetchedThread","fetchedMessages","handleScreenChange","newScreen","goToPreChatScreen","goToRequestChatScreen","goToChatScreen","goToEndChatScreen","goToFeedbackScreen","goToSettingsScreen","ScreenComponent","onContinue","onPreChatScreen","onChatScreen","onEndChatConfirm","onCancel","Component","setCustomerId","confirmEndChat","endChat","feedbackCancel","rel","uuid","QUESTION_MAX_LENGTH","fetchCustomerId","setErrors","questionLength","setQuestionLength","isButtonDisabled","setButtonDisabled","nameRef","questionRef","isQuestionLengthValid","questionLengthRemaining","questionLengthExceeded","questionHint","onQuestionChange","buttonLabel","onRequestChat","question","v4","customerId","getCustomer","setName","startChat","setCustomField","style","color","disabled","setSettings","optionAudio","setOptionAudio","audio","optionScroll","setOptionScroll","onSave","defaultChecked","ariaHidden","dataWcInert","setAriaHidden","isInert","node","hasAttribute","removeAttribute","getFocusableElements","selectors","elements","querySelectorAll","join","Array","from","filter","closest","panelElements","setPanelElements","webchatPanelElement","activeElement","panelElement","textAreaRef","checkAvailability","endpoint","response","fetch","data","json","classes","classname","messageNotification","audioUrl","buffer","context","AudioContext","webkitAudioContext","state","events","unlock","_e","forEach","resume","then","arrayBuffer","decodeAudioData","decodedData","catch","error","source","createBufferSource","connect","destination","start","DateTime","transformMessage","messageContent","createdAt","Date","user","authorEndUserIdentity","fullName","authorUser","transformMessages","now","local","setZone","string","toFormat","author","date","fromJSDate","replace","encodeURIComponent","createContext","useReducer","useMemo","ChatEvent","initialState","reducer","CUSTOMER_ID_STORAGE_KEY","THREAD_ID_STORAGE_KEY","SETTINGS_STORAGE_KEY","AppContext","AppProvider","options","dispatch","playSound","onLiveChatRecovered","payload","detail","inboxAssignee","contact","status","customerStatistics","unseenMessagesCount","onAssignedAgentChanged","case","onAgentTypingStarted","onAgentTypingEnded","onMessageCreated","isAudioOn","JSON","parse","localStorage","getItem","onContactStatusChanged","onMatchMedia","matches","onKeydown","onPointerdown","onChatEvent","LIVECHAT_RECOVERED","MESSAGE_CREATED","AGENT_TYPING_STARTED","AGENT_TYPING_ENDED","ASSIGNED_AGENT_CHANGED","CONTACT_STATUS_CHANGED","matchMedia","location","hash","store","Provider","setItem","stringify","removeItem","setAvailability","setMessage","reverse","setAgent","setAgentIsTyping","setAgentStatus","toggleIsMobile","toggleIsKeyboard","actionsMap","SET_CHAT_VISIBILITY","SET_AVAILABILITY","SET_SETTINGS","SET_CUSTOMER_ID","SET_THREAD_ID","SET_THREAD","SET_MESSAGE","SET_MESSAGES","SET_AGENT","SET_AGENT_TYPING","SET_AGENT_STATUS","SET_UNSEEN_COUNT","TOGGLE_IS_MOBILE","TOGGLE_IS_KEYBOARD","action","fn","actionFunction","bind","useContext","authorize","consumerIdentity","idOnExternalPlatform","getThread","recovered","allMessages","push","loadMoreMessages","createRoot","ChatSdk","init","container","brandId","channelId","environment","root","result","availabilityEndpoint","render"],"sourceRoot":""}
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/feedback.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/pre-chat.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/request-chat.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/settings.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/unavailable.jsx","webpack://@defra/flood-webchat/./src/client/hooks/useFocusedElements.js","webpack://@defra/flood-webchat/./src/client/hooks/useTextareaAutosize.js","webpack://@defra/flood-webchat/./src/client/lib/check-availability.js","webpack://@defra/flood-webchat/./src/client/lib/classnames.js","webpack://@defra/flood-webchat/./src/client/lib/history.js","webpack://@defra/flood-webchat/./src/client/lib/message-notification.js","webpack://@defra/flood-webchat/./src/client/lib/transform-messages.js","webpack://@defra/flood-webchat/./src/client/store/AppProvider.jsx","webpack://@defra/flood-webchat/./src/client/store/actions-map.js","webpack://@defra/flood-webchat/./src/client/store/constants.js","webpack://@defra/flood-webchat/./src/client/store/reducer.js","webpack://@defra/flood-webchat/./src/client/store/useApp.js","webpack://@defra/flood-webchat/./src/client/store/useChatSdk.js","webpack://@defra/flood-webchat/external commonjs \"@nice-devone/nice-cxone-chat-web-sdk\"","webpack://@defra/flood-webchat/external commonjs \"luxon\"","webpack://@defra/flood-webchat/external commonjs \"react\"","webpack://@defra/flood-webchat/external commonjs \"react-dom\"","webpack://@defra/flood-webchat/external commonjs \"react-dom/client\"","webpack://@defra/flood-webchat/external commonjs \"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'\nimport { historyPushState } from '../../lib/history.js'\n\nexport function Availability () {\n const { availability, isChatOpen, setChatVisibility, unseenCount, threadId } = useApp()\n\n const [isFixed, setIsFixed] = useState(false)\n const buttonRef = useRef()\n\n const onClick = e => {\n e.preventDefault()\n setChatVisibility(!isChatOpen)\n historyPushState()\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 && threadId)\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-u-scroll-padding', isFixed)\n document.body.classList.toggle('wc-u-scroll-padding', isFixed)\n }, [isFixed])\n\n let TextComponent = (<>Show Chat</>)\n\n if (!threadId) {\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 role='button'\n data-module='govuk-button'\n >\n {TextComponent}\n {unseenCount > 0 && !isChatOpen ? <span className='wc-availability__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'\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 ({ onEndChatScreen, onSettingsScreen }) {\n const { availability, thread, messages, agent, agentStatus, isAgentTyping, settings, isKeyboard } = useApp()\n\n const [userMessage, setUserMessage] = useState('')\n const [focusVisibleWithin, setFocusVisibleWithin] = useState(false)\n\n const messageRef = useRef()\n\n useTextareaAutosize(messageRef.current, userMessage)\n\n useEffect(() => {\n if (settings.scroll && messages.length !== 0) {\n const chatBody = document.querySelector('.wc-body')\n chatBody.scrollTop = chatBody.scrollHeight\n }\n }, [messages, isAgentTyping])\n\n useEffect(() => {\n const label = document.querySelector('.wc-form__label')\n\n if (userMessage.length === 0) {\n label.classList.remove('govuk-visually-hidden')\n } else {\n label.classList.add('govuk-visually-hidden')\n }\n }, [userMessage])\n\n const onChange = e => {\n setUserMessage(e.target?.value)\n }\n\n const agentName = agent?.nickname || agent?.firstName\n\n let connectionHeadlineText = 'Connecting to Floodline'\n\n if (agentStatus === 'closed') {\n connectionHeadlineText = agentName ? `${agentName} ended the session` : 'Session ended by advisor'\n } else if (agentStatus) {\n if (agentName) {\n connectionHeadlineText = `You are speaking with ${agentName}`\n } else {\n connectionHeadlineText = 'No advisers currently available'\n }\n }\n\n if (availability === 'UNAVAILABLE') {\n connectionHeadlineText = 'Webchat is not currently available'\n }\n\n const sendMessage = () => {\n if (messageRef.current.value.length === 0) {\n return\n }\n\n try {\n thread.sendTextMessage(messageRef.current.value.trim())\n } catch (err) {\n console.log('[Chat Error] sendMessage', err)\n }\n\n setUserMessage('')\n }\n const handleKeyPress = e => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n sendMessage()\n }\n }\n\n const handleSubmit = e => {\n e.preventDefault()\n sendMessage()\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 }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-status'>\n <p className='wc-status__availability'>{connectionHeadlineText}</p>\n <a className='wc-status__link' href='#' data-module='govuk-button' onClick={onEndChatScreen}>End chat</a>\n </div>\n\n <div className='wc-body' tabIndex='0'>\n <ul className='wc-chat'>\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 outbound'>\n <div className='wc-chat__from'>{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\n <PanelFooter>\n <form className={`wc-form${focusVisibleWithin ? ' wc-focus-within' : ''}`} noValidate onSubmit={handleSubmit}>\n <label className='govuk-label wc-form__label' 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'\n id='wc-form-textarea'\n name='message'\n onChange={onChange}\n onKeyDown={handleKeyPress}\n onFocus={() => { setFocusVisibleWithin(isKeyboard) }}\n onBlur={() => { setFocusVisibleWithin(false) }}\n value={userMessage}\n />\n\n <input\n type='submit'\n className='wc-form__button govuk-button'\n value='Send'\n data-prevent-double-click='true'\n />\n </form>\n\n <div className='wc-footer__settings'>\n <a\n href='#'\n id='wc-settings'\n className='wc-footer__settings-link'\n data-module='govuk-button'\n onClick={onSettingsScreen}\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='wc-error-summary__title 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 wc-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', outbound ? 'outbound' : 'inbound')}>\n <div className='wc-chat__from'>\n {messageOwnerSameAsPrevious ? null : <span>{outbound ? message.assignee : 'You'}</span>}\n <span className='govuk-visually-hidden'>:</span>\n </div>\n <div className={classnames('wc-chat__text', outbound ? 'outbound' : 'inbound')}>\n {message.text}\n </div>\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'\nimport { historyReplaceState } from '../../lib/history.js'\n\nexport function PanelHeader () {\n const { thread, threadId, setChatVisibility, setUnseenCount, isMobile } = useApp()\n\n const onClose = e => {\n e.preventDefault()\n setChatVisibility(false)\n historyReplaceState()\n\n if (threadId) {\n thread?.lastMessageSeen()\n setUnseenCount(0)\n }\n }\n\n const BackButtonComponent = (\n <button className='wc-header__back' 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='M4.828,11L12.314,18.485L10.899,19.899L1,10L10.899,0.101L12.314,1.515L4.828,9L19,9L19,11L4.828,11Z' fill='currentColor' />\n </svg>\n </button>\n )\n\n const CloseButtonComponent = (\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 const MinimiseButtonComponent = (\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 let RightButtonComponent = CloseButtonComponent\n\n if (thread) {\n RightButtonComponent = MinimiseButtonComponent\n\n if (isMobile && !window.history.state) {\n RightButtonComponent = MinimiseButtonComponent\n }\n }\n\n if (!thread && isMobile && !window.history.state) {\n RightButtonComponent = CloseButtonComponent\n }\n\n if (isMobile && window.history.state) {\n RightButtonComponent = null\n }\n\n return (\n <div className='wc-header'>\n {window.history.state ? BackButtonComponent : null}\n\n <h2 id='wc-header-title' className='wc-header__title'>\n Floodline Webchat\n </h2>\n\n {RightButtonComponent}\n </div>\n )\n}\n","import React, { useEffect, useState, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { PreChat } from '../screens/pre-chat.jsx'\nimport { RequestChat } from '../screens/request-chat.jsx'\nimport { Chat } from '../chat/chat.jsx'\nimport { Unavailable } from '../screens/unavailable.jsx'\nimport { EndChat } from '../screens/end-chat.jsx'\nimport { Settings } from '../screens/settings.jsx'\nimport { Feedback } from '../screens/feedback.jsx'\n\nimport { useApp } from '../../store/useApp.js'\nimport { useChatSdk } from '../../store/useChatSdk.js'\nimport { useFocusedElements } from '../../hooks/useFocusedElements.js'\nimport { historyReplaceState } from '../../lib/history.js'\n\nexport function Panel () {\n const { sdk, availability, thread, threadId, setThread, setThreadId, setChatVisibility, setMessages, setUnseenCount, isMobile } = useApp()\n const { fetchThread, fetchMessages } = useChatSdk(sdk)\n\n const [screen, setScreen] = useState(threadId ? 2 : 0)\n\n useFocusedElements(screen)\n\n const onEscapeKey = useCallback(e => {\n if (e.key === 'Escape' || e.key === 'Esc') {\n if (threadId) {\n thread?.lastMessageSeen()\n setUnseenCount(0)\n }\n setChatVisibility(false)\n historyReplaceState()\n }\n }, [thread, threadId, setUnseenCount, setChatVisibility])\n\n /**\n * We need ammend classes on the body element to handle mobile behaviour\n */\n useEffect(() => {\n document.body.classList.remove('wc-u-hidden')\n document.getElementsByTagName('html')[0].classList.add('wc-u-html')\n document.body.classList.add('wc-u-body')\n return () => {\n document.getElementsByTagName('html')[0].classList.remove('wc-u-html')\n document.body.classList.remove('wc-u-body')\n }\n }, [isMobile])\n\n /**\n * Initializes the eventListener for pressing the escape key\n */\n useEffect(() => {\n document.addEventListener('keydown', onEscapeKey)\n\n return () => {\n document.removeEventListener('keydown', onEscapeKey)\n }\n }, [onEscapeKey, setChatVisibility])\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 handleScreenChange = newScreen => e => {\n e.preventDefault()\n setScreen(newScreen)\n }\n\n const goToPreChatScreen = handleScreenChange(0)\n const goToRequestChatScreen = handleScreenChange(1)\n const goToChatScreen = handleScreenChange(2)\n const goToEndChatScreen = handleScreenChange(3)\n const goToFeedbackScreen = handleScreenChange(4)\n const goToSettingsScreen = handleScreenChange(5)\n let ScreenComponent\n\n switch (screen) {\n case 0:\n ScreenComponent = <PreChat onContinue={goToRequestChatScreen} />\n break\n case 1:\n ScreenComponent = <RequestChat onPreChatScreen={goToPreChatScreen} />\n break\n case 2:\n ScreenComponent = <Chat onSettingsScreen={goToSettingsScreen} onEndChatScreen={goToEndChatScreen} />\n break\n case 3:\n ScreenComponent = <EndChat onChatScreen={goToChatScreen} onEndChatConfirm={goToFeedbackScreen} />\n break\n case 4:\n ScreenComponent = <Feedback onCancel={() => setChatVisibility(false)} />\n break\n case 5:\n ScreenComponent = <Settings onCancel={goToChatScreen} />\n break\n default:\n ScreenComponent = <PreChat onContinue={goToRequestChatScreen} />\n }\n\n if (availability === 'UNAVAILABLE') {\n ScreenComponent = <Unavailable />\n }\n\n const Component = (\n <div id='wc-panel' role='dialog' className='wc-panel' tabIndex='-1' aria-modal='true' aria-labelledby='wc-header-title'>\n <div className='wc-panel__inner'>\n {ScreenComponent}\n </div>\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'\nimport { useApp } from '../../store/useApp.js'\n\nexport function EndChat ({ onChatScreen, onEndChatConfirm }) {\n const { setCustomerId, setThreadId, setMessages, agentStatus, thread, setUnseenCount } = useApp()\n\n const confirmEndChat = async e => {\n e.preventDefault()\n\n setThreadId()\n setMessages([])\n setCustomerId()\n thread.lastMessageSeen()\n setUnseenCount(0)\n\n // End chat if still open\n if (agentStatus !== 'closed') {\n thread.endChat()\n }\n\n onEndChatConfirm(e)\n }\n\n return (\n <>\n <PanelHeader />\n <div className='wc-body'>\n <div className='wc-content'>\n <h3 className='wc-heading' aria-live='polite'>Are you sure you want to end the chat?</h3>\n <div className='govuk-button-group'>\n <a href='#endChat' role='button' className='wc-button govuk-button' data-module='govuk-button' id='confirmEndChat' onClick={confirmEndChat}>Yes, end chat</a>\n <a href='#resumeChat' role='button' className='wc-link govuk-link' onClick={onChatScreen}>No, resume chat</a>\n </div>\n </div>\n </div>\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function Feedback ({ onCancel }) {\n const feedbackCancel = async e => {\n onCancel(e)\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <div className='wc-content'>\n <h3 id='wc-subtitle' className='wc-heading'>Give Feedback on Floodline webchat</h3>\n <p>Please note we’re unable to respond to feedback.</p>\n <p><a className='govuk-link' href='#' target='_blank' rel='noreferrer'>Feedback Link</a></p>\n <p><a id='feedback-cancel' className='wc-link govuk-link' href='#' data-module='govuk-button' role='button' onClick={feedbackCancel}>Close</a></p>\n </div>\n </div>\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function PreChat ({ onContinue }) {\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <div className='wc-content'>\n <h3 className='wc-heading' aria-live='polite'>What you can use webchat for</h3>\n <p>Webchat lets you talk directly to a Floodline adviser.</p>\n\n <p>You can use webchat to get:</p>\n <ul className='wc-list'>\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 <p>\n There are other ways to&nbsp;\n <a className='govuk-link' href='https://www.gov.uk/sign-up-for-flood-warnings' target='_blank' rel='noreferrer'>\n sign up for flood warnings\n </a>\n &nbsp;and&nbsp;\n <a className='govuk-link' href='https://www.fws.environment-agency.gov.uk/app/olr/login' target='_blank' rel='noreferrer'>\n manage your flood warnings account\n </a>.\n </p>\n <p>\n Do not use webchat to&nbsp;\n <a\n className='govuk-link'\n href='https://www.gov.uk/report-flood-cause'\n target='_blank'\n rel='noreferrer'\n >\n report a flood\n </a>.\n </p>\n\n <button className='govuk-button wc-button govuk-!-margin-top-1' data-module='govuk-button' onClick={onContinue}>Continue</button>\n\n <h3 className='wc-heading'>Other flood information</h3>\n\n <p>Call Floodline for all other flood and flood warning information.</p>\n <p>\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' target='_blank' rel='noreferrer'>Find out more about call charges</a>\n </p>\n </div>\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 ({ onPreChatScreen }) {\n const { sdk, setCustomerId, setThreadId, setThread } = useApp()\n const { fetchCustomerId, fetchThread } = useChatSdk(sdk)\n const [errors, setErrors] = useState({})\n const [questionLength, setQuestionLength] = useState(0)\n const [isButtonDisabled, setButtonDisabled] = useState(false)\n\n const nameRef = useRef()\n const questionRef = useRef()\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 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 buttonLabel = isButtonDisabled ? 'Requesting...' : 'Request Chat'\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 setButtonDisabled(true)\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 thread.setCustomField('threadid', threadId)\n } catch (err) {\n console.log('[Request Chat Error]', err)\n }\n }\n\n setErrors(errs)\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <div className='wc-content'>\n <a href='#' className='wc-back-link govuk-back-link' onClick={onPreChatScreen}>\n What you can use webchat for\n </a>\n\n <ErrorSummary errors={errors} />\n\n <h3 className='wc-heading' aria-live='polite'>\n Your name and question\n </h3>\n\n <form>\n <div className={classnames('wc-form-group', 'govuk-form-group', errors.name && 'govuk-form-group--error')}>\n <label className='wc-label 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('wc-input', '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='wc-form-group 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='wc-label 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('wc-textarea', 'govuk-textarea', 'govuk-js-character-count', !isQuestionLengthValid || errors.question ? 'govuk-textarea--error' : '')}\n data-testid='request-chat-user-question'\n />\n <div\n id='wc-question-info'\n className='wc-hint govuk-hint govuk-char-count__msg'\n style={{ color: `${!isQuestionLengthValid ? '#d4351c' : ''}` }}\n aria-hidden='true'\n >\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 <div className='wc-inset-text govuk-inset-text'>\n By selecting 'Request chat' you agree to the terms of our&nbsp;\n <a href='https://check-for-flooding.service.gov.uk/privacy-notice' target='_blank' rel='noreferrer' className='govuk-link'>privacy notice</a>.\n </div>\n\n <button\n className='wc-button govuk-button govuk-!-margin-top-1'\n data-module='govuk-button'\n onClick={onRequestChat}\n disabled={isButtonDisabled}\n >\n {buttonLabel}\n </button>\n </form>\n </div>\n </div>\n </>\n )\n}\n","import React, { useState } from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nimport { useApp } from '../../store/useApp.js'\n\nexport function Settings ({ onCancel }) {\n const { settings, setSettings } = useApp()\n\n const [optionAudio, setOptionAudio] = useState(settings.audio)\n const [optionScroll, setOptionScroll] = useState(settings.scroll)\n\n const onSave = e => {\n e.preventDefault()\n\n setSettings({ audio: optionAudio, scroll: optionScroll })\n onCancel(e)\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <div className='wc-content'>\n <fieldset className='govuk-fieldset govuk-!-margin-bottom-4'>\n <legend className='govuk-fieldset__legend govuk-fieldset__legend'>\n <h3 id='wc-subtitle' className='wc-heading'>Change settings</h3>\n </legend>\n <div className='govuk-checkboxes govuk-checkboxes--small' data-module='govuk-checkboxes'>\n <div className='govuk-checkboxes__item'>\n <input\n id='audio'\n name='audio'\n type='checkbox'\n value='audio'\n className='govuk-checkboxes__input'\n defaultChecked={optionAudio}\n onChange={() => setOptionAudio(!optionAudio)}\n />\n <label className='wc-label govuk-label govuk-checkboxes__label' htmlFor='audio'>\n Play a sound when receiving a new message\n </label>\n </div>\n <div className='govuk-checkboxes__item'>\n <input\n id='scroll'\n name='scroll'\n type='checkbox'\n value='scroll'\n className='govuk-checkboxes__input'\n defaultChecked={optionScroll}\n onChange={() => setOptionScroll(!optionScroll)}\n />\n <label className='wc-label govuk-label govuk-checkboxes__label' htmlFor='scroll'>\n Scroll automatically to a new message\n </label>\n </div>\n </div>\n </fieldset>\n\n <div className='govuk-button-group'>\n <a id='settings-save' href='#' className='wc-button govuk-button' data-module='govuk-button' onClick={onSave}>Save</a>\n <a id='settings-cancel' href='#' className='wc-link govuk-link' data-module='govuk-button' onClick={onCancel}>Cancel</a>\n </div>\n </div>\n </div>\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function Unavailable () {\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <h3 id='wc-subtitle' className='govuk-heading-m'>Webchat is currently not available</h3>\n <p className='govuk-body-s'>Try again later, or call Floodline:</p>\n <p className='govuk-body-s'>\n <strong>Floodline helpline</strong>\n <br />Telephone: 0345 988 1188\n <br />Textphone: 0345 602 6340\n <br />Open 24 hours a day, 7 days a week\n <br /><a className='govuk-link' href='https://gov.uk/call-charges'>Find out more about call charges</a>\n </p>\n <p className='govuk-body-s'>We're running webchat as a trial, it will not always be available.</p>\n </div>\n </>\n )\n}\n","import { useState, useEffect, useCallback } from 'react'\n\nconst ariaHidden = 'aria-hidden'\nconst dataWcInert = 'data-wc-inert'\n\nconst setAriaHidden = isInert => {\n for (const node of document.body.children) {\n if (node.id !== 'wc-panel') {\n // We only want to toggle elements that aren't already inert\n if (isInert && !node.getAttribute(ariaHidden)) {\n node.setAttribute(ariaHidden, 'true')\n node.setAttribute(dataWcInert, '')\n } else if (node.hasAttribute(dataWcInert)) {\n node.removeAttribute(ariaHidden)\n node.removeAttribute(dataWcInert)\n }\n }\n }\n}\n\nexport const getFocusableElements = () => {\n const selectors = [\n '#wc-panel a:not([disabled])',\n '#wc-panel button:not([disabled])',\n '#wc-panel select:not([disabled])',\n '#wc-panel input:not([disabled])',\n '#wc-panel textarea:not([disabled])',\n '#wc-panel *[tabindex=\"0\"]:not([disabled])'\n ]\n\n const elements = document.body.querySelectorAll(selectors.join(','))\n return Array.from(elements).filter(e => !e.closest('[hidden]') && !e.closest('[aria-hidden=\"true\"]'))\n}\n\nconst useFocusedElements = screen => {\n const [panelElements, setPanelElements] = useState([])\n\n const onKeyDown = useCallback(e => {\n const webchatPanelElement = document.querySelector('#wc-panel')\n\n if (e.key === 'Tab') {\n if (webchatPanelElement && !document.activeElement.closest('#wc-panel')) {\n webchatPanelElement.focus()\n }\n\n if (e.shiftKey) {\n if (document.activeElement === panelElements[0]) {\n panelElements[panelElements.length - 1].focus()\n e.preventDefault()\n } else if (document.activeElement === document.querySelector('#wc-panel')) {\n panelElements[panelElements.length - 1]?.focus()\n e.preventDefault()\n }\n } else if (document.activeElement === panelElements[panelElements.length - 1]) {\n panelElements[0].focus()\n e.preventDefault()\n }\n }\n }, [panelElements])\n\n useEffect(() => {\n setPanelElements(getFocusableElements())\n }, [screen])\n\n useEffect(() => {\n setAriaHidden(true)\n\n const panelElement = document.querySelector('#wc-panel')\n panelElement.focus()\n\n document.addEventListener('keydown', onKeyDown)\n\n return () => {\n setAriaHidden()\n document.body.querySelector('.wc-availability__link')?.focus()\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [panelElements])\n}\n\nexport { useFocusedElements }\n","import { useEffect } from 'react'\n\nexport const useTextareaAutosize = (textAreaRef, value) => {\n useEffect(() => {\n if (textAreaRef) {\n textAreaRef.style.height = '0px'\n\n const scrollHeight = textAreaRef.scrollHeight\n\n textAreaRef.style.height = `${scrollHeight}px`\n }\n }, [textAreaRef, value])\n}\n","export async function checkAvailability (endpoint) {\n const response = await fetch(endpoint)\n const data = await response.json()\n\n return {\n availability: data.availability || 'UNAVAILABLE'\n }\n}\n","export const classnames = (...classes) => classes.filter(classname => classname && typeof classname === 'string').join(' ')\n","export const historyPushState = () => {\n const url = window.location.href.split('#')[0]\n window.history.pushState({ history: true }, null, `${url}#webchat`)\n}\n\nexport const historyReplaceState = () => {\n if (window.history.state?.history) {\n window.history.back()\n }\n\n const url = window.location.href.split('#')[0]\n window.history.replaceState(null, null, url)\n}\n","export const messageNotification = audioUrl => {\n let buffer\n\n const context = new (window.AudioContext || window.webkitAudioContext)()\n\n if (context.state === 'suspended') {\n const events = ['touchstart', 'touchend', 'mousedown', 'wheel', 'keydown', 'click']\n\n const unlock = _e => {\n events.forEach(event => {\n document.body.removeEventListener(event, unlock)\n })\n\n context.resume()\n }\n\n events.forEach(event => {\n document.body.addEventListener(event, unlock, false)\n })\n }\n\n fetch(audioUrl)\n .then(response => response.arrayBuffer())\n .then(data => context.decodeAudioData(data))\n .then(decodedData => {\n buffer = decodedData\n })\n .catch(console.error)\n\n return () => {\n const source = context.createBufferSource()\n source.buffer = buffer\n source.connect(context.destination)\n source.start()\n }\n}\n","import { DateTime } from 'luxon'\n\nexport const transformMessage = message => {\n return {\n id: message.id,\n text: 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')}\\n\\n`\n\n for (const message of messages) {\n const { text, direction, user, assignee, createdAt } = message\n\n const author = direction === 'inbound' ? user : `${assignee} (Floodline adviser)`\n const date = DateTime.fromJSDate(new Date(createdAt)).setZone('Europe/London').toFormat('HH:mm:ss a, dd LLLL yyyy')\n\n string += `[${date}] ${author}: \\n${text}\\n\\n`\n }\n\n string = string.replace(/<a\\b[^>]*>/i, '').replace(/<\\/a>/i, '')\n\n return encodeURIComponent(string)\n}\n","import React, { createContext, useEffect, useReducer, useMemo } from 'react'\nimport { ChatEvent } from '@nice-devone/nice-cxone-chat-web-sdk'\n\nimport { messageNotification } from '../lib/message-notification.js'\n\nimport { initialState, reducer } from './reducer.js'\nimport { CUSTOMER_ID_STORAGE_KEY, THREAD_ID_STORAGE_KEY, SETTINGS_STORAGE_KEY } from './constants.js'\n\nexport const AppContext = createContext(initialState)\n\nexport const AppProvider = ({ sdk, availability, options, children }) => {\n const [state, dispatch] = useReducer(reducer, initialState)\n\n const playSound = messageNotification(options.audioUrl)\n\n /**\n * SDK event handlers\n */\n const onLiveChatRecovered = e => {\n dispatch({ type: 'SET_AGENT', payload: e.detail.data.inboxAssignee })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.contact.status })\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: e.detail.data.contact.customerStatistics.unseenMessagesCount })\n }\n\n const onAssignedAgentChanged = e => {\n dispatch({ type: 'SET_AGENT', payload: e.detail.data.inboxAssignee })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n }\n\n const onAgentTypingStarted = () => {\n dispatch({ type: 'SET_AGENT_TYPING', payload: true })\n }\n\n const onAgentTypingEnded = () => {\n dispatch({ type: 'SET_AGENT_TYPING', payload: false })\n }\n\n const onMessageCreated = e => {\n dispatch({ type: 'SET_MESSAGE', payload: e.detail.data.message })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: e.detail.data.case.customerStatistics.unseenMessagesCount })\n\n const isAudioOn = JSON.parse(window.localStorage.getItem(SETTINGS_STORAGE_KEY)).audio\n\n if (isAudioOn && e.detail.data.message.direction === 'outbound') {\n playSound()\n }\n }\n\n const onContactStatusChanged = e => {\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n }\n\n const onMatchMedia = e => {\n dispatch({ type: 'TOGGLE_IS_MOBILE', payload: e.matches })\n }\n\n const onKeydown = () => {\n dispatch({ type: 'TOGGLE_IS_KEYBOARD', payload: true })\n }\n\n const onPointerdown = () => {\n dispatch({ type: 'TOGGLE_IS_KEYBOARD', payload: false })\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 // We need to know if it is a mobile and if it is a keyboard interaction\n window.matchMedia('(max-width: 640px)').addEventListener('change', onMatchMedia)\n window.addEventListener('keydown', onKeydown)\n window.addEventListener('pointerdown', onPointerdown)\n // Tidying up\n return () => {\n window.removeEventListener('change', onMatchMedia)\n window.removeEventListener('keydown', onKeydown)\n window.removeEventListener('pointerdown', onPointerdown)\n }\n }, [sdk])\n\n /**\n * Initialize customerId, threadId and whether the webchat should be open\n */\n useEffect(() => {\n dispatch({ type: 'SET_AVAILABILITY', payload: availability })\n\n setCustomerId(window.localStorage.getItem(CUSTOMER_ID_STORAGE_KEY))\n setThreadId(window.localStorage.getItem(THREAD_ID_STORAGE_KEY))\n setSettings(JSON.parse(window.localStorage.getItem(SETTINGS_STORAGE_KEY)) || state.settings)\n }, [])\n\n /**\n * Set browser history on start chat click\n */\n useEffect(() => {\n if (window.location.hash === '#webchat') {\n setChatVisibility(true)\n }\n\n const onBrowserNavigation = window.addEventListener('popstate', () => {\n if (window.location.hash === '#webchat') {\n setChatVisibility(true)\n } else {\n setChatVisibility(false)\n }\n })\n\n return () => {\n window.removeEventListener('popstate', onBrowserNavigation)\n }\n }, [])\n\n /**\n * State update functions\n */\n const setChatVisibility = payload => {\n dispatch({ type: 'SET_CHAT_VISIBILITY', payload })\n }\n\n const setCustomerId = customerId => {\n dispatch({ type: 'SET_CUSTOMER_ID', payload: customerId })\n }\n\n const setThreadId = threadId => {\n dispatch({ type: 'SET_THREAD_ID', payload: threadId })\n }\n\n const setThread = thread => {\n dispatch({ type: 'SET_THREAD', payload: thread })\n }\n\n const setMessages = messages => {\n dispatch({ type: 'SET_MESSAGES', payload: messages })\n }\n\n const setSettings = data => {\n dispatch({ type: 'SET_SETTINGS', payload: data })\n }\n\n const setUnseenCount = unseenCount => {\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: unseenCount })\n }\n\n /**\n * Application-wide state and state functions\n */\n const store = useMemo(() => ({\n ...state,\n sdk,\n setSettings,\n setCustomerId,\n setThreadId,\n setThread,\n setMessages,\n setUnseenCount,\n setChatVisibility,\n onLiveChatRecovered,\n onAssignedAgentChanged,\n onAgentTypingStarted,\n onAgentTypingEnded,\n onMessageCreated,\n onContactStatusChanged\n }))\n\n return (\n <AppContext.Provider value={store}>\n {children}\n </AppContext.Provider>\n )\n}\n","import { transformMessages, transformMessage } from '../lib/transform-messages'\nimport { CUSTOMER_ID_STORAGE_KEY, THREAD_ID_STORAGE_KEY, SETTINGS_STORAGE_KEY } from './constants'\n\nconst setSettings = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(SETTINGS_STORAGE_KEY, JSON.stringify(payload))\n } else {\n window.localStorage.removeItem(SETTINGS_STORAGE_KEY)\n }\n\n return {\n ...state,\n settings: payload\n }\n}\n\nconst setCustomerId = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(CUSTOMER_ID_STORAGE_KEY, payload)\n } else {\n window.localStorage.removeItem(CUSTOMER_ID_STORAGE_KEY)\n }\n\n return {\n ...state,\n customerId: payload\n }\n}\n\nconst setThreadId = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(THREAD_ID_STORAGE_KEY, payload)\n } else {\n window.localStorage.removeItem(THREAD_ID_STORAGE_KEY)\n }\n\n return {\n ...state,\n threadId: payload\n }\n}\n\nconst setChatVisibility = (state, payload) => {\n return {\n ...state,\n isChatOpen: payload\n }\n}\n\nconst setAvailability = (state, payload) => {\n return {\n ...state,\n availability: payload\n }\n}\n\nconst setThread = (state, payload) => {\n return {\n ...state,\n thread: payload\n }\n}\n\nconst setMessage = (state, payload) => {\n return {\n ...state,\n messages: [...state.messages, transformMessage(payload)]\n }\n}\n\nconst setMessages = (state, payload) => {\n return {\n ...state,\n messages: transformMessages(payload).reverse()\n }\n}\n\nconst setAgent = (state, payload) => {\n return {\n ...state,\n agent: payload\n }\n}\n\nconst setAgentIsTyping = (state, payload) => {\n return {\n ...state,\n isAgentTyping: payload\n }\n}\n\nconst setAgentStatus = (state, payload) => {\n return {\n ...state,\n agentStatus: payload\n }\n}\n\nconst setUnseenCount = (state, payload) => {\n return {\n ...state,\n unseenCount: payload\n }\n}\n\nconst toggleIsMobile = (state, payload) => {\n return {\n ...state,\n isMobile: payload\n }\n}\n\nconst toggleIsKeyboard = (state, payload) => {\n return {\n ...state,\n isKeyboard: payload\n }\n}\n\nexport const actionsMap = {\n SET_CHAT_VISIBILITY: setChatVisibility,\n SET_AVAILABILITY: setAvailability,\n SET_SETTINGS: setSettings,\n SET_CUSTOMER_ID: setCustomerId,\n SET_THREAD_ID: setThreadId,\n SET_THREAD: setThread,\n SET_MESSAGE: setMessage,\n SET_MESSAGES: setMessages,\n SET_AGENT: setAgent,\n SET_AGENT_TYPING: setAgentIsTyping,\n SET_AGENT_STATUS: setAgentStatus,\n SET_UNSEEN_COUNT: setUnseenCount,\n TOGGLE_IS_MOBILE: toggleIsMobile,\n TOGGLE_IS_KEYBOARD: toggleIsKeyboard\n}\n","export const SETTINGS_STORAGE_KEY = 'webchat_settings'\nexport const CUSTOMER_ID_STORAGE_KEY = 'webchat_customer_id'\nexport const THREAD_ID_STORAGE_KEY = 'webchat_thread_id'\n","import { actionsMap } from './actions-map'\n\nexport const initialState = {\n availability: null,\n customerId: null,\n threadId: null,\n thread: null,\n messages: [],\n unseenCount: 0,\n agent: null,\n agentStatus: null,\n isAgentTyping: false,\n isChatOpen: false,\n isMobile: window.matchMedia('(max-width: 640px)').matches,\n isKeyboard: false,\n settings: { audio: true, scroll: true }\n}\n\nexport const reducer = (state, action) => {\n const { type, payload } = action\n\n const fn = actionsMap[type]\n\n if (fn) {\n const actionFunction = fn.bind(this, state, payload)\n return actionFunction()\n }\n\n return state\n}\n","import { useContext } from 'react'\n\nimport { AppContext } from './AppProvider.jsx'\n\nexport const useApp = () => useContext(AppContext)\n","export const useChatSdk = sdk => {\n const connect = async () => sdk.authorize()\n\n const fetchCustomerId = async () => {\n const response = await connect()\n return response?.consumerIdentity.idOnExternalPlatform\n }\n\n const fetchThread = async threadId => {\n await connect()\n return sdk.getThread(threadId)\n }\n\n const fetchMessages = async (thread, threadId) => {\n await connect()\n\n const recovered = await thread.recover(threadId)\n\n const allMessages = []\n let fetchedMessages = recovered.messages\n\n while (fetchedMessages.length) {\n fetchedMessages.map(msg => allMessages.push(msg))\n\n try {\n const response = await thread.loadMoreMessages()\n fetchedMessages = response.data.messages\n } catch (err) {\n fetchedMessages = []\n }\n }\n\n return allMessages\n }\n\n return { connect, fetchCustomerId, fetchThread, fetchMessages }\n}\n","module.exports = require(\"@nice-devone/nice-cxone-chat-web-sdk\");","module.exports = require(\"luxon\");","module.exports = require(\"react\");","module.exports = require(\"react-dom\");","module.exports = require(\"react-dom/client\");","module.exports = require(\"uuid\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { ChatSdk } from '@nice-devone/nice-cxone-chat-web-sdk'\nimport { Availability } from './components/availability/availability.jsx'\nimport { checkAvailability } from './lib/check-availability'\nimport { AppProvider } from './store/AppProvider.jsx'\nimport { CUSTOMER_ID_STORAGE_KEY } from './store/constants.js'\n\nexport async function init (container, options) {\n const sdk = new ChatSdk({\n brandId: options.brandId,\n channelId: options.channelId,\n customerId: window.localStorage.getItem(CUSTOMER_ID_STORAGE_KEY) || '',\n environment: options.environment\n })\n\n const root = createRoot(container)\n let availability\n try {\n const result = await checkAvailability(options.availabilityEndpoint)\n availability = result.availability\n } catch (e) {\n availability = 'UNAVAILABLE'\n }\n root.render(\n <AppProvider sdk={sdk} availability={availability} options={options}>\n <Availability />\n </AppProvider>\n )\n}\n"],"names":["React","useEffect","useRef","useState","classnames","Panel","useApp","historyPushState","Availability","availability","isChatOpen","setChatVisibility","unseenCount","threadId","isFixed","setIsFixed","buttonRef","onClick","e","preventDefault","onKeyDown","event","key","onKeyUp","intersectionCallback","entries","entry","isBelowFold","isIntersecting","boundingClientRect","top","observer","window","IntersectionObserver","rootMargin","parentElement","current","observe","unobserve","document","documentElement","classList","toggle","body","TextComponent","createElement","Fragment","className","ref","href","draggable","role","PanelHeader","PanelFooter","Message","useTextareaAutosize","formatTranscript","Chat","onEndChatScreen","onSettingsScreen","thread","messages","agent","agentStatus","isAgentTyping","settings","isKeyboard","userMessage","setUserMessage","focusVisibleWithin","setFocusVisibleWithin","messageRef","scroll","length","chatBody","querySelector","scrollTop","scrollHeight","label","remove","add","onChange","target","value","agentName","nickname","firstName","connectionHeadlineText","sendMessage","sendTextMessage","trim","err","console","log","handleKeyPress","shiftKey","handleSubmit","saveChat","transcript","saveChatLink","setAttribute","tabIndex","map","msg","index","id","message","previousMessage","width","height","x","y","viewBox","stroke","cx","cy","r","fill","noValidate","onSubmit","htmlFor","rows","name","onFocus","onBlur","type","download","ErrorSummary","errors","errs","Object","keys","goToInput","getAttribute","focus","outbound","direction","messageOwnerSameAsPrevious","assignee","text","children","historyReplaceState","setUnseenCount","isMobile","onClose","lastMessageSeen","BackButtonComponent","focusable","d","CloseButtonComponent","MinimiseButtonComponent","RightButtonComponent","history","state","useCallback","createPortal","PreChat","RequestChat","Unavailable","EndChat","Settings","Feedback","useChatSdk","useFocusedElements","sdk","setThread","setThreadId","setMessages","fetchThread","fetchMessages","screen","setScreen","onEscapeKey","getElementsByTagName","addEventListener","removeEventListener","recover","fetchedThread","fetchedMessages","handleScreenChange","newScreen","goToPreChatScreen","goToRequestChatScreen","goToChatScreen","goToEndChatScreen","goToFeedbackScreen","goToSettingsScreen","ScreenComponent","onContinue","onPreChatScreen","onChatScreen","onEndChatConfirm","onCancel","Component","setCustomerId","confirmEndChat","endChat","feedbackCancel","rel","uuid","QUESTION_MAX_LENGTH","fetchCustomerId","setErrors","questionLength","setQuestionLength","isButtonDisabled","setButtonDisabled","nameRef","questionRef","isQuestionLengthValid","questionLengthRemaining","questionLengthExceeded","questionHint","onQuestionChange","buttonLabel","onRequestChat","question","v4","customerId","getCustomer","setName","startChat","setCustomField","style","color","disabled","setSettings","optionAudio","setOptionAudio","audio","optionScroll","setOptionScroll","onSave","defaultChecked","ariaHidden","dataWcInert","setAriaHidden","isInert","node","hasAttribute","removeAttribute","getFocusableElements","selectors","elements","querySelectorAll","join","Array","from","filter","closest","panelElements","setPanelElements","webchatPanelElement","activeElement","panelElement","textAreaRef","checkAvailability","endpoint","response","fetch","data","json","classes","classname","url","location","split","pushState","back","replaceState","messageNotification","audioUrl","buffer","context","AudioContext","webkitAudioContext","events","unlock","_e","forEach","resume","then","arrayBuffer","decodeAudioData","decodedData","catch","error","source","createBufferSource","connect","destination","start","DateTime","transformMessage","messageContent","createdAt","Date","user","authorEndUserIdentity","fullName","authorUser","transformMessages","now","local","setZone","string","toFormat","author","date","fromJSDate","replace","encodeURIComponent","createContext","useReducer","useMemo","ChatEvent","initialState","reducer","CUSTOMER_ID_STORAGE_KEY","THREAD_ID_STORAGE_KEY","SETTINGS_STORAGE_KEY","AppContext","AppProvider","options","dispatch","playSound","onLiveChatRecovered","payload","detail","inboxAssignee","contact","status","customerStatistics","unseenMessagesCount","onAssignedAgentChanged","case","onAgentTypingStarted","onAgentTypingEnded","onMessageCreated","isAudioOn","JSON","parse","localStorage","getItem","onContactStatusChanged","onMatchMedia","matches","onKeydown","onPointerdown","onChatEvent","LIVECHAT_RECOVERED","MESSAGE_CREATED","AGENT_TYPING_STARTED","AGENT_TYPING_ENDED","ASSIGNED_AGENT_CHANGED","CONTACT_STATUS_CHANGED","matchMedia","hash","onBrowserNavigation","store","Provider","setItem","stringify","removeItem","setAvailability","setMessage","reverse","setAgent","setAgentIsTyping","setAgentStatus","toggleIsMobile","toggleIsKeyboard","actionsMap","SET_CHAT_VISIBILITY","SET_AVAILABILITY","SET_SETTINGS","SET_CUSTOMER_ID","SET_THREAD_ID","SET_THREAD","SET_MESSAGE","SET_MESSAGES","SET_AGENT","SET_AGENT_TYPING","SET_AGENT_STATUS","SET_UNSEEN_COUNT","TOGGLE_IS_MOBILE","TOGGLE_IS_KEYBOARD","action","fn","actionFunction","bind","useContext","authorize","consumerIdentity","idOnExternalPlatform","getThread","recovered","allMessages","push","loadMoreMessages","createRoot","ChatSdk","init","container","brandId","channelId","environment","root","result","availabilityEndpoint","render"],"sourceRoot":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra/flood-webchat",
3
- "version": "0.0.1-beta.27",
3
+ "version": "0.0.1-beta.28",
4
4
  "description": "",
5
5
  "main": "dist/server.js",
6
6
  "browser": "dist/client.js",
@@ -3,6 +3,7 @@ import React, { useEffect, useRef, useState } from 'react'
3
3
  import { classnames } from '../../lib/classnames'
4
4
  import { Panel } from '../panel/panel.jsx'
5
5
  import { useApp } from '../../store/useApp'
6
+ import { historyPushState } from '../../lib/history.js'
6
7
 
7
8
  export function Availability () {
8
9
  const { availability, isChatOpen, setChatVisibility, unseenCount, threadId } = useApp()
@@ -10,8 +11,10 @@ export function Availability () {
10
11
  const [isFixed, setIsFixed] = useState(false)
11
12
  const buttonRef = useRef()
12
13
 
13
- const onClick = () => {
14
+ const onClick = e => {
15
+ e.preventDefault()
14
16
  setChatVisibility(!isChatOpen)
17
+ historyPushState()
15
18
  }
16
19
 
17
20
  const onKeyDown = event => {
@@ -72,12 +75,13 @@ export function Availability () {
72
75
  <div className='wc-availability__inner'>
73
76
  <a
74
77
  className='wc-availability__link'
75
- role='button'
76
78
  href='#webchat'
77
79
  draggable='false'
78
80
  onClick={onClick}
79
81
  onKeyUp={onKeyUp}
80
82
  onKeyDown={onKeyDown}
83
+ role='button'
84
+ data-module='govuk-button'
81
85
  >
82
86
  {TextComponent}
83
87
  {unseenCount > 0 && !isChatOpen ? <span className='wc-availability__unseen'>{unseenCount}</span> : null}
@@ -1,19 +1,30 @@
1
1
  import React from 'react'
2
2
  import { useApp } from '../../store/useApp.js'
3
+ import { historyReplaceState } from '../../lib/history.js'
3
4
 
4
5
  export function PanelHeader () {
5
- const { thread, setChatVisibility, setUnseenCount, threadId } = useApp()
6
+ const { thread, threadId, setChatVisibility, setUnseenCount, isMobile } = useApp()
6
7
 
7
8
  const onClose = e => {
8
9
  e.preventDefault()
9
10
  setChatVisibility(false)
11
+ historyReplaceState()
12
+
10
13
  if (threadId) {
11
14
  thread?.lastMessageSeen()
12
15
  setUnseenCount(0)
13
16
  }
14
17
  }
15
18
 
16
- let ButtonComponent = (
19
+ const BackButtonComponent = (
20
+ <button className='wc-header__back' aria-label='Close the webchat' onClick={onClose}>
21
+ <svg aria-hidden='true' focusable='false' width='20' height='20' viewBox='0 0 20 20'>
22
+ <path d='M4.828,11L12.314,18.485L10.899,19.899L1,10L10.899,0.101L12.314,1.515L4.828,9L19,9L19,11L4.828,11Z' fill='currentColor' />
23
+ </svg>
24
+ </button>
25
+ )
26
+
27
+ const CloseButtonComponent = (
17
28
  <button className='wc-header__close' aria-label='Close the webchat' onClick={onClose}>
18
29
  <svg aria-hidden='true' focusable='false' width='20' height='20' viewBox='0 0 20 20'>
19
30
  <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' />
@@ -21,23 +32,41 @@ export function PanelHeader () {
21
32
  </button>
22
33
  )
23
34
 
35
+ const MinimiseButtonComponent = (
36
+ <button className='wc-header__hide' aria-label='Minimise the webchat' onClick={onClose}>
37
+ <svg aria-hidden='true' focusable='false' width='20' height='20' viewBox='0 0 20 20'>
38
+ <path d='M10 14.4l-7-7L4.4 6l5.6 5.6L15.6 6 17 7.4l-7 7z' fill='currentColor' />
39
+ </svg>
40
+ </button>
41
+ )
42
+
43
+ let RightButtonComponent = CloseButtonComponent
44
+
24
45
  if (thread) {
25
- ButtonComponent = (
26
- <button className='wc-header__hide' aria-label='Minimise the webchat' onClick={onClose}>
27
- <svg aria-hidden='true' focusable='false' width='20' height='20' viewBox='0 0 20 20'>
28
- <path d='M10 14.4l-7-7L4.4 6l5.6 5.6L15.6 6 17 7.4l-7 7z' fill='currentColor' />
29
- </svg>
30
- </button>
31
- )
46
+ RightButtonComponent = MinimiseButtonComponent
47
+
48
+ if (isMobile && !window.history.state) {
49
+ RightButtonComponent = MinimiseButtonComponent
50
+ }
51
+ }
52
+
53
+ if (!thread && isMobile && !window.history.state) {
54
+ RightButtonComponent = CloseButtonComponent
55
+ }
56
+
57
+ if (isMobile && window.history.state) {
58
+ RightButtonComponent = null
32
59
  }
33
60
 
34
61
  return (
35
62
  <div className='wc-header'>
63
+ {window.history.state ? BackButtonComponent : null}
64
+
36
65
  <h2 id='wc-header-title' className='wc-header__title'>
37
66
  Floodline Webchat
38
67
  </h2>
39
68
 
40
- {ButtonComponent}
69
+ {RightButtonComponent}
41
70
  </div>
42
71
  )
43
72
  }
@@ -12,6 +12,7 @@ import { Feedback } from '../screens/feedback.jsx'
12
12
  import { useApp } from '../../store/useApp.js'
13
13
  import { useChatSdk } from '../../store/useChatSdk.js'
14
14
  import { useFocusedElements } from '../../hooks/useFocusedElements.js'
15
+ import { historyReplaceState } from '../../lib/history.js'
15
16
 
16
17
  export function Panel () {
17
18
  const { sdk, availability, thread, threadId, setThread, setThreadId, setChatVisibility, setMessages, setUnseenCount, isMobile } = useApp()
@@ -28,6 +29,7 @@ export function Panel () {
28
29
  setUnseenCount(0)
29
30
  }
30
31
  setChatVisibility(false)
32
+ historyReplaceState()
31
33
  }
32
34
  }, [thread, threadId, setUnseenCount, setChatVisibility])
33
35
 
@@ -48,10 +50,10 @@ export function Panel () {
48
50
  * Initializes the eventListener for pressing the escape key
49
51
  */
50
52
  useEffect(() => {
51
- const escapeKeyEvent = document.addEventListener('keydown', onEscapeKey)
53
+ document.addEventListener('keydown', onEscapeKey)
52
54
 
53
55
  return () => {
54
- document.removeEventListener('keydown', escapeKeyEvent)
56
+ document.removeEventListener('keydown', onEscapeKey)
55
57
  }
56
58
  }, [onEscapeKey, setChatVisibility])
57
59
 
@@ -73,7 +73,8 @@
73
73
  }
74
74
 
75
75
  &__close,
76
- &__hide {
76
+ &__hide,
77
+ &__back {
77
78
  display: flex;
78
79
  justify-content: center;
79
80
  color: govuk-colour('white');
@@ -87,6 +88,15 @@
87
88
  outline: 3px solid $govuk-focus-colour;
88
89
  }
89
90
  }
91
+
92
+ &__back {
93
+ margin: 0;
94
+ display: flex;
95
+
96
+ @include mq ($from: 'tablet') {
97
+ display: none
98
+ }
99
+ }
90
100
  }
91
101
 
92
102
  .wc-body {
@@ -0,0 +1,13 @@
1
+ export const historyPushState = () => {
2
+ const url = window.location.href.split('#')[0]
3
+ window.history.pushState({ history: true }, null, `${url}#webchat`)
4
+ }
5
+
6
+ export const historyReplaceState = () => {
7
+ if (window.history.state?.history) {
8
+ window.history.back()
9
+ }
10
+
11
+ const url = window.location.href.split('#')[0]
12
+ window.history.replaceState(null, null, url)
13
+ }
@@ -91,20 +91,33 @@ export const AppProvider = ({ sdk, availability, options, children }) => {
91
91
  setCustomerId(window.localStorage.getItem(CUSTOMER_ID_STORAGE_KEY))
92
92
  setThreadId(window.localStorage.getItem(THREAD_ID_STORAGE_KEY))
93
93
  setSettings(JSON.parse(window.localStorage.getItem(SETTINGS_STORAGE_KEY)) || state.settings)
94
+ }, [])
94
95
 
96
+ /**
97
+ * Set browser history on start chat click
98
+ */
99
+ useEffect(() => {
95
100
  if (window.location.hash === '#webchat') {
96
101
  setChatVisibility(true)
97
102
  }
103
+
104
+ const onBrowserNavigation = window.addEventListener('popstate', () => {
105
+ if (window.location.hash === '#webchat') {
106
+ setChatVisibility(true)
107
+ } else {
108
+ setChatVisibility(false)
109
+ }
110
+ })
111
+
112
+ return () => {
113
+ window.removeEventListener('popstate', onBrowserNavigation)
114
+ }
98
115
  }, [])
99
116
 
100
117
  /**
101
118
  * State update functions
102
119
  */
103
120
  const setChatVisibility = payload => {
104
- if (!payload) {
105
- window.location.hash = ''
106
- }
107
-
108
121
  dispatch({ type: 'SET_CHAT_VISIBILITY', payload })
109
122
  }
110
123