@defra/flood-webchat 0.0.1-beta.36 → 0.0.1-beta.38-draft

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
@@ -19,6 +19,8 @@ __webpack_require__.r(__webpack_exports__);
19
19
  /* harmony import */ var _skip_link_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../skip-link.jsx */ "./src/client/components/skip-link.jsx");
20
20
  /* harmony import */ var _store_useApp__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../store/useApp */ "./src/client/store/useApp.js");
21
21
  /* harmony import */ var _lib_history_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib/history.js */ "./src/client/lib/history.js");
22
+ /* harmony import */ var _live_region_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../live-region.jsx */ "./src/client/components/live-region.jsx");
23
+
22
24
 
23
25
 
24
26
 
@@ -33,7 +35,8 @@ function Availability() {
33
35
  unseenCount,
34
36
  threadId,
35
37
  setUnseenCount,
36
- setInstigatorId
38
+ setInstigatorId,
39
+ setLiveRegionText
37
40
  } = (0,_store_useApp__WEBPACK_IMPORTED_MODULE_4__.useApp)();
38
41
  const buttonRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();
39
42
  const onClick = e => {
@@ -58,6 +61,14 @@ function Availability() {
58
61
  setChatVisibility(!isChatOpen);
59
62
  }
60
63
  };
64
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
65
+ if (!isChatOpen && unseenCount > 0) {
66
+ setLiveRegionText(`Floodline Webchat - ${unseenCount} new messages`);
67
+ }
68
+ return () => {
69
+ setLiveRegionText();
70
+ };
71
+ }, [unseenCount, isChatOpen]);
61
72
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
62
73
  const onScroll = () => {
63
74
  if (!threadId) {
@@ -100,9 +111,9 @@ function Availability() {
100
111
  onKeyDown: onKeyDown,
101
112
  role: "button",
102
113
  "data-module": "govuk-button"
103
- }, TextComponent, unseenCount > 0 && !isChatOpen ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
114
+ }, TextComponent, unseenCount > 0 && !isChatOpen ? /*#__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", {
104
115
  className: "wc-availability__unseen"
105
- }, unseenCount) : null))), isChatOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_panel_panel_jsx__WEBPACK_IMPORTED_MODULE_2__.Panel, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_skip_link_jsx__WEBPACK_IMPORTED_MODULE_3__.SkipLink, null));
116
+ }, unseenCount), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_live_region_jsx__WEBPACK_IMPORTED_MODULE_6__.LiveRegion, null)) : null))), isChatOpen && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_panel_panel_jsx__WEBPACK_IMPORTED_MODULE_2__.Panel, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_skip_link_jsx__WEBPACK_IMPORTED_MODULE_3__.SkipLink, null));
106
117
  case 'EXISTING':
107
118
  case 'UNAVAILABLE':
108
119
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", {
@@ -135,6 +146,8 @@ __webpack_require__.r(__webpack_exports__);
135
146
  /* harmony import */ var _store_useApp_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../store/useApp.js */ "./src/client/store/useApp.js");
136
147
  /* harmony import */ var _hooks_useTextareaAutosize_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../hooks/useTextareaAutosize.js */ "./src/client/hooks/useTextareaAutosize.js");
137
148
  /* harmony import */ var _lib_transform_messages_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib/transform-messages.js */ "./src/client/lib/transform-messages.js");
149
+ /* harmony import */ var _lib_agent_status_headline_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib/agent-status-headline.js */ "./src/client/lib/agent-status-headline.js");
150
+
138
151
 
139
152
 
140
153
 
