Skip to content

Commit

Permalink
feat: 홈 입장하기 뷰 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
CChuYong committed Jan 13, 2024
1 parent 858fb42 commit dd0c274
Show file tree
Hide file tree
Showing 17 changed files with 712 additions and 137 deletions.
60 changes: 34 additions & 26 deletions app/src/main/java/com/no5ing/bbibbi/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import com.no5ing.bbibbi.presentation.ui.navigation.destination.LandingAlreadyFa
import com.no5ing.bbibbi.presentation.ui.navigation.destination.NavigationDestination.Companion.navigate
import com.no5ing.bbibbi.presentation.ui.theme.BbibbiTheme
import com.no5ing.bbibbi.presentation.ui.theme.bbibbiScheme
import com.no5ing.bbibbi.util.LocalDeepLinkState
import com.no5ing.bbibbi.util.LocalNavigateControllerState
import com.no5ing.bbibbi.util.LocalSessionState
import com.no5ing.bbibbi.util.LocalSnackbarHostState
Expand All @@ -49,6 +50,7 @@ import com.skydoves.sandwich.suspendOnFailure
import com.skydoves.sandwich.suspendOnSuccess
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.tasks.await
import timber.log.Timber
Expand All @@ -67,6 +69,8 @@ class MainActivity : ComponentActivity() {

private var localNavController: NavHostController? = null

private val deepLinkStateFlow = MutableStateFlow<String?>(null)

override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
//HANDLE FOREGROUND INTENT (already app is active)
Expand All @@ -79,6 +83,7 @@ class MainActivity : ComponentActivity() {
Timber.d("onAppStartIntent: $intent")
val appLinkData: Uri? = intent?.data
val linkId = appLinkData?.let {
deepLinkStateFlow.value = it.toString()
getLinkIdFromUrl(it.toString())
}
if (linkId != null) {
Expand All @@ -94,7 +99,7 @@ class MainActivity : ComponentActivity() {
"FAMILY_REGISTRATION" -> {
val sessionState = sessionModule.sessionState.value
if (!sessionState.isLoggedIn() || !sessionState.hasFamily()) {
localDataStorage.setRegistrationToken(linkId)
//localDataStorage.setRegistrationToken(linkId)
} else {
//님머함?
runOnUiThread {
Expand Down Expand Up @@ -190,6 +195,7 @@ class MainActivity : ComponentActivity() {
val navController = rememberAnimatedNavController()
val snackBarHostState = remember { SnackbarHostState() }
val sessionState by sessionModule.sessionState.collectAsState()
val deepLinkState by deepLinkStateFlow.collectAsState()
DisposableEffect(navController) {
localNavController = navController
navController
Expand Down Expand Up @@ -224,32 +230,34 @@ class MainActivity : ComponentActivity() {
CompositionLocalProvider(
LocalNavigateControllerState provides navController
) {
BbibbiTheme {
Surface(
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.bbibbiScheme.backgroundPrimary)
.statusBarsPadding(),
color = MaterialTheme.bbibbiScheme.backgroundPrimary
) {
AnimatedVisibility(visible = isReady) {
LaunchedEffect(sessionState) {
Timber.d("[MainActivity] Session State Changed to $sessionState")
if (sessionState.isLoggedIn()) {
localDataStorage.setAuthTokens(sessionState.apiToken)
} else {
localDataStorage.logOut()
CompositionLocalProvider(value = LocalDeepLinkState provides deepLinkState) {
BbibbiTheme {
Surface(
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.bbibbiScheme.backgroundPrimary)
.statusBarsPadding(),
color = MaterialTheme.bbibbiScheme.backgroundPrimary
) {
AnimatedVisibility(visible = isReady) {
LaunchedEffect(sessionState) {
Timber.d("[MainActivity] Session State Changed to $sessionState")
if (sessionState.isLoggedIn()) {
localDataStorage.setAuthTokens(sessionState.apiToken)
} else {
localDataStorage.logOut()
}
}
CompositionLocalProvider(
LocalSessionState provides sessionState
) {
MainPage(
snackBarHostState = snackBarHostState,
navController = navController,
isAlreadyLoggedIn = sessionState.isLoggedIn()
&& sessionState.hasFamily(),
)
}
}
CompositionLocalProvider(
LocalSessionState provides sessionState
) {
MainPage(
snackBarHostState = snackBarHostState,
navController = navController,
isAlreadyLoggedIn = sessionState.isLoggedIn()
&& sessionState.hasFamily(),
)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,28 +69,6 @@ class LocalDataStorage @Inject constructor(val context: Context) {
editor.commit()
}

fun setRegistrationToken(token: String) {
val editor = preferences.edit()
editor.putString(REGISTRATION_TOKEN_KEY, token)
editor.apply()
editor.commit()
}

fun getAndDeleteRegistrationToken(): String? {
val token = preferences.getString(REGISTRATION_TOKEN_KEY, null)
if (token != null) {
val editor = preferences.edit()
editor.remove(REGISTRATION_TOKEN_KEY)
editor.apply()
editor.commit()
}
return token
}

fun hasRegistrationToken(): Boolean {
return preferences.contains(REGISTRATION_TOKEN_KEY)
}

fun setLandingSeen() {
val editor = preferences.edit()
editor.putBoolean(LANDING_SEEN_KEY, true)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.no5ing.bbibbi.presentation.state.landing.join_family_with_link

import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.Stable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember

@Stable
data class JoinFamilyWithLinkPageState(
val ctaButtonEnabledState: MutableState<Boolean>,
val nicknameTextState: MutableState<String>,
val isInvalidInputState: MutableState<Boolean>,
)

@Composable
fun rememberJoinFamilyWithLinkPageState(
ctaButtonEnabledState: MutableState<Boolean> = remember { mutableStateOf(false) },
nicknameTextState: MutableState<String> = remember { mutableStateOf("") },
isInvalidInputState: MutableState<Boolean> = remember { mutableStateOf(false) },
): JoinFamilyWithLinkPageState = remember {
JoinFamilyWithLinkPageState(
ctaButtonEnabledState = ctaButtonEnabledState,
nicknameTextState = nicknameTextState,
isInvalidInputState = isInvalidInputState,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
package com.no5ing.bbibbi.presentation.ui.feature.landing.join_family

import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import com.no5ing.bbibbi.R
import com.no5ing.bbibbi.data.repository.Arguments
import com.no5ing.bbibbi.presentation.ui.showSnackBarWithDismiss
import com.no5ing.bbibbi.presentation.ui.snackBarWarning
import com.no5ing.bbibbi.presentation.ui.theme.bbibbiScheme
import com.no5ing.bbibbi.presentation.ui.theme.bbibbiTypo
import com.no5ing.bbibbi.presentation.viewmodel.auth.RetrieveMeViewModel
import com.no5ing.bbibbi.presentation.viewmodel.family.CreateFamilyAndJoinViewModel
import com.no5ing.bbibbi.util.LocalSnackbarHostState
import com.no5ing.bbibbi.util.dashedBorder
import com.no5ing.bbibbi.util.getErrorMessage
import com.no5ing.bbibbi.util.localResources

@Composable
fun JoinFamilyPage(
retrieveMeViewModel: RetrieveMeViewModel = hiltViewModel(),
onTapJoinWithLink: () -> Unit,
onFamilyCreationComplete: () -> Unit,
createFamilyAndJoinViewModel: CreateFamilyAndJoinViewModel = hiltViewModel(),
) {
val meState = retrieveMeViewModel.uiState.collectAsState()
LaunchedEffect(meState) {
if (meState.value.isIdle()) {
retrieveMeViewModel.invoke(Arguments())
}
}

val uiState by createFamilyAndJoinViewModel.uiState.collectAsState()
val snackBarHost = LocalSnackbarHostState.current
val resources = localResources()
LaunchedEffect(uiState) {
when {
uiState.isReady() -> onFamilyCreationComplete()
uiState.isFailed() -> {
val errMessage = resources.getErrorMessage(uiState.errorCode)
snackBarHost.showSnackBarWithDismiss(
message = errMessage,
actionLabel = snackBarWarning,
)
createFamilyAndJoinViewModel.resetState()
}
}
}
val nickName = if (meState.value.isReady()) meState.value.data.name else ""
Box(
modifier = Modifier
.fillMaxSize()
.systemBarsPadding()
.navigationBarsPadding()
) {
Column(
modifier = Modifier.fillMaxSize(),
) {
Spacer(modifier = Modifier.height(40.dp))
Text(
text = stringResource(id = R.string.join_family_title, nickName),
style = MaterialTheme.bbibbiTypo.headOne,
color = MaterialTheme.bbibbiScheme.iconSelected,
modifier = Modifier.padding(horizontal = 20.dp)
)
Spacer(modifier = Modifier.height(8.dp))
Text(
text = stringResource(id = R.string.join_family_description),
style = MaterialTheme.bbibbiTypo.bodyOneRegular,
color = MaterialTheme.bbibbiScheme.textSecondary,
modifier = Modifier.padding(horizontal = 20.dp)
)
Spacer(modifier = Modifier.height(24.dp))
Box(
modifier = Modifier
.padding(horizontal = 20.dp)
.fillMaxWidth()
.aspectRatio(1.0f)
.background(
MaterialTheme.bbibbiScheme.backgroundSecondary,
shape = RoundedCornerShape(16.dp)
)
.dashedBorder(
width = 1.dp,
color = MaterialTheme.bbibbiScheme.gray600,
radius = 16.dp
)
.clickable {
createFamilyAndJoinViewModel.invoke(Arguments())
},
contentAlignment = Alignment.Center
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
) {
Icon(
painter = painterResource(id = R.drawable.plus_icon),
contentDescription = null,
tint = MaterialTheme.bbibbiScheme.textSecondary,
modifier = Modifier
.size(45.dp)
)
Spacer(modifier = Modifier.size(20.dp))
Text(
text = stringResource(id = R.string.join_family_create_group),
style = MaterialTheme.bbibbiTypo.headTwoRegular,
color = MaterialTheme.bbibbiScheme.textPrimary,
)
}
}
Spacer(modifier = Modifier.height(24.dp))
Box(
modifier = Modifier
.padding(horizontal = 20.dp)
) {
JoinFamilyPageLinkBar(
onTap = onTapJoinWithLink,
)
}
}
}
}
Loading

0 comments on commit dd0c274

Please sign in to comment.