@seamly/web-ui 19.0.0-beta.3 → 19.1.2

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 (64) hide show
  1. package/build/dist/lib/index.debug.js +149 -61
  2. package/build/dist/lib/index.debug.min.js +1 -1
  3. package/build/dist/lib/index.debug.min.js.LICENSE.txt +40 -8
  4. package/build/dist/lib/index.js +494 -416
  5. package/build/dist/lib/index.min.js +1 -1
  6. package/build/dist/lib/standalone.js +582 -435
  7. package/build/dist/lib/standalone.min.js +1 -1
  8. package/build/dist/lib/style-guide.js +1880 -1795
  9. package/build/dist/lib/style-guide.min.js +1 -1
  10. package/package.json +1 -1
  11. package/src/javascripts/api/errors/seamly-base-error.js +10 -0
  12. package/src/javascripts/api/errors/seamly-configuration-error.js +4 -6
  13. package/src/javascripts/api/errors/seamly-general-error.js +4 -6
  14. package/src/javascripts/api/errors/seamly-offline-error.js +4 -6
  15. package/src/javascripts/api/errors/seamly-session-expired-error.js +4 -6
  16. package/src/javascripts/api/errors/seamly-unauthorized-error.js +4 -6
  17. package/src/javascripts/api/errors/seamly-unavailable-error.js +17 -0
  18. package/src/javascripts/api/index.js +10 -11
  19. package/src/javascripts/domains/app/actions.js +27 -17
  20. package/src/javascripts/domains/app/index.js +2 -1
  21. package/src/javascripts/domains/config/reducer.js +1 -0
  22. package/src/javascripts/domains/config/selectors.js +1 -1
  23. package/src/javascripts/domains/errors/index.js +32 -0
  24. package/src/javascripts/domains/i18n/reducer.js +6 -0
  25. package/src/javascripts/domains/interrupt/middleware.js +12 -9
  26. package/src/javascripts/domains/interrupt/reducer.js +10 -9
  27. package/src/javascripts/domains/store/index.js +7 -2
  28. package/src/javascripts/domains/store/state-reducer.js +10 -6
  29. package/src/javascripts/domains/visibility/actions.js +73 -0
  30. package/src/javascripts/domains/visibility/constants.js +8 -0
  31. package/src/javascripts/domains/visibility/hooks.js +24 -0
  32. package/src/javascripts/domains/visibility/index.js +8 -0
  33. package/src/javascripts/domains/visibility/reducer.js +19 -0
  34. package/src/javascripts/domains/visibility/selectors.js +9 -0
  35. package/src/javascripts/domains/visibility/utils.js +42 -0
  36. package/src/javascripts/index.js +3 -12
  37. package/src/javascripts/lib/engine/index.js +1 -0
  38. package/src/javascripts/lib/redux-helpers/index.js +1 -5
  39. package/src/javascripts/style-guide/components/app.js +1 -1
  40. package/src/javascripts/style-guide/components/static-core.js +13 -0
  41. package/src/javascripts/style-guide/states.js +48 -21
  42. package/src/javascripts/ui/components/conversation/conversation.js +2 -2
  43. package/src/javascripts/ui/components/conversation/event/hooks/use-text-rendering.js +1 -8
  44. package/src/javascripts/ui/components/conversation/event/text.js +19 -13
  45. package/src/javascripts/ui/components/core/seamly-core.js +3 -0
  46. package/src/javascripts/ui/components/core/seamly-event-subscriber.js +3 -3
  47. package/src/javascripts/ui/components/core/seamly-initializer.js +2 -6
  48. package/src/javascripts/ui/components/core/seamly-instance-functions-loader.js +2 -3
  49. package/src/javascripts/ui/components/core/seamly-new-notifications.js +2 -2
  50. package/src/javascripts/ui/components/core/seamly-read-state.js +2 -2
  51. package/src/javascripts/ui/components/entry/toggle-button.js +2 -2
  52. package/src/javascripts/ui/components/layout/agent-info.js +2 -2
  53. package/src/javascripts/ui/components/layout/app-frame.js +2 -3
  54. package/src/javascripts/ui/components/layout/chat-frame.js +2 -2
  55. package/src/javascripts/ui/components/layout/modal-wrapper.js +3 -6
  56. package/src/javascripts/ui/components/layout/view.js +3 -6
  57. package/src/javascripts/ui/hooks/seamly-hooks.js +0 -2
  58. package/src/javascripts/ui/hooks/use-seamly-chat.js +3 -5
  59. package/src/javascripts/ui/hooks/use-seamly-commands.js +7 -29
  60. package/src/javascripts/ui/hooks/use-seamly-idle-detach-countdown.js +2 -2
  61. package/src/javascripts/ui/utils/general-utils.js +0 -9
  62. package/src/javascripts/ui/utils/seamly-utils.js +0 -66
  63. package/src/javascripts/ui/hooks/use-seamly-stored-visibility.js +0 -31
  64. package/src/javascripts/ui/hooks/use-seamly-visibility.js +0 -98