@@ -153,8 +166,10 @@ function Chat({
153
166
  agent,
154
167
  agentStatus,
155
168
  isAgentTyping,
169
+ isChatOpen,
156
170
  settings,
157
- isKeyboard
171
+ isKeyboard,
172
+ setLiveRegionText
158
173
  } = (0,_store_useApp_js__WEBPACK_IMPORTED_MODULE_4__.useApp)();
159
174
  const [userMessage, setUserMessage] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
160
175
  const [focusVisibleWithin, setFocusVisibleWithin] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
@@ -178,36 +193,45 @@ function Chat({
178
193
  setUserMessage(e.target?.value);
179
194
  };
180
195
  const agentName = agent?.nickname || agent?.firstName;
181
- let connectionHeadlineText = 'Connecting to Floodline';
182
- if (agentStatus === 'closed') {
183
- connectionHeadlineText = agentName ? `${agentName} ended the session` : 'Session ended by advisor';
184
- } else if (agentStatus) {
185
- if (agentName) {
186
- connectionHeadlineText = `You are speaking with ${agentName}`;
187
- } else {
188
- connectionHeadlineText = 'No advisers currently available';
196
+ const connectionHeadlineText = (0,_lib_agent_status_headline_js__WEBPACK_IMPORTED_MODULE_7__.agentStatusHeadline)(availability, agentStatus, agentName);
197
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
198
+ if (connectionHeadlineText) {
199
+ setLiveRegionText(`Floodline Webchat - ${connectionHeadlineText}`);
189
200
  }
190
- }
191
- if (availability === 'UNAVAILABLE') {
192
- connectionHeadlineText = 'Webchat is not currently available';
193
- }
201
+ return () => {
202
+ setLiveRegionText();
203
+ };
204
+ }, [connectionHeadlineText]);
205
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
206
+ if (isAgentTyping && isChatOpen) {
207
+ setLiveRegionText(`${agentName} is typing...`);
208
+ }
209
+ return () => {
210
+ setLiveRegionText();
211
+ };
212
+ }, [isAgentTyping, isChatOpen]);
213
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
214
+ const lastAgentMessage = messages[messages.length - 1];
215
+ if (lastAgentMessage?.direction === 'outbound') {
216
+ setLiveRegionText(`${agentName} said: ${lastAgentMessage.text}`);
217
+ }
218
+ return () => {
219
+ setLiveRegionText();
220
+ };
221
+ }, [messages]);
194
222
  const sendMessage = () => {
195
223
  if (messageRef.current.value.length === 0) {
196
224
  return;
197
225
  }
198
226
  try {
199
- thread.sendTextMessage(messageRef.current.value.trim());
227
+ const message = messageRef.current.value.trim();
228
+ thread.sendTextMessage(message);
229
+ setLiveRegionText(`You said: ${message}`);
200
230
  } catch (err) {
201
231
  console.log('[Chat Error] sendMessage', err);
202
232
  }
203
233
  setUserMessage('');
204
234
  };
205
- const handleKeyPress = e => {
206
- if (e.key === 'Enter' && !e.shiftKey) {
207
- e.preventDefault();
208
- sendMessage();
209
- }
210
- };
211
235
  const handleSubmit = e => {
212
236
  e.preventDefault();
213
237
  sendMessage();
@@ -217,16 +241,45 @@ function Chat({
217
241
  const saveChatLink = document.querySelector('#transcript-download');
218
242
  saveChatLink.setAttribute('href', `data:text/plain;charset=utf-8,${transcript}`);
219
243
  };
244
+ const handleKeyPress = e => {
245
+ if (e.key === 'Enter' && !e.shiftKey) {
246
+ switch (e.target.id) {
247
+ case 'text-area':
248
+ e.preventDefault();
249
+ sendMessage();
250
+ break;
251
+ case 'end-chat':
252
+ onEndChatScreen(e);
253
+ break;
254
+ case 'wc-settings':
255
+ onSettingsScreen(e);
256
+ break;
257
+ case 'transcript-download':
258
+ saveChat();
259
+ break;
260
+ default:
261
+ break;
262
+ }
263
+ } else if (e.key === ' ') {
264
+ if (e.target.id === 'end-chat') {
265
+ onEndChatScreen(e);
266
+ } else if (e.target.id === 'wc-settings') {
267
+ onSettingsScreen(e);
268
+ }
269
+ }
270
+ };
220
271
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_panel_panel_header_jsx__WEBPACK_IMPORTED_MODULE_1__.PanelHeader, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
221
272
  className: "wc-status"
222
273
  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", {
223
274
  className: "wc-status__availability"
224
275
  }, connectionHeadlineText), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
