2
0
Files
bot/packages/bot-engine/src/components/ChatGroup/ChatBlock/InputChatBlock.tsx

145 lines
4.0 KiB
TypeScript
Raw Normal View History

import React, { useState } from 'react'
import { useAnswers } from '../../../contexts/AnswersContext'
2022-06-11 07:27:38 +02:00
import { InputBlock, InputBlockType } from 'models'
import { GuestBubble } from './bubbles/GuestBubble'
2022-01-08 08:20:54 +01:00
import { TextForm } from './inputs/TextForm'
import { byId } from 'utils'
2022-01-10 08:05:03 +01:00
import { DateForm } from './inputs/DateForm'
2022-01-12 09:10:59 +01:00
import { ChoiceForm } from './inputs/ChoiceForm'
2022-02-16 15:08:50 +01:00
import { useTypebot } from 'contexts/TypebotContext'
2022-03-09 15:12:00 +01:00
import { parseVariables } from '../../../services/variable'
import { isInputValid } from 'services/inputs'
2022-05-24 14:25:15 -07:00
import { PaymentForm } from './inputs/PaymentForm'
2022-06-07 19:09:08 +02:00
import { RatingForm } from './inputs/RatingForm'
import { FileUploadForm } from './inputs/FileUploadForm'
export type InputSubmitContent = {
label?: string
value: string
itemId?: string
}
2022-06-11 07:27:38 +02:00
export const InputChatBlock = ({
block,
hasAvatar,
hasGuestAvatar,
onTransitionEnd,
onSkip,
}: {
2022-06-11 07:27:38 +02:00
block: InputBlock
hasGuestAvatar: boolean
hasAvatar: boolean
onTransitionEnd: (
answerContent?: InputSubmitContent,
isRetry?: boolean
) => void
onSkip: () => void
}) => {
const { typebot } = useTypebot()
const { addAnswer } = useAnswers()
const [answer, setAnswer] = useState<string>()
const [isEditting, setIsEditting] = useState(false)
2022-06-11 07:27:38 +02:00
const { variableId } = block.options
const defaultValue =
typebot.settings.general.isInputPrefillEnabled ?? true
? variableId && typebot.variables.find(byId(variableId))?.value
: undefined
const handleSubmit = async ({ label, value, itemId }: InputSubmitContent) => {
setAnswer(label ?? value)
const isRetry = !isInputValid(value, block.type)
if (!isRetry && addAnswer)
await addAnswer({
2022-06-11 07:27:38 +02:00
blockId: block.id,
groupId: block.groupId,
content: value,
variableId: variableId ?? null,
uploadedFiles: block.type === InputBlockType.FILE,
})
if (!isEditting) onTransitionEnd({ label, value, itemId }, isRetry)
setIsEditting(false)
}
const handleGuestBubbleClick = () => {
setAnswer(undefined)
setIsEditting(true)
}
if (answer) {
const avatarUrl = typebot.theme.chat.guestAvatar?.url
2022-02-16 15:08:50 +01:00
return (
<GuestBubble
message={answer}
showAvatar={typebot.theme.chat.guestAvatar?.isEnabled ?? false}
avatarSrc={avatarUrl && parseVariables(typebot.variables)(avatarUrl)}
onClick={handleGuestBubbleClick}
2022-02-16 15:08:50 +01:00
/>
)
}
return (
<div className="flex justify-end">
{hasAvatar && (
<div className="flex w-6 xs:w-10 h-6 xs:h-10 mr-2 mb-2 mt-1 flex-shrink-0 items-center" />
)}
2022-04-08 18:07:14 -05:00
<Input
2022-06-11 07:27:38 +02:00
block={block}
2022-04-08 18:07:14 -05:00
onSubmit={handleSubmit}
onSkip={onSkip}
2022-04-08 18:07:14 -05:00
defaultValue={defaultValue?.toString()}
hasGuestAvatar={hasGuestAvatar}
2022-04-08 18:07:14 -05:00
/>
</div>
)
}
const Input = ({
2022-06-11 07:27:38 +02:00
block,
onSubmit,
onSkip,
defaultValue,
hasGuestAvatar,
}: {
2022-06-11 07:27:38 +02:00
block: InputBlock
onSubmit: (value: InputSubmitContent) => void
onSkip: () => void
defaultValue?: string
hasGuestAvatar: boolean
}) => {
2022-06-11 07:27:38 +02:00
switch (block.type) {
case InputBlockType.TEXT:
case InputBlockType.NUMBER:
case InputBlockType.EMAIL:
case InputBlockType.URL:
case InputBlockType.PHONE:
return (
<TextForm
2022-06-11 07:27:38 +02:00
block={block}
onSubmit={onSubmit}
defaultValue={defaultValue}
hasGuestAvatar={hasGuestAvatar}
/>
)
2022-06-11 07:27:38 +02:00
case InputBlockType.DATE:
return <DateForm options={block.options} onSubmit={onSubmit} />
case InputBlockType.CHOICE:
return <ChoiceForm block={block} onSubmit={onSubmit} />
case InputBlockType.PAYMENT:
2022-05-24 14:25:15 -07:00
return (
<PaymentForm
2022-06-11 07:27:38 +02:00
options={block.options}
onSuccess={() =>
onSubmit({ value: block.options.labels.success ?? 'Success' })
}
2022-05-24 14:25:15 -07:00
/>
)
2022-06-11 07:27:38 +02:00
case InputBlockType.RATING:
return <RatingForm block={block} onSubmit={onSubmit} />
case InputBlockType.FILE:
return (
<FileUploadForm block={block} onSubmit={onSubmit} onSkip={onSkip} />
)
2022-01-08 07:40:55 +01:00
}
}