@@ -211,6 +211,7 @@ const ProjectSidebarInner: React.FC<ProjectSidebarProps> = ({
211211 const [ expandedOldWorkspaces , setExpandedOldWorkspaces ] = usePersistedState <
212212 Record < string , boolean >
213213 > ( "expandedOldWorkspaces" , { } ) ;
214+ const [ deletingWorkspaceIds , setDeletingWorkspaceIds ] = useState < Set < string > > ( new Set ( ) ) ;
214215 const [ removeError , setRemoveError ] = useState < {
215216 workspaceId : string ;
216217 error : string ;
@@ -289,22 +290,34 @@ const ProjectSidebarInner: React.FC<ProjectSidebarProps> = ({
289290
290291 const handleRemoveWorkspace = useCallback (
291292 async ( workspaceId : string , buttonElement : HTMLElement ) => {
292- const result = await onRemoveWorkspace ( workspaceId ) ;
293- if ( ! result . success ) {
294- const error = result . error ?? "Failed to remove workspace" ;
295- const rect = buttonElement . getBoundingClientRect ( ) ;
296- const anchor = {
297- top : rect . top + window . scrollY ,
298- left : rect . right + 10 , // 10px to the right of button
299- } ;
300-
301- // Show force delete modal on any error to handle all cases
302- // (uncommitted changes, submodules, etc.)
303- setForceDeleteModal ( {
304- isOpen : true ,
305- workspaceId,
306- error,
307- anchor,
293+ // Mark workspace as being deleted for UI feedback
294+ setDeletingWorkspaceIds ( ( prev ) => new Set ( prev ) . add ( workspaceId ) ) ;
295+
296+ try {
297+ const result = await onRemoveWorkspace ( workspaceId ) ;
298+ if ( ! result . success ) {
299+ const error = result . error ?? "Failed to remove workspace" ;
300+ const rect = buttonElement . getBoundingClientRect ( ) ;
301+ const anchor = {
302+ top : rect . top + window . scrollY ,
303+ left : rect . right + 10 , // 10px to the right of button
304+ } ;
305+
306+ // Show force delete modal on any error to handle all cases
307+ // (uncommitted changes, submodules, etc.)
308+ setForceDeleteModal ( {
309+ isOpen : true ,
310+ workspaceId,
311+ error,
312+ anchor,
313+ } ) ;
314+ }
315+ } finally {
316+ // Clear deleting state (workspace removed or error shown)
317+ setDeletingWorkspaceIds ( ( prev ) => {
318+ const next = new Set ( prev ) ;
319+ next . delete ( workspaceId ) ;
320+ return next ;
308321 } ) ;
309322 }
310323 } ,
@@ -326,13 +339,25 @@ const ProjectSidebarInner: React.FC<ProjectSidebarProps> = ({
326339 // Close modal immediately to show that action is in progress
327340 setForceDeleteModal ( null ) ;
328341
329- // Use the same state update logic as regular removal
330- const result = await onRemoveWorkspace ( workspaceId , { force : true } ) ;
331- if ( ! result . success ) {
332- const errorMessage = result . error ?? "Failed to remove workspace" ;
333- console . error ( "Force delete failed:" , result . error ) ;
342+ // Mark workspace as being deleted for UI feedback
343+ setDeletingWorkspaceIds ( ( prev ) => new Set ( prev ) . add ( workspaceId ) ) ;
344+
345+ try {
346+ // Use the same state update logic as regular removal
347+ const result = await onRemoveWorkspace ( workspaceId , { force : true } ) ;
348+ if ( ! result . success ) {
349+ const errorMessage = result . error ?? "Failed to remove workspace" ;
350+ console . error ( "Force delete failed:" , result . error ) ;
334351
335- showRemoveError ( workspaceId , errorMessage , modalState ?. anchor ?? undefined ) ;
352+ showRemoveError ( workspaceId , errorMessage , modalState ?. anchor ?? undefined ) ;
353+ }
354+ } finally {
355+ // Clear deleting state
356+ setDeletingWorkspaceIds ( ( prev ) => {
357+ const next = new Set ( prev ) ;
358+ next . delete ( workspaceId ) ;
359+ return next ;
360+ } ) ;
336361 }
337362 } ;
338363
@@ -572,6 +597,7 @@ const ProjectSidebarInner: React.FC<ProjectSidebarProps> = ({
572597 projectPath = { projectPath }
573598 projectName = { projectName }
574599 isSelected = { selectedWorkspace ?. workspaceId === metadata . id }
600+ isDeleting = { deletingWorkspaceIds . has ( metadata . id ) }
575601 lastReadTimestamp = { lastReadTimestamps [ metadata . id ] ?? 0 }
576602 onSelectWorkspace = { onSelectWorkspace }
577603 onRemoveWorkspace = { handleRemoveWorkspace }
0 commit comments