@botonic/react 0.22.1 → 0.22.3-alpha.0

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 (58) hide show
  1. package/lib/cjs/components/message.js +8 -8
  2. package/lib/cjs/components/message.js.map +1 -1
  3. package/lib/cjs/components/whatsapp-button-list.js +1 -1
  4. package/lib/cjs/components/whatsapp-button-list.js.map +1 -1
  5. package/lib/cjs/contexts.d.ts +4 -2
  6. package/lib/cjs/contexts.js +3 -2
  7. package/lib/cjs/contexts.js.map +1 -1
  8. package/lib/cjs/index-types.d.ts +1 -1
  9. package/lib/cjs/webchat/hooks.d.ts +1 -0
  10. package/lib/cjs/webchat/hooks.js +7 -4
  11. package/lib/cjs/webchat/hooks.js.map +1 -1
  12. package/lib/cjs/webchat/messages-reducer.js +9 -4
  13. package/lib/cjs/webchat/messages-reducer.js.map +1 -1
  14. package/lib/cjs/webchat/trigger-button/index.d.ts +1 -0
  15. package/lib/cjs/webchat/trigger-button/index.js +34 -0
  16. package/lib/cjs/webchat/trigger-button/index.js.map +1 -0
  17. package/lib/cjs/webchat/trigger-button/styles.d.ts +3 -0
  18. package/lib/cjs/webchat/trigger-button/styles.js +40 -0
  19. package/lib/cjs/webchat/trigger-button/styles.js.map +1 -0
  20. package/lib/cjs/webchat/webchat-reducer.js +4 -2
  21. package/lib/cjs/webchat/webchat-reducer.js.map +1 -1
  22. package/lib/cjs/webchat/webchat.js +2 -39
  23. package/lib/cjs/webchat/webchat.js.map +1 -1
  24. package/lib/esm/components/message.js +8 -8
  25. package/lib/esm/components/message.js.map +1 -1
  26. package/lib/esm/components/whatsapp-button-list.js +1 -1
  27. package/lib/esm/components/whatsapp-button-list.js.map +1 -1
  28. package/lib/esm/contexts.d.ts +4 -2
  29. package/lib/esm/contexts.js +3 -2
  30. package/lib/esm/contexts.js.map +1 -1
  31. package/lib/esm/index-types.d.ts +1 -1
  32. package/lib/esm/webchat/hooks.d.ts +1 -0
  33. package/lib/esm/webchat/hooks.js +7 -4
  34. package/lib/esm/webchat/hooks.js.map +1 -1
  35. package/lib/esm/webchat/messages-reducer.js +9 -4
  36. package/lib/esm/webchat/messages-reducer.js.map +1 -1
  37. package/lib/esm/webchat/trigger-button/index.d.ts +1 -0
  38. package/lib/esm/webchat/trigger-button/index.js +30 -0
  39. package/lib/esm/webchat/trigger-button/index.js.map +1 -0
  40. package/lib/esm/webchat/trigger-button/styles.d.ts +3 -0
  41. package/lib/esm/webchat/trigger-button/styles.js +36 -0
  42. package/lib/esm/webchat/trigger-button/styles.js.map +1 -0
  43. package/lib/esm/webchat/webchat-reducer.js +4 -2
  44. package/lib/esm/webchat/webchat-reducer.js.map +1 -1
  45. package/lib/esm/webchat/webchat.js +3 -40
  46. package/lib/esm/webchat/webchat.js.map +1 -1
  47. package/package.json +1 -1
  48. package/src/.DS_Store +0 -0
  49. package/src/components/message.jsx +8 -8
  50. package/src/components/whatsapp-button-list.tsx +5 -1
  51. package/src/contexts.jsx +3 -2
  52. package/src/index-types.ts +1 -1
  53. package/src/webchat/hooks.js +5 -2
  54. package/src/webchat/messages-reducer.js +16 -7
  55. package/src/webchat/trigger-button/index.tsx +71 -0
  56. package/src/webchat/trigger-button/styles.ts +39 -0
  57. package/src/webchat/webchat-reducer.js +8 -2
  58. package/src/webchat/webchat.jsx +4 -69