276
+ id: "end-chat",
225
277
  className: "wc-status__link",
226
278
  href: "#",
227
- role: "button",
228
279
  "data-module": "govuk-button",
229
- onClick: onEndChatScreen
280
+ role: "button",
281
+ onClick: onEndChatScreen,
282
+ onKeyDown: handleKeyPress
230
283
  }, "End chat")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
231
284
  className: "wc-body",
232
285
  tabIndex: "0"
@@ -280,7 +333,7 @@ function Chat({
280
333
  rows: "1",
281
334
  "aria-required": "true",
282
335
  className: "wc-form__textarea",
283
- id: "wc-form-textarea",
336
+ id: "text-area",
284
337
  name: "message",
285
338
  onChange: onChange,
286
339
  onKeyDown: handleKeyPress,
@@ -303,6 +356,7 @@ function Chat({
303
356
  id: "wc-settings",
304
357
  className: "wc-footer__settings-link",
305
358
  "data-module": "govuk-button",
359
+ onKeyDown: handleKeyPress,
306
360
  onClick: onSettingsScreen
307
361
  }, "Settings"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
308
362
  href: "#",
@@ -310,6 +364,7 @@ function Chat({
310
364
  className: "wc-footer__settings-link",
311
365
  "data-module": "govuk-button",
312
366
  download: "floodline-webchat-transcript.txt",
367
+ onKeyDown: handleKeyPress,
313
368
  onClick: saveChat
314
369
  }, "Save chat"))));
315
370
  }
@@ -365,6 +420,72 @@ const ErrorSummary = ({
365
420
 
366
421
  /***/ }),
367
422
 
423
+ /***/ "./src/client/components/live-region.jsx":
424
+ /*!***********************************************!*\
425
+ !*** ./src/client/components/live-region.jsx ***!
426
+ \***********************************************/
427
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
428
+
429
+ __webpack_require__.r(__webpack_exports__);
430
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
431
+ /* harmony export */ LiveRegion: () => (/* binding */ LiveRegion)
432
+ /* harmony export */ });
433
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
434
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
435
+ /* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash.debounce */ "lodash.debounce");
436
+ /* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_1__);
437
+ /* harmony import */ var _store_useApp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../store/useApp */ "./src/client/store/useApp.js");
438
+
439
+
440
+
441
+ const LiveRegion = () => {
442
+ const {
443
+ agentStatus,
444
+ liveRegionText,
445
+ setLiveRegionText
446
+ } = (0,_store_useApp__WEBPACK_IMPORTED_MODULE_2__.useApp)();
447
+ const [textA, setTextA] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)();
448
+ const [textB, setTextB] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)();
449
+ const isSessionEnded = agentStatus === 'closed' || agentStatus === null;
450
+ const clearText = () => {
451
+ setTextA();
452
+ setTextB();
453
+ };
454
+ const setText = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(lodash_debounce__WEBPACK_IMPORTED_MODULE_1___default()(text => {
455
+ if (textA) {
456
+ setTextB(text);
457
+ } else {
458
+ setTextA(text);
459
+ }
460
+ }, 2000), [textA, textB]);
461
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
462
+ console.log('liveRegionText', liveRegionText);
463
+ if (liveRegionText) {
464
+ clearText();
465
+ setText(liveRegionText);
466
+ }
467
+ if (isSessionEnded) {
468
+ clearText();
469
+ setLiveRegionText();
470
+ }
471
+ return () => {
472
+ clearText();
473
+ setLiveRegionText();
474
+ };
475
+ }, [liveRegionText]);
476
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
477
+ className: "wc-live",
478
+ "aria-live": "polite",
479
+ "aria-atomic": "true"
480
+ }, textA), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
481
+ className: "wc-live",
482
+ "aria-live": "polite",
483
+ "aria-atomic": "true"
484
+ }, textB));
485
+ };
486
+
487
+ /***/ }),
488
+
368
489
  /***/ "./src/client/components/message/message.jsx":
