@opensumi/ide-ai-native 3.2.5 → 3.2.6-next-1724809247.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/lib/browser/ai-core.contribution.d.ts +1 -0
  2. package/lib/browser/ai-core.contribution.d.ts.map +1 -1
  3. package/lib/browser/ai-core.contribution.js +12 -23
  4. package/lib/browser/ai-core.contribution.js.map +1 -1
  5. package/lib/browser/ai-editor.contribution.d.ts +1 -0
  6. package/lib/browser/ai-editor.contribution.d.ts.map +1 -1
  7. package/lib/browser/ai-editor.contribution.js +8 -0
  8. package/lib/browser/ai-editor.contribution.js.map +1 -1
  9. package/lib/browser/chat/chat-agent.service.d.ts +1 -0
  10. package/lib/browser/chat/chat-agent.service.d.ts.map +1 -1
  11. package/lib/browser/chat/chat-agent.service.js +1 -3
  12. package/lib/browser/chat/chat-agent.service.js.map +1 -1
  13. package/lib/browser/chat/chat.module.less +1 -0
  14. package/lib/browser/chat/chat.view.d.ts.map +1 -1
  15. package/lib/browser/chat/chat.view.js +21 -3
  16. package/lib/browser/chat/chat.view.js.map +1 -1
  17. package/lib/browser/components/ChatEditor.d.ts.map +1 -1
  18. package/lib/browser/components/ChatEditor.js +2 -2
  19. package/lib/browser/components/ChatEditor.js.map +1 -1
  20. package/lib/browser/components/ChatMarkdown.js +1 -1
  21. package/lib/browser/components/ChatMarkdown.js.map +1 -1
  22. package/lib/browser/components/ChatThinking.d.ts.map +1 -1
  23. package/lib/browser/components/ChatThinking.js +2 -2
  24. package/lib/browser/components/ChatThinking.js.map +1 -1
  25. package/lib/browser/contextkey/ai-native.contextkey.service.d.ts +1 -0
  26. package/lib/browser/contextkey/ai-native.contextkey.service.d.ts.map +1 -1
  27. package/lib/browser/contextkey/ai-native.contextkey.service.js +1 -0
  28. package/lib/browser/contextkey/ai-native.contextkey.service.js.map +1 -1
  29. package/lib/browser/contrib/inline-completions/completeProvider.d.ts +4 -31
  30. package/lib/browser/contrib/inline-completions/completeProvider.d.ts.map +1 -1
  31. package/lib/browser/contrib/inline-completions/completeProvider.js +3 -224
  32. package/lib/browser/contrib/inline-completions/completeProvider.js.map +1 -1
  33. package/lib/browser/contrib/inline-completions/inline-completions.handler.d.ts +1 -3
  34. package/lib/browser/contrib/inline-completions/inline-completions.handler.d.ts.map +1 -1
  35. package/lib/browser/contrib/inline-completions/inline-completions.handler.js +8 -20
  36. package/lib/browser/contrib/inline-completions/inline-completions.handler.js.map +1 -1
  37. package/lib/browser/contrib/inline-completions/model/competionModel.d.ts +2 -2
  38. package/lib/browser/contrib/inline-completions/model/competionModel.d.ts.map +1 -1
  39. package/lib/browser/contrib/inline-completions/model/inlineCompletionRequestTask.d.ts +28 -0
  40. package/lib/browser/contrib/inline-completions/model/inlineCompletionRequestTask.d.ts.map +1 -0
  41. package/lib/browser/contrib/inline-completions/model/inlineCompletionRequestTask.js +209 -0
  42. package/lib/browser/contrib/inline-completions/model/inlineCompletionRequestTask.js.map +1 -0
  43. package/lib/browser/contrib/inline-completions/promptCache.d.ts +3 -2
  44. package/lib/browser/contrib/inline-completions/promptCache.d.ts.map +1 -1
  45. package/lib/browser/contrib/inline-completions/promptCache.js.map +1 -1
  46. package/lib/browser/contrib/inline-completions/service/ai-completions.service.d.ts +5 -6
  47. package/lib/browser/contrib/inline-completions/service/ai-completions.service.d.ts.map +1 -1
  48. package/lib/browser/contrib/inline-completions/service/ai-completions.service.js +33 -23
  49. package/lib/browser/contrib/inline-completions/service/ai-completions.service.js.map +1 -1
  50. package/lib/browser/contrib/intelligent-completions/diff-computer.d.ts +18 -0
  51. package/lib/browser/contrib/intelligent-completions/diff-computer.d.ts.map +1 -0
  52. package/lib/browser/contrib/intelligent-completions/diff-computer.js +144 -0
  53. package/lib/browser/contrib/intelligent-completions/diff-computer.js.map +1 -0
  54. package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.d.ts +8 -0
  55. package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.d.ts.map +1 -0
  56. package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.js +47 -0
  57. package/lib/browser/contrib/intelligent-completions/intelligent-completions.contribution.js.map +1 -0
  58. package/lib/browser/contrib/intelligent-completions/intelligent-completions.d.ts +15 -0
  59. package/lib/browser/contrib/intelligent-completions/intelligent-completions.d.ts.map +1 -0
  60. package/lib/browser/contrib/intelligent-completions/intelligent-completions.feature.registry.d.ts +8 -0
  61. package/lib/browser/contrib/intelligent-completions/intelligent-completions.feature.registry.d.ts.map +1 -0
  62. package/lib/browser/contrib/intelligent-completions/intelligent-completions.feature.registry.js +19 -0
  63. package/lib/browser/contrib/intelligent-completions/intelligent-completions.feature.registry.js.map +1 -0
  64. package/lib/browser/contrib/intelligent-completions/intelligent-completions.handler.d.ts +20 -0
  65. package/lib/browser/contrib/intelligent-completions/intelligent-completions.handler.d.ts.map +1 -0
  66. package/lib/browser/contrib/intelligent-completions/intelligent-completions.handler.js +94 -0
  67. package/lib/browser/contrib/intelligent-completions/intelligent-completions.handler.js.map +1 -0
  68. package/lib/browser/contrib/intelligent-completions/intelligent-completions.js +3 -0
  69. package/lib/browser/contrib/intelligent-completions/intelligent-completions.js.map +1 -0
  70. package/lib/browser/contrib/intelligent-completions/multi-line.decoration.d.ts +33 -0
  71. package/lib/browser/contrib/intelligent-completions/multi-line.decoration.d.ts.map +1 -0
  72. package/lib/browser/contrib/intelligent-completions/multi-line.decoration.js +258 -0
  73. package/lib/browser/contrib/intelligent-completions/multi-line.decoration.js.map +1 -0
  74. package/lib/browser/contrib/merge-conflict/merge-conflict.feature.registry.d.ts +0 -1
  75. package/lib/browser/contrib/merge-conflict/merge-conflict.feature.registry.d.ts.map +1 -1
  76. package/lib/browser/contrib/merge-conflict/merge-conflict.feature.registry.js +0 -3
  77. package/lib/browser/contrib/merge-conflict/merge-conflict.feature.registry.js.map +1 -1
  78. package/lib/browser/index.d.ts.map +1 -1
  79. package/lib/browser/index.js +7 -0
  80. package/lib/browser/index.js.map +1 -1
  81. package/lib/browser/layout/ai-layout.d.ts.map +1 -1
  82. package/lib/browser/layout/ai-layout.js +4 -4
  83. package/lib/browser/layout/ai-layout.js.map +1 -1
  84. package/lib/browser/layout/layout.module.less +0 -9
  85. package/lib/browser/model/enhanceDecorationsCollection.d.ts +38 -4
  86. package/lib/browser/model/enhanceDecorationsCollection.d.ts.map +1 -1
  87. package/lib/browser/model/enhanceDecorationsCollection.js +44 -23
  88. package/lib/browser/model/enhanceDecorationsCollection.js.map +1 -1
  89. package/lib/browser/types.d.ts +20 -13
  90. package/lib/browser/types.d.ts.map +1 -1
  91. package/lib/browser/types.js +0 -4
  92. package/lib/browser/types.js.map +1 -1
  93. package/lib/browser/widget/inline-chat/inline-chat.handler.d.ts.map +1 -1
  94. package/lib/browser/widget/inline-chat/inline-chat.handler.js +18 -10
  95. package/lib/browser/widget/inline-chat/inline-chat.handler.js.map +1 -1
  96. package/lib/browser/widget/inline-chat/inline-content-widget.d.ts +5 -2
  97. package/lib/browser/widget/inline-chat/inline-content-widget.d.ts.map +1 -1
  98. package/lib/browser/widget/inline-chat/inline-content-widget.js +45 -53
  99. package/lib/browser/widget/inline-chat/inline-content-widget.js.map +1 -1
  100. package/lib/browser/widget/inline-diff/inline-diff-previewer.d.ts +16 -14
  101. package/lib/browser/widget/inline-diff/inline-diff-previewer.d.ts.map +1 -1
  102. package/lib/browser/widget/inline-diff/inline-diff-previewer.js +98 -46
  103. package/lib/browser/widget/inline-diff/inline-diff-previewer.js.map +1 -1
  104. package/lib/browser/widget/inline-diff/inline-diff-widget.d.ts +5 -2
  105. package/lib/browser/widget/inline-diff/inline-diff-widget.d.ts.map +1 -1
  106. package/lib/browser/widget/inline-diff/inline-diff-widget.js +11 -2
  107. package/lib/browser/widget/inline-diff/inline-diff-widget.js.map +1 -1
  108. package/lib/browser/widget/inline-diff/inline-diff.handler.d.ts +12 -13
  109. package/lib/browser/widget/inline-diff/inline-diff.handler.d.ts.map +1 -1
  110. package/lib/browser/widget/inline-diff/inline-diff.handler.js +69 -77
  111. package/lib/browser/widget/inline-diff/inline-diff.handler.js.map +1 -1
  112. package/lib/browser/widget/inline-input/inline-input-widget.d.ts +1 -0
  113. package/lib/browser/widget/inline-input/inline-input-widget.d.ts.map +1 -1
  114. package/lib/browser/widget/inline-input/inline-input-widget.js +1 -0
  115. package/lib/browser/widget/inline-input/inline-input-widget.js.map +1 -1
  116. package/lib/browser/widget/inline-input/inline-input.handler.js +2 -2
  117. package/lib/browser/widget/inline-input/inline-input.handler.js.map +1 -1
  118. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts +28 -15
  119. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.d.ts.map +1 -1
  120. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js +56 -31
  121. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.handler.js.map +1 -1
  122. package/lib/browser/widget/inline-stream-diff/inline-stream-diff.module.less +9 -6
  123. package/lib/browser/widget/inline-stream-diff/live-preview-stack.d.ts +21 -0
  124. package/lib/browser/widget/inline-stream-diff/live-preview-stack.d.ts.map +1 -0
  125. package/lib/browser/widget/inline-stream-diff/live-preview-stack.js +41 -0
  126. package/lib/browser/widget/inline-stream-diff/live-preview-stack.js.map +1 -0
  127. package/lib/browser/widget/inline-stream-diff/live-preview.component.d.ts +105 -0
  128. package/lib/browser/widget/inline-stream-diff/live-preview.component.d.ts.map +1 -0
  129. package/lib/browser/widget/inline-stream-diff/live-preview.component.js +237 -0
  130. package/lib/browser/widget/inline-stream-diff/live-preview.component.js.map +1 -0
  131. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts +27 -103
  132. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.d.ts.map +1 -1
  133. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js +186 -370
  134. package/lib/browser/widget/inline-stream-diff/live-preview.decoration.js.map +1 -1
  135. package/lib/common/index.d.ts +1 -0
  136. package/lib/common/index.d.ts.map +1 -1
  137. package/lib/common/index.js.map +1 -1
  138. package/package.json +19 -19
  139. package/src/browser/ai-core.contribution.ts +12 -26
  140. package/src/browser/ai-editor.contribution.ts +9 -0
  141. package/src/browser/chat/chat-agent.service.ts +1 -3
  142. package/src/browser/chat/chat.module.less +1 -0
  143. package/src/browser/chat/chat.view.tsx +48 -3
  144. package/src/browser/components/ChatEditor.tsx +14 -2
  145. package/src/browser/components/ChatMarkdown.tsx +1 -1
  146. package/src/browser/components/ChatThinking.tsx +3 -1
  147. package/src/browser/contextkey/ai-native.contextkey.service.ts +3 -0
  148. package/src/browser/contrib/inline-completions/completeProvider.ts +7 -289
  149. package/src/browser/contrib/inline-completions/inline-completions.handler.ts +15 -22
  150. package/src/browser/contrib/inline-completions/model/competionModel.ts +3 -2
  151. package/src/browser/contrib/inline-completions/model/inlineCompletionRequestTask.ts +270 -0
  152. package/src/browser/contrib/inline-completions/promptCache.ts +3 -2
  153. package/src/browser/contrib/inline-completions/service/ai-completions.service.ts +37 -36
  154. package/src/browser/contrib/intelligent-completions/diff-computer.ts +185 -0
  155. package/src/browser/contrib/intelligent-completions/intelligent-completions.contribution.ts +54 -0
  156. package/src/browser/contrib/intelligent-completions/intelligent-completions.feature.registry.ts +17 -0
  157. package/src/browser/contrib/intelligent-completions/intelligent-completions.handler.ts +130 -0
  158. package/src/browser/contrib/intelligent-completions/intelligent-completions.ts +15 -0
  159. package/src/browser/contrib/intelligent-completions/multi-line.decoration.ts +325 -0
  160. package/src/browser/contrib/merge-conflict/merge-conflict.feature.registry.ts +0 -4
  161. package/src/browser/index.ts +8 -1
  162. package/src/browser/layout/ai-layout.tsx +7 -1
  163. package/src/browser/layout/layout.module.less +0 -9
  164. package/src/browser/model/enhanceDecorationsCollection.ts +71 -34
  165. package/src/browser/types.ts +27 -14
  166. package/src/browser/widget/inline-chat/inline-chat.handler.ts +20 -16
  167. package/src/browser/widget/inline-chat/inline-content-widget.tsx +58 -61
  168. package/src/browser/widget/inline-diff/inline-diff-previewer.ts +102 -62
  169. package/src/browser/widget/inline-diff/inline-diff-widget.tsx +36 -5
  170. package/src/browser/widget/inline-diff/inline-diff.handler.ts +82 -94
  171. package/src/browser/widget/inline-input/inline-input-widget.tsx +1 -0
  172. package/src/browser/widget/inline-input/inline-input.handler.ts +2 -2
  173. package/src/browser/widget/inline-stream-diff/inline-stream-diff.handler.tsx +108 -45
  174. package/src/browser/widget/inline-stream-diff/inline-stream-diff.module.less +9 -6
  175. package/src/browser/widget/inline-stream-diff/live-preview-stack.ts +52 -0
  176. package/src/browser/widget/inline-stream-diff/live-preview.component.tsx +388 -0
  177. package/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx +244 -544
  178. package/src/common/index.ts +2 -0
