Skip to content

Commit 38b547c

Browse files
authored
fix: keep inline diff when editor closed (#108)
1 parent c355dda commit 38b547c

12 files changed

Lines changed: 511 additions & 695 deletions

File tree

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"description": "codeblitzjs",
99
"main": "index.js",
1010
"engines": {
11-
"opensumi": "3.1.5-next-1721574303.0"
11+
"opensumi": "3.1.5-next-1722006339.0"
1212
},
1313
"scripts": {
1414
"prepare": "husky install",
@@ -82,7 +82,9 @@
8282
"node-gyp": "npm:@favware/skip-dependency@latest",
8383
"nsfw": "npm:@favware/skip-dependency@latest",
8484
"spdlog": "npm:@favware/skip-dependency@latest",
85-
"node-pty": "npm:@favware/skip-dependency@latest"
85+
"node-pty": "npm:@favware/skip-dependency@latest",
86+
"@parcel/watcher": "npm:@favware/skip-dependency@latest",
87+
"keytar": "npm:@favware/skip-dependency@latest"
8688
},
8789
"packageManager": "yarn@4.2.2"
8890
}

packages/cli/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010
"opensumi codeblitzjs"
1111
],
1212
"engines": {
13-
"opensumi": "3.1.5-next-1721574303.0",
13+
"opensumi": "3.1.5-next-1722006339.0",
1414
"node": ">=10.0.0"
1515
},
1616
"dependencies": {
1717
"@codeblitzjs/ide-common": "1.0.4",
1818
"@opensumi/extension-installer": "^0.0.1",
19-
"@opensumi/ide-extension": "3.1.5-next-1721574303.0",
19+
"@opensumi/ide-extension": "3.1.5-next-1722006339.0",
2020
"commander": "^7.2.0",
2121
"fs-extra": "^9.0.1",
2222
"lodash.pick": "^4.4.0",

packages/core/package.json

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -33,48 +33,48 @@
3333
"@codeblitzjs/ide-plugin": "1.0.4",
3434
"@codeblitzjs/ide-registry": "1.0.4",
3535
"@codeblitzjs/ide-sumi-core": "1.0.4",
36-
"@opensumi/ide-addons": "3.1.5-next-1721574303.0",
37-
"@opensumi/ide-ai-native": "3.1.5-next-1721574303.0",
38-
"@opensumi/ide-comments": "3.1.5-next-1721574303.0",
39-
"@opensumi/ide-core-browser": "3.1.5-next-1721574303.0",
40-
"@opensumi/ide-core-common": "3.1.5-next-1721574303.0",
41-
"@opensumi/ide-debug": "3.1.5-next-1721574303.0",
42-
"@opensumi/ide-decoration": "3.1.5-next-1721574303.0",
43-
"@opensumi/ide-design": "3.1.5-next-1721574303.0",
44-
"@opensumi/ide-editor": "3.1.5-next-1721574303.0",
45-
"@opensumi/ide-explorer": "3.1.5-next-1721574303.0",
46-
"@opensumi/ide-express-file-server": "3.1.5-next-1721574303.0",
47-
"@opensumi/ide-extension": "3.1.5-next-1721574303.0",
48-
"@opensumi/ide-extension-storage": "3.1.5-next-1721574303.0",
49-
"@opensumi/ide-file-scheme": "3.1.5-next-1721574303.0",
50-
"@opensumi/ide-file-service": "3.1.5-next-1721574303.0",
51-
"@opensumi/ide-file-tree-next": "3.1.5-next-1721574303.0",
52-
"@opensumi/ide-i18n": "3.1.5-next-1721574303.0",
53-
"@opensumi/ide-keymaps": "3.1.5-next-1721574303.0",
54-
"@opensumi/ide-logs": "3.1.5-next-1721574303.0",
55-
"@opensumi/ide-main-layout": "3.1.5-next-1721574303.0",
56-
"@opensumi/ide-markdown": "3.1.5-next-1721574303.0",
57-
"@opensumi/ide-markers": "3.1.5-next-1721574303.0",
58-
"@opensumi/ide-menu-bar": "3.1.5-next-1721574303.0",
59-
"@opensumi/ide-monaco": "3.1.5-next-1721574303.0",
60-
"@opensumi/ide-monaco-enhance": "3.1.5-next-1721574303.0",
61-
"@opensumi/ide-opened-editor": "3.1.5-next-1721574303.0",
62-
"@opensumi/ide-outline": "3.1.5-next-1721574303.0",
63-
"@opensumi/ide-output": "3.1.5-next-1721574303.0",
64-
"@opensumi/ide-overlay": "3.1.5-next-1721574303.0",
65-
"@opensumi/ide-preferences": "3.1.5-next-1721574303.0",
66-
"@opensumi/ide-quick-open": "3.1.5-next-1721574303.0",
67-
"@opensumi/ide-scm": "3.1.5-next-1721574303.0",
68-
"@opensumi/ide-search": "3.1.5-next-1721574303.0",
69-
"@opensumi/ide-status-bar": "3.1.5-next-1721574303.0",
70-
"@opensumi/ide-storage": "3.1.5-next-1721574303.0",
71-
"@opensumi/ide-testing": "3.1.5-next-1721574303.0",
72-
"@opensumi/ide-theme": "3.1.5-next-1721574303.0",
73-
"@opensumi/ide-toolbar": "3.1.5-next-1721574303.0",
74-
"@opensumi/ide-variable": "3.1.5-next-1721574303.0",
75-
"@opensumi/ide-webview": "3.1.5-next-1721574303.0",
76-
"@opensumi/ide-workspace": "3.1.5-next-1721574303.0",
77-
"@opensumi/ide-workspace-edit": "3.1.5-next-1721574303.0",
36+
"@opensumi/ide-addons": "3.1.5-next-1722006339.0",
37+
"@opensumi/ide-ai-native": "3.1.5-next-1722006339.0",
38+
"@opensumi/ide-comments": "3.1.5-next-1722006339.0",
39+
"@opensumi/ide-core-browser": "3.1.5-next-1722006339.0",
40+
"@opensumi/ide-core-common": "3.1.5-next-1722006339.0",
41+
"@opensumi/ide-debug": "3.1.5-next-1722006339.0",
42+
"@opensumi/ide-decoration": "3.1.5-next-1722006339.0",
43+
"@opensumi/ide-design": "3.1.5-next-1722006339.0",
44+
"@opensumi/ide-editor": "3.1.5-next-1722006339.0",
45+
"@opensumi/ide-explorer": "3.1.5-next-1722006339.0",
46+
"@opensumi/ide-express-file-server": "3.1.5-next-1722006339.0",
47+
"@opensumi/ide-extension": "3.1.5-next-1722006339.0",
48+
"@opensumi/ide-extension-storage": "3.1.5-next-1722006339.0",
49+
"@opensumi/ide-file-scheme": "3.1.5-next-1722006339.0",
50+
"@opensumi/ide-file-service": "3.1.5-next-1722006339.0",
51+
"@opensumi/ide-file-tree-next": "3.1.5-next-1722006339.0",
52+
"@opensumi/ide-i18n": "3.1.5-next-1722006339.0",
53+
"@opensumi/ide-keymaps": "3.1.5-next-1722006339.0",
54+
"@opensumi/ide-logs": "3.1.5-next-1722006339.0",
55+
"@opensumi/ide-main-layout": "3.1.5-next-1722006339.0",
56+
"@opensumi/ide-markdown": "3.1.5-next-1722006339.0",
57+
"@opensumi/ide-markers": "3.1.5-next-1722006339.0",
58+
"@opensumi/ide-menu-bar": "3.1.5-next-1722006339.0",
59+
"@opensumi/ide-monaco": "3.1.5-next-1722006339.0",
60+
"@opensumi/ide-monaco-enhance": "3.1.5-next-1722006339.0",
61+
"@opensumi/ide-opened-editor": "3.1.5-next-1722006339.0",
62+
"@opensumi/ide-outline": "3.1.5-next-1722006339.0",
63+
"@opensumi/ide-output": "3.1.5-next-1722006339.0",
64+
"@opensumi/ide-overlay": "3.1.5-next-1722006339.0",
65+
"@opensumi/ide-preferences": "3.1.5-next-1722006339.0",
66+
"@opensumi/ide-quick-open": "3.1.5-next-1722006339.0",
67+
"@opensumi/ide-scm": "3.1.5-next-1722006339.0",
68+
"@opensumi/ide-search": "3.1.5-next-1722006339.0",
69+
"@opensumi/ide-status-bar": "3.1.5-next-1722006339.0",
70+
"@opensumi/ide-storage": "3.1.5-next-1722006339.0",
71+
"@opensumi/ide-testing": "3.1.5-next-1722006339.0",
72+
"@opensumi/ide-theme": "3.1.5-next-1722006339.0",
73+
"@opensumi/ide-toolbar": "3.1.5-next-1722006339.0",
74+
"@opensumi/ide-variable": "3.1.5-next-1722006339.0",
75+
"@opensumi/ide-webview": "3.1.5-next-1722006339.0",
76+
"@opensumi/ide-workspace": "3.1.5-next-1722006339.0",
77+
"@opensumi/ide-workspace-edit": "3.1.5-next-1722006339.0",
7878
"@opensumi/textmate-languages": "^2.7.0",
7979
"tslib": "^2.2.0"
8080
},
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import React, { useEffect, useRef } from 'react';
2+
import ReactDOM from 'react-dom/client';
3+
4+
const appContainer = document.createElement('div');
5+
appContainer.className = 'codeblitz-keepalive-portal';
6+
appContainer.style.width = '100%';
7+
appContainer.style.height = '100%';
8+
9+
let appMounted = false;
10+
11+
export const KeepAlive = (props: {
12+
children: React.ReactNode;
13+
}) => {
14+
const anchorRef = useRef<HTMLDivElement>(null);
15+
useEffect(() => {
16+
if (!appMounted) {
17+
appMounted = true;
18+
ReactDOM.createRoot(appContainer).render(
19+
<>{props.children}</>,
20+
);
21+
}
22+
23+
anchorRef?.current?.insertAdjacentElement('afterend', appContainer);
24+
25+
return () => {
26+
try {
27+
if (anchorRef?.current?.parentNode !== null) {
28+
anchorRef?.current?.parentNode.removeChild(appContainer);
29+
}
30+
} catch (error) {
31+
console.error('[KeepAlive] unmount container error', error);
32+
}
33+
};
34+
}, []);
35+
36+
return <div ref={anchorRef} className='codeblitz-keepalive' />;
37+
};