369
490
  /*!***************************************************!*\
370
491
  !*** ./src/client/components/message/message.jsx ***!
@@ -545,10 +666,12 @@ __webpack_require__.r(__webpack_exports__);
545
666
  /* harmony import */ var _screens_end_chat_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../screens/end-chat.jsx */ "./src/client/components/screens/end-chat.jsx");
546
667
  /* harmony import */ var _screens_settings_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../screens/settings.jsx */ "./src/client/components/screens/settings.jsx");
547
668
  /* harmony import */ var _screens_feedback_jsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../screens/feedback.jsx */ "./src/client/components/screens/feedback.jsx");
548
- /* harmony import */ var _store_useApp_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../store/useApp.js */ "./src/client/store/useApp.js");
549
- /* harmony import */ var _store_useChatSdk_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../store/useChatSdk.js */ "./src/client/store/useChatSdk.js");
550
- /* harmony import */ var _hooks_useFocusedElements_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../hooks/useFocusedElements.js */ "./src/client/hooks/useFocusedElements.js");
551
- /* harmony import */ var _lib_history_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../lib/history.js */ "./src/client/lib/history.js");
669
+ /* harmony import */ var _live_region_jsx__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../live-region.jsx */ "./src/client/components/live-region.jsx");
670
+ /* harmony import */ var _store_useApp_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../store/useApp.js */ "./src/client/store/useApp.js");
671
+ /* harmony import */ var _store_useChatSdk_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../store/useChatSdk.js */ "./src/client/store/useChatSdk.js");
672
+ /* harmony import */ var _hooks_useFocusedElements_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../hooks/useFocusedElements.js */ "./src/client/hooks/useFocusedElements.js");
673
+ /* harmony import */ var _lib_history_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../lib/history.js */ "./src/client/lib/history.js");
674
+
552
675
 
553
676
 
554
677
 
@@ -577,13 +700,13 @@ function Panel() {
577
700
  setUnseenCount,
578
701
  isMobile,
579
702
  isKeyboard
580
- } = (0,_store_useApp_js__WEBPACK_IMPORTED_MODULE_10__.useApp)();
703
+ } = (0,_store_useApp_js__WEBPACK_IMPORTED_MODULE_11__.useApp)();
581
704
  const {
582
705
  fetchThread,
583
706
  fetchMessages
584
- } = (0,_store_useChatSdk_js__WEBPACK_IMPORTED_MODULE_11__.useChatSdk)(sdk);
707
+ } = (0,_store_useChatSdk_js__WEBPACK_IMPORTED_MODULE_12__.useChatSdk)(sdk);
585
708
  const [screen, setScreen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(threadId ? 2 : 0);
586
- (0,_hooks_useFocusedElements_js__WEBPACK_IMPORTED_MODULE_12__.useFocusedElements)(screen);
709
+ (0,_hooks_useFocusedElements_js__WEBPACK_IMPORTED_MODULE_13__.useFocusedElements)(screen);
587
710
  const onEscapeKey = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(e => {
588
711
  if (e.key === 'Escape' || e.key === 'Esc') {
589
712
  if (threadId) {
@@ -591,7 +714,7 @@ function Panel() {
591
714
  setUnseenCount(0);
592
715
  }
593
716
  setChatVisibility(false);
594
- (0,_lib_history_js__WEBPACK_IMPORTED_MODULE_13__.historyReplaceState)();
717
+ (0,_lib_history_js__WEBPACK_IMPORTED_MODULE_14__.historyReplaceState)();
595
718
  document.getElementById(instigatorId)?.focus();
596
719
  }
597
720
  }, [thread, threadId, setUnseenCount, setChatVisibility]);
@@ -707,7 +830,7 @@ function Panel() {
707
830
  "aria-labelledby": "wc-header-title"
708
831
  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
709
832
  className: "wc-panel__inner"
710
- }, ScreenComponent));
833
+ }, ScreenComponent), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_live_region_jsx__WEBPACK_IMPORTED_MODULE_10__.LiveRegion, null));
711
834
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/(0,react_dom__WEBPACK_IMPORTED_MODULE_1__.createPortal)(Component, document.body));
712
835
  }
