@defra/flood-webchat 0.0.1-beta.2 → 0.0.1-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +83 -1
  2. package/dist/client.js +1607 -212
  3. package/dist/client.js.map +1 -1
  4. package/dist/server.js +181 -240
  5. package/dist/server.js.map +1 -1
  6. package/main.scss +4 -3
  7. package/package.json +6 -2
  8. package/src/client/components/availability/availability.jsx +44 -46
  9. package/src/client/components/availability/availability.scss +105 -5
  10. package/src/client/components/chat/chat.jsx +169 -0
  11. package/src/client/components/chat/chat.scss +143 -0
  12. package/src/client/components/errorSummary/error-summary.jsx +34 -0
  13. package/src/client/components/message/message.jsx +20 -0
  14. package/src/client/components/panel/panel-footer.jsx +9 -0
  15. package/src/client/components/panel/panel-header.jsx +41 -0
  16. package/src/client/components/panel/panel.jsx +119 -0
  17. package/src/client/components/panel/panel.scss +72 -0
  18. package/src/client/components/screens/end-chat.jsx +17 -0
  19. package/src/client/components/screens/pre-chat.jsx +65 -0
  20. package/src/client/components/screens/request-chat.jsx +156 -0
  21. package/src/client/components/screens/settings.jsx +67 -0
  22. package/src/client/components/screens/unavailable.jsx +23 -0
  23. package/src/client/hooks/useFocusedElements.js +71 -0
  24. package/src/client/hooks/useTextareaAutosize.js +13 -0
  25. package/src/client/index.jsx +15 -1
  26. package/src/client/lib/check-availability.js +1 -0
  27. package/src/client/lib/message-notification.js +36 -0
  28. package/src/client/lib/transform-messages.js +35 -0
  29. package/src/client/store/AppProvider.jsx +139 -0
  30. package/src/client/store/actions-map.js +119 -0
  31. package/src/client/store/constants.js +3 -0
  32. package/src/client/store/reducer.js +28 -0
  33. package/src/client/store/useApp.js +5 -0
  34. package/src/client/store/useChatSdk.js +37 -0
  35. package/src/server/index.js +15 -6
  36. package/src/server/lib/client.js +31 -35
  37. package/src/server/lib/utils.js +18 -9
  38. package/src/client/lib/external-stores.js +0 -4
  39. package/src/client/lib/external-sync-store.js +0 -42
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","mappings":"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","sources":["webpack://@defra/flood-webchat/./src/server/index.js","webpack://@defra/flood-webchat/./src/server/lib/client.js","webpack://@defra/flood-webchat/./src/server/lib/utils.js","webpack://@defra/flood-webchat/external commonjs \"axios\"","webpack://@defra/flood-webchat/external commonjs \"jwt-decode\"","webpack://@defra/flood-webchat/external commonjs \"querystring\"","webpack://@defra/flood-webchat/webpack/bootstrap","webpack://@defra/flood-webchat/webpack/before-startup","webpack://@defra/flood-webchat/webpack/startup","webpack://@defra/flood-webchat/webpack/after-startup"],"sourcesContent":["const { authenticate, getHost, getIsOpen, getActivity } = require('./lib/client.js')\n\n/**\n * Returns webchat availability\n * @param options {object}\n * @param options.clientId {string}\n * @param options.clientSecret {string}\n * @param options.accessKey {string}\n * @param options.accessSecret {string}\n * @param options.skillEndpoint {string}\n * @param options.hoursEndpoint {string}\n * @param options.maxQueueCount {string}\n * @returns {Promise<{date: Date, availability: (string)}>}\n */\nmodule.exports = async function getAvailability ({\n clientId,\n clientSecret,\n accessKey,\n accessSecret,\n skillEndpoint,\n hoursEndpoint,\n maxQueueCount\n}) {\n const authorisation = 'Basic ' + Buffer.from(`${encodeURIComponent(clientId)}:${encodeURIComponent(clientSecret)}`).toString('base64')\n\n // Cache authentication and re-authenticate when needed (lasts 1 hour?)\n const { tenantId, token, tokenType } = await authenticate({ authorisation, accessKey, accessSecret })\n\n const host = await getHost({ tenantId })\n\n const [{ hasCapacity, hasAgentsAvailable }, isOpen] = await Promise.all([\n getActivity({ tokenType, token, host, skillEndpoint, maxQueueCount }),\n getIsOpen({ token, tokenType, host, hoursEndpoint })\n ])\n\n const isAvailable = isOpen && hasAgentsAvailable && hasCapacity\n const isExistingOnly = isOpen && hasAgentsAvailable && !hasCapacity\n\n let availability = 'UNAVAILABLE'\n\n if (isAvailable) {\n availability = 'AVAILABLE'\n } else if (isExistingOnly) {\n availability = 'EXISTING'\n }\n\n return {\n date: new Date(),\n availability\n }\n}\n","const querystring = require('querystring')\nconst axios = require('axios')\nconst jwtdecode = require('jwt-decode')\nconst { isWithinHours } = require('./utils.js')\n\nconst contentType = 'application/x-www-form-urlencoded'\n\nconst authenticate = async ({ authorisation, accessKey, accessSecret }) => {\n const uri = 'https://cxone.niceincontact.com/auth/token'\n\n const config = {\n signal: AbortSignal.timeout(3000),\n headers: {\n Host: 'eu1.niceincontact.com',\n 'Content-Type': contentType,\n Authorization: authorisation\n }\n }\n\n const body = querystring.stringify({\n grant_type: 'password',\n username: accessKey,\n password: accessSecret\n })\n\n const auth = await axios.post(uri, body, config)\n\n return {\n token: auth.data.access_token,\n tokenType: auth.data.token_type,\n tenantId: jwtdecode(auth.data.id_token)?.tenantId\n }\n}\n\nconst getHost = async ({ tenantId }) => {\n const uri = `https://cxone.niceincontact.com/.well-known/cxone-configuration?tenantId=${tenantId}`\n\n const config = {\n signal: AbortSignal.timeout(3000)\n }\n\n const api = await axios.get(uri, config)\n\n return `api-${api.data.area}.niceincontact.com`\n}\n\nconst getActivity = async ({ tokenType, token, host, skillEndpoint, maxQueueCount }) => {\n const config = {\n signal: AbortSignal.timeout(3000),\n headers: {\n Host: host,\n Authorization: `${tokenType} ${token}`,\n 'Content-Type': contentType\n }\n }\n const uri = `https://${host}${skillEndpoint}`\n\n const skill = await axios.get(uri, config)\n\n const activity = skill.data.skillActivity[0]\n\n return {\n hasCapacity: activity.queueCount < maxQueueCount,\n hasAgentsAvailable: activity.agentsAvailable >= 1\n }\n}\n\nconst getIsOpen = async ({ host, token, tokenType, hoursEndpoint }) => {\n const config = {\n signal: AbortSignal.timeout(3000),\n headers: {\n Host: 'api-l36.niceincontact.com',\n Authorization: `${tokenType} ${token}`,\n 'Content-Type': contentType\n }\n }\n\n const uri = `https://${host}${hoursEndpoint}`\n\n const hours = await axios.get(uri, config)\n\n const days = hours.data.resultSet.hoursOfOperationProfiles[0].days\n\n return isWithinHours(days)\n}\n\nmodule.exports = {\n authenticate,\n getHost,\n getIsOpen,\n getActivity\n}\n","const isWithinHours = days => {\n const now = new Date()\n const name = now.toLocaleDateString('en-GB', { weekday: 'long' })\n const day = days.find(d => d.day.toLowerCase() === name.toLowerCase())\n const date = now.toLocaleDateString('en-GB').split('/')\n const open = `${date[2]}-${date[1]}-${date[0]}T${day.openTime}.000Z`\n const close = `${date[2]}-${date[1]}-${date[0]}T${day.closeTime}.000Z`\n\n return now.getTime() >= Date.parse(open) && now.getTime() <= Date.parse(close)\n}\n\nmodule.exports = {\n isWithinHours\n}\n","module.exports = require(\"axios\");","module.exports = require(\"jwt-decode\");","module.exports = require(\"querystring\");","// 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","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/server/index.js\");\n",""],"names":["_regeneratorRuntime","exports","Op","Object","prototype","hasOwn","hasOwnProperty","defineProperty","obj","key","desc","value","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","enumerable","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","protoGenerator","Generator","generator","create","context","Context","makeInvokeMethod","tryCatch","fn","arg","type","call","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","method","_invoke","AsyncIterator","PromiseImpl","invoke","resolve","reject","record","result","_typeof","__await","then","unwrapped","error","previousPromise","callInvokeWithMethodAndArg","state","Error","done","delegate","delegateResult","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","methodName","undefined","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","length","i","displayName","isGeneratorFunction","genFun","ctor","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","iter","keys","val","object","reverse","pop","skipTempReset","prev","charAt","slice","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","_catch","thrown","delegateYield","_slicedToArray","arr","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","o","minLen","_arrayLikeToArray","n","toString","Array","from","test","len","arr2","_i","_s","_e","_x","_r","_arr","_n","_d","isArray","asyncGeneratorStep","gen","_next","_throw","_asyncToGenerator","args","arguments","apply","_require","require","authenticate","getHost","getIsOpen","getActivity","module","_getAvailability","_callee","_ref","clientId","clientSecret","accessKey","accessSecret","skillEndpoint","hoursEndpoint","maxQueueCount","authorisation","_yield$authenticate","tenantId","token","tokenType","host","_yield$Promise$all","_yield$Promise$all2","_yield$Promise$all2$","hasCapacity","hasAgentsAvailable","isOpen","isAvailable","isExistingOnly","availability","_callee$","_context","Buffer","concat","encodeURIComponent","all","date","Date","getAvailability","querystring","axios","jwtdecode","isWithinHours","contentType","_ref2","_jwtdecode","uri","config","body","auth","signal","AbortSignal","timeout","headers","Host","Authorization","stringify","grant_type","username","password","post","data","access_token","token_type","id_token","_ref4","_callee2","_ref3","api","_callee2$","_context2","get","area","_x2","_ref6","_callee3","_ref5","skill","activity","_callee3$","_context3","skillActivity","queueCount","agentsAvailable","_x3","_ref8","_callee4","_ref7","hours","days","_callee4$","_context4","resultSet","hoursOfOperationProfiles","_x4","now","toLocaleDateString","weekday","day","find","d","toLowerCase","split","open","openTime","close","closeTime","getTime","parse"],"sourceRoot":""}
1
+ {"version":3,"file":"server.js","mappings":"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","sources":["webpack://@defra/flood-webchat/./src/server/index.js","webpack://@defra/flood-webchat/./src/server/lib/client.js","webpack://@defra/flood-webchat/./src/server/lib/utils.js","webpack://@defra/flood-webchat/external commonjs \"axios\"","webpack://@defra/flood-webchat/external commonjs \"jwt-decode\"","webpack://@defra/flood-webchat/external commonjs \"luxon\"","webpack://@defra/flood-webchat/external commonjs \"querystring\"","webpack://@defra/flood-webchat/webpack/bootstrap","webpack://@defra/flood-webchat/webpack/before-startup","webpack://@defra/flood-webchat/webpack/startup","webpack://@defra/flood-webchat/webpack/after-startup"],"sourcesContent":["const { authenticate, getApiBaseUrl, getIsOpen, getActivity } = require('./lib/client.js')\n\n/**\n * Returns webchat availability\n * @param options {object}\n * @param options.clientId {string}\n * @param options.clientSecret {string}\n * @param options.accessKey {string}\n * @param options.accessSecret {string}\n * @param options.skillEndpoint {string}\n * @param options.hoursEndpoint {string}\n * @param options.authenticationUri {string}\n * @param options.wellKnownUri {string}\n * @param options.maxQueueCount {string}\n * @returns {Promise<{date: Date, availability: (string)}>}\n */\nmodule.exports = async function getAvailability ({\n clientId,\n clientSecret,\n accessKey,\n accessSecret,\n maxQueueCount,\n skillEndpoint,\n hoursEndpoint,\n wellKnownUri = 'https://cxone.niceincontact.com/.well-known/cxone-configuration',\n authenticationUri = 'https://cxone.niceincontact.com/auth/token'\n}) {\n const authorisation = 'Basic ' + Buffer.from(`${encodeURIComponent(clientId)}:${encodeURIComponent(clientSecret)}`).toString('base64')\n\n // Cache authentication and re-authenticate when needed (lasts 1 hour?)\n const { tenantId, token, tokenType } = await authenticate({\n authenticationUri,\n authorisation,\n accessKey,\n accessSecret\n })\n\n const apiBaseUrl = await getApiBaseUrl({ wellKnownUri, tenantId })\n\n const [{ hasCapacity, hasAgentsAvailable }, isOpen] = await Promise.all([\n getActivity({ baseUrl: apiBaseUrl, tokenType, token, skillEndpoint, maxQueueCount }),\n getIsOpen({ baseUrl: apiBaseUrl, token, tokenType, hoursEndpoint })\n ])\n\n const isAvailable = isOpen && hasAgentsAvailable && hasCapacity\n const isExistingOnly = isOpen && hasAgentsAvailable && !hasCapacity\n\n let availability = 'UNAVAILABLE'\n\n if (isAvailable) {\n availability = 'AVAILABLE'\n } else if (isExistingOnly) {\n availability = 'EXISTING'\n }\n\n return {\n date: new Date(),\n availability\n }\n}\n","const querystring = require('querystring')\nconst axios = require('axios')\nconst jwtdecode = require('jwt-decode')\nconst { isWithinHours } = require('./utils.js')\n\nconst contentType = 'application/x-www-form-urlencoded'\n\nconst authenticate = async ({ authenticationUri, authorisation, accessKey, accessSecret }) => {\n const url = new URL(authenticationUri)\n const body = querystring.stringify({\n grant_type: 'password',\n username: accessKey,\n password: accessSecret\n })\n\n const auth = await axios.post(url.href, body, {\n signal: AbortSignal.timeout(3000),\n headers: {\n Host: url.host,\n 'Content-Type': contentType,\n Authorization: authorisation\n }\n })\n\n return {\n token: auth.data.access_token,\n tokenType: auth.data.token_type,\n tenantId: jwtdecode(auth.data.id_token)?.tenantId\n }\n}\n\nconst getApiBaseUrl = async ({ wellKnownUri, tenantId }) => {\n const url = new URL(wellKnownUri)\n url.searchParams.set('tenantId', tenantId)\n\n const { data } = await axios.get(url.href, {\n headers: {\n Host: url.host\n },\n signal: AbortSignal.timeout(3000)\n })\n\n return data.api_endpoint\n}\n\nconst getActivity = async ({ tokenType, token, baseUrl, skillEndpoint, maxQueueCount }) => {\n const url = new URL(skillEndpoint, baseUrl)\n\n const skill = await axios.get(url.href, {\n signal: AbortSignal.timeout(3000),\n headers: {\n Host: url.host,\n Authorization: `${tokenType} ${token}`,\n 'Content-Type': contentType\n }\n })\n\n const activity = skill.data.skillActivity[0]\n\n return {\n hasCapacity: activity.queueCount < maxQueueCount,\n hasAgentsAvailable: activity.agentsAvailable >= 1\n }\n}\n\nconst getIsOpen = async ({ baseUrl, token, tokenType, hoursEndpoint }) => {\n const url = new URL(hoursEndpoint, baseUrl)\n\n const hours = await axios.get(url.href, {\n signal: AbortSignal.timeout(3000),\n headers: {\n Host: url.host,\n Authorization: `${tokenType} ${token}`,\n 'Content-Type': contentType\n }\n })\n\n const days = hours.data.resultSet.hoursOfOperationProfiles[0].days\n\n return isWithinHours(days)\n}\n\nmodule.exports = {\n authenticate,\n getApiBaseUrl,\n getIsOpen,\n getActivity\n}\n","const { DateTime } = require('luxon')\n\nconst getHour = time => Number(time.split(':')[0])\n\nconst isWithinHours = (days, date) => {\n const now = date ? DateTime.fromISO(date) : DateTime.local()\n now.setZone('Europe/London')\n\n const newDate = date ? new Date(date) : new Date()\n\n const today = newDate.toLocaleDateString('en-GB', { weekday: 'long' })\n const dateParts = newDate.toLocaleDateString('en-GB').split('/')\n\n const todaysAvailability = days.find(item => item.day === today)\n const todaysDateTimeOpen = DateTime.local(Number(dateParts[2]), Number(dateParts[1]), Number(dateParts[0]), getHour(todaysAvailability.openTime))\n const todaysDateTimeClose = DateTime.local(Number(dateParts[2]), Number(dateParts[1]), Number(dateParts[0]), getHour(todaysAvailability.closeTime))\n\n return now.diff(todaysDateTimeOpen).milliseconds >= 0 && now.diff(todaysDateTimeClose).milliseconds <= 0\n}\n\nmodule.exports = {\n isWithinHours\n}\n","module.exports = require(\"axios\");","module.exports = require(\"jwt-decode\");","module.exports = require(\"luxon\");","module.exports = require(\"querystring\");","// 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","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/server/index.js\");\n",""],"names":["authenticate","getApiBaseUrl","getIsOpen","getActivity","require","module","exports","getAvailability","clientId","clientSecret","accessKey","accessSecret","maxQueueCount","skillEndpoint","hoursEndpoint","wellKnownUri","authenticationUri","authorisation","Buffer","from","encodeURIComponent","toString","tenantId","token","tokenType","apiBaseUrl","hasCapacity","hasAgentsAvailable","isOpen","Promise","all","baseUrl","isAvailable","isExistingOnly","availability","date","Date","querystring","axios","jwtdecode","isWithinHours","contentType","url","URL","body","stringify","grant_type","username","password","auth","post","href","signal","AbortSignal","timeout","headers","Host","host","Authorization","data","access_token","token_type","id_token","searchParams","set","get","api_endpoint","skill","activity","skillActivity","queueCount","agentsAvailable","hours","days","resultSet","hoursOfOperationProfiles","DateTime","getHour","time","Number","split","now","fromISO","local","setZone","newDate","today","toLocaleDateString","weekday","dateParts","todaysAvailability","find","item","day","todaysDateTimeOpen","openTime","todaysDateTimeClose","closeTime","diff","milliseconds"],"sourceRoot":""}
package/main.scss CHANGED
@@ -1,11 +1,12 @@
1
1
 
