Skip to content

Commit 7b21def

Browse files
committed
refactor - move logic to userDataSyncWorkbenchService
1 parent dfb4dbe commit 7b21def

File tree

9 files changed

+221
-225
lines changed

9 files changed

+221
-225
lines changed

src/vs/platform/userDataSync/common/userDataSync.ts

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
77
import { Event } from 'vs/base/common/event';
88
import { IExtensionIdentifier, EXTENSION_IDENTIFIER_PATTERN } from 'vs/platform/extensionManagement/common/extensionManagement';
9-
import { RawContextKey } from 'vs/platform/contextkey/common/contextkey';
109
import { Registry } from 'vs/platform/registry/common/platform';
1110
import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope, allSettings } from 'vs/platform/configuration/common/configurationRegistry';
1211
import { localize } from 'vs/nls';
@@ -388,30 +387,3 @@ export function getSyncResourceFromLocalPreview(localPreview: URI, environmentSe
388387
localPreview = localPreview.with({ scheme: environmentService.userDataSyncHome.scheme });
389388
return ALL_SYNC_RESOURCES.filter(syncResource => isEqualOrParent(localPreview, joinPath(environmentService.userDataSyncHome, syncResource, PREVIEW_DIR_NAME)))[0];
390389
}
391-
392-
export function getSyncAreaLabel(source: SyncResource): string {
393-
switch (source) {
394-
case SyncResource.Settings: return localize('settings', "Settings");
395-
case SyncResource.Keybindings: return localize('keybindings', "Keyboard Shortcuts");
396-
case SyncResource.Snippets: return localize('snippets', "User Snippets");
397-
case SyncResource.Extensions: return localize('extensions', "Extensions");
398-
case SyncResource.GlobalState: return localize('ui state label', "UI State");
399-
}
400-
}
401-
402-
export const enum AccountStatus {
403-
Uninitialized = 'uninitialized',
404-
Unavailable = 'unavailable',
405-
Available = 'available',
406-
}
407-
408-
// Contexts
409-
export const CONTEXT_SYNC_STATE = new RawContextKey<string>('syncStatus', SyncStatus.Uninitialized);
410-
export const CONTEXT_SYNC_ENABLEMENT = new RawContextKey<boolean>('syncEnabled', false);
411-
export const CONTEXT_ENABLE_VIEWS = new RawContextKey<boolean>(`showUserDataSyncViews`, false);
412-
export const CONTEXT_ACCOUNT_STATE = new RawContextKey<string>('userDataSyncAccountStatus', AccountStatus.Uninitialized);
413-
414-
// Commands
415-
export const ENABLE_SYNC_VIEWS_COMMAND_ID = 'workbench.userDataSync.actions.enableViews';
416-
export const CONFIGURE_SYNC_COMMAND_ID = 'workbench.userDataSync.actions.configure';
417-
export const SHOW_SYNC_LOG_COMMAND_ID = 'workbench.userDataSync.actions.showLog';

src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ import { IPreferencesService } from 'vs/workbench/services/preferences/common/pr
4646
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
4747
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
4848
import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
49-
import { CONTEXT_SYNC_ENABLEMENT } from 'vs/platform/userDataSync/common/userDataSync';
5049
import { IQuickAccessRegistry, Extensions } from 'vs/platform/quickinput/common/quickAccess';
5150
import { InstallExtensionQuickAccessProvider, ManageExtensionsQuickAccessProvider } from 'vs/workbench/contrib/extensions/browser/extensionsQuickAccess';
5251
import { ExtensionRecommendationsService } from 'vs/workbench/contrib/extensions/browser/extensionRecommendationsService';
52+
import { CONTEXT_SYNC_ENABLEMENT } from 'vs/workbench/services/userDataSync/common/userDataSync';
5353

5454
// Singletons
5555
registerSingleton(IExtensionsWorkbenchService, ExtensionsWorkbenchService);

src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts

Lines changed: 22 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import { Action } from 'vs/base/common/actions';
77
import { toErrorMessage } from 'vs/base/common/errorMessage';
8-
import { canceled, isPromiseCanceledError } from 'vs/base/common/errors';
8+
import { isPromiseCanceledError } from 'vs/base/common/errors';
99
import { Event } from 'vs/base/common/event';
1010
import { Disposable, DisposableStore, dispose, MutableDisposable, toDisposable, IDisposable } from 'vs/base/common/lifecycle';
1111
import { isEqual, basename } from 'vs/base/common/resources';
@@ -28,9 +28,9 @@ import { INotificationService, Severity } from 'vs/platform/notification/common/
2828
import { IQuickInputService, IQuickPickItem, IQuickPickSeparator } from 'vs/platform/quickinput/common/quickInput';
2929
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
3030
import {
31-
CONTEXT_SYNC_STATE, IUserDataAutoSyncService, IUserDataSyncService, registerConfiguration,
32-
SyncResource, SyncStatus, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_SCHEME, IUserDataSyncEnablementService, CONTEXT_SYNC_ENABLEMENT,
33-
SyncResourceConflicts, Conflict, getSyncResourceFromLocalPreview, getSyncAreaLabel, ENABLE_SYNC_VIEWS_COMMAND_ID, CONFIGURE_SYNC_COMMAND_ID, AccountStatus, CONTEXT_ENABLE_VIEWS, SHOW_SYNC_LOG_COMMAND_ID, CONTEXT_ACCOUNT_STATE
31+
IUserDataAutoSyncService, IUserDataSyncService, registerConfiguration,
32+
SyncResource, SyncStatus, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_SCHEME, IUserDataSyncEnablementService,
33+
SyncResourceConflicts, Conflict, getSyncResourceFromLocalPreview
3434
} from 'vs/platform/userDataSync/common/userDataSync';
3535
import { FloatingClickWidget } from 'vs/workbench/browser/parts/editor/editorWidgets';
3636
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
@@ -48,13 +48,12 @@ import { IProductService } from 'vs/platform/product/common/productService';
4848
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
4949
import { IOpenerService } from 'vs/platform/opener/common/opener';
5050
import { IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService';
51-
import { UserDataSyncAccounts } from 'vs/workbench/contrib/userDataSync/browser/userDataSyncAccount';
5251
import { Registry } from 'vs/platform/registry/common/platform';
5352
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
5453
import { Codicon } from 'vs/base/common/codicons';
5554
import { ViewContainerLocation, IViewContainersRegistry, Extensions, ViewContainer } from 'vs/workbench/common/views';
5655
import { UserDataSyncViewPaneContainer, UserDataSyncDataViews } from 'vs/workbench/contrib/userDataSync/browser/userDataSyncViews';
57-
import { IUserDataSyncWorkbenchService } from 'vs/workbench/services/userDataSync/common/userDataSyncWorkbenchService';
56+
import { IUserDataSyncWorkbenchService, CONTEXT_ENABLE_VIEWS, getSyncAreaLabel, AccountStatus, CONTEXT_SYNC_STATE, CONTEXT_SYNC_ENABLEMENT, CONTEXT_ACCOUNT_STATE, CONFIGURE_SYNC_COMMAND_ID, ENABLE_SYNC_VIEWS_COMMAND_ID, SHOW_SYNC_LOG_COMMAND_ID } from 'vs/workbench/services/userDataSync/common/userDataSync';
5857

5958
const CONTEXT_CONFLICTS_SOURCES = new RawContextKey<string>('conflictsSources', '');
6059

@@ -65,10 +64,6 @@ type SyncConflictsClassification = {
6564
action?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true };
6665
};
6766