713
836
 
@@ -727,6 +850,8 @@ __webpack_require__.r(__webpack_exports__);
727
850
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
728
851
  /* harmony import */ var _panel_panel_header_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../panel/panel-header.jsx */ "./src/client/components/panel/panel-header.jsx");
729
852
  /* harmony import */ var _store_useApp_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store/useApp.js */ "./src/client/store/useApp.js");
853
+ /* harmony import */ var _lib_history_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../lib/history.js */ "./src/client/lib/history.js");
854
+
730
855
 
731
856
 
732
857
 
@@ -755,15 +880,23 @@ function EndChat({
755
880
  if (agentStatus !== 'closed') {
756
881
  thread.endChat();
757
882
  }
883
+ (0,_lib_history_js__WEBPACK_IMPORTED_MODULE_3__.historyReplaceState)();
758
884
  onEndChatConfirm(e);
759
885
  };
760
886
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
761
887
  if (isKeyboard) {
762
888
  setTimeout(() => {
763
- document.querySelector('#confirmEndChat').focus();
889
+ document.querySelector('#confirm-endchat').focus();
764
890
  }, 10);
765
891
  }
766
892
  }, []);
893
+ const handleKeyPress = e => {
894
+ if ((e.key === 'Enter' || e.key === ' ') && e.target.id === 'confirm-endchat') {
895
+ confirmEndChat(e);
896
+ } else if ((e.key === 'Enter' || e.key === ' ') && e.target.id === 'resume-chat') {
897
+ onChatScreen(e);
898
+ }
899
+ };
767
900
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_panel_panel_header_jsx__WEBPACK_IMPORTED_MODULE_1__.PanelHeader, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
768
901
  className: "wc-body"
769
902
  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
@@ -774,18 +907,21 @@ function EndChat({
774
907
  }, "Are you sure you want to end the chat?"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
775
908
  className: "govuk-button-group"
776
909
  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
910
+ id: "confirm-endchat",
777
911
  href: "#endChat",
778
912
  role: "button",
779
913
  className: "wc-button govuk-button",
780
914
  "data-module": "govuk-button",
781
- id: "confirmEndChat",
782
- onClick: confirmEndChat
915
+ onClick: confirmEndChat,
916
+ onKeyDown: handleKeyPress
783
917
  }, "Yes, end chat"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
918
+ id: "resume-chat",
784
919
  href: "#resumeChat",
785
920
  role: "button",
786
921
  className: "wc-link govuk-link",
787
922
  "data-module": "govuk-button",
788
- onClick: onChatScreen
923
+ onClick: onChatScreen,
924
+ onKeyDown: handleKeyPress
789
925
  }, "No, resume chat")))));
790
926
  }
791
927
 
@@ -812,6 +948,11 @@ function Feedback({
812
948
  const feedbackCancel = async e => {
813
949
  onCancel(e);
814
950
  };
951
+ const handleKeyPress = e => {
952
+ if ((e.key === 'Enter' || e.key === ' ') && e.target.id === 'feedback-cancel') {
953
+ onCancel(e);
954
+ }
955
+ };
815
956
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_panel_panel_header_jsx__WEBPACK_IMPORTED_MODULE_1__.PanelHeader, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
816
957
  className: "wc-body"
817
958
  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
@@ -823,15 +964,14 @@ function Feedback({
823
964
  className: "govuk-link",
824
965
  href: "#",
825
966
  target: "_blank",
826
- rel: "noreferrer",
827
- role: "button",
828
- "data-module": "govuk-button"
967
+ rel: "noreferrer"
829
968
  }, "Feedback Link")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
830
969
  id: "feedback-cancel",
831
970
  className: "wc-link govuk-link",
832
971
  href: "#",
833
972
  "data-module": "govuk-button",
834
973
  role: "button",
974
+ onKeyDown: handleKeyPress,
835
975
  onClick: feedbackCancel
836
976
  }, "Close")))));