packages/core/src/core/diff-viewer/common.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export interface IDiffViewerHandle {
3838
* 关闭标签页
3939
*/
4040
closeTab: (filePath: string) => Promise<void>;
41+
closeAllTab: () => Promise<void>;
4142
/**
4243
* 获取指定路径的文件内容
4344
*/

packages/core/src/core/diff-viewer/module.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ export class DiffViewerContribution implements CommandContribution, ClientAppCon
136136
const previewer = this.inlineDiffHandler.showPreviewerByStream(editor.monacoEditor, {
137137
crossSelection: Selection.fromRange(fullRange, SelectionDirection.LTR),
138138
chatResponse: controller,
139+
previewerOptions: {
140+
disposeWhenEditorClosed: false,
141+
}
139142
}) as LiveInlineDiffPreviewer;
140143
const whenReady = Event.toPromise(previewer.getNode().onDidEditChange);
141144

@@ -239,6 +242,9 @@ export class DiffViewerContribution implements CommandContribution, ClientAppCon
239242
getAllTabs: () => {
240243
return getAllTabs();
241244
},
245+
closeAllTab: async () => {
246+
return this.workbenchEditorService.closeAll();
247+
}
242248
});
243249
}
244250
registerCommands() {

packages/startup/src/diff-viewer/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ const data = [
1212
{
1313
path: 'app/web/src/main/java/com/alipay/archcompass/web/controller/invalidanalysis/InValidAssetsController.java',
1414
oldCode:
15-
'@GetMapping(value = "/queryInvalidRpcTree")\n public ArchCompassResponse queryInvalidRpcTree(String reportId, String invalidFlag) {\n return ArchCompassServiceTemplate.execute(new ArchCompassServiceCallBack<InvalidResultInfo>() {\n\n @Override\n public void beforeProcess() {\n ParamCheckHelper.notBlank(reportId, "reportId");\n ParamCheckHelper.notBlank(invalidFlag, "invalidFlag");\n }\n\n @Override\n public InvalidResultInfo process() {\n return inValidAssetsAnalysisService.queryInvalidTree(reportId, invalidFlag, "RPC");\n }\n\n @Override\n public void afterProcess() {\n\n }\n }, "queryInvalidRpcTree");\n }',
15+
'// 1234123\n//1235123123@GetMapping(value = "/queryInvalidRpcTree")\n public ArchCompassResponse queryInvalidRpcTree(String reportId, String invalidFlag) {\n return ArchCompassServiceTemplate.execute(new ArchCompassServiceCallBack<InvalidResultInfo>() {\n\n @Override\n public void beforeProcess() {\n ParamCheckHelper.notBlank(reportId, "reportId");\n ParamCheckHelper.notBlank(invalidFlag, "invalidFlag");\n }\n\n @Override\n public InvalidResultInfo process() {\n return inValidAssetsAnalysisService.queryInvalidTree(reportId, invalidFlag, "RPC");\n }\n\n @Override\n public void afterProcess() {\n\n }\n }, "queryInvalidRpcTree");\n }',
1616
newCode:
1717
'@GetMapping(value = "/queryInvalidRpcTree")\n public ArchCompassResponse queryInvalidRpcTree(String reportId) {\n return ArchCompassServiceTemplate.execute(new ArchCompassServiceCallBack<InvalidResultInfo>() {\n\n @Override\n public void beforeProcess() {\n ParamCheckHelper.notBlank(reportId, "reportId");\n }\n\n @Override\n public InvalidResultInfo process() {\n return inValidAssetsAnalysisService.queryInvalidTree(reportId, "RPC");\n }\n\n @Override\n public void afterProcess() {\n\n }\n }, "queryInvalidRpcTree");\n }',
1818
},
1919
{
2020
path: 'app/web/src/main/java/com/alipay/archcompass/web/controller/invalidanalysis/InValidAssetsController1.java',
2121
oldCode:
22-
'@GetMapping(value = "/hahahhaha")\n public ArchCompassResponse hahahhaha(String reportId, String invalidFlag) {\n return ArchCompassServiceTemplate.execute(new ArchCompassServiceCallBack<InvalidResultInfo>() {\n\n @Override\n public void beforeProcess() {\n ParamCheckHelper.notBlank(reportId, "reportId");\n ParamCheckHelper.notBlank(invalidFlag, "invalidFlag");\n }\n\n @Override\n public InvalidResultInfo process() {\n return inValidAssetsAnalysisService.queryInvalidTree(reportId, invalidFlag, "RPC");\n }\n\n @Override\n public void afterProcess() {\n\n }\n }, "hahahhaha");\n }',
22+
'// aaasd@GetMapping(value = "/hahahhaha")\n public ArchCompassResponse hahahhaha(String reportId, String invalidFlag) {\n return ArchCompassServiceTemplate.execute(new ArchCompassServiceCallBack<InvalidResultInfo>() {\n\n @Override\n public void beforeProcess() {\n ParamCheckHelper.notBlank(reportId, "reportId");\n ParamCheckHelper.notBlank(invalidFlag, "invalidFlag");\n }\n\n @Override\n public InvalidResultInfo process() {\n return inValidAssetsAnalysisService.queryInvalidTree(reportId, invalidFlag, "RPC");\n }\n\n @Override\n public void afterProcess() {\n\n }\n }, "hahahhaha");\n }',
2323
newCode:
2424
'@GetMapping(value = "/hahahhaha")\n public ArchCompassResponse hahahhaha(String reportId) {\n return ArchCompassServiceTemplate.execute(new ArchCompassServiceCallBack<InvalidResultInfo>() {\n\n @Override\n public void beforeProcess() {\n ParamCheckHelper.notBlank(reportId, "reportId");\n }\n\n @Override\n public InvalidResultInfo process() {\n return inValidAssetsAnalysisService.queryInvalidTree(reportId, "RPC");\n }\n\n @Override\n public void afterProcess() {\n\n }\n }, "hahahhaha");\n }',
2525
},

packages/sumi-core/package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515
"@codeblitzjs/ide-common": "1.0.4",
1616
"@codeblitzjs/ide-registry": "1.0.4",
1717
"@opensumi/di": "^1.0.0",
18-
"@opensumi/ide-ai-native": "3.1.5-next-1721574303.0",
19-
"@opensumi/ide-core-browser": "3.1.5-next-1721574303.0",
20-
"@opensumi/ide-core-common": "3.1.5-next-1721574303.0",
21-
"@opensumi/ide-debug": "3.1.5-next-1721574303.0",
22-
"@opensumi/ide-extension": "3.1.5-next-1721574303.0",
23-
"@opensumi/ide-file-scheme": "3.1.5-next-1721574303.0",
24-
"@opensumi/ide-file-service": "3.1.5-next-1721574303.0",
25-
"@opensumi/ide-logs": "3.1.5-next-1721574303.0",
18+
"@opensumi/ide-ai-native": "3.1.5-next-1722006339.0",
19+
"@opensumi/ide-core-browser": "3.1.5-next-1722006339.0",
20+
"@opensumi/ide-core-common": "3.1.5-next-1722006339.0",
21+
"@opensumi/ide-debug": "3.1.5-next-1722006339.0",
22+
"@opensumi/ide-extension": "3.1.5-next-1722006339.0",
23+
"@opensumi/ide-file-scheme": "3.1.5-next-1722006339.0",
24+
"@opensumi/ide-file-service": "3.1.5-next-1722006339.0",
25+
"@opensumi/ide-logs": "3.1.5-next-1722006339.0",
2626
"assert": "^2.0.0",
2727
"fs-extra-factory": "^0.2.1",
2828
"iconv-lite-umd": "^0.6.8",

packages/sumi-core/src/client/override/webConnectionHelper.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { IRuntimeSocketConnection, WSChannel } from '@opensumi/ide-connection';
33
import { WSChannelHandler } from '@opensumi/ide-connection/lib/browser/ws-channel-handler';
44
import { RawMessageIO } from '@opensumi/ide-connection/lib/common/rpc/message-io';
55
import { rawSerializer } from '@opensumi/ide-connection/lib/common/serializer/raw';
6-
import { createConnectionService, getDebugLogger, ModuleConstructor } from '@opensumi/ide-core-browser';
6+
import { createConnectionService, getDebugLogger, ModuleConstructor, uuid } from '@opensumi/ide-core-browser';
77
import { BaseConnectionHelper } from '@opensumi/ide-core-browser/lib/application/runtime/base-socket';
88
import { CodeBlitzConnection, InMemoryMessageChannel } from '../../connection';
99

@@ -13,7 +13,7 @@ export class CodeBlitzConnectionHelper extends BaseConnectionHelper {
1313
private channel: InMemoryMessageChannel;
1414

1515
getDefaultClientId() {
16-
return 'codeblitz';
16+
return 'codeblitz-' + uuid(8);
1717
}
1818

1919
createConnection(): IRuntimeSocketConnection {

packages/sumi-core/src/server/core/app.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import { RawMessageIO } from '@opensumi/ide-connection/lib/common/rpc/message-io
55
import { rawSerializer } from '@opensumi/ide-connection/lib/common/serializer/raw';
66
import {
77
BaseCommonChannelHandler,
8-
commonChannelPathHandler,
98
RPCServiceChannelPath,
9+
CommonChannelPathHandler,
1010
} from '@opensumi/ide-connection/lib/common/server-handler';
1111
import { AppConfig, BrowserModule } from '@opensumi/ide-core-browser';
1212
import {
@@ -168,6 +168,10 @@ export class ServerApp implements IServerApp {
168168
token: INodeLogger,
169169
useClass: NodeLogger,
170170
});
171+
injector.addProviders({
172+
token: CommonChannelPathHandler,
173+
useValue: new CommonChannelPathHandler(),
174+
});
171175
}
172176

173177
private async runContributionsPhase(phaseName: keyof ServerAppContribution, ...args: any[]) {
@@ -219,16 +223,25 @@ export class ServerApp implements IServerApp {
219223
async start() {
220224
await this.launch();
221225
await this.initializeContribution();
222-
const handler = new CodeblitzCommonChannelHandler('codeblitz-server');
226+
const commonChannelPathHandler = this.injector.get(CommonChannelPathHandler);
227+
const handler = new CodeblitzCommonChannelHandler('codeblitz-server', commonChannelPathHandler);
223228

224229
const channel = this.injector.get(InMemoryMessageChannel) as InMemoryMessageChannel;
225230
handler.receiveConnection(new CodeBlitzConnection(channel.port2));
226231

227-
commonChannelPathHandler.register(RPCServiceChannelPath, {
232+
const channelHandler = {
228233
handler: (channel: WSChannel, clientId: string) => {
229234
handleClientChannel(this.injector, this.modules, channel, clientId, this.logger);
230235
},
231236
dispose: () => {},
237+
};
238+
239+
commonChannelPathHandler.register(RPCServiceChannelPath, channelHandler);
240+
241+
this.disposeCollection.push({
242+
dispose: () => {
243+
commonChannelPathHandler.removeHandler(RPCServiceChannelPath, channelHandler);
244+
},
232245
});
233246

234247
await this.startContribution();

0 commit comments

Comments
 (0)