@@ -0,0 +1,388 @@
1
+ import cls from 'classnames';
2
+ import React, { useCallback, useEffect } from 'react';
3
+ import ReactDOMClient from 'react-dom/client';
4
+
5
+ import { Autowired, Injectable } from '@opensumi/di';
6
+ import { KeybindingRegistry, useDisposable } from '@opensumi/ide-core-browser';
7
+ import { AI_INLINE_DIFF_PARTIAL_EDIT } from '@opensumi/ide-core-browser/lib/ai-native/command';
8
+ import { Emitter, Event, IPosition, isDefined, isUndefined, uuid } from '@opensumi/ide-core-common';
9
+ import {
10
+ ICodeEditor,
11
+ IEditorDecorationsCollection,
12
+ IModelDecorationsChangedEvent,
13
+ Position,
14
+ } from '@opensumi/ide-monaco';
15
+ import { ReactInlineContentWidget } from '@opensumi/ide-monaco/lib/browser/ai-native/BaseInlineContentWidget';
16
+ import { URI } from '@opensumi/ide-monaco/lib/browser/monaco-api';
17
+ import { ContentWidgetPositionPreference } from '@opensumi/ide-monaco/lib/browser/monaco-exports/editor';
18
+ import { EditorOption } from '@opensumi/monaco-editor-core/esm/vs/editor/common/config/editorOptions';
19
+ import { IScrollEvent } from '@opensumi/monaco-editor-core/esm/vs/editor/common/editorCommon';
20
+ import { LineTokens } from '@opensumi/monaco-editor-core/esm/vs/editor/common/tokens/lineTokens';
21
+ import { IOptions, ZoneWidget } from '@opensumi/monaco-editor-core/esm/vs/editor/contrib/zoneWidget/browser/zoneWidget';
22
+ import { UndoRedoGroup } from '@opensumi/monaco-editor-core/esm/vs/platform/undoRedo/common/undoRedo';
23
+
24
+ import { renderLines } from '../ghost-text-widget/index';
25
+
26
+ import styles from './inline-stream-diff.module.less';
27
+
28
+ export const ActiveLineDecoration = 'activeLine-decoration';
29
+ export const AddedRangeDecoration = 'added-range-decoration';
30
+ export const PendingRangeDecoration = 'pending-range-decoration';
31
+
32
+ interface IPartialEditWidgetComponent {
33
+ acceptSequence: string;
34
+ discardSequence: string;
35
+ }
36
+
37
+ export type IWidgetStatus = 'accept' | 'discard' | 'pending';
38
+
39
+ export interface IRemovedWidgetState {
40
+ textLines: ITextLinesTokens[];
41
+ position: IPosition;
42
+ }
43
+
44
+ export enum EPartialEdit {
45
+ accept = 'accept',
46
+ discard = 'discard',
47
+ }
48
+
49
+ export interface IPartialEditEvent {
50
+ uri: URI;
51
+ /**
52
+ * 总 diff 数
53
+ */
54
+ totalPartialEditCount: number;
55
+ /**
56
+ * 已处理的个数
57
+ */
58
+ resolvedPartialEditCount: number;
59
+ /**
60
+ * 已添加行数
61
+ */
62
+ totalAddedLinesCount: number;
63
+ /**
64
+ * 已删除行数
65
+ */
66
+ totalDeletedLinesCount: number;
67
+ currentPartialEdit: {
68
+ type: EPartialEdit;
69
+ addedLinesCount: number;
70
+ deletedLinesCount: number;
71
+ };
72
+ }
73
+
74
+ export interface ITextLinesTokens {
75
+ text: string;
76
+ lineTokens: LineTokens;
77
+ }
78
+
79
+ const PartialEditComponent = (props: {
80
+ keyStrings: IPartialEditWidgetComponent;
81
+ onAccept: () => void;
82
+ onDiscard: () => void;
83
+ editor: ICodeEditor;
84
+ }) => {
85
+ const { keyStrings, onAccept, onDiscard, editor } = props;
86
+ const [scrollLeft, setScrollLeft] = React.useState(0);
87
+
88
+ const handleAccept = useCallback(() => {
89
+ onAccept?.();
90
+ }, [onAccept]);
91
+
92
+ const handleDiscard = useCallback(() => {
93
+ onDiscard?.();
94
+ }, [onDiscard]);
95
+
96
+ useDisposable(
97
+ () =>
98
+ editor.onDidScrollChange((event: IScrollEvent) => {
99
+ const { scrollLeftChanged, scrollLeft } = event;
100
+ if (scrollLeftChanged) {
101
+ setScrollLeft(scrollLeft);
102
+ }
103
+ }),
104
+ [editor],
105
+ );
106
+
107
+ return (
108
+ <div
109
+ className={cls(
110
+ 'kt-inline-diff-accept-partial-widget-container',
111
+ styles.inline_diff_accept_partial_widget_container,
112
+ )}
113
+ style={{ marginLeft: scrollLeft }}
114
+ >
115
+ <div className={styles.content}>
116
+ <span className={cls(styles.accept_btn, styles.btn)} onClick={handleAccept}>
117
+ {keyStrings.acceptSequence}
118
+ </span>
119
+ <span className={cls(styles.discard_btn, styles.btn)} onClick={handleDiscard}>
120
+ {keyStrings.discardSequence}
121
+ </span>
122
+ </div>
123
+ </div>
124
+ );
125
+ };
126
+
127
+ @Injectable({ multiple: true })
128
+ export class AcceptPartialEditWidget extends ReactInlineContentWidget {
129
+ static ID = 'AcceptPartialEditWidgetID';
130
+
131
+ @Autowired(KeybindingRegistry)
132
+ private readonly keybindingRegistry: KeybindingRegistry;
133
+
134
+ private _id: string;
135
+ private _decorationId: string;
136
+
137
+ private readonly _onAccept = this.registerDispose(new Emitter<void>());
138
+ public readonly onAccept: Event<void> = this._onAccept.event;
139
+
140
+ private readonly _onDiscard = this.registerDispose(new Emitter<void>());
141
+ public readonly onDiscard: Event<void> = this._onDiscard.event;
142
+
143
+ positionPreference = [ContentWidgetPositionPreference.EXACT];
144
+
145
+ public addedLinesCount: number = 0;
146
+ public deletedLinesCount: number = 0;
147
+ public status: IWidgetStatus = 'pending';
148
+
149
+ private _group: UndoRedoGroup;
150
+ public get group(): UndoRedoGroup {
151
+ return this._group;
152
+ }
153
+
154
+ private getSequenceKeyStrings(): IPartialEditWidgetComponent | undefined {
155
+ let keybindings = this.keybindingRegistry.getKeybindingsForCommand(AI_INLINE_DIFF_PARTIAL_EDIT.id);
156
+ keybindings = keybindings.sort((a, b) => b.args - a.args);
157
+
158
+ if (!keybindings || (keybindings.length !== 2 && keybindings.some((k) => isUndefined(k.resolved)))) {
159
+ return;
160
+ }
161
+
162
+ return {
163
+ acceptSequence: this.keybindingRegistry.acceleratorForSequence(keybindings[0].resolved!, '')[0],
164
+ discardSequence: this.keybindingRegistry.acceleratorForSequence(keybindings[1].resolved!, '')[0],
165
+ };
166
+ }
167
+
168
+ public renderView(): React.ReactNode {
169
+ const keyStrings = this.getSequenceKeyStrings();
170
+ if (!keyStrings) {
171
+ return;
172
+ }
173
+
174
+ return (
175
+ <PartialEditComponent
176
+ keyStrings={keyStrings}
177
+ onAccept={() => this._onAccept.fire()}
178
+ onDiscard={() => this._onDiscard.fire()}
179
+ editor={this.editor}
180
+ />
181
+ );
182
+ }
183
+
184
+ public id(): string {
185
+ if (!this._id) {
186
+ this._id = `${AcceptPartialEditWidget.ID}_${uuid(4)}`;
187
+ }
188
+ return this._id;
189
+ }
190
+
191
+ public getClassName(): string {
192
+ return styles.accept_partial_edit_widget_id;
193
+ }
194
+
195
+ public recordDecorationId(id: string): void {
196
+ this._decorationId = id;
197
+ }
198
+
199
+ public getDecorationId(): string {
200
+ return this._decorationId;
201
+ }
202
+
203
+ public resume(): void {
204
+ this.status = 'pending';
205
+ this.addedLinesCount = 0;
206
+ this.deletedLinesCount = 0;
207
+
208
+ super.resume();
209
+ }
210
+
211
+ public setGroup(group): void {
212
+ this._group = group;
213
+ }
214
+
215
+ public accept(addedLinesCount: number, deletedLinesCount: number): void {
216
+ this.status = 'accept';
217
+ this.addedLinesCount = addedLinesCount;
218
+ this.deletedLinesCount = deletedLinesCount;
219
+ super.hide();
220
+ }
221
+
222
+ get isAccepted(): boolean {
223
+ return this.status === 'accept';
224
+ }
225
+
226
+ public discard(addedLinesCount: number, deletedLinesCount: number): void {
227
+ this.status = 'discard';
228
+ this.addedLinesCount = addedLinesCount;
229
+ this.deletedLinesCount = deletedLinesCount;
230
+ super.hide();
231
+ }
232
+
233
+ get isRejected(): boolean {
234
+ return this.status === 'discard';
235
+ }
236
+ }
237
+
238
+ const RemovedWidgetComponent = ({ dom, editor }) => {
239
+ const ref = React.useRef<HTMLDivElement>(null);
240
+ const [scrollLeft, setScrollLeft] = React.useState(0);
241
+ const [marginWidth, setMarginWidth] = React.useState(0);
242
+
243
+ useEffect(() => {
244
+ if (dom && ref && ref.current) {
245
+ ref.current.appendChild(dom);
246
+ }
247
+ }, [dom, ref]);
248
+
249
+ useDisposable(
250
+ () =>
251
+ editor.onDidScrollChange((event: IScrollEvent) => {
252
+ const { scrollLeftChanged, scrollLeft } = event;
253
+ if (scrollLeftChanged) {
254
+ setScrollLeft(scrollLeft);
255
+ }
256
+ }),
257
+ [editor],
258
+ );
259
+
260
+ useDisposable(() => {
261
+ setMarginWidth(editor.getOption(EditorOption.layoutInfo).contentLeft);
262
+ return editor.onDidChangeConfiguration((event) => {
263
+ if (event.hasChanged(EditorOption.layoutInfo)) {
264
+ setMarginWidth(editor.getOption(EditorOption.layoutInfo).contentLeft);
265
+ }
266
+ });
267
+ }, [editor]);
268
+
269
+ return (
270
+ <div className={styles.inline_diff_remove_zone_fixed_box} style={{ marginLeft: marginWidth + 'px' }}>
271
+ <div className={styles.inline_diff_remove_zone} ref={ref} style={{ marginLeft: -scrollLeft + 'px' }}></div>
272
+ </div>
273
+ );
274
+ };
275
+
276
+ export interface IRemovedZoneWidgetOptions extends IOptions {
277
+ isHidden?: boolean;
278
+ recordPosition?: Position;
279
+ undoRedoGroup?: UndoRedoGroup;
280
+ }
281
+
282
+ export class RemovedZoneWidget extends ZoneWidget {
283
+ private root: ReactDOMClient.Root;
284
+ private _recordPosition: Position;
285
+
286
+ private _hidden: boolean = false;
287
+ get isHidden(): boolean {
288
+ return this._hidden;
289
+ }
290
+
291
+ private _group: UndoRedoGroup;
292
+ public get group(): UndoRedoGroup {
293
+ return this._group;
294
+ }
295
+
296
+ constructor(editor: ICodeEditor, public readonly textLines: ITextLinesTokens[], options: IRemovedZoneWidgetOptions) {
297
+ super(editor, options);
298
+
299
+ if (isDefined(options.isHidden)) {
300
+ this._hidden = options.isHidden;
301
+ }
302
+
303
+ if (isDefined(options.recordPosition)) {
304
+ this._recordPosition = options.recordPosition;
305
+ }
306
+
307
+ if (isDefined(options.undoRedoGroup)) {
308
+ this._group = options.undoRedoGroup;
309
+ }
310
+
311
+ // 监听 position 的位置变化
312
+ const positionMarkerId = this['_positionMarkerId'] as IEditorDecorationsCollection;
313
+ this._disposables.add(
314
+ positionMarkerId.onDidChange((event: IModelDecorationsChangedEvent) => {
315
+ const range = positionMarkerId.getRange(0);
316
+ if (range) {
317
+ this._recordPosition = range.getStartPosition();
318
+ }
319
+ }),
320
+ );
321
+ }
322
+
323
+ setGroup(group): void {
324
+ this._group = group;
325
+ }
326
+
327
+ _fillContainer(container: HTMLElement): void {
328
+ container.classList.add(styles.inline_diff_remove_zone_widget_container);
329
+ this.root = ReactDOMClient.createRoot(container);
330
+ }
331
+
332
+ getRemovedTextLines(): string[] {
333
+ return this.textLines.map((v) => v.text);
334
+ }
335
+
336
+ get height() {
337
+ return this.textLines.length;
338
+ }
339
+
340
+ getLastPosition(): Position {
341
+ return this.position || this._recordPosition;
342
+ }
343
+
344
+ hide(): void {
345
+ this._hidden = true;
346
+ super.hide();
347
+ }
348
+
349
+ resume(): void {
350
+ const position = this.getLastPosition();
351
+ if (position) {
352
+ this.show(position, this.height);
353
+ }
354
+ }
355
+
356
+ override show(pos: IPosition, heightInLines: number): void {
357
+ this._hidden = false;
358
+ super.show(pos, heightInLines);
359
+ }
360
+
361
+ override revealRange(): void {}
362
+
363
+ override create(): void {
364
+ super.create();
365
+ this.mountRender();
366
+ }
367
+
368
+ mountRender(): void {
369
+ const dom = document.createElement('div');
370
+ renderLines(
371
+ dom,
372
+ this.editor.getOption(EditorOption.tabIndex),
373
+ this.textLines.map(({ text: content, lineTokens }) => ({
374
+ content,
375
+ decorations: [],
376
+ lineTokens,
377
+ })),
378
+ this.editor.getOptions(),
379
+ );
380
+
381
+ this.root.render(<RemovedWidgetComponent dom={dom} editor={this.editor} />);
382
+ }
383
+
384
+ dispose(): void {
385
+ this.root.unmount();
386
+ super.dispose();
387
+ }
388
+ }