@defra/flood-webchat 0.0.1-beta.9 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +6 -0
  2. package/dist/client.js +1 -329
  3. package/dist/server.js +1 -286
  4. package/main.scss +13 -8
  5. package/package.json +28 -21
  6. package/src/client/components/availability/availability.jsx +104 -65
  7. package/src/client/components/availability/availability.scss +20 -32
  8. package/src/client/components/chat/chat.jsx +239 -0
  9. package/src/client/components/chat/chat.scss +258 -0
  10. package/src/client/components/errorSummary/error-summary.jsx +34 -0
  11. package/src/client/components/live-region.jsx +55 -0
  12. package/src/client/components/message/message.jsx +21 -0
  13. package/src/client/components/panel/panel-footer.jsx +9 -0
  14. package/src/client/components/panel/panel-header.jsx +75 -0
  15. package/src/client/components/panel/panel.jsx +163 -0
  16. package/src/client/components/panel/panel.scss +112 -0
  17. package/src/client/components/screens/end-chat.jsx +77 -0
  18. package/src/client/components/screens/feedback.jsx +65 -0
  19. package/src/client/components/screens/pre-chat.jsx +62 -0
  20. package/src/client/components/screens/request-chat.jsx +183 -0
  21. package/src/client/components/screens/settings.jsx +97 -0
  22. package/src/client/components/screens/unavailable.jsx +23 -0
  23. package/src/client/components/skip-link.jsx +42 -0
  24. package/src/client/hooks/useFocusedElements.js +80 -0
  25. package/src/client/hooks/useTextareaAutosize.js +13 -0
  26. package/src/client/index.jsx +18 -1
  27. package/src/client/lib/agent-status-headline.js +17 -0
  28. package/src/client/lib/check-availability.js +1 -0
  29. package/src/client/lib/history.js +16 -0
  30. package/src/client/lib/message-notification.js +30 -0
  31. package/src/client/lib/transform-messages.js +47 -0
  32. package/src/client/scss/_objects.scss +33 -0
  33. package/src/client/scss/_settings.scss +101 -0
  34. package/src/client/scss/_tools.scss +33 -0
  35. package/src/client/scss/_utilities.scss +25 -0
  36. package/src/client/store/AppProvider.jsx +184 -0
  37. package/src/client/store/actions-map.js +153 -0
  38. package/src/client/store/constants.js +5 -0
  39. package/src/client/store/reducer.js +31 -0
  40. package/src/client/store/useApp.js +5 -0
  41. package/src/client/store/useChatSdk.js +37 -0
  42. package/src/server/lib/utils.js +25 -9
  43. package/webpack.config.mjs +0 -2
  44. package/webpack.prod.mjs +7 -0
  45. package/dist/client.js.map +0 -1
  46. package/dist/server.js.map +0 -1
  47. package/src/client/lib/external-stores.js +0 -4
  48. package/src/client/lib/external-sync-store.js +0 -42
package/README.md CHANGED
@@ -78,6 +78,12 @@ user's browser.
78
78
  </div>
79
79
  ```
80
80
 
81
+ Add this html below the govuk main skip link, for the webchat skip link to be added to the page:
82
+
83
+ ```html
84
+ <div id="webchat-skip-link-container"></div>
85
+ ```
86
+
81
87
  And finally a script tag, to prevent the webchat widget "flashing" on page load/reload.
82
88
 
83
89
  ```html
