@defra/flood-webchat 0.0.1-beta.24 → 0.0.1-beta.26

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
@@ -24,10 +24,10 @@ __webpack_require__.r(__webpack_exports__);
24
24
  function Availability() {
25
25
  const {
26
26
  availability,
27
- messages,
28
27
  isChatOpen,
29
28
  setChatVisibility,
30
- unseenCount
29
+ unseenCount,
30
+ threadId
31
31
  } = (0,_store_useApp__WEBPACK_IMPORTED_MODULE_3__.useApp)();
32
32
  const [isFixed, setIsFixed] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
33
33
  const buttonRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();
@@ -47,7 +47,7 @@ function Availability() {
47
47
  const intersectionCallback = entries => {
48
48
  const [entry] = entries;
49
49
  const isBelowFold = !entry.isIntersecting && entry.boundingClientRect.top > 0;
50
- setIsFixed(!isChatOpen && isBelowFold);
50
+ setIsFixed(!isChatOpen && isBelowFold && threadId);
51
51
  };
52
52
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
53
53
  const observer = new window.IntersectionObserver(intersectionCallback, {
@@ -68,7 +68,7 @@ function Availability() {
68
68
  document.body.classList.toggle('wc-scroll-padding', isFixed);
69
69
  }, [isFixed]);
70
70
  let TextComponent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, "Show Chat");
71
- if (!messages.length) {
71
+ if (!threadId) {
72
72
  TextComponent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, "Start Chat");
73
73
  }
74
74
  switch (availability) {
@@ -174,8 +174,7 @@ function Chat({
174
174
  if (availability === 'UNAVAILABLE') {
175
175
  connectionHeadlineText = 'Webchat is not currently available';
176
176
  }
177
- const sendMessage = e => {
178
- e.preventDefault();
177
+ const sendMessage = () => {
179
178
  if (messageRef.current.value.length === 0) {
180
179
  return;
181
180
  }
@@ -186,11 +185,20 @@ function Chat({
186
185
  }
187
186
  setUserMessage('');
188
187
  };
188
+ const handleKeyPress = e => {
189
+ if (e.key === 'Enter' && !e.shiftKey) {
190
+ e.preventDefault();
191
+ sendMessage();
192
+ }
193
+ };
194
+ const handleSubmit = e => {
195
+ e.preventDefault();
196
+ sendMessage();
197
+ };
189
198
  const saveChat = () => {
190
199
  const transcript = (0,_lib_transform_messages_js__WEBPACK_IMPORTED_MODULE_6__.formatTranscript)(messages);
191
200
  const saveChatLink = document.querySelector('#transcript-download');
192
201
  saveChatLink.setAttribute('href', `data:text/plain;charset=utf-8,${transcript}`);
193
- saveChatLink.click();
194
202
  };
195
203
  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", {
196
204
  className: "wc-status"
@@ -245,7 +253,8 @@ function Chat({
245
253
  className: "wc-footer__input"
246
254
  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", {
247
255
  className: "wc-form",
248
- noValidate: true
256
+ noValidate: true,
257
+ onSubmit: handleSubmit
249
258
  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
250
259
  className: "govuk-label wc-form__label govuk-!-font-size-16",
251
260
  htmlFor: "wc-form-textarea"
@@ -259,13 +268,13 @@ function Chat({
259
268
  id: "wc-form-textarea",
260
269
  name: "message",
261
270
  onChange: onChange,
271
+ onKeyDown: handleKeyPress,
262
272
  value: userMessage
263
273
  }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
264
274
  type: "submit",
265
275
  className: "wc-form__button govuk-button govuk-!-font-size-16",
266
276
  value: "Send",
267
- "data-prevent-double-click": "true",
268
- onClick: sendMessage
277
+ "data-prevent-double-click": "true"
269
278
  }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
270
279
  className: "wc-footer__settings"
271
280
  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
@@ -411,13 +420,16 @@ function PanelHeader() {
411
420
  const {
412
421
  thread,
413
422
  setChatVisibility,
414
- setUnseenCount
423
+ setUnseenCount,
424
+ threadId
415
425
  } = (0,_store_useApp_js__WEBPACK_IMPORTED_MODULE_1__.useApp)();
416
426
  const onClose = e => {
417
427
  e.preventDefault();
418
428
  setChatVisibility(false);
419
- thread.lastMessageSeen();
420
- setUnseenCount(0);
429
+ if (threadId) {
430
+ thread?.lastMessageSeen();
431
+ setUnseenCount(0);
432
+ }
421
433
  };
422
434
  let ButtonComponent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
423
435
  className: "wc-header__close",
@@ -479,9 +491,11 @@ __webpack_require__.r(__webpack_exports__);
479
491
  /* harmony import */ var _screens_unavailable_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../screens/unavailable.jsx */ "./src/client/components/screens/unavailable.jsx");
480
492
  /* harmony import */ var _screens_end_chat_jsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../screens/end-chat.jsx */ "./src/client/components/screens/end-chat.jsx");
481
493
  /* harmony import */ var _screens_settings_jsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../screens/settings.jsx */ "./src/client/components/screens/settings.jsx");
482
- /* harmony import */ var _store_useApp_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../store/useApp.js */ "./src/client/store/useApp.js");
483
- /* harmony import */ var _store_useChatSdk_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../store/useChatSdk.js */ "./src/client/store/useChatSdk.js");
484
- /* harmony import */ var _hooks_useFocusedElements_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../hooks/useFocusedElements.js */ "./src/client/hooks/useFocusedElements.js");
494
+ /* harmony import */ var _screens_feedback_jsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../screens/feedback.jsx */ "./src/client/components/screens/feedback.jsx");
495
+ /* harmony import */ var _store_useApp_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../store/useApp.js */ "./src/client/store/useApp.js");
496
+ /* harmony import */ var _store_useChatSdk_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../store/useChatSdk.js */ "./src/client/store/useChatSdk.js");
497
+ /* harmony import */ var _hooks_useFocusedElements_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../hooks/useFocusedElements.js */ "./src/client/hooks/useFocusedElements.js");
498
+
485
499
 
486
500
 
487
501
 
@@ -504,13 +518,22 @@ function Panel() {
504
518
  setChatVisibility,
505
519
  setMessages,
506
520
  setUnseenCount
507
- } = (0,_store_useApp_js__WEBPACK_IMPORTED_MODULE_8__.useApp)();
521
+ } = (0,_store_useApp_js__WEBPACK_IMPORTED_MODULE_9__.useApp)();
508
522
  const {
509
523
  fetchThread,
510
524
  fetchMessages
511
- } = (0,_store_useChatSdk_js__WEBPACK_IMPORTED_MODULE_9__.useChatSdk)(sdk);
525
+ } = (0,_store_useChatSdk_js__WEBPACK_IMPORTED_MODULE_10__.useChatSdk)(sdk);
512
526
  const [screen, setScreen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(threadId ? 2 : 0);
513
- (0,_hooks_useFocusedElements_js__WEBPACK_IMPORTED_MODULE_10__.useFocusedElements)(screen);
527
+ (0,_hooks_useFocusedElements_js__WEBPACK_IMPORTED_MODULE_11__.useFocusedElements)(screen);
528
+ const onEscapeKey = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(e => {
529
+ if (e.key === 'Escape' || e.key === 'Esc') {
530
+ if (threadId) {
531
+ thread?.lastMessageSeen();
532
+ setUnseenCount(0);
533
+ }
534
+ setChatVisibility(false);
535
+ }
536
+ }, [thread, threadId, setUnseenCount, setChatVisibility]);
514
537
 
515
538
  /**
516
539
  * Initializes the eventListener for pressing the escape key
@@ -520,7 +543,7 @@ function Panel() {
520
543
  return () => {
521
544
  document.removeEventListener('keydown', escapeKeyEvent);
522
545
  };
523
- }, []);
546
+ }, [onEscapeKey, setChatVisibility]);
524
547
 
525
548
  /**
526
549
  * Recovers the thread if there is a threadId but no thread loaded in to state
@@ -549,11 +572,6 @@ function Panel() {
549
572
  }
550
573
  }
551
574
  }, [thread, threadId]);
552
- const onEscapeKey = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(e => {
553
- if (e.key === 'Escape' || e.key === 'Esc') {
554
- setChatVisibility(false);
555
- }
556
- }, []);
557
575
  const handleScreenChange = newScreen => e => {
558
576
  e.preventDefault();
559
577
  setScreen(newScreen);
@@ -562,6 +580,7 @@ function Panel() {
562
580
  const goToRequestChatScreen = handleScreenChange(1);
563
581
  const goToChatScreen = handleScreenChange(2);
564
582
  const goToEndChatScreen = handleScreenChange(3);
583
+ const goToFeedbackScreen = handleScreenChange(4);
565
584
  const goToSettingsScreen = handleScreenChange(5);
566
585
  let ScreenComponent;
567
586
  switch (screen) {
@@ -583,7 +602,13 @@ function Panel() {
583
602
  break;
584
603
  case 3:
585
604
  ScreenComponent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_screens_end_chat_jsx__WEBPACK_IMPORTED_MODULE_6__.EndChat, {
586
- onChatScreen: goToChatScreen
605
+ onChatScreen: goToChatScreen,
606
+ onEndChatConfirm: goToFeedbackScreen
607
+ });
608
+ break;
609
+ case 4:
610
+ ScreenComponent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_screens_feedback_jsx__WEBPACK_IMPORTED_MODULE_8__.Feedback, {
611
+ onCancel: () => setChatVisibility(false)
587
612
  });
588
613
  break;
589
614
  case 5:
@@ -625,11 +650,36 @@ __webpack_require__.r(__webpack_exports__);
625
650
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
626
651
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
627
652
  /* harmony import */ var _panel_panel_header_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../panel/panel-header.jsx */ "./src/client/components/panel/panel-header.jsx");
653
+ /* harmony import */ var _store_useApp_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store/useApp.js */ "./src/client/store/useApp.js");
654
+
628
655
 
629
656
 
630
657
  function EndChat({
631
- onChatScreen
658
+ onChatScreen,
659
+ onEndChatConfirm
632
660
  }) {
661
+ const {
662
+ setCustomerId,
663
+ setThreadId,
664
+ setMessages,
665
+ agentStatus,
666
+ thread,
667
+ setUnseenCount
668
+ } = (0,_store_useApp_js__WEBPACK_IMPORTED_MODULE_2__.useApp)();
669
+ const confirmEndChat = async e => {
670
+ e.preventDefault();
671
+ setThreadId();
672
+ setMessages([]);
673
+ setCustomerId();
674
+ thread.lastMessageSeen();
675
+ setUnseenCount(0);
676
+
677
+ // End chat if still open
678
+ if (agentStatus !== 'closed') {
679
+ thread.endChat();
680
+ }
681
+ onEndChatConfirm(e);
682
+ };
633
683
  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", {
634
684
  className: "wc-body"
635
685
  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h3", {
@@ -638,11 +688,13 @@ function EndChat({
638
688
  }, "Are you sure you want to end the chat?"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
639
689
  className: "govuk-button-group"
640
690
  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
641
- href: "#",
691
+ href: "#endChat",
642
692
  className: "govuk-button govuk-!-font-size-16",
643
- "data-module": "govuk-button"
693
+ "data-module": "govuk-button",
694
+ id: "confirmEndChat",
695
+ onClick: confirmEndChat
644
696
  }, "Yes, end chat"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
645
- href: "#",
697
+ href: "#resumeChat",
646
698
  className: "govuk-link govuk-!-font-size-16",
647
699
  onClick: onChatScreen
648
700
  }, "No, resume chat"))));
@@ -650,6 +702,50 @@ function EndChat({
650
702
 
651
703
  /***/ }),
652
704
 
705
+ /***/ "./src/client/components/screens/feedback.jsx":
706
+ /*!****************************************************!*\
707
+ !*** ./src/client/components/screens/feedback.jsx ***!
708
+ \****************************************************/
709
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
710
+
711
+ __webpack_require__.r(__webpack_exports__);
712
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
713
+ /* harmony export */ Feedback: () => (/* binding */ Feedback)
714
+ /* harmony export */ });
715
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
716
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
717
+ /* harmony import */ var _panel_panel_header_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../panel/panel-header.jsx */ "./src/client/components/panel/panel-header.jsx");
718
+
719
+
720
+ function Feedback({
721
+ onCancel
722
+ }) {
723
+ const feedbackCancel = async e => {
724
+ onCancel(e);
725
+ };
726
+ 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", {
727
+ className: "wc-body"
728
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h3", {
729
+ id: "wc-subtitle",
730
+ className: "govuk-heading-s"
731
+ }, "Give Feedback on Floodline webchat"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, "Please note we\u2019re unable to respond to feedback."), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
732
+ className: "govuk-link",
733
+ href: "#",
734
+ target: "_blank",
735
+ rel: "noreferrer"
736
+ }, "Feedback Link"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
737
+ className: "govuk-button-group"
738
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
739
+ id: "feedback-cancel",
740
+ href: "#",
741
+ "data-module": "govuk-button",
742
+ role: "button",
743
+ onClick: feedbackCancel
744
+ }, "Close"))));
745
+ }
746
+
747
+ /***/ }),
748
+
653
749
  /***/ "./src/client/components/screens/pre-chat.jsx":
654
750
  /*!****************************************************!*\
655
751
  !*** ./src/client/components/screens/pre-chat.jsx ***!
@@ -760,8 +856,16 @@ function RequestChat({
760
856
  } = (0,_store_useChatSdk_js__WEBPACK_IMPORTED_MODULE_5__.useChatSdk)(sdk);
761
857
  const [errors, setErrors] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});
762
858
  const [questionLength, setQuestionLength] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0);
859
+ const [isButtonDisabled, setButtonDisabled] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
763
860
  const nameRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();
764
861
  const questionRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();
862
+ const isQuestionLengthValid = QUESTION_MAX_LENGTH >= questionLength;
863
+ const questionLengthRemaining = QUESTION_MAX_LENGTH - questionLength;
864
+ const questionLengthExceeded = questionLength - QUESTION_MAX_LENGTH;
865
+ let questionHint = `You have ${questionLengthRemaining} characters remaining`;
866
+ if (!isQuestionLengthValid) {
867
+ questionHint = `You have ${questionLengthExceeded} characters too many`;
868
+ }
765
869
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
766
870
  if (Object.keys(errors).length) {
767
871
  document.querySelector('.govuk-error-summary')?.focus();
@@ -770,6 +874,7 @@ function RequestChat({
770
874
  const onQuestionChange = e => {
771
875
  setQuestionLength(e.target.value.length);
772
876
  };
877
+ const buttonLabel = isButtonDisabled ? 'Requesting...' : 'Request Chat';
773
878
  const onRequestChat = async e => {
774
879
  e.preventDefault();
775
880
  const errs = {};
@@ -784,6 +889,7 @@ function RequestChat({
784
889
  }
785
890
  if (Object.keys(errs).length === 0) {
786
891
  try {
892
+ setButtonDisabled(true);
787
893
  const threadId = uuid__WEBPACK_IMPORTED_MODULE_1__.v4();
788
894
  const customerId = await fetchCustomerId();
789
895
  const thread = await fetchThread(threadId);
@@ -792,19 +898,13 @@ function RequestChat({
792
898
  setCustomerId(customerId);
793
899
  setThreadId(threadId);
794
900
  setThread(thread);
901
+ thread.setCustomField('threadid', threadId);
795
902
  } catch (err) {
796
903
  console.log('[Request Chat Error]', err);
797
904
  }
798
905
  }
799
906
  setErrors(errs);
800
907
  };
801
- const isQuestionLengthValid = QUESTION_MAX_LENGTH >= questionLength;
802
- const questionLengthRemaining = QUESTION_MAX_LENGTH - questionLength;
803
- const questionLengthExceeded = questionLength - QUESTION_MAX_LENGTH;
804
- let questionHint = `You have ${questionLengthRemaining} characters remaining`;
805
- if (!isQuestionLengthValid) {
806
- questionHint = `You have ${questionLengthExceeded} characters too many`;
807
- }
808
908
  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_3__.PanelHeader, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
809
909
  className: "wc-body"
810
910
  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
@@ -872,10 +972,11 @@ function RequestChat({
872
972
  rel: "noreferrer",
873
973
  className: "govuk-link"
874
974
  }, "privacy notice"), "."), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
875
- className: "govuk-button govuk-!-margin-bottom-3 govuk-!-font-size-16",
975
+ className: "govuk-button govuk-!-margin-top-1 govuk-!-font-size-16",
876
976
  "data-module": "govuk-button",
877
- onClick: onRequestChat
878
- }, "Request chat"))));
977
+ onClick: onRequestChat,
978
+ disabled: isButtonDisabled
979
+ }, buttonLabel))));
879
980
  }
880
981
 
881
982
  /***/ }),
