Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 496e3a19 authored by Ellen Poe's avatar Ellen Poe
Browse files

refactor: HomeScreen

parent bf6d68be
Loading
Loading
Loading
Loading
+158 −87
Original line number Diff line number Diff line
@@ -129,17 +129,86 @@ private fun SearchPanelContent(
            .padding(dimensionResource(dimen.padding))
    ) {
        val density = LocalDensity.current
        val textFieldRequester = remember { FocusRequester() }

        // Measure the height of this row for peekHeight
        PeekHeightContent(
            searchQuery = searchQuery,
            onSearchQueryChange = onSearchQueryChange,
            onSearchFocusChange = onSearchFocusChange,
            onSearchEvent = onSearchEvent,
            textFieldRequester = textFieldRequester,
            homeInSearchScreen = homeInSearchScreen,
            pinnedPlaces = pinnedPlaces,
            onPlaceSelected = onPlaceSelected,
            onPeekHeightChange = onPeekHeightChange,
            density = density
        )

        ContentBelow(
            homeInSearchScreen = homeInSearchScreen,
            geocodePlaces = geocodePlaces,
            onPlaceSelected = onPlaceSelected,
            addressFormatter = addressFormatter
        )
    }
}

@Composable
private fun PeekHeightContent(
    searchQuery: TextFieldValue,
    onSearchQueryChange: (TextFieldValue) -> Unit,
    onSearchFocusChange: (Boolean) -> Unit,
    onSearchEvent: () -> Unit,
    textFieldRequester: FocusRequester,
    homeInSearchScreen: Boolean,
    pinnedPlaces: List<Place>,
    onPlaceSelected: (Place) -> Unit,
    onPeekHeightChange: (Dp) -> Unit,
    density: androidx.compose.ui.unit.Density,
) {
    Column(
        modifier = Modifier
            .fillMaxWidth()
            .onGloballyPositioned { coordinates ->
                val heightInDp = with(density) { coordinates.size.height.toDp() }
                onPeekHeightChange(heightInDp)
                }) {
            val textField = remember { FocusRequester() }
            // Search box with "Where to?" placeholder
            }
    ) {
        SearchTextField(
            searchQuery = searchQuery,
            onSearchQueryChange = onSearchQueryChange,
            onSearchFocusChange = onSearchFocusChange,
            onSearchEvent = onSearchEvent,
            textFieldRequester = textFieldRequester,
            homeInSearchScreen = homeInSearchScreen
        )

        PinnedPlacesRow(
            pinnedPlaces = pinnedPlaces,
            homeInSearchScreen = homeInSearchScreen,
            onPlaceSelected = onPlaceSelected
        )

        HorizontalDivider(
            modifier = Modifier
                .fillMaxWidth()
                .padding(vertical = dimensionResource(dimen.padding) / 2),
            thickness = DividerDefaults.Thickness,
            color = MaterialTheme.colorScheme.outlineVariant
        )
    }
}

@Composable
private fun SearchTextField(
    searchQuery: TextFieldValue,
    onSearchQueryChange: (TextFieldValue) -> Unit,
    onSearchFocusChange: (Boolean) -> Unit,
    onSearchEvent: () -> Unit,
    textFieldRequester: FocusRequester,
    homeInSearchScreen: Boolean,
) {
    TextField(
        value = searchQuery,
        onValueChange = onSearchQueryChange,
@@ -147,7 +216,7 @@ private fun SearchPanelContent(
        keyboardActions = KeyboardActions(onSearch = { onSearchEvent() }),
        singleLine = true,
        modifier = Modifier
                    .focusRequester(textField)
            .focusRequester(textFieldRequester)
            .fillMaxWidth()
            .padding(bottom = dimensionResource(dimen.padding))
            .onFocusChanged { focusState ->
@@ -181,17 +250,22 @@ private fun SearchPanelContent(
        shape = RoundedCornerShape(dimensionResource(dimen.icon_size))
    )

            // This block is responsible for returning focus to the search bar after we pop back to the search panel from a place card.
    LaunchedEffect(homeInSearchScreen) {
        if (homeInSearchScreen) {
                    textField.requestFocus()
            textFieldRequester.requestFocus()
        }
    }
}

@Composable
private fun PinnedPlacesRow(
    pinnedPlaces: List<Place>,
    homeInSearchScreen: Boolean,
    onPlaceSelected: (Place) -> Unit,
) {
    AnimatedVisibility(
        visible = pinnedPlaces.isNotEmpty()
    ) {
                // The homeInSearchScreen isn't part of the animated visibility condition because it looks weird.
        if (!homeInSearchScreen) {
            FlowRow(
                modifier = Modifier
@@ -206,17 +280,15 @@ private fun SearchPanelContent(
            }
        }
    }

            // Inset horizontal divider
            HorizontalDivider(
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(vertical = dimensionResource(dimen.padding) / 2),
                thickness = DividerDefaults.Thickness,
                color = MaterialTheme.colorScheme.outlineVariant
            )
}

@Composable
private fun ContentBelow(
    homeInSearchScreen: Boolean,
    geocodePlaces: List<Place>,
    onPlaceSelected: (Place) -> Unit,
    addressFormatter: AddressFormatter,
) {
    if (homeInSearchScreen) {
        LazyColumn {
            items(geocodePlaces) {
@@ -233,7 +305,6 @@ private fun SearchPanelContent(
        SavedPlacesList(savedPlacesViewModel, onPlaceSelected = onPlaceSelected)
    }
}
}

@Composable
fun NavigationIcon(