@@ -40,15 +40,15 @@ import com.duckduckgo.app.tabs.model.TabSwitcherData.LayoutType.LIST
4040import  com.duckduckgo.app.tabs.ui.TabSwitcherItem.Tab 
4141import  com.duckduckgo.app.tabs.ui.TabSwitcherItem.Tab.NormalTab 
4242import  com.duckduckgo.app.tabs.ui.TabSwitcherItem.Tab.SelectableTab 
43+ import  com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command.BookmarkTabsRequest 
44+ import  com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command.ShareLink 
45+ import  com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command.ShareLinks 
46+ import  com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command.ShowUndoBookmarkMessage 
4347import  com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.BackButtonType.ARROW 
4448import  com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.BackButtonType.CLOSE 
4549import  com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.FabType 
4650import  com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.Mode.Normal 
4751import  com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.SelectionViewState.Mode.Selection 
48- import  com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command.BookmarkTabsRequest 
49- import  com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command.ShareLink 
50- import  com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command.ShareLinks 
51- import  com.duckduckgo.app.tabs.ui.TabSwitcherViewModel.Command.ShowBookmarkToast 
5252import  com.duckduckgo.common.utils.DispatcherProvider 
5353import  com.duckduckgo.common.utils.SingleLiveEvent 
5454import  com.duckduckgo.common.utils.extensions.toBinaryString 
@@ -127,13 +127,15 @@ class TabSwitcherViewModel @Inject constructor(
127127            }
128128        }
129129
130+     private  val  recentlySavedBookmarks =  mutableListOf<Bookmark >()
131+ 
130132    sealed  class  Command  {
131133        data object  Close  : Command ()
132134        data object  CloseAllTabsRequest  : Command ()
133135        data class  ShareLink (val  link :  String , val  title :  String ) : Command()
134136        data class  ShareLinks (val  links :  List <String >) : Command()
135137        data class  BookmarkTabsRequest (val  tabIds :  List <String >) : Command()
136-         data class  ShowBookmarkToast (val  numBookmarks :  Int ) : Command()
138+         data class  ShowUndoBookmarkMessage (val  numBookmarks :  Int ) : Command()
137139    }
138140
139141    suspend  fun  onNewTabRequested (fromOverflowMenu :  Boolean ) {
@@ -260,34 +262,47 @@ class TabSwitcherViewModel @Inject constructor(
260262        }
261263    }
262264
263-     fun  onSelectionModeRequested () {
264-         triggerEmptySelectionMode()
265-     }
266- 
267-     private  fun  triggerEmptySelectionMode () {
268-         _selectionViewState .update { it.copy(mode =  Selection (emptyList())) }
269-     }
270- 
271-     fun  onCloseSelectedTabs () {
265+     fun  undoBookmarkAction () {
266+         recentlySavedBookmarks.forEach { bookmark -> 
267+             viewModelScope.launch(dispatcherProvider.io()) {
268+                 savedSitesRepository.delete(bookmark)
269+             }
270+         }
271+         recentlySavedBookmarks.clear()
272272    }
273273
274-     fun  onCloseOtherTabs () {
274+     fun  finishBookmarkAction () {
275+         recentlySavedBookmarks.clear()
275276    }
276277
277278    fun  onBookmarkTabsConfirmed (tabIds :  List <String >) {
278279        viewModelScope.launch {
279-             val  numBookmarkedTabs  =   bookmarkTabs(tabIds)
280-             command.value =  ShowBookmarkToast (numBookmarkedTabs )
280+             recentlySavedBookmarks.addAll( bookmarkTabs(tabIds) )
281+             command.value =  ShowUndoBookmarkMessage (recentlySavedBookmarks.size )
281282        }
282283    }
283284
284-     private  suspend  fun  bookmarkTabs (tabIds :  List <String >): Int  {
285+     private  suspend  fun  bookmarkTabs (tabIds :  List <String >): List < Bookmark >  {
285286        val  results =  tabIds.map { tabId -> 
286287            viewModelScope.async {
287288                saveSiteBookmark(tabId)
288289            }
289290        }
290-         return  results.awaitAll().count { it !=  null  }
291+         return  results.awaitAll().filterNotNull()
292+     }
293+ 
294+     fun  onSelectionModeRequested () {
295+         triggerEmptySelectionMode()
296+     }
297+ 
298+     private  fun  triggerEmptySelectionMode () {
299+         _selectionViewState .update { it.copy(mode =  Selection (emptyList())) }
300+     }
301+ 
302+     fun  onCloseSelectedTabs () {
303+     }
304+ 
305+     fun  onCloseOtherTabs () {
291306    }
292307
293308    fun  onCloseAllTabsConfirmed () {
@@ -392,7 +407,7 @@ class TabSwitcherViewModel @Inject constructor(
392407
393408    private  suspend  fun  saveSiteBookmark (tabId :  String ) =  withContext(dispatcherProvider.io()) {
394409        var  bookmark:  Bookmark ?  =  null 
395-         (tabSwitcherItems.value? .firstOrNull { it.id ==  tabId } as ?  Tab )?.let  { tab -> 
410+         (tabItems .firstOrNull { it.id ==  tabId } as ?  Tab )?.let  { tab -> 
396411            tab.tabEntity.url?.let  { url -> 
397412                if  (url.isNotBlank()) {
398413                    //  Only bookmark new sites
0 commit comments