From 260819f124f314bf6df3553a5d2bfb73bb74a397 Mon Sep 17 00:00:00 2001 From: Baptiste Arnaud Date: Mon, 7 Mar 2022 18:21:01 +0100 Subject: [PATCH] =?UTF-8?q?feat(settings):=20=E2=9C=A8=20Add=20create=20re?= =?UTF-8?q?sult=20on=20page=20refresh=20option?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../settings/GeneralSettingsForm.tsx | 16 +++++ .../builder/playwright/tests/settings.spec.ts | 4 ++ apps/viewer/layouts/TypebotPage.tsx | 3 +- apps/viewer/playwright/tests/settings.spec.ts | 67 +++++++++++++++++++ packages/models/src/typebot/settings.ts | 3 +- 5 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 apps/viewer/playwright/tests/settings.spec.ts diff --git a/apps/builder/components/settings/GeneralSettingsForm.tsx b/apps/builder/components/settings/GeneralSettingsForm.tsx index 8e2587ddb1..9b3eebb689 100644 --- a/apps/builder/components/settings/GeneralSettingsForm.tsx +++ b/apps/builder/components/settings/GeneralSettingsForm.tsx @@ -7,6 +7,7 @@ import { useDisclosure, } from '@chakra-ui/react' import { UpgradeModal } from 'components/shared/modals/UpgradeModal.' +import { SwitchWithLabel } from 'components/shared/SwitchWithLabel' import { useUser } from 'contexts/UserContext' import { GeneralSettings } from 'models' import React from 'react' @@ -27,10 +28,19 @@ export const GeneralSettingsForm = ({ const handleSwitchChange = () => { if (generalSettings?.isBrandingEnabled && isUserFreePlan) return onGeneralSettingsChange({ + ...generalSettings, isBrandingEnabled: !generalSettings?.isBrandingEnabled, }) } + const handleNewResultOnRefreshChange = ( + isNewResultOnRefreshEnabled: boolean + ) => + onGeneralSettingsChange({ + ...generalSettings, + isNewResultOnRefreshEnabled, + }) + return ( @@ -49,6 +59,12 @@ export const GeneralSettingsForm = ({ onChange={handleSwitchChange} /> + ) } diff --git a/apps/builder/playwright/tests/settings.spec.ts b/apps/builder/playwright/tests/settings.spec.ts index f4d9d22bdb..8f43c692f0 100644 --- a/apps/builder/playwright/tests/settings.spec.ts +++ b/apps/builder/playwright/tests/settings.spec.ts @@ -23,6 +23,10 @@ test.describe.parallel('Settings page', () => { await expect( typebotViewer(page).locator('a:has-text("Made with Typebot")') ).toBeHidden() + await page.click('text=Create new session on page refresh') + await expect( + page.locator('input[type="checkbox"] >> nth=-1') + ).toHaveAttribute('checked', '') }) }) diff --git a/apps/viewer/layouts/TypebotPage.tsx b/apps/viewer/layouts/TypebotPage.tsx index dc5934b16d..06afde5044 100644 --- a/apps/viewer/layouts/TypebotPage.tsx +++ b/apps/viewer/layouts/TypebotPage.tsx @@ -44,7 +44,8 @@ export const TypebotPage = ({ if (error) setError(error) if (result) { setResultId(result.id) - setResultInSession(result.id) + if (typebot.settings.general.isNewResultOnRefreshEnabled !== true) + setResultInSession(result.id) } } } diff --git a/apps/viewer/playwright/tests/settings.spec.ts b/apps/viewer/playwright/tests/settings.spec.ts new file mode 100644 index 0000000000..fac6295e02 --- /dev/null +++ b/apps/viewer/playwright/tests/settings.spec.ts @@ -0,0 +1,67 @@ +import test, { expect } from '@playwright/test' +import { createTypebots, parseDefaultBlockWithStep } from '../services/database' +import { generate } from 'short-uuid' +import { defaultSettings, defaultTextInputOptions, InputStepType } from 'models' + +test('Result should be in storage by default', async ({ page }) => { + const typebotId = generate() + await createTypebots([ + { + id: typebotId, + ...parseDefaultBlockWithStep({ + type: InputStepType.TEXT, + options: defaultTextInputOptions, + }), + }, + ]) + await page.goto(`/${typebotId}-public`) + await page.waitForResponse( + (resp) => + resp.request().url().includes(`/api/typebots/${typebotId}/results`) && + resp.status() === 200 && + resp.request().method() === 'POST' + ) + await page.reload() + const resultId = await page.evaluate(() => sessionStorage.getItem('resultId')) + expect(resultId).toBeDefined() +}) + +test.describe('Create result on page refresh enabled', () => { + test('should work', async ({ page }) => { + const typebotId = generate() + await createTypebots([ + { + id: typebotId, + settings: { + ...defaultSettings, + general: { + ...defaultSettings.general, + isNewResultOnRefreshEnabled: true, + }, + }, + ...parseDefaultBlockWithStep({ + type: InputStepType.TEXT, + options: defaultTextInputOptions, + }), + }, + ]) + await page.goto(`/${typebotId}-public`) + await page.waitForResponse( + (resp) => + resp.request().url().includes(`/api/typebots/${typebotId}/results`) && + resp.status() === 200 && + resp.request().method() === 'POST' + ) + await page.reload() + await page.waitForResponse( + (resp) => + resp.request().url().includes(`/api/typebots/${typebotId}/results`) && + resp.status() === 200 && + resp.request().method() === 'POST' + ) + const resultId = await page.evaluate(() => + sessionStorage.getItem('resultId') + ) + expect(resultId).toBe(null) + }) +}) diff --git a/packages/models/src/typebot/settings.ts b/packages/models/src/typebot/settings.ts index 8f67f1473f..694544c94f 100644 --- a/packages/models/src/typebot/settings.ts +++ b/packages/models/src/typebot/settings.ts @@ -6,6 +6,7 @@ export type Settings = { export type GeneralSettings = { isBrandingEnabled: boolean + isNewResultOnRefreshEnabled?: boolean } export type TypingEmulation = { @@ -22,7 +23,7 @@ export type Metadata = { } export const defaultSettings: Settings = { - general: { isBrandingEnabled: true }, + general: { isBrandingEnabled: true, isNewResultOnRefreshEnabled: false }, typingEmulation: { enabled: true, speed: 300, maxDelay: 1.5 }, metadata: { description: