Skip to content

Commit c4cdef8

Browse files
authored
fix(welcome, components): disable guide cues in the app until welcome modal is hidden (#7529)
* chore(components): allow to disable guide cues completely via provider props But keep the actual state around so that we can show it when the value changes * chore(welcome): refactor welcome modal to a plugin; only change showedNetworkOptIn after welcome modal is closed * fix(welcome): disable guide cues until network opt in was shown
1 parent dcab702 commit c4cdef8

File tree

23 files changed

+200
-327
lines changed

23 files changed

+200
-327
lines changed

packages/compass-components/src/components/compass-components-provider.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ type CompassComponentsProviderProps = {
4444
* Set to disable context menus in the application.
4545
*/
4646
disableContextMenus?: boolean;
47+
48+
/**
49+
* Set to disable guide cues in the application
50+
*/
51+
disableGuideCues?: boolean;
4752
} & {
4853
onNextGuideGue?: GuideCueProviderProps['onNext'];
4954
onNextGuideCueGroup?: GuideCueProviderProps['onNextGroup'];
@@ -129,6 +134,7 @@ export const CompassComponentsProvider = ({
129134
stackedElementsZIndex,
130135
popoverPortalContainer: _popoverPortalContainer,
131136
disableContextMenus,
137+
disableGuideCues,
132138
...signalHooksProviderProps
133139
}: CompassComponentsProviderProps) => {
134140
const darkMode = useDarkMode(_darkMode);
@@ -166,6 +172,7 @@ export const CompassComponentsProvider = ({
166172
<GuideCueProvider
167173
onNext={onNextGuideGue}
168174
onNextGroup={onNextGuideCueGroup}
175+
disabled={disableGuideCues}
169176
>
170177
<SignalHooksProvider {...signalHooksProviderProps}>
171178
<ConfirmationModalArea>

packages/compass-components/src/components/guide-cue/guide-cue-service.spec.ts

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -602,38 +602,4 @@ describe('GuideCueService', function () {
602602
expect(onNextSpy.callCount).to.equal(1);
603603
});
604604
});
605-
606-
context('when disabled', function () {
607-
const initialValue = process.env.DISABLE_GUIDE_CUES;
608-
before(function () {
609-
process.env.DISABLE_GUIDE_CUES = 'true';
610-
611-
guideCueService.addCue({ cueId: '1', isIntersecting: true, step: 1 });
612-
guideCueService.addCue({
613-
cueId: '3',
614-
groupId: 'abc',
615-
isIntersecting: true,
616-
step: 1,
617-
});
618-
guideCueService.addCue({
619-
cueId: '4',
620-
groupId: 'abc',
621-
isIntersecting: true,
622-
step: 2,
623-
});
624-
});
625-
626-
after(function () {
627-
process.env.DISABLE_GUIDE_CUES = initialValue;
628-
});
629-
630-
it('does not add a cue', function () {
631-
expect((guideCueService as any)._cues.length).to.equal(0);
632-
});
633-
634-
it('returns undefined on onNext', function () {
635-
const next = guideCueService.onNext();
636-
expect(next).to.be.undefined;
637-
});
638-
});
639605
});

packages/compass-components/src/components/guide-cue/guide-cue-service.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,6 @@ export class GuideCueService extends EventTarget {
4343
}
4444

4545
addCue(cue: Omit<Cue, 'isVisited'>) {
46-
if (process.env.DISABLE_GUIDE_CUES === 'true') {
47-
return;
48-
}
4946
const cueIndex = this.getCueIndex(cue.cueId, cue.groupId);
5047
if (cueIndex !== -1) {
5148
// eslint-disable-next-line no-console

packages/compass-components/src/components/guide-cue/guide-cue.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,14 @@ export type GroupCue = Cue & {
3333
type GuideCueContextValue = {
3434
onNext?: (cue: Cue) => void;
3535
onNextGroup?: (groupCue: GroupCue) => void;
36+
disabled?: boolean;
3637
};
38+
3739
const GuideCueContext = React.createContext<GuideCueContextValue>({});
40+
3841
export const GuideCueProvider: React.FC<GuideCueContextValue> = ({
3942
children,
43+
disabled = false,
4044
...callbacks
4145
}) => {
4246
const callbacksRef = useRef(callbacks);
@@ -49,8 +53,9 @@ export const GuideCueProvider: React.FC<GuideCueContextValue> = ({
4953
onNextGroup(groupCue: GroupCue) {
5054
callbacksRef.current.onNextGroup?.(groupCue);
5155
},
56+
disabled,
5257
}),
53-
[]
58+
[disabled]
5459
);
5560
return (
5661
<GuideCueContext.Provider value={value}>
@@ -251,12 +256,15 @@ export const GuideCue = <T extends HTMLElement>({
251256
};
252257
}, [isCueOpen, cueData, onNext, setOpen]);
253258

259+
const isCueDisabled =
260+
context.disabled || process.env.DISABLE_GUIDE_CUES === 'true';
261+
254262
return (
255263
<>
256264
{readyToRender && (
257265
<LGGuideCue
258266
{...restOfCueProps}
259-
open={isCueOpen}
267+
open={!isCueDisabled && isCueOpen}
260268
numberOfSteps={guideCueService.getCountOfSteps(cueData.groupId)}
261269
onDismiss={() => {
262270
onDismiss?.();

packages/compass-preferences-model/src/compass-web-preferences-access.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@ export class CompassWebPreferencesAccess implements PreferencesAccess {
3131
return this._preferences.getPreferences();
3232
}
3333

34-
ensureDefaultConfigurableUserPreferences() {
35-
return this._preferences.ensureDefaultConfigurableUserPreferences();
36-
}
37-
3834
getConfigurableUserPreferences() {
3935
return Promise.resolve(this._preferences.getConfigurableUserPreferences());
4036
}

packages/compass-preferences-model/src/preferences-schema.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,7 @@ export const storedUserPreferencesProps: Required<{
594594
long: 'Allow Compass to make requests to a 3rd party mapping service.',
595595
},
596596
deriveValue: deriveNetworkTrafficOptionState('enableMaps'),
597-
validator: z.boolean().default(false),
597+
validator: z.boolean().default(true),
598598
type: 'boolean',
599599
},
600600
enableGenAIFeatures: {
@@ -621,7 +621,7 @@ export const storedUserPreferencesProps: Required<{
621621
long: 'Enables a tool that our Product team can use to occasionally reach out for feedback about Compass.',
622622
},
623623
deriveValue: deriveNetworkTrafficOptionState('enableFeedbackPanel'),
624-
validator: z.boolean().default(false),
624+
validator: z.boolean().default(true),
625625
type: 'boolean',
626626
},
627627
/**
@@ -637,7 +637,7 @@ export const storedUserPreferencesProps: Required<{
637637
long: 'Allow Compass to send anonymous usage statistics.',
638638
},
639639
deriveValue: deriveNetworkTrafficOptionState('trackUsageStatistics'),
640-
validator: z.boolean().default(false),
640+
validator: z.boolean().default(true),
641641
type: 'boolean',
642642
},
643643
/**
@@ -652,7 +652,7 @@ export const storedUserPreferencesProps: Required<{
652652
long: 'Allow Compass to periodically check for new updates.',
653653
},
654654
deriveValue: deriveNetworkTrafficOptionState('autoUpdates'),
655-
validator: z.boolean().default(false),
655+
validator: z.boolean().default(true),
656656
type: 'boolean',
657657
},
658658
/**

packages/compass-preferences-model/src/preferences.spec.ts

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ describe('Preferences class', function () {
5050
const preferences = await setupPreferences(tmpdir);
5151
const result = preferences.getPreferences();
5252
expect(result.id).to.equal('General');
53-
expect(result.enableMaps).to.equal(false);
53+
expect(result.enableMaps).to.equal(true);
5454
expect(result.enableShell).to.equal(true);
5555
});
5656

@@ -98,13 +98,12 @@ describe('Preferences class', function () {
9898
const preferences = await setupPreferences(tmpdir);
9999
const calls: any[] = [];
100100
preferences.onPreferencesChanged((prefs) => calls.push(prefs));
101-
await preferences.savePreferences({ enableMaps: true });
102-
expect(calls).to.deep.equal([{ enableMaps: true }]);
101+
await preferences.savePreferences({ enableMaps: false });
102+
expect(calls).to.deep.equal([{ enableMaps: false }]);
103103
});
104104

105105
it('can return user-configurable preferences after setting their defaults', async function () {
106106
const preferences = await setupPreferences(tmpdir);
107-
await preferences.ensureDefaultConfigurableUserPreferences();
108107
const result = preferences.getConfigurableUserPreferences();
109108
expect(result).not.to.have.property('id');
110109
expect(result.enableMaps).to.equal(true);
@@ -121,7 +120,6 @@ describe('Preferences class', function () {
121120
trackUsageStatistics: false,
122121
},
123122
});
124-
await preferences.ensureDefaultConfigurableUserPreferences();
125123
const result = preferences.getConfigurableUserPreferences();
126124
expect(result).not.to.have.property('id');
127125
expect(result.autoUpdates).to.equal(true);
@@ -214,18 +212,10 @@ describe('Preferences class', function () {
214212
const preferences = await setupPreferences(tmpdir);
215213
const calls: any[] = [];
216214
preferences.onPreferencesChanged((prefs) => calls.push(prefs));
217-
await preferences.ensureDefaultConfigurableUserPreferences();
218215
preferences.getConfigurableUserPreferences(); // set defaults
219216
await preferences.savePreferences({ networkTraffic: false });
220217
await preferences.savePreferences({ readOnly: true });
221218
expect(calls).to.deep.equal([
222-
{
223-
showedNetworkOptIn: true,
224-
enableMaps: true,
225-
enableFeedbackPanel: true,
226-
trackUsageStatistics: true,
227-
autoUpdates: true,
228-
},
229219
{
230220
networkTraffic: false,
231221
enableMaps: false,

packages/compass-preferences-model/src/preferences.ts

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ export interface PreferencesAccess {
2222
): Promise<AllPreferences>;
2323
refreshPreferences(): Promise<AllPreferences>;
2424
getPreferences(): AllPreferences;
25-
ensureDefaultConfigurableUserPreferences(): Promise<void>;
2625
getConfigurableUserPreferences(): Promise<UserConfigurablePreferences>;
2726
getPreferenceStates(): Promise<PreferenceStateInformation>;
2827
onPreferenceValueChanged<K extends keyof AllPreferences>(
@@ -248,26 +247,6 @@ export class Preferences {
248247
return { values, states };
249248
}
250249

251-
/**
252-
* If this is the first call to this method, this sets the defaults for
253-
* user preferences.
254-
*/
255-
async ensureDefaultConfigurableUserPreferences(): Promise<void> {
256-
// Set the defaults and also update showedNetworkOptIn flag.
257-
const { showedNetworkOptIn } = this.getPreferences();
258-
if (!showedNetworkOptIn) {
259-
await this.savePreferences({
260-
autoUpdates: true,
261-
enableGenAIFeatures: true,
262-
enableMaps: true,
263-
trackUsageStatistics: true,
264-
enableFeedbackPanel: true,
265-
showedNetworkOptIn: true,
266-
theme: 'LIGHT',
267-
});
268-
}
269-
}
270-
271250
/**
272251
* Return the subset of preferences that can be edited through the UI.
273252
*

packages/compass-preferences-model/src/read-only-preferences-access.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,6 @@ export class ReadOnlyPreferenceAccess implements PreferencesAccess {
2929
return this._preferences.getPreferences();
3030
}
3131

32-
ensureDefaultConfigurableUserPreferences() {
33-
return this._preferences.ensureDefaultConfigurableUserPreferences();
34-
}
35-
3632
getConfigurableUserPreferences() {
3733
return Promise.resolve(this._preferences.getConfigurableUserPreferences());
3834
}

packages/compass-preferences-model/src/renderer-ipc.spec.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@ describe('Renderer IPC', function () {
1010
'compass:get-preferences'() {
1111
return { getPreferences: 1 };
1212
},
13-
'compass:ensure-default-configurable-user-preferences'() {
14-
return { ensureDefaultConfigurableUserPreferences: 1 };
15-
},
1613
'compass:get-configurable-user-preferences'() {
1714
return { getConfigurableUserPreferences: 1 };
1815
},
@@ -40,12 +37,6 @@ describe('Renderer IPC', function () {
4037
});
4138
});
4239

43-
it('should be able to call ensureDefaultConfigurableUserPreferences', async function () {
44-
expect(
45-
await preferencesIpc.ensureDefaultConfigurableUserPreferences()
46-
).to.deep.equal({ ensureDefaultConfigurableUserPreferences: 1 });
47-
});
48-
4940
it('should be able to call getConfigurableUserPreferences', async function () {
5041
expect(await preferencesIpc.getConfigurableUserPreferences()).to.deep.equal(
5142
{ getConfigurableUserPreferences: 1 }

0 commit comments

Comments
 (0)