From 7ffd47c6f8fc927805971903e9e3cc14f5b2dc2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E5=A3=B0?= Date: Fri, 13 Sep 2024 14:49:36 +0800 Subject: [PATCH 1/3] fix: use memo --- packages/core/src/api/renderDiffViewer.tsx | 175 ++++++++++----------- 1 file changed, 87 insertions(+), 88 deletions(-) diff --git a/packages/core/src/api/renderDiffViewer.tsx b/packages/core/src/api/renderDiffViewer.tsx index bf0ca080..19a1d03b 100644 --- a/packages/core/src/api/renderDiffViewer.tsx +++ b/packages/core/src/api/renderDiffViewer.tsx @@ -10,7 +10,7 @@ import { SlotRenderer, } from '@opensumi/ide-core-browser'; import merge from 'lodash/merge'; -import React, { useEffect } from 'react'; +import React, { useEffect, useLayoutEffect, useMemo } from 'react'; import { IDiffViewerProps } from '../core/diff-viewer'; import { DiffViewerModule } from '../core/diff-viewer/module'; import { BoxPanel, SplitPanel } from '../editor'; @@ -52,105 +52,104 @@ export function DiffViewerLayoutComponent(): React.ReactElement { } export const DiffViewerRenderer = (props: IDiffViewerProps) => { - const mergedProps = merge({ - appConfig: {}, - runtimeConfig: { - onWillApplyTheme: props.onWillApplyTheme, - tabBarRightExtraContent: props.tabBarRightExtraContent, - } as RuntimeConfig, - }, props) as IAppRendererProps; + const workspaceDir = useConstant(() => 'workspace-' + randomString(8)); - if (!mergedProps.appConfig.injector) { - mergedProps.appConfig.injector = new Injector(); - } - - const injector = mergedProps.appConfig.injector; - - injector.addProviders({ - token: IDiffViewerProps, - useValue: mergedProps, - }); - - const appConfig = mergedProps.appConfig; - - let appModules: ModuleConstructor[] = appConfig?.modules || []; - if (!appModules.includes(DiffViewerModule)) { - appModules = [ - DiffViewerModule, - ...appModules, - ]; - } - - delete appConfig?.modules; - - const workspaceDir = appConfig?.workspaceDir || 'workspace-' + randomString(8); - delete (appConfig as Partial)?.workspaceDir; - - const layoutConfig = appConfig?.layoutConfig || defaultLayoutConfig; - delete appConfig?.layoutConfig; - - const layoutComponent = appConfig?.layoutComponent || DiffViewerLayoutComponent; - delete appConfig?.layoutComponent; - - useEffect(() => { - const prefix = randomString(8); - registerLocalStorageProvider(GeneralSettingsId.Theme, workspaceDir, prefix); + useLayoutEffect(() => { + registerLocalStorageProvider(GeneralSettingsId.Theme, workspaceDir, workspaceDir); return () => { for (var i = 0; i < localStorage.length; i++) { const key = localStorage.key(i)!; - if (key.startsWith(prefix)) { + if (key.startsWith(workspaceDir)) { localStorage.removeItem(key); } } }; - }, []); - - const diffViewerAppConfig: IAppRendererProps = merge>({ - appConfig: { - modules: appModules, - workspaceDir, - layoutComponent, - layoutConfig, - disableRestoreEditorGroupState: true, - extensionMetadata, - defaultPreferences: { - 'general.theme': 'opensumi-light', - 'editor.minimap': false, - 'ai.native.inlineDiff.preview.mode': 'inlineLive', - 'editor.showActionWhenGroupEmpty': true, - 'editor.autoSave': 'afterDelay', - 'application.confirmExit': 'never', - 'editor.guides.bracketPairs': false, - 'editor.quickSuggestionsDelay': 10, - 'editor.previewMode': false, - 'editor.autoSaveDelay': 1000, // one second - 'editor.fixedOverflowWidgets': true, // widget editor 默认改为 fixed - 'editor.unicodeHighlight.ambiguousCharacters': false, - 'editor.preventScrollAfterFocused': true, - 'files.exclude': { - ...FILES_DEFAULTS.filesExclude, - // browserfs OverlayFS 用来记录删除的文件 - [`**${deletionLogPath}`]: true, + }, [workspaceDir]); + + const diffViewerAppConfig: IAppRendererProps = useMemo(() => { + const mergedProps = merge({ + appConfig: {}, + runtimeConfig: { + onWillApplyTheme: props.onWillApplyTheme, + tabBarRightExtraContent: props.tabBarRightExtraContent, + } as RuntimeConfig, + }, props) as IAppRendererProps; + + if (!mergedProps.appConfig.injector) { + mergedProps.appConfig.injector = new Injector(); + } + + const injector = mergedProps.appConfig.injector; + + injector.addProviders({ + token: IDiffViewerProps, + useValue: mergedProps, + }); + + const appConfig = mergedProps.appConfig; + + let appModules: ModuleConstructor[] = appConfig?.modules || []; + if (!appModules.includes(DiffViewerModule)) { + appModules = [ + DiffViewerModule, + ...appModules, + ]; + } + + delete appConfig?.modules; + + const layoutConfig = appConfig?.layoutConfig || defaultLayoutConfig; + delete appConfig?.layoutConfig; + + const layoutComponent = appConfig?.layoutComponent || DiffViewerLayoutComponent; + delete appConfig?.layoutComponent; + + return merge>({ + appConfig: { + modules: appModules, + workspaceDir, + layoutComponent, + layoutConfig, + disableRestoreEditorGroupState: true, + extensionMetadata, + defaultPreferences: { + 'general.theme': 'opensumi-light', + 'editor.minimap': false, + 'ai.native.inlineDiff.preview.mode': 'inlineLive', + 'editor.showActionWhenGroupEmpty': true, + 'editor.autoSave': 'afterDelay', + 'application.confirmExit': 'never', + 'editor.guides.bracketPairs': false, + 'editor.quickSuggestionsDelay': 10, + 'editor.previewMode': false, + 'editor.autoSaveDelay': 1000, // one second + 'editor.fixedOverflowWidgets': true, // widget editor 默认改为 fixed + 'editor.unicodeHighlight.ambiguousCharacters': false, + 'editor.preventScrollAfterFocused': true, + 'files.exclude': { + ...FILES_DEFAULTS.filesExclude, + // browserfs OverlayFS 用来记录删除的文件 + [`**${deletionLogPath}`]: true, + }, }, }, - }, - runtimeConfig: ({ - aiNative: { - enable: true, - capabilities: { - supportsInlineChat: true, + runtimeConfig: ({ + aiNative: { + enable: true, + capabilities: { + supportsInlineChat: true, + }, }, - }, - startupEditor: 'none', - workspace: { - filesystem: { - fs: 'InMemory', - options: {}, + startupEditor: 'none', + workspace: { + filesystem: { + fs: 'InMemory', + options: {}, + }, }, - }, - }), - }, mergedProps); - + }), + }, mergedProps); + }, []); return ( Date: Fri, 13 Sep 2024 14:54:14 +0800 Subject: [PATCH 2/3] fix: use slash as sep --- .../src/core/diff-viewer/internal/base.ts | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/core/src/core/diff-viewer/internal/base.ts b/packages/core/src/core/diff-viewer/internal/base.ts index 58571d14..865ef036 100644 --- a/packages/core/src/core/diff-viewer/internal/base.ts +++ b/packages/core/src/core/diff-viewer/internal/base.ts @@ -10,12 +10,14 @@ import { IChatProgress, ILogger, isArray, + isWindows, MaybePromise, Sequencer, URI, } from '@opensumi/ide-core-common'; import { IResourceOpenOptions, WorkbenchEditorService } from '@opensumi/ide-editor'; import { Selection, SelectionDirection } from '@opensumi/ide-monaco'; +import { toSlashes } from '@opensumi/ide-utils/lib/path'; import { Autowired } from '@opensumi/di'; import { InlineChatController } from '@opensumi/ide-ai-native/lib/browser/widget/inline-chat/inline-chat-controller'; @@ -85,8 +87,12 @@ export class DiffViewerContribution implements ClientAppContribution, MenuContri return URI.file(this.getFullPath(filePath)); } - stripDirectory(filePath: string) { - const result = removeStart(filePath, this.appConfig.workspaceDir); + normalizePath(filePath: string) { + let result = removeStart(filePath, this.appConfig.workspaceDir); + if (isWindows) { + result = toSlashes(result); + } + if (result.startsWith('/')) { return result.slice(1); } @@ -239,7 +245,7 @@ export class DiffViewerContribution implements ClientAppContribution, MenuContri }; getFilePathForEditor = (editor: IEditor) => { - return this.stripDirectory(editor.currentUri!.codeUri.fsPath); + return this.normalizePath(editor.currentUri!.codeUri.fsPath); }; getAllTabs = (): IDiffViewerTab[] => { @@ -248,12 +254,12 @@ export class DiffViewerContribution implements ClientAppContribution, MenuContri return resources.map((editor, idx) => ({ index: idx, - filePath: this.stripDirectory(editor.uri.codeUri.fsPath), + filePath: this.normalizePath(editor.uri.codeUri.fsPath), })); }; getFileIndex = (filePath: string) => { - const aPath = this.stripDirectory(filePath); + const aPath = this.normalizePath(filePath); return this.getAllTabs().findIndex((tab) => tab.filePath === aPath); }; @@ -359,7 +365,7 @@ export class DiffViewerContribution implements ClientAppContribution, MenuContri const fsPath = e.uri.fsPath; this._onPartialEditEvent.fire({ - filePath: this.stripDirectory(fsPath), + filePath: this.normalizePath(fsPath), ...e, }); })); @@ -370,7 +376,7 @@ export class DiffViewerContribution implements ClientAppContribution, MenuContri let currentIndex = -1; if (newPath) { currentIndex = this.getFileIndex(newPath); - newPath = this.stripDirectory(newPath); + newPath = this.normalizePath(newPath); } const event = { From fd99b2520a12c603143f4f949574a19def4e0a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E5=A3=B0?= Date: Fri, 13 Sep 2024 14:58:19 +0800 Subject: [PATCH 3/3] chore: update code --- packages/core/src/api/renderDiffViewer.tsx | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/packages/core/src/api/renderDiffViewer.tsx b/packages/core/src/api/renderDiffViewer.tsx index 19a1d03b..21a8668a 100644 --- a/packages/core/src/api/renderDiffViewer.tsx +++ b/packages/core/src/api/renderDiffViewer.tsx @@ -52,7 +52,7 @@ export function DiffViewerLayoutComponent(): React.ReactElement { } export const DiffViewerRenderer = (props: IDiffViewerProps) => { - const workspaceDir = useConstant(() => 'workspace-' + randomString(8)); + const workspaceDir = useConstant(() => props?.appConfig?.workspaceDir || 'workspace-' + randomString(8)); useLayoutEffect(() => { registerLocalStorageProvider(GeneralSettingsId.Theme, workspaceDir, workspaceDir); @@ -96,20 +96,15 @@ export const DiffViewerRenderer = (props: IDiffViewerProps) => { ]; } - delete appConfig?.modules; - - const layoutConfig = appConfig?.layoutConfig || defaultLayoutConfig; - delete appConfig?.layoutConfig; - - const layoutComponent = appConfig?.layoutComponent || DiffViewerLayoutComponent; - delete appConfig?.layoutComponent; + delete props?.appConfig?.modules; + delete props?.appConfig?.workspaceDir; return merge>({ appConfig: { modules: appModules, workspaceDir, - layoutComponent, - layoutConfig, + layoutComponent: DiffViewerLayoutComponent, + layoutConfig: defaultLayoutConfig, disableRestoreEditorGroupState: true, extensionMetadata, defaultPreferences: { @@ -137,6 +132,7 @@ export const DiffViewerRenderer = (props: IDiffViewerProps) => { aiNative: { enable: true, capabilities: { + // 必须要开,否则采纳按钮不可用 supportsInlineChat: true, }, }, @@ -149,7 +145,7 @@ export const DiffViewerRenderer = (props: IDiffViewerProps) => { }, }), }, mergedProps); - }, []); + }, [props]); return (