Skip to content

Commit 22014c1

Browse files
committed
refactor: top bar added
1 parent fdb51f9 commit 22014c1

File tree

3 files changed

+56
-93
lines changed

3 files changed

+56
-93
lines changed

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

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

33
import android.annotation.SuppressLint
4-
import android.util.Log
54
import androidx.activity.compose.BackHandler
65
import androidx.compose.animation.AnimatedVisibility
76
import androidx.compose.animation.core.LinearEasing
@@ -29,20 +28,22 @@ import androidx.compose.foundation.pager.HorizontalPager
2928
import androidx.compose.foundation.pager.rememberPagerState
3029
import androidx.compose.foundation.shape.RoundedCornerShape
3130
import androidx.compose.material3.BottomAppBar
32-
import androidx.compose.material3.FloatingActionButton
31+
import androidx.compose.material3.CenterAlignedTopAppBar
32+
import androidx.compose.material3.ExperimentalMaterial3Api
3333
import androidx.compose.material3.Icon
34+
import androidx.compose.material3.IconButton
3435
import androidx.compose.material3.MaterialTheme
3536
import androidx.compose.material3.OutlinedButton
3637
import androidx.compose.material3.Scaffold
3738
import androidx.compose.material3.Surface
3839
import androidx.compose.material3.Text
40+
import androidx.compose.material3.TopAppBarDefaults
3941
import androidx.compose.runtime.Composable
4042
import androidx.compose.runtime.LaunchedEffect
4143
import androidx.compose.runtime.derivedStateOf
4244
import androidx.compose.runtime.getValue
4345
import androidx.compose.runtime.mutableStateOf
4446
import androidx.compose.runtime.remember
45-
import androidx.compose.runtime.saveable.rememberSaveable
4647
import androidx.compose.runtime.setValue
4748
import androidx.compose.ui.Alignment
4849
import androidx.compose.ui.Modifier
@@ -67,7 +68,6 @@ import com.airbnb.lottie.compose.LottieAnimation
6768
import com.airbnb.lottie.compose.LottieCompositionSpec
6869
import com.airbnb.lottie.compose.animateLottieCompositionAsState
6970
import com.airbnb.lottie.compose.rememberLottieComposition
70-
import com.espressodev.gptmap.core.common.splash_navigation.SplashNavigationManager
7171
import com.espressodev.gptmap.core.designsystem.Constants.HIGH_PADDING
7272
import com.espressodev.gptmap.core.designsystem.Constants.MAX_PADDING
7373
import com.espressodev.gptmap.core.designsystem.Constants.MEDIUM_PADDING
@@ -82,7 +82,6 @@ import com.espressodev.gptmap.core.designsystem.component.SquareButton
8282
import com.espressodev.gptmap.core.designsystem.theme.GptmapTheme
8383
import com.espressodev.gptmap.core.model.Location
8484
import com.espressodev.gptmap.core.model.chatgpt.Content
85-
import com.espressodev.gptmap.core.model.chatgpt.Coordinates
8685
import com.espressodev.gptmap.core.model.unsplash.LocationImage
8786
import com.espressodev.gptmap.core.save_screenshot.composable.SaveScreenshot
8887
import com.espressodev.gptmap.feature.map.ComponentLoadingState.MAP
@@ -129,13 +128,18 @@ fun MapRoute(
129128
)
130129
}
131130
},
131+
topBar = {
132+
MapTopButtons(
133+
onFavouriteClick = navigateToFavourite,
134+
onScreenshotGalleryClick = navigateToScreenshotGallery,
135+
onAccountClick = navigateToProfile,
136+
modifier = modifier
137+
)
138+
},
132139
modifier = modifier
133140
) {
134141
MapScreen(
135142
uiState = uiState,
136-
onFavouriteClick = navigateToFavourite,
137-
onScreenshotGalleryClick = navigateToScreenshotGallery,
138-
onProfileClick = navigateToProfile,
139143
onEvent = { event ->
140144
viewModel.onEvent(
141145
event = event,
@@ -144,7 +148,7 @@ fun MapRoute(
144148
}
145149
)
146150
},
147-
modifier = Modifier.statusBarsPadding()
151+
modifier = Modifier.padding(top = it.calculateTopPadding())
148152
)
149153
}
150154
SaveScreenshot(
@@ -166,9 +170,6 @@ fun MapRoute(
166170
@Composable
167171
private fun MapScreen(
168172
uiState: MapUiState,
169-
onFavouriteClick: () -> Unit,
170-
onScreenshotGalleryClick: () -> Unit,
171-
onProfileClick: () -> Unit,
172173
onEvent: (MapUiEvent) -> Unit,
173174
modifier: Modifier = Modifier,
174175
) {
@@ -186,13 +187,6 @@ private fun MapScreen(
186187
location = uiState.location,
187188
onDismiss = { onEvent(MapUiEvent.OnImageDismiss) }
188189
)
189-
MapTopButtons(
190-
isVisible = uiState.isTopButtonsVisible,
191-
onFavouriteClick = onFavouriteClick,
192-
onScreenshotGalleryClick = onScreenshotGalleryClick,
193-
onAccountClick = onProfileClick,
194-
modifier = modifier
195-
)
196190
Box(modifier = modifier.fillMaxSize()) {
197191
LoadingDialog(uiState.componentLoadingState)
198192
MapSection(
@@ -203,64 +197,62 @@ private fun MapScreen(
203197
}
204198
}
205199

200+
@OptIn(ExperimentalMaterial3Api::class)
206201
@Composable
207202
fun MapTopButtons(
208-
isVisible: Boolean,
209203
onFavouriteClick: () -> Unit,
210204
onScreenshotGalleryClick: () -> Unit,
211205
onAccountClick: () -> Unit,
212206
modifier: Modifier = Modifier
213207
) {
214-
Box(
215-
modifier = modifier
216-
.fillMaxSize()
217-
.zIndex(1f)
218-
.padding(8.dp)
219-
) {
220-
AnimatedVisibility(
221-
visible = isVisible,
222-
modifier = Modifier.align(Alignment.TopEnd)
223-
) {
224-
Column(
225-
verticalArrangement = Arrangement.spacedBy(8.dp)
226-
) {
227-
GmFloatingButton(onFavouriteClick, IconType.Vector(GmIcons.GalleryDefault))
228-
GmFloatingButton(
229-
onScreenshotGalleryClick,
230-
IconType.Vector(GmIcons.ScreenshotDefault)
231-
)
232-
}
233-
}
234-
AnimatedVisibility(visible = isVisible) {
235-
GmFloatingButton(
208+
CenterAlignedTopAppBar(
209+
title = { Text(text = "Gptmap", fontWeight = FontWeight.Medium) },
210+
navigationIcon = {
211+
GmIconButtonWithText(
236212
onClick = onAccountClick,
237213
icon = IconType.Vector(GmIcons.PersonDefault),
238-
containerColor = MaterialTheme.colorScheme.secondaryContainer,
239214
)
240-
}
241-
}
215+
},
216+
actions = {
217+
GmIconButtonWithText(
218+
onClick = onFavouriteClick,
219+
icon = IconType.Vector(GmIcons.GalleryDefault),
220+
)
221+
GmIconButtonWithText(
222+
onClick = onScreenshotGalleryClick,
223+
icon = IconType.Vector(GmIcons.ScreenshotDefault),
224+
)
225+
},
226+
modifier = modifier,
227+
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
228+
containerColor = Color.Transparent
229+
)
230+
)
242231
}
243232

244233
@Composable
245-
fun GmFloatingButton(
234+
fun GmIconButtonWithText(
246235
onClick: () -> Unit,
247236
icon: IconType,
248237
modifier: Modifier = Modifier,
249-
containerColor: Color = MaterialTheme.colorScheme.secondaryContainer,
250-
contentColor: Color = MaterialTheme.colorScheme.onSecondaryContainer
238+
color: Color = MaterialTheme.colorScheme.onSurface
251239
) {
252-
FloatingActionButton(
240+
IconButton(
253241
onClick = onClick,
254-
containerColor = containerColor,
255-
contentColor = contentColor,
256-
modifier = modifier
242+
modifier = modifier.size(48.dp)
257243
) {
258244
when (icon) {
259-
is IconType.Vector -> Icon(icon.imageVector, null, modifier = Modifier.size(36.dp))
245+
is IconType.Vector -> Icon(
246+
imageVector = icon.imageVector,
247+
contentDescription = null,
248+
modifier = Modifier.size(32.dp),
249+
tint = color
250+
)
251+
260252
is IconType.Bitmap -> Image(
261253
painterResource(id = icon.painterId),
262254
null,
263-
modifier = Modifier.size(36.dp)
255+
modifier = Modifier.size(32.dp),
264256
)
265257
}
266258
}
@@ -364,10 +356,11 @@ private fun MapBottomBar(
364356
onValueChange: (String) -> Unit,
365357
onSearchClick: () -> Unit,
366358
) {
367-
BottomAppBar(
359+
Surface(
368360
modifier = Modifier
361+
.height(80.dp)
369362
.imePadding()
370-
.navigationBarsPadding()
363+
.navigationBarsPadding(),
371364
) {
372365
Row(
373366
modifier = Modifier
@@ -596,42 +589,14 @@ fun BoxScope.SmallInformationCard(
596589
}
597590
}
598591

599-
600592
@Preview(showBackground = true)
601593
@Composable
602594
fun MapPreview() {
603595
GptmapTheme {
604-
MapScreen(
605-
uiState = MapUiState(
606-
searchValue = "",
607-
location = Location(
608-
id = "", content = Content(
609-
coordinates = Coordinates(
610-
latitude = 0.0,
611-
longitude = 0.0
612-
),
613-
city = "",
614-
district = null,
615-
country = "",
616-
poeticDescription = "",
617-
normalDescription = ""
618-
), locationImages = listOf(), addToFavouriteButtonState = false
619-
),
620-
componentLoadingState = MAP,
621-
bottomSheetState = SMALL_INFORMATION_CARD,
622-
searchButtonEnabledState = false,
623-
searchTextFieldEnabledState = false,
624-
bottomSearchState = false,
625-
isTopButtonsVisible = true,
626-
isFavouriteButtonPlaying = false,
627-
isLocationPinVisible = false,
628-
takeScreenshotState = false,
629-
imageGalleryState = Pair(0, false)
630-
),
631-
{},
632-
{},
633-
{},
634-
onEvent = {}
596+
MapTopButtons(
597+
onFavouriteClick = {},
598+
onScreenshotGalleryClick = {},
599+
onAccountClick = {},
635600
)
636601
}
637602
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ data class MapUiState(
1818
val searchButtonEnabledState: Boolean = true,
1919
val searchTextFieldEnabledState: Boolean = true,
2020
val bottomSearchState: Boolean = true,
21-
val isTopButtonsVisible: Boolean = true,
2221
val isFavouriteButtonPlaying: Boolean = false,
2322
val isLocationPinVisible: Boolean = true,
2423
val takeScreenshotState: Boolean = false,

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class MapViewModel @Inject constructor(
6363

6464
is MapUiEvent.OnTakeScreenshotClick -> _uiState.update { it.copy(takeScreenshotState = true) }
6565
is MapUiEvent.OnScreenshotProcessStarted -> _uiState.update {
66-
it.copy(isTopButtonsVisible = false, isLocationPinVisible = false)
66+
it.copy(isLocationPinVisible = false)
6767
}
6868
}
6969
}
@@ -110,7 +110,6 @@ class MapViewModel @Inject constructor(
110110
}
111111
}
112112

113-
114113
private fun onFavouriteClick() = launchCatching {
115114
uiState.value.location.also { location ->
116115
_uiState.update { state ->
@@ -131,7 +130,7 @@ class MapViewModel @Inject constructor(
131130
}
132131

133132
fun reset() = launchCatching {
134-
_uiState.update { it.copy(isTopButtonsVisible = true, isLocationPinVisible = true) }
133+
_uiState.update { it.copy(isLocationPinVisible = true) }
135134
}
136135

137136
private fun onStreetViewClick(
@@ -170,4 +169,4 @@ class MapViewModel @Inject constructor(
170169
)
171170
}
172171
}
173-
}
172+
}

0 commit comments

Comments
 (0)