2
2
  // Required GOVUK Styles
3
- @import "node_modules/govuk-frontend/govuk/core/typography";
4
- @import "node_modules/govuk-frontend/govuk/utilities/visually-hidden";
3
+ @import "govuk-frontend/govuk/core/typography";
4
+ @import "govuk-frontend/govuk/utilities/visually-hidden";
5
5
 
6
6
  // Components
7
7
  @import "./src/client/components/availability/availability";
8
-
8
+ @import "./src/client/components/panel/panel";
9
+ @import "./src/client/components/chat/chat";
9
10
 
10
11
  .wc-scroll-padding {
11
12
  scroll-padding-bottom: calc(2rem + 20px);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra/flood-webchat",
3
- "version": "0.0.1-beta.2",
3
+ "version": "0.0.1-beta.21",
4
4
  "description": "",
5
5
  "main": "dist/server.js",
6
6
  "browser": "dist/client.js",
@@ -30,6 +30,7 @@
30
30
  "@babel/core": "^7.22.10",
31
31
  "@babel/preset-env": "^7.22.10",
32
32
  "@babel/preset-react": "^7.22.15",
33
+ "@testing-library/jest-dom": "^6.1.3",
33
34
  "@testing-library/react": "^14.0.0",
34
35
  "@testing-library/user-event": "^14.5.1",
35
36
  "@types/jest": "^29.5.4",
@@ -58,10 +59,13 @@
58
59
  "govuk-frontend": "^4.0.0"
59
60
  },
