Bug 1833697 - Refactor `TabsTrayStore` into `TabsTrayBanner`

fenix/115.2.0
Noah Bond 1 year ago committed by mergify[bot]
parent a4ebf208aa
commit e8c21eba38

@ -31,8 +31,6 @@ import androidx.compose.ui.platform.rememberNestedScrollInteropConnection
import androidx.compose.ui.platform.testTag import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import mozilla.components.browser.state.selector.normalTabs
import mozilla.components.browser.state.selector.privateTabs
import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.state.ContentState import mozilla.components.browser.state.state.ContentState
import mozilla.components.browser.state.state.TabSessionState import mozilla.components.browser.state.state.TabSessionState
@ -122,10 +120,6 @@ fun TabsTray(
onDeleteSelectedTabsClick: () -> Unit, onDeleteSelectedTabsClick: () -> Unit,
onForceSelectedTabsAsInactiveClick: () -> Unit, onForceSelectedTabsAsInactiveClick: () -> Unit,
) { ) {
val normalTabCount = browserStore
.observeAsComposableState { state -> state.normalTabs.size }.value ?: 0
val privateTabCount = browserStore
.observeAsComposableState { state -> state.privateTabs.size }.value ?: 0
val multiselectMode = tabsTrayStore val multiselectMode = tabsTrayStore
.observeAsComposableState { state -> state.mode }.value ?: TabsTrayState.Mode.Normal .observeAsComposableState { state -> state.mode }.value ?: TabsTrayState.Mode.Normal
val selectedPage = tabsTrayStore val selectedPage = tabsTrayStore
@ -160,13 +154,9 @@ fun TabsTray(
) { ) {
Box(modifier = Modifier.nestedScroll(rememberNestedScrollInteropConnection())) { Box(modifier = Modifier.nestedScroll(rememberNestedScrollInteropConnection())) {
TabsTrayBanner( TabsTrayBanner(
selectMode = multiselectMode, tabsTrayStore = tabsTrayStore,
selectedPage = selectedPage,
normalTabCount = normalTabCount,
privateTabCount = privateTabCount,
isInDebugMode = isInDebugMode, isInDebugMode = isInDebugMode,
onTabPageIndicatorClicked = onTabPageClick, onTabPageIndicatorClicked = onTabPageClick,
onExitSelectModeClick = { tabsTrayStore.dispatch(TabsTrayAction.ExitSelectMode) },
onSaveToCollectionClick = onSaveToCollectionClick, onSaveToCollectionClick = onSaveToCollectionClick,
onShareSelectedTabsClick = onShareSelectedTabsClick, onShareSelectedTabsClick = onShareSelectedTabsClick,
onEnterMultiselectModeClick = { tabsTrayStore.dispatch(TabsTrayAction.EnterSelectMode) }, onEnterMultiselectModeClick = { tabsTrayStore.dispatch(TabsTrayAction.EnterSelectMode) },

@ -45,6 +45,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import mozilla.components.browser.state.state.ContentState import mozilla.components.browser.state.state.ContentState
import mozilla.components.browser.state.state.TabSessionState import mozilla.components.browser.state.state.TabSessionState
import mozilla.components.lib.state.ext.observeAsComposableState
import mozilla.components.ui.tabcounter.TabCounter import mozilla.components.ui.tabcounter.TabCounter
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.compose.DropdownMenu import org.mozilla.fenix.compose.DropdownMenu
@ -57,14 +58,9 @@ private val ICON_SIZE = 24.dp
/** /**
* Top-level UI for displaying the banner in [TabsTray]. * Top-level UI for displaying the banner in [TabsTray].
* *
* @param selectMode Current [TabsTrayState.Mode] used in the tabs tray. * @param tabsTrayStore [TabsTrayStore] used to listen for changes to [TabsTrayState].
* @param selectedPage The active [Page] of the Tabs Tray.
* @param normalTabCount The total amount of normal browsing tabs currently open.
* @param privateTabCount The number of private browsing tabs currently open.
* @param isInDebugMode True for debug variant or if secret menu is enabled for this session. * @param isInDebugMode True for debug variant or if secret menu is enabled for this session.
* @param onTabPageIndicatorClicked Invoked when the user clicks on a tab page indicator. * @param onTabPageIndicatorClicked Invoked when the user clicks on a tab page indicator.
* @param onExitSelectModeClick Invoked when the user clicks on exit select mode button from the
* multi select banner.
* @param onSaveToCollectionClick Invoked when the user clicks on the save to collection button from * @param onSaveToCollectionClick Invoked when the user clicks on the save to collection button from
* the multi select banner. * the multi select banner.
* @param onShareSelectedTabsClick Invoked when the user clicks on the share button from the multi select banner. * @param onShareSelectedTabsClick Invoked when the user clicks on the share button from the multi select banner.
@ -81,13 +77,9 @@ private val ICON_SIZE = 24.dp
@Suppress("LongParameterList") @Suppress("LongParameterList")
@Composable @Composable
fun TabsTrayBanner( fun TabsTrayBanner(
selectMode: TabsTrayState.Mode, tabsTrayStore: TabsTrayStore,
selectedPage: Page,
normalTabCount: Int,
privateTabCount: Int,
isInDebugMode: Boolean, isInDebugMode: Boolean,
onTabPageIndicatorClicked: (Page) -> Unit, onTabPageIndicatorClicked: (Page) -> Unit,
onExitSelectModeClick: () -> Unit,
onSaveToCollectionClick: () -> Unit, onSaveToCollectionClick: () -> Unit,
onShareSelectedTabsClick: () -> Unit, onShareSelectedTabsClick: () -> Unit,
onEnterMultiselectModeClick: () -> Unit, onEnterMultiselectModeClick: () -> Unit,
@ -100,11 +92,21 @@ fun TabsTrayBanner(
onBookmarkSelectedTabsClick: () -> Unit, onBookmarkSelectedTabsClick: () -> Unit,
onForceSelectedTabsAsInactiveClick: () -> Unit, onForceSelectedTabsAsInactiveClick: () -> Unit,
) { ) {
if (selectMode is TabsTrayState.Mode.Select) { val normalTabCount = tabsTrayStore.observeAsComposableState { state ->
state.normalTabs.size + state.inactiveTabs.size
}.value ?: 0
val privateTabCount = tabsTrayStore
.observeAsComposableState { state -> state.privateTabs.size }.value ?: 0
val multiselectMode = tabsTrayStore
.observeAsComposableState { state -> state.mode }.value ?: TabsTrayState.Mode.Normal
val selectedPage = tabsTrayStore
.observeAsComposableState { state -> state.selectedPage }.value ?: Page.NormalTabs
if (multiselectMode is TabsTrayState.Mode.Select) {
MultiSelectBanner( MultiSelectBanner(
selectedTabCount = selectMode.selectedTabs.size, selectedTabCount = multiselectMode.selectedTabs.size,
shouldShowInactiveButton = isInDebugMode, shouldShowInactiveButton = isInDebugMode,
onExitSelectModeClick = onExitSelectModeClick, onExitSelectModeClick = { tabsTrayStore.dispatch(TabsTrayAction.ExitSelectMode) },
onSaveToCollectionsClick = onSaveToCollectionClick, onSaveToCollectionsClick = onSaveToCollectionClick,
onShareSelectedTabs = onShareSelectedTabsClick, onShareSelectedTabs = onShareSelectedTabsClick,
onBookmarkSelectedTabsClick = onBookmarkSelectedTabsClick, onBookmarkSelectedTabsClick = onBookmarkSelectedTabsClick,
@ -510,22 +512,28 @@ private fun TabsTrayBannerPreviewRoot(
selectMode: TabsTrayState.Mode = TabsTrayState.Mode.Normal, selectMode: TabsTrayState.Mode = TabsTrayState.Mode.Normal,
selectedPage: Page = Page.NormalTabs, selectedPage: Page = Page.NormalTabs,
normalTabCount: Int = 10, normalTabCount: Int = 10,
privateTabCount: Int = 10,
) { ) {
var selectedPageState by remember { mutableStateOf(selectedPage) } val normalTabs = generateFakeTabsList(normalTabCount)
var selectModeState by remember { mutableStateOf(selectMode) } val privateTabs = generateFakeTabsList(privateTabCount)
val tabsTrayStore = TabsTrayStore(
initialState = TabsTrayState(
selectedPage = selectedPage,
mode = selectMode,
normalTabs = normalTabs,
privateTabs = privateTabs,
),
)
FirefoxTheme { FirefoxTheme {
Box(modifier = Modifier.background(color = FirefoxTheme.colors.layer1)) { Box(modifier = Modifier.background(color = FirefoxTheme.colors.layer1)) {
TabsTrayBanner( TabsTrayBanner(
selectMode = selectModeState, tabsTrayStore = tabsTrayStore,
selectedPage = selectedPageState,
normalTabCount = normalTabCount,
privateTabCount = 10,
isInDebugMode = true, isInDebugMode = true,
onTabPageIndicatorClicked = { page -> onTabPageIndicatorClicked = { page ->
selectedPageState = page tabsTrayStore.dispatch(TabsTrayAction.PageSelected(page))
}, },
onExitSelectModeClick = { selectModeState = TabsTrayState.Mode.Normal },
onSaveToCollectionClick = {}, onSaveToCollectionClick = {},
onShareSelectedTabsClick = {}, onShareSelectedTabsClick = {},
onEnterMultiselectModeClick = {}, onEnterMultiselectModeClick = {},
@ -551,3 +559,14 @@ private object DisabledRippleTheme : RippleTheme {
@Composable @Composable
override fun rippleAlpha(): RippleAlpha = RippleAlpha(0.0f, 0.0f, 0.0f, 0.0f) override fun rippleAlpha(): RippleAlpha = RippleAlpha(0.0f, 0.0f, 0.0f, 0.0f)
} }
private fun generateFakeTabsList(tabCount: Int = 10, isPrivate: Boolean = false): List<TabSessionState> =
List(tabCount) { index ->
TabSessionState(
id = "tabId$index-$isPrivate",
content = ContentState(
url = "www.mozilla.com",
private = isPrivate,
),
)
}

Loading…
Cancel
Save