@seamly/web-ui 20.7.0 → 20.8.0-alpha.1

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 (222) hide show
  1. package/CHANGELOG.md +212 -16
  2. package/build/dist/lib/hooks.js +1 -1
  3. package/build/dist/lib/hooks.min.js +1 -1
  4. package/build/dist/lib/index.debug.js +939 -784
  5. package/build/dist/lib/index.debug.min.js +1 -1
  6. package/build/dist/lib/index.debug.min.js.LICENSE.txt +186 -130
  7. package/build/dist/lib/index.js +24806 -19703
  8. package/build/dist/lib/index.min.js +1 -1
  9. package/build/dist/lib/index.min.js.LICENSE.txt +38 -4
  10. package/build/dist/lib/standalone.js +32726 -26838
  11. package/build/dist/lib/standalone.min.js +1 -1
  12. package/build/dist/lib/standalone.min.js.LICENSE.txt +39 -0
  13. package/build/dist/lib/storage.js +2 -2
  14. package/build/dist/lib/storage.min.js +1 -1
  15. package/build/dist/lib/style-guide.js +8649 -7863
  16. package/build/dist/lib/style-guide.min.js +2 -1
  17. package/build/dist/lib/style-guide.min.js.LICENSE.txt +38 -0
  18. package/build/dist/lib/utils.js +1 -2
  19. package/build/dist/lib/utils.min.js +1 -1
  20. package/package.json +19 -9
  21. package/src/icons/avatar_agent-32.svg +7 -0
  22. package/src/icons/avatar_bot-32.svg +6 -1
  23. package/src/javascripts/api/index.js +1 -1
  24. package/src/javascripts/{config.js → config.ts} +3 -1
  25. package/src/javascripts/config.types.ts +95 -0
  26. package/src/javascripts/domains/app/actions.ts +83 -0
  27. package/src/javascripts/domains/app/app.types.ts +3 -0
  28. package/src/javascripts/domains/app/hooks.js +3 -5
  29. package/src/javascripts/domains/app/selectors.ts +6 -0
  30. package/src/javascripts/domains/app/slice.ts +30 -0
  31. package/src/javascripts/domains/config/actions.ts +45 -0
  32. package/src/javascripts/domains/config/hooks.ts +19 -0
  33. package/src/javascripts/domains/config/selectors.ts +24 -0
  34. package/src/javascripts/domains/config/slice.ts +111 -0
  35. package/src/javascripts/domains/errors/index.js +13 -9
  36. package/src/javascripts/domains/forms/context.ts +14 -0
  37. package/src/javascripts/domains/forms/forms.types.ts +24 -0
  38. package/src/javascripts/domains/forms/{hooks.js → hooks.ts} +23 -26
  39. package/src/javascripts/domains/forms/{provider.js → provider.tsx} +20 -14
  40. package/src/javascripts/domains/forms/{selectors.js → selectors.ts} +7 -8
  41. package/src/javascripts/domains/forms/slice.ts +84 -0
  42. package/src/javascripts/domains/forms/utils.ts +15 -0
  43. package/src/javascripts/domains/i18n/actions.ts +24 -0
  44. package/src/javascripts/domains/i18n/{hooks.js → hooks.ts} +2 -2
  45. package/src/javascripts/domains/i18n/i18n.types.ts +6 -0
  46. package/src/javascripts/domains/i18n/selectors.ts +16 -0
  47. package/src/javascripts/domains/i18n/{reducer.js → slice.ts} +43 -37
  48. package/src/javascripts/domains/interrupt/{hooks.js → hooks.ts} +2 -2
  49. package/src/javascripts/domains/interrupt/{middleware.js → middleware.ts} +11 -8
  50. package/src/javascripts/domains/interrupt/selectors.ts +6 -0
  51. package/src/javascripts/domains/interrupt/slice.ts +40 -0
  52. package/src/javascripts/domains/options/middleware.js +9 -6
  53. package/src/javascripts/domains/redux/redux.types.ts +11 -0
  54. package/src/javascripts/domains/store/index.ts +53 -0
  55. package/src/javascripts/domains/store/slice.ts +639 -0
  56. package/src/javascripts/domains/store/store.types.ts +135 -0
  57. package/src/javascripts/domains/translations/components/chat-status.js +2 -2
  58. package/src/javascripts/domains/translations/components/options-button.js +1 -1
  59. package/src/javascripts/domains/translations/components/options-dialog/form.js +5 -5
  60. package/src/javascripts/domains/translations/components/options-dialog/index.js +2 -2
  61. package/src/javascripts/domains/translations/{hooks.js → hooks.ts} +28 -23
  62. package/src/javascripts/domains/translations/middleware.js +29 -27
  63. package/src/javascripts/domains/translations/selectors.js +4 -9
  64. package/src/javascripts/domains/translations/slice.ts +67 -0
  65. package/src/javascripts/domains/translations/translations.types.ts +12 -0
  66. package/src/javascripts/domains/visibility/{actions.js → actions.ts} +25 -19
  67. package/src/javascripts/domains/visibility/{hooks.js → hooks.ts} +13 -10
  68. package/src/javascripts/domains/visibility/{selectors.js → selectors.ts} +3 -6
  69. package/src/javascripts/domains/visibility/slice.ts +38 -0
  70. package/src/javascripts/domains/visibility/utils.js +0 -9
  71. package/src/javascripts/domains/visibility/visibility.types.ts +6 -0
  72. package/src/javascripts/index.ts +92 -0
  73. package/src/javascripts/lib/engine/index.js +15 -11
  74. package/src/javascripts/lib/external-api/initialize-api.js +1 -1
  75. package/src/javascripts/lib/id.js +5 -8
  76. package/src/javascripts/lib/mutex.js +3 -1
  77. package/src/javascripts/lib/store/providers/cookie-storage.js +1 -1
  78. package/src/javascripts/lib/store/providers/session-storage.js +1 -1
  79. package/src/javascripts/package/hooks.js +2 -2
  80. package/src/javascripts/package/utils.js +0 -1
  81. package/src/javascripts/schema.ts +1455 -0
  82. package/src/javascripts/style-guide/components/app.js +4 -4
  83. package/src/javascripts/style-guide/components/static-core.js +87 -65
  84. package/src/javascripts/style-guide/components/view.js +4 -4
  85. package/src/javascripts/style-guide/state-helpers/index.js +5 -5
  86. package/src/javascripts/style-guide/states.js +6 -4
  87. package/src/javascripts/style-guide.ts +5 -0
  88. package/src/javascripts/ui/components/app-options/index.js +2 -4
  89. package/src/javascripts/ui/components/conversation/component-filter.js +1 -1
  90. package/src/javascripts/ui/components/conversation/conversation.js +5 -5
  91. package/src/javascripts/ui/components/conversation/event/card-message.js +1 -1
  92. package/src/javascripts/ui/components/conversation/event/carousel-component/components/controls.js +1 -1
  93. package/src/javascripts/ui/components/conversation/event/carousel-message/components/slide.js +1 -1
  94. package/src/javascripts/ui/components/conversation/event/carousel-message/index.js +1 -1
  95. package/src/javascripts/ui/components/conversation/event/choice-prompt.js +2 -2
  96. package/src/javascripts/ui/components/conversation/event/conversation-suggestions.js +11 -14
  97. package/src/javascripts/ui/components/conversation/event/cta.js +1 -1
  98. package/src/javascripts/ui/components/conversation/event/divider/variants/default.js +1 -1
  99. package/src/javascripts/ui/components/conversation/event/divider/variants/new-translation.js +5 -2
  100. package/src/javascripts/ui/components/conversation/event/event-participant.js +2 -2
  101. package/src/javascripts/ui/components/conversation/event/hooks/use-formatted-date.js +2 -2
  102. package/src/javascripts/ui/components/conversation/event/image-lightbox.js +1 -1
  103. package/src/javascripts/ui/components/conversation/event/image.js +5 -7
  104. package/src/javascripts/ui/components/conversation/event/participant.js +1 -1
  105. package/src/javascripts/ui/components/conversation/event/splash.js +3 -3
  106. package/src/javascripts/ui/components/conversation/event/text.js +1 -1
  107. package/src/javascripts/ui/components/conversation/event/translation.js +2 -2
  108. package/src/javascripts/ui/components/conversation/event/upload.js +2 -2
  109. package/src/javascripts/ui/components/conversation/event/video.js +1 -1
  110. package/src/javascripts/ui/components/conversation/message-container.js +4 -4
  111. package/src/javascripts/ui/components/core/seamly-api-context.js +1 -1
  112. package/src/javascripts/ui/components/core/seamly-core.js +15 -14
  113. package/src/javascripts/ui/components/core/seamly-event-subscriber.js +96 -91
  114. package/src/javascripts/ui/components/core/seamly-file-upload.js +20 -24
  115. package/src/javascripts/ui/components/core/seamly-initializer.js +1 -1
  116. package/src/javascripts/ui/components/core/seamly-instance-functions-loader.js +5 -4
  117. package/src/javascripts/ui/components/core/seamly-new-notifications.js +2 -2
  118. package/src/javascripts/ui/components/core/seamly-read-state.js +10 -17
  119. package/src/javascripts/ui/components/entry/deprecated-toggle-button.js +3 -3
  120. package/src/javascripts/ui/components/entry/entry-container.js +4 -6
  121. package/src/javascripts/ui/components/entry/text-entry/hooks.js +3 -3
  122. package/src/javascripts/ui/components/entry/text-entry/index.js +3 -2
  123. package/src/javascripts/ui/components/entry/text-entry/text-entry-form.js +6 -10
  124. package/src/javascripts/ui/components/entry/upload/file-upload-form.js +2 -2
  125. package/src/javascripts/ui/components/entry/upload/index.js +10 -9
  126. package/src/javascripts/ui/components/entry/upload-toggle.js +2 -2
  127. package/src/javascripts/ui/components/faq/faq.js +6 -6
  128. package/src/javascripts/ui/components/form-controls/file-input.js +1 -1
  129. package/src/javascripts/ui/components/form-controls/form.js +1 -1
  130. package/src/javascripts/ui/components/form-controls/input.js +1 -1
  131. package/src/javascripts/ui/components/form-controls/select.js +1 -1
  132. package/src/javascripts/ui/components/layout/agent-info.js +4 -4
  133. package/src/javascripts/ui/components/layout/chat-frame.js +3 -3
  134. package/src/javascripts/ui/components/layout/chat.js +11 -12
  135. package/src/javascripts/ui/components/layout/deprecated-app-frame.js +10 -9
  136. package/src/javascripts/ui/components/layout/header.js +1 -1
  137. package/src/javascripts/ui/components/layout/interrupt.js +23 -24
  138. package/src/javascripts/ui/components/layout/pre-chat-messages.js +11 -11
  139. package/src/javascripts/ui/components/layout/privacy-disclaimer.js +2 -2
  140. package/src/javascripts/ui/components/options/options-button.js +12 -10
  141. package/src/javascripts/ui/components/options/transcript/index.js +2 -2
  142. package/src/javascripts/ui/components/options/transcript/transcript-form.js +1 -1
  143. package/src/javascripts/ui/components/suggestions/index.js +9 -8
  144. package/src/javascripts/ui/components/view/deprecated-view.js +19 -16
  145. package/src/javascripts/ui/components/view/index.js +12 -12
  146. package/src/javascripts/ui/components/view/inline-view.js +2 -2
  147. package/src/javascripts/ui/components/view/window-view/collapse-button.js +3 -3
  148. package/src/javascripts/ui/components/view/window-view/index.js +13 -13
  149. package/src/javascripts/ui/components/view/window-view/window-open-button.js +13 -13
  150. package/src/javascripts/ui/components/warnings/idle-detach-warning.js +1 -1
  151. package/src/javascripts/ui/components/warnings/resume-conversation-prompt.js +1 -1
  152. package/src/javascripts/ui/components/widgets/lightbox.js +2 -2
  153. package/src/javascripts/ui/components/widgets/upload-progress.js +1 -1
  154. package/src/javascripts/ui/hooks/component-helper-hooks.js +1 -1
  155. package/src/javascripts/ui/hooks/file-upload-hooks.js +4 -6
  156. package/src/javascripts/ui/hooks/focus-helper-hooks.js +14 -12
  157. package/src/javascripts/ui/hooks/live-region-hooks.js +2 -0
  158. package/src/javascripts/ui/hooks/seamly-api-hooks.js +8 -3
  159. package/src/javascripts/ui/hooks/seamly-entry-hooks.js +28 -25
  160. package/src/javascripts/ui/hooks/seamly-hooks.js +25 -25
  161. package/src/javascripts/ui/hooks/seamly-option-hooks.js +17 -19
  162. package/src/javascripts/ui/hooks/seamly-state-hooks.js +14 -13
  163. package/src/javascripts/ui/hooks/use-seamly-chat.js +15 -25
  164. package/src/javascripts/ui/hooks/use-seamly-commands.js +46 -46
  165. package/src/javascripts/ui/hooks/use-seamly-idle-detach-countdown.js +22 -24
  166. package/src/javascripts/ui/hooks/use-seamly-resume-conversation-prompt.js +8 -9
  167. package/src/javascripts/ui/hooks/use-single-file-upload.js +4 -6
  168. package/src/javascripts/ui/hooks/utility-hooks.js +4 -4
  169. package/src/javascripts/ui/utils/form-utils.js +0 -145
  170. package/src/javascripts/ui/utils/general-utils.js +3 -4
  171. package/src/javascripts/ui/utils/seamly-utils.ts +73 -0
  172. package/webpack/config.common.js +16 -0
  173. package/webpack/config.dev.js +1 -0
  174. package/webpack/config.package.js +26 -5
  175. package/webpack/defaults.js +7 -2
  176. package/webpack/parts/babel-loader-browser-plugins.js +1 -0
  177. package/webpack/parts/dev-server.js +4 -3
  178. package/src/javascripts/domains/app/actions.js +0 -112
  179. package/src/javascripts/domains/app/index.js +0 -7
  180. package/src/javascripts/domains/app/reducer.js +0 -16
  181. package/src/javascripts/domains/app/selectors.js +0 -8
  182. package/src/javascripts/domains/app/utils.js +0 -4
  183. package/src/javascripts/domains/config/actions.js +0 -7
  184. package/src/javascripts/domains/config/hooks.js +0 -23
  185. package/src/javascripts/domains/config/index.js +0 -7
  186. package/src/javascripts/domains/config/reducer.js +0 -79
  187. package/src/javascripts/domains/config/selectors.js +0 -23
  188. package/src/javascripts/domains/config/utils.js +0 -4
  189. package/src/javascripts/domains/forms/actions.js +0 -21
  190. package/src/javascripts/domains/forms/context.js +0 -6
  191. package/src/javascripts/domains/forms/index.js +0 -8
  192. package/src/javascripts/domains/forms/reducer.js +0 -84
  193. package/src/javascripts/domains/forms/utils.js +0 -20
  194. package/src/javascripts/domains/i18n/actions.js +0 -20
  195. package/src/javascripts/domains/i18n/index.js +0 -7
  196. package/src/javascripts/domains/i18n/selectors.js +0 -15
  197. package/src/javascripts/domains/i18n/utils.js +0 -4
  198. package/src/javascripts/domains/interrupt/actions.js +0 -4
  199. package/src/javascripts/domains/interrupt/index.js +0 -9
  200. package/src/javascripts/domains/interrupt/reducer.js +0 -22
  201. package/src/javascripts/domains/interrupt/selectors.js +0 -6
  202. package/src/javascripts/domains/interrupt/utils.js +0 -4
  203. package/src/javascripts/domains/options/index.js +0 -1
  204. package/src/javascripts/domains/redux/context.js +0 -6
  205. package/src/javascripts/domains/redux/create-redux-store.js +0 -21
  206. package/src/javascripts/domains/redux/hooks.js +0 -80
  207. package/src/javascripts/domains/redux/index.js +0 -19
  208. package/src/javascripts/domains/redux/provider.js +0 -5
  209. package/src/javascripts/domains/redux/utils.js +0 -12
  210. package/src/javascripts/domains/store/index.js +0 -46
  211. package/src/javascripts/domains/store/state-reducer.js +0 -56
  212. package/src/javascripts/domains/translations/actions.js +0 -11
  213. package/src/javascripts/domains/translations/index.js +0 -10
  214. package/src/javascripts/domains/translations/reducer.js +0 -69
  215. package/src/javascripts/domains/translations/utils.js +0 -4
  216. package/src/javascripts/domains/visibility/index.js +0 -8
  217. package/src/javascripts/domains/visibility/reducer.js +0 -24
  218. package/src/javascripts/index.js +0 -153
  219. package/src/javascripts/lib/redux-helpers/index.js +0 -99
  220. package/src/javascripts/style-guide.js +0 -5
  221. package/src/javascripts/ui/hooks/use-seamly-dispatch.js +0 -3
  222. package/src/javascripts/ui/utils/seamly-utils.js +0 -832
