Skip to content

Commit 0109e62

Browse files
committed
refactor: visibility modifiers updated
1 parent a31eaea commit 0109e62

File tree

20 files changed

+129
-77
lines changed

20 files changed

+129
-77
lines changed

feature/delete-profile/src/main/kotlin/com/espressodev/gptmap/feature/delete_profile/DeleteProfileScreen.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import com.espressodev.gptmap.core.designsystem.R.string as AppText
4141

4242
@OptIn(ExperimentalMaterial3Api::class)
4343
@Composable
44-
fun DeleteProfileRoute(
44+
internal fun DeleteProfileRoute(
4545
navigateToLogin: () -> Unit,
4646
popUp: () -> Unit,
4747
modifier: Modifier = Modifier,
@@ -64,7 +64,7 @@ fun DeleteProfileRoute(
6464
onDeleteClick = viewModel::onDeleteClick
6565
)
6666
}
67-
67+
6868
if (isDialogOpened) {
6969
GmAlertDialog(
7070
title = AppText.delete_confirm,

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ import com.espressodev.gptmap.core.designsystem.R.string as AppText
5454

5555
@OptIn(ExperimentalMaterial3Api::class)
5656
@Composable
57-
fun FavouriteRoute(
57+
internal fun FavouriteRoute(
5858
popUp: () -> Unit,
5959
navigateToMap: (String) -> Unit,
6060
modifier: Modifier = Modifier,
@@ -134,7 +134,7 @@ fun FavouriteRoute(
134134
internal const val LazyColumnTestTag = "lazy_column_test_tag"
135135

136136
@Composable
137-
fun FavouriteScreen(
137+
private fun FavouriteScreen(
138138
favourites: List<Favourite>,
139139
selectedId: String,
140140
onCardClick: (String) -> Unit,
@@ -169,7 +169,7 @@ fun FavouriteScreen(
169169

170170
@OptIn(ExperimentalFoundationApi::class)
171171
@Composable
172-
fun FavouriteCard(
172+
private fun FavouriteCard(
173173
favourite: Favourite,
174174
isSelected: Boolean,
175175
onClick: () -> Unit,
@@ -225,7 +225,7 @@ fun FavouriteCard(
225225
}
226226

227227
@Composable
228-
fun InfoRow(
228+
private fun InfoRow(
229229
icon: ImageVector,
230230
text: String,
231231
modifier: Modifier = Modifier,

feature/forgot-password/src/main/kotlin/com/espressodev/gptmap/feature/forgot_password/ForgotPasswordScreen.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import com.espressodev.gptmap.core.model.LoadingState
3737
import com.espressodev.gptmap.core.designsystem.R.string as AppText
3838

3939
@Composable
40-
fun ForgotPasswordRoute(
40+
internal fun ForgotPasswordRoute(
4141
clearAndNavigateLogin: () -> Unit,
4242
viewModel: ForgotPasswordViewModel = hiltViewModel()
4343
) {
@@ -54,7 +54,7 @@ fun ForgotPasswordRoute(
5454
}
5555

5656
@Composable
57-
fun ForgotPasswordScreen(
57+
private fun ForgotPasswordScreen(
5858
email: String,
5959
onEmailChange: (String) -> Unit,
6060
onResetPasswordClick: () -> Unit,

feature/info/src/main/kotlin/com/espressodev/gptmap/feature/info/InfoRoute.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import com.espressodev.gptmap.core.designsystem.R.string as AppText
4040

4141
@OptIn(ExperimentalMaterial3Api::class)
4242
@Composable
43-
fun InfoRoute(popUp: () -> Unit, modifier: Modifier = Modifier) {
43+
internal fun InfoRoute(popUp: () -> Unit, modifier: Modifier = Modifier) {
4444
Scaffold(
4545
topBar = {
4646
GmTopAppBar(

feature/login/src/main/kotlin/com/espressodev/gptmap/feature/login/LoginScreen.kt

+33-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.espressodev.gptmap.feature.login
22

3+
import android.util.Log
34
import androidx.compose.foundation.layout.Column
45
import androidx.compose.foundation.layout.Row
56
import androidx.compose.foundation.layout.Spacer
@@ -9,7 +10,9 @@ import androidx.compose.material3.MaterialTheme
910
import androidx.compose.material3.Text
1011
import androidx.compose.material3.TextButton
1112
import androidx.compose.runtime.Composable
13+
import androidx.compose.runtime.LaunchedEffect
1214
import androidx.compose.runtime.getValue
15+
import androidx.compose.runtime.rememberUpdatedState
1316
import androidx.compose.ui.Alignment
1417
import androidx.compose.ui.Modifier
1518
import androidx.compose.ui.res.stringResource
@@ -33,19 +36,36 @@ import com.espressodev.gptmap.core.designsystem.R.drawable as AppDrawable
3336
import com.espressodev.gptmap.core.designsystem.R.string as AppText
3437

3538
@Composable
36-
fun LoginRoute(
39+
internal fun LoginRoute(
3740
navigateToMap: () -> Unit,
3841
navigateToRegister: () -> Unit,
3942
navigateToForgotPassword: () -> Unit,
4043
viewModel: LoginViewModel = hiltViewModel(),
4144
) {
4245
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
46+
val onEvent by rememberUpdatedState(
47+
newValue = { event: LoginEvent -> viewModel.onEvent(event) }
48+
)
49+
50+
val navigationState by viewModel.navigationState.collectAsStateWithLifecycle()
51+
LaunchedEffect(key1 = navigationState) {
52+
fun performNavigation(action: () -> Unit) {
53+
action()
54+
viewModel.resetNavigation()
55+
}
56+
when (navigationState) {
57+
is LoginNavigationState.NavigateToMap -> performNavigation(navigateToMap)
58+
is LoginNavigationState.NavigateToRegister -> performNavigation(navigateToRegister)
59+
is LoginNavigationState.NavigateToForgotPassword ->
60+
performNavigation(navigateToForgotPassword)
61+
LoginNavigationState.None -> Unit
62+
}
63+
}
64+
4365
if (uiState.loadingState is LoadingState.Loading) GmProgressIndicator()
4466
LoginScreen(
4567
uiState = uiState,
46-
onEvent = { event -> viewModel.onEvent(event, navigateToMap) },
47-
onNotMemberClick = navigateToRegister,
48-
onForgotPasswordClick = navigateToForgotPassword
68+
onEvent = { event -> onEvent(event) },
4969
)
5070
OneTapLauncher(
5171
oneTapClient = viewModel.oneTapClient,
@@ -57,13 +77,15 @@ fun LoginRoute(
5777
}
5878

5979
@Composable
60-
fun LoginScreen(
80+
private fun LoginScreen(
6181
uiState: LoginUiState,
6282
onEvent: (LoginEvent) -> Unit,
63-
onNotMemberClick: () -> Unit,
64-
onForgotPasswordClick: () -> Unit,
6583
modifier: Modifier = Modifier
6684
) {
85+
LaunchedEffect(key1 = onEvent) {
86+
Log.d("LoginScreen", "LoginScreen: onEvent")
87+
}
88+
6789
AppWrapper(modifier) {
6890
LoginHeader()
6991
DefaultTextField(
@@ -80,7 +102,7 @@ fun LoginScreen(
80102
onValueChange = { onEvent(LoginEvent.OnPasswordChanged(it)) }
81103
)
82104
TextButton(
83-
onClick = onForgotPasswordClick,
105+
onClick = { onEvent(LoginEvent.OnForgotPasswordClicked) },
84106
modifier = Modifier.align(Alignment.End)
85107
) {
86108
Text(stringResource(AppText.forgot_password))
@@ -110,7 +132,7 @@ fun LoginScreen(
110132
text = stringResource(id = AppText.not_a_member),
111133
style = MaterialTheme.typography.titleMedium
112134
)
113-
TextButton(onClick = onNotMemberClick) {
135+
TextButton(onClick = { onEvent(LoginEvent.OnNotMemberClicked) }) {
114136
Text(
115137
text = stringResource(id = AppText.register_now),
116138
style = MaterialTheme.typography.titleMedium
@@ -121,7 +143,7 @@ fun LoginScreen(
121143
}
122144

123145
@Composable
124-
fun LoginHeader(modifier: Modifier = Modifier) {
146+
private fun LoginHeader(modifier: Modifier = Modifier) {
125147
HeaderWrapper(modifier = modifier) {
126148
Text(
127149
text = stringResource(AppText.login_header),
@@ -139,5 +161,5 @@ fun LoginHeader(modifier: Modifier = Modifier) {
139161
@Preview(showBackground = true)
140162
@Composable
141163
private fun LoginScreenPreview() {
142-
LoginScreen(LoginUiState("Fatih"), {}, {}, {})
164+
LoginScreen(LoginUiState("Fatih"), {})
143165
}

feature/login/src/main/kotlin/com/espressodev/gptmap/feature/login/LoginUiState.kt

+9
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,13 @@ sealed class LoginEvent {
1919
data class OnLoadingStateChanged(val state: LoadingState) : LoginEvent()
2020
data object OnGoogleClicked : LoginEvent()
2121
data object OnLoginClicked : LoginEvent()
22+
data object OnForgotPasswordClicked : LoginEvent()
23+
data object OnNotMemberClicked : LoginEvent()
24+
}
25+
26+
sealed class LoginNavigationState {
27+
data object None : LoginNavigationState()
28+
data object NavigateToMap : LoginNavigationState()
29+
data object NavigateToRegister : LoginNavigationState()
30+
data object NavigateToForgotPassword : LoginNavigationState()
2231
}

feature/login/src/main/kotlin/com/espressodev/gptmap/feature/login/LoginViewModel.kt

+17-9
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import com.espressodev.gptmap.core.model.google.GoogleResponse
1111
import com.google.android.gms.auth.api.identity.SignInClient
1212
import com.google.firebase.auth.AuthCredential
1313
import dagger.hilt.android.lifecycle.HiltViewModel
14-
import kotlinx.coroutines.delay
1514
import kotlinx.coroutines.flow.MutableStateFlow
1615
import kotlinx.coroutines.flow.asStateFlow
1716
import kotlinx.coroutines.flow.update
@@ -27,35 +26,44 @@ class LoginViewModel @Inject constructor(
2726
private val _uiState = MutableStateFlow(LoginUiState())
2827
val uiState = _uiState.asStateFlow()
2928

29+
private val _navigationState = MutableStateFlow<LoginNavigationState>(LoginNavigationState.None)
30+
val navigationState = _navigationState.asStateFlow()
31+
3032
private val email get() = uiState.value.email
3133
private val password get() = uiState.value.password
3234

33-
fun onEvent(event: LoginEvent, navigateToMap: () -> Unit = {}) {
35+
fun onEvent(event: LoginEvent) {
3436
when (event) {
3537
is LoginEvent.OnEmailChanged -> _uiState.update { it.copy(email = event.email) }
3638
LoginEvent.OnGoogleClicked -> oneTapSignIn()
37-
LoginEvent.OnLoginClicked -> onLoginClick(navigateToMap)
39+
LoginEvent.OnLoginClicked -> onLoginClick()
3840
is LoginEvent.OnPasswordChanged -> _uiState.update { it.copy(password = event.password) }
3941
is LoginEvent.OnLoadingStateChanged -> _uiState.update { it.copy(loadingState = event.state) }
42+
LoginEvent.OnForgotPasswordClicked ->
43+
_navigationState.update { LoginNavigationState.NavigateToForgotPassword }
44+
LoginEvent.OnNotMemberClicked -> _navigationState.update { LoginNavigationState.NavigateToRegister }
4045
}
4146
}
4247

43-
private fun onLoginClick(navigateToMap: () -> Unit) = launchCatching {
48+
fun resetNavigation() {
49+
_navigationState.update { LoginNavigationState.None }
50+
}
51+
52+
private fun onLoginClick() = launchCatching {
4453
if (!formValidation()) return@launchCatching
45-
onEvent(LoginEvent.OnLoadingStateChanged(LoadingState.Loading))
54+
_uiState.update { it.copy(loadingState = LoadingState.Loading) }
4655

4756
authenticationRepository.signInWithEmailAndPassword(email, password)
4857
.onSuccess {
49-
onEvent(LoginEvent.OnLoadingStateChanged(LoadingState.Idle))
50-
delay(25L)
51-
navigateToMap()
58+
_uiState.update { it.copy(loadingState = LoadingState.Idle) }
59+
_navigationState.update { LoginNavigationState.NavigateToMap }
5260
}.onFailure {
5361
if (it is FirebaseEmailVerificationIsFalseException) {
5462
SnackbarManager.showMessage(AppText.please_verify_email)
5563
} else {
5664
it.message?.let { message -> SnackbarManager.showMessage(message) }
5765
}
58-
onEvent(LoginEvent.OnLoadingStateChanged(LoadingState.Idle))
66+
_uiState.update { uiState -> uiState.copy(loadingState = LoadingState.Idle) }
5967
}
6068
}
6169

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ internal fun BoxScope.DetailSheet(
102102
}
103103

104104
@Composable
105-
fun LocationImages(
105+
private fun LocationImages(
106106
images: List<LocationImage>,
107107
onClick: (Int) -> Unit,
108108
modifier: Modifier = Modifier
@@ -125,7 +125,7 @@ fun LocationImages(
125125
}
126126

127127
@Composable
128-
fun BoxScope.UnsplashBanner(name: String, modifier: Modifier = Modifier) {
128+
internal fun BoxScope.UnsplashBanner(name: String, modifier: Modifier = Modifier) {
129129
Surface(
130130
modifier = modifier
131131
.align(Alignment.BottomEnd)

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

-2
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,3 @@ fun NavGraphBuilder.mapScreen(
4343
)
4444
}
4545
}
46-
47-

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

+24-7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package com.espressodev.gptmap.feature.map
55
import StreetView
66
import android.annotation.SuppressLint
77
import androidx.activity.compose.BackHandler
8+
import androidx.activity.compose.ReportDrawnWhen
89
import androidx.compose.animation.AnimatedVisibility
910
import androidx.compose.animation.core.LinearEasing
1011
import androidx.compose.animation.core.animateFloatAsState
@@ -40,11 +41,15 @@ import androidx.compose.runtime.remember
4041
import androidx.compose.runtime.rememberUpdatedState
4142
import androidx.compose.runtime.setValue
4243
import androidx.compose.ui.Alignment
44+
import androidx.compose.ui.ExperimentalComposeUiApi
4345
import androidx.compose.ui.Modifier
4446
import androidx.compose.ui.graphics.graphicsLayer
4547
import androidx.compose.ui.layout.ContentScale
4648
import androidx.compose.ui.platform.LocalContext
49+
import androidx.compose.ui.platform.testTag
4750
import androidx.compose.ui.res.stringResource
51+
import androidx.compose.ui.semantics.semantics
52+
import androidx.compose.ui.semantics.testTagsAsResourceId
4853
import androidx.compose.ui.text.font.FontStyle
4954
import androidx.compose.ui.text.font.FontWeight
5055
import androidx.compose.ui.text.style.TextAlign
@@ -93,9 +98,10 @@ import com.espressodev.gptmap.core.designsystem.R.drawable as AppDrawable
9398
import com.espressodev.gptmap.core.designsystem.R.raw as AppRaw
9499
import com.espressodev.gptmap.core.designsystem.R.string as AppText
95100

101+
@OptIn(ExperimentalComposeUiApi::class)
96102
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
97103
@Composable
98-
fun MapRoute(
104+
internal fun MapRoute(
99105
navigateToStreetView: (Pair<Float, Float>) -> Unit,
100106
navigateToScreenshot: () -> Unit,
101107
navigateToProfile: () -> Unit,
@@ -144,9 +150,17 @@ fun MapRoute(
144150
viewModel.onEvent(event)
145151
}
146152
)
153+
val googleMapTestTag = "map:MapScreen"
147154

148-
Scaffold(modifier = modifier.padding(bottom = BOTTOM_BAR_PADDING)) {
149-
uiState.MapScreen(onEvent = { event -> onEvent(event) })
155+
Scaffold(
156+
modifier = modifier
157+
.padding(bottom = BOTTOM_BAR_PADDING)
158+
.semantics { testTagsAsResourceId = true }
159+
) {
160+
uiState.MapScreen(
161+
onEvent = { event -> onEvent(event) },
162+
modifier = Modifier.testTag(googleMapTestTag)
163+
)
150164
}
151165

152166
LaunchedEffect(uiState.screenshotState) {
@@ -243,12 +257,12 @@ private fun BoxScope.DisplayBottomSheet(
243257

244258
DETAIL_CARD -> DetailSheet(location = location, onEvent = onEvent, modifier = modifier)
245259

246-
BOTTOM_SHEET_HIDDEN -> {}
260+
BOTTOM_SHEET_HIDDEN -> Unit
247261
}
248262
}
249263

250264
@Composable
251-
fun BoxScope.MyCurrentLocationButton(onClick: () -> Unit, modifier: Modifier = Modifier) {
265+
private fun BoxScope.MyCurrentLocationButton(onClick: () -> Unit, modifier: Modifier = Modifier) {
252266
val locationPermissionState = rememberMultiplePermissionsState(
253267
permissions = listOf(
254268
android.Manifest.permission.ACCESS_FINE_LOCATION,
@@ -414,6 +428,9 @@ private fun MapSection(cameraPositionState: CameraPositionState) {
414428
modifier = Modifier.zIndex(2f)
415429
)
416430
}
431+
432+
ReportDrawnWhen { isMapLoaded }
433+
417434
GoogleMap(
418435
modifier = Modifier.fillMaxSize(),
419436
cameraPositionState = cameraPositionState,
@@ -469,7 +486,7 @@ private fun BoxScope.LoadingDialog(
469486
}
470487

471488
@Composable
472-
fun DefaultLoadingAnimation(modifier: Modifier = Modifier) {
489+
private fun DefaultLoadingAnimation(modifier: Modifier = Modifier) {
473490
val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(AppRaw.map_loading_anim))
474491
val progress by animateLottieCompositionAsState(composition)
475492

@@ -515,7 +532,7 @@ private fun BoxScope.LocationPin(
515532
}
516533

517534
@Composable
518-
fun BoxScope.SmallInformationCard(
535+
private fun BoxScope.SmallInformationCard(
519536
city: String,
520537
country: String,
521538
poeticDesc: String,

0 commit comments

Comments
 (0)