Skip to content

Commit

Permalink
온보딩에서 팀 선택 스킵이 가능하도록 변경 (#225)
Browse files Browse the repository at this point in the history
* feat: string resource 추가

* refactor: TeamType에 None 타입 추가

* refactor: 회원가입 usecase에서 team을 받지 않도록 수정

* refactor: Navigate flow 변경(position -> main, setting -> Team)

* feat: 팀 선택하기 버튼 및 position, team 닉네임 아래에 명시

* feat: 팀 선택하기 클릭 시 팀 선택 화면으로 이동하도록 추가

* feat: 포지션 선택 시, 메인으로 이동하도록 구현

* feat: 팀 선택 후 다시 설정 화면으로 돌아가도록 구현

* refactor: 리뷰 반영 @hoyahozz

* refactor: 리뷰 반영 @hoyahozz

* fix: 충돌 해결
  • Loading branch information
evergreentree97 authored Apr 23, 2023
1 parent f47b37d commit 4f8dd68
Show file tree
Hide file tree
Showing 14 changed files with 256 additions and 137 deletions.
12 changes: 10 additions & 2 deletions domain/src/main/java/com/yapp/domain/model/Team.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,13 @@ import com.yapp.domain.model.types.TeamType

data class Team(
val type: TeamType,
val number: Int
)
val number: Int,
) {
override fun toString(): String {
return "${type.value} $number"
}

companion object {
fun empty() = Team(TeamType.NONE, 0)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ enum class TeamType(val value: String) {
companion object {
fun from(rawValue: String): TeamType {
return when(rawValue) {
"NONE" -> NONE
"ANDROID" -> ANDROID
"IOS" -> IOS
"WEB" -> WEB
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,11 @@ class SignUpMemberUseCase @Inject constructor(
val sessionList = remoteConfigRepository.getSessionList().getOrThrow()
val editedSessionList = createAttendanceEntities(sessionList)

val memberEntity = createMember(memberId = currentMemberId, params = params, attendanceEntities = editedSessionList)
val memberEntity = createMember(
memberId = currentMemberId,
params = params,
attendanceEntities = editedSessionList,
)

memberRepository.setMember(memberEntity)
}
Expand Down Expand Up @@ -54,20 +58,17 @@ class SignUpMemberUseCase @Inject constructor(
id = memberId,
name = params.memberName,
position = params.memberPosition,
team = params.team,
team = Team.empty(),
attendances = AttendanceList.from(attendanceEntities)
)
}

/**
* @param memberName 회원가입 이름입력 화면에서 입력된 Member 이름
* @param memberPosition 회원가입 포지션/팀 화면의 선택된 Member 포지션
* @param team: 회원가입 포지션/팀 화면의 선택된 Member Team
* */
class Params(
val memberName: String,
val memberPosition: PositionType,
val team: Team,
)

}
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ fun AttendanceScreen(
is MainContract.MainUiSideEffect.NavigateToQRScreen -> {
navController.navigate(BottomNavigationItem.QR_AUTH.route)
}

is MainContract.MainUiSideEffect.ShowToast -> {
qrToastVisible = !qrToastVisible
delay(1000L)
Expand Down Expand Up @@ -195,7 +196,12 @@ fun AttendanceScreen(
},
navigateToPrivacyPolicy = {
navController.navigate(AttendanceScreenRoute.PRIVACY_POLICY.route)
}
},
navigateToSelectTeamScreen = {
navController.navigate(AttendanceScreenRoute.SIGNUP_TEAM.route) {
popUpTo(AttendanceScreenRoute.MEMBER_SETTING.route) { inclusive = true }
}
},
)
}

Expand Down Expand Up @@ -234,9 +240,11 @@ fun AttendanceScreen(
) {
SetStatusBarColorByRoute(it.destination.route)
Name(
onClickBackBtn = { navController.navigate(AttendanceScreenRoute.LOGIN.route) {
popUpTo(AttendanceScreenRoute.SIGNUP_NAME.route) { inclusive = true }
} },
onClickBackBtn = {
navController.navigate(AttendanceScreenRoute.LOGIN.route) {
popUpTo(AttendanceScreenRoute.SIGNUP_NAME.route) { inclusive = true }
}
},
onClickNextBtn = { userName -> navController.navigate(AttendanceScreenRoute.SIGNUP_POSITION.route + "/${userName}") })
}

Expand All @@ -250,30 +258,24 @@ fun AttendanceScreen(
SetStatusBarColorByRoute(it.destination.route)
Position(
onClickBackButton = { navController.popBackStack() },
navigateToTeamScreen = { userName, userPosition ->
navController.navigate(
AttendanceScreenRoute.SIGNUP_TEAM.route.plus("/${userName}")
.plus("/${userPosition}")
)
navigateToMainScreen = {
navController.navigate(AttendanceScreenRoute.MEMBER_MAIN.route) {
popUpTo(AttendanceScreenRoute.SIGNUP_NAME.route) { inclusive = true }
}
}
)
}


composable(
route = AttendanceScreenRoute.SIGNUP_TEAM.route
.plus("/{name}")
.plus("/{position}"),
arguments = listOf(
navArgument("name") { type = NavType.StringType },
navArgument("position") { type = NavType.StringType })
route = AttendanceScreenRoute.SIGNUP_TEAM.route,
) {
SetStatusBarColorByRoute(it.destination.route)
Team(
onClickBackButton = { navController.popBackStack() },
navigateToMainScreen = {
navController.navigate(AttendanceScreenRoute.MEMBER_MAIN.route) {
popUpTo(AttendanceScreenRoute.SIGNUP_NAME.route) { inclusive = true }
navigateToSettingScreen = {
navController.navigate(AttendanceScreenRoute.MEMBER_SETTING.route) {
popUpTo(AttendanceScreenRoute.SIGNUP_TEAM.route) { inclusive = true }
}
})
}
Expand Down Expand Up @@ -341,12 +343,14 @@ fun SetStatusBarColorByRoute(route: String?) {
color = yappOrange,
)
}

BottomNavigationItem.SESSION.route -> {
systemUiController.setStatusBarColor(
color = backgroundBase,
darkIcons = shouldShowLightIcon
)
}

else -> {
systemUiController.setStatusBarColor(
color = Color.Transparent,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,25 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import com.google.accompanist.insets.systemBarsPadding
import com.yapp.common.R
import com.yapp.common.flow.collectAsStateWithLifecycle
import com.yapp.common.theme.*
import com.yapp.common.yds.*
import com.yapp.domain.model.Team
import com.yapp.domain.model.types.TeamType
import com.yapp.presentation.R.*
import com.yapp.presentation.util.permission.PermissionBundle
import kotlinx.coroutines.delay

private fun Team.hasTeam() = type != TeamType.NONE

@Composable
fun MemberSetting(
viewModel: MemberSettingViewModel = hiltViewModel(),
navigateToPreviousScreen: () -> Unit,
navigateToLogin: () -> Unit,
navigateToPrivacyPolicy: () -> Unit,
navigateToSelectTeamScreen: () -> Unit,
) {
val uiState by viewModel.uiState.collectAsState()
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
var toastVisible by remember { mutableStateOf(false) }

LaunchedEffect(key1 = viewModel.effect) {
Expand All @@ -52,6 +57,10 @@ fun MemberSetting(
delay(1000L)
toastVisible = false
}

MemberSettingContract.MemberSettingUiSideEffect.NavigateToSelectTeamScreen -> {
navigateToSelectTeamScreen()
}
}
}
}
Expand All @@ -77,7 +86,15 @@ fun MemberSetting(
.verticalScroll(rememberScrollState())
) {
GroupInfo(uiState.generation)
Profile(uiState.memberName)
Profile(
name = uiState.memberName,
position = uiState.memberPosition,
team = uiState.memberTeam,
)
SelectTeam(
hasTeam = uiState.memberTeam.hasTeam(),
onClick = { viewModel.setEvent(MemberSettingContract.MemberSettingUiEvent.OnSelectTeamButtonClicked) }
)
Divide()
MenuList(viewModel)
}
Expand Down Expand Up @@ -120,7 +137,16 @@ private fun GroupInfo(generation: Int) {
}

@Composable
private fun Profile(name: String) {
private fun Profile(
name: String,
position: String,
team: Team,
) {
val subInfo = if (team.hasTeam()) {
"$position · $team"
} else {
position
}
Column(
modifier = Modifier.padding(horizontal = 24.dp, vertical = 28.dp)
) {
Expand All @@ -139,6 +165,32 @@ private fun Profile(name: String) {
.padding(top = 16.dp),
textAlign = TextAlign.Center
)
Text(
modifier = Modifier
.fillMaxWidth()
.padding(top = 2.dp),
color = AttendanceTheme.colors.grayScale.Gray600,
style = AttendanceTypography.body2,
text = subInfo,
textAlign = TextAlign.Center,
)
}
}

@Composable
private fun ColumnScope.SelectTeam(
hasTeam: Boolean,
onClick: () -> Unit,
) {
if (hasTeam.not()) {
YDSButtonSmall(
modifier = Modifier
.padding(bottom = 28.dp)
.align(Alignment.CenterHorizontally),
text = stringResource(id = string.member_setting_select_team),
state = YdsButtonState.ENABLED,
onClick = onClick,
)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@ package com.yapp.presentation.ui.member.setting
import com.yapp.common.base.UiEvent
import com.yapp.common.base.UiSideEffect
import com.yapp.common.base.UiState
import com.yapp.domain.model.Team

class MemberSettingContract {
data class MemberSettingUiState(
val loadState: LoadState = LoadState.Idle,
val showDialog: Boolean = false,
val generation: Int = 0,
val memberName: String = "",
val memberPosition: String = "",
val memberTeam: Team = Team.empty(),
val isGuest: Boolean = false,
) : UiState

Expand All @@ -20,12 +23,14 @@ class MemberSettingContract {
sealed class MemberSettingUiSideEffect : UiSideEffect {
object NavigateToLoginScreen : MemberSettingUiSideEffect()
object NavigateToPrivacyPolicyScreen : MemberSettingUiSideEffect()
object NavigateToSelectTeamScreen : MemberSettingUiSideEffect()
object ShowToast : MemberSettingUiSideEffect()
}

sealed class MemberSettingUiEvent : UiEvent {
object OnLogoutButtonClicked : MemberSettingUiEvent()
object OnWithdrawButtonClicked : MemberSettingUiEvent()
object OnPrivacyPolicyButtonClicked : MemberSettingUiEvent()
object OnSelectTeamButtonClicked : MemberSettingUiEvent()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import androidx.lifecycle.viewModelScope
import com.google.firebase.crashlytics.FirebaseCrashlytics
import com.yapp.common.base.BaseViewModel
import com.yapp.domain.common.KakaoSdkProviderInterface
import com.yapp.domain.model.Team
import com.yapp.domain.model.types.TeamType
import com.yapp.domain.usecases.DeleteMemberInfoUseCase
import com.yapp.domain.usecases.GetConfigUseCase
import com.yapp.domain.usecases.GetCurrentMemberInfoUseCase
Expand Down Expand Up @@ -34,7 +36,9 @@ class MemberSettingViewModel @Inject constructor(
setState {
copy(
loadState = MemberSettingContract.LoadState.Idle,
memberName = currentMember?.name ?: ""
memberName = currentMember?.name ?: "",
memberPosition = currentMember?.position?.value ?: "",
memberTeam = currentMember?.team ?: Team.empty(),
)
}
}.onFailure {
Expand Down Expand Up @@ -79,22 +83,22 @@ class MemberSettingViewModel @Inject constructor(
require(memberId != null)

deleteMemberInfoUseCase(memberId).getOrDefault(defaultValue = false).also { isSuccess ->
if (!isSuccess) {
setState { copy(loadState = MemberSettingContract.LoadState.Idle) }
setEffect(MemberSettingContract.MemberSettingUiSideEffect.ShowToast)
}

kakaoSdkProvider.withdraw(
onSuccess = {
setState { copy(loadState = MemberSettingContract.LoadState.Idle) }
setEffect(MemberSettingContract.MemberSettingUiSideEffect.NavigateToLoginScreen)
},
onFailed = {
if (!isSuccess) {
setState { copy(loadState = MemberSettingContract.LoadState.Idle) }
setEffect(MemberSettingContract.MemberSettingUiSideEffect.ShowToast)
}
)
}

kakaoSdkProvider.withdraw(
onSuccess = {
setState { copy(loadState = MemberSettingContract.LoadState.Idle) }
setEffect(MemberSettingContract.MemberSettingUiSideEffect.NavigateToLoginScreen)
},
onFailed = {
setState { copy(loadState = MemberSettingContract.LoadState.Idle) }
setEffect(MemberSettingContract.MemberSettingUiSideEffect.ShowToast)
}
)
}
}
.onFailure {
setState { copy(loadState = MemberSettingContract.LoadState.Idle) }
Expand All @@ -118,6 +122,10 @@ class MemberSettingViewModel @Inject constructor(
is MemberSettingContract.MemberSettingUiEvent.OnPrivacyPolicyButtonClicked -> {
setEffect(MemberSettingContract.MemberSettingUiSideEffect.NavigateToPrivacyPolicyScreen)
}

MemberSettingContract.MemberSettingUiEvent.OnSelectTeamButtonClicked -> {
setEffect(MemberSettingContract.MemberSettingUiSideEffect.NavigateToSelectTeamScreen)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,18 @@ import com.yapp.presentation.ui.member.signup.position.PositionContract.Position
fun Position(
viewModel: PositionViewModel = hiltViewModel(),
onClickBackButton: () -> Unit,
navigateToTeamScreen: (String, String) -> Unit
navigateToMainScreen: () -> Unit,
) {
val context = LocalContext.current
val uiState by viewModel.uiState.collectAsState()

LaunchedEffect(key1 = viewModel.effect) {
viewModel.effect.collect { effect ->
when (effect) {
is PositionSideEffect.NavigateToTeamScreen -> {
navigateToTeamScreen(effect.name, effect.position.name)
is PositionSideEffect.NavigateToMainScreen -> {
navigateToMainScreen()
}

is PositionSideEffect.ShowToast -> {
Toast.makeText(context, effect.msg, Toast.LENGTH_LONG).show()
}
Expand Down Expand Up @@ -92,14 +93,15 @@ fun Position(
)
}
YDSButtonLarge(
text = stringResource(R.string.member_signup_position_next),
text = stringResource(R.string.member_signup_team_start_yapp),
modifier = Modifier
.padding(start = 24.dp, end = 24.dp, bottom = 40.dp)
.height(60.dp)
.align(Alignment.BottomCenter),
onClick = { viewModel.setEvent(PositionUiEvent.ConfirmPosition) },
state = if (uiState.ydsOption.selectedOption != null) YdsButtonState.ENABLED else YdsButtonState.DISABLED
)

}
}
}
Loading

0 comments on commit 4f8dd68

Please sign in to comment.