@@ -1,6 +0,0 @@
1
- import { createSelector } from 'reselect'
2
- import { selectState } from './utils'
3
-
4
- export const selectError = createSelector(selectState, ({ error }) => error)
5
-
6
- export { selectState }
@@ -1,4 +0,0 @@
1
- import { createDomain } from 'lib/redux-helpers'
2
-
3
- export const { createAction, createReducer, selectState } =
4
- createDomain('interrupt')
@@ -1 +0,0 @@
1
- export { default as createMiddleware } from './middleware'
@@ -1,6 +0,0 @@
1
- import { createContext } from 'preact'
2
-
3
- const StoreContext = createContext(undefined)
4
-
5
- export default StoreContext
6
- export const { Provider, Consumer } = StoreContext
@@ -1,21 +0,0 @@
1
- import { combineReducers, createStore, applyMiddleware, compose } from 'redux'
2
-
3
- let composeEnhancers = compose
4
- if (process.env.NODE_ENV === 'development') {
5
- /* eslint-disable no-underscore-dangle */
6
- composeEnhancers =
7
- window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || composeEnhancers
8
- /* eslint-enable no-underscore-dangle */
9
- }
10
-
11
- export default function createReduxStore({
12
- reducers = {},
13
- initialState = {},
14
- middlewares = [],
15
- } = {}) {
16
- return createStore(
17
- combineReducers(reducers),
18
- initialState,
19
- composeEnhancers(applyMiddleware(...middlewares)),
20
- )
21
- }
@@ -1,80 +0,0 @@
1
- import {
2
- useCallback,
3
- useContext,
4
- useLayoutEffect,
5
- useReducer,
6
- useRef,
7
- } from 'preact/hooks'
8
- import StoreContext from './context'
9
- // import { arrayContentEquals } from './utils'
10
-
11
- export function useStoreContext() {
12
- return useContext(StoreContext)
13
- }
14
-
15
- export function useStoreDispatch() {
16
- return useStoreContext().dispatch
17
- }
18
-
19
- export function useSelector(selector, deps = []) {
20
- const store = useStoreContext()
21
- // we need a force-update because we're manually updating a ref instead of a useState
22
- const [, forceUpdate] = useReducer((x) => x + 1, 0)
23
- // we're keeping the value to compare against
24
- const valueRef = useRef()
25
-
26
- // instead of accepting a stabilized selector, we stick to the signature
27
- // of useCallback, as that makes the exposed api much more dev-friendly
28
- // otherwise you'd have to stabilize selectors externally
29
- // eslint-disable-next-line react-hooks/exhaustive-deps
30
- const selectorCb = useCallback(selector, deps)
31
- // we're keeping the selector in a ref to compare against
32
- // we need this both in the store subscription and for
33
- // synchronous state updates if the selector changes, but the store didn't
34
- // if the selector changes, we want to synchronously select the new information
35
- // otherwise, the rendered component does not accurately and predictably reflect
36
- // the selector+state
37
- // in order to keep multiple selectors in sync, we also re-calculate when
38
- // the state has changed but the selector hasn't re-calculated async.
39
- // selectors *might* be heavy, which could kill FPS, but the alternative is
40
- // stale data
41
- const selectorRef = useRef()
42
- const stateRef = useRef()
43
- const state = store.getState()
44
- if (selectorRef.current !== selectorCb || stateRef.current !== state) {
45
- stateRef.current = state
46
- valueRef.current = selectorCb(stateRef.current)
47
- selectorRef.current = selectorCb
48
- }
49
-
50
- useLayoutEffect(() => {
51
- // we subscribe to the store changes
52
- return store.subscribe(() => {
53
- const newState = store.getState()
54
- // prevent recalculating if the state hasn't changed
55
- // if the selector changed, it was already handled synchronously
56
- if (newState === stateRef.current) {
57
- return
58
- }
59
- // calculate the new value based on selector+state
60
- const newValue = selectorRef.current?.(store.getState())
61
- // only if the value changed we update. this saves heaps of re-rendering
62
- if (newValue !== valueRef.current) {
63
- valueRef.current = newValue
64
- forceUpdate()
65
- }
66
- })
67
- }, [store])
68
- return valueRef.current
69
- }
70
-
71
- export const useSelectorWithProps = function useSelectorWithProps(
72
- selector,
73
- props,
74
- inputs = [],
75
- // equalityFn = arrayContentEquals,
76
- ) {
77
- // eslint-disable-next-line react-hooks/exhaustive-deps
78
- const wrappedMapper = useCallback((state) => selector(state, props), inputs)
79
- return useSelector(wrappedMapper, inputs)
80
- }
@@ -1,19 +0,0 @@
1
- import StoreContext from './context'
2
- import StoreProvider from './provider'
3
- import createReduxStore from './create-redux-store'
4
- import {
5
- useStoreContext,
6
- useSelector,
7
- useStoreDispatch,
8
- useSelectorWithProps,
9
- } from './hooks'
10
-
11
- export {
12
- createReduxStore,
13
- useSelector,
14
- useSelectorWithProps,
15
- useStoreDispatch,
16
- useStoreContext,
17
- StoreContext,
18
- StoreProvider,
19
- }
@@ -1,5 +0,0 @@
1
- import { Provider } from './context'
2
-
3
- export default function StoreProvider({ store, children }) {
4
- return <Provider value={store}>{children}</Provider>
5
- }
@@ -1,12 +0,0 @@
1
- export const arrayContentEquals = (a, b) => {
2
- if (a === b) {
3
- return true
4
- }
5
- if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {
6
- return false
7
- }
8
- return a.every((value, idx) => b[idx] === value)
9
- }
10
-
11
- export const getPropSelector = (propName, orDefault) => (_, props) =>
12
- props[propName] || orDefault
@@ -1,46 +0,0 @@
1
- import { Reducer as appReducer } from 'domains/app'
2
- import { Reducer as configReducer } from 'domains/config'
3
- import { createMiddleware as createErrorsMiddleware } from 'domains/errors'
4
- import { Reducer as formReducer } from 'domains/forms'
5
- import { Reducer as i18nReducer } from 'domains/i18n'
6
- import {
7
- createMiddleware as createInterruptMiddleware,
8
- Reducer as interruptReducer,
9
- } from 'domains/interrupt'
10
- import { createMiddleware as createOptionsMiddleware } from 'domains/options'
11
- import { createReduxStore } from 'domains/redux'
12
- import {
13
- createMiddleware as createI18nMiddleware,
14
- Reducer as translationsReducer,
15
- } from 'domains/translations'
16
- import { Reducer as visibilityReducer } from 'domains/visibility'
17
- import thunkMiddleware from 'redux-thunk'
18
- import stateReducer from './state-reducer'
19
-
20
- export function createStore({ initialState, api, eventBus, config } = {}) {
21
- const store = createReduxStore({
22
- reducers: {
23
- state: stateReducer,
24
- [String(appReducer)]: appReducer,
25
- [String(configReducer)]: configReducer,
26
- [String(formReducer)]: formReducer,
27
- [String(translationsReducer)]: translationsReducer,
28
- [String(i18nReducer)]: i18nReducer,
29
- [String(interruptReducer)]: interruptReducer,
30
- [String(visibilityReducer)]: visibilityReducer,
31
- },
32
- initialState,
33
- middlewares: [
34
- createErrorsMiddleware({ api }),
35
- thunkMiddleware.withExtraArgument({
36
- api,
37
- eventBus,
38
- config,
39
- }),
40
- createInterruptMiddleware({ api }),
41
- createOptionsMiddleware({ api }),
42
- createI18nMiddleware,
43
- ],
44
- })
45
- return store
46
- }
@@ -1,56 +0,0 @@
1
- // Legacy state reducer. Do not add new features here but extract/create new reducers as needed
2
-
3
- import { randomId } from 'lib/id'
4
- import { entryTypes, seamlyStateReducer } from 'ui/utils/seamly-utils'
5
- import * as AppActions from 'domains/app/actions'
6
-
7
- const initialState = {
8
- events: [],
9
- initialState: {},
10
- unreadEvents: 0,
11
- loadedImageEventIds: [],
12
- isLoading: false,
13
- idleDetachCountdown: { hasCountdown: false, isActive: false },
14
- resumeConversationPrompt: false,
15
- serviceInfo: {
16
- activeServiceSessionId: '',
17
- },
18
- participantInfo: {
19
- participants: {},
20
- currentAgent: '',
21
- },
22
- headerTitles: {
23
- title: null,
24
- subTitle: '',
25
- },
26
- historyLoaded: false,
27
- skiplinkTargetId: randomId(),
28
- optionsButtonId: randomId(),
29
- headerCollapseButtonId: randomId(),
30
- serviceData: {},
31
- options: {
32
- features: {},
33
- panelActive: false,
34
- optionActive: '',
35
- userSelectedOptions: {},
36
- },
37
- showFileUpload: false,
38
- currentUploads: [],
39
- entryMeta: {
40
- default: entryTypes.text,
41
- active: entryTypes.text,
42
- userSelected: null,
43
- blockAutoEntrySwitch: false,
44
- options: {},
45
- optionsOverride: {},
46
- },
47
- seamlyContainerElement: null,
48
- }
49
-
50
- export default function stateReducer(state = initialState, action) {
51
- if (action.type === String(AppActions.initialize.pending)) {
52
- return initialState
53
- }
54
-
55
- return seamlyStateReducer(state, action)
56
- }
@@ -1,11 +0,0 @@
1
- import { createActions } from './utils'
2
-
3
- export const [enable, disable] = createActions('translate', {
4
- enable: (locale) => ({ locale }),
5
- disable: () => ({}),
6
- })
7
-
8
- export const [enableEvent, disableEvent] = createActions('event', {
9
- enable: (payloadId) => ({ payloadId }),
10
- disable: (payloadId) => ({ payloadId }),
11
- })
@@ -1,10 +0,0 @@
1
- import * as Actions from './actions'
2
- import * as Selectors from './selectors'
3
-
4
- export * from './hooks'
5
- export { default as createMiddleware } from './middleware'
6
- export { default as Reducer } from './reducer'
7
- export { default as OptionsButton } from './components/options-button'
8
- export { default as ChatStatus } from './components/chat-status'
9
-
10
- export { Actions, Selectors }
@@ -1,69 +0,0 @@
1
- import { seamlyActions } from 'ui/utils/seamly-utils'
2
- import { randomId } from 'lib/id'
3
- import * as AppActions from 'domains/app/actions'
4
- import * as Actions from './actions'
5
- import { createReducer } from './utils'
6
-
7
- const initialState = {
8
- isActive: false,
9
- currentLocale: undefined,
10
- isAvailable: false,
11
- languages: [],
12
- originalPayloadIds: [],
13
- containerId: randomId(),
14
- }
15
-
16
- export default createReducer(
17
- {
18
- [seamlyActions.SET_FEATURES]: (state, action) => {
19
- const feature = action?.features?.translation
20
- if (!feature) {
21
- return state
22
- }
23
-
24
- return {
25
- ...state,
26
- isAvailable: feature.enabled === true,
27
- languages: feature.languages || [],
28
- }
29
- },
30
-
31
- [seamlyActions.CLEAR_FEATURES]: () => initialState,
32
- [Actions.enable]: (state, { locale }) => {
33
- return {
34
- ...state,
35
- isActive: true,
36
- currentLocale: locale,
37
- }
38
- },
39
- [Actions.disable]: (state) => {
40
- return {
41
- ...state,
42
- isActive: false,
43
- currentLocale: undefined,
44
- }
45
- },
46
- [Actions.enableEvent]: (state, { payloadId }) => {
47
- if (!state.originalPayloadIds.includes(payloadId)) {
48
- return state
49
- }
50
- return {
51
- ...state,
52
- originalPayloadIds: state.originalPayloadIds.filter(
53
- (id) => id !== payloadId,
54
- ),
55
- }
56
- },
57
- [Actions.disableEvent]: (state, { payloadId }) => {
58
- if (state.originalPayloadIds.includes(payloadId)) {
59
- return state
60
- }
61
- return {
62
- ...state,
63
- originalPayloadIds: [...state.originalPayloadIds, payloadId],
64
- }
65
- },
66
- [AppActions.initialize.pending]: () => initialState,
67
- },
68
- initialState,
69
- )
@@ -1,4 +0,0 @@
1
- import { createDomain } from 'lib/redux-helpers'
2
-
3
- export const { createActions, createReducer, selectState } =
4
- createDomain('translations')
@@ -1,8 +0,0 @@
1
- import * as Actions from './actions'
2
- import * as Selectors from './selectors'
3
-
4
- export * from './hooks'
5
- export { visibilityStates } from './constants'
6
- export { default as Reducer } from './reducer'
7
- export { calculateVisibility } from './utils'
8
- export { Actions, Selectors }
@@ -1,24 +0,0 @@
1
- import { createReducer } from './utils'
2
- import * as Actions from './actions'
3
- import { visibilityStates } from './constants'
4
-
5
- const initialState = {
6
- visibility: visibilityStates.initialize,
7
- showInlineView: false,
8
- }
9
-
10
- export default createReducer(
11
- {
12
- [Actions.setFromStorage]: (state, { visibility }) => ({
13
- ...state,
14
- visibility,
15
- }),
16
- [Actions.setVisibility.fulfilled]: (state, { payload: visibility }) =>
17
- visibility ? { ...state, visibility } : state,
18
- [Actions.setShowInlineView]: (state) => ({
19
- ...state,
20
- showInlineView: true,
21
- }),
22
- },
23
- initialState,
24
- )
@@ -1,153 +0,0 @@
1
- import preactDebug from './lib/preact-debug' // eslint-disable-line
2
-
3
- // Used by: Client
4
- import initializeExternalApi from './lib/external-api/initialize-api'
5
-
6
- export default initializeExternalApi
7
-
8
- // Used by: Client
9
- export { default as AgentInfo } from './ui/components/layout/agent-info'
10
-
11
- // Used by: Client
12
- export { default as Chat } from './ui/components/layout/chat'
13
-
14
- // Used by: Client
15
- export { calculateVisibility } from './domains/visibility'
16
-
17
- // Used by: Client
18
- export { default as ChatFrame } from './ui/components/layout/chat-frame'
19
-
20
- // Used by: Client
21
- export { className } from './lib/css'
22
-
23
- // Used by: Client
24
- export { default as Conversation } from './ui/components/conversation/conversation'
25
-
26
- // Used by: StyleGuide
27
- export { createReduxStore } from './domains/redux'
28
-
29
- // Used by: StyleGuide
30
- export { default as Engine } from './lib/engine'
31
-
32
- // Used by: Client
33
- export { default as EntryContainer } from './ui/components/entry/entry-container'
34
-
35
- // Used by: Demo
36
- export { default as EventParticipant } from './ui/components/conversation/event/event-participant'
37
-
38
- // Used by: Client
39
- export { eventTypes } from './ui/utils/seamly-utils'
40
-
41
- // Used by: StyleGuide
42
- export { default as ExternalApi } from './lib/external-api'
43
-
44
- // Used by: StyleGuide
45
- export { getUrlParams } from './ui/utils/general-utils'
46
-
47
- // Used by: StyleGuide
48
- export { getUrlSearchString } from './ui/utils/general-utils'
49
-
50
- // Used by: Client
51
- export { default as Header } from './ui/components/layout/header'
52
-
53
- // Used by: Client
54
- export { default as Icon } from './ui/components/layout/icon'
55
-
56
- // Used by: Client
57
- export { default as Interrupt } from './ui/components/layout/interrupt'
58
-
59
- // Used by: Client
60
- export { default as MessageContainer } from './ui/components/conversation/message-container'
61
-
62
- // Used by: StyleGuide
63
- export { randomId } from './lib/id'
64
-
65
- // Used by: Client
66
- export { seamlyActions } from './ui/utils/seamly-utils'
67
-
68
- // Used by: StyleGuide
69
- export { SeamlyApiContext } from './ui/components/core/seamly-api-context'
70
-
71
- // Used by: StyleGuide
72
- export { SeamlyEventBusContext } from './ui/components/core/seamly-api-context'
73
-
74
- // Used by: StyleGuide
75
- export { SeamlyLiveRegionContext } from './ui/components/core/seamly-live-region-context'
76
-
77
- // Used by: StyleGuide
78
- export { StoreProvider } from './domains/redux'
79
-
80
- // Used by: Client
81
- export { useChoicePrompt } from './ui/components/conversation/event/choice-prompt'
82
-
83
- // Used by: Client
84
- export { useSeamlyDispatchContext as useDispatch } from './ui/hooks/seamly-hooks'
85
-
86
- // Used by: Client
87
- export { useSeamlyChat } from './ui/hooks/seamly-hooks'
88
-
89
- // Used by: Client
90
- export { useSeamlyCommands } from './ui/hooks/seamly-hooks'
91
-
92
- // Used by: Client
93
- export { useConfig as useSeamlyConfig } from './domains/config'
94
-
95
- // Used by: Client
96
- export { useEvents } from './ui/hooks/seamly-hooks'
97
-
98
- // Used by: Client
99
- export { useGeneratedId } from './ui/hooks/seamly-hooks'
100
-
101
- // Used by: Client
102
- export { useI18n } from './domains/i18n'
103
-
104
- // Used by: Client
105
- export { useSeamlyEventStream } from './ui/hooks/seamly-hooks'
106
-
107
- // Used by: Client
108
- export { useSeamlyIdleDetachCountdown } from './ui/hooks/seamly-hooks'
109
-
110
- // Used by: Client
111
- export { useSeamlyMessageContainerClassNames } from './ui/hooks/seamly-hooks'
112
-
113
- // Used by: Client
114
- export { useSeamlyOptions } from './ui/hooks/seamly-hooks'
115
-
116
- // Used by: Client
117
- export { useVisibility as useSeamlyVisibility } from './domains/visibility'
118
-
119
- // Used by: Client
120
- export {
121
- useTranslations,
122
- useTranslatedEventData,
123
- useTranslationsContainer,
124
- } from './domains/translations'
125
-
126
- // Used by: Client
127
- export { default as Text } from './ui/components/conversation/event/text'
128
-
129
- // Used by: Client
130
- export { default as DeprecatedToggleButton } from './ui/components/entry/deprecated-toggle-button'
131
-
132
- // Used by: StyleGuide
133
- // Used by: Client (with custom view)
134
- export { default as View } from './ui/components/view'
135
-
136
- // Used by: Client
137
- export { default as DeprecatedView } from './ui/components/view/deprecated-view'
138
-
139
- // Used by: StyleGuide
140
- export { default as ComponentFilter } from './ui/components/conversation/component-filter'
141
-
142
- // Used by: Client
143
- // Used by: StyleGuide
144
- export { visibilityStates } from './domains/visibility'
145
-
146
- // Used by: StyleGuide
147
- export { API } from './api'
148
-
149
- // Used by: StyleGuide
150
- export { default as SeamlyGeneralError } from './api/errors/seamly-general-error'
151
-
152
- // Used by: StyleGuide
153
- export { default as SeamlyOfflineError } from './api/errors/seamly-offline-error'
@@ -1,99 +0,0 @@
1
- import { randomId } from 'lib/id'
2
-
3
- export const SLICE_DELIMITER = '/'
4
- export const DOMAIN_DELIMITER = '//'
5
-
6
- export function prefixType(prefix, fn, delimiter = '/') {
7
- return (type, ...args) => fn(prefix + delimiter + type, ...args)
8
- }
9
-
10
- export function createAction(
11
- type,
12
- identityReducer = (payload) => ({ payload }),
13
- ) {
14
- const action = (...params) => ({ type, ...identityReducer(...params) })
15
- action.toString = () => String(type)
16
- action.match = (obj) => obj?.type === String(type)
17
- return action
18
- }
19
-
20
- export function createActions(baseType, ...args) {
21
- const handlers = []
22
- // eslint-disable-next-line consistent-return
23
- args.forEach((arg) => {
24
- const argType = typeof arg
25
- if (argType === 'string') {
26
- return handlers.push([arg])
27
- }
28
- if (argType !== 'object' || arg instanceof Array) {
29
- return undefined
30
- }
31
- Object.keys(arg).forEach((key) => handlers.push([key, arg[key]]))
32
- })
33
- const create = prefixType(baseType, createAction, SLICE_DELIMITER)
34
-
35
- return handlers.map((handler) => create(...handler))
36
- }
37
-
38
- export function createThunk(type, payloadCreator) {
39
- const [pending, fulfilled, rejected] = createActions(type, {
40
- pending: (arg, requestId) => ({
41
- meta: { arg, requestId, status: 'pending' },
42
- }),
43
- fulfilled: (arg, payload, requestId) => ({
44
- payload,
45
- meta: { arg, requestId, status: 'fulfilled' },
46
- }),
47
- rejected: (arg, error, requestId) => ({
48
- error,
49
- meta: { arg, requestId, status: 'rejected', error: String(error) },
50
- }),
51
- })
52
- const thunkCreator = (arg) => (dispatch, getState, extra) => {
53
- const requestId = randomId()
54
- const promise = (async () => {
55
- let finalAction
56
- try {
57
- dispatch(pending(arg, requestId))
58
- const prms = payloadCreator(arg, { dispatch, getState, extra })
59
- const result = await prms
60
- finalAction = fulfilled(arg, result, requestId)
61
- } catch (error) {
62
- finalAction = rejected(arg, error, requestId)
63
- }
64
- dispatch(finalAction)
65
- return finalAction
66
- })()
67
- return Object.assign(promise, {
68
- type,
69
- arg,
70
- requestId,
71
- })
72
- }
73
- return Object.assign(thunkCreator, {
74
- type,
75
- pending,
76
- fulfilled,
77
- rejected,
78
- })
79
- }
80
-
81
- export function createReducer(domain, handlers = {}, defaultState) {
82
- const reducer = (state = defaultState, action) => {
83
- const typeReducer = handlers?.[action?.type]
84
- return typeReducer ? typeReducer(state, action) : state
85
- }
86
- reducer.toString = () => domain
87
- return reducer
88
- }
89
-
90
- export function createDomain(domain) {
91
- return {
92
- createAction: prefixType(domain, createAction, DOMAIN_DELIMITER),
93
- createActions: prefixType(domain, createActions, DOMAIN_DELIMITER),
94
- createThunk: prefixType(domain, createThunk, DOMAIN_DELIMITER),
95
- createReducer: (handlers, defaultState) =>
96
- createReducer(domain, handlers, defaultState),
97
- selectState: (state) => state[domain],
98
- }
99
- }
@@ -1,5 +0,0 @@
1
- import initializeStyleGuideExternalApi from './style-guide/register-style-guide-api'
2
-
3
- export default initializeStyleGuideExternalApi
4
-
5
- export { default as SeamlyStaticCore } from './style-guide/components/static-core'
@@ -1,3 +0,0 @@
1
- import { useStoreDispatch } from 'domains/redux'
2
-
3
- export default useStoreDispatch