From 17bbacc6c4fc7236cd24ac6dfbc35ab72e9c12c9 Mon Sep 17 00:00:00 2001 From: Talisson Costa Date: Tue, 4 Aug 2026 10:46:00 -0300 Subject: [PATCH 1/3] fix(onboarding): don't seed a demo flag into a project that has flags Visiting /getting-started created show_demo_button in whichever project came back first, whether or not the customer had ever onboarded. Features are project-level, so it appeared in every environment of that project, including production, alongside a new Onboarding tag. The Getting Started nav link is ungated, so any customer could trigger this by clicking it. ensureFlag already computed isFirstFeature for analytics; it now also decides whether to create anything. An empty project still gets the demo flag, an established one gets nothing. That leaves the tour with no flag to teach with, so the page says so and points at the project's own flags instead of walking someone through connecting a project that is already connected. Copy and treatment of that state are provisional. Co-Authored-By: Claude Opus 5 (1M context) --- .../OnboardingFlow/OnboardingFlow.tsx | 23 +++++++++ .../bootstrap/__tests__/demoFlag.test.ts | 49 +++++++++++++++++++ .../pages/onboarding/bootstrap/demoFlag.ts | 23 +++++++++ .../onboarding/hooks/bootstrapOnboarding.ts | 35 ++++++------- .../hooks/useEnsureOnboardingResources.ts | 4 ++ 5 files changed, 117 insertions(+), 17 deletions(-) create mode 100644 frontend/web/components/pages/onboarding/bootstrap/__tests__/demoFlag.test.ts create mode 100644 frontend/web/components/pages/onboarding/bootstrap/demoFlag.ts diff --git a/frontend/web/components/pages/onboarding/OnboardingFlow/OnboardingFlow.tsx b/frontend/web/components/pages/onboarding/OnboardingFlow/OnboardingFlow.tsx index 7f8f8acdcfc7..7902605f2836 100644 --- a/frontend/web/components/pages/onboarding/OnboardingFlow/OnboardingFlow.tsx +++ b/frontend/web/components/pages/onboarding/OnboardingFlow/OnboardingFlow.tsx @@ -1,6 +1,7 @@ import React, { FC, useState } from 'react' import { useHistory } from 'react-router-dom' import Button from 'components/base/forms/Button' +import Link from 'components/base/link' import Icon from 'components/icons/Icon' import OnboardingHeader from 'components/pages/onboarding/OnboardingHeader' import ThemeToggle from 'components/ThemeToggle' @@ -30,6 +31,7 @@ const OnboardingFlow: FC = () => { environment, environmentKey, featureName: bootstrappedFeatureName, + hasDemoFlag, organisationId, organisationName, projectId, @@ -197,6 +199,27 @@ const OnboardingFlow: FC = () => { ) } + // ensureFlag seeded nothing, so there is no flag to tour with. + if (!hasDemoFlag) { + return ( +
+

You’re already set up

+

+ {projectDisplayName} already has flags, so we haven’t added a demo + one. +

