diff --git a/apps/builder/components/templates/CreateNewTypebotButtons.tsx b/apps/builder/components/templates/CreateNewTypebotButtons.tsx
index 27fcae36e8a..9fcd34d35b5 100644
--- a/apps/builder/components/templates/CreateNewTypebotButtons.tsx
+++ b/apps/builder/components/templates/CreateNewTypebotButtons.tsx
@@ -113,7 +113,11 @@ export const CreateNewTypebotButtons = () => {
Import a file
-
+
)
}
diff --git a/apps/builder/components/templates/TemplatesModal.tsx b/apps/builder/components/templates/TemplatesModal.tsx
index bf8fe424972..6fa05f47b45 100644
--- a/apps/builder/components/templates/TemplatesModal.tsx
+++ b/apps/builder/components/templates/TemplatesModal.tsx
@@ -1,16 +1,18 @@
import {
Button,
+ chakra,
+ Divider,
Heading,
HStack,
Modal,
ModalBody,
ModalContent,
- ModalFooter,
- ModalHeader,
ModalOverlay,
Stack,
+ Tooltip,
useToast,
} from '@chakra-ui/react'
+import { ExternalLinkIcon } from 'assets/icons'
import { TypebotViewer } from 'bot-engine'
import { Typebot } from 'models'
import React, { useEffect, useState } from 'react'
@@ -18,10 +20,17 @@ import { parseTypebotToPublicTypebot } from 'services/publicTypebot'
import { sendRequest } from 'utils'
import { TemplateProps, templates } from './data'
-type Props = { isOpen: boolean; onClose: () => void }
+type Props = {
+ isOpen: boolean
+ onClose: () => void
+ onTypebotChoose: (typebot: Typebot) => void
+}
-export const TemplatesModal = ({ isOpen, onClose }: Props) => {
+export const TemplatesModal = ({ isOpen, onClose, onTypebotChoose }: Props) => {
const [typebot, setTypebot] = useState()
+ const [selectedTemplate, setSelectedTemplate] = useState(
+ templates[0]
+ )
const toast = useToast({
position: 'top-right',
@@ -34,6 +43,7 @@ export const TemplatesModal = ({ isOpen, onClose }: Props) => {
}, [])
const fetchTemplate = async (template: TemplateProps) => {
+ setSelectedTemplate(template)
const { data, error } = await sendRequest(`/templates/${template.fileName}`)
if (error) return toast({ title: error.name, description: error.message })
setTypebot(data as Typebot)
@@ -42,20 +52,83 @@ export const TemplatesModal = ({ isOpen, onClose }: Props) => {
return (
-
-
- Lead generation
-
-
- {typebot && (
-
- )}
-
-
+
+
+
+
+ {selectedTemplate.emoji}{' '}
+ {selectedTemplate.name}
+
+ {typebot && (
+
+ )}
-
-
+
+
+
+
+
+ {templates.map((template) => (
+
+
+
+
+
+ ))}
+
+
+
+
+
+
+
+ }
+ >
+ Community templates
+
+
+
+
+
+
)
diff --git a/apps/builder/components/templates/data.ts b/apps/builder/components/templates/data.ts
index b4ba99f092f..7f3c59f47c9 100644
--- a/apps/builder/components/templates/data.ts
+++ b/apps/builder/components/templates/data.ts
@@ -1,6 +1,41 @@
-export type TemplateProps = { name: string; emoji: string; fileName: string }
+export type TemplateProps = {
+ name: string
+ emoji: string
+ fileName: string
+ isComingSoon?: boolean
+}
export const templates: TemplateProps[] = [
{ name: 'Lead Generation', emoji: 'đ¤', fileName: 'lead-gen.json' },
{ name: 'Customer Support', emoji: 'đ', fileName: 'customer-support.json' },
+ {
+ name: 'Quiz',
+ emoji: 'đšī¸',
+ fileName: 'customer-support.json',
+ isComingSoon: true,
+ },
+ {
+ name: 'Lead Scoring',
+ emoji: 'đ',
+ fileName: 'customer-support.json',
+ isComingSoon: true,
+ },
+ {
+ name: 'FAQ',
+ emoji: 'đŦ',
+ fileName: 'customer-support.json',
+ isComingSoon: true,
+ },
+ {
+ name: 'Conversational Resume',
+ emoji: 'đ¨âđŧ',
+ fileName: 'customer-support.json',
+ isComingSoon: true,
+ },
+ {
+ name: 'User Onboarding',
+ emoji: 'đ§âđ',
+ fileName: 'customer-support.json',
+ isComingSoon: true,
+ },
]
diff --git a/apps/builder/playwright/tests/editor.spec.ts b/apps/builder/playwright/tests/editor.spec.ts
index e5ef9c98fa7..e1d2e6117ec 100644
--- a/apps/builder/playwright/tests/editor.spec.ts
+++ b/apps/builder/playwright/tests/editor.spec.ts
@@ -140,11 +140,13 @@ test.describe.parallel('Editor', () => {
])
await page.goto(`/typebots/${typebotId}/edit`)
- await page.click('text="My awesome typebot"')
- await page.fill('input[value="My awesome typebot"]', 'My superb typebot')
+
await page.click('[data-testid="editable-icon"]')
await page.fill('input[placeholder="Search..."]', 'love')
await page.click('text="đ"')
+ await page.click('text="My awesome typebot"')
+ await page.fill('input[value="My awesome typebot"]', 'My superb typebot')
+ await page.press('input[value="My superb typebot"]', 'Enter')
await page.goto(`/typebots`)
await expect(page.locator('text="đ"')).toBeVisible()
await expect(page.locator('text="My superb typebot"')).toBeVisible()
diff --git a/apps/builder/playwright/tests/templates.spec.ts b/apps/builder/playwright/tests/templates.spec.ts
index 7779a229547..90465163ad0 100644
--- a/apps/builder/playwright/tests/templates.spec.ts
+++ b/apps/builder/playwright/tests/templates.spec.ts
@@ -11,7 +11,6 @@ test.describe.parallel('Templates page', () => {
test('From file should import correctly', async ({ page }) => {
await page.goto('/typebots/create')
- await page.click('[data-testid="more-button"]')
await page.setInputFiles(
'input[type="file"]',
path.join(__dirname, '../fixtures/typebots/singleChoiceTarget.json')
@@ -21,8 +20,11 @@ test.describe.parallel('Templates page', () => {
test('Templates should be previewable and usable', async ({ page }) => {
await page.goto('/typebots/create')
- await page.click('[aria-label="Preview"] >> nth=0')
- await expect(typebotViewer(page).locator('text=Hi!')).toBeVisible()
+ await page.click('text=Start from a template')
+ await page.click('text=Customer Support')
+ await expect(
+ typebotViewer(page).locator('text=How can I help you?')
+ ).toBeVisible()
await page.click('text=Use this template')
await expect(page).toHaveURL(new RegExp(`/edit`))
})
diff --git a/apps/builder/public/templates/customer-support.json b/apps/builder/public/templates/customer-support.json
index b0d4130c193..e68432514d7 100644
--- a/apps/builder/public/templates/customer-support.json
+++ b/apps/builder/public/templates/customer-support.json
@@ -2,7 +2,8 @@
"id": "cl16la7p900990b1a72qjqbb3",
"createdAt": "2022-03-25T15:39:33.885Z",
"updatedAt": "2022-03-25T15:42:12.544Z",
- "name": "My typebot",
+ "name": "Customer Support",
+ "icon": "đ",
"ownerId": "cl13od3wt0000pl1aat7bdrxf",
"publishedTypebotId": null,
"folderId": null,
diff --git a/apps/builder/public/templates/lead-gen.json b/apps/builder/public/templates/lead-gen.json
index f6870ce3fa3..49367ab14b0 100644
--- a/apps/builder/public/templates/lead-gen.json
+++ b/apps/builder/public/templates/lead-gen.json
@@ -2,7 +2,8 @@
"id": "qgMiLSr4W1ftXocFncin1G",
"createdAt": "2022-02-05T06:21:16.522Z",
"updatedAt": "2022-02-05T06:21:16.522Z",
- "name": "My typebot",
+ "name": "Lead Generation",
+ "icon": "đ¤",
"ownerId": "ckz6t9iep0006k31a22j05fwq",
"publishedTypebotId": null,
"folderId": null,