837
977
  }
@@ -1099,6 +1239,13 @@ function Settings({
1099
1239
  });
1100
1240
  onCancel(e);
1101
1241
  };
1242
+ const handleKeyPress = e => {
1243
+ if ((e.key === 'Enter' || e.key === ' ') && e.target.id === 'settings-save') {
1244
+ onSave(e);
1245
+ } else if ((e.key === 'Enter' || e.key === ' ') && e.target.id === 'settings-cancel') {
1246
+ onCancel(e);
1247
+ }
1248
+ };
1102
1249
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_panel_panel_header_jsx__WEBPACK_IMPORTED_MODULE_1__.PanelHeader, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
1103
1250
  className: "wc-body"
1104
1251
  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
@@ -1147,14 +1294,16 @@ function Settings({
1147
1294
  className: "wc-button govuk-button",
1148
1295
  "data-module": "govuk-button",
1149
1296
  role: "button",
1150
- onClick: onSave
1297
+ onClick: onSave,
1298
+ onKeyDown: handleKeyPress
1151
1299
  }, "Save"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
1152
1300
  id: "settings-cancel",
1153
1301
  href: "#",
1154
1302
  className: "wc-link govuk-link",
1155
1303
  "data-module": "govuk-button",
1156
1304
  role: "button",
1157
- onClick: onCancel
1305
+ onClick: onCancel,
1306
+ onKeyDown: handleKeyPress
1158
1307
  }, "Cancel")))));
1159
1308
  }
1160
1309
 
@@ -1343,6 +1492,35 @@ const useTextareaAutosize = (textAreaRef, value) => {
1343
1492
 
1344
1493
  /***/ }),
1345
1494
 
1495
+ /***/ "./src/client/lib/agent-status-headline.js":
1496
+ /*!*************************************************!*\
1497
+ !*** ./src/client/lib/agent-status-headline.js ***!
1498
+ \*************************************************/
1499
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1500
+
1501
+ __webpack_require__.r(__webpack_exports__);
1502
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1503
+ /* harmony export */ agentStatusHeadline: () => (/* binding */ agentStatusHeadline)
1504
+ /* harmony export */ });
1505
+ const agentStatusHeadline = (availability, agentStatus, agentName) => {
1506
+ let connectionHeadlineText = 'Connecting to Floodline';
1507
+ if (agentStatus === 'closed') {
1508
+ connectionHeadlineText = agentName ? `${agentName} ended the session` : 'Session ended by advisor';
1509
+ } else if (agentStatus) {
1510
+ if (agentName) {
1511
+ connectionHeadlineText = `You are speaking with ${agentName}`;
1512
+ } else {
1513
+ connectionHeadlineText = 'No advisers currently available';
1514
+ }
1515
+ }
1516
+ if (availability === 'UNAVAILABLE') {
1517
+ connectionHeadlineText = 'Webchat is not currently available';
1518
+ }
1519
+ return connectionHeadlineText;
1520
+ };
1521
+
1522
+ /***/ }),
1523
+
1346
1524
  /***/ "./src/client/lib/check-availability.js":