+
+ + + View flags in {projectDisplayName} + +
+
+ ) + } + return (
diff --git a/frontend/web/components/pages/onboarding/bootstrap/__tests__/demoFlag.test.ts b/frontend/web/components/pages/onboarding/bootstrap/__tests__/demoFlag.test.ts new file mode 100644 index 000000000000..b66b992272dd --- /dev/null +++ b/frontend/web/components/pages/onboarding/bootstrap/__tests__/demoFlag.test.ts @@ -0,0 +1,49 @@ +import { ProjectFlag, Tag } from 'common/types/responses' +import { + DEMO_FLAG_NAME, + findDemoFlag, + shouldSeedDemoFlag, +} from 'components/pages/onboarding/bootstrap/demoFlag' + +const flag = (name: string, tags: number[] = []): ProjectFlag => + ({ id: name.length, name, tags } as ProjectFlag) + +const onboardingTag = { id: 7, label: 'Onboarding' } as Tag + +describe('shouldSeedDemoFlag', () => { + it('seeds into an empty project', () => { + expect(shouldSeedDemoFlag([])).toBe(true) + }) + + it('seeds nothing once the project has flags of its own', () => { + expect(shouldSeedDemoFlag([flag('checkout_v2')])).toBe(false) + }) +}) + +describe('findDemoFlag', () => { + it('finds a previous run by its tag, whatever it was renamed to', () => { + const renamed = flag('my_own_name', [onboardingTag.id]) + expect(findDemoFlag([flag('checkout_v2'), renamed], onboardingTag)).toBe( + renamed, + ) + }) + + it('prefers the tag over the name when both are present', () => { + const tagged = flag('renamed_demo', [onboardingTag.id]) + const named = flag(DEMO_FLAG_NAME) + expect(findDemoFlag([named, tagged], onboardingTag)).toBe(tagged) + }) + + it('falls back to the name when the tag is missing', () => { + const demo = flag(DEMO_FLAG_NAME) + expect(findDemoFlag([flag('checkout_v2'), demo], undefined)).toBe(demo) + }) + + it('finds nothing in a project that never ran the tour', () => { + expect(findDemoFlag([flag('checkout_v2')], onboardingTag)).toBeUndefined() + }) + + it('finds nothing in an empty project', () => { + expect(findDemoFlag([], onboardingTag)).toBeUndefined() + }) +}) diff --git a/frontend/web/components/pages/onboarding/bootstrap/demoFlag.ts b/frontend/web/components/pages/onboarding/bootstrap/demoFlag.ts new file mode 100644 index 000000000000..c5800f8658db --- /dev/null +++ b/frontend/web/components/pages/onboarding/bootstrap/demoFlag.ts @@ -0,0 +1,23 @@ +import { ProjectFlag, Tag } from 'common/types/responses' + +export const DEMO_FLAG_NAME = 'show_demo_button' + +export const ONBOARDING_TAG = { + color: '#3cb371', + description: 'Created during onboarding', + label: 'Onboarding', +} + +// A previous run's flag. Tag first: renaming is a delete and recreate, so the +// name alone is not reliable. +export const findDemoFlag = ( + flags: ProjectFlag[], + onboardingTag?: Tag, +): ProjectFlag | undefined => + (onboardingTag && flags.find((f) => f.tags?.includes(onboardingTag.id))) || + flags.find((f) => f.name === DEMO_FLAG_NAME) + +// Only seed into an empty project: features are project-level, so an unwanted +// flag shows up in every environment, production included. +export const shouldSeedDemoFlag = (flags: ProjectFlag[]): boolean => + !flags.length diff --git a/frontend/web/components/pages/onboarding/hooks/bootstrapOnboarding.ts b/frontend/web/components/pages/onboarding/hooks/bootstrapOnboarding.ts index 3192bc96ba5e..db12124be4f6 100644 --- a/frontend/web/components/pages/onboarding/hooks/bootstrapOnboarding.ts +++ b/frontend/web/components/pages/onboarding/hooks/bootstrapOnboarding.ts @@ -16,6 +16,12 @@ import { ProjectSummary, Tag, } from 'common/types/responses' +import { + DEMO_FLAG_NAME, + ONBOARDING_TAG, + findDemoFlag, + shouldSeedDemoFlag, +} from 'components/pages/onboarding/bootstrap/demoFlag' import { SmartDefaults } from './useSmartDefaults' import { createOrganisationViaAccountStore } from './createOrganisationViaAccountStore' import API from 'project/api' @@ -23,17 +29,10 @@ import Constants from 'common/constants' type Store = ReturnType -const FLAG_NAME = 'show_demo_button' const DEFAULT_ORG_NAME = 'My organisation' const DEFAULT_PROJECT_NAME = 'My first project' const DEV_ENVIRONMENT_NAME = 'Development' const PROD_ENVIRONMENT_NAME = 'Production' -const ONBOARDING_TAG = { - color: '#3cb371', - description: 'Created during onboarding', - label: 'Onboarding', -} - type ExistingOrg = { id: number; name: string } export type BootstrapInput = { @@ -47,6 +46,9 @@ export type OnboardingBootstrap = { project: ProjectSummary environment: Environment featureName: string + // False when the project already had flags, so we seeded nothing and the tour + // has no flag of its own to teach with. + hasDemoFlag: boolean } async function ensureOrganisation( @@ -154,20 +156,20 @@ async function ensureFlag( }), ) .unwrap() + const results = flags?.results ?? [] const onboardingTag = await findOnboardingTag(store, project.id) - const existing = - (onboardingTag && - flags?.results?.find((f) => f.tags?.includes(onboardingTag.id))) || - flags?.results?.find((f) => f.name === FLAG_NAME) + const existing = findDemoFlag(results, onboardingTag) if (existing) { return existing } - const isFirstFeature = !flags?.results?.length + if (!shouldSeedDemoFlag(results)) { + return undefined + } const created = await store .dispatch( projectFlagService.endpoints.createProjectFlag.initiate({ body: { - name: FLAG_NAME, + name: DEMO_FLAG_NAME, project: project.id, type: 'STANDARD', } as Req['createProjectFlag']['body'], @@ -175,9 +177,7 @@ async function ensureFlag( }), ) .unwrap() - if (isFirstFeature) { - API.trackEvent(Constants.events.CREATE_FIRST_FEATURE) - } + API.trackEvent(Constants.events.CREATE_FIRST_FEATURE) return created } @@ -227,7 +227,8 @@ export async function bootstrapOnboarding( AppActions.refreshOrganisation() return { environment, - featureName: flag?.name ?? FLAG_NAME, + featureName: flag?.name ?? DEMO_FLAG_NAME, + hasDemoFlag: !!flag, organisationId: organisation.id, organisationName: organisation.name, project, diff --git a/frontend/web/components/pages/onboarding/hooks/useEnsureOnboardingResources.ts b/frontend/web/components/pages/onboarding/hooks/useEnsureOnboardingResources.ts index 574ae4f0f2bd..77d071d86ba7 100644 --- a/frontend/web/components/pages/onboarding/hooks/useEnsureOnboardingResources.ts +++ b/frontend/web/components/pages/onboarding/hooks/useEnsureOnboardingResources.ts @@ -15,6 +15,7 @@ export type OnboardingResources = { organisationName: string projectName: string featureName: string + hasDemoFlag: boolean caseSensitive: boolean environment: Environment | null environmentKey: string @@ -46,6 +47,7 @@ export const useEnsureOnboardingResources = (): OnboardingResources => { const [organisationName, setOrganisationName] = useState('') const [projectName, setProjectName] = useState('') const [featureName, setFeatureName] = useState('') + const [hasDemoFlag, setHasDemoFlag] = useState(true) // Whether the project enforces lower-case feature names; drives the same name // normalisation the create-feature modal applies (see the header). const [caseSensitive, setCaseSensitive] = useState(false) @@ -77,6 +79,7 @@ export const useEnsureOnboardingResources = (): OnboardingResources => { setEnvironment(res.environment) setEnvironmentKey(res.environment.api_key) setFeatureName(res.featureName) + setHasDemoFlag(res.hasDemoFlag) setStatus('ready') }) .catch((e) => { @@ -91,6 +94,7 @@ export const useEnsureOnboardingResources = (): OnboardingResources => { environmentKey, error, featureName, + hasDemoFlag, organisationId, organisationName, projectId, From 8c41def93abbdc6f76cd236524d6a2edba286efb Mon Sep 17 00:00:00 2001 From: Talisson Costa Date: Wed, 5 Aug 2026 20:14:58 -0300 Subject: [PATCH 2/3] chore(onboarding): move the non-hooks out of the hooks folder bootstrapOnboarding and createOrganisationViaAccountStore are plain functions, so hooks/ described three of its nine files wrongly. Both belong to the provisioning that runs before the tour, which is what the new bootstrap/ folder holds. Paths and one comment only; no logic changes. --- .../onboarding/{hooks => bootstrap}/bootstrapOnboarding.ts | 7 +++---- .../createOrganisationViaAccountStore.ts | 0 .../pages/onboarding/hooks/useEnsureOnboardingResources.ts | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) rename frontend/web/components/pages/onboarding/{hooks => bootstrap}/bootstrapOnboarding.ts (96%) rename frontend/web/components/pages/onboarding/{hooks => bootstrap}/createOrganisationViaAccountStore.ts (100%) diff --git a/frontend/web/components/pages/onboarding/hooks/bootstrapOnboarding.ts b/frontend/web/components/pages/onboarding/bootstrap/bootstrapOnboarding.ts similarity index 96% rename from frontend/web/components/pages/onboarding/hooks/bootstrapOnboarding.ts rename to frontend/web/components/pages/onboarding/bootstrap/bootstrapOnboarding.ts index db12124be4f6..35f1fdf4eb1a 100644 --- a/frontend/web/components/pages/onboarding/hooks/bootstrapOnboarding.ts +++ b/frontend/web/components/pages/onboarding/bootstrap/bootstrapOnboarding.ts @@ -21,8 +21,8 @@ import { ONBOARDING_TAG, findDemoFlag, shouldSeedDemoFlag, -} from 'components/pages/onboarding/bootstrap/demoFlag' -import { SmartDefaults } from './useSmartDefaults' +} from './demoFlag' +import { SmartDefaults } from 'components/pages/onboarding/hooks/useSmartDefaults' import { createOrganisationViaAccountStore } from './createOrganisationViaAccountStore' import API from 'project/api' import Constants from 'common/constants' @@ -46,8 +46,7 @@ export type OnboardingBootstrap = { project: ProjectSummary environment: Environment featureName: string - // False when the project already had flags, so we seeded nothing and the tour - // has no flag of its own to teach with. + // False when the project already had flags, so nothing was seeded. hasDemoFlag: boolean } diff --git a/frontend/web/components/pages/onboarding/hooks/createOrganisationViaAccountStore.ts b/frontend/web/components/pages/onboarding/bootstrap/createOrganisationViaAccountStore.ts similarity index 100% rename from frontend/web/components/pages/onboarding/hooks/createOrganisationViaAccountStore.ts rename to frontend/web/components/pages/onboarding/bootstrap/createOrganisationViaAccountStore.ts diff --git a/frontend/web/components/pages/onboarding/hooks/useEnsureOnboardingResources.ts b/frontend/web/components/pages/onboarding/hooks/useEnsureOnboardingResources.ts index 77d071d86ba7..00c395793334 100644 --- a/frontend/web/components/pages/onboarding/hooks/useEnsureOnboardingResources.ts +++ b/frontend/web/components/pages/onboarding/hooks/useEnsureOnboardingResources.ts @@ -5,7 +5,7 @@ import useSelectedOrganisation from 'common/hooks/useSelectedOrganisation' import { useGetProfileQuery } from 'common/services/useProfile' import { Environment } from 'common/types/responses' import { useSmartDefaults } from './useSmartDefaults' -import { bootstrapOnboarding } from './bootstrapOnboarding' +import { bootstrapOnboarding } from 'components/pages/onboarding/bootstrap/bootstrapOnboarding' export type OnboardingResourcesStatus = 'creating' | 'ready' | 'error' From 48c2d0d7d3764c784202a3aa50ee5c5085344691 Mon Sep 17 00:00:00 2001 From: Talisson Costa Date: Thu, 6 Aug 2026 15:51:30 -0300 Subject: [PATCH 3/3] refactor(onboarding): name the seeded flag after onboarding, not demo The flag is found by its Onboarding tag, falling back to the name only because renaming a flag is a delete and recreate, so "onboarding flag" is what the lookup actually means. "Demo" also read as throwaway, which is the opposite of the problem being fixed here: this flag lands in a real project and shows up in every environment, production included. The flag's own name stays show_demo_button, since the tour's snippet references it. Co-Authored-By: Claude Opus 5 (1M context) --- .../OnboardingFlow/OnboardingFlow.tsx | 4 +- .../bootstrap/__tests__/demoFlag.test.ts | 49 ----------------- .../__tests__/onboardingFlag.test.ts | 53 +++++++++++++++++++ .../bootstrap/bootstrapOnboarding.ts | 20 +++---- .../{demoFlag.ts => onboardingFlag.ts} | 8 +-- .../hooks/useEnsureOnboardingResources.ts | 8 +-- 6 files changed, 73 insertions(+), 69 deletions(-) delete mode 100644 frontend/web/components/pages/onboarding/bootstrap/__tests__/demoFlag.test.ts create mode 100644 frontend/web/components/pages/onboarding/bootstrap/__tests__/onboardingFlag.test.ts rename frontend/web/components/pages/onboarding/bootstrap/{demoFlag.ts => onboardingFlag.ts} (73%) diff --git a/frontend/web/components/pages/onboarding/OnboardingFlow/OnboardingFlow.tsx b/frontend/web/components/pages/onboarding/OnboardingFlow/OnboardingFlow.tsx index 7902605f2836..92ca1744f564 100644 --- a/frontend/web/components/pages/onboarding/OnboardingFlow/OnboardingFlow.tsx +++ b/frontend/web/components/pages/onboarding/OnboardingFlow/OnboardingFlow.tsx @@ -31,7 +31,7 @@ const OnboardingFlow: FC = () => { environment, environmentKey, featureName: bootstrappedFeatureName, - hasDemoFlag, + hasOnboardingFlag, organisationId, organisationName, projectId, @@ -200,7 +200,7 @@ const OnboardingFlow: FC = () => { } // ensureFlag seeded nothing, so there is no flag to tour with. - if (!hasDemoFlag) { + if (!hasOnboardingFlag) { return (

You’re already set up

diff --git a/frontend/web/components/pages/onboarding/bootstrap/__tests__/demoFlag.test.ts b/frontend/web/components/pages/onboarding/bootstrap/__tests__/demoFlag.test.ts deleted file mode 100644 index b66b992272dd..000000000000 --- a/frontend/web/components/pages/onboarding/bootstrap/__tests__/demoFlag.test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { ProjectFlag, Tag } from 'common/types/responses' -import { - DEMO_FLAG_NAME, - findDemoFlag, - shouldSeedDemoFlag, -} from 'components/pages/onboarding/bootstrap/demoFlag' - -const flag = (name: string, tags: number[] = []): ProjectFlag => - ({ id: name.length, name, tags } as ProjectFlag) - -const onboardingTag = { id: 7, label: 'Onboarding' } as Tag - -describe('shouldSeedDemoFlag', () => { - it('seeds into an empty project', () => { - expect(shouldSeedDemoFlag([])).toBe(true) - }) - - it('seeds nothing once the project has flags of its own', () => { - expect(shouldSeedDemoFlag([flag('checkout_v2')])).toBe(false) - }) -}) - -describe('findDemoFlag', () => { - it('finds a previous run by its tag, whatever it was renamed to', () => { - const renamed = flag('my_own_name', [onboardingTag.id]) - expect(findDemoFlag([flag('checkout_v2'), renamed], onboardingTag)).toBe( - renamed, - ) - }) - - it('prefers the tag over the name when both are present', () => { - const tagged = flag('renamed_demo', [onboardingTag.id]) - const named = flag(DEMO_FLAG_NAME) - expect(findDemoFlag([named, tagged], onboardingTag)).toBe(tagged) - }) - - it('falls back to the name when the tag is missing', () => { - const demo = flag(DEMO_FLAG_NAME) - expect(findDemoFlag([flag('checkout_v2'), demo], undefined)).toBe(demo) - }) - - it('finds nothing in a project that never ran the tour', () => { - expect(findDemoFlag([flag('checkout_v2')], onboardingTag)).toBeUndefined() - }) - - it('finds nothing in an empty project', () => { - expect(findDemoFlag([], onboardingTag)).toBeUndefined() - }) -}) diff --git a/frontend/web/components/pages/onboarding/bootstrap/__tests__/onboardingFlag.test.ts b/frontend/web/components/pages/onboarding/bootstrap/__tests__/onboardingFlag.test.ts new file mode 100644 index 000000000000..a2841366fda5 --- /dev/null +++ b/frontend/web/components/pages/onboarding/bootstrap/__tests__/onboardingFlag.test.ts @@ -0,0 +1,53 @@ +import { ProjectFlag, Tag } from 'common/types/responses' +import { + ONBOARDING_FLAG_NAME, + findOnboardingFlag, + shouldSeedOnboardingFlag, +} from 'components/pages/onboarding/bootstrap/onboardingFlag' + +const flag = (name: string, tags: number[] = []): ProjectFlag => + ({ id: name.length, name, tags } as ProjectFlag) + +const onboardingTag = { id: 7, label: 'Onboarding' } as Tag + +describe('shouldSeedOnboardingFlag', () => { + it('seeds into an empty project', () => { + expect(shouldSeedOnboardingFlag([])).toBe(true) + }) + + it('seeds nothing once the project has flags of its own', () => { + expect(shouldSeedOnboardingFlag([flag('checkout_v2')])).toBe(false) + }) +}) + +describe('findOnboardingFlag', () => { + it('finds a previous run by its tag, whatever it was renamed to', () => { + const renamed = flag('my_own_name', [onboardingTag.id]) + expect( + findOnboardingFlag([flag('checkout_v2'), renamed], onboardingTag), + ).toBe(renamed) + }) + + it('prefers the tag over the name when both are present', () => { + const tagged = flag('renamed_by_hand', [onboardingTag.id]) + const named = flag(ONBOARDING_FLAG_NAME) + expect(findOnboardingFlag([named, tagged], onboardingTag)).toBe(tagged) + }) + + it('falls back to the name when the tag is missing', () => { + const seeded = flag(ONBOARDING_FLAG_NAME) + expect(findOnboardingFlag([flag('checkout_v2'), seeded], undefined)).toBe( + seeded, + ) + }) + + it('finds nothing in a project that never ran the tour', () => { + expect( + findOnboardingFlag([flag('checkout_v2')], onboardingTag), + ).toBeUndefined() + }) + + it('finds nothing in an empty project', () => { + expect(findOnboardingFlag([], onboardingTag)).toBeUndefined() + }) +}) diff --git a/frontend/web/components/pages/onboarding/bootstrap/bootstrapOnboarding.ts b/frontend/web/components/pages/onboarding/bootstrap/bootstrapOnboarding.ts index 35f1fdf4eb1a..aa0ed4ddd107 100644 --- a/frontend/web/components/pages/onboarding/bootstrap/bootstrapOnboarding.ts +++ b/frontend/web/components/pages/onboarding/bootstrap/bootstrapOnboarding.ts @@ -17,11 +17,11 @@ import { Tag, } from 'common/types/responses' import { - DEMO_FLAG_NAME, + ONBOARDING_FLAG_NAME, ONBOARDING_TAG, - findDemoFlag, - shouldSeedDemoFlag, -} from './demoFlag' + findOnboardingFlag, + shouldSeedOnboardingFlag, +} from './onboardingFlag' import { SmartDefaults } from 'components/pages/onboarding/hooks/useSmartDefaults' import { createOrganisationViaAccountStore } from './createOrganisationViaAccountStore' import API from 'project/api' @@ -47,7 +47,7 @@ export type OnboardingBootstrap = { environment: Environment featureName: string // False when the project already had flags, so nothing was seeded. - hasDemoFlag: boolean + hasOnboardingFlag: boolean } async function ensureOrganisation( @@ -157,18 +157,18 @@ async function ensureFlag( .unwrap() const results = flags?.results ?? [] const onboardingTag = await findOnboardingTag(store, project.id) - const existing = findDemoFlag(results, onboardingTag) + const existing = findOnboardingFlag(results, onboardingTag) if (existing) { return existing } - if (!shouldSeedDemoFlag(results)) { + if (!shouldSeedOnboardingFlag(results)) { return undefined } const created = await store .dispatch( projectFlagService.endpoints.createProjectFlag.initiate({ body: { - name: DEMO_FLAG_NAME, + name: ONBOARDING_FLAG_NAME, project: project.id, type: 'STANDARD', } as Req['createProjectFlag']['body'], @@ -226,8 +226,8 @@ export async function bootstrapOnboarding( AppActions.refreshOrganisation() return { environment, - featureName: flag?.name ?? DEMO_FLAG_NAME, - hasDemoFlag: !!flag, + featureName: flag?.name ?? ONBOARDING_FLAG_NAME, + hasOnboardingFlag: !!flag, organisationId: organisation.id, organisationName: organisation.name, project, diff --git a/frontend/web/components/pages/onboarding/bootstrap/demoFlag.ts b/frontend/web/components/pages/onboarding/bootstrap/onboardingFlag.ts similarity index 73% rename from frontend/web/components/pages/onboarding/bootstrap/demoFlag.ts rename to frontend/web/components/pages/onboarding/bootstrap/onboardingFlag.ts index c5800f8658db..f664c6729292 100644 --- a/frontend/web/components/pages/onboarding/bootstrap/demoFlag.ts +++ b/frontend/web/components/pages/onboarding/bootstrap/onboardingFlag.ts @@ -1,6 +1,6 @@ import { ProjectFlag, Tag } from 'common/types/responses' -export const DEMO_FLAG_NAME = 'show_demo_button' +export const ONBOARDING_FLAG_NAME = 'show_demo_button' export const ONBOARDING_TAG = { color: '#3cb371', @@ -10,14 +10,14 @@ export const ONBOARDING_TAG = { // A previous run's flag. Tag first: renaming is a delete and recreate, so the // name alone is not reliable. -export const findDemoFlag = ( +export const findOnboardingFlag = ( flags: ProjectFlag[], onboardingTag?: Tag, ): ProjectFlag | undefined => (onboardingTag && flags.find((f) => f.tags?.includes(onboardingTag.id))) || - flags.find((f) => f.name === DEMO_FLAG_NAME) + flags.find((f) => f.name === ONBOARDING_FLAG_NAME) // Only seed into an empty project: features are project-level, so an unwanted // flag shows up in every environment, production included. -export const shouldSeedDemoFlag = (flags: ProjectFlag[]): boolean => +export const shouldSeedOnboardingFlag = (flags: ProjectFlag[]): boolean => !flags.length diff --git a/frontend/web/components/pages/onboarding/hooks/useEnsureOnboardingResources.ts b/frontend/web/components/pages/onboarding/hooks/useEnsureOnboardingResources.ts index 00c395793334..86c6495a0003 100644 --- a/frontend/web/components/pages/onboarding/hooks/useEnsureOnboardingResources.ts +++ b/frontend/web/components/pages/onboarding/hooks/useEnsureOnboardingResources.ts @@ -15,7 +15,7 @@ export type OnboardingResources = { organisationName: string projectName: string featureName: string - hasDemoFlag: boolean + hasOnboardingFlag: boolean caseSensitive: boolean environment: Environment | null environmentKey: string @@ -47,7 +47,7 @@ export const useEnsureOnboardingResources = (): OnboardingResources => { const [organisationName, setOrganisationName] = useState('') const [projectName, setProjectName] = useState('') const [featureName, setFeatureName] = useState('') - const [hasDemoFlag, setHasDemoFlag] = useState(true) + const [hasOnboardingFlag, setHasOnboardingFlag] = useState(true) // Whether the project enforces lower-case feature names; drives the same name // normalisation the create-feature modal applies (see the header). const [caseSensitive, setCaseSensitive] = useState(false) @@ -79,7 +79,7 @@ export const useEnsureOnboardingResources = (): OnboardingResources => { setEnvironment(res.environment) setEnvironmentKey(res.environment.api_key) setFeatureName(res.featureName) - setHasDemoFlag(res.hasDemoFlag) + setHasOnboardingFlag(res.hasOnboardingFlag) setStatus('ready') }) .catch((e) => { @@ -94,7 +94,7 @@ export const useEnsureOnboardingResources = (): OnboardingResources => { environmentKey, error, featureName, - hasDemoFlag, + hasOnboardingFlag, organisationId, organisationName, projectId,