Files
bot/apps/builder/src/features/templates/components/TemplatesModal.tsx

167 lines
4.7 KiB
TypeScript
Raw Normal View History

2022-04-05 09:51:43 +02:00
import {
Button,
chakra,
Divider,
2022-04-05 09:51:43 +02:00
Heading,
HStack,
Modal,
ModalBody,
ModalContent,
ModalOverlay,
Stack,
Tag,
Text,
Tooltip,
2022-04-05 09:51:43 +02:00
} from '@chakra-ui/react'
import { ExternalLinkIcon } from '@/components/icons'
import { Standard } from '@typebot.io/react'
2022-04-05 09:51:43 +02:00
import { Typebot } from 'models'
import React, { useCallback, useEffect, useState } from 'react'
import { templates } from '../data'
import { TemplateProps } from '../types'
import { useToast } from '@/hooks/useToast'
import { sendRequest } from 'utils'
2022-04-05 09:51:43 +02:00
type Props = {
isOpen: boolean
onClose: () => void
onTypebotChoose: (typebot: Typebot) => void
}
2022-04-05 09:51:43 +02:00
export const TemplatesModal = ({ isOpen, onClose, onTypebotChoose }: Props) => {
2022-04-05 09:51:43 +02:00
const [typebot, setTypebot] = useState<Typebot>()
const [selectedTemplate, setSelectedTemplate] = useState<TemplateProps>(
templates[0]
)
const [isLoading, setIsLoading] = useState(false)
2022-04-05 09:51:43 +02:00
2022-06-02 07:54:48 +02:00
const { showToast } = useToast()
2022-04-05 09:51:43 +02:00
const fetchTemplate = useCallback(
async (template: TemplateProps) => {
setSelectedTemplate(template)
const { data, error } = await sendRequest(
`/templates/${template.fileName}`
)
if (error)
return showToast({ title: error.name, description: error.message })
setTypebot(data as Typebot)
},
[showToast]
)
2022-04-05 09:51:43 +02:00
useEffect(() => {
fetchTemplate(templates[0])
}, [fetchTemplate])
2022-04-05 09:51:43 +02:00
2022-06-11 07:27:38 +02:00
const onUseThisTemplateClick = () => {
if (!typebot) return
onTypebotChoose(typebot)
setIsLoading(true)
}
2022-04-05 09:51:43 +02:00
return (
<Modal
isOpen={isOpen}
onClose={onClose}
size="6xl"
blockScrollOnMount={false}
>
2022-04-05 09:51:43 +02:00
<ModalOverlay />
<ModalContent h="85vh">
<ModalBody h="full" as={HStack} p="0" spacing="0">
<Stack w="full" h="full" spacing="4">
<Heading pl="10" pt="4" fontSize="2xl">
{selectedTemplate.emoji}{' '}
<chakra.span ml="2">{selectedTemplate.name}</chakra.span>
</Heading>
{typebot && (
<Standard
key={typebot.id}
typebot={typebot}
style={{
borderRadius: '0.25rem',
backgroundColor: '#fff',
}}
/>
)}
2022-04-05 09:51:43 +02:00
</Stack>
<Stack
h="full"
py="6"
w="300px"
px="4"
borderLeftWidth={1}
justify="space-between"
>
<Stack spacing={4}>
<Button
colorScheme="blue"
2022-06-11 07:27:38 +02:00
onClick={onUseThisTemplateClick}
isLoading={isLoading}
>
Use this template
</Button>
<Divider />
<Stack>
{templates.map((template) => (
<Tooltip
key={template.name}
isDisabled={!template.isComingSoon}
label="Coming soon!"
>
<span>
<Button
onClick={() => fetchTemplate(template)}
w="full"
variant={
selectedTemplate.name === template.name
? 'solid'
: 'ghost'
}
isDisabled={template.isComingSoon}
>
<HStack justifyContent="space-between" w="full">
<HStack overflow="hidden">
<Text>{template.emoji}</Text>
<Text noOfLines={0} display="block">
{template.name}
</Text>
</HStack>
{template.isNew && (
<Tag colorScheme="orange" size="sm" flexShrink={0}>
New
</Tag>
)}
</HStack>
</Button>
</span>
</Tooltip>
))}
</Stack>
</Stack>
<Stack>
<Divider />
<Tooltip label="Coming soon!" placement="top">
<span>
<Button
w="full"
variant="ghost"
isDisabled
leftIcon={<ExternalLinkIcon />}
>
Community templates
</Button>
</span>
</Tooltip>
</Stack>
</Stack>
</ModalBody>
2022-04-05 09:51:43 +02:00
</ModalContent>
</Modal>
)
}