diff --git a/app/src/main/java/com/sampoom/android/MainActivity.kt b/app/src/main/java/com/sampoom/android/MainActivity.kt index fd1d58f..0112e92 100644 --- a/app/src/main/java/com/sampoom/android/MainActivity.kt +++ b/app/src/main/java/com/sampoom/android/MainActivity.kt @@ -1,8 +1,13 @@ package com.sampoom.android +import android.os.Build import android.os.Bundle import androidx.activity.ComponentActivity +import androidx.activity.SystemBarStyle import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb import com.sampoom.android.app.navigation.AppNavHost import com.sampoom.android.core.ui.theme.SampoomManagementTheme import dagger.hilt.android.AndroidEntryPoint @@ -11,6 +16,19 @@ import dagger.hilt.android.AndroidEntryPoint class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + enableEdgeToEdge( + statusBarStyle = SystemBarStyle.auto( + lightScrim = Color.Transparent.toArgb(), + darkScrim = Color.Transparent.toArgb() + ), + navigationBarStyle = SystemBarStyle.auto( + lightScrim = Color.Transparent.toArgb(), + darkScrim = Color.Transparent.toArgb() + ) + ) + if (Build.VERSION.SDK_INT >= 29) { + window.isNavigationBarContrastEnforced = false + } setContent { SampoomManagementTheme { AppNavHost() diff --git a/app/src/main/java/com/sampoom/android/app/navigation/AppNavHost.kt b/app/src/main/java/com/sampoom/android/app/navigation/AppNavHost.kt index 00e8cc3..e8f66bc 100644 --- a/app/src/main/java/com/sampoom/android/app/navigation/AppNavHost.kt +++ b/app/src/main/java/com/sampoom/android/app/navigation/AppNavHost.kt @@ -104,14 +104,6 @@ fun AppNavHost( val isLoggedIn by authViewModel.isLoggedIn.collectAsState() val isLoading by authViewModel.isLoading.collectAsState() val user by viewModel.user.collectAsStateWithLifecycle() - - val navBackStackEntry by navController.currentBackStackEntryAsState() - val currentRoute = navBackStackEntry?.destination?.route - val activity = LocalContext.current as? ComponentActivity - val homeNavColor = backgroundCardColor() - val elseNavColor = backgroundColor() - val lightIcons = !isSystemInDarkTheme() - val snackBarHostState = rememberCommonSnackBarHostState() var currentMessage by remember { mutableStateOf(null) } @@ -128,19 +120,6 @@ fun AppNavHost( } } - LaunchedEffect(currentRoute, homeNavColor, lightIcons) { - val window = activity?.window ?: return@LaunchedEffect - if (currentRoute == ROUTE_HOME) { - window.navigationBarColor = homeNavColor.toArgb() - WindowInsetsControllerCompat(window, window.decorView) - .isAppearanceLightNavigationBars = lightIcons - } else { - window.navigationBarColor = elseNavColor.toArgb() - WindowInsetsControllerCompat(window, window.decorView) - .isAppearanceLightNavigationBars = lightIcons - } - } - if (isLoading) { Box( modifier = Modifier.fillMaxSize(), diff --git a/app/src/main/java/com/sampoom/android/core/model/UserPosition.kt b/app/src/main/java/com/sampoom/android/core/model/UserPosition.kt new file mode 100644 index 0000000..82e6f14 --- /dev/null +++ b/app/src/main/java/com/sampoom/android/core/model/UserPosition.kt @@ -0,0 +1,14 @@ +package com.sampoom.android.core.model + +enum class UserPosition { + STAFF, // 사원 + SENIOR_STAFF, // 주임 + ASSISTANT_MANAGER, // 대리 + MANAGER, // 과장 + DEPUTY_GENERAL_MANAGER, // 차장 + GENERAL_MANAGER, // 부장 + DIRECTOR, // 이사 + VICE_PRESIDENT, // 부사장 + PRESIDENT, // 사장 + CHAIRMAN // 회장 +} \ No newline at end of file diff --git a/app/src/main/java/com/sampoom/android/core/preferences/AuthPreferences.kt b/app/src/main/java/com/sampoom/android/core/preferences/AuthPreferences.kt index c7ef2f3..5b3faeb 100644 --- a/app/src/main/java/com/sampoom/android/core/preferences/AuthPreferences.kt +++ b/app/src/main/java/com/sampoom/android/core/preferences/AuthPreferences.kt @@ -6,13 +6,12 @@ import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.longPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.preferencesDataStore +import com.sampoom.android.core.model.UserPosition import com.sampoom.android.feature.auth.domain.model.User -import com.sampoom.android.feature.auth.domain.model.UserRole import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject import javax.inject.Singleton import kotlinx.coroutines.flow.first -import java.time.LocalDateTime // Per official guidance, DataStore instance should be single and at top-level. private val Context.authDataStore by preferencesDataStore(name = "auth_prefs") @@ -49,8 +48,8 @@ class AuthPreferences @Inject constructor( prefs[Keys.USER_ID] = cryptoManager.encrypt(user.userId.toString()) prefs[Keys.USER_NAME] = cryptoManager.encrypt(user.userName) prefs[Keys.USER_EMAIL] = cryptoManager.encrypt(user.email) - prefs[Keys.USER_ROLE] = cryptoManager.encrypt(user.role.name) - prefs[Keys.USER_POSITION] = cryptoManager.encrypt(user.position) + prefs[Keys.USER_ROLE] = cryptoManager.encrypt(user.role) + prefs[Keys.USER_POSITION] = cryptoManager.encrypt(user.position.name) prefs[Keys.USER_WORKSPACE] = cryptoManager.encrypt(user.workspace) prefs[Keys.USER_BRANCH] = cryptoManager.encrypt(user.branch) prefs[Keys.USER_AGENCY_ID] = cryptoManager.encrypt(user.agencyId.toString()) @@ -96,13 +95,13 @@ class AuthPreferences @Inject constructor( cryptoManager.decrypt(userId).toLong(), cryptoManager.decrypt(userName), cryptoManager.decrypt(userEmail), - cryptoManager.decrypt(userRole).let { decrypted -> - try { UserRole.valueOf(decrypted.uppercase()) } catch (_: Exception) { UserRole.STAFF } - }, + cryptoManager.decrypt(userRole), cryptoManager.decrypt(accessToken), cryptoManager.decrypt(refreshToken), remaining, - cryptoManager.decrypt(userPosition), + cryptoManager.decrypt(userPosition).let { decrypted -> + try { UserPosition.valueOf(decrypted.uppercase()) } catch (_: Exception) { UserPosition.STAFF } + }, cryptoManager.decrypt(userWorkspace), cryptoManager.decrypt(userBranch), cryptoManager.decrypt(userAgencyId).toLong(), diff --git a/app/src/main/java/com/sampoom/android/core/ui/component/CommonTextField.kt b/app/src/main/java/com/sampoom/android/core/ui/component/CommonTextField.kt index 0b4867c..33769b5 100644 --- a/app/src/main/java/com/sampoom/android/core/ui/component/CommonTextField.kt +++ b/app/src/main/java/com/sampoom/android/core/ui/component/CommonTextField.kt @@ -38,7 +38,9 @@ fun CommonTextField( isError: Boolean = false, errorMessage: String? = null, imeAction: ImeAction = ImeAction.Next, - keyboardActions: KeyboardActions = KeyboardActions() + keyboardActions: KeyboardActions = KeyboardActions(), + readOnly: Boolean = false, + singleLine: Boolean = true ) { var passwordVisible by remember { mutableStateOf(false) } @@ -84,7 +86,8 @@ fun CommonTextField( modifier = modifier .fillMaxWidth() .padding(vertical = 4.dp), - singleLine = true, + readOnly = readOnly, + singleLine = singleLine, enabled = enabled, isError = isError, trailingIcon = trailingIconView, diff --git a/app/src/main/java/com/sampoom/android/core/util/DelayNetwork.kt b/app/src/main/java/com/sampoom/android/core/util/DelayNetwork.kt new file mode 100644 index 0000000..9daf43b --- /dev/null +++ b/app/src/main/java/com/sampoom/android/core/util/DelayNetwork.kt @@ -0,0 +1,30 @@ +package com.sampoom.android.core.util + +import kotlinx.coroutines.delay +import java.io.IOException +import java.net.SocketTimeoutException + +suspend fun retry( + times: Int = 5, + initialDelay: Long = 300, + maxDelay: Long = 1500, + factor: Double = 1.8, + block: suspend () -> T +): T { + var currentDelay = initialDelay + repeat(times - 1) { + try { + return block() + } catch (t: Throwable) { + when (t) { + is SocketTimeoutException, is IOException -> { + + } + else -> throw t + } + } + delay(currentDelay) + currentDelay = (currentDelay * factor).toLong().coerceAtMost(maxDelay) + } + return block() +} \ No newline at end of file diff --git a/app/src/main/java/com/sampoom/android/core/util/PositionToKorean.kt b/app/src/main/java/com/sampoom/android/core/util/PositionToKorean.kt new file mode 100644 index 0000000..75f00dc --- /dev/null +++ b/app/src/main/java/com/sampoom/android/core/util/PositionToKorean.kt @@ -0,0 +1,17 @@ +package com.sampoom.android.core.util + +import com.sampoom.android.core.model.UserPosition + +fun positionToKorean(position: UserPosition?): String = when (position) { + UserPosition.STAFF -> "사원" + UserPosition.SENIOR_STAFF -> "주임" + UserPosition.ASSISTANT_MANAGER -> "대리" + UserPosition.MANAGER -> "과장" + UserPosition.DEPUTY_GENERAL_MANAGER -> "차장" + UserPosition.GENERAL_MANAGER -> "부장" + UserPosition.DIRECTOR -> "이사" + UserPosition.VICE_PRESIDENT -> "부사장" + UserPosition.PRESIDENT -> "사장" + UserPosition.CHAIRMAN -> "회장" + else -> "-" +} \ No newline at end of file diff --git a/app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt b/app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt index f6aa68a..a6d9427 100644 --- a/app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt +++ b/app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt @@ -1,19 +1,19 @@ package com.sampoom.android.feature.auth.data.mapper +import com.sampoom.android.core.model.UserPosition import com.sampoom.android.feature.auth.data.remote.dto.GetProfileResponseDto import com.sampoom.android.feature.auth.data.remote.dto.LoginResponseDto import com.sampoom.android.feature.auth.domain.model.User -import com.sampoom.android.feature.auth.domain.model.UserRole fun LoginResponseDto.toModel(): User = User( userId = userId, userName = "", email = "", - role = UserRole.STAFF, + role = "", accessToken = accessToken, refreshToken = refreshToken, expiresIn = expiresIn, - position = "", + position = UserPosition.STAFF, workspace = "", branch = "", agencyId = 0, @@ -25,11 +25,11 @@ fun GetProfileResponseDto.toModel(): User = User( userId = userId, userName = userName, email = email, - role = role.toUserRole(), + role = role, accessToken = "", refreshToken = "", expiresIn = 0L, - position = position, + position = position.toUserPosition(), workspace = workspace, branch = branch, agencyId = organizationId, @@ -44,8 +44,8 @@ fun User.mergeWith(profile: User): User = this.copy( branch = profile.branch ) -private fun String.toUserRole(): UserRole = try { - UserRole.valueOf(this.uppercase()) -} catch (_: Exception) { - UserRole.STAFF +private fun String.toUserPosition(): UserPosition = try { + UserPosition.valueOf(this.uppercase()) +} catch (_: IllegalArgumentException) { + UserPosition.STAFF } \ No newline at end of file diff --git a/app/src/main/java/com/sampoom/android/feature/auth/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/com/sampoom/android/feature/auth/data/repository/AuthRepositoryImpl.kt index a1e49b2..5273dce 100644 --- a/app/src/main/java/com/sampoom/android/feature/auth/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/com/sampoom/android/feature/auth/data/repository/AuthRepositoryImpl.kt @@ -1,6 +1,7 @@ package com.sampoom.android.feature.auth.data.repository import com.sampoom.android.core.preferences.AuthPreferences +import com.sampoom.android.core.util.retry import com.sampoom.android.feature.auth.data.mapper.toModel import com.sampoom.android.feature.auth.data.remote.api.AuthApi import com.sampoom.android.feature.auth.data.remote.dto.LoginRequestDto @@ -14,6 +15,7 @@ class AuthRepositoryImpl @Inject constructor( private val api: AuthApi, private val preferences: AuthPreferences ) : AuthRepository { + override suspend fun signUp( email: String, password: String, @@ -55,8 +57,9 @@ class AuthRepositoryImpl @Inject constructor( preferences.saveUser(loginUser) - val profileDto = getProfile("AGENCY") - val profileUser = profileDto.getOrThrow() + val profileUser = retry(times = 5, initialDelay = 300) { + getProfile("AGENCY").getOrThrow() + } val user = User( userId = loginUser.userId, diff --git a/app/src/main/java/com/sampoom/android/feature/auth/domain/model/User.kt b/app/src/main/java/com/sampoom/android/feature/auth/domain/model/User.kt index 4259b60..984500a 100644 --- a/app/src/main/java/com/sampoom/android/feature/auth/domain/model/User.kt +++ b/app/src/main/java/com/sampoom/android/feature/auth/domain/model/User.kt @@ -1,27 +1,16 @@ package com.sampoom.android.feature.auth.domain.model -enum class UserRole { - STAFF, // 사원 - SENIOR_STAFF, // 주임 - ASSISTANT_MANAGER, // 대리 - MANAGER, // 과장 - DEPUTY_GENERAL_MANAGER, // 차장 - GENERAL_MANAGER, // 부장 - DIRECTOR, // 이사 - VICE_PRESIDENT, // 부사장 - PRESIDENT, // 사장 - CHAIRMAN // 회장 -} +import com.sampoom.android.core.model.UserPosition data class User( val userId: Long, val userName: String, val email: String, - val role: UserRole, + val role: String, val accessToken: String, val refreshToken: String, val expiresIn: Long, - val position: String, + val position: UserPosition, val workspace: String, val branch: String, val agencyId: Long, diff --git a/app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpScreen.kt b/app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpScreen.kt index 8123ed3..9ab5c3d 100644 --- a/app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpScreen.kt +++ b/app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpScreen.kt @@ -15,7 +15,11 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuAnchorType +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Scaffold @@ -26,7 +30,9 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState 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.focus.FocusRequester @@ -39,8 +45,10 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import com.sampoom.android.R +import com.sampoom.android.core.model.UserPosition import com.sampoom.android.core.ui.component.CommonButton import com.sampoom.android.core.ui.component.CommonTextField +import com.sampoom.android.core.util.positionToKorean @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -72,6 +80,9 @@ fun SignUpScreen( if (state.success) onSuccess() } + val positionItems = remember { UserPosition.entries } + var positionMenuExpanded by remember { mutableStateOf(false) } + Scaffold( topBar = { TopAppBar( @@ -148,16 +159,41 @@ fun SignUpScreen( text = stringResource(R.string.signup_title_position), fontSize = labelTextSize ) - CommonTextField( - modifier = Modifier.fillMaxWidth().focusRequester(positionFocus), - value = state.position, - onValueChange = { viewModel.onEvent(SignUpUiEvent.PositionChanged(it)) }, - placeholder = stringResource(R.string.signup_placeholder_position), - isError = state.positionError != null, - errorMessage = state.positionError, - imeAction = ImeAction.Next, - keyboardActions = KeyboardActions(onNext = { emailFocus.requestFocus() }) - ) + ExposedDropdownMenuBox( + expanded = positionMenuExpanded, + onExpandedChange = { positionMenuExpanded = it } + ) { + CommonTextField( + modifier = Modifier + .menuAnchor( + type = ExposedDropdownMenuAnchorType.PrimaryNotEditable, + enabled = true + ) + .fillMaxWidth(), + readOnly = true, + value = state.position?.let { positionToKorean(it) } ?: "", + onValueChange = {}, + placeholder = stringResource(R.string.signup_placeholder_position), + isError = state.positionError != null, + errorMessage = state.positionError, + singleLine = true + ) + ExposedDropdownMenu( + expanded = positionMenuExpanded, + onDismissRequest = { positionMenuExpanded = false } + ) { + positionItems.forEach { role -> + DropdownMenuItem( + text = { Text(positionToKorean(role)) }, + onClick = { + viewModel.onEvent(SignUpUiEvent.PositionChanged(role)) + positionMenuExpanded = false + emailFocus.requestFocus() + } + ) + } + } + } Spacer(Modifier.height(8.dp)) Text( text = stringResource(R.string.signup_title_email), diff --git a/app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpUiEvent.kt b/app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpUiEvent.kt index eb8e77b..dda938b 100644 --- a/app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpUiEvent.kt +++ b/app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpUiEvent.kt @@ -1,9 +1,11 @@ package com.sampoom.android.feature.auth.ui +import com.sampoom.android.core.model.UserPosition + sealed interface SignUpUiEvent { data class NameChanged(val name: String) : SignUpUiEvent data class BranchChanged(val branch: String) : SignUpUiEvent - data class PositionChanged(val position: String) : SignUpUiEvent + data class PositionChanged(val position: UserPosition) : SignUpUiEvent data class EmailChanged(val email: String) : SignUpUiEvent data class PasswordChanged(val password: String) : SignUpUiEvent data class PasswordCheckChanged(val passwordCheck: String) : SignUpUiEvent diff --git a/app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpUiState.kt b/app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpUiState.kt index d274bf1..f8c7383 100644 --- a/app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpUiState.kt +++ b/app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpUiState.kt @@ -1,10 +1,12 @@ package com.sampoom.android.feature.auth.ui +import com.sampoom.android.core.model.UserPosition + data class SignUpUiState( val name: String = "", val workspace: String = "AGENCY", val branch: String = "", - val position: String = "", + val position: UserPosition? = null, val email: String = "", val password: String = "", val passwordCheck: String = "", @@ -23,7 +25,7 @@ data class SignUpUiState( val isValid: Boolean get() = name.isNotBlank() && branch.isNotBlank() && - position.isNotBlank() && + position != null && email.isNotBlank() && password.isNotBlank() && passwordCheck.isNotBlank() && diff --git a/app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpViewModel.kt b/app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpViewModel.kt index 68a3fdb..50d5633 100644 --- a/app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpViewModel.kt +++ b/app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpViewModel.kt @@ -4,9 +4,13 @@ import android.app.Application import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.sampoom.android.R import com.sampoom.android.core.network.serverMessageOrNull import com.sampoom.android.core.util.GlobalMessageHandler import com.sampoom.android.feature.auth.domain.AuthValidator +import com.sampoom.android.feature.auth.domain.AuthValidator.validateEmail +import com.sampoom.android.feature.auth.domain.AuthValidator.validatePassword +import com.sampoom.android.feature.auth.domain.AuthValidator.validatePasswordCheck import com.sampoom.android.feature.auth.domain.ValidationResult import com.sampoom.android.feature.auth.domain.usecase.SignUpUseCase import dagger.hilt.android.lifecycle.HiltViewModel @@ -90,7 +94,11 @@ class SignUpViewModel @Inject constructor( } private fun validatePosition() { - val result = AuthValidator.validateNotEmpty(_state.value.position, positionLabel) + val result = if (_state.value.position == null) { + ValidationResult.Error(messageResId = R.string.common_required_field) + } else { + ValidationResult.Success + } _state.value = _state.value.copy( positionError = result.toErrorMessage() ) @@ -143,7 +151,7 @@ class SignUpViewModel @Inject constructor( workspace = s.workspace, branch = s.branch, userName = s.name, - position = s.position + position = s.position!!.name ) .onSuccess { _state.update { diff --git a/app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt b/app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt index a76be26..cc5eef5 100644 --- a/app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt +++ b/app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt @@ -47,6 +47,7 @@ import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems import com.sampoom.android.R +import com.sampoom.android.core.model.UserPosition import com.sampoom.android.core.ui.component.EmptyContent import com.sampoom.android.core.ui.component.ErrorContent import com.sampoom.android.core.ui.component.OrderItem @@ -55,7 +56,6 @@ import com.sampoom.android.core.ui.theme.backgroundCardColor import com.sampoom.android.core.ui.theme.textColor import com.sampoom.android.core.ui.theme.textSecondaryColor import com.sampoom.android.feature.auth.domain.model.User -import com.sampoom.android.feature.auth.domain.model.UserRole import com.sampoom.android.feature.order.domain.model.Order @Composable @@ -71,17 +71,17 @@ fun DashboardScreen( val user by viewModel.user.collectAsStateWithLifecycle() val pullRefreshState = rememberPullToRefreshState() val orderListPaged = viewModel.orderListPaged.collectAsLazyPagingItems() - val isManager = when (user?.role) { - UserRole.STAFF, - UserRole.SENIOR_STAFF, - UserRole.ASSISTANT_MANAGER, - UserRole.MANAGER, - UserRole.DEPUTY_GENERAL_MANAGER, - UserRole.GENERAL_MANAGER, - UserRole.DIRECTOR, - UserRole.VICE_PRESIDENT, - UserRole.PRESIDENT, - UserRole.CHAIRMAN -> true + val isManager = when (user?.position) { + UserPosition.STAFF, + UserPosition.SENIOR_STAFF, + UserPosition.ASSISTANT_MANAGER, + UserPosition.MANAGER, + UserPosition.DEPUTY_GENERAL_MANAGER, + UserPosition.GENERAL_MANAGER, + UserPosition.DIRECTOR, + UserPosition.VICE_PRESIDENT, + UserPosition.PRESIDENT, + UserPosition.CHAIRMAN -> true else -> false } diff --git a/app/src/main/java/com/sampoom/android/feature/setting/ui/SettingScreen.kt b/app/src/main/java/com/sampoom/android/feature/setting/ui/SettingScreen.kt index 324a561..46b47e0 100644 --- a/app/src/main/java/com/sampoom/android/feature/setting/ui/SettingScreen.kt +++ b/app/src/main/java/com/sampoom/android/feature/setting/ui/SettingScreen.kt @@ -42,6 +42,7 @@ import com.sampoom.android.core.ui.theme.disableColor import com.sampoom.android.core.ui.theme.textColor import com.sampoom.android.core.ui.theme.textSecondaryColor import com.sampoom.android.core.util.formatDate +import com.sampoom.android.core.util.positionToKorean import com.sampoom.android.feature.auth.domain.model.User @OptIn(ExperimentalMaterial3Api::class) @@ -69,13 +70,6 @@ fun SettingScreen( } } - LaunchedEffect(uiState.logoutSuccess) { - if (uiState.logoutSuccess) { - viewModel.clearSuccess() - onLogoutClick() - } - } - PullToRefreshBox( isRefreshing = false, onRefresh = { viewModel.onEvent(SettingUiEvent.LoadProfile) }, @@ -136,6 +130,7 @@ fun SettingScreen( TextButton( onClick = { showLogoutDialog = false + onLogoutClick() } ) { Text(stringResource(R.string.common_confirm)) @@ -172,7 +167,7 @@ fun UserSection( color = textColor() ) Text( - text = user?.position ?: "", + text = positionToKorean(user?.position), style = MaterialTheme.typography.bodyMedium, color = textSecondaryColor() ) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1bf8cf7..8aa7007 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -128,6 +128,7 @@ 오류가 발생했습니다 + 내용을 입력해주세요 다시 시도 확인 취소