import type { ContinueChatResponse, ChoiceInputBlock, EmailInputBlock, FileInputBlock, NumberInputBlock, PhoneNumberInputBlock, RatingInputBlock, RuntimeOptions, TextInputBlock, Theme, UrlInputBlock, PictureChoiceBlock, PaymentInputBlock, DateInputBlock, LocationBlock, } from '@indite.io/schemas' import { BotContext, InputSubmitContent } from '@/types' import { TextInput } from '@/features/blocks/inputs/textInput' import { NumberInput } from '@/features/blocks/inputs/number' import { EmailInput } from '@/features/blocks/inputs/email' import { UrlInput } from '@/features/blocks/inputs/url' import { PhoneInput } from '@/features/blocks/inputs/phone' import { DateForm } from '@/features/blocks/inputs/date' import { RatingForm } from '@/features/blocks/inputs/rating' import { FileUploadForm } from '@/features/blocks/inputs/fileUpload' import { createSignal, Switch, Match, createEffect, Show } from 'solid-js' import { isNotDefined } from '@indite.io/lib' import { isMobile } from '@/utils/isMobileSignal' import { PaymentForm } from '@/features/blocks/inputs/payment' import { MultipleChoicesForm } from '@/features/blocks/inputs/buttons/components/MultipleChoicesForm' import { Buttons } from '@/features/blocks/inputs/buttons/components/Buttons' import { SinglePictureChoice } from '@/features/blocks/inputs/pictureChoice/SinglePictureChoice' import { MultiplePictureChoice } from '@/features/blocks/inputs/pictureChoice/MultiplePictureChoice' import { formattedMessages } from '@/utils/formattedMessagesSignal' import { InputBlockType } from '@indite.io/schemas/features/blocks/inputs/constants' import { defaultPaymentInputOptions } from '@indite.io/schemas/features/blocks/inputs/payment/constants' import { persist } from '@/utils/persist' import { LocationChoiceButtons } from '@/features/blocks/inputs/location/components/LocationChoiceButtons' type Props = { ref: HTMLDivElement | undefined block: NonNullable hasHostAvatar: boolean guestAvatar?: NonNullable['guestAvatar'] chunkIndex: number context: BotContext isBrandingEnabled?: boolean isInputPrefillEnabled: boolean hasError: boolean onTransitionEnd: () => void onSubmit: (content: InputSubmitContent) => void onSkip: () => void botContainerWidth?: string } export const InputChatBlock = (props: Props) => { const [answer, setAnswer] = persist(createSignal(), { key: `bot-${props.context.bot.id}-input-${props.chunkIndex}`, storage: props.context.storage, }) const handleSubmit = async (content: InputSubmitContent) => { setAnswer(content) props.onSubmit(content) } const handleSkip = (label: string) => { setAnswer({ type: 'text', value: label }) props.onSkip() } createEffect(() => { const formattedMessage = formattedMessages().findLast( (message) => props.chunkIndex === message.inputIndex )?.formattedMessage if (formattedMessage && props.block.type !== InputBlockType.FILE) setAnswer((answer) => answer?.type === 'text' ? { ...answer, label: formattedMessage } : answer ) }) return ( {/* */}
) } const getAnswerValue = (answer?: InputSubmitContent) => { if (!answer) return return answer.type === 'text' ? answer.value : answer.url } export const Input = (props: { context: BotContext block: NonNullable chunkIndex: number isInputPrefillEnabled: boolean existingAnswer?: string onTransitionEnd: () => void onSubmit: (answer: InputSubmitContent) => void onSkip: (label: string) => void }) => { const onSubmit = (answer: InputSubmitContent) => props.onSubmit(answer) const getPrefilledValue = () => props.existingAnswer ?? (props.isInputPrefillEnabled ? props.block.prefilledValue : undefined) const submitPaymentSuccess = () => props.onSubmit({ type: 'text', value: (props.block.options as PaymentInputBlock['options'])?.labels ?.success ?? defaultPaymentInputOptions.labels.success, }) return ( {(block) => ( )} {(block) => ( )} ) } const isButtonsBlock = ( block: ContinueChatResponse['input'] ): ChoiceInputBlock | undefined => block?.type === InputBlockType.CHOICE ? block : undefined const isPictureChoiceBlock = ( block: ContinueChatResponse['input'] ): PictureChoiceBlock | undefined => block?.type === InputBlockType.PICTURE_CHOICE ? block : undefined