Skip to content

Commit

Permalink
[feat/#76] snackbar 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
Mnseo committed Feb 7, 2024
1 parent 1296d4c commit 3b29ac7
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.kusitms.presentation.common.ui

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.material.SnackbarHost
import androidx.compose.material.SnackbarHostState
import androidx.compose.material3.Card
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.modifier.modifierLocalConsumer
import androidx.compose.ui.unit.dp
import com.kusitms.presentation.common.ui.theme.KusitmsColorPalette


@Composable
fun KusitmsSnackBar(
text:String,
content: @Composable () -> Unit
): @Composable (SnackbarHostState) -> Unit =
{ snackbarHostState: SnackbarHostState ->
SnackbarHost(
hostState = snackbarHostState
) { snackbarData ->
Box(modifier = androidx.compose.ui.Modifier
.fillMaxWidth()
.height(48.dp)
.padding(horizontal = 20.dp)
.background(color = KusitmsColorPalette.current.Grey600)
) {
Row(
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight()
.padding(horizontal = 24.dp),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically
) {
content
}
}

}
}

Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.kusitms.presentation.model.signIn

import androidx.compose.material.SnackbarDuration
import androidx.compose.material.SnackbarHostState
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.kusitms.domain.usecase.home.GetNetworkStatusUseCase
Expand All @@ -11,7 +13,7 @@ import kotlinx.coroutines.launch
import javax.inject.Inject


enum class TokenStatus { VALID, INVALID, DEFAULT }
enum class TokenStatus { VALID, INVALID, DEFAULT, SERVER }

@HiltViewModel
class SplashViewModel @Inject constructor(
Expand All @@ -22,17 +24,28 @@ class SplashViewModel @Inject constructor(
private val _tokenStatus = MutableStateFlow(TokenStatus.DEFAULT)
val tokenStatus: StateFlow<TokenStatus> = _tokenStatus

private val _networkStatus = MutableStateFlow(false)
private val _networkStatus = MutableStateFlow(true)
val networkStatus : StateFlow<Boolean> = _networkStatus

fun updateTokenStatus(tokenStatus: TokenStatus) {
_tokenStatus.value = tokenStatus
}
val snackbarHostState = SnackbarHostState()

fun updateNetworkStatus(networkStatus: Boolean) {
_networkStatus.value = networkStatus
fun showInvalidTokenMessage() {
viewModelScope.launch {
val message = when {
tokenStatus.value == TokenStatus.INVALID -> "토큰 상태가 유효하지 않습니다"
!networkStatus.value -> "네트워크 연결 상태를 확인하세요"
else -> return@launch
}
snackbarHostState.showSnackbar(
message = message,
duration = SnackbarDuration.Long
)
}
}

fun updateTokenStatus(tokenStatus: TokenStatus) {
_tokenStatus.value = tokenStatus
}
init {
verifyToken()
}
Expand All @@ -46,7 +59,8 @@ class SplashViewModel @Inject constructor(
if(_networkStatus.value) {
updateTokenStatus(TokenStatus.VALID)
} else {
updateTokenStatus(TokenStatus.INVALID)
updateTokenStatus(TokenStatus.SERVER)
showInvalidTokenMessage()
}
} else {
// 토큰이 존재하지 않는 경우 (로그인 전)
Expand All @@ -55,9 +69,8 @@ class SplashViewModel @Inject constructor(
}
.onFailure {
updateTokenStatus(TokenStatus.INVALID)
showInvalidTokenMessage()
}
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ import android.util.Log
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Scaffold
import androidx.compose.material.SnackbarData
import androidx.compose.material.SnackbarHost
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
Expand All @@ -21,6 +25,8 @@ import coil.request.ImageRequest
import coil.size.Size
import coil.size.Size.Companion.ORIGINAL
import com.kusitms.presentation.R
import com.kusitms.presentation.common.ui.KusitmsMarginVerticalSpacer
import com.kusitms.presentation.common.ui.KusitmsSnackBar
import com.kusitms.presentation.common.ui.theme.KusitmsColorPalette
import com.kusitms.presentation.common.ui.theme.KusitmsTypo
import com.kusitms.presentation.model.signIn.SplashViewModel
Expand All @@ -31,6 +37,12 @@ import kotlinx.coroutines.delay
@Composable
fun SplashScreen(viewModel: SplashViewModel, navController: NavController) {
val tokenStatus by viewModel.tokenStatus.collectAsState()
val snackbarHostState = remember { viewModel.snackbarHostState }

val snackbarMessage = when (tokenStatus) {
TokenStatus.INVALID -> "토큰 상태가 유효하지 않습니다"
TokenStatus.SERVER -> "네트워크 연결이 끊어졌습니다" else -> ""
}

LaunchedEffect(tokenStatus) {
viewModel.verifyToken()
Expand All @@ -41,7 +53,8 @@ fun SplashScreen(viewModel: SplashViewModel, navController: NavController) {
popUpTo(NavRoutes.SplashScreen.route) { inclusive = true }
}
}
TokenStatus.DEFAULT, TokenStatus.INVALID -> {
TokenStatus.DEFAULT, TokenStatus.INVALID, TokenStatus.SERVER -> {
viewModel.showInvalidTokenMessage()
delay(2000)
navController.navigate(NavRoutes.LogInScreen.route) {
popUpTo(NavRoutes.SplashScreen.route) { inclusive = true }
Expand All @@ -51,7 +64,43 @@ fun SplashScreen(viewModel: SplashViewModel, navController: NavController) {
}
}

Splash()
Scaffold(
snackbarHost = { SnackbarHost(
hostState = snackbarHostState,
snackbar = {snackbarData: SnackbarData ->
Box(modifier = androidx.compose.ui.Modifier
.fillMaxWidth()
.height(48.dp)
.padding(horizontal = 20.dp)
.background(
color = KusitmsColorPalette.current.Grey600,
shape = RoundedCornerShape(12.dp)
)
) {
Row(
modifier = Modifier
.fillMaxWidth()
.fillMaxHeight()
.padding(horizontal = 24.dp),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically
) {
Text(text= snackbarMessage, color = KusitmsColorPalette.current.Grey200, style= KusitmsTypo.current.Text_Semibold)
}
}
KusitmsMarginVerticalSpacer(size = 40)
}
) }
) {
Column(
Modifier
.fillMaxSize()
.padding(it)
) {
Splash()
}
}

}

@Composable
Expand Down

0 comments on commit 3b29ac7

Please sign in to comment.