package/dist/client.js CHANGED
@@ -1,329 +1 @@
1
- /******/ (() => { // webpackBootstrap
2
- /******/ "use strict";
3
- /******/ var __webpack_modules__ = ({
4
-
5
- /***/ "./src/client/components/availability/availability.jsx":
6
- /*!*************************************************************!*\
7
- !*** ./src/client/components/availability/availability.jsx ***!
8
- \*************************************************************/
9
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
10
-
11
- __webpack_require__.r(__webpack_exports__);
12
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
13
- /* harmony export */ Availability: () => (/* binding */ Availability)
14
- /* harmony export */ });
15
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
16
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
17
- /* harmony import */ var _lib_classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../lib/classnames */ "./src/client/lib/classnames.js");
18
- /* harmony import */ var _lib_external_stores__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../lib/external-stores */ "./src/client/lib/external-stores.js");
19
-
20
-
21
-
22
- function Availability(props) {
23
- const [isOpen, setOpen] = (0,_lib_external_stores__WEBPACK_IMPORTED_MODULE_2__.useWebchatOpenState)();
24
- const [isFixed, setFixed] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
25
- const buttonRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();
26
- const onClick = () => {
27
- setOpen(!isOpen);
28
- };
29
- const onKeyDown = event => {
30
- if (event.key === ' ') {
31
- event.preventDefault();
32
- }
33
- };
34
- const onKeyUp = event => {
35
- if (event.key === ' ') {
36
- setOpen(!isOpen);
37
- }
38
- };
39
- const intersectionCallback = entries => {
40
- const [entry] = entries;
41
- const isBelowFold = !entry.isIntersecting && entry.boundingClientRect.top > 0;
42
- setFixed(!isOpen && isBelowFold);
43
- };
44
- (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
45
- const observer = new window.IntersectionObserver(intersectionCallback, {
46
- rootMargin: '35px'
47
- });
48
- const parentElement = buttonRef.current?.parentElement;
49
- if (parentElement) {
50
- observer.observe(parentElement);
51
- }
52
- return () => {
53
- if (parentElement) {
54
- observer.unobserve(parentElement);
55
- }
56
- };
57
- }, [buttonRef, isOpen]);
58
- (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
59
- document.documentElement.classList.toggle('wc-scroll-padding', isFixed);
60
- document.body.classList.toggle('wc-scroll-padding', isFixed);
61
- }, [isFixed]);
62
- switch (props.availability) {
63
- case 'AVAILABLE':
64
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
65
- className: (0,_lib_classnames__WEBPACK_IMPORTED_MODULE_1__.classnames)('wc-availability', isFixed && 'wc-availability--fixed'),
66
- ref: buttonRef
67
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
68
- className: "wc-availability__inner"
69
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
70
- className: "wc-availability__link",
71
- href: "#webchat",
72
- role: "button",
73
- draggable: "false",
74
- onClick: onClick,
75
- onKeyUp: onKeyUp,
76
- onKeyDown: onKeyDown
77
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(AvailabilityContent, null))));
78
- case 'EXISTING':
79
- case 'UNAVAILABLE':
80
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", {
81
- className: "govuk-body"
82
- }, "When it is available, a 'start chat' link will appear.");
83
- default:
84
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", {
85
- className: "govuk-body"
86
- }, "Checking availability");
87
- }
88
- }
89
- function AvailabilityContent() {
90
- const [thread] = (0,_lib_external_stores__WEBPACK_IMPORTED_MODULE_2__.useMessageThread)();
91
- const unreadMessageCount = thread.filter(message => !message.read).length;
92
- if (!thread.length) {
93
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, "Start Chat");
94
- }
95
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, "Show Chat ", !!unreadMessageCount && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
96
- className: "wc-availability__unseen"
97
- }, unreadMessageCount), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
98
- className: "govuk-visually-hidden"
99
- }, " ", unreadMessageCount === 1 ? 'new message' : 'new messages')));
100
- }
101
-
102
- /***/ }),
103
-
104
- /***/ "./src/client/lib/check-availability.js":
105
- /*!**********************************************!*\
106
- !*** ./src/client/lib/check-availability.js ***!
107
- \**********************************************/
108
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
109
-
110
- __webpack_require__.r(__webpack_exports__);
111
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
112
- /* harmony export */ checkAvailability: () => (/* binding */ checkAvailability)
113
- /* harmony export */ });
114
- async function checkAvailability(endpoint) {
115
- const response = await fetch(endpoint);
116
- const data = await response.json();
117
- return {
118
- availability: data.availability || 'UNAVAILABLE'
119
- };
120
- }
121
-
122
- /***/ }),
123
-
124
- /***/ "./src/client/lib/classnames.js":
125
- /*!**************************************!*\
126
- !*** ./src/client/lib/classnames.js ***!
127
- \**************************************/
128
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
129
-
130
- __webpack_require__.r(__webpack_exports__);
131
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
132
- /* harmony export */ classnames: () => (/* binding */ classnames)
133
- /* harmony export */ });
134
- const classnames = (...classes) => classes.filter(classname => classname && typeof classname === 'string').join(' ');
135
-
136
- /***/ }),
137
-
138
- /***/ "./src/client/lib/external-stores.js":
139
- /*!*******************************************!*\
140
- !*** ./src/client/lib/external-stores.js ***!
141
- \*******************************************/
142
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143
-
144
- __webpack_require__.r(__webpack_exports__);
145
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
146
- /* harmony export */ useMessageThread: () => (/* binding */ useMessageThread),
147
- /* harmony export */ useWebchatOpenState: () => (/* binding */ useWebchatOpenState)
148
- /* harmony export */ });
149
- /* harmony import */ var _external_sync_store__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./external-sync-store */ "./src/client/lib/external-sync-store.js");
150
-
151
- const useWebchatOpenState = _external_sync_store__WEBPACK_IMPORTED_MODULE_0__["default"].create(false);
152
- const useMessageThread = _external_sync_store__WEBPACK_IMPORTED_MODULE_0__["default"].create([]);
153
-
154
- /***/ }),
155
-
156
- /***/ "./src/client/lib/external-sync-store.js":
157
- /*!***********************************************!*\
158
- !*** ./src/client/lib/external-sync-store.js ***!
159
- \***********************************************/
160
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
161
-
162
- __webpack_require__.r(__webpack_exports__);
163
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
164
- /* harmony export */ "default": () => (/* binding */ ExternalSyncStore)
165
- /* harmony export */ });
166
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
167
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
168
-
169
- class ExternalSyncStore {
170
- constructor(initialValue) {
171
- this._value = initialValue;
172
- this._listeners = [];
173
- }
174
- update(value) {
175
- this._value = value;
176
- this.emitChange();
177
- }
178
- subscribe(listener) {
179
- this._listeners = [...this._listeners, listener];
180
- return () => {
181
- this._listeners = this._listeners.filter(l => l !== listener);
182
- };
183
- }
184
- emitChange() {
185
- for (const listener of this._listeners) {
186
- listener();
187
- }
188
- }
189
- getSnapshot() {
190
- return this._value;
191
- }
192
- static create(initialValue) {
193
- const store = new ExternalSyncStore(initialValue);
194
- const boundSubscribe = store.subscribe.bind(store);
195
- const boundGetSnapshot = store.getSnapshot.bind(store);
196
- const boundUpdate = store.update.bind(store);
197
- return () => [(0,react__WEBPACK_IMPORTED_MODULE_0__.useSyncExternalStore)(boundSubscribe, boundGetSnapshot), boundUpdate];
198
- }
199
- }
200
-
201
- /***/ }),
202
-
203
- /***/ "react":
204
- /*!************************!*\
205
- !*** external "react" ***!
206
- \************************/
207
- /***/ ((module) => {
208
-
209
- module.exports = require("react");
210
-
211
- /***/ }),
212
-
213
- /***/ "react-dom/client":
214
- /*!***********************************!*\
215
- !*** external "react-dom/client" ***!
216
- \***********************************/
217
- /***/ ((module) => {
218
-
219
- module.exports = require("react-dom/client");
220
-
221
- /***/ })
222
-
223
- /******/ });
224
- /************************************************************************/
225
- /******/ // The module cache
226
- /******/ var __webpack_module_cache__ = {};
227
- /******/
228
- /******/ // The require function
229
- /******/ function __webpack_require__(moduleId) {
230
- /******/ // Check if module is in cache
231
- /******/ var cachedModule = __webpack_module_cache__[moduleId];
232
- /******/ if (cachedModule !== undefined) {
233
- /******/ return cachedModule.exports;
234
- /******/ }
235
- /******/ // Create a new module (and put it into the cache)
236
- /******/ var module = __webpack_module_cache__[moduleId] = {
237
- /******/ // no module.id needed
238
- /******/ // no module.loaded needed
239
- /******/ exports: {}
240
- /******/ };
241
- /******/
242
- /******/ // Execute the module function
243
- /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
244
- /******/
245
- /******/ // Return the exports of the module
246
- /******/ return module.exports;
247
- /******/ }
248
- /******/
249
- /************************************************************************/
250
- /******/ /* webpack/runtime/compat get default export */
251
- /******/ (() => {
252
- /******/ // getDefaultExport function for compatibility with non-harmony modules
253
- /******/ __webpack_require__.n = (module) => {
254
- /******/ var getter = module && module.__esModule ?
255
- /******/ () => (module['default']) :
256
- /******/ () => (module);
257
- /******/ __webpack_require__.d(getter, { a: getter });
258
- /******/ return getter;
259
- /******/ };
260
- /******/ })();
261
- /******/
262
- /******/ /* webpack/runtime/define property getters */
263
- /******/ (() => {
264
- /******/ // define getter functions for harmony exports
265
- /******/ __webpack_require__.d = (exports, definition) => {
266
- /******/ for(var key in definition) {
267
- /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
268
- /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
269
- /******/ }
270
- /******/ }
271
- /******/ };
272
- /******/ })();
273
- /******/
274
- /******/ /* webpack/runtime/hasOwnProperty shorthand */
275
- /******/ (() => {
276
- /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
277
- /******/ })();
278
- /******/
279
- /******/ /* webpack/runtime/make namespace object */
280
- /******/ (() => {
281
- /******/ // define __esModule on exports
282
- /******/ __webpack_require__.r = (exports) => {
283
- /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
284
- /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
285
- /******/ }
286
- /******/ Object.defineProperty(exports, '__esModule', { value: true });
287
- /******/ };
288
- /******/ })();
289
- /******/
290
- /************************************************************************/
291
- var __webpack_exports__ = {};
292
- // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
293
- (() => {
294
- /*!******************************!*\
295
- !*** ./src/client/index.jsx ***!
296
- \******************************/
297
- __webpack_require__.r(__webpack_exports__);
298
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
299
- /* harmony export */ init: () => (/* binding */ init)
300
- /* harmony export */ });
301
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
302
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
303
- /* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom/client */ "react-dom/client");
304
- /* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom_client__WEBPACK_IMPORTED_MODULE_1__);
305
- /* harmony import */ var _components_availability_availability_jsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/availability/availability.jsx */ "./src/client/components/availability/availability.jsx");
306
- /* harmony import */ var _lib_check_availability__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/check-availability */ "./src/client/lib/check-availability.js");
307
-
308
-
309
-
310
-
311
- async function init(container, options) {
312
- const root = (0,react_dom_client__WEBPACK_IMPORTED_MODULE_1__.createRoot)(container);
313
- let availability;
314
- try {
315
- const result = await (0,_lib_check_availability__WEBPACK_IMPORTED_MODULE_3__.checkAvailability)(options.availabilityEndpoint);
316
- availability = result.availability;
317
- } catch (e) {
318
- availability = 'UNAVAILABLE';
319
- }
320
- root.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_availability_availability_jsx__WEBPACK_IMPORTED_MODULE_2__.Availability, {
321
- availability: availability
322
- }));
323
- }
324
- })();
325
-
326
- module.exports = __webpack_exports__;
327
- /******/ })()
328
- ;
329
- //# sourceMappingURL=client.js.map
1
+ (()=>{var e={792:(e,t,a)=>{const{DateTime:n}=a(168),o=e=>Number(e.split(":")[0]);e.exports={isWithinHours:(e,t)=>{const a=t?n.fromISO(t):n.local();a.setZone("Europe/London");const l=t?new Date(t):new Date,r=l.toLocaleDateString("en-GB",{weekday:"long"}),s=l.toLocaleDateString("en-GB").split("/"),c=e.find((e=>e.day===r)),i=n.local(Number(s[2]),Number(s[1]),Number(s[0]),o(c.openTime)),u=n.local(Number(s[2]),Number(s[1]),Number(s[0]),o(c.closeTime));return a.diff(i).milliseconds>=0&&a.diff(u).milliseconds<=0},stripPageTitle:e=>e.replace(/^\(\d+ new messages?\) - /,"")}},168:e=>{"use strict";e.exports=require("luxon")}},t={};function a(n){var o=t[n];if(void 0!==o)return o.exports;var l=t[n]={exports:{}};return e[n](l,l.exports,a),l.exports}a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{"use strict";a.r(n),a.d(n,{init:()=>ne});const e=require("react");var t=a.n(e);const o=require("react-dom/client"),l=require("@nice-devone/nice-cxone-chat-web-sdk"),r=(...e)=>e.filter((e=>e&&"string"==typeof e)).join(" "),s=require("react-dom");var c=a(168);const i=require("html-react-parser");var u=a.n(i);const d=/(?:www|https?)[^\s]+/gi,m=e=>(e.match(d)&&(e=e.replace(d,(e=>`<a class="govuk-link" href="${e}" target="_blank" rel="noreferrer">${e.replace(/https?:\/\//gi,"")}</a>`))),u()(e)),g=e=>({id:e.id,text:e.messageContent?.text,createdAt:new Date(e.createdAt),user:e.authorEndUserIdentity?.fullName?.trim()||null,assignee:e.authorUser?.firstName||null,direction:e.direction}),h=e=>{const t=c.DateTime.local();t.setZone("Europe/London");let a=`Floodline webchat transcript, ${t.toFormat("HH:mm:ss a, dd LLLL yyyy")}\n\n`;for(const t of e){const{text:e,direction:n,user:o,assignee:l,createdAt:r}=t,s="inbound"===n?o:`${l} (Floodline adviser)`;a+=`[${c.DateTime.fromJSDate(new Date(r)).setZone("Europe/London").toFormat("HH:mm:ss a, dd LLLL yyyy")}] ${s}: \n${e}\n\n`}return a=a.replace(/<a\b[^>]*>/i,"").replace(/<\/a>/i,""),encodeURIComponent(a)},E="webchat_settings",w="webchat_customer_id",v="webchat_thread_id",b=4e3,y="message_unseen_count",f={SET_CHAT_VISIBILITY:(e,t)=>({...e,isChatOpen:t}),SET_AVAILABILITY:(e,t)=>({...e,availability:t}),SET_SETTINGS:(e,t)=>(t?window.localStorage.setItem(E,JSON.stringify(t)):window.localStorage.removeItem(E),{...e,settings:t}),SET_CUSTOMER_ID:(e,t)=>(t?window.localStorage.setItem(w,t):window.localStorage.removeItem(w),{...e,customerId:t}),SET_THREAD_ID:(e,t)=>(t?window.localStorage.setItem(v,t):window.localStorage.removeItem(v),{...e,threadId:t}),SET_THREAD:(e,t)=>({...e,thread:t}),SET_MESSAGE:(e,t)=>({...e,message:g(t),messages:[...e.messages,g(t)]}),SET_MESSAGES:(e,t)=>{return{...e,messages:(a=t,a.map((e=>g(e)))).reverse()};var a},SET_AGENT:(e,t)=>({...e,agent:t}),SET_AGENT_TYPING:(e,t)=>({...e,isAgentTyping:t}),SET_AGENT_STATUS:(e,t)=>({...e,agentStatus:t}),SET_UNSEEN_COUNT:(e,t)=>(window.localStorage.setItem(y,t),{...e,unseenCount:t}),SET_INSTIGATOR_ID:(e,t)=>({...e,instigatorId:t}),SET_LIVE_REGION_TEXT:(e,t)=>({...e,liveRegionText:t}),TOGGLE_IS_MOBILE:(e,t)=>({...e,isMobile:t}),TOGGLE_IS_KEYBOARD:(e,t)=>({...e,isKeyboard:t})},p={availability:null,customerId:null,threadId:null,thread:null,messages:[],unseenCount:0,instigatorId:null,agent:null,agentStatus:null,isAgentTyping:!1,isChatOpen:!1,isMobile:window.matchMedia("(max-width: 640px)").matches,isKeyboard:!1,settings:{audio:!0,scroll:!0}},k=(e,t)=>{const{type:a,payload:n}=t,o=f[a];return o?o.bind(void 0,e,n)():e},S=(0,e.createContext)(p),_=({sdk:a,availability:n,playSound:o,children:r})=>{const[s,c]=(0,e.useReducer)(k,p),i=e=>{c({type:"SET_AGENT",payload:e.detail.data.inboxAssignee}),c({type:"SET_AGENT_STATUS",payload:e.detail.data.contact.status}),c({type:"SET_UNSEEN_COUNT",payload:e.detail.data.contact.customerStatistics.unseenMessagesCount})},u=e=>{c({type:"SET_AGENT",payload:e.detail.data.inboxAssignee}),c({type:"SET_AGENT_STATUS",payload:e.detail.data.case.status})},d=()=>{c({type:"SET_AGENT_TYPING",payload:!0})},m=()=>{c({type:"SET_AGENT_TYPING",payload:!1}),c({type:"SET_LIVE_REGION_TEXT"})},g=e=>{c({type:"SET_MESSAGE",payload:e.detail.data.message}),c({type:"SET_AGENT_STATUS",payload:e.detail.data.case.status}),c({type:"SET_UNSEEN_COUNT",payload:e.detail.data.case.customerStatistics.unseenMessagesCount}),JSON.parse(window.localStorage.getItem(E)).audio&&"outbound"===e.detail.data.message.direction&&o&&o()},h=e=>{c({type:"SET_AGENT_STATUS",payload:e.detail.data.case.status})},b=e=>{c({type:"TOGGLE_IS_MOBILE",payload:e.matches})},f=()=>{c({type:"TOGGLE_IS_KEYBOARD",payload:!0})},_=()=>{c({type:"TOGGLE_IS_KEYBOARD",payload:!1})};(0,e.useEffect)((()=>(a.onChatEvent(l.ChatEvent.LIVECHAT_RECOVERED,i),a.onChatEvent(l.ChatEvent.MESSAGE_CREATED,g),a.onChatEvent(l.ChatEvent.AGENT_TYPING_STARTED,d),a.onChatEvent(l.ChatEvent.AGENT_TYPING_ENDED,m),a.onChatEvent(l.ChatEvent.ASSIGNED_AGENT_CHANGED,u),a.onChatEvent(l.ChatEvent.CONTACT_STATUS_CHANGED,h),window.matchMedia("(max-width: 640px)").addEventListener("change",b),window.addEventListener("keydown",f),window.addEventListener("pointerdown",_),()=>{window.removeEventListener("change",b),window.removeEventListener("keydown",f),window.removeEventListener("pointerdown",_)})),[a]),(0,e.useEffect)((()=>{c({type:"SET_AVAILABILITY",payload:n}),T(window.localStorage.getItem(w)),C(window.localStorage.getItem(v)),A(JSON.parse(window.localStorage.getItem(E))||s.settings),x(window.localStorage.getItem(y))}),[]),(0,e.useEffect)((()=>{"#webchat"===window.location.hash&&N(!0);const e=()=>{"#webchat"===window.location.hash?N(!0):N(!1)};return window.addEventListener("popstate",e),()=>{window.removeEventListener("popstate",e)}}),[]);const N=e=>{c({type:"SET_CHAT_VISIBILITY",payload:e})},T=e=>{c({type:"SET_CUSTOMER_ID",payload:e})},C=e=>{c({type:"SET_THREAD_ID",payload:e})},I=e=>{c({type:"SET_THREAD",payload:e})},L=e=>{c({type:"SET_MESSAGES",payload:e})},A=e=>{c({type:"SET_SETTINGS",payload:e})},x=e=>{c({type:"SET_UNSEEN_COUNT",payload:e})},D=e=>{c({type:"SET_INSTIGATOR_ID",payload:e})},G=e=>{c({type:"SET_LIVE_REGION_TEXT",payload:e})},q=(0,e.useMemo)((()=>({...s,sdk:a,setSettings:A,setCustomerId:T,setThreadId:C,setThread:I,setMessages:L,setUnseenCount:x,setChatVisibility:N,setInstigatorId:D,setLiveRegionText:G,onLiveChatRecovered:i,onAssignedAgentChanged:u,onAgentTypingStarted:d,onAgentTypingEnded:m,onMessageCreated:g,onContactStatusChanged:h})));return t().createElement(S.Provider,{value:q},r)},N=()=>(0,e.useContext)(S),{stripPageTitle:T}=a(792),C=()=>{const e=window.location.href.split("#")[0];document.title=T(document.title),window.history.pushState({history:!0},null,`${e}#webchat`)},I=()=>{if(window.history.state?.history)return window.history.back();document.title=T(document.title);const e=window.location.href.split("#")[0];return window.history.replaceState(null,null,e)};function L(){const{thread:e,threadId:a,setChatVisibility:n,setUnseenCount:o,isMobile:l}=N(),r=t=>{t.preventDefault(),n(!1),I(),a&&(e?.lastMessageSeen(),o(0))},s=t().createElement("button",{className:"wc-header__back","aria-label":"Close the webchat",onClick:r},t().createElement("svg",{"aria-hidden":"true",focusable:"false",width:"20",height:"20",viewBox:"0 0 20 20"},t().createElement("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"}))),c=t().createElement("button",{className:"wc-header__close","aria-label":"Close the webchat",onClick:r},t().createElement("svg",{"aria-hidden":"true",focusable:"false",width:"20",height:"20",viewBox:"0 0 20 20"},t().createElement("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"}))),i=t().createElement("button",{className:"wc-header__hide","aria-label":"Minimise the webchat",onClick:r},t().createElement("svg",{"aria-hidden":"true",focusable:"false",width:"20",height:"20",viewBox:"0 0 20 20"},t().createElement("path",{d:"M10 14.4l-7-7L4.4 6l5.6 5.6L15.6 6 17 7.4l-7 7z",fill:"currentColor"}))),u=l&&window.history.state,d=l&&!window.history.state;let m=c;return a&&(m=i,d&&(m=i)),!a&&d&&(m=c),u&&(m=null),t().createElement("div",{className:"wc-header"},u?s:null,t().createElement("h2",{id:"wc-header",className:"wc-header__title"},"Floodline webchat"),m)}function A({onContinue:e}){return t().createElement(t().Fragment,null,t().createElement(L,null),t().createElement("div",{className:"wc-body"},t().createElement("div",{className:"wc-content"},t().createElement("h3",{id:"wc-subtitle",className:"wc-heading","aria-live":"polite"},"What you can use webchat for"),t().createElement("p",null,"Webchat lets you talk directly to a Floodline adviser."),t().createElement("p",null,"You can use webchat to get:"),t().createElement("ul",{className:"wc-list"},t().createElement("li",null,"current flood warnings and alerts in your area"),t().createElement("li",null,"information on the flood warning service"),t().createElement("li",null,"advice on what to do before, during and after a flood")),t().createElement("p",null,"There are other ways to ",t().createElement("a",{className:"govuk-link",href:"https://www.gov.uk/sign-up-for-flood-warnings",target:"_blank",rel:"noreferrer"},"sign up for flood warnings")," and ",t().createElement("a",{className:"govuk-link",href:"https://www.fws.environment-agency.gov.uk/app/olr/login",target:"_blank",rel:"noreferrer"},"manage your flood warnings account"),"."),t().createElement("p",null,"Do not use webchat to ",t().createElement("a",{className:"govuk-link",href:"https://www.gov.uk/report-flood-cause",target:"_blank",rel:"noreferrer"},"report a flood"),"."),t().createElement("button",{className:"govuk-button wc-button govuk-!-margin-top-1","data-module":"govuk-button",onClick:e},"Continue"),t().createElement("h3",{className:"wc-heading"},"Other flood information"),t().createElement("p",null,"Call Floodline for all other flood and flood warning information."),t().createElement("p",null,t().createElement("strong",null,"Floodline helpline"),t().createElement("br",null),"Telephone: 0345 988 1188",t().createElement("br",null),"Textphone: 0345 602 6340",t().createElement("br",null),"Open 24 hours a day, 7 days a week",t().createElement("br",null),t().createElement("a",{className:"govuk-link",href:"https://gov.uk/call-charges",target:"_blank",rel:"noreferrer"},"Find out more about call charges")))))}const x=require("uuid"),D=e=>{const t=async()=>e.authorize();return{connect:t,fetchCustomerId:async()=>{const e=await t();return e?.consumerIdentity.idOnExternalPlatform},fetchThread:async a=>(await t(),e.getThread(a)),fetchMessages:async(e,a)=>{await t();const n=await e.recover(a),o=[];let l=n.messages;for(;l.length;){l.map((e=>o.push(e)));try{l=(await e.loadMoreMessages()).data.messages}catch(e){l=[]}}return o}}},G=({errors:e})=>{const a=Object.keys(e),n=e=>{e.preventDefault();const t=e.target.getAttribute("data-key");document.querySelector(`#wc-${t}`).focus()};return 0===a.length?null:t().createElement("div",{className:"govuk-error-summary govuk-!-static-margin-bottom-7","data-module":"govuk-error-summary",tabIndex:"-1"},t().createElement("div",{role:"alert"},t().createElement("h2",{id:"wc-error",className:"wc-error-summary__title govuk-error-summary__title"},"There is a problem"),t().createElement("div",{className:"govuk-error-summary__body"},t().createElement("ul",{className:"govuk-list govuk-error-summary__list wc-error-summary__list"},a.map((a=>t().createElement("li",{key:a},t().createElement("a",{href:"#","data-key":a,onClick:n},e[a]))))))))},q=500;function O({onPreChatScreen:a}){const{sdk:n,setCustomerId:o,setThreadId:l,setThread:s,setLiveRegionText:c}=N(),{fetchCustomerId:i,fetchThread:u}=D(n),[d,m]=(0,e.useState)({}),[g,h]=(0,e.useState)(0),[E,w]=(0,e.useState)(!1),v=(0,e.useRef)(),b=(0,e.useRef)(),y=q>=g;let f=`You have ${q-g} characters remaining`;y||(f=`You have ${g-q} characters too many`),(0,e.useEffect)((()=>{Object.keys(d).length&&document.querySelector(".govuk-error-summary")?.focus()}),[d]);const p=E?"Requesting...":"Request chat";return(0,e.useEffect)((()=>{E&&c(p)}),[E]),t().createElement(t().Fragment,null,t().createElement(L,null),t().createElement("div",{className:"wc-body"},t().createElement("div",{className:"wc-content"},t().createElement("a",{href:"#",className:"wc-back-link govuk-back-link",onClick:a},"What you can use webchat for"),t().createElement(G,{errors:d}),t().createElement("h3",{id:"wc-subtitle",className:"wc-heading","aria-live":"polite"},"Your name and question"),t().createElement("form",null,t().createElement("div",{className:r("wc-form-group","govuk-form-group",d.name&&"govuk-form-group--error")},t().createElement("label",{className:"wc-label govuk-label",htmlFor:"wc-name"},"Your name"),d.name&&t().createElement("p",{className:"govuk-error-message"},t().createElement("span",{className:"govuk-visually-hidden"},"Error:")," ",d.name),t().createElement("input",{ref:v,className:r("wc-input","govuk-input",d.name&&"govuk-input--error"),id:"wc-name",name:"name",type:"text","data-testid":"request-chat-user-name"})),t().createElement("div",{className:"wc-form-group govuk-character-count","data-module":"govuk-character-count","data-maxlength":"500"},t().createElement("div",{className:r("govuk-form-group",d.question&&"govuk-form-group--error")},t().createElement("label",{className:"wc-label govuk-label",htmlFor:"wc-question"},"Your question"),d.question&&t().createElement("p",{className:"govuk-error-message"},t().createElement("span",{className:"govuk-visually-hidden"},"Error:"),d.question),t().createElement("textarea",{ref:b,id:"wc-question",name:"question",rows:"5","aria-describedby":"wc-question-info",onChange:e=>{h(e.target.value.length)},className:r("wc-textarea","govuk-textarea","govuk-js-character-count",!y||d.question?"govuk-textarea--error":""),"data-testid":"request-chat-user-question"}),t().createElement("div",{id:"wc-question-info",className:"wc-hint govuk-hint govuk-char-count__msg",style:{color:y?"":"#d4351c"},"aria-hidden":"true"},f),t().createElement("div",{className:"govuk-character-count__sr-status govuk-visually-hidden","aria-live":"polite"},f))),t().createElement("div",{className:"wc-inset-text govuk-inset-text"},"By selecting 'Request chat' you agree to the terms of our ",t().createElement("a",{href:"https://check-for-flooding.service.gov.uk/privacy-notice",target:"_blank",rel:"noreferrer",className:"govuk-link"},"privacy notice"),"."),t().createElement("button",{className:"wc-button govuk-button govuk-!-margin-top-1","data-module":"govuk-button",onClick:async e=>{if(e.preventDefault(),E)return;const t={};if(0===v.current.value.length&&(t.name="Enter your name"),0===b.current.value.length&&(t.question="Enter your question"),b.current.value.length>q&&(t.question="Your question must be 500 characters or less"),0===Object.keys(t).length)try{w(!0);const e=x.v4(),t=await i(),a=await u(e);n.getCustomer().setName(v.current.value),await a.startChat(b.current.value||"Begin conversation"),o(t),l(e),s(a),a.setCustomField("threadid",e)}catch(e){console.log("[Request chat Error]",e)}m(t)},"aria-disabled":E},p)))))}function M({children:e}){return t().createElement("div",{className:"wc-footer"},e)}function R({message:e,previousMessage:a}){const n="outbound"===e.direction,o=e?.direction===a?.direction;return t().createElement("li",{className:r("wc-chat__message",n?"outbound":"inbound")},t().createElement("div",{className:"wc-chat__from"},o?null:t().createElement("span",{className:r(n?"outbound":"inbound")},n?e.assignee:"You"),t().createElement("span",{className:"govuk-visually-hidden"},":")),t().createElement("div",{className:r("wc-chat__text",n?"outbound":"inbound")},m(e.text)))}const F=(t,a)=>{(0,e.useEffect)((()=>{if(t){t.style.height="0px";const e=t.scrollHeight;t.style.height=`${e}px`}}),[t,a])},B=(e,t,a)=>{if("UNAVAILABLE"===e)return"Webchat is not currently available";if(!t)return"Connecting to Floodline";switch(t){case"closed":case"resolved":return a?`${a} ended the session`:"Session ended by advisor";default:return a?`You are speaking with ${a}`:"Waiting for an adviser"}};function U({onEndChatScreen:a,onSettingsScreen:n}){const{availability:o,thread:l,messages:r,agent:s,agentStatus:c,isAgentTyping:i,isChatOpen:u,settings:d,isKeyboard:m,setLiveRegionText:g}=N(),[E,w]=(0,e.useState)(""),[v,y]=(0,e.useState)(!1),f=(0,e.useRef)();F(f.current,E),(0,e.useEffect)((()=>{if(d.scroll&&0!==r.length){const e=document.querySelector(".wc-body");e.scrollTop=e.scrollHeight}}),[r,i]),(0,e.useEffect)((()=>{const e=document.querySelector(".wc-form__label");0===E.length?e.classList.remove("govuk-visually-hidden"):e.classList.add("govuk-visually-hidden")}),[E]);const p=s?.nickname||s?.firstName,k=B(o,c,p);(0,e.useEffect)((()=>(k&&g(`Floodline webchat - ${k}`),()=>{g()})),[k]),(0,e.useEffect)((()=>(i&&u&&g(`${p} is typing...`),()=>{g()})),[i,u]),(0,e.useEffect)((()=>{const e=r[r.length-1];return"closed"!==c&&"outbound"===e?.direction&&g(`${p} said: ${e.text}`),()=>{g()}}),[r]);const S=()=>{if(0!==f.current.value.length&&"closed"!==c){try{const e=f.current.value.trim();l.sendTextMessage(e),g(`You said: ${e}`)}catch(e){console.log("[Chat Error] sendMessage",e)}w("")}},_=()=>{const e=h(r);document.querySelector("#transcript-download").setAttribute("href",`data:text/plain;charset=utf-8,${e}`)},T=e=>{if("Enter"!==e.key||e.shiftKey)" "===e.key?("end-chat"===e.target.id&&a(e),"wc-settings"===e.target.id&&n(e)):(l.keystroke(),setTimeout((()=>{l.stopTyping()}),b));else switch(e.target.id){case"text-area":e.preventDefault(),S();break;case"end-chat":a(e);break;case"wc-settings":n(e);break;case"transcript-download":_()}};return t().createElement(t().Fragment,null,t().createElement(L,null),t().createElement("div",{className:"wc-status"},t().createElement("p",{className:"wc-status__availability"},k),t().createElement("a",{id:"end-chat",className:"wc-status__link",href:"#","data-module":"govuk-button",role:"button",onClick:a,onKeyDown:T},"End chat")),t().createElement("div",{className:"wc-body",tabIndex:"0"},t().createElement("ul",{className:"wc-chat"},r.length?r.map(((e,a)=>t().createElement(R,{key:e.id,message:e,previousMessage:r[a-1]}))):null,i?t().createElement("li",{className:"wc-chat__message outbound"},t().createElement("div",{className:"wc-chat__from"},p," is typing"),t().createElement("div",{className:"wc-chat__text outbound"},t().createElement("svg",{width:"28",height:"16",x:"0px",y:"0px",viewBox:"0 0 28 16"},t().createElement("circle",{stroke:"none",cx:"3",cy:"8",r:"3",fill:"currentColor"}),t().createElement("circle",{stroke:"none",cx:"14",cy:"8",r:"3",fill:"currentColor"}),t().createElement("circle",{stroke:"none",cx:"25",cy:"8",r:"3",fill:"currentColor"})))):null)),t().createElement(M,null,t().createElement("form",{className:"wc-form"+(v?" wc-focus-within":""),noValidate:!0,onSubmit:e=>{e.preventDefault(),S()}},t().createElement("label",{className:"govuk-label wc-form__label",htmlFor:"wc-form-textarea"},"Your message",t().createElement("span",{className:"govuk-visually-hidden"}," (enter key submits)")),t().createElement("textarea",{ref:f,rows:"1","aria-required":"true",className:"wc-form__textarea",id:"text-area",name:"message",onChange:e=>{w(e.target?.value)},onKeyDown:T,onFocus:()=>{y(m)},onBlur:()=>{y(!1)},value:E}),t().createElement("input",{type:"submit",className:"wc-form__button govuk-button",value:"Send","data-prevent-double-click":"true"})),t().createElement("div",{className:"wc-footer__settings"},t().createElement("a",{href:"#",id:"wc-settings",className:"wc-footer__settings-link","data-module":"govuk-button",onKeyDown:T,onClick:n},"Settings"),t().createElement("a",{href:"#",id:"transcript-download",className:"wc-footer__settings-link","data-module":"govuk-button",download:"floodline-webchat-transcript.txt",onKeyDown:T,onClick:_},"Save chat"))))}function $(){return t().createElement(t().Fragment,null,t().createElement(L,null),t().createElement("div",{className:"wc-body"},t().createElement("h3",{id:"wc-subtitle",className:"govuk-heading-m"},"Webchat is currently not available"),t().createElement("p",{className:"govuk-body-s"},"Try again later, or call Floodline:"),t().createElement("p",{className:"govuk-body-s"},t().createElement("strong",null,"Floodline helpline"),t().createElement("br",null),"Telephone: 0345 988 1188",t().createElement("br",null),"Textphone: 0345 602 6340",t().createElement("br",null),"Open 24 hours a day, 7 days a week",t().createElement("br",null),t().createElement("a",{className:"govuk-link",href:"https://gov.uk/call-charges"},"Find out more about call charges")),t().createElement("p",{className:"govuk-body-s"},"We're running webchat as a trial, it will not always be available.")))}function Y({onChatScreen:a,onEndChatConfirm:n}){const{setCustomerId:o,setThreadId:l,setMessages:r,agentStatus:s,thread:c,threadId:i,setUnseenCount:u,isKeyboard:d}=N(),m=async e=>{e.preventDefault(),window.localStorage.setItem("tmpThreadId",i),l(),r([]),o(),c.lastMessageSeen(),u(0),"closed"!==s&&c.endChat(),n(e)};(0,e.useEffect)((()=>{d&&setTimeout((()=>{document.querySelector("#confirm-endchat").focus()}),10)}),[]);const g=e=>{"Enter"!==e.key&&" "!==e.key||"confirm-endchat"!==e.target.id||m(e),"Enter"!==e.key&&" "!==e.key||"resume-chat"!==e.target.id||a(e)};return t().createElement(t().Fragment,null,t().createElement(L,null),t().createElement("div",{className:"wc-body"},t().createElement("div",{className:"wc-content"},t().createElement("h3",{id:"wc-subtitle",className:"wc-heading","aria-live":"polite"},"Are you sure you want to end the chat?"),t().createElement("div",{className:"govuk-button-group"},t().createElement("a",{id:"confirm-endchat",href:"#endChat",role:"button",className:"wc-button govuk-button","data-module":"govuk-button",onClick:m,onKeyDown:g},"Yes, end chat"),t().createElement("a",{id:"resume-chat",href:"#resumeChat",role:"button",className:"wc-link govuk-link","data-module":"govuk-button",onClick:a,onKeyDown:g},"No, resume chat")))))}function K({onCancel:a}){const{settings:n,setSettings:o}=N(),[l,r]=(0,e.useState)(n.audio),[s,c]=(0,e.useState)(n.scroll),i=e=>{e.preventDefault(),o({audio:l,scroll:s}),a(e)},u=e=>{"Enter"!==e.key&&" "!==e.key||"settings-save"!==e.target.id?"Enter"!==e.key&&" "!==e.key||"settings-cancel"!==e.target.id||a(e):i(e)};return t().createElement(t().Fragment,null,t().createElement(L,null),t().createElement("div",{className:"wc-body"},t().createElement("div",{className:"wc-content"},t().createElement("fieldset",{className:"govuk-fieldset govuk-!-margin-bottom-4"},t().createElement("legend",{className:"govuk-fieldset__legend govuk-fieldset__legend"},t().createElement("h3",{id:"wc-subtitle",className:"wc-heading"},"Change settings")),t().createElement("div",{className:"govuk-checkboxes govuk-checkboxes--small","data-module":"govuk-checkboxes"},t().createElement("div",{className:"govuk-checkboxes__item"},t().createElement("input",{id:"audio",name:"audio",type:"checkbox",value:"audio",className:"govuk-checkboxes__input",defaultChecked:l,onChange:()=>r(!l)}),t().createElement("label",{className:"wc-label govuk-label govuk-checkboxes__label",htmlFor:"audio"},"Play a sound when receiving a new message")),t().createElement("div",{className:"govuk-checkboxes__item"},t().createElement("input",{id:"scroll",name:"scroll",type:"checkbox",value:"scroll",className:"govuk-checkboxes__input",defaultChecked:s,onChange:()=>c(!s)}),t().createElement("label",{className:"wc-label govuk-label govuk-checkboxes__label",htmlFor:"scroll"},"Scroll automatically to a new message")))),t().createElement("div",{className:"govuk-button-group"},t().createElement("a",{id:"settings-save",href:"#",className:"wc-button govuk-button","data-module":"govuk-button",role:"button",onClick:i,onKeyDown:u},"Save"),t().createElement("a",{id:"settings-cancel",href:"#",className:"wc-link govuk-link","data-module":"govuk-button",role:"button",onClick:a,onKeyDown:u},"Cancel")))))}function V({onCancel:e}){const a=()=>{const e=window.localStorage.getItem("tmpThreadId");window.location.href=`https://defragroup.eu.qualtrics.com/jfe/form/SV_8dgFSJcxxIfqx5Y?Id=${e}&Source=${window.location.href}`,window.localStorage.removeItem("tmpThreadId")},n=async t=>{window.localStorage.removeItem("tmpThreadId"),e(t)},o=e=>{"Enter"!==e.key&&" "!==e.key||("feedback-close"===e.target.id&&n(e),"feedback-send"===e.target.id&&a())};return t().createElement(t().Fragment,null,t().createElement(L,null),t().createElement("div",{className:"wc-body"},t().createElement("div",{className:"wc-content"},t().createElement("h3",{id:"wc-subtitle",className:"wc-heading"},"Give feedback on Floodline webchat"),t().createElement("p",null,"We're running webchat as a trial. you can ",t().createElement("a",{id:"feedback-send",className:"govuk-link",href:"#",target:"_blank",rel:"noreferrer",onKeyDown:o,onClick:a},"give feedback")," to help us improve it."),t().createElement("p",null,t().createElement("a",{id:"feedback-close",className:"wc-link govuk-link",href:"#","data-module":"govuk-button",role:"button",onKeyDown:o,onClick:n},"Close")))))}const P=require("lodash.debounce");var H=a.n(P);const j=()=>{const{agentStatus:a,liveRegionText:n,setLiveRegionText:o}=N(),[l,r]=(0,e.useState)(),[s,c]=(0,e.useState)(),i="closed"===a||null===a,u=()=>{r(),c()},d=(0,e.useCallback)(H()((e=>{l?c(e):r(e)}),2e3),[l,s]);return(0,e.useEffect)((()=>(n&&(u(),d(n)),i&&(u(),o()),()=>{u(),o()})),[n]),t().createElement(t().Fragment,null,t().createElement("div",{className:"wc-live",role:"status","aria-atomic":"true"},l),t().createElement("div",{className:"wc-live",role:"status","aria-atomic":"true"},s))},W="aria-hidden",J="data-wc-inert",Z=e=>{for(const t of document.body.children)"wc-panel"!==t.id&&(e&&!t.getAttribute(W)?(t.setAttribute(W,"true"),t.setAttribute(J,"")):t.hasAttribute(J)&&(t.removeAttribute(W),t.removeAttribute(J)))},X=t=>{const[a,n]=(0,e.useState)([]),o=(0,e.useCallback)((e=>{const t=document.querySelector("#wc-panel");"Tab"===e.key&&(t&&!document.activeElement.closest("#wc-panel")&&t.focus(),e.shiftKey?(document.activeElement===a[0]||document.activeElement===document.querySelector("#wc-panel"))&&(a[a.length-1].focus(),e.preventDefault()):document.activeElement===a[a.length-1]&&(a[0].focus(),e.preventDefault()))}),[a]);(0,e.useEffect)((()=>{n((()=>{const e=document.body.querySelectorAll(["#wc-panel a:not([disabled])","#wc-panel button:not([disabled])","#wc-panel select:not([disabled])","#wc-panel input:not([disabled])","#wc-panel textarea:not([disabled])",'#wc-panel *[tabindex="0"]:not([disabled])'].join(","));return Array.from(e).filter((e=>!e.closest("[hidden]")&&!e.closest('[aria-hidden="true"]')))})())}),[t]),(0,e.useEffect)((()=>(Z(!0),document.querySelector("#wc-panel").focus(),document.addEventListener("keydown",o),()=>{Z(),document.removeEventListener("keydown",o)})),[a])};function z(){const{sdk:a,availability:n,instigatorId:o,thread:l,threadId:c,setThread:i,setThreadId:u,setChatVisibility:d,setMessages:m,setUnseenCount:g,isMobile:h,isKeyboard:E}=N(),{fetchThread:w,fetchMessages:v}=D(a),[b,y]=(0,e.useState)(c?2:0);X(b);const f=(0,e.useCallback)((e=>{"Escape"!==e.key&&"Esc"!==e.key||(c&&(l?.lastMessageSeen(),g(0)),d(!1),I())}),[l,c,g,d]);(0,e.useEffect)((()=>()=>{document.getElementById(o)?.focus()}),[]),(0,e.useEffect)((()=>(document.body.classList.remove("wc-u-hidden"),document.getElementsByTagName("html")[0].classList.add("wc-u-html"),document.body.classList.add("wc-u-body"),()=>{document.getElementsByTagName("html")[0].classList.remove("wc-u-html"),document.body.classList.remove("wc-u-body")})),[h]),(0,e.useEffect)((()=>(document.addEventListener("keydown",f),()=>{document.removeEventListener("keydown",f)})),[f,d]),(0,e.useEffect)((()=>{c&&(l?(l.lastMessageSeen(),g(0),y(2)):(async()=>{try{const e=await w(c);i(e);const t=await v(e,c);m(t)}catch(e){console.log("[Chat Error] fetchThread",e),u(),i(),y(0)}})())}),[l,c]);const p=e=>t=>{t.preventDefault(),y(e)},k=p(0),S=p(1),_=p(2),T=p(3),C=p(4),L=p(5);let x;switch(b){case 0:default:x=t().createElement(A,{onContinue:S});break;case 1:x=t().createElement(O,{onPreChatScreen:k});break;case 2:x=t().createElement(U,{onSettingsScreen:L,onEndChatScreen:T});break;case 3:x=t().createElement(Y,{onChatScreen:_,onEndChatConfirm:C});break;case 4:x=t().createElement(V,{onCancel:()=>{d(!1),I()}});break;case 5:x=t().createElement(K,{onCancel:_})}"UNAVAILABLE"===n&&(x=t().createElement($,null));const G=t().createElement("div",{id:"wc-panel",role:"dialog",className:r("wc-panel",E&&"wc-focus-visible"),tabIndex:"-1","aria-modal":"true","aria-labelledby":"wc-header wc-subtitle"},t().createElement("div",{className:"wc-panel__inner"},x),t().createElement(j,null));return t().createElement(t().Fragment,null,(0,s.createPortal)(G,document.body))}const Q=()=>{const{threadId:e,setInstigatorId:a}=N();if(!e)return null;const n=document.getElementById("webchat-skip-link-container");return n?t().createElement(t().Fragment,null,(0,s.createPortal)(t().createElement("a",{id:"webchat-skip-link",href:"#webchat",className:"govuk-skip-link","data-module":"govuk-skip-link",onClick:e=>{e.preventDefault(),a(e.target.id),window.location.hash="#webchat"},"data-wc-skiplink":!0,"data-wc-open-btn":!0},"Skip to webchat"),n)):null},{stripPageTitle:ee}=a(792);function te(){const{availability:a,isChatOpen:n,setChatVisibility:o,unseenCount:l,threadId:s,setUnseenCount:c,setInstigatorId:i,setLiveRegionText:u}=N(),d=(0,e.useRef)(),m=l>1?"new messages":"new message",g=l>0&&!n,h=ee(document.title);(0,e.useEffect)((()=>{g&&(document.title=`(${l} ${m}) - ${h}`)}),[l]);const E=e=>{e.preventDefault(),c(0),o(!n),i(e.target.id),n?I():C()},w=e=>{" "===e.key&&e.preventDefault()},v=e=>{" "===e.key&&(c(0),o(!n))};switch((0,e.useEffect)((()=>(g&&u(`Floodline webchat - ${l} ${m}`),()=>{u()})),[l,n]),(0,e.useEffect)((()=>{const e=()=>{if(!s)return;if("AVAILABLE"!==a)return;const e=d.current.parentElement.getBoundingClientRect().top+35>(window.innerHeight||document.documentElement.clientHeight),t=!n&&e;document.documentElement.classList.toggle("wc-u-scroll-padding",t),document.body.classList.toggle("wc-u-scroll-padding",t),d.current.classList.toggle("wc-availability--fixed",t)};return document.addEventListener("scroll",e),e(),()=>{document.removeEventListener("scroll",e)}}),[s,n,a]),a){case"AVAILABLE":return t().createElement(t().Fragment,null,t().createElement("div",{className:r("wc-availability",n&&"wc-open"),ref:d},t().createElement("div",{className:"wc-availability__inner"},t().createElement("a",{id:"webchat-start-chat-link",className:"wc-availability__link",href:"#webchat",draggable:"false",onClick:E,onKeyUp:v,onKeyDown:w,role:"button","data-module":"govuk-button"},s?t().createElement(t().Fragment,null,"Show chat"):t().createElement(t().Fragment,null,"Start chat"),g?t().createElement("span",{className:"wc-availability__unseen"},l,t().createElement("span",{className:"govuk-visually-hidden"}," ",m)):null))),n?t().createElement(z,null):t().createElement(j,null),t().createElement(Q,null));case"EXISTING":case"UNAVAILABLE":return t().createElement("p",{className:"govuk-body"},"When it is available, a 'start chat' link will appear.");default:return t().createElement("p",{className:"govuk-body"},"Checking availability")}}const ae=async e=>{const t=new(window.AudioContext||window.webkitAudioContext);if("suspended"===t.state){const e=["touchstart","touchend","mousedown","wheel","keydown","click"],a=n=>{e.forEach((e=>{document.body.removeEventListener(e,a)})),t.resume()};e.forEach((e=>{document.body.addEventListener(e,a,!1)}))}const a=await fetch(e),n=await a.arrayBuffer(),o=await t.decodeAudioData(n);return()=>{const e=t.createBufferSource();e.buffer=o,e.connect(t.destination),e.start()}};async function ne(e,a){const n=new l.ChatSdk({brandId:a.brandId,channelId:a.channelId,customerId:window.localStorage.getItem(w)||"",environment:a.environment}),r=(0,o.createRoot)(e);let s,c;try{const e=await async function(e){const t=await fetch(e);return{availability:(await t.json()).availability||"UNAVAILABLE"}}(a.availabilityEndpoint);c=await ae(a.audioUrl),s=e.availability}catch(e){s="UNAVAILABLE"}r.render(t().createElement(_,{sdk:n,availability:s,playSound:c},t().createElement(te,null)))}})(),module.exports=n})();