/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mozilla.fenix.tabstray import mozilla.components.browser.state.action.BrowserAction import mozilla.components.browser.state.action.HistoryMetadataAction import mozilla.components.browser.state.action.TabGroupAction import mozilla.components.browser.state.action.TabListAction import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.state.getGroupByName import mozilla.components.lib.state.Middleware import mozilla.components.lib.state.MiddlewareContext const val SEARCH_TERM_TAB_GROUPS = "searchTermTabGroups" const val SEARCH_TERM_TAB_GROUPS_MIN_SIZE = 2 /** * This [Middleware] manages tab groups for search terms. */ class SearchTermTabGroupMiddleware : Middleware { override fun invoke( context: MiddlewareContext, next: (BrowserAction) -> Unit, action: BrowserAction ) { next(action) when (action) { is HistoryMetadataAction.SetHistoryMetadataKeyAction -> { action.historyMetadataKey.searchTerm?.let { searchTerm -> context.dispatch( TabGroupAction.AddTabAction(SEARCH_TERM_TAB_GROUPS, searchTerm, action.tabId) ) } } is HistoryMetadataAction.DisbandSearchGroupAction -> { val group = context.state.tabPartitions[SEARCH_TERM_TAB_GROUPS]?.getGroupByName(action.searchTerm) group?.let { context.dispatch(TabGroupAction.RemoveTabGroupAction(SEARCH_TERM_TAB_GROUPS, it.id)) } } is TabListAction.RestoreAction -> { action.tabs.forEach { tab -> tab.state.historyMetadata?.searchTerm?.let { searchTerm -> context.dispatch( TabGroupAction.AddTabAction(SEARCH_TERM_TAB_GROUPS, searchTerm, tab.state.id) ) } } } } } }