@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 +255 -49
- package/dist/client.js.map +1 -1
- package/package.json +2 -1
- package/src/client/components/availability/availability.jsx +20 -2
- package/src/client/components/chat/chat.jsx +77 -22
- package/src/client/components/live-region.jsx +55 -0
- package/src/client/components/panel/panel.jsx +2 -0
- package/src/client/components/screens/end-chat.jsx +33 -3
- package/src/client/components/screens/feedback.jsx +29 -2
- package/src/client/components/screens/settings.jsx +30 -2
- package/src/client/lib/agent-status-headline.js +19 -0
- package/src/client/scss/_settings.scss +21 -0
- package/src/client/store/AppProvider.jsx +7 -1
- package/src/client/store/actions-map.js +13 -4
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
|
-
|
|
182
|
-
|
|
183
|
-
connectionHeadlineText
|
|
184
|
-
|
|
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
|
-
|
|
192
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: "
|
|
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
|
|
549
|
-
/* harmony import */ var
|
|
550
|
-
/* harmony import */ var
|
|
551
|
-
/* harmony import */ var
|
|
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,
|
|
703
|
+
} = (0,_store_useApp_js__WEBPACK_IMPORTED_MODULE_11__.useApp)();
|
|
581
704
|
const {
|
|
582
705
|
fetchThread,
|
|
583
706
|
fetchMessages
|
|
584
|
-
} = (0,
|
|
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,
|
|
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,
|
|
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('#
|
|
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
|
-
|
|
782
|
-
|
|
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
|
|
1991
|
+
const setMessages = (state, payload) => {
|
|
1804
1992
|
return {
|
|
1805
1993
|
...state,
|
|
1806
|
-
messages:
|
|
1994
|
+
messages: (0,_lib_transform_messages__WEBPACK_IMPORTED_MODULE_0__.transformMessages)(payload).reverse()
|
|
1807
1995
|
};
|
|
1808
1996
|
};
|
|
1809
|
-
const
|
|
1997
|
+
const setMessage = (state, payload) => {
|
|
1810
1998
|
return {
|
|
1811
1999
|
...state,
|
|
1812
|
-
|
|
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" ***!
|