@@ -7,11 +7,34 @@ declare const scrapbox: Scrapbox;
7
7
* - second key: listener
8
8
* - value: encoded options
9
9
*/
10
- const listenerMap = new Map <
10
+ const listenerMap = /* @__PURE__ */ new Map <
11
11
keyof HTMLElementEventMap ,
12
12
Map < EventListener , Set < number > >
13
13
> ( ) ;
14
- const onceListenerMap = new Map < EventListener , Map < number , EventListener > > ( ) ;
14
+ const onceListenerMap = /* @__PURE__ */ new Map <
15
+ EventListener ,
16
+ Map < number , EventListener >
17
+ > ( ) ;
18
+
19
+ /** re-register event listeners when the layout changes */
20
+ let reRegister : ( ( ) => void ) | undefined = ( ) => {
21
+ scrapbox . on ( "layout:changed" , ( ) => {
22
+ const textinput = textInput ( ) ;
23
+ if ( ! textinput ) return ;
24
+ for ( const [ name , argMap ] of listenerMap ) {
25
+ for ( const [ listener , encodedOptions ] of argMap ) {
26
+ for ( const encoded of encodedOptions ) {
27
+ textinput . addEventListener (
28
+ name ,
29
+ listener as EventListener ,
30
+ decode ( encoded ) ,
31
+ ) ;
32
+ }
33
+ }
34
+ }
35
+ } ) ;
36
+ reRegister = undefined ;
37
+ } ;
15
38
16
39
/** `#text-input`に対してイベントリスナーを追加する
17
40
*
@@ -30,6 +53,7 @@ export const addTextInputEventListener = <K extends keyof HTMLElementEventMap>(
30
53
) => unknown ,
31
54
options ?: boolean | AddEventListenerOptions ,
32
55
) : void => {
56
+ reRegister ?.( ) ;
33
57
const argMap = listenerMap . get ( name ) ?? new Map < EventListener , Set < number > > ( ) ;
34
58
const encodedOptions = argMap . get ( listener as EventListener ) ?? new Set ( ) ;
35
59
if ( encodedOptions . has ( encode ( options ) ) ) return ;
@@ -62,30 +86,14 @@ export const addTextInputEventListener = <K extends keyof HTMLElementEventMap>(
62
86
textinput . addEventListener < K > ( name , listener , options ) ;
63
87
} ;
64
88
65
- // re-register event listeners when the layout changes
66
- scrapbox . on ( "layout:changed" , ( ) => {
67
- const textinput = textInput ( ) ;
68
- if ( ! textinput ) return ;
69
- for ( const [ name , argMap ] of listenerMap ) {
70
- for ( const [ listener , encodedOptions ] of argMap ) {
71
- for ( const encoded of encodedOptions ) {
72
- textinput . addEventListener (
73
- name ,
74
- listener as EventListener ,
75
- decode ( encoded ) ,
76
- ) ;
77
- }
78
- }
79
- }
80
- } ) ;
81
-
82
89
export const removeTextInputEventListener = <
83
90
K extends keyof HTMLElementEventMap ,
84
91
> (
85
92
name : K ,
86
93
listener : ( event : HTMLElementEventMap [ K ] ) => unknown ,
87
94
options ?: boolean | AddEventListenerOptions ,
88
95
) : void => {
96
+ reRegister ?.( ) ;
89
97
const argMap = listenerMap . get ( name ) ;
90
98
if ( ! argMap ) return ;
91
99
const encodedOptions = argMap . get ( listener as EventListener ) ;
0 commit comments