68-
type FirstTimeSyncClassification = {
69-
action: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true };
70-
};
71-
7267
const turnOnSyncCommand = { id: 'workbench.userDataSync.actions.turnOn', title: localize('turn on sync with category', "Preferences Sync: Turn On...") };
7368
const turnOffSyncCommand = { id: 'workbench.userDataSync.actions.turnOff', title: localize('stop sync', "Preferences Sync: Turn Off") };
7469
const configureSyncCommand = { id: CONFIGURE_SYNC_COMMAND_ID, title: localize('configure sync', "Preferences Sync: Configure...") };
@@ -95,13 +90,9 @@ const CONTEXT_TURNING_ON_STATE = new RawContextKey<false>('userDataSyncTurningOn
9590
export class UserDataSyncWorkbenchContribution extends Disposable implements IWorkbenchContribution {
9691

9792
private readonly turningOnSyncContext: IContextKey<boolean>;
98-
private readonly syncEnablementContext: IContextKey<boolean>;
99-
private readonly syncStatusContext: IContextKey<string>;
100-
private readonly accountStatusContext: IContextKey<string>;
10193
private readonly conflictsSources: IContextKey<string>;
10294
private readonly viewsEnablementContext: IContextKey<boolean>;
10395

104-
private readonly userDataSyncAccounts: UserDataSyncAccounts;
10596
private readonly badgeDisposable = this._register(new MutableDisposable());
10697

10798
constructor(
@@ -130,29 +121,24 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
130121
super();
131122

132123
this.turningOnSyncContext = CONTEXT_TURNING_ON_STATE.bindTo(contextKeyService);
133-
this.syncEnablementContext = CONTEXT_SYNC_ENABLEMENT.bindTo(contextKeyService);
134-
this.syncStatusContext = CONTEXT_SYNC_STATE.bindTo(contextKeyService);
135-
this.accountStatusContext = CONTEXT_ACCOUNT_STATE.bindTo(contextKeyService);
136124
this.conflictsSources = CONTEXT_CONFLICTS_SOURCES.bindTo(contextKeyService);
137125
this.viewsEnablementContext = CONTEXT_ENABLE_VIEWS.bindTo(contextKeyService);
138126

139-
this.userDataSyncAccounts = instantiationService.createInstance(UserDataSyncAccounts);
140-
141-
if (this.userDataSyncAccounts.authenticationProviders.length) {
127+
if (this.userDataSyncWorkbenchService.authenticationProviders.length) {
142128
registerConfiguration();
143129

144-
this.onDidChangeSyncStatus(this.userDataSyncService.status);
130+
this.updateBadge();
145131
this.onDidChangeConflicts(this.userDataSyncService.conflicts);
146-
this.onDidChangeEnablement(this.userDataSyncEnablementService.isEnabled());
147-
this.onDidChangeAccountStatus(this.userDataSyncAccounts.status);
148132

149-
this._register(Event.debounce(userDataSyncService.onDidChangeStatus, () => undefined, 500)(() => this.onDidChangeSyncStatus(this.userDataSyncService.status)));
133+
this._register(Event.any(
134+
Event.debounce(userDataSyncService.onDidChangeStatus, () => undefined, 500),
135+
this.userDataSyncEnablementService.onDidChangeEnablement,
136+
this.userDataSyncWorkbenchService.onDidChangeAccountStatus
137+
)(() => this.updateBadge()));
150138
this._register(userDataSyncService.onDidChangeConflicts(() => this.onDidChangeConflicts(this.userDataSyncService.conflicts)));
151139
this._register(userDataSyncService.onSyncErrors(errors => this.onSyncErrors(errors)));
152-
this._register(this.userDataSyncEnablementService.onDidChangeEnablement(enabled => this.onDidChangeEnablement(enabled)));
153140
this._register(userDataAutoSyncService.onError(error => this.onAutoSyncError(error)));
154-
this._register(this.userDataSyncAccounts.onDidChangeStatus(status => this.onDidChangeAccountStatus(status)));
155-
this._register(this.userDataSyncAccounts.onDidSignOut(() => this.doTurnOff(false)));
141+
156142
this.registerActions();
157143
this.registerViews();
158144

@@ -161,16 +147,6 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
161147
}
162148
}
163149

164-
private onDidChangeAccountStatus(status: AccountStatus): void {
165-
this.accountStatusContext.set(status);
166-
this.updateBadge();
167-
}
168-
169-
private onDidChangeSyncStatus(status: SyncStatus) {
170-
this.syncStatusContext.set(status);
171-
this.updateBadge();
172-
}
173-
174150
private readonly conflictsDisposables = new Map<SyncResource, IDisposable>();
175151
private onDidChangeConflicts(conflicts: SyncResourceConflicts[]) {
176152
this.updateBadge();
@@ -285,11 +261,6 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
285261
}
286262
}
287263

288-
private onDidChangeEnablement(enabled: boolean) {
289-
this.syncEnablementContext.set(enabled);
290-
this.updateBadge();
291-
}
292-
293264
private onAutoSyncError(error: UserDataSyncError): void {
294265
switch (error.code) {
295266
case UserDataSyncErrorCode.TurnedOff:
@@ -383,7 +354,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
383354
let clazz: string | undefined;
384355
let priority: number | undefined = undefined;
385356

386-
if (this.userDataSyncService.status !== SyncStatus.Uninitialized && this.userDataSyncEnablementService.isEnabled() && this.userDataSyncAccounts.status === AccountStatus.Unavailable) {
357+
if (this.userDataSyncService.status !== SyncStatus.Uninitialized && this.userDataSyncEnablementService.isEnabled() && this.userDataSyncWorkbenchService.accountStatus === AccountStatus.Unavailable) {
387358
badge = new NumberBadge(1, () => localize('sign in to sync preferences', "Sign in to Sync Preferences"));
388359
} else if (this.userDataSyncService.conflicts.length) {
389360
badge = new NumberBadge(this.userDataSyncService.conflicts.reduce((result, syncResourceConflict) => { return result + syncResourceConflict.conflicts.length; }, 0), () => localize('has conflicts', "Preferences Sync: Conflicts Detected"));
@@ -419,7 +390,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
419390
if (!turnOn) {
420391
return;
421392
}
422-
await this.doTurnOn();
393+
await this.userDataSyncWorkbenchService.turnOn();
423394
this.storageService.store('sync.donotAskPreviewConfirmation', true, StorageScope.GLOBAL);
424395
} finally {
425396
this.turningOnSync = false;
@@ -454,13 +425,13 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
454425
quickPick.title = localize('Preferences Sync Title', "Preferences Sync");
455426
quickPick.ok = false;
456427
quickPick.customButton = true;
457-
if (this.userDataSyncAccounts.all.length) {
428+
if (this.userDataSyncWorkbenchService.all.length) {
458429
quickPick.customLabel = localize('turn on', "Turn On");
459430
} else {
460431
const orTerm = localize({ key: 'or', comment: ['Here is the context where it is used - Sign in with your A or B or C account to synchronize your data across devices.'] }, "or");
461-
const displayName = this.userDataSyncAccounts.authenticationProviders.length === 1
462-
? this.authenticationService.getDisplayName(this.userDataSyncAccounts.authenticationProviders[0].id)
463-
: this.userDataSyncAccounts.authenticationProviders.map(({ id }) => this.authenticationService.getDisplayName(id)).join(` ${orTerm} `);
432+
const displayName = this.userDataSyncWorkbenchService.authenticationProviders.length === 1
433+
? this.authenticationService.getDisplayName(this.userDataSyncWorkbenchService.authenticationProviders[0].id)
434+
: this.userDataSyncWorkbenchService.authenticationProviders.map(({ id }) => this.authenticationService.getDisplayName(id)).join(` ${orTerm} `);
464435
quickPick.description = localize('sign in and turn on sync detail', "Sign in with your {0} account to synchronize your data across devices.", displayName);
465436
quickPick.customLabel = localize('sign in and turn on sync', "Sign in & Turn on");
466437
}
@@ -491,22 +462,6 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
491462
});
492463
}
493464

494-
private async doTurnOn(): Promise<void> {
495-
const picked = await this.userDataSyncAccounts.pick();
496-
if (!picked) {
497-
throw canceled();
498-
}
499-
500-
// User did not pick an account or login failed
501-
if (this.userDataSyncAccounts.status !== AccountStatus.Available) {
502-
throw new Error(localize('no account', "No account available"));
503-
}
504-
505-
await this.handleFirstTimeSync();
506-
this.userDataSyncEnablementService.setEnablement(true);
507-
this.notificationService.info(localize('sync turned on', "Preferences sync is turned on"));
508-
}
509-
510465
private getConfigureSyncQuickPickItems(): ConfigureSyncQuickPickItem[] {
511466
return [{
512467
id: SyncResource.Settings,
@@ -563,38 +518,6 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
563518
});
564519
}
565520

566-
private async handleFirstTimeSync(): Promise<void> {
567-
const isFirstSyncWithMerge = await this.userDataSyncService.isFirstTimeSyncWithMerge();
568-
if (!isFirstSyncWithMerge) {
569-
return;
570-
}
571-
const result = await this.dialogService.show(
572-
Severity.Info,
573-
localize('firs time sync', "Sync"),
574-
[
575-
localize('merge', "Merge"),
576-
localize('cancel', "Cancel"),
577-
localize('replace', "Replace Local"),
578-
],
579-
{
580-
cancelId: 1,
581-
detail: localize('first time sync detail', "It looks like this is the first time sync is set up.\nWould you like to merge or replace with the data from the cloud?"),
582-
}
583-
);
584-
switch (result.choice) {
585-
case 0:
586-
this.telemetryService.publicLog2<{ action: string }, FirstTimeSyncClassification>('sync/firstTimeSync', { action: 'merge' });
587-
break;
588-
case 1:
589-
this.telemetryService.publicLog2<{ action: string }, FirstTimeSyncClassification>('sync/firstTimeSync', { action: 'cancelled' });
590-
throw canceled();
591-
case 2:
592-
this.telemetryService.publicLog2<{ action: string }, FirstTimeSyncClassification>('sync/firstTimeSync', { action: 'replace-local' });
593-
await this.userDataSyncService.pull();
594-
break;
595-
}
596-
}
597-
598521
private async turnOff(): Promise<void> {
599522
const result = await this.dialogService.confirm({
600523
type: 'info',
@@ -606,18 +529,8 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
606529
}
607530
});
608531
if (result.confirmed) {
609-
return this.doTurnOff(!!result.checkboxChecked);
610-
}
611-
}
612-
613-
private async doTurnOff(turnOffEveryWhere: boolean): Promise<void> {
614-
if (!this.userDataSyncEnablementService.isEnabled()) {
615-
return;
616-
}
617-
if (!this.userDataSyncEnablementService.canToggleEnablement()) {
618-
return;
532+
return this.userDataSyncWorkbenchService.turnoff(!!result.checkboxChecked);
619533
}
620-
await this.userDataSyncWorkbenchService.turnoff(turnOffEveryWhere);
621534
}
622535

623536
private disableSync(source?: SyncResource): void {
@@ -786,7 +699,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
786699
}
787700
async run(): Promise<any> {
788701
try {
789-
await that.userDataSyncAccounts.pick();
702+
await that.userDataSyncWorkbenchService.pickAccount();
790703
} catch (e) {
791704
that.notificationService.error(e);
792705
}
@@ -943,7 +856,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
943856
items.push({ type: 'separator' });
944857
items.push({ id: syncNowCommand.id, label: syncNowCommand.title, description: syncNowCommand.description(that.userDataSyncService) });
945858
if (that.userDataSyncEnablementService.canToggleEnablement()) {
946-
const account = that.userDataSyncAccounts.current;
859+
const account = that.userDataSyncWorkbenchService.current;
947860
items.push({ id: turnOffSyncCommand.id, label: turnOffSyncCommand.title, description: account ? `${account.accountName} (${that.authenticationService.getDisplayName(account.authenticationProviderId)})` : undefined });
948861
}
949862
quickPick.items = items;

src/vs/workbench/contrib/userDataSync/browser/userDataSyncViews.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { localize } from 'vs/nls';
99
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
1010
import { TreeViewPane, TreeView } from 'vs/workbench/browser/parts/views/treeView';
1111
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
12-
import { ALL_SYNC_RESOURCES, SyncResource, IUserDataSyncService, ISyncResourceHandle, CONTEXT_SYNC_STATE, SyncStatus, getSyncAreaLabel, IUserDataSyncEnablementService, ENABLE_SYNC_VIEWS_COMMAND_ID, AccountStatus, CONTEXT_ENABLE_VIEWS, CONFIGURE_SYNC_COMMAND_ID, SHOW_SYNC_LOG_COMMAND_ID, CONTEXT_ACCOUNT_STATE } from 'vs/platform/userDataSync/common/userDataSync';
12+
import { ALL_SYNC_RESOURCES, SyncResource, IUserDataSyncService, ISyncResourceHandle, SyncStatus, IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync';
1313
import { registerAction2, Action2, MenuId } from 'vs/platform/actions/common/actions';
1414
import { ContextKeyExpr, ContextKeyEqualsExpr, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey';
1515
import { URI } from 'vs/base/common/uri';
@@ -31,7 +31,7 @@ import { IStorageService } from 'vs/platform/storage/common/storage';
3131
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
3232
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
3333
import { IAction, Action } from 'vs/base/common/actions';
34-
import { IUserDataSyncWorkbenchService } from 'vs/workbench/services/userDataSync/common/userDataSyncWorkbenchService';
34+
import { IUserDataSyncWorkbenchService, CONTEXT_SYNC_STATE, getSyncAreaLabel, CONTEXT_ACCOUNT_STATE, AccountStatus, CONTEXT_ENABLE_VIEWS, SHOW_SYNC_LOG_COMMAND_ID, CONFIGURE_SYNC_COMMAND_ID, ENABLE_SYNC_VIEWS_COMMAND_ID } from 'vs/workbench/services/userDataSync/common/userDataSync';
3535
import { IUserDataSyncMachinesService, IUserDataSyncMachine } from 'vs/platform/userDataSync/common/userDataSyncMachines';
3636
import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput';
3737

0 commit comments

Comments
 (0)