2022-01-15 17:30:20 +01:00
|
|
|
import {
|
|
|
|
PopoverContent,
|
|
|
|
PopoverArrow,
|
|
|
|
PopoverBody,
|
|
|
|
useEventListener,
|
2022-01-18 18:25:18 +01:00
|
|
|
Portal,
|
2022-01-19 09:44:21 +01:00
|
|
|
IconButton,
|
2022-01-15 17:30:20 +01:00
|
|
|
} from '@chakra-ui/react'
|
2022-01-19 09:44:21 +01:00
|
|
|
import { ExpandIcon } from 'assets/icons'
|
2022-01-06 16:54:23 +01:00
|
|
|
import { useTypebot } from 'contexts/TypebotContext/TypebotContext'
|
2022-01-12 09:10:59 +01:00
|
|
|
import {
|
|
|
|
InputStep,
|
|
|
|
InputStepType,
|
2022-01-18 18:25:18 +01:00
|
|
|
IntegrationStepType,
|
2022-01-14 07:49:24 +01:00
|
|
|
LogicStepType,
|
|
|
|
Step,
|
2022-01-18 18:25:18 +01:00
|
|
|
StepOptions,
|
2022-01-20 16:14:47 +01:00
|
|
|
TextBubbleStep,
|
2022-01-12 09:10:59 +01:00
|
|
|
} from 'models'
|
2022-01-15 17:30:20 +01:00
|
|
|
import { useRef } from 'react'
|
2022-01-10 08:05:03 +01:00
|
|
|
import {
|
|
|
|
TextInputSettingsBody,
|
|
|
|
NumberInputSettingsBody,
|
|
|
|
EmailInputSettingsBody,
|
|
|
|
UrlInputSettingsBody,
|
|
|
|
DateInputSettingsBody,
|
|
|
|
} from './bodies'
|
2022-01-12 09:10:59 +01:00
|
|
|
import { ChoiceInputSettingsBody } from './bodies/ChoiceInputSettingsBody'
|
2022-01-15 17:30:20 +01:00
|
|
|
import { ConditionSettingsBody } from './bodies/ConditionSettingsBody'
|
2022-01-19 14:25:15 +01:00
|
|
|
import { GoogleAnalyticsSettings } from './bodies/GoogleAnalyticsSettings'
|
2022-01-18 18:25:18 +01:00
|
|
|
import { GoogleSheetsSettingsBody } from './bodies/GoogleSheetsSettingsBody'
|
2022-01-10 10:43:27 +01:00
|
|
|
import { PhoneNumberSettingsBody } from './bodies/PhoneNumberSettingsBody'
|
2022-01-20 07:21:08 +01:00
|
|
|
import { RedirectSettings } from './bodies/RedirectSettings'
|
2022-01-14 07:49:24 +01:00
|
|
|
import { SetVariableSettingsBody } from './bodies/SetVariableSettingsBody'
|
2022-01-06 16:54:23 +01:00
|
|
|
|
|
|
|
type Props = {
|
2022-01-20 16:14:47 +01:00
|
|
|
step: Exclude<Step, TextBubbleStep>
|
2022-01-19 09:44:21 +01:00
|
|
|
onExpandClick: () => void
|
2022-01-06 16:54:23 +01:00
|
|
|
}
|
2022-01-14 07:49:24 +01:00
|
|
|
|
2022-01-19 09:44:21 +01:00
|
|
|
export const SettingsPopoverContent = ({ step, onExpandClick }: Props) => {
|
2022-01-15 17:30:20 +01:00
|
|
|
const ref = useRef<HTMLDivElement | null>(null)
|
2022-01-06 16:54:23 +01:00
|
|
|
const handleMouseDown = (e: React.MouseEvent) => e.stopPropagation()
|
|
|
|
|
2022-01-15 17:30:20 +01:00
|
|
|
const handleMouseWheel = (e: WheelEvent) => {
|
|
|
|
e.stopPropagation()
|
|
|
|
}
|
|
|
|
useEventListener('wheel', handleMouseWheel, ref.current)
|
2022-01-06 16:54:23 +01:00
|
|
|
return (
|
2022-01-18 18:25:18 +01:00
|
|
|
<Portal>
|
2022-01-19 14:25:15 +01:00
|
|
|
<PopoverContent onMouseDown={handleMouseDown} pos="relative">
|
2022-01-18 18:25:18 +01:00
|
|
|
<PopoverArrow />
|
2022-01-19 09:44:21 +01:00
|
|
|
<PopoverBody
|
2022-01-19 18:54:49 +01:00
|
|
|
p="6"
|
2022-01-19 09:44:21 +01:00
|
|
|
overflowY="scroll"
|
|
|
|
maxH="400px"
|
|
|
|
ref={ref}
|
|
|
|
shadow="lg"
|
|
|
|
>
|
2022-01-19 14:25:15 +01:00
|
|
|
<StepSettings step={step} />
|
2022-01-18 18:25:18 +01:00
|
|
|
</PopoverBody>
|
2022-01-19 14:25:15 +01:00
|
|
|
<IconButton
|
|
|
|
pos="absolute"
|
|
|
|
top="5px"
|
|
|
|
right="5px"
|
|
|
|
aria-label="expand"
|
|
|
|
icon={<ExpandIcon />}
|
|
|
|
size="xs"
|
|
|
|
onClick={onExpandClick}
|
|
|
|
/>
|
2022-01-18 18:25:18 +01:00
|
|
|
</PopoverContent>
|
|
|
|
</Portal>
|
2022-01-06 16:54:23 +01:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2022-01-19 09:44:21 +01:00
|
|
|
export const StepSettings = ({ step }: { step: Step }) => {
|
2022-01-06 16:54:23 +01:00
|
|
|
const { updateStep } = useTypebot()
|
2022-01-18 18:25:18 +01:00
|
|
|
const handleOptionsChange = (options: StepOptions) =>
|
|
|
|
updateStep(step.id, { options } as Partial<InputStep>)
|
2022-01-06 16:54:23 +01:00
|
|
|
|
|
|
|
switch (step.type) {
|
2022-01-08 07:40:55 +01:00
|
|
|
case InputStepType.TEXT: {
|
2022-01-06 16:54:23 +01:00
|
|
|
return (
|
|
|
|
<TextInputSettingsBody
|
|
|
|
options={step.options}
|
|
|
|
onOptionsChange={handleOptionsChange}
|
|
|
|
/>
|
|
|
|
)
|
|
|
|
}
|
2022-01-08 07:40:55 +01:00
|
|
|
case InputStepType.NUMBER: {
|
|
|
|
return (
|
|
|
|
<NumberInputSettingsBody
|
|
|
|
options={step.options}
|
|
|
|
onOptionsChange={handleOptionsChange}
|
|
|
|
/>
|
|
|
|
)
|
|
|
|
}
|
2022-01-08 08:20:54 +01:00
|
|
|
case InputStepType.EMAIL: {
|
|
|
|
return (
|
|
|
|
<EmailInputSettingsBody
|
|
|
|
options={step.options}
|
|
|
|
onOptionsChange={handleOptionsChange}
|
|
|
|
/>
|
|
|
|
)
|
|
|
|
}
|
2022-01-09 07:36:29 +01:00
|
|
|
case InputStepType.URL: {
|
|
|
|
return (
|
|
|
|
<UrlInputSettingsBody
|
|
|
|
options={step.options}
|
|
|
|
onOptionsChange={handleOptionsChange}
|
|
|
|
/>
|
|
|
|
)
|
|
|
|
}
|
2022-01-10 08:05:03 +01:00
|
|
|
case InputStepType.DATE: {
|
|
|
|
return (
|
|
|
|
<DateInputSettingsBody
|
|
|
|
options={step.options}
|
|
|
|
onOptionsChange={handleOptionsChange}
|
|
|
|
/>
|
|
|
|
)
|
|
|
|
}
|
2022-01-10 10:43:27 +01:00
|
|
|
case InputStepType.PHONE: {
|
|
|
|
return (
|
|
|
|
<PhoneNumberSettingsBody
|
|
|
|
options={step.options}
|
|
|
|
onOptionsChange={handleOptionsChange}
|
|
|
|
/>
|
|
|
|
)
|
|
|
|
}
|
2022-01-12 09:10:59 +01:00
|
|
|
case InputStepType.CHOICE: {
|
|
|
|
return (
|
|
|
|
<ChoiceInputSettingsBody
|
|
|
|
options={step.options}
|
|
|
|
onOptionsChange={handleOptionsChange}
|
|
|
|
/>
|
|
|
|
)
|
|
|
|
}
|
2022-01-14 07:49:24 +01:00
|
|
|
case LogicStepType.SET_VARIABLE: {
|
|
|
|
return (
|
|
|
|
<SetVariableSettingsBody
|
|
|
|
options={step.options}
|
|
|
|
onOptionsChange={handleOptionsChange}
|
|
|
|
/>
|
|
|
|
)
|
|
|
|
}
|
2022-01-15 17:30:20 +01:00
|
|
|
case LogicStepType.CONDITION: {
|
|
|
|
return (
|
|
|
|
<ConditionSettingsBody
|
|
|
|
options={step.options}
|
|
|
|
onOptionsChange={handleOptionsChange}
|
|
|
|
/>
|
|
|
|
)
|
|
|
|
}
|
2022-01-20 07:21:08 +01:00
|
|
|
case LogicStepType.REDIRECT: {
|
|
|
|
return (
|
|
|
|
<RedirectSettings
|
|
|
|
options={step.options}
|
|
|
|
onOptionsChange={handleOptionsChange}
|
|
|
|
/>
|
|
|
|
)
|
|
|
|
}
|
2022-01-18 18:25:18 +01:00
|
|
|
case IntegrationStepType.GOOGLE_SHEETS: {
|
|
|
|
return (
|
|
|
|
<GoogleSheetsSettingsBody
|
|
|
|
options={step.options}
|
|
|
|
onOptionsChange={handleOptionsChange}
|
|
|
|
stepId={step.id}
|
|
|
|
/>
|
|
|
|
)
|
|
|
|
}
|
2022-01-19 14:25:15 +01:00
|
|
|
case IntegrationStepType.GOOGLE_ANALYTICS: {
|
|
|
|
return (
|
|
|
|
<GoogleAnalyticsSettings
|
|
|
|
options={step.options}
|
|
|
|
onOptionsChange={handleOptionsChange}
|
|
|
|
/>
|
|
|
|
)
|
|
|
|
}
|
2022-01-06 16:54:23 +01:00
|
|
|
default: {
|
|
|
|
return <></>
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|