Skip to content

Commit 9dfdd30

Browse files
committed
Refactor sign-in overlay to use consistent wait durations for animations and error handling
1 parent 802f539 commit 9dfdd30

1 file changed

Lines changed: 30 additions & 7 deletions

File tree

src/vs/sessions/contrib/welcome/browser/sessionsWalkthrough.ts

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ import { URI } from '../../../../base/common/uri.js';
2323

2424
export type WalkthroughOutcome = 'completed' | 'dismissed';
2525

26+
const fadeDuration = 200;
27+
const resetMessageDuration = 2000;
28+
const dismissDuration = 250;
29+
2630
/**
2731
* Sign-in onboarding overlay:
2832
* - Sign in via GitHub / Google / Apple
@@ -192,7 +196,7 @@ export class SessionsWalkthroughOverlay extends Disposable {
192196
// Fade the content
193197
this.disclaimerElement.classList.add('hidden');
194198
this.contentContainer.classList.add('sessions-walkthrough-fade-out');
195-
await new Promise(resolve => setTimeout(resolve, 200));
199+
await this._wait(fadeDuration);
196200
if (this._shouldAbortUpdate(titleEl, subtitleEl, providerRow)) {
197201
return;
198202
}
@@ -245,14 +249,14 @@ export class SessionsWalkthroughOverlay extends Disposable {
245249
// Show cancellation feedback, then reset to sign-in
246250
error.textContent = localize('walkthrough.canceledError', "Sign-in was canceled. Please try again.");
247251
error.style.display = '';
248-
await new Promise(resolve => setTimeout(resolve, 2000));
252+
await this._wait(resetMessageDuration);
249253
if (this._shouldAbortUpdate(error)) {
250254
return;
251255
}
252256
error.style.display = 'none';
253257

254258
this.contentContainer.classList.add('sessions-walkthrough-fade-out');
255-
await new Promise(resolve => setTimeout(resolve, 200));
259+
await this._wait(fadeDuration);
256260
if (!this.overlay.isConnected) {
257261
return;
258262
}
@@ -265,14 +269,14 @@ export class SessionsWalkthroughOverlay extends Disposable {
265269
// Show error feedback, then reset to sign-in
266270
error.textContent = localize('walkthrough.signInError', "Something went wrong. Please try again.");
267271
error.style.display = '';
268-
await new Promise(resolve => setTimeout(resolve, 2000));
272+
await this._wait(resetMessageDuration);
269273
if (this._shouldAbortUpdate(error)) {
270274
return;
271275
}
272276
error.style.display = 'none';
273277

274278
this.contentContainer.classList.add('sessions-walkthrough-fade-out');
275-
await new Promise(resolve => setTimeout(resolve, 200));
279+
await this._wait(fadeDuration);
276280
if (!this.overlay.isConnected) {
277281
return;
278282
}
@@ -294,7 +298,7 @@ export class SessionsWalkthroughOverlay extends Disposable {
294298

295299
// Fade out current content
296300
this.contentContainer.classList.add('sessions-walkthrough-fade-out');
297-
await new Promise(resolve => setTimeout(resolve, 200));
301+
await this._wait(fadeDuration);
298302
if (!this.overlay.isConnected) {
299303
return;
300304
}
@@ -336,7 +340,7 @@ export class SessionsWalkthroughOverlay extends Disposable {
336340

337341
private _finish(outcome: WalkthroughOutcome): void {
338342
this.overlay.classList.add('sessions-walkthrough-dismissed');
339-
this._register(disposableTimeout(() => this.dispose(), 250));
343+
this._register(disposableTimeout(() => this.dispose(), dismissDuration));
340344
if (!this._outcomeResolved) {
341345
this._outcomeResolved = true;
342346
this._resolveOutcome(outcome);
@@ -393,6 +397,25 @@ export class SessionsWalkthroughOverlay extends Disposable {
393397
return this.currentFocusableElements.filter(element => element.isConnected);
394398
}
395399

400+
private _wait(duration: number): Promise<void> {
401+
return new Promise(resolve => {
402+
let didResolve = false;
403+
const timeoutDisposables = this.stepDisposables.value?.add(new DisposableStore()) ?? this._register(new DisposableStore());
404+
const complete = () => {
405+
if (didResolve) {
406+
return;
407+
}
408+
409+
didResolve = true;
410+
timeoutDisposables.dispose();
411+
resolve();
412+
};
413+
414+
timeoutDisposables.add(disposableTimeout(complete, duration));
415+
timeoutDisposables.add(toDisposable(complete));
416+
});
417+
}
418+
396419
private _shouldAbortUpdate(...elements: HTMLElement[]): boolean {
397420
return !this.overlay.isConnected || elements.some(element => !element.isConnected);
398421
}

0 commit comments

Comments
 (0)