@@ -1182,11 +1283,8 @@ __webpack_require__.r(__webpack_exports__);
1182
1283
  /* harmony export */ transformMessage: () => (/* binding */ transformMessage),
1183
1284
  /* harmony export */ transformMessages: () => (/* binding */ transformMessages)
1184
1285
  /* harmony export */ });
1185
- /* harmony import */ var uuid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! uuid */ "uuid");
1186
- /* harmony import */ var uuid__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(uuid__WEBPACK_IMPORTED_MODULE_0__);
1187
- /* harmony import */ var luxon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! luxon */ "luxon");
1188
- /* harmony import */ var luxon__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(luxon__WEBPACK_IMPORTED_MODULE_1__);
1189
-
1286
+ /* harmony import */ var luxon__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! luxon */ "luxon");
1287
+ /* harmony import */ var luxon__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(luxon__WEBPACK_IMPORTED_MODULE_0__);
1190
1288
 
1191
1289
  const transformMessage = message => {
1192
1290
  return {
@@ -1200,9 +1298,9 @@ const transformMessage = message => {
1200
1298
  };
1201
1299
  const transformMessages = messages => messages.map(message => transformMessage(message));
1202
1300
  const formatTranscript = messages => {
1203
- const now = luxon__WEBPACK_IMPORTED_MODULE_1__.DateTime.local();
1301
+ const now = luxon__WEBPACK_IMPORTED_MODULE_0__.DateTime.local();
1204
1302
  now.setZone('Europe/London');
1205
- let string = `Floodline webchat transcript, ${now.toFormat('HH:mm:ss a, dd LLLL yyyy')}, (ID: ${uuid__WEBPACK_IMPORTED_MODULE_0__.v4().split('-')[0]})\n\n`;
1303
+ let string = `Floodline webchat transcript, ${now.toFormat('HH:mm:ss a, dd LLLL yyyy')}\n\n`;
1206
1304
  for (const message of messages) {
1207
1305
  const {
1208
1306
  text,
@@ -1212,7 +1310,7 @@ const formatTranscript = messages => {
1212
1310
  createdAt
1213
1311
  } = message;
1214
1312
  const author = direction === 'inbound' ? user : `${assignee} (Floodline adviser)`;
1215
- const date = luxon__WEBPACK_IMPORTED_MODULE_1__.DateTime.fromJSDate(new Date(createdAt)).setZone('Europe/London').toFormat('HH:mm:ss a, dd LLLL yyyy');
1313
+ const date = luxon__WEBPACK_IMPORTED_MODULE_0__.DateTime.fromJSDate(new Date(createdAt)).setZone('Europe/London').toFormat('HH:mm:ss a, dd LLLL yyyy');
1216
1314
  string += `[${date}] ${author}: \n${text}\n\n`;
1217
1315
  }
1218
1316
  string = string.replace(/<a\b[^>]*>/i, '').replace(/<\/a>/i, '');
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","mappings":"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","sources":["webpack://@defra/flood-webchat/./src/client/components/availability/availability.jsx","webpack://@defra/flood-webchat/./src/client/components/chat/chat.jsx","webpack://@defra/flood-webchat/./src/client/components/errorSummary/error-summary.jsx","webpack://@defra/flood-webchat/./src/client/components/message/message.jsx","webpack://@defra/flood-webchat/./src/client/components/panel/panel-footer.jsx","webpack://@defra/flood-webchat/./src/client/components/panel/panel-header.jsx","webpack://@defra/flood-webchat/./src/client/components/panel/panel.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/end-chat.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/pre-chat.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/request-chat.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/settings.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/unavailable.jsx","webpack://@defra/flood-webchat/./src/client/hooks/useFocusedElements.js","webpack://@defra/flood-webchat/./src/client/hooks/useTextareaAutosize.js","webpack://@defra/flood-webchat/./src/client/lib/check-availability.js","webpack://@defra/flood-webchat/./src/client/lib/classnames.js","webpack://@defra/flood-webchat/./src/client/lib/message-notification.js","webpack://@defra/flood-webchat/./src/client/lib/transform-messages.js","webpack://@defra/flood-webchat/./src/client/store/AppProvider.jsx","webpack://@defra/flood-webchat/./src/client/store/actions-map.js","webpack://@defra/flood-webchat/./src/client/store/constants.js","webpack://@defra/flood-webchat/./src/client/store/reducer.js","webpack://@defra/flood-webchat/./src/client/store/useApp.js","webpack://@defra/flood-webchat/./src/client/store/useChatSdk.js","webpack://@defra/flood-webchat/external commonjs \"@nice-devone/nice-cxone-chat-web-sdk\"","webpack://@defra/flood-webchat/external commonjs \"luxon\"","webpack://@defra/flood-webchat/external commonjs \"react\"","webpack://@defra/flood-webchat/external commonjs \"react-dom\"","webpack://@defra/flood-webchat/external commonjs \"react-dom/client\"","webpack://@defra/flood-webchat/external commonjs \"uuid\"","webpack://@defra/flood-webchat/webpack/bootstrap","webpack://@defra/flood-webchat/webpack/runtime/compat get default export","webpack://@defra/flood-webchat/webpack/runtime/define property getters","webpack://@defra/flood-webchat/webpack/runtime/hasOwnProperty shorthand","webpack://@defra/flood-webchat/webpack/runtime/make namespace object","webpack://@defra/flood-webchat/./src/client/index.jsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react'\n\nimport { classnames } from '../../lib/classnames'\nimport { Panel } from '../panel/panel.jsx'\nimport { useApp } from '../../store/useApp'\n\nexport function Availability () {\n const { availability, messages, isChatOpen, setChatVisibility, unseenCount } = useApp()\n\n const [isFixed, setIsFixed] = useState(false)\n const buttonRef = useRef()\n\n const onClick = () => {\n setChatVisibility(!isChatOpen)\n }\n\n const onKeyDown = event => {\n if (event.key === ' ') {\n event.preventDefault()\n }\n }\n\n const onKeyUp = event => {\n if (event.key === ' ') {\n setChatVisibility(!isChatOpen)\n }\n }\n\n const intersectionCallback = entries => {\n const [entry] = entries\n const isBelowFold = !entry.isIntersecting && entry.boundingClientRect.top > 0\n setIsFixed(!isChatOpen && isBelowFold)\n }\n\n useEffect(() => {\n const observer = new window.IntersectionObserver(intersectionCallback, {\n rootMargin: '35px'\n })\n\n const parentElement = buttonRef.current?.parentElement\n\n if (parentElement) {\n observer.observe(parentElement)\n }\n\n return () => {\n if (parentElement) {\n observer.unobserve(parentElement)\n }\n }\n }, [buttonRef, isChatOpen])\n\n useEffect(() => {\n document.documentElement.classList.toggle('wc-scroll-padding', isFixed)\n document.body.classList.toggle('wc-scroll-padding', isFixed)\n }, [isFixed])\n\n let TextComponent = (<>Show Chat</>)\n\n if (!messages.length) {\n TextComponent = (<>Start Chat</>)\n }\n\n switch (availability) {\n case 'AVAILABLE':\n return (\n <>\n <div\n className={classnames('wc-availability', isFixed && 'wc-availability--fixed', isChatOpen && 'wc-open')}\n ref={buttonRef}\n >\n <div className='wc-availability__inner'>\n <a\n className='wc-availability__link'\n href='#webchat'\n draggable='false'\n onClick={onClick}\n onKeyUp={onKeyUp}\n onKeyDown={onKeyDown}\n >\n {TextComponent}\n {unseenCount > 0 && !isChatOpen ? <span className='wc-open-btn__unseen'>{unseenCount}</span> : null}\n </a>\n </div>\n </div>\n {isChatOpen && <Panel />}\n </>\n )\n case 'EXISTING':\n case 'UNAVAILABLE':\n return (\n <p className='govuk-body'>When it is available, a 'start chat' link will appear.</p>\n )\n default:\n return (\n <p className='govuk-body'>Checking availability</p>\n )\n }\n}\n","import React, { useEffect, useRef, useState } from 'react'\n\nimport { PanelHeader } from '../panel/panel-header.jsx'\nimport { PanelFooter } from '../panel/panel-footer.jsx'\nimport { Message } from '../message/message.jsx'\n\nimport { useApp } from '../../store/useApp.js'\nimport { useTextareaAutosize } from '../../hooks/useTextareaAutosize.js'\nimport { formatTranscript } from '../../lib/transform-messages.js'\n\nexport function Chat ({ onEndChatScreen, onSettingsScreen }) {\n const { availability, thread, messages, agent, agentStatus, isAgentTyping, settings } = useApp()\n\n const [userMessage, setUserMessage] = useState('')\n\n const messageRef = useRef()\n\n useTextareaAutosize(messageRef.current, userMessage)\n\n useEffect(() => {\n if (settings.scroll && messages.length !== 0) {\n const chatBody = document.querySelector('.wc-body')\n chatBody.scrollTop = chatBody.scrollHeight\n }\n }, [messages, isAgentTyping])\n\n useEffect(() => {\n const label = document.querySelector('.wc-form__label')\n\n if (userMessage.length === 0) {\n label.classList.remove('govuk-visually-hidden')\n } else {\n label.classList.add('govuk-visually-hidden')\n }\n }, [userMessage])\n\n const onChange = e => {\n setUserMessage(e.target?.value)\n }\n\n const agentName = agent?.nickname || agent?.firstName\n\n let connectionHeadlineText = 'Connecting to Floodline'\n\n if (agentStatus === 'closed') {\n connectionHeadlineText = agentName ? `${agentName} ended the session` : 'Session ended by advisor'\n } else if (agentStatus) {\n if (agentName) {\n connectionHeadlineText = `You are speaking with ${agentName}`\n } else {\n connectionHeadlineText = 'No advisers currently available'\n }\n }\n\n if (availability === 'UNAVAILABLE') {\n connectionHeadlineText = 'Webchat is not currently available'\n }\n\n const sendMessage = e => {\n e.preventDefault()\n\n if (messageRef.current.value.length === 0) {\n return\n }\n\n try {\n thread.sendTextMessage(messageRef.current.value.trim())\n } catch (err) {\n console.log('[Chat Error] sendMessage', err)\n }\n\n setUserMessage('')\n }\n\n const saveChat = () => {\n const transcript = formatTranscript(messages)\n\n const saveChatLink = document.querySelector('#transcript-download')\n\n saveChatLink.setAttribute('href', `data:text/plain;charset=utf-8,${transcript}`)\n saveChatLink.click()\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-status'>\n <p className='wc-status__availability govuk-body-s'>{connectionHeadlineText}</p>\n <a className='wc-status__link govuk-!-font-size-16' href='#' data-module='govuk-button' onClick={onEndChatScreen}>End chat</a>\n </div>\n\n <div className='wc-body'>\n <div className='wc-chat__body'>\n <ul className='wc-chat__messages'>\n {messages.length\n ? messages.map((msg, index) => <Message key={msg.id} message={msg} previousMessage={messages[index - 1]} />)\n : null}\n {isAgentTyping\n ? (\n <li className='wc-chat__message govuk-body outbound'>\n <div className='wc-chat__from govuk-!-font-size-14'>{agentName} is typing</div>\n <div className='wc-chat__text outbound'>\n <svg width='28' height='16' x='0px' y='0px' viewBox='0 0 28 16'>\n <circle stroke='none' cx='3' cy='8' r='3' fill='currentColor' />\n <circle stroke='none' cx='14' cy='8' r='3' fill='currentColor' />\n <circle stroke='none' cx='25' cy='8' r='3' fill='currentColor' />\n </svg>\n </div>\n </li>\n )\n : null}\n </ul>\n </div>\n </div>\n\n <PanelFooter>\n <div className='wc-footer__input'>\n <form className='wc-form' noValidate>\n <label className='govuk-label wc-form__label govuk-!-font-size-16' htmlFor='wc-form-textarea'>\n Your message<span className='govuk-visually-hidden'> (enter key submits)</span>\n </label>\n\n <textarea\n ref={messageRef}\n rows='1'\n aria-required='true'\n className='wc-form__textarea govuk-textarea govuk-!-font-size-16'\n id='wc-form-textarea'\n name='message'\n onChange={onChange}\n value={userMessage}\n />\n\n <input\n type='submit'\n className='wc-form__button govuk-button govuk-!-font-size-16'\n value='Send'\n data-prevent-double-click='true'\n onClick={sendMessage}\n />\n </form>\n </div>\n\n <div className='wc-footer__settings'>\n <a\n href='#'\n id='wc-settings'\n className='wc-footer__settings-link'\n data-module='govuk-button'\n onClick={onSettingsScreen}\n >\n Settings\n </a>\n <a\n href='#'\n id='transcript-download'\n className='wc-footer__settings-link'\n data-module='govuk-button'\n download='floodline-webchat-transcript.txt'\n onClick={saveChat}\n >\n Save chat\n </a>\n </div>\n </PanelFooter>\n </>\n )\n}\n","import React from 'react'\n\nexport const ErrorSummary = ({ errors }) => {\n const errs = Object.keys(errors)\n\n const goToInput = e => {\n e.preventDefault()\n const key = e.target.getAttribute('data-key')\n document.querySelector(`#wc-${key}`).focus()\n }\n\n if (errs.length === 0) {\n return null\n }\n\n return (\n <div className='govuk-error-summary govuk-!-static-margin-bottom-7' data-module='govuk-error-summary' tabIndex='-1'>\n <div role='alert'>\n <h2 id='wc-error' className='govuk-error-summary__title'>\n There is a problem\n </h2>\n <div className='govuk-error-summary__body'>\n <ul className='govuk-list govuk-error-summary__list'>\n {errs.map(key => (\n <li key={key}>\n <a href='#' data-key={key} onClick={goToInput}>{errors[key]}</a>\n </li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { classnames } from '../../lib/classnames'\n\nexport function Message ({ message, previousMessage }) {\n const outbound = message.direction === 'outbound'\n\n const messageOwnerSameAsPrevious = message?.direction === previousMessage?.direction\n\n return (\n <li className={classnames('wc-chat__message govuk-body', outbound ? 'outbound' : 'inbound')}>\n <div className='wc-chat__from govuk-!-font-size-14'>\n {messageOwnerSameAsPrevious ? null : <span>{outbound ? message.assignee : 'You'}</span>}\n <span className='govuk-visually-hidden'>:</span>\n </div>\n <p className={classnames('wc-chat__text', 'govuk-body-s', outbound ? 'outbound' : 'inbound')}>\n {message.text}\n </p>\n </li>\n )\n}\n","import React from 'react'\n\nexport function PanelFooter ({ children }) {\n return (\n <div className='wc-footer'>\n {children}\n </div>\n )\n}\n","import React from 'react'\nimport { useApp } from '../../store/useApp.js'\n\nexport function PanelHeader () {\n const { thread, setChatVisibility, setUnseenCount } = useApp()\n\n const onClose = e => {\n e.preventDefault()\n setChatVisibility(false)\n thread.lastMessageSeen()\n setUnseenCount(0)\n }\n\n let ButtonComponent = (\n <button className='wc-header__close' aria-label='Close the webchat' onClick={onClose}>\n <svg aria-hidden='true' focusable='false' width='20' height='20' viewBox='0 0 20 20'>\n <path d='M10,8.6L15.6,3L17,4.4L11.4,10L17,15.6L15.6,17L10,11.4L4.4,17L3,15.6L8.6,10L3,4.4L4.4,3L10,8.6Z' fill='currentColor' />\n </svg>\n </button>\n )\n\n if (thread) {\n ButtonComponent = (\n <button className='wc-header__hide' aria-label='Minimise the webchat' onClick={onClose}>\n <svg aria-hidden='true' focusable='false' width='20' height='20' viewBox='0 0 20 20'>\n <path d='M10 14.4l-7-7L4.4 6l5.6 5.6L15.6 6 17 7.4l-7 7z' fill='currentColor' />\n </svg>\n </button>\n )\n }\n\n return (\n <div className='wc-header'>\n <h2 id='wc-header-title' className='wc-header__title govuk-heading-s'>\n Floodline Webchat\n </h2>\n\n {ButtonComponent}\n </div>\n )\n}\n","import React, { useEffect, useState, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { PreChat } from '../screens/pre-chat.jsx'\nimport { RequestChat } from '../screens/request-chat.jsx'\nimport { Chat } from '../chat/chat.jsx'\nimport { Unavailable } from '../screens/unavailable.jsx'\nimport { EndChat } from '../screens/end-chat.jsx'\nimport { Settings } from '../screens/settings.jsx'\n\nimport { useApp } from '../../store/useApp.js'\nimport { useChatSdk } from '../../store/useChatSdk.js'\nimport { useFocusedElements } from '../../hooks/useFocusedElements.js'\n\nexport function Panel () {\n const { sdk, availability, thread, threadId, setThread, setThreadId, setChatVisibility, setMessages, setUnseenCount } = useApp()\n const { fetchThread, fetchMessages } = useChatSdk(sdk)\n\n const [screen, setScreen] = useState(threadId ? 2 : 0)\n\n useFocusedElements(screen)\n\n /**\n * Initializes the eventListener for pressing the escape key\n */\n useEffect(() => {\n const escapeKeyEvent = document.addEventListener('keydown', onEscapeKey)\n\n return () => {\n document.removeEventListener('keydown', escapeKeyEvent)\n }\n }, [])\n\n /**\n * Recovers the thread if there is a threadId but no thread loaded in to state\n */\n useEffect(() => {\n const recover = async () => {\n try {\n const fetchedThread = await fetchThread(threadId)\n setThread(fetchedThread)\n\n const fetchedMessages = await fetchMessages(fetchedThread, threadId)\n setMessages(fetchedMessages)\n } catch (err) {\n console.log('[Chat Error] fetchThread', err)\n\n setThreadId()\n setThread()\n setScreen(0)\n }\n }\n\n if (threadId) {\n if (thread) {\n thread.lastMessageSeen()\n setUnseenCount(0)\n setScreen(2)\n } else {\n recover()\n }\n }\n }, [thread, threadId])\n\n const onEscapeKey = useCallback(e => {\n if (e.key === 'Escape' || e.key === 'Esc') {\n setChatVisibility(false)\n }\n }, [])\n\n const handleScreenChange = newScreen => e => {\n e.preventDefault()\n setScreen(newScreen)\n }\n\n const goToPreChatScreen = handleScreenChange(0)\n const goToRequestChatScreen = handleScreenChange(1)\n const goToChatScreen = handleScreenChange(2)\n const goToEndChatScreen = handleScreenChange(3)\n const goToSettingsScreen = handleScreenChange(5)\n\n let ScreenComponent\n\n switch (screen) {\n case 0:\n ScreenComponent = <PreChat onContinue={goToRequestChatScreen} />\n break\n case 1:\n ScreenComponent = <RequestChat onPreChatScreen={goToPreChatScreen} />\n break\n case 2:\n ScreenComponent = <Chat onSettingsScreen={goToSettingsScreen} onEndChatScreen={goToEndChatScreen} />\n break\n case 3:\n ScreenComponent = <EndChat onChatScreen={goToChatScreen} />\n break\n case 5:\n ScreenComponent = <Settings onCancel={goToChatScreen} />\n break\n default:\n ScreenComponent = <PreChat onContinue={goToRequestChatScreen} />\n }\n\n if (availability === 'UNAVAILABLE') {\n ScreenComponent = <Unavailable />\n }\n\n const Component = (\n <div id='wc-panel' role='dialog' className='wc-panel' tabIndex='-1' aria-modal='true' aria-labelledby='wc-header-title'>\n {ScreenComponent}\n </div>\n )\n\n return (\n <>\n {createPortal(Component, document.body)}\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function EndChat ({ onChatScreen }) {\n return (\n <>\n <PanelHeader />\n <div className='wc-body'>\n <h3 className='govuk-heading-s' aria-live='polite'>Are you sure you want to end the chat?</h3>\n <div className='govuk-button-group'>\n <a href='#' className='govuk-button govuk-!-font-size-16' data-module='govuk-button'>Yes, end chat</a>\n <a href='#' className='govuk-link govuk-!-font-size-16' onClick={onChatScreen}>No, resume chat</a>\n </div>\n </div>\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function PreChat ({ onContinue }) {\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <h3 className='govuk-heading-s' aria-live='polite'>What you can use webchat for</h3>\n <p className='govuk-body-s'>Webchat lets you talk directly to a Floodline adviser.</p>\n\n <p className='govuk-body-s'>You can use webchat to get:</p>\n <ul className='govuk-list govuk-list--bullet govuk-body-s'>\n <li>current flood warnings and alerts in your area</li>\n <li>information on the flood warning service</li>\n <li>advice on what to do before, during and after a flood</li>\n </ul>\n\n <p className='govuk-body-s'>\n There are other ways to&nbsp;\n <a className='govuk-link' href='https://www.gov.uk/sign-up-for-flood-warnings' target='_blank' rel='noreferrer'>\n sign up for flood warnings\n </a>\n &nbsp;and&nbsp;\n <a className='govuk-link' href='https://www.fws.environment-agency.gov.uk/app/olr/login' target='_blank' rel='noreferrer'>\n manage your flood warnings account\n </a>.\n </p>\n <p className='govuk-body-s'>\n Do not use webchat to&nbsp;\n <a\n className='govuk-link'\n href='https://www.gov.uk/report-flood-cause'\n target='_blank'\n rel='noreferrer'\n >\n report a flood\n </a>.\n </p>\n\n <button className='govuk-button govuk-!-font-size-16' data-module='govuk-button' onClick={onContinue}>Continue</button>\n\n <h3 className='govuk-heading-s'>Other flood information</h3>\n\n <p className='govuk-body-s'>Call Floodline for all other flood and flood warning information.</p>\n <p className='govuk-body-s'>\n <strong>Floodline helpline</strong>\n <br />\n Telephone: 0345 988 1188\n <br />\n Textphone: 0345 602 6340\n <br />\n Open 24 hours a day, 7 days a week\n <br />\n <a className='govuk-link' href='https://gov.uk/call-charges' target='_blank' rel='noreferrer'>Find out more about call charges</a>\n </p>\n </div>\n </>\n )\n}\n","import React, { useRef, useState, useEffect } from 'react'\nimport * as uuid from 'uuid'\n\nimport { classnames } from '../../lib/classnames.js'\nimport { PanelHeader } from '../panel/panel-header.jsx'\nimport { useApp } from '../../store/useApp.js'\nimport { useChatSdk } from '../../store/useChatSdk.js'\nimport { ErrorSummary } from '../errorSummary/error-summary.jsx'\n\nconst QUESTION_MAX_LENGTH = 500\n\nexport function RequestChat ({ onPreChatScreen }) {\n const { sdk, setCustomerId, setThreadId, setThread } = useApp()\n const { fetchCustomerId, fetchThread } = useChatSdk(sdk)\n\n const [errors, setErrors] = useState({})\n const [questionLength, setQuestionLength] = useState(0)\n\n const nameRef = useRef()\n const questionRef = useRef()\n\n useEffect(() => {\n if (Object.keys(errors).length) {\n document.querySelector('.govuk-error-summary')?.focus()\n }\n }, [errors])\n\n const onQuestionChange = e => {\n setQuestionLength(e.target.value.length)\n }\n\n const onRequestChat = async e => {\n e.preventDefault()\n\n const errs = {}\n\n if (nameRef.current.value.length === 0) {\n errs.name = 'Enter your name'\n }\n\n if (questionRef.current.value.length === 0) {\n errs.question = 'Enter your question'\n }\n\n if (questionRef.current.value.length > QUESTION_MAX_LENGTH) {\n errs.question = 'Your question must be 500 characters or less'\n }\n\n if (Object.keys(errs).length === 0) {\n try {\n const threadId = uuid.v4()\n const customerId = await fetchCustomerId()\n const thread = await fetchThread(threadId)\n\n sdk.getCustomer().setName(nameRef.current.value)\n\n await thread.startChat(questionRef.current.value || 'Begin conversation')\n\n setCustomerId(customerId)\n setThreadId(threadId)\n setThread(thread)\n } catch (err) {\n console.log('[Request Chat Error]', err)\n }\n }\n\n setErrors(errs)\n }\n\n const isQuestionLengthValid = QUESTION_MAX_LENGTH >= questionLength\n const questionLengthRemaining = QUESTION_MAX_LENGTH - questionLength\n const questionLengthExceeded = questionLength - QUESTION_MAX_LENGTH\n\n let questionHint = `You have ${questionLengthRemaining} characters remaining`\n\n if (!isQuestionLengthValid) {\n questionHint = `You have ${questionLengthExceeded} characters too many`\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <a href='#' className='wc-back-link govuk-back-link' onClick={onPreChatScreen}>\n What you can use webchat for\n </a>\n\n <ErrorSummary errors={errors} />\n\n <h3 className='govuk-heading-s' aria-live='polite'>\n Your name and question\n </h3>\n\n <form>\n <div className={classnames('govuk-form-group', errors.name && 'govuk-form-group--error')}>\n <label className='govuk-label' htmlFor='wc-name'>\n Your name\n </label>\n {errors.name && (\n <p className='govuk-error-message'>\n <span className='govuk-visually-hidden'>Error:</span> {errors.name}\n </p>\n )}\n <input\n ref={nameRef}\n className={classnames('govuk-input', errors.name && 'govuk-input--error')}\n id='wc-name'\n name='name'\n type='text'\n data-testid='request-chat-user-name'\n />\n </div>\n\n <div className='govuk-character-count' data-module='govuk-character-count' data-maxlength='500'>\n <div className={classnames('govuk-form-group', errors.question && 'govuk-form-group--error')}>\n <label className='govuk-label' htmlFor='wc-question'>\n Your question\n </label>\n {errors.question && (\n <p className='govuk-error-message'>\n <span className='govuk-visually-hidden'>Error:</span>\n {errors.question}\n </p>\n )}\n <textarea\n ref={questionRef}\n id='wc-question'\n name='question'\n rows='5'\n aria-describedby='wc-question-info'\n onChange={onQuestionChange}\n className={classnames('govuk-textarea', 'govuk-js-character-count', !isQuestionLengthValid || errors.question ? 'govuk-textarea--error' : '')}\n data-testid='request-chat-user-question'\n />\n <div id='wc-question-info' className='govuk-hint govuk-character-count__message' style={{ color: `${!isQuestionLengthValid ? '#d4351c' : ''}` }} aria-hidden='true'>\n {questionHint}\n </div>\n <div className='govuk-character-count__sr-status govuk-visually-hidden' aria-live='polite'>\n {questionHint}\n </div>\n </div>\n </div>\n\n <div className='govuk-inset-text govuk-!-font-size-16'>\n By selecting 'Request chat' you agree to the terms of our&nbsp;\n <a href='https://check-for-flooding.service.gov.uk/privacy-notice' target='_blank' rel='noreferrer' className='govuk-link'>privacy notice</a>.\n </div>\n\n <button\n className='govuk-button govuk-!-margin-bottom-3 govuk-!-font-size-16'\n data-module='govuk-button'\n onClick={onRequestChat}\n >\n Request chat\n </button>\n </form>\n </div>\n </>\n )\n}\n","import React, { useState } from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nimport { useApp } from '../../store/useApp.js'\n\nexport function Settings ({ onCancel }) {\n const { settings, setSettings } = useApp()\n\n const [optionAudio, setOptionAudio] = useState(settings.audio)\n const [optionScroll, setOptionScroll] = useState(settings.scroll)\n\n const onSave = e => {\n e.preventDefault()\n\n setSettings({ audio: optionAudio, scroll: optionScroll })\n onCancel(e)\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <fieldset className='govuk-fieldset govuk-!-margin-bottom-4'>\n <legend className='govuk-fieldset__legend govuk-fieldset__legend'>\n <h3 id='wc-subtitle' className='govuk-heading-s'>Change settings</h3>\n </legend>\n <div className='govuk-checkboxes govuk-checkboxes--small' data-module='govuk-checkboxes'>\n <div className='govuk-checkboxes__item'>\n <input\n id='audio'\n name='audio'\n type='checkbox'\n value='audio'\n className='govuk-checkboxes__input'\n defaultChecked={optionAudio}\n onChange={() => setOptionAudio(!optionAudio)}\n />\n <label className='govuk-label govuk-checkboxes__label govuk-!-font-size-16' htmlFor='audio'>\n Play a sound when receiving a new message\n </label>\n </div>\n <div className='govuk-checkboxes__item'>\n <input\n id='scroll'\n name='scroll'\n type='checkbox'\n value='scroll'\n className='govuk-checkboxes__input'\n defaultChecked={optionScroll}\n onChange={() => setOptionScroll(!optionScroll)}\n />\n <label className='govuk-label govuk-checkboxes__label govuk-!-font-size-16' htmlFor='scroll'>\n Scroll automatically to a new message\n </label>\n </div>\n </div>\n </fieldset>\n\n <div className='govuk-button-group'>\n <a id='settings-save' href='#' className='govuk-button govuk-!-font-size-16' data-module='govuk-button' onClick={onSave}>Save</a>\n <a id='settings-cancel' href='#' className='govuk-link govuk-!-font-size-16' data-module='govuk-button' onClick={onCancel}>Cancel</a>\n </div>\n </div>\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function Unavailable () {\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <h3 id='wc-subtitle' className='govuk-heading-m'>Webchat is currently not available</h3>\n <p className='govuk-body-s'>Try again later, or call Floodline:</p>\n <p className='govuk-body-s'>\n <strong>Floodline helpline</strong>\n <br />Telephone: 0345 988 1188\n <br />Textphone: 0345 602 6340\n <br />Open 24 hours a day, 7 days a week\n <br /><a className='govuk-link' href='https://gov.uk/call-charges'>Find out more about call charges</a>\n </p>\n <p className='govuk-body-s'>We're running webchat as a trial, it will not always be available.</p>\n </div>\n </>\n )\n}\n","import { useState, useEffect, useCallback } from 'react'\n\nconst setAriaHidden = bool => {\n for (const node of document.body.children) {\n if (node.id !== 'wc-panel') {\n (bool) ? node.setAttribute('aria-hidden', 'true') : node.removeAttribute('aria-hidden')\n }\n }\n}\n\nexport const getFocusableElements = () => {\n const selectors = [\n '#wc-panel a:not([disabled])',\n '#wc-panel button:not([disabled])',\n '#wc-panel select:not([disabled])',\n '#wc-panel input:not([disabled])',\n '#wc-panel textarea:not([disabled])',\n '#wc-panel *[tabindex=\"0\"]:not([disabled])'\n ]\n\n const elements = document.body.querySelectorAll(selectors.join(','))\n return Array.from(elements).filter(e => !e.closest('[hidden]') && !e.closest('[aria-hidden=\"true\"]'))\n}\n\nconst useFocusedElements = screen => {\n const [panelElements, setPanelElements] = useState([])\n\n const onKeyDown = useCallback(e => {\n const webchatPanelElement = document.querySelector('#wc-panel')\n\n if (e.key === 'Tab') {\n if (webchatPanelElement && !document.activeElement.closest('#wc-panel')) {\n webchatPanelElement.focus()\n }\n\n if (e.shiftKey) {\n if (document.activeElement === panelElements[0]) {\n panelElements[panelElements.length - 1].focus()\n e.preventDefault()\n } else if (document.activeElement === document.querySelector('#wc-panel')) {\n panelElements[panelElements.length - 1]?.focus()\n e.preventDefault()\n }\n } else if (document.activeElement === panelElements[panelElements.length - 1]) {\n panelElements[0].focus()\n e.preventDefault()\n }\n }\n }, [panelElements])\n\n useEffect(() => {\n setPanelElements(getFocusableElements())\n }, [screen])\n\n useEffect(() => {\n setAriaHidden(true)\n\n const panelElement = document.querySelector('#wc-panel')\n panelElement.focus()\n\n document.addEventListener('keydown', onKeyDown)\n\n return () => {\n setAriaHidden()\n document.body.querySelector('.wc-availability__link')?.focus()\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [panelElements])\n}\n\nexport { useFocusedElements }\n","import { useEffect } from 'react'\n\nexport const useTextareaAutosize = (textAreaRef, value) => {\n useEffect(() => {\n if (textAreaRef) {\n textAreaRef.style.height = '0px'\n\n const scrollHeight = textAreaRef.scrollHeight\n\n textAreaRef.style.height = `${scrollHeight}px`\n }\n }, [textAreaRef, value])\n}\n","export async function checkAvailability (endpoint) {\n const response = await fetch(endpoint)\n const data = await response.json()\n\n return {\n availability: data.availability || 'UNAVAILABLE'\n }\n}\n","export const classnames = (...classes) => classes.filter(classname => classname && typeof classname === 'string').join(' ')\n","export const messageNotification = audioUrl => {\n let buffer\n\n const context = new (window.AudioContext || window.webkitAudioContext)()\n\n if (context.state === 'suspended') {\n const events = ['touchstart', 'touchend', 'mousedown', 'wheel', 'keydown', 'click']\n\n const unlock = _e => {\n events.forEach(event => {\n document.body.removeEventListener(event, unlock)\n })\n\n context.resume()\n }\n\n events.forEach(event => {\n document.body.addEventListener(event, unlock, false)\n })\n }\n\n fetch(audioUrl)\n .then(response => response.arrayBuffer())\n .then(data => context.decodeAudioData(data))\n .then(decodedData => {\n buffer = decodedData\n })\n .catch(console.error)\n\n return () => {\n const source = context.createBufferSource()\n source.buffer = buffer\n source.connect(context.destination)\n source.start()\n }\n}\n","import * as uuid from 'uuid'\nimport { DateTime } from 'luxon'\n\nexport const transformMessage = message => {\n return {\n id: message.id,\n text: message.messageContent?.text,\n createdAt: new Date(message.createdAt),\n user: message.authorEndUserIdentity?.fullName?.trim() || null,\n assignee: message.authorUser?.firstName || null,\n direction: message.direction\n }\n}\n\nexport const transformMessages = messages => messages.map(message => transformMessage(message))\n\nexport const formatTranscript = messages => {\n const now = DateTime.local()\n now.setZone('Europe/London')\n\n let string = `Floodline webchat transcript, ${now.toFormat('HH:mm:ss a, dd LLLL yyyy')}, (ID: ${uuid.v4().split('-')[0]})\\n\\n`\n\n for (const message of messages) {\n const { text, direction, user, assignee, createdAt } = message\n\n const author = direction === 'inbound' ? user : `${assignee} (Floodline adviser)`\n const date = DateTime.fromJSDate(new Date(createdAt)).setZone('Europe/London').toFormat('HH:mm:ss a, dd LLLL yyyy')\n\n string += `[${date}] ${author}: \\n${text}\\n\\n`\n }\n\n string = string.replace(/<a\\b[^>]*>/i, '').replace(/<\\/a>/i, '')\n\n return encodeURIComponent(string)\n}\n","import React, { createContext, useEffect, useReducer, useMemo } from 'react'\nimport { ChatEvent } from '@nice-devone/nice-cxone-chat-web-sdk'\n\nimport { messageNotification } from '../lib/message-notification.js'\n\nimport { initialState, reducer } from './reducer.js'\nimport { CUSTOMER_ID_STORAGE_KEY, THREAD_ID_STORAGE_KEY, SETTINGS_STORAGE_KEY } from './constants.js'\n\nexport const AppContext = createContext(initialState)\n\nexport const AppProvider = ({ sdk, availability, options, children }) => {\n const [state, dispatch] = useReducer(reducer, initialState)\n\n const playSound = messageNotification(options.audioUrl)\n\n /**\n * SDK event handlers\n */\n const onLiveChatRecovered = e => {\n dispatch({ type: 'SET_AGENT', payload: e.detail.data.inboxAssignee })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.contact.status })\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: e.detail.data.contact.customerStatistics.unseenMessagesCount })\n }\n\n const onAssignedAgentChanged = e => {\n dispatch({ type: 'SET_AGENT', payload: e.detail.data.inboxAssignee })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n }\n\n const onAgentTypingStarted = () => {\n dispatch({ type: 'SET_AGENT_TYPING', payload: true })\n }\n\n const onAgentTypingEnded = () => {\n dispatch({ type: 'SET_AGENT_TYPING', payload: false })\n }\n\n const onMessageCreated = e => {\n dispatch({ type: 'SET_MESSAGE', payload: e.detail.data.message })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: e.detail.data.case.customerStatistics.unseenMessagesCount })\n\n const isAudioOn = JSON.parse(window.localStorage.getItem(SETTINGS_STORAGE_KEY)).audio\n\n if (isAudioOn && e.detail.data.message.direction === 'outbound') {\n playSound()\n }\n }\n\n const onContactStatusChanged = e => {\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n }\n\n useEffect(() => {\n sdk.onChatEvent(ChatEvent.LIVECHAT_RECOVERED, onLiveChatRecovered)\n sdk.onChatEvent(ChatEvent.MESSAGE_CREATED, onMessageCreated)\n sdk.onChatEvent(ChatEvent.AGENT_TYPING_STARTED, onAgentTypingStarted)\n sdk.onChatEvent(ChatEvent.AGENT_TYPING_ENDED, onAgentTypingEnded)\n sdk.onChatEvent(ChatEvent.ASSIGNED_AGENT_CHANGED, onAssignedAgentChanged)\n sdk.onChatEvent(ChatEvent.CONTACT_STATUS_CHANGED, onContactStatusChanged)\n }, [sdk])\n\n /**\n * Initialize customerId, threadId and whether the webchat should be open\n */\n useEffect(() => {\n dispatch({ type: 'SET_AVAILABILITY', payload: availability })\n\n setCustomerId(window.localStorage.getItem(CUSTOMER_ID_STORAGE_KEY))\n setThreadId(window.localStorage.getItem(THREAD_ID_STORAGE_KEY))\n setSettings(JSON.parse(window.localStorage.getItem(SETTINGS_STORAGE_KEY)) || state.settings)\n\n if (window.location.hash === '#webchat') {\n setChatVisibility(true)\n }\n }, [])\n\n /**\n * State update functions\n */\n const setChatVisibility = payload => {\n if (!payload) {\n window.location.hash = ''\n }\n\n dispatch({ type: 'SET_CHAT_VISIBILITY', payload })\n }\n\n const setCustomerId = customerId => {\n dispatch({ type: 'SET_CUSTOMER_ID', payload: customerId })\n }\n\n const setThreadId = threadId => {\n dispatch({ type: 'SET_THREAD_ID', payload: threadId })\n }\n\n const setThread = thread => {\n dispatch({ type: 'SET_THREAD', payload: thread })\n }\n\n const setMessages = messages => {\n dispatch({ type: 'SET_MESSAGES', payload: messages })\n }\n\n const setSettings = data => {\n dispatch({ type: 'SET_SETTINGS', payload: data })\n }\n\n const setUnseenCount = unseenCount => {\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: unseenCount })\n }\n\n /**\n * Application-wide state and state functions\n */\n const store = useMemo(() => ({\n ...state,\n sdk,\n setSettings,\n setCustomerId,\n setThreadId,\n setThread,\n setMessages,\n setUnseenCount,\n setChatVisibility,\n onLiveChatRecovered,\n onAssignedAgentChanged,\n onAgentTypingStarted,\n onAgentTypingEnded,\n onMessageCreated,\n onContactStatusChanged\n }))\n\n return (\n <AppContext.Provider value={store}>\n {children}\n </AppContext.Provider>\n )\n}\n","import { transformMessages, transformMessage } from '../lib/transform-messages'\nimport { CUSTOMER_ID_STORAGE_KEY, THREAD_ID_STORAGE_KEY, SETTINGS_STORAGE_KEY } from './constants'\n\nconst setSettings = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(SETTINGS_STORAGE_KEY, JSON.stringify(payload))\n } else {\n window.localStorage.removeItem(SETTINGS_STORAGE_KEY)\n }\n\n return {\n ...state,\n settings: payload\n }\n}\n\nconst setCustomerId = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(CUSTOMER_ID_STORAGE_KEY, payload)\n } else {\n window.localStorage.removeItem(CUSTOMER_ID_STORAGE_KEY)\n }\n\n return {\n ...state,\n customerId: payload\n }\n}\n\nconst setThreadId = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(THREAD_ID_STORAGE_KEY, payload)\n } else {\n window.localStorage.removeItem(THREAD_ID_STORAGE_KEY)\n }\n\n return {\n ...state,\n threadId: payload\n }\n}\n\nconst setChatVisibility = (state, payload) => {\n return {\n ...state,\n isChatOpen: payload\n }\n}\n\nconst setAvailability = (state, payload) => {\n return {\n ...state,\n availability: payload\n }\n}\n\nconst setThread = (state, payload) => {\n return {\n ...state,\n thread: payload\n }\n}\n\nconst setMessage = (state, payload) => {\n return {\n ...state,\n messages: [...state.messages, transformMessage(payload)]\n }\n}\n\nconst setMessages = (state, payload) => {\n return {\n ...state,\n messages: transformMessages(payload).reverse()\n }\n}\n\nconst setAgent = (state, payload) => {\n return {\n ...state,\n agent: payload\n }\n}\n\nconst setAgentIsTyping = (state, payload) => {\n return {\n ...state,\n isAgentTyping: payload\n }\n}\n\nconst setAgentStatus = (state, payload) => {\n return {\n ...state,\n agentStatus: payload\n }\n}\n\nconst setUnseenCount = (state, payload) => {\n return {\n ...state,\n unseenCount: payload\n }\n}\n\nexport const actionsMap = {\n SET_CHAT_VISIBILITY: setChatVisibility,\n SET_AVAILABILITY: setAvailability,\n SET_SETTINGS: setSettings,\n SET_CUSTOMER_ID: setCustomerId,\n SET_THREAD_ID: setThreadId,\n SET_THREAD: setThread,\n SET_MESSAGE: setMessage,\n SET_MESSAGES: setMessages,\n SET_AGENT: setAgent,\n SET_AGENT_TYPING: setAgentIsTyping,\n SET_AGENT_STATUS: setAgentStatus,\n SET_UNSEEN_COUNT: setUnseenCount\n}\n","export const SETTINGS_STORAGE_KEY = 'webchat_settings'\nexport const CUSTOMER_ID_STORAGE_KEY = 'webchat_customer_id'\nexport const THREAD_ID_STORAGE_KEY = 'webchat_thread_id'\n","import { actionsMap } from './actions-map'\n\nexport const initialState = {\n availability: null,\n customerId: null,\n threadId: null,\n thread: null,\n messages: [],\n unseenCount: 0,\n agent: null,\n agentStatus: null,\n isAgentTyping: false,\n isChatOpen: false,\n settings: { audio: true, scroll: true }\n}\n\nexport const reducer = (state, action) => {\n const { type, payload } = action\n\n const fn = actionsMap[type]\n\n if (fn) {\n const actionFunction = fn.bind(this, state, payload)\n return actionFunction()\n }\n\n return state\n}\n","import { useContext } from 'react'\n\nimport { AppContext } from './AppProvider.jsx'\n\nexport const useApp = () => useContext(AppContext)\n","export const useChatSdk = sdk => {\n const connect = async () => sdk.authorize()\n\n const fetchCustomerId = async () => {\n const response = await connect()\n return response?.consumerIdentity.idOnExternalPlatform\n }\n\n const fetchThread = async threadId => {\n await connect()\n return sdk.getThread(threadId)\n }\n\n const fetchMessages = async (thread, threadId) => {\n await connect()\n\n const recovered = await thread.recover(threadId)\n\n const allMessages = []\n let fetchedMessages = recovered.messages\n\n while (fetchedMessages.length) {\n fetchedMessages.map(msg => allMessages.push(msg))\n\n try {\n const response = await thread.loadMoreMessages()\n fetchedMessages = response.data.messages\n } catch (err) {\n fetchedMessages = []\n }\n }\n\n return allMessages\n }\n\n return { connect, fetchCustomerId, fetchThread, fetchMessages }\n}\n","module.exports = require(\"@nice-devone/nice-cxone-chat-web-sdk\");","module.exports = require(\"luxon\");","module.exports = require(\"react\");","module.exports = require(\"react-dom\");","module.exports = require(\"react-dom/client\");","module.exports = require(\"uuid\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { ChatSdk } from '@nice-devone/nice-cxone-chat-web-sdk'\nimport { Availability } from './components/availability/availability.jsx'\nimport { checkAvailability } from './lib/check-availability'\nimport { AppProvider } from './store/AppProvider.jsx'\nimport { CUSTOMER_ID_STORAGE_KEY } from './store/constants.js'\n\nexport async function init (container, options) {\n const sdk = new ChatSdk({\n brandId: options.brandId,\n channelId: options.channelId,\n customerId: window.localStorage.getItem(CUSTOMER_ID_STORAGE_KEY) || '',\n environment: options.environment\n })\n\n const root = createRoot(container)\n let availability\n try {\n const result = await checkAvailability(options.availabilityEndpoint)\n availability = result.availability\n } catch (e) {\n availability = 'UNAVAILABLE'\n }\n root.render(\n <AppProvider sdk={sdk} availability={availability} options={options}>\n <Availability />\n </AppProvider>\n )\n}\n"],"names":["React","useEffect","useRef","useState","classnames","Panel","useApp","Availability","availability","messages","isChatOpen","setChatVisibility","unseenCount","isFixed","setIsFixed","buttonRef","onClick","onKeyDown","event","key","preventDefault","onKeyUp","intersectionCallback","entries","entry","isBelowFold","isIntersecting","boundingClientRect","top","observer","window","IntersectionObserver","rootMargin","parentElement","current","observe","unobserve","document","documentElement","classList","toggle","body","TextComponent","createElement","Fragment","length","className","ref","href","draggable","PanelHeader","PanelFooter","Message","useTextareaAutosize","formatTranscript","Chat","onEndChatScreen","onSettingsScreen","thread","agent","agentStatus","isAgentTyping","settings","userMessage","setUserMessage","messageRef","scroll","chatBody","querySelector","scrollTop","scrollHeight","label","remove","add","onChange","e","target","value","agentName","nickname","firstName","connectionHeadlineText","sendMessage","sendTextMessage","trim","err","console","log","saveChat","transcript","saveChatLink","setAttribute","click","map","msg","index","id","message","previousMessage","width","height","x","y","viewBox","stroke","cx","cy","r","fill","noValidate","htmlFor","rows","name","type","download","ErrorSummary","errors","errs","Object","keys","goToInput","getAttribute","focus","tabIndex","role","outbound","direction","messageOwnerSameAsPrevious","assignee","text","children","setUnseenCount","onClose","lastMessageSeen","ButtonComponent","focusable","d","useCallback","createPortal","PreChat","RequestChat","Unavailable","EndChat","Settings","useChatSdk","useFocusedElements","sdk","threadId","setThread","setThreadId","setMessages","fetchThread","fetchMessages","screen","setScreen","escapeKeyEvent","addEventListener","onEscapeKey","removeEventListener","recover","fetchedThread","fetchedMessages","handleScreenChange","newScreen","goToPreChatScreen","goToRequestChatScreen","goToChatScreen","goToEndChatScreen","goToSettingsScreen","ScreenComponent","onContinue","onPreChatScreen","onChatScreen","onCancel","Component","rel","uuid","QUESTION_MAX_LENGTH","setCustomerId","fetchCustomerId","setErrors","questionLength","setQuestionLength","nameRef","questionRef","onQuestionChange","onRequestChat","question","v4","customerId","getCustomer","setName","startChat","isQuestionLengthValid","questionLengthRemaining","questionLengthExceeded","questionHint","style","color","setSettings","optionAudio","setOptionAudio","audio","optionScroll","setOptionScroll","onSave","defaultChecked","setAriaHidden","bool","node","removeAttribute","getFocusableElements","selectors","elements","querySelectorAll","join","Array","from","filter","closest","panelElements","setPanelElements","webchatPanelElement","activeElement","shiftKey","panelElement","textAreaRef","checkAvailability","endpoint","response","fetch","data","json","classes","classname","messageNotification","audioUrl","buffer","context","AudioContext","webkitAudioContext","state","events","unlock","_e","forEach","resume","then","arrayBuffer","decodeAudioData","decodedData","catch","error","source","createBufferSource","connect","destination","start","DateTime","transformMessage","messageContent","createdAt","Date","user","authorEndUserIdentity","fullName","authorUser","transformMessages","now","local","setZone","string","toFormat","split","author","date","fromJSDate","replace","encodeURIComponent","createContext","useReducer","useMemo","ChatEvent","initialState","reducer","CUSTOMER_ID_STORAGE_KEY","THREAD_ID_STORAGE_KEY","SETTINGS_STORAGE_KEY","AppContext","AppProvider","options","dispatch","playSound","onLiveChatRecovered","payload","detail","inboxAssignee","contact","status","customerStatistics","unseenMessagesCount","onAssignedAgentChanged","case","onAgentTypingStarted","onAgentTypingEnded","onMessageCreated","isAudioOn","JSON","parse","localStorage","getItem","onContactStatusChanged","onChatEvent","LIVECHAT_RECOVERED","MESSAGE_CREATED","AGENT_TYPING_STARTED","AGENT_TYPING_ENDED","ASSIGNED_AGENT_CHANGED","CONTACT_STATUS_CHANGED","location","hash","store","Provider","setItem","stringify","removeItem","setAvailability","setMessage","reverse","setAgent","setAgentIsTyping","setAgentStatus","actionsMap","SET_CHAT_VISIBILITY","SET_AVAILABILITY","SET_SETTINGS","SET_CUSTOMER_ID","SET_THREAD_ID","SET_THREAD","SET_MESSAGE","SET_MESSAGES","SET_AGENT","SET_AGENT_TYPING","SET_AGENT_STATUS","SET_UNSEEN_COUNT","action","fn","actionFunction","bind","useContext","authorize","consumerIdentity","idOnExternalPlatform","getThread","recovered","allMessages","push","loadMoreMessages","createRoot","ChatSdk","init","container","brandId","channelId","environment","root","result","availabilityEndpoint","render"],"sourceRoot":""}
1
+ {"version":3,"file":"client.js","mappings":"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","sources":["webpack://@defra/flood-webchat/./src/client/components/availability/availability.jsx","webpack://@defra/flood-webchat/./src/client/components/chat/chat.jsx","webpack://@defra/flood-webchat/./src/client/components/errorSummary/error-summary.jsx","webpack://@defra/flood-webchat/./src/client/components/message/message.jsx","webpack://@defra/flood-webchat/./src/client/components/panel/panel-footer.jsx","webpack://@defra/flood-webchat/./src/client/components/panel/panel-header.jsx","webpack://@defra/flood-webchat/./src/client/components/panel/panel.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/end-chat.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/feedback.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/pre-chat.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/request-chat.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/settings.jsx","webpack://@defra/flood-webchat/./src/client/components/screens/unavailable.jsx","webpack://@defra/flood-webchat/./src/client/hooks/useFocusedElements.js","webpack://@defra/flood-webchat/./src/client/hooks/useTextareaAutosize.js","webpack://@defra/flood-webchat/./src/client/lib/check-availability.js","webpack://@defra/flood-webchat/./src/client/lib/classnames.js","webpack://@defra/flood-webchat/./src/client/lib/message-notification.js","webpack://@defra/flood-webchat/./src/client/lib/transform-messages.js","webpack://@defra/flood-webchat/./src/client/store/AppProvider.jsx","webpack://@defra/flood-webchat/./src/client/store/actions-map.js","webpack://@defra/flood-webchat/./src/client/store/constants.js","webpack://@defra/flood-webchat/./src/client/store/reducer.js","webpack://@defra/flood-webchat/./src/client/store/useApp.js","webpack://@defra/flood-webchat/./src/client/store/useChatSdk.js","webpack://@defra/flood-webchat/external commonjs \"@nice-devone/nice-cxone-chat-web-sdk\"","webpack://@defra/flood-webchat/external commonjs \"luxon\"","webpack://@defra/flood-webchat/external commonjs \"react\"","webpack://@defra/flood-webchat/external commonjs \"react-dom\"","webpack://@defra/flood-webchat/external commonjs \"react-dom/client\"","webpack://@defra/flood-webchat/external commonjs \"uuid\"","webpack://@defra/flood-webchat/webpack/bootstrap","webpack://@defra/flood-webchat/webpack/runtime/compat get default export","webpack://@defra/flood-webchat/webpack/runtime/define property getters","webpack://@defra/flood-webchat/webpack/runtime/hasOwnProperty shorthand","webpack://@defra/flood-webchat/webpack/runtime/make namespace object","webpack://@defra/flood-webchat/./src/client/index.jsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react'\n\nimport { classnames } from '../../lib/classnames'\nimport { Panel } from '../panel/panel.jsx'\nimport { useApp } from '../../store/useApp'\n\nexport function Availability () {\n const { availability, isChatOpen, setChatVisibility, unseenCount, threadId } = useApp()\n\n const [isFixed, setIsFixed] = useState(false)\n const buttonRef = useRef()\n\n const onClick = () => {\n setChatVisibility(!isChatOpen)\n }\n\n const onKeyDown = event => {\n if (event.key === ' ') {\n event.preventDefault()\n }\n }\n\n const onKeyUp = event => {\n if (event.key === ' ') {\n setChatVisibility(!isChatOpen)\n }\n }\n\n const intersectionCallback = entries => {\n const [entry] = entries\n const isBelowFold = !entry.isIntersecting && entry.boundingClientRect.top > 0\n setIsFixed(!isChatOpen && isBelowFold && threadId)\n }\n\n useEffect(() => {\n const observer = new window.IntersectionObserver(intersectionCallback, {\n rootMargin: '35px'\n })\n\n const parentElement = buttonRef.current?.parentElement\n\n if (parentElement) {\n observer.observe(parentElement)\n }\n\n return () => {\n if (parentElement) {\n observer.unobserve(parentElement)\n }\n }\n }, [buttonRef, isChatOpen])\n\n useEffect(() => {\n document.documentElement.classList.toggle('wc-scroll-padding', isFixed)\n document.body.classList.toggle('wc-scroll-padding', isFixed)\n }, [isFixed])\n\n let TextComponent = (<>Show Chat</>)\n\n if (!threadId) {\n TextComponent = (<>Start Chat</>)\n }\n\n switch (availability) {\n case 'AVAILABLE':\n return (\n <>\n <div\n className={classnames('wc-availability', isFixed && 'wc-availability--fixed', isChatOpen && 'wc-open')}\n ref={buttonRef}\n >\n <div className='wc-availability__inner'>\n <a\n className='wc-availability__link'\n href='#webchat'\n draggable='false'\n onClick={onClick}\n onKeyUp={onKeyUp}\n onKeyDown={onKeyDown}\n >\n {TextComponent}\n {unseenCount > 0 && !isChatOpen ? <span className='wc-open-btn__unseen'>{unseenCount}</span> : null}\n </a>\n </div>\n </div>\n {isChatOpen && <Panel />}\n </>\n )\n case 'EXISTING':\n case 'UNAVAILABLE':\n return (\n <p className='govuk-body'>When it is available, a 'start chat' link will appear.</p>\n )\n default:\n return (\n <p className='govuk-body'>Checking availability</p>\n )\n }\n}\n","import React, { useEffect, useRef, useState } from 'react'\n\nimport { PanelHeader } from '../panel/panel-header.jsx'\nimport { PanelFooter } from '../panel/panel-footer.jsx'\nimport { Message } from '../message/message.jsx'\n\nimport { useApp } from '../../store/useApp.js'\nimport { useTextareaAutosize } from '../../hooks/useTextareaAutosize.js'\nimport { formatTranscript } from '../../lib/transform-messages.js'\n\nexport function Chat ({ onEndChatScreen, onSettingsScreen }) {\n const { availability, thread, messages, agent, agentStatus, isAgentTyping, settings } = useApp()\n\n const [userMessage, setUserMessage] = useState('')\n\n const messageRef = useRef()\n\n useTextareaAutosize(messageRef.current, userMessage)\n\n useEffect(() => {\n if (settings.scroll && messages.length !== 0) {\n const chatBody = document.querySelector('.wc-body')\n chatBody.scrollTop = chatBody.scrollHeight\n }\n }, [messages, isAgentTyping])\n\n useEffect(() => {\n const label = document.querySelector('.wc-form__label')\n\n if (userMessage.length === 0) {\n label.classList.remove('govuk-visually-hidden')\n } else {\n label.classList.add('govuk-visually-hidden')\n }\n }, [userMessage])\n\n const onChange = e => {\n setUserMessage(e.target?.value)\n }\n\n const agentName = agent?.nickname || agent?.firstName\n\n let connectionHeadlineText = 'Connecting to Floodline'\n\n if (agentStatus === 'closed') {\n connectionHeadlineText = agentName ? `${agentName} ended the session` : 'Session ended by advisor'\n } else if (agentStatus) {\n if (agentName) {\n connectionHeadlineText = `You are speaking with ${agentName}`\n } else {\n connectionHeadlineText = 'No advisers currently available'\n }\n }\n\n if (availability === 'UNAVAILABLE') {\n connectionHeadlineText = 'Webchat is not currently available'\n }\n\n const sendMessage = () => {\n if (messageRef.current.value.length === 0) {\n return\n }\n\n try {\n thread.sendTextMessage(messageRef.current.value.trim())\n } catch (err) {\n console.log('[Chat Error] sendMessage', err)\n }\n\n setUserMessage('')\n }\n const handleKeyPress = e => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n sendMessage()\n }\n }\n\n const handleSubmit = e => {\n e.preventDefault()\n sendMessage()\n }\n\n const saveChat = () => {\n const transcript = formatTranscript(messages)\n\n const saveChatLink = document.querySelector('#transcript-download')\n\n saveChatLink.setAttribute('href', `data:text/plain;charset=utf-8,${transcript}`)\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-status'>\n <p className='wc-status__availability govuk-body-s'>{connectionHeadlineText}</p>\n <a className='wc-status__link govuk-!-font-size-16' href='#' data-module='govuk-button' onClick={onEndChatScreen}>End chat</a>\n </div>\n\n <div className='wc-body'>\n <div className='wc-chat__body'>\n <ul className='wc-chat__messages'>\n {messages.length\n ? messages.map((msg, index) => <Message key={msg.id} message={msg} previousMessage={messages[index - 1]} />)\n : null}\n {isAgentTyping\n ? (\n <li className='wc-chat__message govuk-body outbound'>\n <div className='wc-chat__from govuk-!-font-size-14'>{agentName} is typing</div>\n <div className='wc-chat__text outbound'>\n <svg width='28' height='16' x='0px' y='0px' viewBox='0 0 28 16'>\n <circle stroke='none' cx='3' cy='8' r='3' fill='currentColor' />\n <circle stroke='none' cx='14' cy='8' r='3' fill='currentColor' />\n <circle stroke='none' cx='25' cy='8' r='3' fill='currentColor' />\n </svg>\n </div>\n </li>\n )\n : null}\n </ul>\n </div>\n </div>\n\n <PanelFooter>\n <div className='wc-footer__input'>\n <form className='wc-form' noValidate onSubmit={handleSubmit}>\n <label className='govuk-label wc-form__label govuk-!-font-size-16' htmlFor='wc-form-textarea'>\n Your message<span className='govuk-visually-hidden'> (enter key submits)</span>\n </label>\n\n <textarea\n ref={messageRef}\n rows='1'\n aria-required='true'\n className='wc-form__textarea govuk-textarea govuk-!-font-size-16'\n id='wc-form-textarea'\n name='message'\n onChange={onChange}\n onKeyDown={handleKeyPress}\n value={userMessage}\n />\n\n <input\n type='submit'\n className='wc-form__button govuk-button govuk-!-font-size-16'\n value='Send'\n data-prevent-double-click='true'\n />\n </form>\n </div>\n\n <div className='wc-footer__settings'>\n <a\n href='#'\n id='wc-settings'\n className='wc-footer__settings-link'\n data-module='govuk-button'\n onClick={onSettingsScreen}\n >\n Settings\n </a>\n <a\n href='#'\n id='transcript-download'\n className='wc-footer__settings-link'\n data-module='govuk-button'\n download='floodline-webchat-transcript.txt'\n onClick={saveChat}\n >\n Save chat\n </a>\n </div>\n </PanelFooter>\n </>\n )\n}\n","import React from 'react'\n\nexport const ErrorSummary = ({ errors }) => {\n const errs = Object.keys(errors)\n\n const goToInput = e => {\n e.preventDefault()\n const key = e.target.getAttribute('data-key')\n document.querySelector(`#wc-${key}`).focus()\n }\n\n if (errs.length === 0) {\n return null\n }\n\n return (\n <div className='govuk-error-summary govuk-!-static-margin-bottom-7' data-module='govuk-error-summary' tabIndex='-1'>\n <div role='alert'>\n <h2 id='wc-error' className='govuk-error-summary__title'>\n There is a problem\n </h2>\n <div className='govuk-error-summary__body'>\n <ul className='govuk-list govuk-error-summary__list'>\n {errs.map(key => (\n <li key={key}>\n <a href='#' data-key={key} onClick={goToInput}>{errors[key]}</a>\n </li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { classnames } from '../../lib/classnames'\n\nexport function Message ({ message, previousMessage }) {\n const outbound = message.direction === 'outbound'\n\n const messageOwnerSameAsPrevious = message?.direction === previousMessage?.direction\n\n return (\n <li className={classnames('wc-chat__message govuk-body', outbound ? 'outbound' : 'inbound')}>\n <div className='wc-chat__from govuk-!-font-size-14'>\n {messageOwnerSameAsPrevious ? null : <span>{outbound ? message.assignee : 'You'}</span>}\n <span className='govuk-visually-hidden'>:</span>\n </div>\n <p className={classnames('wc-chat__text', 'govuk-body-s', outbound ? 'outbound' : 'inbound')}>\n {message.text}\n </p>\n </li>\n )\n}\n","import React from 'react'\n\nexport function PanelFooter ({ children }) {\n return (\n <div className='wc-footer'>\n {children}\n </div>\n )\n}\n","import React from 'react'\nimport { useApp } from '../../store/useApp.js'\n\nexport function PanelHeader () {\n const { thread, setChatVisibility, setUnseenCount, threadId } = useApp()\n\n const onClose = e => {\n e.preventDefault()\n setChatVisibility(false)\n if (threadId) {\n thread?.lastMessageSeen()\n setUnseenCount(0)\n }\n }\n\n let ButtonComponent = (\n <button className='wc-header__close' aria-label='Close the webchat' onClick={onClose}>\n <svg aria-hidden='true' focusable='false' width='20' height='20' viewBox='0 0 20 20'>\n <path d='M10,8.6L15.6,3L17,4.4L11.4,10L17,15.6L15.6,17L10,11.4L4.4,17L3,15.6L8.6,10L3,4.4L4.4,3L10,8.6Z' fill='currentColor' />\n </svg>\n </button>\n )\n\n if (thread) {\n ButtonComponent = (\n <button className='wc-header__hide' aria-label='Minimise the webchat' onClick={onClose}>\n <svg aria-hidden='true' focusable='false' width='20' height='20' viewBox='0 0 20 20'>\n <path d='M10 14.4l-7-7L4.4 6l5.6 5.6L15.6 6 17 7.4l-7 7z' fill='currentColor' />\n </svg>\n </button>\n )\n }\n\n return (\n <div className='wc-header'>\n <h2 id='wc-header-title' className='wc-header__title govuk-heading-s'>\n Floodline Webchat\n </h2>\n\n {ButtonComponent}\n </div>\n )\n}\n","import React, { useEffect, useState, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { PreChat } from '../screens/pre-chat.jsx'\nimport { RequestChat } from '../screens/request-chat.jsx'\nimport { Chat } from '../chat/chat.jsx'\nimport { Unavailable } from '../screens/unavailable.jsx'\nimport { EndChat } from '../screens/end-chat.jsx'\nimport { Settings } from '../screens/settings.jsx'\nimport { Feedback } from '../screens/feedback.jsx'\n\nimport { useApp } from '../../store/useApp.js'\nimport { useChatSdk } from '../../store/useChatSdk.js'\nimport { useFocusedElements } from '../../hooks/useFocusedElements.js'\n\nexport function Panel () {\n const { sdk, availability, thread, threadId, setThread, setThreadId, setChatVisibility, setMessages, setUnseenCount } = useApp()\n const { fetchThread, fetchMessages } = useChatSdk(sdk)\n\n const [screen, setScreen] = useState(threadId ? 2 : 0)\n\n useFocusedElements(screen)\n\n const onEscapeKey = useCallback(e => {\n if (e.key === 'Escape' || e.key === 'Esc') {\n if (threadId) {\n thread?.lastMessageSeen()\n setUnseenCount(0)\n }\n setChatVisibility(false)\n }\n }, [thread, threadId, setUnseenCount, setChatVisibility])\n\n /**\n * Initializes the eventListener for pressing the escape key\n */\n useEffect(() => {\n const escapeKeyEvent = document.addEventListener('keydown', onEscapeKey)\n\n return () => {\n document.removeEventListener('keydown', escapeKeyEvent)\n }\n }, [onEscapeKey, setChatVisibility])\n\n /**\n * Recovers the thread if there is a threadId but no thread loaded in to state\n */\n useEffect(() => {\n const recover = async () => {\n try {\n const fetchedThread = await fetchThread(threadId)\n setThread(fetchedThread)\n\n const fetchedMessages = await fetchMessages(fetchedThread, threadId)\n setMessages(fetchedMessages)\n } catch (err) {\n console.log('[Chat Error] fetchThread', err)\n\n setThreadId()\n setThread()\n setScreen(0)\n }\n }\n\n if (threadId) {\n if (thread) {\n thread.lastMessageSeen()\n setUnseenCount(0)\n setScreen(2)\n } else {\n recover()\n }\n }\n }, [thread, threadId])\n\n const handleScreenChange = newScreen => e => {\n e.preventDefault()\n setScreen(newScreen)\n }\n\n const goToPreChatScreen = handleScreenChange(0)\n const goToRequestChatScreen = handleScreenChange(1)\n const goToChatScreen = handleScreenChange(2)\n const goToEndChatScreen = handleScreenChange(3)\n const goToFeedbackScreen = handleScreenChange(4)\n const goToSettingsScreen = handleScreenChange(5)\n let ScreenComponent\n\n switch (screen) {\n case 0:\n ScreenComponent = <PreChat onContinue={goToRequestChatScreen} />\n break\n case 1:\n ScreenComponent = <RequestChat onPreChatScreen={goToPreChatScreen} />\n break\n case 2:\n ScreenComponent = <Chat onSettingsScreen={goToSettingsScreen} onEndChatScreen={goToEndChatScreen} />\n break\n case 3:\n ScreenComponent = <EndChat onChatScreen={goToChatScreen} onEndChatConfirm={goToFeedbackScreen} />\n break\n case 4:\n ScreenComponent = <Feedback onCancel={() => setChatVisibility(false)} />\n break\n case 5:\n ScreenComponent = <Settings onCancel={goToChatScreen} />\n break\n default:\n ScreenComponent = <PreChat onContinue={goToRequestChatScreen} />\n }\n\n if (availability === 'UNAVAILABLE') {\n ScreenComponent = <Unavailable />\n }\n\n const Component = (\n <div id='wc-panel' role='dialog' className='wc-panel' tabIndex='-1' aria-modal='true' aria-labelledby='wc-header-title'>\n {ScreenComponent}\n </div>\n )\n\n return (\n <>\n {createPortal(Component, document.body)}\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\nimport { useApp } from '../../store/useApp.js'\n\nexport function EndChat ({ onChatScreen, onEndChatConfirm }) {\n const { setCustomerId, setThreadId, setMessages, agentStatus, thread, setUnseenCount } = useApp()\n\n const confirmEndChat = async e => {\n e.preventDefault()\n\n setThreadId()\n setMessages([])\n setCustomerId()\n thread.lastMessageSeen()\n setUnseenCount(0)\n\n // End chat if still open\n if (agentStatus !== 'closed') {\n thread.endChat()\n }\n\n onEndChatConfirm(e)\n }\n\n return (\n <>\n <PanelHeader />\n <div className='wc-body'>\n <h3 className='govuk-heading-s' aria-live='polite'>Are you sure you want to end the chat?</h3>\n <div className='govuk-button-group'>\n <a href='#endChat' className='govuk-button govuk-!-font-size-16' data-module='govuk-button' id='confirmEndChat' onClick={confirmEndChat}>Yes, end chat</a>\n <a href='#resumeChat' className='govuk-link govuk-!-font-size-16' onClick={onChatScreen}>No, resume chat</a>\n </div>\n </div>\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function Feedback ({ onCancel }) {\n const feedbackCancel = async e => {\n onCancel(e)\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <h3 id='wc-subtitle' className='govuk-heading-s'>Give Feedback on Floodline webchat</h3>\n <p>Please note we’re unable to respond to feedback.</p>\n <a className='govuk-link' href='#' target='_blank' rel='noreferrer'>Feedback Link</a>\n <div className='govuk-button-group'>\n <a id='feedback-cancel' href='#' data-module='govuk-button' role='button' onClick={feedbackCancel}>Close</a>\n </div>\n </div>\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function PreChat ({ onContinue }) {\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <h3 className='govuk-heading-s' aria-live='polite'>What you can use webchat for</h3>\n <p className='govuk-body-s'>Webchat lets you talk directly to a Floodline adviser.</p>\n\n <p className='govuk-body-s'>You can use webchat to get:</p>\n <ul className='govuk-list govuk-list--bullet govuk-body-s'>\n <li>current flood warnings and alerts in your area</li>\n <li>information on the flood warning service</li>\n <li>advice on what to do before, during and after a flood</li>\n </ul>\n\n <p className='govuk-body-s'>\n There are other ways to&nbsp;\n <a className='govuk-link' href='https://www.gov.uk/sign-up-for-flood-warnings' target='_blank' rel='noreferrer'>\n sign up for flood warnings\n </a>\n &nbsp;and&nbsp;\n <a className='govuk-link' href='https://www.fws.environment-agency.gov.uk/app/olr/login' target='_blank' rel='noreferrer'>\n manage your flood warnings account\n </a>.\n </p>\n <p className='govuk-body-s'>\n Do not use webchat to&nbsp;\n <a\n className='govuk-link'\n href='https://www.gov.uk/report-flood-cause'\n target='_blank'\n rel='noreferrer'\n >\n report a flood\n </a>.\n </p>\n\n <button className='govuk-button govuk-!-font-size-16' data-module='govuk-button' onClick={onContinue}>Continue</button>\n\n <h3 className='govuk-heading-s'>Other flood information</h3>\n\n <p className='govuk-body-s'>Call Floodline for all other flood and flood warning information.</p>\n <p className='govuk-body-s'>\n <strong>Floodline helpline</strong>\n <br />\n Telephone: 0345 988 1188\n <br />\n Textphone: 0345 602 6340\n <br />\n Open 24 hours a day, 7 days a week\n <br />\n <a className='govuk-link' href='https://gov.uk/call-charges' target='_blank' rel='noreferrer'>Find out more about call charges</a>\n </p>\n </div>\n </>\n )\n}\n","import React, { useRef, useState, useEffect } from 'react'\nimport * as uuid from 'uuid'\n\nimport { classnames } from '../../lib/classnames.js'\nimport { PanelHeader } from '../panel/panel-header.jsx'\nimport { useApp } from '../../store/useApp.js'\nimport { useChatSdk } from '../../store/useChatSdk.js'\nimport { ErrorSummary } from '../errorSummary/error-summary.jsx'\n\nconst QUESTION_MAX_LENGTH = 500\n\nexport function RequestChat ({ onPreChatScreen }) {\n const { sdk, setCustomerId, setThreadId, setThread } = useApp()\n const { fetchCustomerId, fetchThread } = useChatSdk(sdk)\n const [errors, setErrors] = useState({})\n const [questionLength, setQuestionLength] = useState(0)\n const [isButtonDisabled, setButtonDisabled] = useState(false)\n\n const nameRef = useRef()\n const questionRef = useRef()\n\n const isQuestionLengthValid = QUESTION_MAX_LENGTH >= questionLength\n const questionLengthRemaining = QUESTION_MAX_LENGTH - questionLength\n const questionLengthExceeded = questionLength - QUESTION_MAX_LENGTH\n\n let questionHint = `You have ${questionLengthRemaining} characters remaining`\n\n if (!isQuestionLengthValid) {\n questionHint = `You have ${questionLengthExceeded} characters too many`\n }\n\n useEffect(() => {\n if (Object.keys(errors).length) {\n document.querySelector('.govuk-error-summary')?.focus()\n }\n }, [errors])\n\n const onQuestionChange = e => {\n setQuestionLength(e.target.value.length)\n }\n\n const buttonLabel = isButtonDisabled ? 'Requesting...' : 'Request Chat'\n\n const onRequestChat = async e => {\n e.preventDefault()\n\n const errs = {}\n\n if (nameRef.current.value.length === 0) {\n errs.name = 'Enter your name'\n }\n\n if (questionRef.current.value.length === 0) {\n errs.question = 'Enter your question'\n }\n\n if (questionRef.current.value.length > QUESTION_MAX_LENGTH) {\n errs.question = 'Your question must be 500 characters or less'\n }\n\n if (Object.keys(errs).length === 0) {\n try {\n setButtonDisabled(true)\n const threadId = uuid.v4()\n const customerId = await fetchCustomerId()\n const thread = await fetchThread(threadId)\n\n sdk.getCustomer().setName(nameRef.current.value)\n\n await thread.startChat(questionRef.current.value || 'Begin conversation')\n\n setCustomerId(customerId)\n setThreadId(threadId)\n setThread(thread)\n thread.setCustomField('threadid', threadId)\n } catch (err) {\n console.log('[Request Chat Error]', err)\n }\n }\n\n setErrors(errs)\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <a href='#' className='wc-back-link govuk-back-link' onClick={onPreChatScreen}>\n What you can use webchat for\n </a>\n\n <ErrorSummary errors={errors} />\n\n <h3 className='govuk-heading-s' aria-live='polite'>\n Your name and question\n </h3>\n\n <form>\n <div className={classnames('govuk-form-group', errors.name && 'govuk-form-group--error')}>\n <label className='govuk-label' htmlFor='wc-name'>\n Your name\n </label>\n {errors.name && (\n <p className='govuk-error-message'>\n <span className='govuk-visually-hidden'>Error:</span> {errors.name}\n </p>\n )}\n <input\n ref={nameRef}\n className={classnames('govuk-input', errors.name && 'govuk-input--error')}\n id='wc-name'\n name='name'\n type='text'\n data-testid='request-chat-user-name'\n />\n </div>\n\n <div className='govuk-character-count' data-module='govuk-character-count' data-maxlength='500'>\n <div className={classnames('govuk-form-group', errors.question && 'govuk-form-group--error')}>\n <label className='govuk-label' htmlFor='wc-question'>\n Your question\n </label>\n {errors.question && (\n <p className='govuk-error-message'>\n <span className='govuk-visually-hidden'>Error:</span>\n {errors.question}\n </p>\n )}\n <textarea\n ref={questionRef}\n id='wc-question'\n name='question'\n rows='5'\n aria-describedby='wc-question-info'\n onChange={onQuestionChange}\n className={classnames('govuk-textarea', 'govuk-js-character-count', !isQuestionLengthValid || errors.question ? 'govuk-textarea--error' : '')}\n data-testid='request-chat-user-question'\n />\n <div id='wc-question-info' className='govuk-hint govuk-character-count__message' style={{ color: `${!isQuestionLengthValid ? '#d4351c' : ''}` }} aria-hidden='true'>\n {questionHint}\n </div>\n <div className='govuk-character-count__sr-status govuk-visually-hidden' aria-live='polite'>\n {questionHint}\n </div>\n </div>\n </div>\n\n <div className='govuk-inset-text govuk-!-font-size-16'>\n By selecting 'Request chat' you agree to the terms of our&nbsp;\n <a href='https://check-for-flooding.service.gov.uk/privacy-notice' target='_blank' rel='noreferrer' className='govuk-link'>privacy notice</a>.\n </div>\n\n <button\n className='govuk-button govuk-!-margin-top-1 govuk-!-font-size-16'\n data-module='govuk-button'\n onClick={onRequestChat}\n disabled={isButtonDisabled}\n >\n {buttonLabel}\n </button>\n </form>\n </div>\n </>\n )\n}\n","import React, { useState } from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nimport { useApp } from '../../store/useApp.js'\n\nexport function Settings ({ onCancel }) {\n const { settings, setSettings } = useApp()\n\n const [optionAudio, setOptionAudio] = useState(settings.audio)\n const [optionScroll, setOptionScroll] = useState(settings.scroll)\n\n const onSave = e => {\n e.preventDefault()\n\n setSettings({ audio: optionAudio, scroll: optionScroll })\n onCancel(e)\n }\n\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <fieldset className='govuk-fieldset govuk-!-margin-bottom-4'>\n <legend className='govuk-fieldset__legend govuk-fieldset__legend'>\n <h3 id='wc-subtitle' className='govuk-heading-s'>Change settings</h3>\n </legend>\n <div className='govuk-checkboxes govuk-checkboxes--small' data-module='govuk-checkboxes'>\n <div className='govuk-checkboxes__item'>\n <input\n id='audio'\n name='audio'\n type='checkbox'\n value='audio'\n className='govuk-checkboxes__input'\n defaultChecked={optionAudio}\n onChange={() => setOptionAudio(!optionAudio)}\n />\n <label className='govuk-label govuk-checkboxes__label govuk-!-font-size-16' htmlFor='audio'>\n Play a sound when receiving a new message\n </label>\n </div>\n <div className='govuk-checkboxes__item'>\n <input\n id='scroll'\n name='scroll'\n type='checkbox'\n value='scroll'\n className='govuk-checkboxes__input'\n defaultChecked={optionScroll}\n onChange={() => setOptionScroll(!optionScroll)}\n />\n <label className='govuk-label govuk-checkboxes__label govuk-!-font-size-16' htmlFor='scroll'>\n Scroll automatically to a new message\n </label>\n </div>\n </div>\n </fieldset>\n\n <div className='govuk-button-group'>\n <a id='settings-save' href='#' className='govuk-button govuk-!-font-size-16' data-module='govuk-button' onClick={onSave}>Save</a>\n <a id='settings-cancel' href='#' className='govuk-link govuk-!-font-size-16' data-module='govuk-button' onClick={onCancel}>Cancel</a>\n </div>\n </div>\n </>\n )\n}\n","import React from 'react'\nimport { PanelHeader } from '../panel/panel-header.jsx'\n\nexport function Unavailable () {\n return (\n <>\n <PanelHeader />\n\n <div className='wc-body'>\n <h3 id='wc-subtitle' className='govuk-heading-m'>Webchat is currently not available</h3>\n <p className='govuk-body-s'>Try again later, or call Floodline:</p>\n <p className='govuk-body-s'>\n <strong>Floodline helpline</strong>\n <br />Telephone: 0345 988 1188\n <br />Textphone: 0345 602 6340\n <br />Open 24 hours a day, 7 days a week\n <br /><a className='govuk-link' href='https://gov.uk/call-charges'>Find out more about call charges</a>\n </p>\n <p className='govuk-body-s'>We're running webchat as a trial, it will not always be available.</p>\n </div>\n </>\n )\n}\n","import { useState, useEffect, useCallback } from 'react'\n\nconst setAriaHidden = bool => {\n for (const node of document.body.children) {\n if (node.id !== 'wc-panel') {\n (bool) ? node.setAttribute('aria-hidden', 'true') : node.removeAttribute('aria-hidden')\n }\n }\n}\n\nexport const getFocusableElements = () => {\n const selectors = [\n '#wc-panel a:not([disabled])',\n '#wc-panel button:not([disabled])',\n '#wc-panel select:not([disabled])',\n '#wc-panel input:not([disabled])',\n '#wc-panel textarea:not([disabled])',\n '#wc-panel *[tabindex=\"0\"]:not([disabled])'\n ]\n\n const elements = document.body.querySelectorAll(selectors.join(','))\n return Array.from(elements).filter(e => !e.closest('[hidden]') && !e.closest('[aria-hidden=\"true\"]'))\n}\n\nconst useFocusedElements = screen => {\n const [panelElements, setPanelElements] = useState([])\n\n const onKeyDown = useCallback(e => {\n const webchatPanelElement = document.querySelector('#wc-panel')\n\n if (e.key === 'Tab') {\n if (webchatPanelElement && !document.activeElement.closest('#wc-panel')) {\n webchatPanelElement.focus()\n }\n\n if (e.shiftKey) {\n if (document.activeElement === panelElements[0]) {\n panelElements[panelElements.length - 1].focus()\n e.preventDefault()\n } else if (document.activeElement === document.querySelector('#wc-panel')) {\n panelElements[panelElements.length - 1]?.focus()\n e.preventDefault()\n }\n } else if (document.activeElement === panelElements[panelElements.length - 1]) {\n panelElements[0].focus()\n e.preventDefault()\n }\n }\n }, [panelElements])\n\n useEffect(() => {\n setPanelElements(getFocusableElements())\n }, [screen])\n\n useEffect(() => {\n setAriaHidden(true)\n\n const panelElement = document.querySelector('#wc-panel')\n panelElement.focus()\n\n document.addEventListener('keydown', onKeyDown)\n\n return () => {\n setAriaHidden()\n document.body.querySelector('.wc-availability__link')?.focus()\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [panelElements])\n}\n\nexport { useFocusedElements }\n","import { useEffect } from 'react'\n\nexport const useTextareaAutosize = (textAreaRef, value) => {\n useEffect(() => {\n if (textAreaRef) {\n textAreaRef.style.height = '0px'\n\n const scrollHeight = textAreaRef.scrollHeight\n\n textAreaRef.style.height = `${scrollHeight}px`\n }\n }, [textAreaRef, value])\n}\n","export async function checkAvailability (endpoint) {\n const response = await fetch(endpoint)\n const data = await response.json()\n\n return {\n availability: data.availability || 'UNAVAILABLE'\n }\n}\n","export const classnames = (...classes) => classes.filter(classname => classname && typeof classname === 'string').join(' ')\n","export const messageNotification = audioUrl => {\n let buffer\n\n const context = new (window.AudioContext || window.webkitAudioContext)()\n\n if (context.state === 'suspended') {\n const events = ['touchstart', 'touchend', 'mousedown', 'wheel', 'keydown', 'click']\n\n const unlock = _e => {\n events.forEach(event => {\n document.body.removeEventListener(event, unlock)\n })\n\n context.resume()\n }\n\n events.forEach(event => {\n document.body.addEventListener(event, unlock, false)\n })\n }\n\n fetch(audioUrl)\n .then(response => response.arrayBuffer())\n .then(data => context.decodeAudioData(data))\n .then(decodedData => {\n buffer = decodedData\n })\n .catch(console.error)\n\n return () => {\n const source = context.createBufferSource()\n source.buffer = buffer\n source.connect(context.destination)\n source.start()\n }\n}\n","import { DateTime } from 'luxon'\n\nexport const transformMessage = message => {\n return {\n id: message.id,\n text: message.messageContent?.text,\n createdAt: new Date(message.createdAt),\n user: message.authorEndUserIdentity?.fullName?.trim() || null,\n assignee: message.authorUser?.firstName || null,\n direction: message.direction\n }\n}\n\nexport const transformMessages = messages => messages.map(message => transformMessage(message))\n\nexport const formatTranscript = messages => {\n const now = DateTime.local()\n now.setZone('Europe/London')\n\n let string = `Floodline webchat transcript, ${now.toFormat('HH:mm:ss a, dd LLLL yyyy')}\\n\\n`\n\n for (const message of messages) {\n const { text, direction, user, assignee, createdAt } = message\n\n const author = direction === 'inbound' ? user : `${assignee} (Floodline adviser)`\n const date = DateTime.fromJSDate(new Date(createdAt)).setZone('Europe/London').toFormat('HH:mm:ss a, dd LLLL yyyy')\n\n string += `[${date}] ${author}: \\n${text}\\n\\n`\n }\n\n string = string.replace(/<a\\b[^>]*>/i, '').replace(/<\\/a>/i, '')\n\n return encodeURIComponent(string)\n}\n","import React, { createContext, useEffect, useReducer, useMemo } from 'react'\nimport { ChatEvent } from '@nice-devone/nice-cxone-chat-web-sdk'\n\nimport { messageNotification } from '../lib/message-notification.js'\n\nimport { initialState, reducer } from './reducer.js'\nimport { CUSTOMER_ID_STORAGE_KEY, THREAD_ID_STORAGE_KEY, SETTINGS_STORAGE_KEY } from './constants.js'\n\nexport const AppContext = createContext(initialState)\n\nexport const AppProvider = ({ sdk, availability, options, children }) => {\n const [state, dispatch] = useReducer(reducer, initialState)\n\n const playSound = messageNotification(options.audioUrl)\n\n /**\n * SDK event handlers\n */\n const onLiveChatRecovered = e => {\n dispatch({ type: 'SET_AGENT', payload: e.detail.data.inboxAssignee })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.contact.status })\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: e.detail.data.contact.customerStatistics.unseenMessagesCount })\n }\n\n const onAssignedAgentChanged = e => {\n dispatch({ type: 'SET_AGENT', payload: e.detail.data.inboxAssignee })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n }\n\n const onAgentTypingStarted = () => {\n dispatch({ type: 'SET_AGENT_TYPING', payload: true })\n }\n\n const onAgentTypingEnded = () => {\n dispatch({ type: 'SET_AGENT_TYPING', payload: false })\n }\n\n const onMessageCreated = e => {\n dispatch({ type: 'SET_MESSAGE', payload: e.detail.data.message })\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: e.detail.data.case.customerStatistics.unseenMessagesCount })\n\n const isAudioOn = JSON.parse(window.localStorage.getItem(SETTINGS_STORAGE_KEY)).audio\n\n if (isAudioOn && e.detail.data.message.direction === 'outbound') {\n playSound()\n }\n }\n\n const onContactStatusChanged = e => {\n dispatch({ type: 'SET_AGENT_STATUS', payload: e.detail.data.case.status })\n }\n\n useEffect(() => {\n sdk.onChatEvent(ChatEvent.LIVECHAT_RECOVERED, onLiveChatRecovered)\n sdk.onChatEvent(ChatEvent.MESSAGE_CREATED, onMessageCreated)\n sdk.onChatEvent(ChatEvent.AGENT_TYPING_STARTED, onAgentTypingStarted)\n sdk.onChatEvent(ChatEvent.AGENT_TYPING_ENDED, onAgentTypingEnded)\n sdk.onChatEvent(ChatEvent.ASSIGNED_AGENT_CHANGED, onAssignedAgentChanged)\n sdk.onChatEvent(ChatEvent.CONTACT_STATUS_CHANGED, onContactStatusChanged)\n }, [sdk])\n\n /**\n * Initialize customerId, threadId and whether the webchat should be open\n */\n useEffect(() => {\n dispatch({ type: 'SET_AVAILABILITY', payload: availability })\n\n setCustomerId(window.localStorage.getItem(CUSTOMER_ID_STORAGE_KEY))\n setThreadId(window.localStorage.getItem(THREAD_ID_STORAGE_KEY))\n setSettings(JSON.parse(window.localStorage.getItem(SETTINGS_STORAGE_KEY)) || state.settings)\n\n if (window.location.hash === '#webchat') {\n setChatVisibility(true)\n }\n }, [])\n\n /**\n * State update functions\n */\n const setChatVisibility = payload => {\n if (!payload) {\n window.location.hash = ''\n }\n\n dispatch({ type: 'SET_CHAT_VISIBILITY', payload })\n }\n\n const setCustomerId = customerId => {\n dispatch({ type: 'SET_CUSTOMER_ID', payload: customerId })\n }\n\n const setThreadId = threadId => {\n dispatch({ type: 'SET_THREAD_ID', payload: threadId })\n }\n\n const setThread = thread => {\n dispatch({ type: 'SET_THREAD', payload: thread })\n }\n\n const setMessages = messages => {\n dispatch({ type: 'SET_MESSAGES', payload: messages })\n }\n\n const setSettings = data => {\n dispatch({ type: 'SET_SETTINGS', payload: data })\n }\n\n const setUnseenCount = unseenCount => {\n dispatch({ type: 'SET_UNSEEN_COUNT', payload: unseenCount })\n }\n\n /**\n * Application-wide state and state functions\n */\n const store = useMemo(() => ({\n ...state,\n sdk,\n setSettings,\n setCustomerId,\n setThreadId,\n setThread,\n setMessages,\n setUnseenCount,\n setChatVisibility,\n onLiveChatRecovered,\n onAssignedAgentChanged,\n onAgentTypingStarted,\n onAgentTypingEnded,\n onMessageCreated,\n onContactStatusChanged\n }))\n\n return (\n <AppContext.Provider value={store}>\n {children}\n </AppContext.Provider>\n )\n}\n","import { transformMessages, transformMessage } from '../lib/transform-messages'\nimport { CUSTOMER_ID_STORAGE_KEY, THREAD_ID_STORAGE_KEY, SETTINGS_STORAGE_KEY } from './constants'\n\nconst setSettings = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(SETTINGS_STORAGE_KEY, JSON.stringify(payload))\n } else {\n window.localStorage.removeItem(SETTINGS_STORAGE_KEY)\n }\n\n return {\n ...state,\n settings: payload\n }\n}\n\nconst setCustomerId = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(CUSTOMER_ID_STORAGE_KEY, payload)\n } else {\n window.localStorage.removeItem(CUSTOMER_ID_STORAGE_KEY)\n }\n\n return {\n ...state,\n customerId: payload\n }\n}\n\nconst setThreadId = (state, payload) => {\n if (payload) {\n window.localStorage.setItem(THREAD_ID_STORAGE_KEY, payload)\n } else {\n window.localStorage.removeItem(THREAD_ID_STORAGE_KEY)\n }\n\n return {\n ...state,\n threadId: payload\n }\n}\n\nconst setChatVisibility = (state, payload) => {\n return {\n ...state,\n isChatOpen: payload\n }\n}\n\nconst setAvailability = (state, payload) => {\n return {\n ...state,\n availability: payload\n }\n}\n\nconst setThread = (state, payload) => {\n return {\n ...state,\n thread: payload\n }\n}\n\nconst setMessage = (state, payload) => {\n return {\n ...state,\n messages: [...state.messages, transformMessage(payload)]\n }\n}\n\nconst setMessages = (state, payload) => {\n return {\n ...state,\n messages: transformMessages(payload).reverse()\n }\n}\n\nconst setAgent = (state, payload) => {\n return {\n ...state,\n agent: payload\n }\n}\n\nconst setAgentIsTyping = (state, payload) => {\n return {\n ...state,\n isAgentTyping: payload\n }\n}\n\nconst setAgentStatus = (state, payload) => {\n return {\n ...state,\n agentStatus: payload\n }\n}\n\nconst setUnseenCount = (state, payload) => {\n return {\n ...state,\n unseenCount: payload\n }\n}\n\nexport const actionsMap = {\n SET_CHAT_VISIBILITY: setChatVisibility,\n SET_AVAILABILITY: setAvailability,\n SET_SETTINGS: setSettings,\n SET_CUSTOMER_ID: setCustomerId,\n SET_THREAD_ID: setThreadId,\n SET_THREAD: setThread,\n SET_MESSAGE: setMessage,\n SET_MESSAGES: setMessages,\n SET_AGENT: setAgent,\n SET_AGENT_TYPING: setAgentIsTyping,\n SET_AGENT_STATUS: setAgentStatus,\n SET_UNSEEN_COUNT: setUnseenCount\n}\n","export const SETTINGS_STORAGE_KEY = 'webchat_settings'\nexport const CUSTOMER_ID_STORAGE_KEY = 'webchat_customer_id'\nexport const THREAD_ID_STORAGE_KEY = 'webchat_thread_id'\n","import { actionsMap } from './actions-map'\n\nexport const initialState = {\n availability: null,\n customerId: null,\n threadId: null,\n thread: null,\n messages: [],\n unseenCount: 0,\n agent: null,\n agentStatus: null,\n isAgentTyping: false,\n isChatOpen: false,\n settings: { audio: true, scroll: true }\n}\n\nexport const reducer = (state, action) => {\n const { type, payload } = action\n\n const fn = actionsMap[type]\n\n if (fn) {\n const actionFunction = fn.bind(this, state, payload)\n return actionFunction()\n }\n\n return state\n}\n","import { useContext } from 'react'\n\nimport { AppContext } from './AppProvider.jsx'\n\nexport const useApp = () => useContext(AppContext)\n","export const useChatSdk = sdk => {\n const connect = async () => sdk.authorize()\n\n const fetchCustomerId = async () => {\n const response = await connect()\n return response?.consumerIdentity.idOnExternalPlatform\n }\n\n const fetchThread = async threadId => {\n await connect()\n return sdk.getThread(threadId)\n }\n\n const fetchMessages = async (thread, threadId) => {\n await connect()\n\n const recovered = await thread.recover(threadId)\n\n const allMessages = []\n let fetchedMessages = recovered.messages\n\n while (fetchedMessages.length) {\n fetchedMessages.map(msg => allMessages.push(msg))\n\n try {\n const response = await thread.loadMoreMessages()\n fetchedMessages = response.data.messages\n } catch (err) {\n fetchedMessages = []\n }\n }\n\n return allMessages\n }\n\n return { connect, fetchCustomerId, fetchThread, fetchMessages }\n}\n","module.exports = require(\"@nice-devone/nice-cxone-chat-web-sdk\");","module.exports = require(\"luxon\");","module.exports = require(\"react\");","module.exports = require(\"react-dom\");","module.exports = require(\"react-dom/client\");","module.exports = require(\"uuid\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { ChatSdk } from '@nice-devone/nice-cxone-chat-web-sdk'\nimport { Availability } from './components/availability/availability.jsx'\nimport { checkAvailability } from './lib/check-availability'\nimport { AppProvider } from './store/AppProvider.jsx'\nimport { CUSTOMER_ID_STORAGE_KEY } from './store/constants.js'\n\nexport async function init (container, options) {\n const sdk = new ChatSdk({\n brandId: options.brandId,\n channelId: options.channelId,\n customerId: window.localStorage.getItem(CUSTOMER_ID_STORAGE_KEY) || '',\n environment: options.environment\n })\n\n const root = createRoot(container)\n let availability\n try {\n const result = await checkAvailability(options.availabilityEndpoint)\n availability = result.availability\n } catch (e) {\n availability = 'UNAVAILABLE'\n }\n root.render(\n <AppProvider sdk={sdk} availability={availability} options={options}>\n <Availability />\n </AppProvider>\n )\n}\n"],"names":["React","useEffect","useRef","useState","classnames","Panel","useApp","Availability","availability","isChatOpen","setChatVisibility","unseenCount","threadId","isFixed","setIsFixed","buttonRef","onClick","onKeyDown","event","key","preventDefault","onKeyUp","intersectionCallback","entries","entry","isBelowFold","isIntersecting","boundingClientRect","top","observer","window","IntersectionObserver","rootMargin","parentElement","current","observe","unobserve","document","documentElement","classList","toggle","body","TextComponent","createElement","Fragment","className","ref","href","draggable","PanelHeader","PanelFooter","Message","useTextareaAutosize","formatTranscript","Chat","onEndChatScreen","onSettingsScreen","thread","messages","agent","agentStatus","isAgentTyping","settings","userMessage","setUserMessage","messageRef","scroll","length","chatBody","querySelector","scrollTop","scrollHeight","label","remove","add","onChange","e","target","value","agentName","nickname","firstName","connectionHeadlineText","sendMessage","sendTextMessage","trim","err","console","log","handleKeyPress","shiftKey","handleSubmit","saveChat","transcript","saveChatLink","setAttribute","map","msg","index","id","message","previousMessage","width","height","x","y","viewBox","stroke","cx","cy","r","fill","noValidate","onSubmit","htmlFor","rows","name","type","download","ErrorSummary","errors","errs","Object","keys","goToInput","getAttribute","focus","tabIndex","role","outbound","direction","messageOwnerSameAsPrevious","assignee","text","children","setUnseenCount","onClose","lastMessageSeen","ButtonComponent","focusable","d","useCallback","createPortal","PreChat","RequestChat","Unavailable","EndChat","Settings","Feedback","useChatSdk","useFocusedElements","sdk","setThread","setThreadId","setMessages","fetchThread","fetchMessages","screen","setScreen","onEscapeKey","escapeKeyEvent","addEventListener","removeEventListener","recover","fetchedThread","fetchedMessages","handleScreenChange","newScreen","goToPreChatScreen","goToRequestChatScreen","goToChatScreen","goToEndChatScreen","goToFeedbackScreen","goToSettingsScreen","ScreenComponent","onContinue","onPreChatScreen","onChatScreen","onEndChatConfirm","onCancel","Component","setCustomerId","confirmEndChat","endChat","feedbackCancel","rel","uuid","QUESTION_MAX_LENGTH","fetchCustomerId","setErrors","questionLength","setQuestionLength","isButtonDisabled","setButtonDisabled","nameRef","questionRef","isQuestionLengthValid","questionLengthRemaining","questionLengthExceeded","questionHint","onQuestionChange","buttonLabel","onRequestChat","question","v4","customerId","getCustomer","setName","startChat","setCustomField","style","color","disabled","setSettings","optionAudio","setOptionAudio","audio","optionScroll","setOptionScroll","onSave","defaultChecked","setAriaHidden","bool","node","removeAttribute","getFocusableElements","selectors","elements","querySelectorAll","join","Array","from","filter","closest","panelElements","setPanelElements","webchatPanelElement","activeElement","panelElement","textAreaRef","checkAvailability","endpoint","response","fetch","data","json","classes","classname","messageNotification","audioUrl","buffer","context","AudioContext","webkitAudioContext","state","events","unlock","_e","forEach","resume","then","arrayBuffer","decodeAudioData","decodedData","catch","error","source","createBufferSource","connect","destination","start","DateTime","transformMessage","messageContent","createdAt","Date","user","authorEndUserIdentity","fullName","authorUser","transformMessages","now","local","setZone","string","toFormat","author","date","fromJSDate","replace","encodeURIComponent","createContext","useReducer","useMemo","ChatEvent","initialState","reducer","CUSTOMER_ID_STORAGE_KEY","THREAD_ID_STORAGE_KEY","SETTINGS_STORAGE_KEY","AppContext","AppProvider","options","dispatch","playSound","onLiveChatRecovered","payload","detail","inboxAssignee","contact","status","customerStatistics","unseenMessagesCount","onAssignedAgentChanged","case","onAgentTypingStarted","onAgentTypingEnded","onMessageCreated","isAudioOn","JSON","parse","localStorage","getItem","onContactStatusChanged","onChatEvent","LIVECHAT_RECOVERED","MESSAGE_CREATED","AGENT_TYPING_STARTED","AGENT_TYPING_ENDED","ASSIGNED_AGENT_CHANGED","CONTACT_STATUS_CHANGED","location","hash","store","Provider","setItem","stringify","removeItem","setAvailability","setMessage","reverse","setAgent","setAgentIsTyping","setAgentStatus","actionsMap","SET_CHAT_VISIBILITY","SET_AVAILABILITY","SET_SETTINGS","SET_CUSTOMER_ID","SET_THREAD_ID","SET_THREAD","SET_MESSAGE","SET_MESSAGES","SET_AGENT","SET_AGENT_TYPING","SET_AGENT_STATUS","SET_UNSEEN_COUNT","action","fn","actionFunction","bind","useContext","authorize","consumerIdentity","idOnExternalPlatform","getThread","recovered","allMessages","push","loadMoreMessages","createRoot","ChatSdk","init","container","brandId","channelId","environment","root","result","availabilityEndpoint","render"],"sourceRoot":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra/flood-webchat",
3
- "version": "0.0.1-beta.24",
3
+ "version": "0.0.1-beta.26",
4
4
  "description": "",
5
5
  "main": "dist/server.js",
6
6
  "browser": "dist/client.js",
@@ -5,7 +5,7 @@ import { Panel } from '../panel/panel.jsx'
5
5
  import { useApp } from '../../store/useApp'
6
6
 
7
7
  export function Availability () {
8
- const { availability, messages, isChatOpen, setChatVisibility, unseenCount } = useApp()
8
+ const { availability, isChatOpen, setChatVisibility, unseenCount, threadId } = useApp()
9
9
 
10
10
  const [isFixed, setIsFixed] = useState(false)
11
11
  const buttonRef = useRef()
@@ -29,7 +29,7 @@ export function Availability () {
29
29
  const intersectionCallback = entries => {
30
30
  const [entry] = entries
31
31
  const isBelowFold = !entry.isIntersecting && entry.boundingClientRect.top > 0
32
- setIsFixed(!isChatOpen && isBelowFold)
32
+ setIsFixed(!isChatOpen && isBelowFold && threadId)
33
33
  }
34
34
 
35
35
  useEffect(() => {
@@ -57,7 +57,7 @@ export function Availability () {
57
57
 
58
58
  let TextComponent = (<>Show Chat</>)
59
59
 
60
- if (!messages.length) {
60
+ if (!threadId) {
61
61
  TextComponent = (<>Start Chat</>)
62
62
  }
63
63
 
@@ -56,9 +56,7 @@ export function Chat ({ onEndChatScreen, onSettingsScreen }) {
56
56
  connectionHeadlineText = 'Webchat is not currently available'
57
57
  }
58
58
 
59
- const sendMessage = e => {
60
- e.preventDefault()
61
-
59
+ const sendMessage = () => {
62
60
  if (messageRef.current.value.length === 0) {
63
61
  return
64
62
  }
@@ -71,6 +69,17 @@ export function Chat ({ onEndChatScreen, onSettingsScreen }) {
71
69
 
72
70
  setUserMessage('')
73
71
  }
72
+ const handleKeyPress = e => {
73
+ if (e.key === 'Enter' && !e.shiftKey) {
74
+ e.preventDefault()
75
+ sendMessage()
76
+ }
77
+ }
78
+
79
+ const handleSubmit = e => {
80
+ e.preventDefault()
81
+ sendMessage()
82
+ }
74
83
 
75
84
  const saveChat = () => {
76
85
  const transcript = formatTranscript(messages)
@@ -78,7 +87,6 @@ export function Chat ({ onEndChatScreen, onSettingsScreen }) {
78
87
  const saveChatLink = document.querySelector('#transcript-download')
79
88
 
80
89
  saveChatLink.setAttribute('href', `data:text/plain;charset=utf-8,${transcript}`)
81
- saveChatLink.click()
82
90
  }
83
91
 
84
92
  return (
@@ -116,7 +124,7 @@ export function Chat ({ onEndChatScreen, onSettingsScreen }) {
116
124
 
117
125
  <PanelFooter>
118
126
  <div className='wc-footer__input'>
119
- <form className='wc-form' noValidate>
127
+ <form className='wc-form' noValidate onSubmit={handleSubmit}>
120
128
  <label className='govuk-label wc-form__label govuk-!-font-size-16' htmlFor='wc-form-textarea'>
121
129
  Your message<span className='govuk-visually-hidden'> (enter key submits)</span>
122
130
  </label>
@@ -129,6 +137,7 @@ export function Chat ({ onEndChatScreen, onSettingsScreen }) {
129
137
  id='wc-form-textarea'
130
138
  name='message'
131
139
  onChange={onChange}
140
+ onKeyDown={handleKeyPress}
132
141
  value={userMessage}
133
142
  />
134
143
 
@@ -137,7 +146,6 @@ export function Chat ({ onEndChatScreen, onSettingsScreen }) {
137
146
  className='wc-form__button govuk-button govuk-!-font-size-16'
138
147
  value='Send'
139
148
  data-prevent-double-click='true'
140
- onClick={sendMessage}
141
149
  />
142
150
  </form>
143
151
  </div>
@@ -2,13 +2,15 @@ import React from 'react'
2
2
  import { useApp } from '../../store/useApp.js'
3
3
 
4
4
  export function PanelHeader () {
5
- const { thread, setChatVisibility, setUnseenCount } = useApp()
5
+ const { thread, setChatVisibility, setUnseenCount, threadId } = useApp()
6
6
 
7
7
  const onClose = e => {
8
8
  e.preventDefault()
9
9
  setChatVisibility(false)
10
- thread.lastMessageSeen()
11
- setUnseenCount(0)
10
+ if (threadId) {
11
+ thread?.lastMessageSeen()
12
+ setUnseenCount(0)
13
+ }
12
14
  }
13
15
 
14
16
  let ButtonComponent = (
@@ -7,6 +7,7 @@ import { Chat } from '../chat/chat.jsx'
7
7
  import { Unavailable } from '../screens/unavailable.jsx'
8
8
  import { EndChat } from '../screens/end-chat.jsx'
9
9
  import { Settings } from '../screens/settings.jsx'
10
+ import { Feedback } from '../screens/feedback.jsx'
10
11
 
11
12
  import { useApp } from '../../store/useApp.js'
12
13
  import { useChatSdk } from '../../store/useChatSdk.js'
@@ -20,6 +21,16 @@ export function Panel () {
20
21
 
21
22
  useFocusedElements(screen)
22
23
 
24
+ const onEscapeKey = useCallback(e => {
25
+ if (e.key === 'Escape' || e.key === 'Esc') {
26
+ if (threadId) {
27
+ thread?.lastMessageSeen()
28
+ setUnseenCount(0)
29
+ }
30
+ setChatVisibility(false)
31
+ }
32
+ }, [thread, threadId, setUnseenCount, setChatVisibility])
33
+
23
34
  /**
24
35
  * Initializes the eventListener for pressing the escape key
25
36
  */
@@ -29,7 +40,7 @@ export function Panel () {
29
40
  return () => {
30
41
  document.removeEventListener('keydown', escapeKeyEvent)
31
42
  }
32
- }, [])
43
+ }, [onEscapeKey, setChatVisibility])
33
44
 
34
45
  /**
35
46
  * Recovers the thread if there is a threadId but no thread loaded in to state
@@ -62,12 +73,6 @@ export function Panel () {
62
73
  }
63
74
  }, [thread, threadId])
64
75
 
65
- const onEscapeKey = useCallback(e => {
66
- if (e.key === 'Escape' || e.key === 'Esc') {
67
- setChatVisibility(false)
68
- }
69
- }, [])
70
-
71
76
  const handleScreenChange = newScreen => e => {
72
77
  e.preventDefault()
73
78
  setScreen(newScreen)
@@ -77,8 +82,8 @@ export function Panel () {
77
82
  const goToRequestChatScreen = handleScreenChange(1)
78
83
  const goToChatScreen = handleScreenChange(2)
79
84
  const goToEndChatScreen = handleScreenChange(3)
85
+ const goToFeedbackScreen = handleScreenChange(4)
80
86
  const goToSettingsScreen = handleScreenChange(5)
81
-
82
87
  let ScreenComponent
83
88
 
84
89
  switch (screen) {
@@ -92,7 +97,10 @@ export function Panel () {
92
97
  ScreenComponent = <Chat onSettingsScreen={goToSettingsScreen} onEndChatScreen={goToEndChatScreen} />
93
98
  break
94
99
  case 3:
95
- ScreenComponent = <EndChat onChatScreen={goToChatScreen} />
100
+ ScreenComponent = <EndChat onChatScreen={goToChatScreen} onEndChatConfirm={goToFeedbackScreen} />
101
+ break
102
+ case 4:
103
+ ScreenComponent = <Feedback onCancel={() => setChatVisibility(false)} />
96
104
  break
97
105
  case 5:
98
106
  ScreenComponent = <Settings onCancel={goToChatScreen} />
@@ -1,15 +1,35 @@
1
1
  import React from 'react'
2
2
  import { PanelHeader } from '../panel/panel-header.jsx'
3
+ import { useApp } from '../../store/useApp.js'
4
+
5
+ export function EndChat ({ onChatScreen, onEndChatConfirm }) {
6
+ const { setCustomerId, setThreadId, setMessages, agentStatus, thread, setUnseenCount } = useApp()
7
+
8
+ const confirmEndChat = async e => {
9
+ e.preventDefault()
10
+
11
+ setThreadId()
12
+ setMessages([])
13
+ setCustomerId()
14
+ thread.lastMessageSeen()
15
+ setUnseenCount(0)
16
+
17
+ // End chat if still open
18
+ if (agentStatus !== 'closed') {
19
+ thread.endChat()
20
+ }
21
+
22
+ onEndChatConfirm(e)
23
+ }
3
24
 
4
- export function EndChat ({ onChatScreen }) {
5
25
  return (
6
26
  <>
7
27
  <PanelHeader />
8
28
  <div className='wc-body'>
9
29
  <h3 className='govuk-heading-s' aria-live='polite'>Are you sure you want to end the chat?</h3>
10
30
  <div className='govuk-button-group'>
11
- <a href='#' className='govuk-button govuk-!-font-size-16' data-module='govuk-button'>Yes, end chat</a>
12
- <a href='#' className='govuk-link govuk-!-font-size-16' onClick={onChatScreen}>No, resume chat</a>
31
+ <a href='#endChat' className='govuk-button govuk-!-font-size-16' data-module='govuk-button' id='confirmEndChat' onClick={confirmEndChat}>Yes, end chat</a>
32
+ <a href='#resumeChat' className='govuk-link govuk-!-font-size-16' onClick={onChatScreen}>No, resume chat</a>
13
33
  </div>
14
34
  </div>
15
35
  </>
@@ -0,0 +1,23 @@
1
+ import React from 'react'
2
+ import { PanelHeader } from '../panel/panel-header.jsx'
3
+
4
+ export function Feedback ({ onCancel }) {
5
+ const feedbackCancel = async e => {
6
+ onCancel(e)
7
+ }
8
+
9
+ return (
10
+ <>
11
+ <PanelHeader />
12
+
13
+ <div className='wc-body'>
14
+ <h3 id='wc-subtitle' className='govuk-heading-s'>Give Feedback on Floodline webchat</h3>
15
+ <p>Please note we’re unable to respond to feedback.</p>
16
+ <a className='govuk-link' href='#' target='_blank' rel='noreferrer'>Feedback Link</a>
17
+ <div className='govuk-button-group'>
18
+ <a id='feedback-cancel' href='#' data-module='govuk-button' role='button' onClick={feedbackCancel}>Close</a>
19
+ </div>
20
+ </div>
21
+ </>
22
+ )
23
+ }
@@ -12,13 +12,23 @@ const QUESTION_MAX_LENGTH = 500
12
12
  export function RequestChat ({ onPreChatScreen }) {
13
13
  const { sdk, setCustomerId, setThreadId, setThread } = useApp()
14
14
  const { fetchCustomerId, fetchThread } = useChatSdk(sdk)
15
-
16
15
  const [errors, setErrors] = useState({})
17
16
  const [questionLength, setQuestionLength] = useState(0)
17
+ const [isButtonDisabled, setButtonDisabled] = useState(false)
18
18
 
19
19
  const nameRef = useRef()
20
20
  const questionRef = useRef()
21
21
 
22
+ const isQuestionLengthValid = QUESTION_MAX_LENGTH >= questionLength
23
+ const questionLengthRemaining = QUESTION_MAX_LENGTH - questionLength
24
+ const questionLengthExceeded = questionLength - QUESTION_MAX_LENGTH
25
+
26
+ let questionHint = `You have ${questionLengthRemaining} characters remaining`
27
+
28
+ if (!isQuestionLengthValid) {
29
+ questionHint = `You have ${questionLengthExceeded} characters too many`
30
+ }
31
+
22
32
  useEffect(() => {
23
33
  if (Object.keys(errors).length) {
24
34
  document.querySelector('.govuk-error-summary')?.focus()
@@ -29,6 +39,8 @@ export function RequestChat ({ onPreChatScreen }) {
29
39
  setQuestionLength(e.target.value.length)
30
40
  }
31
41
 
42
+ const buttonLabel = isButtonDisabled ? 'Requesting...' : 'Request Chat'
43
+
32
44
  const onRequestChat = async e => {
33
45
  e.preventDefault()
34
46
 
@@ -48,6 +60,7 @@ export function RequestChat ({ onPreChatScreen }) {
48
60
 
49
61
  if (Object.keys(errs).length === 0) {
50
62
  try {
63
+ setButtonDisabled(true)
51
64
  const threadId = uuid.v4()
52
65
  const customerId = await fetchCustomerId()
53
66
  const thread = await fetchThread(threadId)
@@ -59,6 +72,7 @@ export function RequestChat ({ onPreChatScreen }) {
59
72
  setCustomerId(customerId)
60
73
  setThreadId(threadId)
61
74
  setThread(thread)
75
+ thread.setCustomField('threadid', threadId)
62
76
  } catch (err) {
63
77
  console.log('[Request Chat Error]', err)
64
78
  }
@@ -67,16 +81,6 @@ export function RequestChat ({ onPreChatScreen }) {
67
81
  setErrors(errs)
68
82
  }
69
83
 
70
- const isQuestionLengthValid = QUESTION_MAX_LENGTH >= questionLength
71
- const questionLengthRemaining = QUESTION_MAX_LENGTH - questionLength
72
- const questionLengthExceeded = questionLength - QUESTION_MAX_LENGTH
73
-
74
- let questionHint = `You have ${questionLengthRemaining} characters remaining`
75
-
76
- if (!isQuestionLengthValid) {
77
- questionHint = `You have ${questionLengthExceeded} characters too many`
78
- }
79
-
80
84
  return (
81
85
  <>
82
86
  <PanelHeader />
@@ -148,11 +152,12 @@ export function RequestChat ({ onPreChatScreen }) {
148
152
  </div>
149
153
 
150
154
  <button
151
- className='govuk-button govuk-!-margin-bottom-3 govuk-!-font-size-16'
155
+ className='govuk-button govuk-!-margin-top-1 govuk-!-font-size-16'
152
156
  data-module='govuk-button'
153
157
  onClick={onRequestChat}
158
+ disabled={isButtonDisabled}
154
159
  >
155
- Request chat
160
+ {buttonLabel}
156
161
  </button>
157
162
  </form>
158
163
  </div>
@@ -1,4 +1,3 @@
1
- import * as uuid from 'uuid'
2
1
  import { DateTime } from 'luxon'
3
2
 
4
3
  export const transformMessage = message => {
@@ -18,7 +17,7 @@ export const formatTranscript = messages => {
18
17
  const now = DateTime.local()
19
18
  now.setZone('Europe/London')
20
19
 
21
- let string = `Floodline webchat transcript, ${now.toFormat('HH:mm:ss a, dd LLLL yyyy')}, (ID: ${uuid.v4().split('-')[0]})\n\n`
20
+ let string = `Floodline webchat transcript, ${now.toFormat('HH:mm:ss a, dd LLLL yyyy')}\n\n`
22
21
 
23
22
  for (const message of messages) {
24
23
  const { text, direction, user, assignee, createdAt } = message