@botonic/react 0.20.9 → 0.21.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.
- package/lib/components/image.js +3 -3
- package/lib/components/image.js.map +1 -1
- package/lib/components/index.d.ts +2 -2
- package/lib/components/message.js +3 -1
- package/lib/components/message.js.map +1 -1
- package/lib/components/timestamps.js +4 -1
- package/lib/components/timestamps.js.map +1 -1
- package/lib/index.d.ts +6 -5
- package/lib/webchat/components/emoji-picker.js +6 -1
- package/lib/webchat/components/emoji-picker.js.map +1 -1
- package/lib/webchat/devices/scrollbar-controller.js +1 -1
- package/lib/webchat/devices/scrollbar-controller.js.map +1 -1
- package/lib/webchat/hooks.js +1 -1
- package/lib/webchat/hooks.js.map +1 -1
- package/lib/webchat/use-storage-state-hook.js +47 -16
- package/lib/webchat/use-storage-state-hook.js.map +1 -1
- package/lib/webchat/webchat.js +137 -69
- package/lib/webchat/webchat.js.map +1 -1
- package/lib/webchat-app.js +13 -6
- package/lib/webchat-app.js.map +1 -1
- package/lib/webview.js +42 -25
- package/lib/webview.js.map +1 -1
- package/package.json +2 -2
- package/src/webchat/components/emoji-picker.jsx +14 -7
- package/src/webchat/devices/scrollbar-controller.js +3 -1
- package/src/webchat/hooks.js +1 -1
- package/src/webchat/webchat.jsx +50 -1
- package/src/webview.jsx +2 -1
package/lib/webview.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/webview.jsx"],"names":["App","props","url","URL","window","location","href","params","Array","from","searchParams","entries","filter","key","value","reduce","o","session","JSON","parse","get","state","options","payload","path","s","baseUrl","_hubtype_api","method","bot","id","data","chat_id","user","resp","console","log","provider","PROVIDER","WHATSAPP","
|
|
1
|
+
{"version":3,"sources":["../src/webview.jsx"],"names":["App","props","url","URL","window","location","href","params","Array","from","searchParams","entries","filter","key","value","reduce","o","session","JSON","parse","get","state","options","payload","path","s","baseUrl","_hubtype_api","method","bot","id","data","chat_id","user","resp","console","log","provider","impId","imp_id","PROVIDER","WHATSAPP","phone_number","unformatted_phone_number","TELEGRAM","APPLE","TWITTER","FACEBOOK","MessengerExtensions","requestCloseBrowser","undefined","err","e","WEBCHAT","parent","postMessage","requestContext","getString","stringId","locales","__locale","closeWebview","close","bind","webviews","map","Webview","i","name","React","Component","WebviewApp","dest"],"mappings":"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","sourcesContent":["import { getString, params2queryString, PROVIDER } from '@botonic/core'\nimport axios from 'axios'\nimport React from 'react'\nimport { render } from 'react-dom'\nimport { BrowserRouter, Route } from 'react-router-dom'\n\nimport { RequestContext } from './contexts'\n\nclass App extends React.Component {\n constructor(props) {\n super(props)\n const url = new URL(window.location.href)\n const params = Array.from(url.searchParams.entries())\n .filter(([key, value]) => key != 'context')\n .reduce((o, [key, value]) => {\n o[key] = value\n return o\n }, {})\n const session = JSON.parse(url.searchParams.get('context') || {})\n this.state = { session, params }\n }\n\n async close(options) {\n let payload = options ? options.payload : null\n if (options.path) payload = `__PATH_PAYLOAD__${options.path}`\n if (payload) {\n if (options.params) {\n payload = `${payload}?${params2queryString(options.params)}`\n }\n const s = this.state.session\n try {\n const baseUrl = s._hubtype_api || 'https://api.hubtype.com'\n const resp = await axios({\n method: 'post',\n url: `${baseUrl}/v1/bots/${s.bot.id}/send_postback/`,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n data: { payload: payload, chat_id: s.user.id },\n })\n } catch (e) {\n console.log(e)\n }\n }\n const provider = this.state.session.user.provider\n const impId = this.state.session.user.imp_id\n if (provider === PROVIDER.WHATSAPP) {\n const phone_number = this.state.session.user.unformatted_phone_number\n location.href = 'https://wa.me/' + phone_number\n }\n if (provider === PROVIDER.TELEGRAM) {\n location.href = 'https://t.me/' + impId\n }\n if (provider === PROVIDER.APPLE) {\n location.href = 'https://bcrw.apple.com/urn:biz:' + impId\n }\n if (provider === PROVIDER.TWITTER) {\n location.href =\n 'https://twitter.com/messages/compose?recipient_id=' + impId\n }\n if (provider === PROVIDER.FACEBOOK) {\n try {\n window.MessengerExtensions.requestCloseBrowser(\n () => undefined,\n err => console.log(err)\n )\n } catch (e) {}\n }\n if (provider === PROVIDER.WEBCHAT) {\n try {\n await parent.postMessage('botonicCloseWebview', '*')\n } catch (e) {}\n }\n }\n\n render() {\n const requestContext = {\n getString: stringId =>\n getString(this.props.locales, this.state.session.__locale, stringId),\n session: this.state.session || {},\n params: this.state.params || {},\n closeWebview: this.close.bind(this),\n }\n\n return (\n <RequestContext.Provider value={requestContext}>\n {this.props.webviews.map((Webview, i) => (\n <Route key={i} path={`/${Webview.name}`} component={Webview} />\n ))}\n </RequestContext.Provider>\n )\n }\n}\n\nexport class WebviewApp {\n constructor({ webviews, locales }) {\n this.webviews = webviews\n this.locales = locales\n }\n\n render(dest) {\n render(\n <BrowserRouter>\n <App webviews={this.webviews} locales={this.locales} />\n </BrowserRouter>,\n dest\n )\n }\n}\n"],"file":"webview.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@botonic/react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Build Chatbots using React",
|
|
6
6
|
"main": "src/index.js",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"README.md"
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@botonic/core": "
|
|
31
|
+
"@botonic/core": "~0.21.1",
|
|
32
32
|
"axios": "^0.24.0",
|
|
33
33
|
"emoji-picker-react": "^3.2.3",
|
|
34
34
|
"framer-motion": "^3.1.1",
|
|
@@ -7,13 +7,20 @@ import { ROLES } from '../../constants'
|
|
|
7
7
|
import { useComponentVisible } from '../hooks'
|
|
8
8
|
import { Icon, IconContainer } from './common'
|
|
9
9
|
|
|
10
|
-
export const EmojiPicker = props =>
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
export const EmojiPicker = props => {
|
|
11
|
+
const onClick = event => {
|
|
12
|
+
props.onClick()
|
|
13
|
+
event.stopPropagation()
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<IconContainer role={ROLES.EMOJI_PICKER_ICON}>
|
|
18
|
+
<div onClick={onClick}>
|
|
19
|
+
<Icon src={LogoEmoji} />
|
|
20
|
+
</div>
|
|
21
|
+
</IconContainer>
|
|
22
|
+
)
|
|
23
|
+
}
|
|
17
24
|
|
|
18
25
|
const Container = styled.div`
|
|
19
26
|
display: flex;
|
|
@@ -83,7 +83,9 @@ export class ScrollbarController {
|
|
|
83
83
|
this.webchat.ontouchstart = {}
|
|
84
84
|
return
|
|
85
85
|
}
|
|
86
|
-
this.webchat.ontouchmove = e =>
|
|
86
|
+
this.webchat.ontouchmove = e => {
|
|
87
|
+
if (e.target === e.currentTarget) e.preventDefault()
|
|
88
|
+
}
|
|
87
89
|
}
|
|
88
90
|
|
|
89
91
|
limitScrollBoundaries() {
|
package/src/webchat/hooks.js
CHANGED
|
@@ -247,7 +247,7 @@ export function useComponentVisible(initialIsVisible, onClickOutside) {
|
|
|
247
247
|
const [isComponentVisible, setIsComponentVisible] = useState(initialIsVisible)
|
|
248
248
|
const ref = useRef(null)
|
|
249
249
|
const handleClickOutside = event => {
|
|
250
|
-
if (ref.current && !ref.current.contains(event.
|
|
250
|
+
if (ref.current && !ref.current.contains(event.path[0])) {
|
|
251
251
|
setIsComponentVisible(false)
|
|
252
252
|
onClickOutside()
|
|
253
253
|
}
|
package/src/webchat/webchat.jsx
CHANGED
|
@@ -258,6 +258,21 @@ export const Webchat = forwardRef((props, ref) => {
|
|
|
258
258
|
})
|
|
259
259
|
}
|
|
260
260
|
|
|
261
|
+
const sendChatEvent = async chatEvent => {
|
|
262
|
+
const chatEventInput = {
|
|
263
|
+
id: uuidv4(),
|
|
264
|
+
type: INPUT.CHAT_EVENT,
|
|
265
|
+
data: chatEvent,
|
|
266
|
+
}
|
|
267
|
+
props.onUserInput &&
|
|
268
|
+
props.onUserInput({
|
|
269
|
+
user: webchatState.session.user,
|
|
270
|
+
input: chatEventInput,
|
|
271
|
+
session: webchatState.session,
|
|
272
|
+
lastRoutePath: webchatState.lastRoutePath,
|
|
273
|
+
})
|
|
274
|
+
}
|
|
275
|
+
|
|
261
276
|
// Load styles stored in window._botonicInsertStyles by Webpack
|
|
262
277
|
useComponentWillMount(() => {
|
|
263
278
|
if (window._botonicInsertStyles && window._botonicInsertStyles.length) {
|
|
@@ -642,11 +657,43 @@ export const Webchat = forwardRef((props, ref) => {
|
|
|
642
657
|
textArea.current.value = ''
|
|
643
658
|
}
|
|
644
659
|
|
|
660
|
+
let isTyping = false
|
|
661
|
+
let typingTimeout = null
|
|
662
|
+
|
|
663
|
+
function clearTimeoutWithReset(reset) {
|
|
664
|
+
const waitTime = 20 * 1000
|
|
665
|
+
if (typingTimeout) clearTimeout(typingTimeout)
|
|
666
|
+
if (reset) typingTimeout = setTimeout(stopTyping, waitTime)
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
function startTyping() {
|
|
670
|
+
isTyping = true
|
|
671
|
+
sendChatEvent('typing_on')
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
function stopTyping() {
|
|
675
|
+
clearTimeoutWithReset(false)
|
|
676
|
+
isTyping = false
|
|
677
|
+
sendChatEvent('typing_off')
|
|
678
|
+
}
|
|
679
|
+
|
|
645
680
|
const onKeyDown = event => {
|
|
646
|
-
if (event.keyCode
|
|
681
|
+
if (event.keyCode === 13 && event.shiftKey === false) {
|
|
647
682
|
event.preventDefault()
|
|
648
683
|
sendTextAreaText()
|
|
684
|
+
stopTyping()
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
const onKeyUp = () => {
|
|
689
|
+
if (textArea.current.value === '') {
|
|
690
|
+
stopTyping()
|
|
691
|
+
return
|
|
692
|
+
}
|
|
693
|
+
if (!isTyping) {
|
|
694
|
+
startTyping()
|
|
649
695
|
}
|
|
696
|
+
clearTimeoutWithReset(true)
|
|
650
697
|
}
|
|
651
698
|
|
|
652
699
|
const webviewRequestContext = {
|
|
@@ -766,6 +813,7 @@ export const Webchat = forwardRef((props, ref) => {
|
|
|
766
813
|
style={{
|
|
767
814
|
...getThemeProperty(WEBCHAT.CUSTOM_PROPERTIES.userInputStyle),
|
|
768
815
|
}}
|
|
816
|
+
className='user-input-container'
|
|
769
817
|
>
|
|
770
818
|
{webchatState.isEmojiPickerOpen && (
|
|
771
819
|
<OpenedEmojiPicker
|
|
@@ -798,6 +846,7 @@ export const Webchat = forwardRef((props, ref) => {
|
|
|
798
846
|
autoFocus={true}
|
|
799
847
|
inputRef={textArea}
|
|
800
848
|
onKeyDown={e => onKeyDown(e)}
|
|
849
|
+
onKeyUp={onKeyUp}
|
|
801
850
|
style={{
|
|
802
851
|
display: 'flex',
|
|
803
852
|
fontSize: deviceAdapter.fontSize(14),
|
package/src/webview.jsx
CHANGED
|
@@ -43,7 +43,8 @@ class App extends React.Component {
|
|
|
43
43
|
const provider = this.state.session.user.provider
|
|
44
44
|
const impId = this.state.session.user.imp_id
|
|
45
45
|
if (provider === PROVIDER.WHATSAPP) {
|
|
46
|
-
|
|
46
|
+
const phone_number = this.state.session.user.unformatted_phone_number
|
|
47
|
+
location.href = 'https://wa.me/' + phone_number
|
|
47
48
|
}
|
|
48
49
|
if (provider === PROVIDER.TELEGRAM) {
|
|
49
50
|
location.href = 'https://t.me/' + impId
|