@@ -3,32 +3,24 @@ import {
3
3
  useSeamlyApiContext,
4
4
  useSeamlyHasConversation,
5
5
  } from './seamly-api-hooks'
6
- import {
7
- useSeamlyStateContext,
8
- useSeamlyUnreadCount,
9
- } from './seamly-state-hooks'
6
+ import { useSeamlyUnreadCount } from './seamly-state-hooks'
10
7
  import useSeamlyDispatchContext from './use-seamly-dispatch'
11
8
  import { SeamlyEventBusContext } from '../components/core/seamly-api-context'
12
9
  import { randomId } from '../../lib/id'
13
10
  import { userParticipantId } from '../../config'
14
- import { sanitizeText } from '../utils/general-utils'
15
11
  import { actionTypes, seamlyActions } from '../utils/seamly-utils'
16
12
  import { useStableCallback } from './utility-hooks'
17
13
  import { Actions as InterruptActions } from '../../domains/interrupt'
18
14
  import { useConfig } from '../../domains/config'
19
- import { useUserHasResponded } from '../../domains/app'
15
+ import { useUserHasResponded, Actions as AppActions } from '../../domains/app'
16
+ import { useVisibility } from '../../domains/visibility'
20
17
 
21
18
  const {
22
19
  ADD_EVENT,
23
- CLEAR_EVENTS,
24
20
  SET_IS_LOADING,
25
- CLEAR_PARTICIPANTS,
26
21
  SET_HEADER_SUB_TITLE,
27
22
  SET_INITIAL_STATE,
28
- CLEAR_FEATURES,
29
23
  SET_FEATURES,
30
- RESET_UPLOAD_STATE,
31
- RESET_ENTRY_STATE,
32
24
  } = seamlyActions
33
25
 
