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) => ( + + + + + + ))} + + + + + + + + + + + + + ) 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,