@@ -175,7 +175,7 @@ export interface WebchatContextProps {
175
175
  updateReplies: (replies: boolean) => void
176
176
  updateLatestInput: (input: CoreInput) => void
177
177
  closeWebview: () => void
178
- toggleWebchat: () => void
178
+ toggleWebchat: (toggle: boolean) => void
179
179
  getThemeProperty: (property: string, defaultValue?: string) => any
180
180
  resolveCase: () => void
181
181
  theme: ThemeProps
@@ -64,6 +64,7 @@ export const webchatInitialState = {
64
64
  lastMessageUpdate: undefined,
65
65
  currentAttachment: undefined,
66
66
  jwt: null,
67
+ unreadMessages: 0,
67
68
  }
68
69
 
69
70
  export function useWebchat() {
@@ -71,7 +72,6 @@ export function useWebchat() {
71
72
  webchatReducer,
72
73
  webchatInitialState
73
74
  )
74
-
75
75
  const addMessage = message =>
76
76
  webchatDispatch({ type: ADD_MESSAGE, payload: message })
77
77
  const addMessageComponent = message =>
@@ -119,11 +119,14 @@ export function useWebchat() {
119
119
  type: UPDATE_DEV_SETTINGS,
120
120
  payload: settings,
121
121
  })
122
- const toggleWebchat = toggle =>
122
+
123
+ const toggleWebchat = toggle => {
123
124
  webchatDispatch({
124
125
  type: TOGGLE_WEBCHAT,
125
126
  payload: toggle,
126
127
  })
128
+ }
129
+
127
130
  const toggleEmojiPicker = toggle =>
128
131
  webchatDispatch({
129
132
  type: TOGGLE_EMOJI_PICKER,
@@ -12,13 +12,7 @@ export const messagesReducer = (state, action) => {
12
12
  case ADD_MESSAGE:
13
13
  return addMessageReducer(state, action)
14
14
  case ADD_MESSAGE_COMPONENT:
15
- return {
16
- ...state,
17
- messagesComponents: [
18
- ...(state.messagesComponents || []),
19
- action.payload,
20
- ],
21
- }
15
+ return addMessageComponent(action, state)
22
16
  case UPDATE_MESSAGE:
23
17
  return updateMessageReducer(state, action)
24
18
  case UPDATE_REPLIES:
@@ -39,6 +33,21 @@ export const messagesReducer = (state, action) => {
39
33
  }
40
34
  }
41
35
 
36
+ function addMessageComponent(action, state) {
37
+ const messageComponent = action.payload
38
+ const isUnreadMessage =
39
+ !state.isWebchatOpen && messageComponent.props.ack !== 1
40
+ const unreadMessages = isUnreadMessage
41
+ ? state.unreadMessages + 1
42
+ : state.unreadMessages
43
+
44
+ return {
45
+ ...state,
46
+ messagesComponents: [...(state.messagesComponents || []), messageComponent],
47
+ unreadMessages,
48
+ }
49
+ }
50
+
42
51
  function updateMessageReducer(state, action) {
43
52
  const msgIndex = state.messagesJSON.map(m => m.id).indexOf(action.payload.id)
44
53
  if (msgIndex > -1) {
@@ -0,0 +1,71 @@
1
+ import React, { useContext } from 'react'
2
+
3
+ import { ROLES, WEBCHAT } from '../../constants'
4
+ import { WebchatContext } from '../../contexts'
5
+ import { resolveImage } from '../../util/environment'
6
+ import {
7
+ StyledTriggerButton,
8
+ TriggerImage,
9
+ UnreadMessagesCounter,
10
+ } from './styles'
11
+
12
+ export const TriggerButton = (): JSX.Element => {
13
+ const { webchatState, getThemeProperty, toggleWebchat } =
14
+ useContext(WebchatContext)
15
+
16
+ const getTriggerImage = () => {
17
+ const image = getThemeProperty(
18
+ WEBCHAT.CUSTOM_PROPERTIES.triggerButtonImage,
19
+ undefined
20
+ )
21
+
22
+ if (!image) {
23
+ webchatState.theme.triggerButtonImage = WEBCHAT.DEFAULTS.LOGO
24
+ return null
25
+ }
26
+ return image
27
+ }
28
+
29
+ const triggerButtonImage = getTriggerImage()
30
+
31
+ const triggerButtonStyle = getThemeProperty(
32
+ WEBCHAT.CUSTOM_PROPERTIES.triggerButtonStyle
33
+ )
34
+
35
+ const CustomTriggerButton = getThemeProperty(
36
+ WEBCHAT.CUSTOM_PROPERTIES.customTrigger,
37
+ undefined
38
+ )
39
+
40
+ const handleClick = (event: any) => {
41
+ toggleWebchat(true)
42
+ event.preventDefault()
43
+ }
44
+
45
+ return (
46
+ <div
47
+ onClick={event => {
48
+ handleClick(event)
49
+ }}
50
+ >
51
+ {webchatState.unreadMessages !== 0 && (
52
+ <UnreadMessagesCounter className='trigger-notifications'>
53
+ {webchatState.unreadMessages}
54
+ </UnreadMessagesCounter>
55
+ )}
56
+ {CustomTriggerButton ? (
57
+ //@ts-ignore
58
+ <CustomTriggerButton />
59
+ ) : (
60
+ <StyledTriggerButton
61
+ role={ROLES.TRIGGER_BUTTON}
62
+ style={triggerButtonStyle}
63
+ >
64
+ {triggerButtonImage && (
65
+ <TriggerImage src={resolveImage(triggerButtonImage)} />
66
+ )}
67
+ </StyledTriggerButton>
68
+ )}
69
+ </div>
70
+ )
71
+ }
@@ -0,0 +1,39 @@
1
+ import styled from 'styled-components'
2
+
3
+ import { COLORS } from '../../constants'
4
+
5
+ export const StyledTriggerButton = styled.div`
6
+ cursor: pointer;
7
+ position: fixed;
8
+ background: ${COLORS.SOLID_WHITE};
9
+ border-radius: 50%;
10
+ display: flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ overflow: hidden;
14
+ width: 65px;
15
+ height: 65px;
16
+ bottom: 20px;
17
+ right: 10px;
18
+ padding: 8px;
19
+ `
20
+
21
+ export const UnreadMessagesCounter = styled.div`
22
+ display: flex;
23
+ justify-content: center;
24
+ align-items: center;
25
+ border-radius: 50%;
26
+ position: absolute;
27
+ right: 20px;
28
+ bottom: 80px;
29
+ width: 24px;
30
+ height: 24px;
31
+ background-color: #ff426f;
32
+ color: white;
33
+ z-index: 10;
34
+ `
35
+
36
+ export const TriggerImage = styled.img`
37
+ max-width: 100%;
38
+ max-height: 100%;
39
+ `
@@ -35,8 +35,14 @@ export function webchatReducer(state, action) {
35
35
  }
36
36
  case UPDATE_HANDOFF:
37
37
  return { ...state, handoff: action.payload }
38
- case TOGGLE_WEBCHAT:
39
- return { ...state, isWebchatOpen: action.payload }
38
+ case TOGGLE_WEBCHAT: {
39
+ const isWebchatOpen = action.payload
40
+ return {
41
+ ...state,
42
+ isWebchatOpen,
43
+ unreadMessages: isWebchatOpen ? 0 : state.unreadMessages,
44
+ }
45
+ }
40
46
  case TOGGLE_EMOJI_PICKER:
41
47
  return { ...state, isEmojiPickerOpen: action.payload }
42
48
  case TOGGLE_PERSISTENT_MENU:
@@ -37,7 +37,7 @@ import {
37
37
  } from '../message-utils'
38
38
  import { msgToBotonic } from '../msg-to-botonic'
39
39
  import { scrollToBottom } from '../util/dom'
40
- import { isDev, resolveImage } from '../util/environment'
40
+ import { isDev } from '../util/environment'
41
41
  import { deserializeRegex, stringifyWithRegexs } from '../util/regexs'
42
42
  import {
43
43
  _getThemeProperty,
@@ -63,6 +63,7 @@ import {
63
63
  } from './hooks'
64
64
  import { WebchatMessageList } from './message-list'
65
65
  import { WebchatReplies } from './replies'
66
+ import { TriggerButton } from './trigger-button'
66
67
  import { useStorageState } from './use-storage-state-hook'
67
68
  import { WebviewContainer } from './webview'
68
69
 
@@ -86,22 +87,6 @@ const StyledWebchat = styled.div`
86
87
  flex-direction: column;
87
88
  `
88
89
 
89
- const StyledTriggerButton = styled.div`
90
- cursor: pointer;
91
- position: fixed;
92
- background: ${COLORS.SOLID_WHITE};
93
- border-radius: 50%;
94
- display: flex;
95
- align-items: center;
96
- justify-content: center;
97
- overflow: hidden;
98
- width: 65px;
99
- height: 65px;
100
- bottom: 20px;
101
- right: 10px;
102
- padding: 8px;
103
- `
104
-
105
90
  const UserInputContainer = styled.div`
106
91
  min-height: 52px;
107
92
  position: relative;
@@ -120,11 +105,6 @@ const TextAreaContainer = styled.div`
120
105
  align-items: center;
121
106
  `
122
107
 
123
- const TriggerImage = styled.img`
124
- max-width: 100%;
125
- max-height: 100%;
126
- `
127
-
128
108
  const ErrorMessageContainer = styled.div`
129
109
  position: relative;
130
110
  display: flex;
@@ -448,6 +428,7 @@ export const Webchat = forwardRef((props, ref) => {
448
428
  }
449
429
  return false
450
430
  }
431
+
451
432
  const closeMenu = () => {
452
433
  togglePersistentMenu(false)
453
434
  }
@@ -711,43 +692,6 @@ export const Webchat = forwardRef((props, ref) => {
711
692
  }
712
693
  }, [webchatState.isWebchatOpen])
713
694
 
714
- const getTriggerImage = () => {
715
- const triggerImage = getThemeProperty(
716
- WEBCHAT.CUSTOM_PROPERTIES.triggerButtonImage,
717
- null
718
- )
719
- if (triggerImage === null) {
720
- webchatState.theme.triggerButtonImage = WEBCHAT.DEFAULTS.LOGO
721
- return null
722
- }
723
- return triggerImage
724
- }
725
-
726
- const triggerButtonStyle = getThemeProperty(
727
- WEBCHAT.CUSTOM_PROPERTIES.triggerButtonStyle
728
- )
729
-
730
- const CustomTriggerButton = getThemeProperty(
731
- WEBCHAT.CUSTOM_PROPERTIES.customTrigger,
732
- undefined
733
- )
734
-
735
- const triggerButton = () => {
736
- if (CustomTriggerButton) {
737
- return <CustomTriggerButton />
738
- }
739
- return (
740
- <StyledTriggerButton
741
- role={ROLES.TRIGGER_BUTTON}
742
- style={{ ...triggerButtonStyle }}
743
- >
744
- {getTriggerImage() && (
745
- <TriggerImage src={resolveImage(getTriggerImage())} />
746
- )}
747
- </StyledTriggerButton>
748
- )
749
- }
750
-
751
695
  const webchatMessageList = () => (
752
696
  <WebchatMessageList style={{ flex: 1 }}>
753
697
  {webchatState.typing && <TypingIndicator />}
@@ -917,16 +861,7 @@ export const Webchat = forwardRef((props, ref) => {
917
861
  updateWebchatDevSettings: updateWebchatDevSettings,
918
862
  }}
919
863
  >
920
- {!webchatState.isWebchatOpen && (
921
- <div
922
- onClick={event => {
923
- toggleWebchat(true)
924
- event.preventDefault()
925
- }}
926
- >
927
- {triggerButton()}
928
- </div>
929
- )}
864
+ {!webchatState.isWebchatOpen && <TriggerButton />}
930
865
 
931
866
  {webchatState.isWebchatOpen && (
932
867
  <StyledWebchat