@@ -213,6 +213,7 @@ const ProjectSidebarInner: React.FC<ProjectSidebarProps> = ({
213213 const [ expandedOldWorkspaces , setExpandedOldWorkspaces ] = usePersistedState <
214214 Record < string , boolean >
215215 > ( "expandedOldWorkspaces" , { } ) ;
216+ const [ deletingWorkspaceIds , setDeletingWorkspaceIds ] = useState < Set < string > > ( new Set ( ) ) ;
216217 const [ removeError , setRemoveError ] = useState < {
217218 workspaceId : string ;
218219 error : string ;
@@ -292,22 +293,34 @@ const ProjectSidebarInner: React.FC<ProjectSidebarProps> = ({
292293
293294 const handleRemoveWorkspace = useCallback (
294295 async ( workspaceId : string , buttonElement : HTMLElement ) => {
295- const result = await onRemoveWorkspace ( workspaceId ) ;
296- if ( ! result . success ) {
297- const error = result . error ?? "Failed to remove workspace" ;
298- const rect = buttonElement . getBoundingClientRect ( ) ;
299- const anchor = {
300- top : rect . top + window . scrollY ,
301- left : rect . right + 10 , // 10px to the right of button
302- } ;
303-
304- // Show force delete modal on any error to handle all cases
305- // (uncommitted changes, submodules, etc.)
306- setForceDeleteModal ( {
307- isOpen : true ,
308- workspaceId,
309- error,
310- anchor,
296+ // Mark workspace as being deleted for UI feedback
297+ setDeletingWorkspaceIds ( ( prev ) => new Set ( prev ) . add ( workspaceId ) ) ;
298+
299+ try {
300+ const result = await onRemoveWorkspace ( workspaceId ) ;
301+ if ( ! result . success ) {
302+ const error = result . error ?? "Failed to remove workspace" ;
303+ const rect = buttonElement . getBoundingClientRect ( ) ;
304+ const anchor = {
305+ top : rect . top + window . scrollY ,
306+ left : rect . right + 10 , // 10px to the right of button
307+ } ;
308+
309+ // Show force delete modal on any error to handle all cases
310+ // (uncommitted changes, submodules, etc.)
311+ setForceDeleteModal ( {
312+ isOpen : true ,
313+ workspaceId,
314+ error,
315+ anchor,
316+ } ) ;
317+ }
318+ } finally {
319+ // Clear deleting state (workspace removed or error shown)
320+ setDeletingWorkspaceIds ( ( prev ) => {
321+ const next = new Set ( prev ) ;
322+ next . delete ( workspaceId ) ;
323+ return next ;
311324 } ) ;
312325 }
313326 } ,
@@ -329,13 +342,25 @@ const ProjectSidebarInner: React.FC<ProjectSidebarProps> = ({
329342 // Close modal immediately to show that action is in progress
330343 setForceDeleteModal ( null ) ;
331344
332- // Use the same state update logic as regular removal
333- const result = await onRemoveWorkspace ( workspaceId , { force : true } ) ;
334- if ( ! result . success ) {
335- const errorMessage = result . error ?? "Failed to remove workspace" ;
336- console . error ( "Force delete failed:" , result . error ) ;
345+ // Mark workspace as being deleted for UI feedback
346+ setDeletingWorkspaceIds ( ( prev ) => new Set ( prev ) . add ( workspaceId ) ) ;
347+
348+ try {
349+ // Use the same state update logic as regular removal
350+ const result = await onRemoveWorkspace ( workspaceId , { force : true } ) ;
351+ if ( ! result . success ) {
352+ const errorMessage = result . error ?? "Failed to remove workspace" ;
353+ console . error ( "Force delete failed:" , result . error ) ;
337354
338- showRemoveError ( workspaceId , errorMessage , modalState ?. anchor ?? undefined ) ;
355+ showRemoveError ( workspaceId , errorMessage , modalState ?. anchor ?? undefined ) ;
356+ }
357+ } finally {
358+ // Clear deleting state
359+ setDeletingWorkspaceIds ( ( prev ) => {
360+ const next = new Set ( prev ) ;
361+ next . delete ( workspaceId ) ;
362+ return next ;
363+ } ) ;
339364 }
340365 } ;
341366
@@ -574,6 +599,7 @@ const ProjectSidebarInner: React.FC<ProjectSidebarProps> = ({
574599 projectPath = { projectPath }
575600 projectName = { projectName }
576601 isSelected = { selectedWorkspace ?. workspaceId === metadata . id }
602+ isDeleting = { deletingWorkspaceIds . has ( metadata . id ) }
577603 lastReadTimestamp = { lastReadTimestamps [ metadata . id ] ?? 0 }
578604 onSelectWorkspace = { onSelectWorkspace }
579605 onRemoveWorkspace = { handleRemoveWorkspace }
0 commit comments