34
26
  const useSeamlyCommands = () => {
@@ -39,7 +31,7 @@ const useSeamlyCommands = () => {
39
31
 
40
32
  const hasResponded = useUserHasResponded()
41
33
  const hasConversation = useSeamlyHasConversation()
42
- const { visible: visibility } = useSeamlyStateContext()
34
+ const { visible: visibility } = useVisibility()
43
35
  const unreadMessageCount = useSeamlyUnreadCount()
44
36
 
45
37
  const emitEvent = useCallback(
@@ -75,18 +67,13 @@ const useSeamlyCommands = () => {
75
67
  ])
76
68
 
77
69
  const reset = useCallback(async () => {
70
+ dispatch(AppActions.reset())
78
71
  dispatch(InterruptActions.clear())
79
- dispatch({ type: CLEAR_EVENTS })
72
+
80
73
  dispatch({
81
74
  type: SET_IS_LOADING,
82
75
  isLoading: true,
83
76
  })
84
- dispatch({
85
- type: CLEAR_PARTICIPANTS,
86
- })
87
- dispatch({ type: RESET_UPLOAD_STATE })
88
- dispatch({ type: RESET_ENTRY_STATE })
89
- dispatch({ type: CLEAR_FEATURES })
90
77
 
91
78
  const { agentName } = appConfig.defaults || {}
92
79
 
@@ -143,20 +130,11 @@ const useSeamlyCommands = () => {
143
130
  ...config,
144
131
  }
145
132
 
146
- const sanitizedText = sanitizeText(body)
147
-
148
- const sanitizedMessage = {
149
- ...message,
150
- body: {
151
- text: sanitizedText,
152
- },
153
- }
154
-
155
133
  api.send('message', message)
156
134
  emitEvent('message', message)
157
135
  dispatch({
158
136
  type: ADD_EVENT,
159
- event: { type: 'message', payload: sanitizedMessage },
137
+ event: { type: 'message', payload: message },
160
138
  })
161
139
  },
162
140
  [api, dispatch, emitEvent, getTextMessageBase],
@@ -10,7 +10,7 @@ import {
10
10
  } from '../utils/general-utils'
11
11
  import { actionTypes, seamlyActions } from '../utils/seamly-utils'
12
12
  import { screenReaderDebounceDelaySeconds } from '../../config'
13
- import useSeamlyVisibility from './use-seamly-visibility'
13
+ import { useVisibility } from '../../domains/visibility'
14
14
 
15
15
  const {
16
16
  CLEAR_IDLE_DETACH_COUNTDOWN,
@@ -24,7 +24,7 @@ const useSeamlyIdleDetachCountdown = () => {
24
24
 
25
25
  const { idleDetachCountdown } = useSeamlyStateContext()
26
26
 
27
- const { isOpen: isSeamlyOpen } = useSeamlyVisibility()
27
+ const { isOpen: isSeamlyOpen } = useVisibility()
28
28
 
29
29
  const stableState = useRef({})
30
30
 
@@ -87,15 +87,6 @@ export const microsecondsToMilliseconds = (microseconds) => {
87
87
  return Math.ceil(microseconds / 1000)
88
88
  }
89
89
 
90
- export const sanitizeText = (text) =>
91
- text
92
- .replace(/&/g, '&')
93
- .replace(/</g, '&lt;')
94
- .replace(/>/g, '&gt;')
95
- .replace(/"/g, '&quot;')
96
- .replace(/'/g, '&#39;')
97
- .replace(/\//g, '&#x2F;')
98
-
99
90
  export const getTimeFromSeconds = (seconds) => {
100
91
  const minutes = Math.floor(seconds / 60)
101
92
  const secondsPartial = seconds - minutes * 60
@@ -26,13 +26,6 @@ export const entryTypes = {
26
26
  upload: 'upload',
27
27
  }
28
28
 
29
- export const visibilityStates = {
30
- hidden: 'hidden',
31
- minimized: 'minimized',
32
- open: 'open',
33
- initialize: null,
34
- }
35
-
36
29
  export const readStates = {
37
30
  received: 'received',
38
31
  read: 'read',
@@ -85,7 +78,6 @@ export const seamlyActions = {
85
78
  SET_PARTICIPANT: 'SET_PARTICIPANT',
86
79
  SET_HEADER_TITLE: 'SET_HEADER_TITLE',
87
80
  SET_HEADER_SUB_TITLE: 'SET_HEADER_SUB_TITLE',
88
- SET_VISIBILITY: 'SET_VISIBILITY',
89
81
  RESET_HISTORY_LOADED_FLAG: 'RESET_HISTORY_LOADED_FLAG',
90
82
  SET_ACTIVE_SERVICE: 'SET_ACTIVE_SERVICE',
91
83
  INIT_IDLE_DETACH_COUNTDOWN: 'INIT_IDLE_DETACH_COUNTDOWN',
@@ -114,8 +106,6 @@ export const seamlyActions = {
114
106
  SET_UPLOAD_ERROR: 'SET_UPLOAD_ERROR',
115
107
  CLEAR_UPLOAD: 'CLEAR_UPLOAD',
116
108
  CLEAR_ALL_UPLOADS: 'CLEAR_ALL_UPLOADS',
117
- RESET_UPLOAD_STATE: 'RESET_UPLOAD_STATE',
118
- RESET_ENTRY_STATE: 'RESET_ENTRY_STATE',
119
109
  SET_SEAMLY_CONTAINER_ELEMENT: 'SET_SEAMLY_CONTAINER_ELEMENT',
120
110
  }
121
111
 
@@ -136,7 +126,6 @@ const {
136
126
  SET_PARTICIPANT,
137
127
  SET_HEADER_TITLE,
138
128
  SET_HEADER_SUB_TITLE,
139
- SET_VISIBILITY,
140
129
  RESET_HISTORY_LOADED_FLAG,
141
130
  SET_ACTIVE_SERVICE,
142
131
  INIT_IDLE_DETACH_COUNTDOWN,
@@ -164,8 +153,6 @@ const {
164
153
  SET_UPLOAD_ERROR,
165
154
  CLEAR_UPLOAD,
166
155
  CLEAR_ALL_UPLOADS,
167
- RESET_UPLOAD_STATE,
168
- RESET_ENTRY_STATE,
169
156
  SET_SEAMLY_CONTAINER_ELEMENT,
170
157
  } = seamlyActions
171
158
 
@@ -594,8 +581,6 @@ export const seamlyStateReducer = (state, action) => {
594
581
  ...state,
595
582
  resumeConversationPrompt: false,
596
583
  }
597
- case SET_VISIBILITY:
598
- return { ...state, visible: action.visible }
599
584
  case SET_PARTICIPANT:
600
585
  case CLEAR_PARTICIPANTS:
601
586
  return {
@@ -820,25 +805,6 @@ export const seamlyStateReducer = (state, action) => {
820
805
  ...state,
821
806
  currentUploads: [],
822
807
  }
823
- case RESET_UPLOAD_STATE:
824
- return {
825
- ...state,
826
- showFileUpload: false,
827
- currentUploads: [],
828
- }
829
- case RESET_ENTRY_STATE: {
830
- return {
831
- ...state,
832
- entryMeta: {
833
- default: payloadTypes.text,
834
- active: payloadTypes.text,
835
- userSelected: null,
836
- blockAutoEntrySwitch: false,
837
- options: {},
838
- optionsOverride: {},
839
- },
840
- }
841
- }
842
808
  case SET_SEAMLY_CONTAINER_ELEMENT: {
843
809
  return {
844
810
  ...state,
@@ -849,35 +815,3 @@ export const seamlyStateReducer = (state, action) => {
849
815
  return state
850
816
  }
851
817
  }
852
-
853
- export const calculateVisibility = ({
854
- hasResponded,
855
- previousVisibility,
856
- requestedVisibility,
857
- config,
858
- }) => {
859
- const { defaults, layoutMode, hideOnNoUserResponse } = config
860
-
861
- const { visible: defaultVisibility } = defaults || {}
862
-
863
- // Requesting open should override the responded check.
864
- if (
865
- layoutMode === 'window' &&
866
- hideOnNoUserResponse &&
867
- requestedVisibility !== visibilityStates.open
868
- ) {
869
- return hasResponded
870
- ? requestedVisibility || previousVisibility || visibilityStates.open
871
- : visibilityStates.hidden
872
- }
873
-
874
- const baseVisibility =
875
- layoutMode === 'inline' ? visibilityStates.open : visibilityStates.minimized
876
-
877
- return (
878
- requestedVisibility ||
879
- previousVisibility ||
880
- defaultVisibility ||
881
- baseVisibility
882
- )
883
- }
@@ -1,31 +0,0 @@
1
- import { useCallback } from 'preact/hooks'
2
- import { useSeamlyObjectStore } from './seamly-api-hooks'
3
- import { useConfig } from '../../domains/config'
4
-
5
- const useSeamlyStoredVisibility = () => {
6
- const { layoutMode } = useConfig()
7
- const key = 'visibility'
8
- const { get, set } = useSeamlyObjectStore()
9
-
10
- let storedVisibilityObj = {}
11
- const savedVisibility = get ? get(key) : {}
12
-
13
- if (savedVisibility) {
14
- storedVisibilityObj = savedVisibility
15
- }
16
-
17
- const setStoredVisibility = useCallback(
18
- (state) => {
19
- const saved = get ? get(key) : {}
20
- set(key, { ...saved, [layoutMode]: state })
21
- },
22
- [set, get, layoutMode],
23
- )
24
-
25
- return [
26
- layoutMode ? storedVisibilityObj[layoutMode] : null,
27
- set && layoutMode ? setStoredVisibility : null,
28
- ]
29
- }
30
-
31
- export default useSeamlyStoredVisibility
@@ -1,98 +0,0 @@
1
- import { useCallback } from 'preact/hooks'
2
- import {
3
- useSeamlyStateContext,
4
- useSeamlyUnreadCount,
5
- } from './seamly-state-hooks'
6
- import useSeamlyCommands from './use-seamly-commands'
7
- import useSeamlyDispatchContext from './use-seamly-dispatch'
8
- import { useSeamlyHasConversation } from './seamly-api-hooks'
9
- import useSeamlyStoredVisibility from './use-seamly-stored-visibility'
10
- import {
11
- calculateVisibility,
12
- seamlyActions,
13
- visibilityStates,
14
- } from '../utils/seamly-utils'
15
- import { useConfig } from '../../domains/config'
16
- import { useUserHasResponded } from '../../domains/app'
17
-
18
- const { SET_VISIBILITY } = seamlyActions
19
-
20
- const useSeamlyVisibility = () => {
21
- const config = useConfig()
22
- const { layoutMode, visibilityCallback } = config
23
- const { visible } = useSeamlyStateContext()
24
- const { emitEvent } = useSeamlyCommands()
25
- const dispatch = useSeamlyDispatchContext()
26
- const [storedVisibility, setStoredVisibility] = useSeamlyStoredVisibility()
27
- const hasResponded = useUserHasResponded()
28
- const hasConversation = useSeamlyHasConversation()
29
- const unreadMessageCount = useSeamlyUnreadCount()
30
- const isVisible = visible ? visible !== visibilityStates.hidden : false
31
-
32
- const isOpen =
33
- visible && layoutMode
34
- ? visible === visibilityStates.open ||
35
- (layoutMode === 'inline' && visible !== visibilityStates.hidden)
36
- : false
37
-
38
- const setVisibility = useCallback(
39
- (visibility) => {
40
- const visibilityFn = visibilityCallback || calculateVisibility
41
- const requestedVisibility = visibilityFn({
42
- hasConversation,
43
- hasResponded,
44
- previousVisibility: storedVisibility || null,
45
- requestedVisibility: visibility,
46
- config,
47
- })
48
-
49
- if (
50
- ![
51
- visibilityStates.open,
52
- visibilityStates.minimized,
53
- visibilityStates.hidden,
54
- ].includes(requestedVisibility)
55
- ) {
56
- console.error(
57
- 'The visibilityCallback function should return "open", "minimized" or "hidden".',
58
- )
59
- return
60
- }
61
-
62
- if (requestedVisibility !== visible) {
63
- if (setStoredVisibility) {
64
- setStoredVisibility(requestedVisibility)
65
- }
66
- // Don't broadcast the init visibility state
67
- if (visibility) {
68
- emitEvent('ui.visible', requestedVisibility, {
69
- visibility: requestedVisibility,
70
- hasConversation,
71
- hasResponded,
72
- unreadMessageCount,
73
- })
74
- }
75
- dispatch({
76
- type: SET_VISIBILITY,
77
- visible: requestedVisibility,
78
- })
79
- }
80
- },
81
- [
82
- visible,
83
- emitEvent,
84
- dispatch,
85
- hasConversation,
86
- hasResponded,
87
- storedVisibility,
88
- visibilityCallback,
89
- config,
90
- setStoredVisibility,
91
- unreadMessageCount,
92
- ],
93
- )
94
-
95
- return { isVisible, isOpen, visible, setVisibility }
96
- }
97
-
98
- export default useSeamlyVisibility