Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/src/main/java/com/kikidan/todakun/TodakunApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ fun TodakunApp(
onFinish = { navigator.resetTo(TodakunRoute.Home) },
onNavigateTerm = { navigator.goBack() },
onboardingToken = OnboardingToken(route.onboardingToken),
snackbarHostState = snackbarHostState,
)
}

Expand Down
2 changes: 2 additions & 0 deletions core/designsystem/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,8 @@
<string name="onboarding_next">다음</string>
<string name="onboarding_start">시작하기</string>
<string name="onboarding_confirm">확인</string>
<string name="onboarding_signup_error">회원가입에 실패했어요. 잠시 후 다시 시도해주세요</string>
<string name="onboarding_invalid_input_error">입력한 정보를 다시 확인해주세요.</string>

<!-- 약관 동의 -->
<string name="onboarding_terms_progress_label">약관 동의</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Text
import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable
Expand Down Expand Up @@ -58,6 +59,7 @@ internal fun SocialLoginButton(
provider: SocialLoginProvider,
onClick: () -> Unit,
modifier: Modifier = Modifier,
isLoading: Boolean = false,
) {
Box(
modifier =
Expand All @@ -74,20 +76,28 @@ internal fun SocialLoginButton(
),
contentAlignment = Alignment.Center,
) {
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(8.dp),
) {
Image(
painter = painterResource(id = provider.iconRes),
contentDescription = null,
if (isLoading) {
CircularProgressIndicator(
modifier = Modifier.size(20.dp),
)
Text(
text = stringResource(id = provider.labelRes),
style = TodakunTypography.body2Medium,
color = provider.contentColor,
strokeWidth = 2.dp,
)
} else {
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(8.dp),
) {
Image(
painter = painterResource(id = provider.iconRes),
contentDescription = null,
modifier = Modifier.size(20.dp),
)
Text(
text = stringResource(id = provider.labelRes),
style = TodakunTypography.body2Medium,
color = provider.contentColor,
)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
Expand All @@ -34,6 +39,10 @@ internal fun LoginScreen(
modifier: Modifier = Modifier,
) {
val loginEnabled = state is LoginState.Idle || state is LoginState.Failure
var loadingProvider by remember { mutableStateOf<SocialLoginProvider?>(null) }
LaunchedEffect(state) {
if (state !is LoginState.Loading) loadingProvider = null
}
Box(
modifier =
modifier
Expand Down Expand Up @@ -77,8 +86,12 @@ internal fun LoginScreen(
SocialLoginProvider.entries.forEach { provider ->
SocialLoginButton(
enabled = loginEnabled,
isLoading = state is LoginState.Loading && loadingProvider == provider,
provider = provider,
onClick = { onProviderClick(provider) },
onClick = {
loadingProvider = provider
onProviderClick(provider)
},
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,17 @@ import android.os.Build
import androidx.activity.compose.BackHandler
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel
import com.kikidan.designsystem.R
import com.kikidan.designsystem.component.wheelpicker.BirthDateState
import com.kikidan.designsystem.component.wheelpicker.BirthDateWheelPicker
import com.kikidan.designsystem.component.wheelpicker.SajuBirthTimeWheelPicker
Expand All @@ -34,6 +37,7 @@ fun OnboardingRoute(
onFinish: () -> Unit,
onNavigateTerm: () -> Unit,
onboardingToken: OnboardingToken,
snackbarHostState: SnackbarHostState,
modifier: Modifier = Modifier,
viewModel: OnboardingViewModel = hiltViewModel(),
) {
Expand All @@ -48,6 +52,8 @@ fun OnboardingRoute(
// 권한을 허락하지 않더라도 앱 진입
permissionHandled = true
}
val signupErrorMessage = stringResource(R.string.onboarding_signup_error)
val invalidInputErrorMessage = stringResource(R.string.onboarding_invalid_input_error)

viewModel.collectSideEffect { sideEffect ->
when (sideEffect) {
Expand All @@ -67,7 +73,13 @@ fun OnboardingRoute(
}
}

else -> { /* TODO 에러 처리 스낵바 또는 다이얼로그 */ }
OnboardingSideEffect.InvalidInput -> {
snackbarHostState.showSnackbar(invalidInputErrorMessage)
}

is OnboardingSideEffect.Failure -> {
snackbarHostState.showSnackbar(signupErrorMessage)
}
}
}

Expand Down
Loading