Skip to content

Commit ca24ed0

Browse files
fix: ensure Emmet wrap only applies to active editor
1 parent df72776 commit ca24ed0

1 file changed

Lines changed: 63 additions & 0 deletions

File tree

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { createEffect, onCleanup } from "solid-js";
2+
import type { Accessor } from "solid-js";
3+
import type * as Monaco from "monaco-editor";
4+
import {
5+
balanceInward,
6+
balanceOutward,
7+
wrapWithAbbreviation,
8+
getSelectionForWrap,
9+
} from "@/utils/emmet";
10+
11+
interface EditorEmmetProps {
12+
editor: Accessor<Monaco.editor.IStandaloneCodeEditor | null>;
13+
monaco: Accessor<typeof Monaco | null>;
14+
}
15+
16+
export function EditorEmmet(props: EditorEmmetProps) {
17+
createEffect(() => {
18+
const editor = props.editor();
19+
const monaco = props.monaco();
20+
if (!editor || !monaco) return;
21+
22+
const isFocused = () => editor.hasTextFocus() || editor.getDomNode()?.contains(document.activeElement);
23+
24+
const handleEmmetBalanceInward = () => {
25+
if (!isFocused()) return;
26+
balanceInward(editor, monaco);
27+
editor.focus();
28+
};
29+
30+
const handleEmmetBalanceOutward = () => {
31+
if (!isFocused()) return;
32+
balanceOutward(editor, monaco);
33+
editor.focus();
34+
};
35+
36+
const handleEmmetWrap = (e: any) => {
37+
if (!isFocused()) return;
38+
const abbreviation = e.detail;
39+
wrapWithAbbreviation(editor, monaco, abbreviation);
40+
editor.focus();
41+
};
42+
43+
const handleEmmetGetSelection = () => {
44+
if (!isFocused()) return;
45+
const selection = getSelectionForWrap(editor, monaco);
46+
window.dispatchEvent(new CustomEvent("emmet:selection", { detail: selection }));
47+
};
48+
49+
window.addEventListener("emmet:balance-inward", handleEmmetBalanceInward);
50+
window.addEventListener("emmet:balance-outward", handleEmmetBalanceOutward);
51+
window.addEventListener("emmet:wrap", handleEmmetWrap);
52+
window.addEventListener("emmet:get-selection", handleEmmetGetSelection);
53+
54+
onCleanup(() => {
55+
window.removeEventListener("emmet:balance-inward", handleEmmetBalanceInward);
56+
window.removeEventListener("emmet:balance-outward", handleEmmetBalanceOutward);
57+
window.removeEventListener("emmet:wrap", handleEmmetWrap);
58+
window.removeEventListener("emmet:get-selection", handleEmmetGetSelection);
59+
});
60+
});
61+
62+
return null;
63+
}

0 commit comments

Comments
 (0)