Skip to content

Commit 0cff95e

Browse files
authored
fix(diff-viewer): use slash as sep (#181)
1 parent 457d5db commit 0cff95e

2 files changed

Lines changed: 96 additions & 95 deletions

File tree

packages/core/src/api/renderDiffViewer.tsx

Lines changed: 83 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
SlotRenderer,
1111
} from '@opensumi/ide-core-browser';
1212
import merge from 'lodash/merge';
13-
import React, { useEffect } from 'react';
13+
import React, { useEffect, useLayoutEffect, useMemo } from 'react';
1414
import { IDiffViewerProps } from '../core/diff-viewer';
1515
import { DiffViewerModule } from '../core/diff-viewer/module';
1616
import { BoxPanel, SplitPanel } from '../editor';
@@ -52,105 +52,100 @@ export function DiffViewerLayoutComponent(): React.ReactElement {
5252
}
5353

5454
export 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}

packages/core/src/core/diff-viewer/internal/base.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ import {
1010
IChatProgress,
1111
ILogger,
1212
isArray,
13+
isWindows,
1314
MaybePromise,
1415
Sequencer,
1516
URI,
1617
} from '@opensumi/ide-core-common';
1718
import { IResourceOpenOptions, WorkbenchEditorService } from '@opensumi/ide-editor';
1819
import { Selection, SelectionDirection } from '@opensumi/ide-monaco';
20+
import { toSlashes } from '@opensumi/ide-utils/lib/path';
1921

2022
import { Autowired } from '@opensumi/di';
2123
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
8587
return URI.file(this.getFullPath(filePath));
8688
}
8789

88-
stripDirectory(filePath: string) {
89-
const result = removeStart(filePath, this.appConfig.workspaceDir);
90+
normalizePath(filePath: string) {
91+
let result = removeStart(filePath, this.appConfig.workspaceDir);
92+
if (isWindows) {
93+
result = toSlashes(result);
94+
}
95+
9096
if (result.startsWith('/')) {
9197
return result.slice(1);
9298
}
@@ -239,7 +245,7 @@ export class DiffViewerContribution implements ClientAppContribution, MenuContri
239245
};
240246

241247
getFilePathForEditor = (editor: IEditor) => {
242-
return this.stripDirectory(editor.currentUri!.codeUri.fsPath);
248+
return this.normalizePath(editor.currentUri!.codeUri.fsPath);
243249
};
244250

245251
getAllTabs = (): IDiffViewerTab[] => {
@@ -248,12 +254,12 @@ export class DiffViewerContribution implements ClientAppContribution, MenuContri
248254

249255
return resources.map((editor, idx) => ({
250256
index: idx,
251-
filePath: this.stripDirectory(editor.uri.codeUri.fsPath),
257+
filePath: this.normalizePath(editor.uri.codeUri.fsPath),
252258
}));
253259
};
254260

255261
getFileIndex = (filePath: string) => {
256-
const aPath = this.stripDirectory(filePath);
262+
const aPath = this.normalizePath(filePath);
257263
return this.getAllTabs().findIndex((tab) => tab.filePath === aPath);
258264
};
259265

@@ -359,7 +365,7 @@ export class DiffViewerContribution implements ClientAppContribution, MenuContri
359365
const fsPath = e.uri.fsPath;
360366

361367
this._onPartialEditEvent.fire({
362-
filePath: this.stripDirectory(fsPath),
368+
filePath: this.normalizePath(fsPath),
363369
...e,
364370
});
365371
}));
@@ -370,7 +376,7 @@ export class DiffViewerContribution implements ClientAppContribution, MenuContri
370376
let currentIndex = -1;
371377
if (newPath) {
372378
currentIndex = this.getFileIndex(newPath);
373-
newPath = this.stripDirectory(newPath);
379+
newPath = this.normalizePath(newPath);
374380
}
375381

376382
const event = {

0 commit comments

Comments
 (0)