Skip to content

Commit 39d9361

Browse files
committed
feat: updated top bar
1 parent 83845f7 commit 39d9361

File tree

16 files changed

+183
-166
lines changed

16 files changed

+183
-166
lines changed

feature/favourite/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,5 @@ dependencies {
2323
testImplementation(libs.junit.jupiter.params)
2424
testImplementation(libs.junit)
2525
testRuntimeOnly(libs.junit.vintage.engine)
26+
implementation(libs.lottie.compose)
2627
}

feature/favourite/src/main/kotlin/com/espressodev/gptmap/feature/favourite/FavouriteNavigation.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ import androidx.navigation.NavGraphBuilder
55
import androidx.navigation.NavOptions
66
import androidx.navigation.compose.composable
77

8-
const val FAVOURITE_ROUTE = "favourite_route"
8+
const val FavouriteRoute = "favourite_route"
99

1010
fun NavController.navigateToFavourite(navOptions: NavOptions? = null) {
11-
navigate(FAVOURITE_ROUTE, navOptions)
11+
navigate(FavouriteRoute, navOptions)
1212
}
1313

1414
fun NavGraphBuilder.favouriteScreen(popUp: () -> Unit, navigateToMap: (String) -> Unit) {
15-
composable(FAVOURITE_ROUTE) {
15+
composable(FavouriteRoute) {
1616
FavouriteRoute(popUp = popUp, navigateToMap = navigateToMap)
1717
}
1818
}

feature/favourite/src/main/kotlin/com/espressodev/gptmap/feature/favourite/FavouriteScreen.kt

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import androidx.compose.ui.Alignment
2424
import androidx.compose.ui.Modifier
2525
import androidx.compose.ui.layout.ContentScale
2626
import androidx.compose.ui.text.style.TextOverflow
27-
import androidx.compose.ui.tooling.preview.Preview
2827
import androidx.compose.ui.unit.dp
2928
import androidx.hilt.navigation.compose.hiltViewModel
3029
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -35,11 +34,9 @@ import com.espressodev.gptmap.core.designsystem.GmIcons
3534
import com.espressodev.gptmap.core.designsystem.IconType
3635
import com.espressodev.gptmap.core.designsystem.TextType
3736
import com.espressodev.gptmap.core.designsystem.component.GmTopAppBar
38-
import com.espressodev.gptmap.core.designsystem.component.LottieAnimationView
39-
import com.espressodev.gptmap.core.designsystem.theme.GptmapTheme
37+
import com.espressodev.gptmap.core.designsystem.component.LottieAnimationPlaceholder
4038
import com.espressodev.gptmap.core.model.Favourite
4139
import com.espressodev.gptmap.core.model.Response
42-
import java.time.LocalDateTime
4340
import com.espressodev.gptmap.core.designsystem.R.string as AppText
4441
import com.espressodev.gptmap.core.designsystem.R.raw as AppRaw
4542

@@ -97,7 +94,7 @@ fun FavouriteScreen(
9794
}
9895

9996
is Response.Failure -> {
100-
LottieAnimationView(AppRaw.confused_man_404)
97+
LottieAnimationPlaceholder(AppRaw.confused_man_404)
10198
}
10299

103100
Response.Loading -> {}
@@ -168,14 +165,3 @@ fun FavouriteCard(favourite: Favourite, onClick: () -> Unit, modifier: Modifier
168165
}
169166
}
170167
}
171-
172-
@Preview(showBackground = true)
173-
@Composable
174-
private fun FavouritePreview() {
175-
GptmapTheme {
176-
FavouriteCard(
177-
favourite = Favourite(date = LocalDateTime.now()),
178-
onClick = {}
179-
)
180-
}
181-
}

feature/map/src/main/kotlin/com/espressodev/gptmap/feature/map/MapNavigation.kt

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,33 @@ package com.espressodev.gptmap.feature.map
22

33
import androidx.navigation.NavController
44
import androidx.navigation.NavGraphBuilder
5+
import androidx.navigation.NavOptions
56
import androidx.navigation.NavType
67
import androidx.navigation.compose.composable
78
import androidx.navigation.navArgument
89

