Skip to content

Commit 295bf4b

Browse files
committed
refactor(vscode): use more reactive api
1 parent d45228a commit 295bf4b

File tree

4 files changed

+92
-81
lines changed

4 files changed

+92
-81
lines changed

extensions/vscode/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,9 @@ export = defineExtension(() => {
117117
activateAutoInsertion(selectors, client);
118118
activateDocumentDropEdit(selectors, client);
119119

120-
focusMode.activate(context, selectors);
121-
interpolationDecorators.activate(context, selectors);
122-
reactivityVisualization.activate(context, selectors);
120+
focusMode.activate(selectors);
121+
interpolationDecorators.activate(selectors);
122+
reactivityVisualization.activate(selectors);
123123
welcome.activate(context);
124124
}, { immediate: true });
125125

extensions/vscode/lib/focusMode.ts

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
import {
2+
useActiveTextEditor,
3+
useDocumentText,
4+
useTextEditorSelection,
5+
useVisibleTextEditors,
6+
watch,
7+
} from 'reactive-vscode';
18
import * as vscode from 'vscode';
29
import { config } from './config';
310

@@ -8,12 +15,7 @@ const tagUnfocusDecorations = Array.from({ length: 8 }).map((_, i) =>
815
})
916
);
1017

11-
export function activate(
12-
context: vscode.ExtensionContext,
13-
selector: vscode.DocumentSelector,
14-
) {
15-
let timeout: ReturnType<typeof setTimeout> | undefined;
16-
18+
export function activate(selector: vscode.DocumentSelector) {
1719
const editor2Decorations = new Map<vscode.TextEditor, {
1820
currentTagDecIndex: number;
1921
targetTagDecIndex: number;
@@ -48,32 +50,40 @@ export function activate(
4850
}
4951
}, 24);
5052

51-
context.subscriptions.push(
52-
vscode.window.onDidChangeVisibleTextEditors(editors => {
53-
for (const [editor, info] of editor2Decorations) {
54-
if (!editors.includes(editor)) {
55-
info.targetTagDecIndex = 0;
56-
}
57-
}
58-
}),
59-
vscode.window.onDidChangeTextEditorSelection(editor => {
60-
updateDecorations(editor.textEditor);
61-
}),
62-
vscode.workspace.onDidChangeTextDocument(() => {
63-
const editor = vscode.window.activeTextEditor;
64-
if (editor) {
65-
clearTimeout(timeout);
66-
timeout = setTimeout(() => updateDecorations(editor), 100);
53+
const visibleTextEditors = useVisibleTextEditors();
54+
const activeTextEditor = useActiveTextEditor();
55+
const activeSelection = useTextEditorSelection(activeTextEditor);
56+
const activeText = useDocumentText(() => activeTextEditor.value?.document);
57+
58+
watch(visibleTextEditors, editors => {
59+
for (const [editor, info] of editor2Decorations) {
60+
if (!editors.includes(editor)) {
61+
info.targetTagDecIndex = 0;
6762
}
68-
}),
69-
vscode.workspace.onDidChangeConfiguration(e => {
70-
if (e.affectsConfiguration('vue.editor.focusMode')) {
71-
for (const editor of vscode.window.visibleTextEditors) {
72-
updateDecorations(editor);
73-
}
63+
}
64+
});
65+
66+
watch(activeSelection, () => {
67+
if (activeTextEditor.value) {
68+
updateDecorations(activeTextEditor.value);
69+
}
70+
});
71+
72+
let timeout: NodeJS.Timeout | undefined;
73+
watch(activeText, () => {
74+
clearTimeout(timeout);
75+
timeout = setTimeout(() => {
76+
if (activeTextEditor.value) {
77+
updateDecorations(activeTextEditor.value);
7478
}
75-
}),
76-
);
79+
}, 100);
80+
});
81+
82+
watch(() => config.editor.focusMode, () => {
83+
for (const editor of visibleTextEditors.value) {
84+
updateDecorations(editor);
85+
}
86+
});
7787

7888
async function updateDecorations(editor: vscode.TextEditor) {
7989
if (!vscode.languages.match(selector, editor.document)) {

extensions/vscode/lib/interpolationDecorators.ts

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useActiveTextEditor, useDocumentText, useVisibleTextEditors, watch } from 'reactive-vscode';
12
import * as vscode from 'vscode';
23
import { config } from './config';
34

@@ -9,37 +10,36 @@ const decorationType = vscode.window.createTextEditorDecorationType({
910
borderRadius: '4px',
1011
});
1112

12-
export function activate(
13-
context: vscode.ExtensionContext,
14-
selector: vscode.DocumentSelector,
15-
) {
13+
export function activate(selector: vscode.DocumentSelector) {
1614
let timeout: ReturnType<typeof setTimeout> | undefined;
1715

18-
for (const editor of vscode.window.visibleTextEditors) {
16+
const visibleTextEditors = useVisibleTextEditors();
17+
const activeTextEditor = useActiveTextEditor();
18+
const activeText = useDocumentText(() => activeTextEditor.value?.document);
19+
20+
for (const editor of visibleTextEditors.value) {
1921
updateDecorations(editor);
2022
}
2123

22-
context.subscriptions.push(
23-
vscode.window.onDidChangeActiveTextEditor(editor => {
24-
if (editor) {
25-
updateDecorations(editor);
26-
}
27-
}),
28-
vscode.workspace.onDidChangeTextDocument(() => {
29-
const editor = vscode.window.activeTextEditor;
30-
if (editor) {
31-
clearTimeout(timeout);
32-
timeout = setTimeout(() => updateDecorations(editor), 100);
33-
}
34-
}),
35-
vscode.workspace.onDidChangeConfiguration(e => {
36-
if (e.affectsConfiguration('vue.editor.templateInterpolationDecorators')) {
37-
for (const editor of vscode.window.visibleTextEditors) {
38-
updateDecorations(editor);
39-
}
40-
}
41-
}),
42-
);
24+
watch(activeTextEditor, editor => {
25+
if (editor) {
26+
updateDecorations(editor);
27+
}
28+
});
29+
30+
watch(activeText, () => {
31+
const editor = activeTextEditor.value;
32+
if (editor) {
33+
clearTimeout(timeout);
34+
timeout = setTimeout(() => updateDecorations(editor), 100);
35+
}
36+
});
37+
38+
watch(() => config.editor.templateInterpolationDecorators, () => {
39+
for (const editor of visibleTextEditors.value) {
40+
updateDecorations(editor);
41+
}
42+
});
4343

4444
function updateDecorations(editor: vscode.TextEditor) {
4545
if (!vscode.languages.match(selector, editor.document)) {

extensions/vscode/lib/reactivityVisualization.ts

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { Analyzer } from 'laplacenoma';
2+
import { useActiveTextEditor, useTextEditorSelection, useVisibleTextEditors, watch } from 'reactive-vscode';
23
import type * as ts from 'typescript';
34
import * as vscode from 'vscode';
45
import { config } from './config';
@@ -23,35 +24,35 @@ const dependentDecorations = vscode.window.createTextEditorDecorationType({
2324
borderWidth: '0 0 0 3px',
2425
});
2526

26-
export function activate(
27-
context: vscode.ExtensionContext,
28-
selector: vscode.DocumentSelector,
29-
) {
27+
export function activate(selector: vscode.DocumentSelector) {
3028
const documentUpdateVersions = new WeakMap<vscode.TextDocument, number>();
3129

3230
let timeout: ReturnType<typeof setTimeout> | undefined;
3331

34-
for (const editor of vscode.window.visibleTextEditors) {
32+
const visibleTextEditors = useVisibleTextEditors();
33+
const activeTextEditor = useActiveTextEditor();
34+
const activeSelection = useTextEditorSelection(activeTextEditor);
35+
36+
for (const editor of visibleTextEditors.value) {
3537
updateDecorations(editor);
3638
}
3739

38-
context.subscriptions.push(
39-
vscode.window.onDidChangeActiveTextEditor(editor => {
40-
if (editor) {
41-
updateDecorations(editor);
42-
}
43-
}),
44-
vscode.window.onDidChangeTextEditorSelection(() => {
45-
const editor = vscode.window.activeTextEditor;
46-
if (editor) {
47-
clearTimeout(timeout);
48-
timeout = setTimeout(
49-
() => updateDecorations(editor),
50-
getUpdateInterval(editor.document),
51-
);
52-
}
53-
}),
54-
);
40+
watch(activeTextEditor, editor => {
41+
if (editor) {
42+
updateDecorations(editor);
43+
}
44+
});
45+
46+
watch(activeSelection, () => {
47+
const editor = activeTextEditor.value;
48+
if (editor) {
49+
clearTimeout(timeout);
50+
timeout = setTimeout(
51+
() => updateDecorations(editor),
52+
getUpdateInterval(editor.document),
53+
);
54+
}
55+
});
5556

5657
function getUpdateInterval(document: vscode.TextDocument) {
5758
const prevVersion = documentUpdateVersions.get(document);

0 commit comments

Comments
 (0)