60
61
  "dependencies": {
62
+ "@nice-devone/nice-cxone-chat-web-sdk": "^1.3.0",
61
63
  "axios": "^1.5.0",
62
64
  "jwt-decode": "^3.1.2",
65
+ "luxon": "^3.4.3",
63
66
  "querystring": "^0.2.1",
64
67
  "react": "^18.2.0",
65
- "react-dom": "^18.2.0"
68
+ "react-dom": "^18.2.0",
69
+ "uuid": "^9.0.1"
66
70
  }
67
71
  }
@@ -1,70 +1,90 @@
1
1
  import React, { useEffect, useRef, useState } from 'react'
2
+
2
3
  import { classnames } from '../../lib/classnames'
3
- import { useMessageThread, useWebchatOpenState } from '../../lib/external-stores'
4
+ import { Panel } from '../panel/panel.jsx'
5
+ import { useApp } from '../../store/useApp'
6
+
7
+ export function Availability () {
8
+ const { availability, messages, isChatOpen, setChatVisibility, unseenCount } = useApp()
4
9
 
5
- export function Availability (props) {
6
- const [isOpen, setOpen] = useWebchatOpenState()
7
- const [isFixed, setFixed] = useState(false)
10
+ const [isFixed, setIsFixed] = useState(false)
8
11
  const buttonRef = useRef()
12
+
9
13
  const onClick = () => {
10
- setOpen(!isOpen)
14
+ setChatVisibility(!isChatOpen)
11
15
  }
16
+
12
17
  const onKeyDown = event => {
13
18
  if (event.key === ' ') {
14
19
  event.preventDefault()
15
20
  }
16
21
  }
22
+
17
23
  const onKeyUp = event => {
18
24
  if (event.key === ' ') {
19
- setOpen(!isOpen)
25
+ setChatVisibility(!isChatOpen)
20
26
  }
21
27
  }
22
28
 
23
29
  const intersectionCallback = entries => {
24
30
  const [entry] = entries
25
31
  const isBelowFold = !entry.isIntersecting && entry.boundingClientRect.top > 0
26
- setFixed(!isOpen && isBelowFold)
32
+ setIsFixed(!isChatOpen && isBelowFold)
27
33
  }
28
34
 
29
35
  useEffect(() => {
30
36
  const observer = new window.IntersectionObserver(intersectionCallback, {
31
37
  rootMargin: '35px'
32
38
  })
39
+
33
40
  const parentElement = buttonRef.current?.parentElement
41
+
34
42
  if (parentElement) {
35
43
  observer.observe(parentElement)
36
44
  }
45
+
37
46
  return () => {
38
47
  if (parentElement) {
39
48
  observer.unobserve(parentElement)
40
49
  }
41
50
  }
42
- }, [buttonRef, isOpen])
51
+ }, [buttonRef, isChatOpen])
43
52
 