1347
1525
  /*!**********************************************!*\
1348
1526
  !*** ./src/client/lib/check-availability.js ***!
@@ -1550,7 +1728,7 @@ const AppProvider = ({
1550
1728
  payload: e.detail.data.case.status
1551
1729
  });
1552
1730
  };
1553
- const onAgentTypingStarted = () => {
1731
+ const onAgentTypingStarted = e => {
1554
1732
  dispatch({
1555
1733
  type: 'SET_AGENT_TYPING',
1556
1734
  payload: true
@@ -1561,6 +1739,9 @@ const AppProvider = ({
1561
1739
  type: 'SET_AGENT_TYPING',
1562
1740
  payload: false
1563
1741
  });
1742
+ dispatch({
1743
+ type: 'SET_LIVE_REGION_TEXT'
1744
+ });
1564
1745
  };
1565
1746
  const onMessageCreated = e => {
1566
1747
  dispatch({
@@ -1706,6 +1887,12 @@ const AppProvider = ({
1706
1887
  payload: id
1707
1888
  });
1708
1889
  };
1890
+ const setLiveRegionText = text => {
1891
+ dispatch({
1892
+ type: 'SET_LIVE_REGION_TEXT',
1893
+ payload: text
1894
+ });
1895
+ };
1709
1896
 
1710
1897
  /**
1711
1898
  * Application-wide state and state functions
@@ -1721,6 +1908,7 @@ const AppProvider = ({
1721
1908
  setUnseenCount,
1722
1909
  setChatVisibility,
1723
1910
  setInstigatorId,
1911
+ setLiveRegionText,
1724
1912
  onLiveChatRecovered,
1725
1913
  onAssignedAgentChanged,
1726
1914
  onAgentTypingStarted,
@@ -1800,16 +1988,17 @@ const setThread = (state, payload) => {
1800
1988
  thread: payload
1801
1989
  };
1802
1990
  };
1803
- const setMessage = (state, payload) => {
1991
+ const setMessages = (state, payload) => {
1804
1992
  return {
1805
1993
  ...state,
1806
- messages: [...state.messages, (0,_lib_transform_messages__WEBPACK_IMPORTED_MODULE_0__.transformMessage)(payload)]
1994
+ messages: (0,_lib_transform_messages__WEBPACK_IMPORTED_MODULE_0__.transformMessages)(payload).reverse()
1807
1995
  };
1808
1996
  };
1809
- const setMessages = (state, payload) => {
1997
+ const setMessage = (state, payload) => {
1810
1998
  return {
1811
1999
  ...state,
1812
- messages: (0,_lib_transform_messages__WEBPACK_IMPORTED_MODULE_0__.transformMessages)(payload).reverse()
2000
+ message: (0,_lib_transform_messages__WEBPACK_IMPORTED_MODULE_0__.transformMessage)(payload),
2001
+ messages: [...state.messages, (0,_lib_transform_messages__WEBPACK_IMPORTED_MODULE_0__.transformMessage)(payload)]
1813
2002
  };
1814
2003
  };
1815
2004
  const setAgent = (state, payload) => {
@@ -1842,6 +2031,12 @@ const setInstigatorId = (state, payload) => {
1842
2031
  instigatorId: payload
1843
2032
  };
1844
2033
  };
2034
+ const setLiveRegionText = (state, payload) => {
2035
+ return {
2036
+ ...state,
2037
+ liveRegionText: payload
2038
+ };
2039
+ };
1845
2040
  const toggleIsMobile = (state, payload) => {
1846
2041
  return {
1847
2042
  ...state,
@@ -1868,6 +2063,7 @@ const actionsMap = {
1868
2063
  SET_AGENT_STATUS: setAgentStatus,
1869
2064
  SET_UNSEEN_COUNT: setUnseenCount,
1870
2065
  SET_INSTIGATOR_ID: setInstigatorId,
2066
+ SET_LIVE_REGION_TEXT: setLiveRegionText,
1871
2067
  TOGGLE_IS_MOBILE: toggleIsMobile,
1872
2068
  TOGGLE_IS_KEYBOARD: toggleIsKeyboard
1873
2069
  };
@@ -2014,6 +2210,16 @@ module.exports = require("@nice-devone/nice-cxone-chat-web-sdk");
2014
2210
 
2015
2211
  /***/ }),
2016
2212
 
2213
+ /***/ "lodash.debounce":
2214
+ /*!**********************************!*\
2215
+ !*** external "lodash.debounce" ***!
2216
+ \**********************************/
2217
+ /***/ ((module) => {
2218
+
2219
+ module.exports = require("lodash.debounce");
2220
+
2221
+ /***/ }),
2222
+
2017
2223
  /***/ "luxon":
2018
2224
  /*!************************!*\
2019
2225
  !*** external "luxon" ***!