9-
const val MAP_ROUTE = "map_route"
10-
const val FAVOURITE_ID = "favouriteId"
11-
fun NavController.navigateToMap(favouriteId: String = "default") {
12-
navigate("$MAP_ROUTE/$favouriteId") {
13-
launchSingleTop = true
14-
popUpTo(0) { inclusive = true }
15-
}
10+
const val MapRoute = "map_route"
11+
const val FAVOURITE_ID = "favId"
12+
const val MapRouteWithArg = "$MapRoute/{$FAVOURITE_ID}"
13+
fun NavController.navigateToMap(favouriteId: String = "default", navOptions: NavOptions? = null) {
14+
navigate("$MapRoute/$favouriteId", navOptions = navOptions)
1615
}
1716

1817
fun NavGraphBuilder.mapScreen(
1918
navigateToStreetView: (Float, Float) -> Unit,
20-
navigateToFavourite: () -> Unit,
2119
navigateToScreenshot: () -> Unit,
22-
navigateToScreenshotGallery: () -> Unit,
2320
navigateToProfile: () -> Unit
2421
) {
2522
composable(
26-
route = "$MAP_ROUTE/{$FAVOURITE_ID}",
23+
route = "$MapRoute/{$FAVOURITE_ID}",
2724
arguments = listOf(navArgument(FAVOURITE_ID) { type = NavType.StringType })
2825
) {
2926
val favouriteId = it.arguments?.getString(FAVOURITE_ID) ?: "default"
3027
MapRoute(
3128
navigateToStreetView = navigateToStreetView,
32-
navigateToFavourite = navigateToFavourite,
33-
favouriteId = favouriteId,
3429
navigateToScreenshot = navigateToScreenshot,
35-
navigateToScreenshotGallery = navigateToScreenshotGallery,
36-
navigateToProfile = navigateToProfile
30+
navigateToProfile = navigateToProfile,
31+
favouriteId = favouriteId
3732
)
3833
}
3934
}

feature/map/src/main/kotlin/com/espressodev/gptmap/feature/map/MapScreen.kt

Lines changed: 21 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.espressodev.gptmap.feature.map
22

3+
import StreetView
34
import android.annotation.SuppressLint
45
import androidx.activity.compose.BackHandler
56
import androidx.compose.animation.AnimatedVisibility
@@ -13,7 +14,6 @@ import androidx.compose.foundation.layout.Arrangement
1314
import androidx.compose.foundation.layout.Box
1415
import androidx.compose.foundation.layout.BoxScope
1516
import androidx.compose.foundation.layout.Column
16-
import androidx.compose.foundation.layout.Row
1717
import androidx.compose.foundation.layout.Spacer
1818
import androidx.compose.foundation.layout.fillMaxSize
1919
import androidx.compose.foundation.layout.fillMaxWidth
@@ -25,8 +25,6 @@ import androidx.compose.foundation.layout.width
2525
import androidx.compose.foundation.pager.HorizontalPager
2626
import androidx.compose.foundation.pager.rememberPagerState
2727
import androidx.compose.foundation.shape.RoundedCornerShape
28-
import androidx.compose.material3.Icon
29-
import androidx.compose.material3.IconButton
3028
import androidx.compose.material3.MaterialTheme
3129
import androidx.compose.material3.OutlinedButton
3230
import androidx.compose.material3.Scaffold
@@ -41,7 +39,6 @@ import androidx.compose.runtime.remember
4139
import androidx.compose.runtime.setValue
4240
import androidx.compose.ui.Alignment
4341
import androidx.compose.ui.Modifier
44-
import androidx.compose.ui.graphics.Color
4542
import androidx.compose.ui.graphics.graphicsLayer
4643
import androidx.compose.ui.layout.ContentScale
4744
import androidx.compose.ui.platform.LocalContext
@@ -68,7 +65,8 @@ import com.espressodev.gptmap.core.designsystem.Constants.MEDIUM_PADDING
6865
import com.espressodev.gptmap.core.designsystem.Constants.SMALL_PADDING
6966
import com.espressodev.gptmap.core.designsystem.GmIcons
7067
import com.espressodev.gptmap.core.designsystem.IconType
71-
import com.espressodev.gptmap.core.designsystem.component.LottieAnimationView
68+
import com.espressodev.gptmap.core.designsystem.component.GmDraggableButton
69+
import com.espressodev.gptmap.core.designsystem.component.LottieAnimationPlaceholder
7270
import com.espressodev.gptmap.core.designsystem.component.MapTextField
7371
import com.espressodev.gptmap.core.designsystem.component.ShimmerImage
7472
import com.espressodev.gptmap.core.designsystem.component.SquareButton
@@ -100,35 +98,14 @@ import com.espressodev.gptmap.core.designsystem.R.string as AppText
10098
@Composable
10199
fun MapRoute(
102100
navigateToStreetView: (Float, Float) -> Unit,
103-
navigateToFavourite: () -> Unit,
104101
navigateToScreenshot: () -> Unit,
105102
navigateToProfile: () -> Unit,
106-
navigateToScreenshotGallery: () -> Unit,
107103
favouriteId: String,
108104
modifier: Modifier = Modifier,
109105
viewModel: MapViewModel = hiltViewModel(),
110106
) {
111107
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
112108
Scaffold(
113-
bottomBar = {
114-
if (uiState.bottomSearchState) {
115-
MapSearchBar(
116-
value = uiState.searchValue,
117-
userFirstChar = 'F',
118-
onValueChange = { viewModel.onEvent(MapUiEvent.OnSearchValueChanged(it)) },
119-
onSearchClick = { viewModel.onEvent(MapUiEvent.OnSearchClick) },
120-
onAvatarClick = {}
121-
)
122-
}
123-
},
124-
topBar = {
125-
MapTopButtons(
126-
onFavouriteClick = navigateToFavourite,
127-
onScreenshotGalleryClick = navigateToScreenshotGallery,
128-
onAccountClick = navigateToProfile,
129-
modifier = modifier
130-
)
131-
},
132109
modifier = modifier
133110
) {
134111
MapScreen(
@@ -141,7 +118,7 @@ fun MapRoute(
141118
}
142119
)
143120
},
144-
modifier = Modifier.padding(top = it.calculateTopPadding())
121+
onAvatarClick = navigateToProfile
145122
)
146123
}
147124
SaveScreenshot(
@@ -164,6 +141,7 @@ fun MapRoute(
164141
private fun MapScreen(
165142
uiState: MapUiState,
166143
onEvent: (MapUiEvent) -> Unit,
144+
onAvatarClick: () -> Unit,
167145
modifier: Modifier = Modifier,
168146
) {
169147
val latLng by remember(uiState.location) {
@@ -181,6 +159,19 @@ private fun MapScreen(
181159
onDismiss = { onEvent(MapUiEvent.OnImageDismiss) }
182160
)
183161
Box(modifier = modifier.fillMaxSize()) {
162+
if (uiState.searchBarState) {
163+
MapSearchBar(
164+
value = uiState.searchValue,
165+
userFirstChar = uiState.userFirstChar,
166+
onValueChange = { onEvent(MapUiEvent.OnSearchValueChanged(it)) },
167+
onSearchClick = { onEvent(MapUiEvent.OnSearchClick) },
168+
onAvatarClick = onAvatarClick,
169+
modifier = Modifier
170+
.zIndex(1f)
171+
.align(Alignment.TopCenter)
172+
)
173+
}
174+
GmDraggableButton(icon = StreetView, initialAlignment = Alignment.CenterStart)
184175
LoadingDialog(uiState.componentLoadingState)
185176
MapSection(
186177
isPinVisible = uiState.isLocationPinVisible,
@@ -190,66 +181,6 @@ private fun MapScreen(
190181
}
191182
}
192183

193-
@Composable
194-
fun MapTopButtons(
195-
onFavouriteClick: () -> Unit,
196-
onScreenshotGalleryClick: () -> Unit,
197-
onAccountClick: () -> Unit,
198-
modifier: Modifier = Modifier
199-
) {
200-
Row(
201-
modifier = modifier
202-
.fillMaxWidth()
203-
.height(56.dp),
204-
verticalAlignment = Alignment.CenterVertically,
205-
horizontalArrangement = Arrangement.SpaceBetween
206-
) {
207-
GmIconButtonWithText(
208-
onClick = onAccountClick,
209-
icon = IconType.Vector(GmIcons.PersonDefault),
210-
)
211-
Text(text = "Gptmap", fontWeight = FontWeight.Medium)
212-
Row {
213-
GmIconButtonWithText(
214-
onClick = onFavouriteClick,
215-
icon = IconType.Vector(GmIcons.GalleryDefault),
216-
)
217-
GmIconButtonWithText(
218-
onClick = onScreenshotGalleryClick,
219-
icon = IconType.Vector(GmIcons.ScreenshotDefault),
220-
)
221-
}
222-
}
223-
}
224-
225-
@Composable
226-
fun GmIconButtonWithText(
227-
onClick: () -> Unit,
228-
icon: IconType,
229-
modifier: Modifier = Modifier,
230-
color: Color = MaterialTheme.colorScheme.onSurface
231-
) {
232-
IconButton(
233-
onClick = onClick,
234-
modifier = modifier.size(48.dp)
235-
) {
236-
when (icon) {
237-
is IconType.Vector -> Icon(
238-
imageVector = icon.imageVector,
239-
contentDescription = null,
240-
modifier = Modifier.size(32.dp),
241-
tint = color
242-
)
243-
244-
is IconType.Bitmap -> Image(
245-
painterResource(id = icon.painterId),
246-
null,
247-
modifier = Modifier.size(32.dp),
248-
)
249-
}
250-
}
251-
}
252-
253184
@Composable
254185
private fun AnimateCameraPosition(
255186
latLng: Pair<Double, Double>,
@@ -347,6 +278,7 @@ private fun MapSearchBar(
347278
onValueChange: (String) -> Unit,
348279
onSearchClick: () -> Unit,
349280
onAvatarClick: () -> Unit,
281+
modifier: Modifier = Modifier
350282
) {
351283
MapTextField(
352284
value = value,
@@ -355,7 +287,7 @@ private fun MapSearchBar(
355287
onValueChange = onValueChange,
356288
onSearchClick = onSearchClick,
357289
onAvatarClick = onAvatarClick,
358-
modifier = Modifier
290+
modifier = modifier
359291
.fillMaxWidth()
360292
.statusBarsPadding()
361293
.padding(8.dp),
@@ -392,7 +324,7 @@ private fun MapSection(isPinVisible: Boolean, cameraPositionState: CameraPositio
392324
}
393325

394326
if (!isMapLoaded) {
395-
LottieAnimationView(AppRaw.transistor_earth)
327+
LottieAnimationPlaceholder(AppRaw.transistor_earth)
396328
}
397329
}
398330

feature/map/src/main/kotlin/com/espressodev/gptmap/feature/map/MapUiState.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ enum class ComponentLoadingState {
1313
data class MapUiState(
1414
val searchValue: String = "",
1515
val location:Location = Location(),
16+
val userFirstChar: Char = 'H',
1617
val componentLoadingState: ComponentLoadingState = ComponentLoadingState.NOTHING,
1718
val bottomSheetState: MapBottomSheetState = MapBottomSheetState.BOTTOM_SHEET_HIDDEN,
1819
val searchButtonEnabledState: Boolean = true,
1920
val searchTextFieldEnabledState: Boolean = true,
20-
val bottomSearchState: Boolean = true,
21+
val searchBarState: Boolean = true,
2122
val isFavouriteButtonPlaying: Boolean = false,
2223
val isLocationPinVisible: Boolean = true,
2324
val takeScreenshotState: Boolean = false,

0 commit comments

Comments
 (0)