@@ -112,6 +112,61 @@ function getQuestion(item: MenuItemType) {
112
112
}
113
113
}
114
114
115
+ async function action ( selectedAction : string , selectedMenu : string = 'main' ) {
116
+ const action = actions [ selectedAction ] ;
117
+ switch ( action ?. type ) {
118
+ case 'function' :
119
+ if ( action . options ?. message ?. text ) {
120
+ console . log ( write ( action . options . message . text , action . options . message ?. color ) ) ;
121
+ }
122
+ if ( action . options ?. callback ) {
123
+ await action . options . callback ( selectedMenu ) ;
124
+ }
125
+ break ;
126
+ case 'goto' :
127
+ if ( menu [ selectedMenu ] . parent ) {
128
+ if ( action . options ?. callback ) {
129
+ await action . options . callback ( menu [ selectedMenu ] . parent ) ;
130
+ } else {
131
+ print ( menu [ selectedMenu ] . parent ) ;
132
+ }
133
+ } else {
134
+ console . log ( write ( `menu.goto.target.notfound` , 'red' ) ) ;
135
+ }
136
+ break ;
137
+ case 'input' :
138
+ if ( action . options ?. message ) {
139
+ const userInput = await waitForKeyPress ( {
140
+ message : action . options . message . text ,
141
+ color : action . options . message ?. color ,
142
+ default : action . options . default
143
+ } ) ;
144
+
145
+ if ( action . options . callback ) {
146
+ await action . options . callback ( userInput , menu [ selectedMenu ] ?. parent ) ;
147
+ }
148
+ }
149
+ break ;
150
+ case 'checkbox' :
151
+ if ( action . options ?. message ) {
152
+ const assetsAnswer = await checkbox ( {
153
+ message : write ( action . options . message . text , action . options . message ?. color ) ,
154
+ choices : action . options . answers . map ( ( item ) => ( {
155
+ name : write ( item . name , item . color ) ,
156
+ value : item . value
157
+ } ) )
158
+ } ) ;
159
+ if ( action . options . callback ) {
160
+ await action . options . callback ( assetsAnswer , menu [ selectedMenu ] ?. parent ) ;
161
+ }
162
+ }
163
+ break ;
164
+ default :
165
+ console . log ( write ( `menu.action.notfound` , 'red' ) ) ;
166
+ break ;
167
+ }
168
+ }
169
+
115
170
async function print ( selectedMenu : string = 'main' ) {
116
171
console . clear ( ) ;
117
172
@@ -123,58 +178,7 @@ async function print(selectedMenu: string = 'main') {
123
178
if ( menu [ selectedMenu ] ) {
124
179
const answer : string = await select ( getQuestion ( menu [ selectedMenu ] ) ) ;
125
180
if ( menu [ selectedMenu ] . choices . includes ( answer ) ) {
126
- const action = actions [ answer ] ;
127
- switch ( action ?. type ) {
128
- case 'function' :
129
- if ( action . options ?. message ?. text ) {
130
- console . log ( write ( action . options . message . text , action . options . message ?. color ) ) ;
131
- }
132
- if ( action . options ?. callback ) {
133
- await action . options . callback ( selectedMenu ) ;
134
- }
135
- break ;
136
- case 'goto' :
137
- if ( menu [ selectedMenu ] . parent ) {
138
- if ( action . options ?. callback ) {
139
- await action . options . callback ( menu [ selectedMenu ] . parent ) ;
140
- } else {
141
- print ( menu [ selectedMenu ] . parent ) ;
142
- }
143
- } else {
144
- console . log ( write ( `menu.goto.target.notfound` , 'red' ) ) ;
145
- }
146
- break ;
147
- case 'input' :
148
- if ( action . options ?. message ) {
149
- const userInput = await waitForKeyPress ( {
150
- message : action . options . message . text ,
151
- color : action . options . message ?. color ,
152
- default : action . options . default
153
- } ) ;
154
-
155
- if ( action . options . callback ) {
156
- await action . options . callback ( userInput , menu [ selectedMenu ] ?. parent ) ;
157
- }
158
- }
159
- break ;
160
- case 'checkbox' :
161
- if ( action . options ?. message ) {
162
- const assetsAnswer = await checkbox ( {
163
- message : write ( action . options . message . text , action . options . message ?. color ) ,
164
- choices : action . options . answers . map ( ( item ) => ( {
165
- name : write ( item . name , item . color ) ,
166
- value : item . value
167
- } ) )
168
- } ) ;
169
- if ( action . options . callback ) {
170
- await action . options . callback ( assetsAnswer , menu [ selectedMenu ] ?. parent ) ;
171
- }
172
- }
173
- break ;
174
- default :
175
- console . log ( write ( `menu.action.notfound` , 'red' ) ) ;
176
- break ;
177
- }
181
+ action ( answer , selectedMenu ) ;
178
182
} else if ( menu [ answer ] ) {
179
183
print ( answer ) ;
180
184
}
@@ -183,15 +187,39 @@ async function print(selectedMenu: string = 'main') {
183
187
}
184
188
}
185
189
190
+ async function addActionToMenu ( action : string | ActionType , menuName : string = 'main' ) {
191
+ if ( typeof action === 'string' ) {
192
+ action = actions [ action ] ;
193
+ } else {
194
+ if ( ! action . name ) {
195
+ throw new Error ( 'Action must have a name property' ) ;
196
+ }
197
+ if ( ! action . type ) {
198
+ throw new Error ( 'Action must have a type property' ) ;
199
+ }
200
+ actions [ action . name ] = action ;
201
+ }
202
+
203
+ if ( action && menu [ menuName ] ) {
204
+ const tmp = getAction ( action . name ) ;
205
+ if ( ! menu [ menuName ] . choices . includes ( tmp . value ) ) {
206
+ menu [ menuName ] . choices . push ( tmp . value ) ;
207
+ }
208
+ }
209
+ }
210
+
186
211
export {
187
212
type PluginType ,
188
213
type ActionType ,
189
214
type ActionsType ,
190
215
type MenuItemType ,
191
216
type MenuType ,
217
+ updateLanguages ,
218
+ action ,
192
219
print ,
193
220
write ,
194
221
addPlugin ,
222
+ addActionToMenu ,
195
223
actionExit ,
196
224
actionGoBack ,
197
225
waitForKeyPress
0 commit comments