From a5d663cd7e7efd90c360774622e31ff98e6e772f Mon Sep 17 00:00:00 2001 From: YanXinyu Date: Tue, 14 Feb 2023 14:42:32 +0800 Subject: [PATCH] fix: reset yTextMap when file updated by system (#2260) --- .../src/browser/collaboration.contribution.ts | 11 ++++++-- .../src/browser/collaboration.service.ts | 27 ++++++++++++++++++- packages/collaboration/src/common/types.ts | 1 + 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/packages/collaboration/src/browser/collaboration.contribution.ts b/packages/collaboration/src/browser/collaboration.contribution.ts index cd899ba2e1..d4f3dead3a 100644 --- a/packages/collaboration/src/browser/collaboration.contribution.ts +++ b/packages/collaboration/src/browser/collaboration.contribution.ts @@ -1,6 +1,7 @@ import { Autowired } from '@opensumi/di'; import { ClientAppContribution, + FsProviderContribution, KeybindingContribution, KeybindingRegistry, KeybindingWeight, @@ -10,8 +11,10 @@ import { CommandContribution, CommandRegistry, ContributionProvider, Domain } fr import { ICollaborationService, CollaborationModuleContribution } from '../common'; import { REDO, UNDO } from '../common/commands'; -@Domain(ClientAppContribution, KeybindingContribution, CommandContribution) -export class CollaborationContribution implements ClientAppContribution, KeybindingContribution, CommandContribution { +@Domain(ClientAppContribution, KeybindingContribution, CommandContribution, FsProviderContribution) +export class CollaborationContribution + implements ClientAppContribution, KeybindingContribution, CommandContribution, FsProviderContribution +{ @Autowired(ICollaborationService) private collaborationService: ICollaborationService; @@ -64,4 +67,8 @@ export class CollaborationContribution implements ClientAppContribution, Keybind }, }); } + + onFileServiceReady() { + this.collaborationService.initFileWatch(); + } } diff --git a/packages/collaboration/src/browser/collaboration.service.ts b/packages/collaboration/src/browser/collaboration.service.ts index 95ce4115d1..31c6422fec 100644 --- a/packages/collaboration/src/browser/collaboration.service.ts +++ b/packages/collaboration/src/browser/collaboration.service.ts @@ -5,7 +5,7 @@ import { WebsocketProvider } from 'y-websocket'; import { Doc as YDoc, Map as YMap, YMapEvent, Text as YText } from 'yjs'; import { Injectable, Autowired, Inject, INJECTOR_TOKEN, Injector } from '@opensumi/di'; -import { AppConfig } from '@opensumi/ide-core-browser'; +import { AppConfig, DisposableCollection } from '@opensumi/ide-core-browser'; import { Deferred, ILogger, OnEvent, uuid, WithEventBus } from '@opensumi/ide-core-common'; import { WorkbenchEditorService } from '@opensumi/ide-editor'; import { @@ -16,6 +16,7 @@ import { IEditorDocumentModelService, } from '@opensumi/ide-editor/lib/browser'; import { WorkbenchEditorServiceImpl } from '@opensumi/ide-editor/lib/browser/workbench-editor.service'; +import { IFileServiceClient, FileChangeEvent, FileChangeType } from '@opensumi/ide-file-service/lib/common'; import { ITextModel, ICodeEditor } from '@opensumi/ide-monaco'; import { ICSSStyleService } from '@opensumi/ide-theme'; @@ -54,6 +55,9 @@ export class CollaborationService extends WithEventBus implements ICollaboration @Autowired(IEditorDocumentModelService) private docModelManager: IEditorDocumentModelService; + @Autowired(IFileServiceClient) + protected readonly fileServiceClient: IFileServiceClient; + @Autowired(AppConfig) private appConfig: AppConfig; @@ -75,6 +79,8 @@ export class CollaborationService extends WithEventBus implements ICollaboration private bindingReadyMap: Map> = new Map(); + protected readonly toDisposableCollection: DisposableCollection = new DisposableCollection(); + private yMapObserver = (event: YMapEvent) => { const changes = event.changes.keys; changes.forEach((change, key) => { @@ -133,6 +139,14 @@ export class CollaborationService extends WithEventBus implements ICollaboration this.yWebSocketProvider.awareness.setLocalStateField('user-info', this.userInfo); } + initFileWatch() { + this.toDisposableCollection.push( + this.fileServiceClient.onFilesChanged((e) => { + this.handleFileChange(e); + }), + ); + } + destroy() { this.yWebSocketProvider.awareness.off('update', this.updateCSSManagerWhenAwarenessUpdated); this.clientIDStyleAddedSet.forEach((clientID) => { @@ -143,6 +157,7 @@ export class CollaborationService extends WithEventBus implements ICollaboration this.yTextMap.unobserve(this.yMapObserver); this.yWebSocketProvider.disconnect(); this.bindingMap.forEach((binding) => binding.destroy()); + this.toDisposableCollection.dispose(); } registerContribution(contribution: CollaborationModuleContribution) { @@ -268,6 +283,16 @@ export class CollaborationService extends WithEventBus implements ICollaboration } }; + private handleFileChange(e: FileChangeEvent) { + e.forEach((change) => { + // 只有从文件系统更新,并且窗口未打开情况,才重置 yTextMap + if (change.type === FileChangeType.UPDATED && !this.bindingMap.get(change.uri) && this.yTextMap.get(change.uri)) { + this.yTextMap.delete(change.uri); + this.resetDeferredYMapKey(change.uri); + } + }); + } + @OnEvent(EditorDocumentModelCreationEvent) private async editorDocumentModelCreationHandler(e: EditorDocumentModelCreationEvent) { if (e.payload.uri.scheme !== 'file') { diff --git a/packages/collaboration/src/common/types.ts b/packages/collaboration/src/common/types.ts index 980f5e22a7..43045d248f 100644 --- a/packages/collaboration/src/common/types.ts +++ b/packages/collaboration/src/common/types.ts @@ -8,6 +8,7 @@ export const ICollaborationService = Symbol('ICollaborationService'); export interface ICollaborationService { initialize(): void; + initFileWatch(): void; destroy(): void; undoOnFocusedTextModel(): void; redoOnFocusedTextModel(): void;