44
53
  useEffect(() => {
45
54
  document.documentElement.classList.toggle('wc-scroll-padding', isFixed)
46
55
  document.body.classList.toggle('wc-scroll-padding', isFixed)
47
56
  }, [isFixed])
48
57
 
49
- switch (props.availability) {
58
+ let TextComponent = (<>Show Chat</>)
59
+
60
+ if (!messages.length) {
61
+ TextComponent = (<>Start Chat</>)
62
+ }
63
+
64
+ switch (availability) {
50
65
  case 'AVAILABLE':
51
66
  return (
52
- <div
53
- className={classnames('wc-availability', isFixed && 'wc-availability--fixed')}
54
- ref={buttonRef}
55
- >
56
- <div className='wc-availability__inner'>
57
- <a
58
- className='wc-availability__link'
59
- href='#webchat' role='button' draggable='false'
60
- onClick={onClick}
61
- onKeyUp={onKeyUp}
62
- onKeyDown={onKeyDown}
63
- >
64
- <AvailabilityContent />
65
- </a>
67
+ <>
68
+ <div
69
+ className={classnames('wc-availability', isFixed && 'wc-availability--fixed', isChatOpen && 'wc-open')}
70
+ ref={buttonRef}
71
+ >
72
+ <div className='wc-availability__inner'>
73
+ <a
74
+ className='wc-availability__link'
75
+ href='#webchat'
76
+ draggable='false'
77
+ onClick={onClick}
78
+ onKeyUp={onKeyUp}
79
+ onKeyDown={onKeyDown}
80
+ >
81
+ {TextComponent}
82
+ {unseenCount > 0 && !isChatOpen ? <span className='wc-open-btn__unseen'>{unseenCount}</span> : null}
83
+ </a>
84
+ </div>
66
85
  </div>
67
- </div>
86
+ {isChatOpen && <Panel />}
87
+ </>
68
88
  )
69
89
  case 'EXISTING':
70
90
  case 'UNAVAILABLE':
@@ -77,25 +97,3 @@ export function Availability (props) {
77
97
  )
78
98
  }
79
99
  }
