1
+ import { debounce } from "./utils" ;
2
+
1
3
class Help {
2
4
private DOM : {
3
5
el : HTMLElement | null ;
@@ -40,18 +42,33 @@ class Help {
40
42
this . DOM . addressInput = el . querySelector < HTMLInputElement > ( Help . SELECTORS . addressInput ) ;
41
43
this . DOM . cmdModeSelect = el . querySelector < HTMLSelectElement > ( Help . SELECTORS . cmdModeSelect ) ;
42
44
43
- console . log ( this . DOM ) ;
44
45
this . funcList = this . DOM . funcs . map ( ( funcEl ) => new HelpFunc ( funcEl ) ) ;
45
46
47
+ this . restoreAddress ( ) ;
46
48
this . bindEvents ( ) ;
47
49
}
48
50
51
+ private restoreAddress ( ) : void {
52
+ const { addressInput } = this . DOM ;
53
+ if ( addressInput ) {
54
+ const storedAddress = localStorage . getItem ( "helpAddressInput" ) ;
55
+ if ( storedAddress ) {
56
+ addressInput . value = storedAddress ;
57
+ this . funcList . forEach ( ( func ) => func . updateAddr ( storedAddress ) ) ;
58
+ }
59
+ }
60
+ }
61
+
49
62
private bindEvents ( ) : void {
50
63
const { addressInput, cmdModeSelect } = this . DOM ;
51
64
52
- addressInput ?. addEventListener ( "input" , ( ) => {
53
- this . funcList . forEach ( ( func ) => func . updateAddr ( addressInput . value ) ) ;
65
+ const debouncedUpdate = debounce ( ( addressInput : HTMLInputElement ) => {
66
+ const address = addressInput . value ;
67
+
68
+ localStorage . setItem ( "helpAddressInput" , address ) ;
69
+ this . funcList . forEach ( ( func ) => func . updateAddr ( address ) ) ;
54
70
} ) ;
71
+ addressInput ?. addEventListener ( "input" , ( ) => debouncedUpdate ( addressInput ) ) ;
55
72
56
73
cmdModeSelect ?. addEventListener ( "change" , ( e ) => {
57
74
const target = e . target as HTMLSelectElement ;
@@ -66,6 +83,7 @@ class HelpFunc {
66
83
addrs : HTMLElement [ ] ;
67
84
args : HTMLElement [ ] ;
68
85
modes : HTMLElement [ ] ;
86
+ paramInputs : HTMLInputElement [ ] ;
69
87
} ;
70
88
71
89
private funcName : string | null ;
@@ -83,27 +101,52 @@ class HelpFunc {
83
101
addrs : Array . from ( el . querySelectorAll < HTMLElement > ( HelpFunc . SELECTORS . address ) ) ,
84
102
args : Array . from ( el . querySelectorAll < HTMLElement > ( HelpFunc . SELECTORS . args ) ) ,
85
103
modes : Array . from ( el . querySelectorAll < HTMLElement > ( HelpFunc . SELECTORS . mode ) ) ,
104
+ paramInputs : Array . from ( el . querySelectorAll < HTMLInputElement > ( HelpFunc . SELECTORS . paramInput ) ) ,
86
105
} ;
87
106
88
107
this . funcName = el . dataset . func || null ;
89
108
109
+ this . initializeArgs ( ) ;
90
110
this . bindEvents ( ) ;
91
111
}
92
112
113
+ private static sanitizeArgsInput ( input : HTMLInputElement ) {
114
+ const paramName = input . dataset . param || "" ;
115
+ const paramValue = input . value . trim ( ) ;
116
+
117
+ if ( ! paramName ) {
118
+ console . warn ( "sanitizeArgsInput: param is missing in arg input dataset." ) ;
119
+ }
120
+
121
+ return { paramName, paramValue } ;
122
+ }
123
+
93
124
private bindEvents ( ) : void {
125
+ const debouncedUpdate = debounce ( ( paramName : string , paramValue : string ) => {
126
+ if ( paramName ) this . updateArg ( paramName , paramValue ) ;
127
+ } ) ;
128
+
94
129
this . DOM . el . addEventListener ( "input" , ( e ) => {
95
130
const target = e . target as HTMLInputElement ;
96
131
if ( target . dataset . role === "help-param-input" ) {
97
- this . updateArg ( target . dataset . param || "" , target . value ) ;
132
+ const { paramName, paramValue } = HelpFunc . sanitizeArgsInput ( target ) ;
133
+ debouncedUpdate ( paramName , paramValue ) ;
98
134
}
99
135
} ) ;
100
136
}
101
137
138
+ private initializeArgs ( ) : void {
139
+ this . DOM . paramInputs . forEach ( ( input ) => {
140
+ const { paramName, paramValue } = HelpFunc . sanitizeArgsInput ( input ) ;
141
+ if ( paramName ) this . updateArg ( paramName , paramValue ) ;
142
+ } ) ;
143
+ }
144
+
102
145
public updateArg ( paramName : string , paramValue : string ) : void {
103
146
this . DOM . args
104
147
. filter ( ( arg ) => arg . dataset . arg === paramName )
105
148
. forEach ( ( arg ) => {
106
- arg . textContent = paramValue . trim ( ) || "" ;
149
+ arg . textContent = paramValue || "" ;
107
150
} ) ;
108
151
}
109
152
@@ -116,7 +159,8 @@ class HelpFunc {
116
159
public updateMode ( mode : string ) : void {
117
160
this . DOM . modes . forEach ( ( cmd ) => {
118
161
const isVisible = cmd . dataset . codeMode === mode ;
119
- cmd . className = isVisible ? "inline" : "hidden" ;
162
+ cmd . classList . toggle ( "inline" , isVisible ) ;
163
+ cmd . classList . toggle ( "hidden" , ! isVisible ) ;
120
164
cmd . dataset . copyContent = isVisible ? `help-cmd-${ this . funcName } ` : "" ;
121
165
} ) ;
122
166
}
0 commit comments