@@ -106,19 +106,30 @@ export const showTaskContextMenuService = createIpcService({
106106 worktreePath ?: string ,
107107 ) : Promise < TaskContextMenuResult > => {
108108 return new Promise ( ( resolve ) => {
109+ let pendingDialog = false ;
110+ let resolved = false ;
111+
112+ const safeResolve = ( result : TaskContextMenuResult ) => {
113+ if ( ! resolved ) {
114+ resolved = true ;
115+ resolve ( result ) ;
116+ }
117+ } ;
118+
109119 const template : MenuItemConstructorOptions [ ] = [
110120 {
111121 label : "Rename" ,
112- click : ( ) => resolve ( { action : "rename" } ) ,
122+ click : ( ) => safeResolve ( { action : "rename" } ) ,
113123 } ,
114124 {
115125 label : "Duplicate" ,
116- click : ( ) => resolve ( { action : "duplicate" } ) ,
126+ click : ( ) => safeResolve ( { action : "duplicate" } ) ,
117127 } ,
118128 { type : "separator" } ,
119129 {
120130 label : "Delete" ,
121131 click : async ( ) => {
132+ pendingDialog = true ;
122133 const result = await dialog . showMessageBox ( {
123134 type : "question" ,
124135 title : "Delete Task" ,
@@ -132,9 +143,9 @@ export const showTaskContextMenuService = createIpcService({
132143 } ) ;
133144
134145 if ( result . response === 1 ) {
135- resolve ( { action : "delete" } ) ;
146+ safeResolve ( { action : "delete" } ) ;
136147 } else {
137- resolve ( { action : null } ) ;
148+ safeResolve ( { action : null } ) ;
138149 }
139150 } ,
140151 } ,
@@ -145,12 +156,19 @@ export const showTaskContextMenuService = createIpcService({
145156 template . push ( { type : "separator" } ) ;
146157 const externalAppsItems = await buildExternalAppsMenuItems (
147158 worktreePath ,
148- resolve ,
159+ safeResolve ,
149160 ) ;
150161 template . push ( ...externalAppsItems ) ;
151162 }
152163
153- showContextMenu ( template , { action : null } ) . then ( resolve ) ;
164+ const menu = Menu . buildFromTemplate ( template ) ;
165+ menu . popup ( {
166+ callback : ( ) => {
167+ if ( ! pendingDialog ) {
168+ safeResolve ( { action : null } ) ;
169+ }
170+ } ,
171+ } ) ;
154172 } ;
155173
156174 setupMenu ( ) ;
@@ -167,10 +185,21 @@ export const showFolderContextMenuService = createIpcService({
167185 folderPath ?: string ,
168186 ) : Promise < FolderContextMenuResult > => {
169187 return new Promise ( ( resolve ) => {
188+ let pendingDialog = false ;
189+ let resolved = false ;
190+
191+ const safeResolve = ( result : FolderContextMenuResult ) => {
192+ if ( ! resolved ) {
193+ resolved = true ;
194+ resolve ( result ) ;
195+ }
196+ } ;
197+
170198 const template : MenuItemConstructorOptions [ ] = [
171199 {
172200 label : "Remove folder" ,
173201 click : async ( ) => {
202+ pendingDialog = true ;
174203 const result = await dialog . showMessageBox ( {
175204 type : "question" ,
176205 title : "Remove Folder" ,
@@ -183,9 +212,9 @@ export const showFolderContextMenuService = createIpcService({
183212 } ) ;
184213
185214 if ( result . response === 1 ) {
186- resolve ( { action : "remove" } ) ;
215+ safeResolve ( { action : "remove" } ) ;
187216 } else {
188- resolve ( { action : null } ) ;
217+ safeResolve ( { action : null } ) ;
189218 }
190219 } ,
191220 } ,
@@ -196,12 +225,19 @@ export const showFolderContextMenuService = createIpcService({
196225 template . push ( { type : "separator" } ) ;
197226 const externalAppsItems = await buildExternalAppsMenuItems (
198227 folderPath ,
199- resolve ,
228+ safeResolve ,
200229 ) ;
201230 template . push ( ...externalAppsItems ) ;
202231 }
203232
204- showContextMenu ( template , { action : null } ) . then ( resolve ) ;
233+ const menu = Menu . buildFromTemplate ( template ) ;
234+ menu . popup ( {
235+ callback : ( ) => {
236+ if ( ! pendingDialog ) {
237+ safeResolve ( { action : null } ) ;
238+ }
239+ } ,
240+ } ) ;
205241 } ;
206242
207243 setupMenu ( ) ;
0 commit comments