@@ -10,7 +10,7 @@ import {
1010 SlotRenderer ,
1111} from '@opensumi/ide-core-browser' ;
1212import merge from 'lodash/merge' ;
13- import React , { useEffect } from 'react' ;
13+ import React , { useEffect , useLayoutEffect , useMemo } from 'react' ;
1414import { IDiffViewerProps } from '../core/diff-viewer' ;
1515import { DiffViewerModule } from '../core/diff-viewer/module' ;
1616import { BoxPanel , SplitPanel } from '../editor' ;
@@ -52,105 +52,100 @@ export function DiffViewerLayoutComponent(): React.ReactElement {
5252}
5353
5454export const DiffViewerRenderer = ( props : IDiffViewerProps ) => {
55- const mergedProps = merge ( {
56- appConfig : { } ,
57- runtimeConfig : {
58- onWillApplyTheme : props . onWillApplyTheme ,
59- tabBarRightExtraContent : props . tabBarRightExtraContent ,
60- } as RuntimeConfig ,
61- } , props ) as IAppRendererProps ;
55+ const workspaceDir = useConstant ( ( ) => props ?. appConfig ?. workspaceDir || 'workspace-' + randomString ( 8 ) ) ;
6256
63- if ( ! mergedProps . appConfig . injector ) {
64- mergedProps . appConfig . injector = new Injector ( ) ;
65- }
66-
67- const injector = mergedProps . appConfig . injector ;
68-
69- injector . addProviders ( {
70- token : IDiffViewerProps ,
71- useValue : mergedProps ,
72- } ) ;
73-
74- const appConfig = mergedProps . appConfig ;
75-
76- let appModules : ModuleConstructor [ ] = appConfig ?. modules || [ ] ;
77- if ( ! appModules . includes ( DiffViewerModule ) ) {
78- appModules = [
79- DiffViewerModule ,
80- ...appModules ,
81- ] ;
82- }
83-
84- delete appConfig ?. modules ;
85-
86- const workspaceDir = appConfig ?. workspaceDir || 'workspace-' + randomString ( 8 ) ;
87- delete ( appConfig as Partial < IAppRendererProps [ 'appConfig' ] > ) ?. workspaceDir ;
88-
89- const layoutConfig = appConfig ?. layoutConfig || defaultLayoutConfig ;
90- delete appConfig ?. layoutConfig ;
91-
92- const layoutComponent = appConfig ?. layoutComponent || DiffViewerLayoutComponent ;
93- delete appConfig ?. layoutComponent ;
94-
95- useEffect ( ( ) => {
96- const prefix = randomString ( 8 ) ;
97- registerLocalStorageProvider ( GeneralSettingsId . Theme , workspaceDir , prefix ) ;
57+ useLayoutEffect ( ( ) => {
58+ registerLocalStorageProvider ( GeneralSettingsId . Theme , workspaceDir , workspaceDir ) ;
9859 return ( ) => {
9960 for ( var i = 0 ; i < localStorage . length ; i ++ ) {
10061 const key = localStorage . key ( i ) ! ;
101- if ( key . startsWith ( prefix ) ) {
62+ if ( key . startsWith ( workspaceDir ) ) {
10263 localStorage . removeItem ( key ) ;
10364 }
10465 }
10566 } ;
106- } , [ ] ) ;
107-
108- const diffViewerAppConfig : IAppRendererProps = merge < IAppRendererProps , Partial < IAppRendererProps > > ( {
109- appConfig : {
110- modules : appModules ,
111- workspaceDir,
112- layoutComponent,
113- layoutConfig,
114- disableRestoreEditorGroupState : true ,
115- extensionMetadata,
116- defaultPreferences : {
117- 'general.theme' : 'opensumi-light' ,
118- 'editor.minimap' : false ,
119- 'ai.native.inlineDiff.preview.mode' : 'inlineLive' ,
120- 'editor.showActionWhenGroupEmpty' : true ,
121- 'editor.autoSave' : 'afterDelay' ,
122- 'application.confirmExit' : 'never' ,
123- 'editor.guides.bracketPairs' : false ,
124- 'editor.quickSuggestionsDelay' : 10 ,
125- 'editor.previewMode' : false ,
126- 'editor.autoSaveDelay' : 1000 , // one second
127- 'editor.fixedOverflowWidgets' : true , // widget editor 默认改为 fixed
128- 'editor.unicodeHighlight.ambiguousCharacters' : false ,
129- 'editor.preventScrollAfterFocused' : true ,
130- 'files.exclude' : {
131- ...FILES_DEFAULTS . filesExclude ,
132- // browserfs OverlayFS 用来记录删除的文件
133- [ `**${ deletionLogPath } ` ] : true ,
67+ } , [ workspaceDir ] ) ;
68+
69+ const diffViewerAppConfig : IAppRendererProps = useMemo ( ( ) => {
70+ const mergedProps = merge ( {
71+ appConfig : { } ,
72+ runtimeConfig : {
73+ onWillApplyTheme : props . onWillApplyTheme ,
74+ tabBarRightExtraContent : props . tabBarRightExtraContent ,
75+ } as RuntimeConfig ,
76+ } , props ) as IAppRendererProps ;
77+
78+ if ( ! mergedProps . appConfig . injector ) {
79+ mergedProps . appConfig . injector = new Injector ( ) ;
80+ }
81+
82+ const injector = mergedProps . appConfig . injector ;
83+
84+ injector . addProviders ( {
85+ token : IDiffViewerProps ,
86+ useValue : mergedProps ,
87+ } ) ;
88+
89+ const appConfig = mergedProps . appConfig ;
90+
91+ let appModules : ModuleConstructor [ ] = appConfig ?. modules || [ ] ;
92+ if ( ! appModules . includes ( DiffViewerModule ) ) {
93+ appModules = [
94+ DiffViewerModule ,
95+ ...appModules ,
96+ ] ;
97+ }
98+
99+ delete props ?. appConfig ?. modules ;
100+ delete props ?. appConfig ?. workspaceDir ;
101+
102+ return merge < IAppRendererProps , Partial < IAppRendererProps > > ( {
103+ appConfig : {
104+ modules : appModules ,
105+ workspaceDir,
106+ layoutComponent : DiffViewerLayoutComponent ,
107+ layoutConfig : defaultLayoutConfig ,
108+ disableRestoreEditorGroupState : true ,
109+ extensionMetadata,
110+ defaultPreferences : {
111+ 'general.theme' : 'opensumi-light' ,
112+ 'editor.minimap' : false ,
113+ 'ai.native.inlineDiff.preview.mode' : 'inlineLive' ,
114+ 'editor.showActionWhenGroupEmpty' : true ,
115+ 'editor.autoSave' : 'afterDelay' ,
116+ 'application.confirmExit' : 'never' ,
117+ 'editor.guides.bracketPairs' : false ,
118+ 'editor.quickSuggestionsDelay' : 10 ,
119+ 'editor.previewMode' : false ,
120+ 'editor.autoSaveDelay' : 1000 , // one second
121+ 'editor.fixedOverflowWidgets' : true , // widget editor 默认改为 fixed
122+ 'editor.unicodeHighlight.ambiguousCharacters' : false ,
123+ 'editor.preventScrollAfterFocused' : true ,
124+ 'files.exclude' : {
125+ ...FILES_DEFAULTS . filesExclude ,
126+ // browserfs OverlayFS 用来记录删除的文件
127+ [ `**${ deletionLogPath } ` ] : true ,
128+ } ,
134129 } ,
135130 } ,
136- } ,
137- runtimeConfig : ( {
138- aiNative : {
139- enable : true ,
140- capabilities : {
141- supportsInlineChat : true ,
131+ runtimeConfig : ( {
132+ aiNative : {
133+ enable : true ,
134+ capabilities : {
135+ // 必须要开,否则采纳按钮不可用
136+ supportsInlineChat : true ,
137+ } ,
142138 } ,
143- } ,
144- startupEditor : 'none' ,
145- workspace : {
146- filesystem : {
147- fs : 'InMemory' ,
148- options : { } ,
139+ startupEditor : 'none' ,
140+ workspace : {
141+ filesystem : {
142+ fs : 'InMemory' ,
143+ options : { } ,
144+ } ,
149145 } ,
150- } ,
151- } ) ,
152- } , mergedProps ) ;
153-
146+ } ) ,
147+ } , mergedProps ) ;
148+ } , [ props ] ) ;
154149 return (
155150 < AppRenderer
156151 { ...diffViewerAppConfig }
0 commit comments