80
-
81
- function AvailabilityContent () {
82
- const [thread] = useMessageThread()
83
- const unreadMessageCount = thread.filter(message => !message.read).length
84
- if (!thread.length) {
85
- return (
86
- <>
87
- Start Chat
88
- </>
89
- )
90
- }
91
- return (
92
- <>
93
- Show Chat {!!unreadMessageCount && (
94
- <>
95
- <span className='wc-availability__unseen'>{unreadMessageCount}</span>
96
- <span className='govuk-visually-hidden'> {unreadMessageCount === 1 ? 'new message' : 'new messages'}</span>
97
- </>
98
- )}
99
- </>
100
- )
101
- }
@@ -34,10 +34,6 @@
34
34
  margin-bottom: 0;
35
35
  fill: govuk-colour('black');
36
36
 
37
- @include mq ($from: tablet) {
38
- margin-right: 10px;
39
- }
40
-
41
37
  .govuk-visually-hidden, .wc-availability__unseen {
42
38
  pointer-events: none;
43
39
  }
@@ -86,4 +82,108 @@
86
82
  padding-left: 7px;
87
83
  padding-right: 7px;
88
84
  }
89
- }
85
+ }
86
+
87
+ // Define a mixin for the common styles
88
+ @mixin link-icon-styles {
89
+ position: relative;
90
+ display: inline-block;
91
+ margin-right: 5px;
92
+ fill: govuk-colour('black');
93
+ @include govuk-font($size: 19);
94
+
95
+ &:last-of-type {
96
+ margin-right: 0;
97
+ }
98
+
99
+ @include mq ($from: tablet) {
100
+ margin-right: 10px;
101
+ }
102
+
103
+ &__icon {
104
+ color: govuk-colour('black');
105
+ }
106
+
107
+ svg {
108
+ position: relative;
109
+ display: inline-block;
110
+ color: currentcolor;
111
+ vertical-align: top;
112
+ margin-right: 7px;
113
+ top: 1px;
114
+
115
+ @include mq ($from: tablet) {
116
+ margin-right: 8px;
117
+ top: 4px;
118
+ }
119
+ }
120
+
121
+ &:hover {
122
+ color: $govuk-link-hover-colour;
123
+ }
124
+
125
+ &:active {
126
+ color: govuk-colour('black');
127
+ }
128
+ }
129
+
130
+ .defra-link-icon {
131
+ @include link-icon-styles;
132
+ }
133
+
134
+ .wc-open-btn {
135
+ @include link-icon-styles;
136
+ margin-bottom: 0;
137
+
138
+ &:visited {
139
+ color: $govuk-link-colour;
140
+ }
141
+
142
+ span {
143
+ pointer-events: none;
144
+ }
145
+
146
+ svg {
147
+ @include mq ($from: 'tablet') {
148
+ top: 3px;
149
+ }
150
+ color: govuk-colour('black');
151
+ pointer-events: none;
152
+ }
153
+
154
+ &:focus {
155
+ box-shadow: none;
156
+ background-color: transparent;
157
+ text-decoration: underline;
158
+ color: $govuk-focus-colour;
159
+ }
160
+
161
+ &:hover:not(:focus):not(:active) {
162
+ color: $govuk-link-hover-colour;
163
+
164
+ svg {
165
+ color: govuk-colour('dark-blue');
166
+ }
167
+
168
+ .wc-open-btn__unseen {
169
+ background-color: govuk-colour('dark-blue');
170
+ }
171
+ }
172
+
173
+ &__unseen {
174
+ display: inline-block;
175
+ position: relative;
176
+ border-radius: 10px;
177
+ background-color: govuk-colour('black');
178
+ color: #ffffff;
179
+ font-weight: bold;
180
+ font-size: 14px;
181
+ padding: 0 6px;
182
+ margin-left: 5px;
183
+ @include mq ($from: tablet) {
184
+ top: -1px;
185
+ padding-left: 7px;
186
+ padding-right: 7px;
187
+ }
188
+ }
189
+ }
@@ -0,0 +1,169 @@
1
+ import React, { useEffect, useRef, useState } from 'react'
2
+
3
+ import { PanelHeader } from '../panel/panel-header.jsx'
4
+ import { PanelFooter } from '../panel/panel-footer.jsx'
5
+ import { Message } from '../message/message.jsx'
6
+
7
+ import { useApp } from '../../store/useApp.js'
8
+ import { useTextareaAutosize } from '../../hooks/useTextareaAutosize.js'
9
+ import { formatTranscript } from '../../lib/transform-messages.js'
10
+
11
+ export function Chat ({ onEndChatScreen, onSettingsScreen }) {
12
+ const { availability, thread, messages, agent, agentStatus, isAgentTyping, settings } = useApp()
13
+
14
+ const [userMessage, setUserMessage] = useState('')
15
+
16
+ const messageRef = useRef()
17
+
18
+ useTextareaAutosize(messageRef.current, userMessage)
19
+
20
+ useEffect(() => {
21
+ if (settings.scroll && messages.length !== 0) {
22
+ const chatBody = document.querySelector('.wc-body')
23
+ chatBody.scrollTop = chatBody.scrollHeight
24
+ }
25
+ }, [messages, isAgentTyping])
26
+
27
+ useEffect(() => {
28
+ const label = document.querySelector('.wc-form__label')
29
+
30
+ if (userMessage.length === 0) {
31
+ label.classList.remove('govuk-visually-hidden')
32
+ } else {
33
+ label.classList.add('govuk-visually-hidden')
34
+ }
35
+ }, [userMessage])
36
+
37
+ const onChange = e => {
38
+ setUserMessage(e.target?.value)
39
+ }
40
+
41
+ const agentName = agent?.nickname || agent?.firstName
42
+
43
+ let connectionHeadlineText = 'Connecting to Floodline'
44
+
45
+ if (agentStatus === 'closed') {
46
+ connectionHeadlineText = agentName ? `${agentName} ended the session` : 'Session ended by advisor'
47
+ } else if (agentStatus) {
48
+ if (agentName) {
49
+ connectionHeadlineText = `You are speaking with ${agentName}`
50
+ } else {
51
+ connectionHeadlineText = 'No advisers currently available'
52
+ }
53
+ }
54
+
55
+ if (availability === 'UNAVAILABLE') {
56
+ connectionHeadlineText = 'Webchat is not currently available'
57
+ }
58
+
59
+ const sendMessage = e => {
60
+ e.preventDefault()
61
+
62
+ if (messageRef.current.value.length === 0) {
63
+ return
64
+ }
65
+
66
+ try {
67
+ thread.sendTextMessage(messageRef.current.value.trim())
68
+ } catch (err) {
69
+ console.log('[Chat Error] sendMessage', err)
70
+ }
71
+
72
+ setUserMessage('')
73
+ }
74
+
75
+ const saveChat = () => {
76
+ const transcript = formatTranscript(messages)
77
+
78
+ const saveChatLink = document.querySelector('#transcript-download')
79
+
80
+ saveChatLink.setAttribute('href', `data:text/plain;charset=utf-8,${transcript}`)
81
+ saveChatLink.click()
82
+ }
83
+
84
+ return (
85
+ <>
86
+ <PanelHeader />
87
+
88
+ <div className='wc-status'>
89
+ <p className='wc-status__availability govuk-body-s'>{connectionHeadlineText}</p>
90
+ <a className='wc-status__link govuk-!-font-size-16' href='#' data-module='govuk-button' onClick={onEndChatScreen}>End chat</a>
91
+ </div>
92
+
93
+ <div className='wc-body'>
94
+ <div className='wc-chat__body'>
95
+ <ul className='wc-chat__messages'>
96
+ {messages.length
97
+ ? messages.map((msg, index) => <Message key={msg.id} message={msg} previousMessage={messages[index - 1]} />)
98
+ : null}
99
+ {isAgentTyping
100
+ ? (
101
+ <li className='wc-chat__message govuk-body outbound'>
102
+ <div className='wc-chat__from govuk-!-font-size-14'>{agentName} is typing</div>
103
+ <div className='wc-chat__text outbound'>
104
+ <svg width='28' height='16' x='0px' y='0px' viewBox='0 0 28 16'>
105
+ <circle stroke='none' cx='3' cy='8' r='3' fill='currentColor' />
106
+ <circle stroke='none' cx='14' cy='8' r='3' fill='currentColor' />
107
+ <circle stroke='none' cx='25' cy='8' r='3' fill='currentColor' />
108
+ </svg>
109
+ </div>
110
+ </li>
111
+ )
112
+ : null}
113
+ </ul>
114
+ </div>
115
+ </div>
116
+
117
+ <PanelFooter>
118
+ <div className='wc-footer__input'>
119
+ <form className='wc-form' noValidate>
120
+ <label className='govuk-label wc-form__label govuk-!-font-size-16' htmlFor='wc-form-textarea'>
121
+ Your message<span className='govuk-visually-hidden'> (enter key submits)</span>
122
+ </label>
123
+
124
+ <textarea
125
+ ref={messageRef}
126
+ rows='1'
127
+ aria-required='true'
128
+ className='wc-form__textarea govuk-textarea govuk-!-font-size-16'
129
+ id='wc-form-textarea'
130
+ name='message'
131
+ onChange={onChange}
132
+ value={userMessage}
133
+ />
134
+
135
+ <input
136
+ type='submit'
137
+ className='wc-form__button govuk-button govuk-!-font-size-16'
138
+ value='Send'
139
+ data-prevent-double-click='true'
140
+ onClick={sendMessage}
141
+ />
142
+ </form>
143
+ </div>
144
+
145
+ <div className='wc-footer__settings'>
146
+ <a
147
+ href='#'
148
+ id='wc-settings'
149
+ className='wc-footer__settings-link'
150
+ data-module='govuk-button'
151
+ onClick={onSettingsScreen}
152
+ >
153
+ Settings
154
+ </a>
155
+ <a
156
+ href='#'
157
+ id='transcript-download'
158
+ className='wc-footer__settings-link'
159
+ data-module='govuk-button'
160
+ download='floodline-webchat-transcript.txt'
161
+ onClick={saveChat}
162
+ >
163
+ Save chat
164
+ </a>
165
+ </div>
166
+ </PanelFooter>
167
+ </>
168
+ )
169
+ }