@botonic/react
Version:
Build Chatbots using React
122 lines (116 loc) • 3.04 kB
JSX
import React from 'react'
import { createRoot } from 'react-dom/client'
import { SENDERS } from './index-types'
import { ReactBot } from './react-bot'
import { onDOMLoaded } from './util/dom'
import { WebchatDev } from './webchat/webchat-dev'
import { WebchatApp } from './webchat-app'
export class DevApp extends WebchatApp {
constructor({
theme = {},
persistentMenu,
coverComponent,
blockInputs,
enableEmojiPicker,
enableAttachments,
enableUserInput,
enableAnimations,
shadowDOM,
hostId,
storage,
storageKey,
onInit,
onOpen,
onClose,
onMessage,
onTrackEvent,
...botOptions
}) {
super({
theme,
persistentMenu,
coverComponent,
blockInputs,
enableEmojiPicker,
enableAttachments,
enableUserInput,
enableAnimations,
shadowDOM,
hostId,
storage,
storageKey,
onInit,
onOpen,
onClose,
onMessage,
onTrackEvent,
})
this.bot = new ReactBot({
...botOptions,
})
}
getComponent(host, optionsAtRuntime = {}) {
let {
theme = {},
storage,
storageKey,
onInit,
onOpen,
onClose,
onMessage,
onTrackEvent,
hostId,
...webchatOptions
} = optionsAtRuntime
theme = super.createInitialTheme(optionsAtRuntime)
storage = storage || this.storage
storageKey = storageKey || this.storageKey
this.onInit = onInit || this.onInit
this.onOpen = onOpen || this.onOpen
this.onClose = onClose || this.onClose
this.onMessage = onMessage || this.onMessage
this.onTrackEvent = onTrackEvent || this.onTrackEvent
this.hostId = hostId || this.hostId
this.createRootElement(host)
return (
<WebchatDev
{...webchatOptions}
ref={this.webchatRef}
host={this.host}
shadowDOM={this.shadowDOM}
theme={theme}
storage={storage}
storageKey={storageKey}
onInit={(...args) => this.onInitWebchat(...args)}
onOpen={(...args) => this.onOpenWebchat(...args)}
onClose={(...args) => this.onCloseWebchat(...args)}
onUserInput={(...args) => this.onUserInput(...args)}
onTrackEvent={(...args) => this.onTrackEvent(...args)}
/>
)
}
render(dest, optionsAtRuntime = {}) {
onDOMLoaded(() => {
const devAppComponent = this.getComponent(dest, optionsAtRuntime)
const container = this.getReactMountNode(dest)
const reactRoot = createRoot(container)
reactRoot.render(devAppComponent)
})
}
async onUserInput({ input, session, lastRoutePath }) {
this.onMessage &&
this.onMessage(this, {
sentBy: SENDERS.user,
message: input,
})
const resp = await this.bot.input({ input, session, lastRoutePath })
this.onMessage &&
resp.response.map(r =>
this.onMessage(this, {
sentBy: SENDERS.bot,
message: r,
})
)
this.webchatRef.current.addBotResponse(resp)
}
}