From 43eb5dddbb9430893a9b3008917cd3d801564567 Mon Sep 17 00:00:00 2001 From: vanilla-wave Date: Fri, 13 Sep 2024 01:18:15 +0200 Subject: [PATCH] fix(promo-manager): onboarding hint cancelled -> don't trigger promo --- src/controller.ts | 17 +++++--- src/plugins/promo-presets.ts | 4 +- .../tests/onboarding-integration.test.tsx | 39 +++++++++++++++++++ src/types.ts | 1 + 4 files changed, 54 insertions(+), 7 deletions(-) diff --git a/src/controller.ts b/src/controller.ts index 73ccba9..0308d73 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -185,9 +185,10 @@ export class Controller, 'preset'>) => { - const {stepSlug, element} = stepData; - + stepElementReached = async ({ + stepSlug, + element, + }: Omit, 'preset'>) => { this.reachedElements.set(stepSlug, element); const preset = this.findActivePresetWithStep(stepSlug); @@ -196,11 +197,17 @@ export class Controller) => { diff --git a/src/plugins/promo-presets.ts b/src/plugins/promo-presets.ts index d88a796..e1af210 100644 --- a/src/plugins/promo-presets.ts +++ b/src/plugins/promo-presets.ts @@ -24,14 +24,14 @@ export class PromoPresetsPlugin implements OnboardingPlugin { apply: OnboardingPlugin['apply'] = ({onboarding}) => { this.onboardingInstance = onboarding; - onboarding.events.subscribe('beforeShowHint', this.onHintShow); + onboarding.events.subscribe('stepElementReached', this.onElementReach); onboarding.events.subscribe('beforeSuggestPreset', this.onSuggestPreset); onboarding.events.subscribe('wizardStateChanged', this.onWizardStateChanged); }; - onHintShow = ({stepData}: EventsMap['beforeShowHint']) => { + onElementReach = ({stepData}: EventsMap['beforeShowHint']) => { if (!this.onboardingInstance) { return true; } diff --git a/src/promo-manager/tests/onboarding-integration.test.tsx b/src/promo-manager/tests/onboarding-integration.test.tsx index 14d029a..0e7f403 100644 --- a/src/promo-manager/tests/onboarding-integration.test.tsx +++ b/src/promo-manager/tests/onboarding-integration.test.tsx @@ -293,3 +293,42 @@ it('should allow to show common preset', async function () { expect(onboardingController.hintStore.state.open).toBe(true); expect(onboardingController.hintStore.state.hint?.step.slug).toBe('openBoard'); }); + +it('cancelled hint -> not trigger promo run', async function () { + const onboardingController = new OnboardingController( + getOptionsWithPromo({wizardState: 'visible'}), + ); + + const options = { + ...testOptions, + config: { + promoGroups: [ + { + slug: 'hintPromos', + conditions: [], + promos: [], + }, + ], + }, + onboarding: { + getInstance: () => onboardingController, + groupSlug: 'hintPromos', + }, + debugMode: true, + logger: { + level: 'debug' as const, + context: 'Promo manager', + }, + }; + + const controller = new Controller(options); + await controller.ensureInit(); + + // show promo hint with visible guide + await onboardingController.stepElementReached({ + stepSlug: 'showCoolFeature', + element: getAnchorElement(), + }); + + expect(controller.state.base.activePromo).toBe(null); +}); diff --git a/src/types.ts b/src/types.ts index 9470e58..6cec368 100644 --- a/src/types.ts +++ b/src/types.ts @@ -149,6 +149,7 @@ export type EventsMap< runPreset: {preset: Presets}; finishPreset: {preset: Presets}; beforeSuggestPreset: {preset: string}; + stepElementReached: {stepData: ReachElementParams}; beforeShowHint: {stepData: ReachElementParams}; stateChange: {state: Controller['state']}; hintDataChanged: {state: HintState};