diff --git a/app/src/main/java/org/sopt/certi/data/remote/datasource/UserRemoteDataSource.kt b/app/src/main/java/org/sopt/certi/data/remote/datasource/UserRemoteDataSource.kt index 5f81c568..dc4d9156 100644 --- a/app/src/main/java/org/sopt/certi/data/remote/datasource/UserRemoteDataSource.kt +++ b/app/src/main/java/org/sopt/certi/data/remote/datasource/UserRemoteDataSource.kt @@ -2,8 +2,10 @@ package org.sopt.certi.data.remote.datasource import org.sopt.certi.data.remote.dto.base.ApiResponse import org.sopt.certi.data.remote.dto.base.NullableApiResponse +import org.sopt.certi.data.remote.dto.request.MajorRequestDto import org.sopt.certi.data.remote.dto.request.ModifyInterestedJobRequestDto import org.sopt.certi.data.remote.dto.request.PutPersonalInfoRequestDto +import org.sopt.certi.data.remote.dto.request.UniversityRequestDto import org.sopt.certi.data.remote.dto.response.GetInterestJobListResponseDto import org.sopt.certi.data.remote.dto.response.GetPersonalInfoResponseDto import org.sopt.certi.data.remote.dto.response.GetMyPageResponseDto @@ -19,4 +21,6 @@ interface UserRemoteDataSource { suspend fun getPersonalInfo(): ApiResponse suspend fun putPersonalInfo(request: PutPersonalInfoRequestDto): NullableApiResponse suspend fun getPresignedUrl(): ApiResponse + suspend fun putUniversity(university: UniversityRequestDto): NullableApiResponse + suspend fun putMajor(major: MajorRequestDto): NullableApiResponse } diff --git a/app/src/main/java/org/sopt/certi/data/remote/datasourceimpl/UserRemoteDataSourceImpl.kt b/app/src/main/java/org/sopt/certi/data/remote/datasourceimpl/UserRemoteDataSourceImpl.kt index 295d6968..7f509c7d 100644 --- a/app/src/main/java/org/sopt/certi/data/remote/datasourceimpl/UserRemoteDataSourceImpl.kt +++ b/app/src/main/java/org/sopt/certi/data/remote/datasourceimpl/UserRemoteDataSourceImpl.kt @@ -3,8 +3,10 @@ package org.sopt.certi.data.remote.datasourceimpl import org.sopt.certi.data.remote.datasource.UserRemoteDataSource import org.sopt.certi.data.remote.dto.base.ApiResponse import org.sopt.certi.data.remote.dto.base.NullableApiResponse +import org.sopt.certi.data.remote.dto.request.MajorRequestDto import org.sopt.certi.data.remote.dto.request.ModifyInterestedJobRequestDto import org.sopt.certi.data.remote.dto.request.PutPersonalInfoRequestDto +import org.sopt.certi.data.remote.dto.request.UniversityRequestDto import org.sopt.certi.data.remote.dto.response.GetInterestJobListResponseDto import org.sopt.certi.data.remote.dto.response.GetMyPageResponseDto import org.sopt.certi.data.remote.dto.response.GetPersonalInfoResponseDto @@ -40,4 +42,10 @@ class UserRemoteDataSourceImpl @Inject constructor( override suspend fun getPresignedUrl(): ApiResponse = userService.getPresignedUrl() + + override suspend fun putUniversity(university: UniversityRequestDto): NullableApiResponse = + userService.putUniversity(university) + + override suspend fun putMajor(major: MajorRequestDto): NullableApiResponse = + userService.putMajor(major) } diff --git a/app/src/main/java/org/sopt/certi/data/remote/dto/request/MajorRequestDto.kt b/app/src/main/java/org/sopt/certi/data/remote/dto/request/MajorRequestDto.kt new file mode 100644 index 00000000..e213f8c7 --- /dev/null +++ b/app/src/main/java/org/sopt/certi/data/remote/dto/request/MajorRequestDto.kt @@ -0,0 +1,10 @@ +package org.sopt.certi.data.remote.dto.request + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class MajorRequestDto( + @SerialName("majorName") + val majorName: String +) diff --git a/app/src/main/java/org/sopt/certi/data/remote/dto/request/UniversityRequestDto.kt b/app/src/main/java/org/sopt/certi/data/remote/dto/request/UniversityRequestDto.kt new file mode 100644 index 00000000..d748c277 --- /dev/null +++ b/app/src/main/java/org/sopt/certi/data/remote/dto/request/UniversityRequestDto.kt @@ -0,0 +1,10 @@ +package org.sopt.certi.data.remote.dto.request + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class UniversityRequestDto( + @SerialName("universityName") + val universityName: String +) diff --git a/app/src/main/java/org/sopt/certi/data/remote/service/UserService.kt b/app/src/main/java/org/sopt/certi/data/remote/service/UserService.kt index 0184e42c..aff7ca1a 100644 --- a/app/src/main/java/org/sopt/certi/data/remote/service/UserService.kt +++ b/app/src/main/java/org/sopt/certi/data/remote/service/UserService.kt @@ -2,8 +2,10 @@ package org.sopt.certi.data.remote.service import org.sopt.certi.data.remote.dto.base.ApiResponse import org.sopt.certi.data.remote.dto.base.NullableApiResponse +import org.sopt.certi.data.remote.dto.request.MajorRequestDto import org.sopt.certi.data.remote.dto.request.ModifyInterestedJobRequestDto import org.sopt.certi.data.remote.dto.request.PutPersonalInfoRequestDto +import org.sopt.certi.data.remote.dto.request.UniversityRequestDto import org.sopt.certi.data.remote.dto.response.GetInterestJobListResponseDto import org.sopt.certi.data.remote.dto.response.GetMyPageResponseDto import org.sopt.certi.data.remote.dto.response.GetPersonalInfoResponseDto @@ -41,4 +43,10 @@ interface UserService { @GET("/api/v1/user/presigned-url") suspend fun getPresignedUrl(): ApiResponse + + @PUT("/api/v1/user/university") + suspend fun putUniversity(@Body request: UniversityRequestDto): NullableApiResponse + + @PUT("/api/v1/user/major") + suspend fun putMajor(@Body request: MajorRequestDto): NullableApiResponse } diff --git a/app/src/main/java/org/sopt/certi/data/repositoryimpl/UserRepositoryImpl.kt b/app/src/main/java/org/sopt/certi/data/repositoryimpl/UserRepositoryImpl.kt index 2a773aab..7057ac5e 100644 --- a/app/src/main/java/org/sopt/certi/data/repositoryimpl/UserRepositoryImpl.kt +++ b/app/src/main/java/org/sopt/certi/data/repositoryimpl/UserRepositoryImpl.kt @@ -4,7 +4,9 @@ import org.sopt.certi.data.mapper.todomain.image.toDomain import org.sopt.certi.data.mapper.todomain.user.toDomain import org.sopt.certi.data.mapper.todto.user.toDto import org.sopt.certi.data.remote.datasource.UserRemoteDataSource +import org.sopt.certi.data.remote.dto.request.MajorRequestDto import org.sopt.certi.data.remote.dto.request.ModifyInterestedJobRequestDto +import org.sopt.certi.data.remote.dto.request.UniversityRequestDto import org.sopt.certi.data.remote.util.HttpResponseHandler.handleApiResponse import org.sopt.certi.data.remote.util.HttpResponseHandler.handleNullableApiResponse import org.sopt.certi.data.remote.util.safeApiCall @@ -72,4 +74,16 @@ class UserRepositoryImpl @Inject constructor( .getOrThrow() .toDomain() } + + override suspend fun putUniversity(university: String): Result = safeApiCall { + userRemoteDataSource.putUniversity(UniversityRequestDto(university)) + .handleNullableApiResponse() + .getOrThrow() + } + + override suspend fun putMajor(major: String): Result = safeApiCall { + userRemoteDataSource.putMajor(MajorRequestDto(major)) + .handleNullableApiResponse() + .getOrThrow() + } } diff --git a/app/src/main/java/org/sopt/certi/domain/repository/UserRepository.kt b/app/src/main/java/org/sopt/certi/domain/repository/UserRepository.kt index e2a90c45..f48c83be 100644 --- a/app/src/main/java/org/sopt/certi/domain/repository/UserRepository.kt +++ b/app/src/main/java/org/sopt/certi/domain/repository/UserRepository.kt @@ -14,4 +14,6 @@ interface UserRepository { suspend fun getPersonalInfo(): Result suspend fun putPersonalInfo(request: PersonalInfo): Result suspend fun getPresignedUrl(): Result + suspend fun putUniversity(university: String): Result + suspend fun putMajor(major: String): Result } diff --git a/app/src/main/java/org/sopt/certi/domain/usecase/user/PutMajorUseCase.kt b/app/src/main/java/org/sopt/certi/domain/usecase/user/PutMajorUseCase.kt new file mode 100644 index 00000000..83c24863 --- /dev/null +++ b/app/src/main/java/org/sopt/certi/domain/usecase/user/PutMajorUseCase.kt @@ -0,0 +1,11 @@ +package org.sopt.certi.domain.usecase.user + +import org.sopt.certi.domain.repository.UserRepository +import javax.inject.Inject + +class PutMajorUseCase @Inject constructor( + private val userRepository: UserRepository +) { + suspend operator fun invoke(major: String): Result = + userRepository.putMajor(major) +} diff --git a/app/src/main/java/org/sopt/certi/domain/usecase/user/PutUniversityUseCase.kt b/app/src/main/java/org/sopt/certi/domain/usecase/user/PutUniversityUseCase.kt new file mode 100644 index 00000000..3881d6f6 --- /dev/null +++ b/app/src/main/java/org/sopt/certi/domain/usecase/user/PutUniversityUseCase.kt @@ -0,0 +1,11 @@ +package org.sopt.certi.domain.usecase.user + +import org.sopt.certi.domain.repository.UserRepository +import javax.inject.Inject + +class PutUniversityUseCase @Inject constructor( + private val userRepository: UserRepository +) { + suspend operator fun invoke(university: String): Result = + userRepository.putUniversity(university) +} diff --git a/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/AcademicInfoViewModel.kt b/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/AcademicInfoViewModel.kt index 6163bce3..b3299987 100644 --- a/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/AcademicInfoViewModel.kt +++ b/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/AcademicInfoViewModel.kt @@ -7,31 +7,43 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import org.sopt.certi.core.state.UiState import org.sopt.certi.domain.type.CategoryType -import org.sopt.certi.domain.usecase.auth.SearchMajorUseCase -import org.sopt.certi.domain.usecase.auth.SearchUnivUseCase +import org.sopt.certi.domain.usecase.user.GetInterestedJobListUseCase +import org.sopt.certi.domain.usecase.user.ModifyInterestedJobListUseCase import org.sopt.certi.presentation.ui.myacademicinfo.state.AcademicUiState -import org.sopt.certi.presentation.ui.myacademicinfo.state.EditSearchUiState +import timber.log.Timber import javax.inject.Inject @HiltViewModel class AcademicInfoViewModel @Inject constructor( - private val searchUnivUseCase: SearchUnivUseCase, - private val searchMajorUseCase: SearchMajorUseCase + private val getInterestedJobListUseCase: GetInterestedJobListUseCase, + private val modifyInterestedJobListUseCase: ModifyInterestedJobListUseCase ) : ViewModel() { private val _academicUiState = MutableStateFlow(AcademicUiState()) val academicUiState = _academicUiState.asStateFlow() - private val _editUnivUiState = MutableStateFlow(EditSearchUiState()) - val editUnivUiState = _editUnivUiState.asStateFlow() - - private val _editMajorUiState = MutableStateFlow(EditSearchUiState()) - val editMajorUiState = _editMajorUiState.asStateFlow() - private val _editingCategoryList = MutableStateFlow>(emptyList()) val editingCategoryList = _editingCategoryList.asStateFlow() + init { + getJobList() + } + + private fun getJobList() = viewModelScope.launch { + getInterestedJobListUseCase() + .onSuccess { resultStringList -> + val categoryList = resultStringList.jobList.mapNotNull { description -> + CategoryType.getByDescription(description) + } + _academicUiState.update { currentState -> + currentState.copy(selectedCategoryList = categoryList) + } + } + .onFailure { error -> + Timber.e(error, "Job List 불러오기 실패") + } + } + fun startCategoryEditing() { _editingCategoryList.value = _academicUiState.value.selectedCategoryList.toList() } @@ -46,79 +58,16 @@ class AcademicInfoViewModel @Inject constructor( _editingCategoryList.value = currentList } - fun saveCategoryChanges() { - _academicUiState.update { - it.copy(selectedCategoryList = _editingCategoryList.value) - } - } - - fun getUnivList(univSearchText: String) { - viewModelScope.launch { - _editUnivUiState.update { it.copy(searchListLoadState = UiState.Loading) } - searchUnivUseCase(univSearchText) - .onSuccess { result -> - if (result.isEmpty()) { - _editUnivUiState.update { it.copy(searchListLoadState = UiState.Empty) } - } else { - _editUnivUiState.update { it.copy(searchListLoadState = UiState.Success(result)) } - } - }.onFailure { - _editUnivUiState.update { it.copy(searchListLoadState = UiState.Failure(it.toString())) } - } - } - _editUnivUiState.update { it.copy(searchText = univSearchText) } - } - - fun onUnivSearchTextChange(univSearchText: String) { - _editUnivUiState.update { it.copy(searchText = univSearchText) } - if (univSearchText.isBlank()) { - _editUnivUiState.update { it.copy(searchListLoadState = UiState.Init) } - } - } - - fun selectUniv(univName: String) { - _editUnivUiState.update { - it.copy( - searchText = univName, - submittedSearchText = univName - ) - } - } - - fun onUnivSaveClick() {} - - fun getMajorList(majorSearchText: String) { - viewModelScope.launch { - _editMajorUiState.update { it.copy(searchListLoadState = UiState.Loading) } - searchMajorUseCase(majorSearchText) - .onSuccess { result -> - if (result.isEmpty()) { - _editMajorUiState.update { it.copy(searchListLoadState = UiState.Empty) } - } else { - _editMajorUiState.update { it.copy(searchListLoadState = UiState.Success(result)) } - } - }.onFailure { - _editMajorUiState.update { it.copy(searchListLoadState = UiState.Failure(it.toString())) } + fun saveCategoryChanges() = viewModelScope.launch { + val request = _editingCategoryList.value.map { it.description } + modifyInterestedJobListUseCase(request) + .onSuccess { + _academicUiState.update { + it.copy(selectedCategoryList = _editingCategoryList.value) } - } - _editMajorUiState.update { it.copy(searchText = majorSearchText) } + } + .onFailure { error -> + Timber.e(error, "희망분야 재설정 실패") + } } - - fun onMajorSearchTextChange(majorSearchText: String) { - _editMajorUiState.update { it.copy(searchText = majorSearchText) } - if (majorSearchText.isBlank()) { - _editMajorUiState.update { it.copy(searchListLoadState = UiState.Init) } - } - } - - fun selectMajor(majorName: String) { - _editMajorUiState.update { - it.copy( - searchText = majorName, - submittedSearchText = majorName - ) - } - } - - fun onMajorSaveClick() {} } diff --git a/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/EditMajorViewModel.kt b/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/EditMajorViewModel.kt new file mode 100644 index 00000000..09f149b3 --- /dev/null +++ b/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/EditMajorViewModel.kt @@ -0,0 +1,72 @@ +package org.sopt.certi.presentation.ui.myacademicinfo + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import org.sopt.certi.core.state.UiState +import org.sopt.certi.domain.usecase.auth.SearchMajorUseCase +import org.sopt.certi.domain.usecase.user.PutMajorUseCase +import org.sopt.certi.presentation.ui.myacademicinfo.state.EditSearchUiState +import timber.log.Timber +import javax.inject.Inject + +@HiltViewModel +class EditMajorViewModel @Inject constructor( + private val searchMajorUseCase: SearchMajorUseCase, + private val putMajorUseCase: PutMajorUseCase +) : ViewModel() { + private val _editMajorUiState = MutableStateFlow(EditSearchUiState()) + val editMajorUiState = _editMajorUiState.asStateFlow() + + fun getMajorList(majorSearchText: String) { + viewModelScope.launch { + _editMajorUiState.update { it.copy(searchListLoadState = UiState.Loading) } + searchMajorUseCase(majorSearchText) + .onSuccess { result -> + if (result.isEmpty()) { + _editMajorUiState.update { it.copy(searchListLoadState = UiState.Empty) } + } else { + _editMajorUiState.update { it.copy(searchListLoadState = UiState.Success(result)) } + } + }.onFailure { + _editMajorUiState.update { it.copy(searchListLoadState = UiState.Failure(it.toString())) } + } + } + _editMajorUiState.update { it.copy(searchText = majorSearchText) } + } + + fun onMajorSearchTextChange(majorSearchText: String) { + _editMajorUiState.update { it.copy(searchText = majorSearchText) } + if (majorSearchText.isBlank()) { + _editMajorUiState.update { it.copy(searchListLoadState = UiState.Init) } + } + } + + fun selectMajor(majorName: String) { + _editMajorUiState.update { + it.copy( + searchText = majorName, + submittedSearchText = majorName + ) + } + } + + fun onMajorSaveClick() = viewModelScope.launch { + val submittedText = _editMajorUiState.value.submittedSearchText + putMajorUseCase(submittedText) + .onSuccess { + _editMajorUiState.update { + it.copy( + initialValue = submittedText + ) + } + } + .onFailure { error -> + Timber.e(error, "학과 변경 실패") + } + } +} diff --git a/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/EditSearchScreen.kt b/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/EditSearchScreen.kt index 8352a8b4..89071a5d 100644 --- a/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/EditSearchScreen.kt +++ b/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/EditSearchScreen.kt @@ -36,7 +36,7 @@ import org.sopt.certi.ui.theme.CertiTheme @Composable fun EditUnivRoute( padding: PaddingValues, - viewModel: AcademicInfoViewModel = hiltViewModel() + viewModel: EditUnivViewModel = hiltViewModel() ) { val uiState by viewModel.editUnivUiState.collectAsStateWithLifecycle() @@ -55,7 +55,7 @@ fun EditUnivRoute( @Composable fun EditMajorRoute( padding: PaddingValues, - viewModel: AcademicInfoViewModel = hiltViewModel() + viewModel: EditMajorViewModel = hiltViewModel() ) { val uiState by viewModel.editMajorUiState.collectAsStateWithLifecycle() diff --git a/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/EditUnivViewModel.kt b/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/EditUnivViewModel.kt new file mode 100644 index 00000000..7dd95387 --- /dev/null +++ b/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/EditUnivViewModel.kt @@ -0,0 +1,72 @@ +package org.sopt.certi.presentation.ui.myacademicinfo + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import org.sopt.certi.core.state.UiState +import org.sopt.certi.domain.usecase.auth.SearchUnivUseCase +import org.sopt.certi.domain.usecase.user.PutUniversityUseCase +import org.sopt.certi.presentation.ui.myacademicinfo.state.EditSearchUiState +import timber.log.Timber +import javax.inject.Inject + +@HiltViewModel +class EditUnivViewModel @Inject constructor( + private val searchUnivUseCase: SearchUnivUseCase, + private val putUniversityUseCase: PutUniversityUseCase +) : ViewModel() { + private val _editUnivUiState = MutableStateFlow(EditSearchUiState()) + val editUnivUiState = _editUnivUiState.asStateFlow() + + fun getUnivList(univSearchText: String) { + viewModelScope.launch { + _editUnivUiState.update { it.copy(searchListLoadState = UiState.Loading) } + searchUnivUseCase(univSearchText) + .onSuccess { result -> + if (result.isEmpty()) { + _editUnivUiState.update { it.copy(searchListLoadState = UiState.Empty) } + } else { + _editUnivUiState.update { it.copy(searchListLoadState = UiState.Success(result)) } + } + }.onFailure { + _editUnivUiState.update { it.copy(searchListLoadState = UiState.Failure(it.toString())) } + } + } + _editUnivUiState.update { it.copy(searchText = univSearchText) } + } + + fun onUnivSearchTextChange(univSearchText: String) { + _editUnivUiState.update { it.copy(searchText = univSearchText) } + if (univSearchText.isBlank()) { + _editUnivUiState.update { it.copy(searchListLoadState = UiState.Init) } + } + } + + fun selectUniv(univName: String) { + _editUnivUiState.update { + it.copy( + searchText = univName, + submittedSearchText = univName + ) + } + } + + fun onUnivSaveClick() = viewModelScope.launch { + val submittedText = _editUnivUiState.value.submittedSearchText + putUniversityUseCase(submittedText) + .onSuccess { + _editUnivUiState.update { + it.copy( + initialValue = submittedText + ) + } + } + .onFailure { error -> + Timber.e(error, "대학교 변경 실패") + } + } +} diff --git a/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/state/EditSearchUiState.kt b/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/state/EditSearchUiState.kt index e1c59ed3..e36e38ea 100644 --- a/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/state/EditSearchUiState.kt +++ b/app/src/main/java/org/sopt/certi/presentation/ui/myacademicinfo/state/EditSearchUiState.kt @@ -3,6 +3,7 @@ package org.sopt.certi.presentation.ui.myacademicinfo.state import org.sopt.certi.core.state.UiState data class EditSearchUiState( + val initialValue: String = "", val searchText: String = "", val searchListLoadState: UiState> = UiState.Init, val submittedSearchText: String = "" @@ -15,5 +16,5 @@ data class EditSearchUiState( } val isSaveEnable: Boolean - get() = submittedSearchText.isNotBlank() + get() = submittedSearchText.isNotBlank() && submittedSearchText != initialValue } diff --git a/app/src/main/java/org/sopt/certi/presentation/ui/mypage/MyPageMainScreen.kt b/app/src/main/java/org/sopt/certi/presentation/ui/mypage/MyPageMainScreen.kt index e7f9a529..0f0320ed 100644 --- a/app/src/main/java/org/sopt/certi/presentation/ui/mypage/MyPageMainScreen.kt +++ b/app/src/main/java/org/sopt/certi/presentation/ui/mypage/MyPageMainScreen.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.runtime.Composable @@ -18,7 +19,6 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.LifecycleEventEffect import androidx.lifecycle.compose.collectAsStateWithLifecycle import org.sopt.certi.R -import org.sopt.certi.core.state.UiState import org.sopt.certi.core.util.screenHeightDp import org.sopt.certi.domain.model.user.CertificationCount import org.sopt.certi.domain.model.user.MyPageInfo @@ -44,20 +44,15 @@ fun MyPageMainRoute( viewModel.loadMyPageData() } - when (val state = uiState.myPageInfoLoadState) { - is UiState.Success -> { - MyPageMainScreen( - uiState = state.data, - onPersonalInfoClick = navigateToPersonalInfo, - onSchoolInfoClick = navigateToSchoolInfo, - onCertManageClick = navigateToCertManage, - onSettingClick = navigateToSetting, - onQuestionsClick = navigateToQuestion, - modifier = Modifier.padding(padding) - ) - } - else -> {} - } + MyPageMainScreen( + uiState = uiState.myPageInfo, + onPersonalInfoClick = navigateToPersonalInfo, + onSchoolInfoClick = navigateToSchoolInfo, + onCertManageClick = navigateToCertManage, + onSettingClick = navigateToSetting, + onQuestionsClick = navigateToQuestion, + modifier = Modifier.padding(padding) + ) } @Composable @@ -81,6 +76,7 @@ fun MyPageMainScreen( ) LazyColumn( modifier = Modifier + .fillMaxSize() .background(CertiTheme.colors.gray0) .padding(horizontal = screenHeightDp(20.dp), vertical = screenHeightDp(20.dp)), verticalArrangement = Arrangement.spacedBy(screenHeightDp(16.dp)) diff --git a/app/src/main/java/org/sopt/certi/presentation/ui/mypage/MyPageMainViewModel.kt b/app/src/main/java/org/sopt/certi/presentation/ui/mypage/MyPageMainViewModel.kt index bd97de83..c4466d00 100644 --- a/app/src/main/java/org/sopt/certi/presentation/ui/mypage/MyPageMainViewModel.kt +++ b/app/src/main/java/org/sopt/certi/presentation/ui/mypage/MyPageMainViewModel.kt @@ -22,7 +22,12 @@ class MyPageMainViewModel@Inject constructor( fun loadMyPageData() = viewModelScope.launch { myPageUseCase() .onSuccess { result -> - _uiState.update { it.copy(myPageInfoLoadState = UiState.Success(result)) } + _uiState.update { + it.copy( + myPageInfoLoadState = UiState.Success(Unit), + myPageInfo = result + ) + } } .onFailure { _uiState.update { it.copy(myPageInfoLoadState = UiState.Failure(it.toString())) } diff --git a/app/src/main/java/org/sopt/certi/presentation/ui/mypage/state/MyPageUiSate.kt b/app/src/main/java/org/sopt/certi/presentation/ui/mypage/state/MyPageUiSate.kt index 43be1f58..b6bec802 100644 --- a/app/src/main/java/org/sopt/certi/presentation/ui/mypage/state/MyPageUiSate.kt +++ b/app/src/main/java/org/sopt/certi/presentation/ui/mypage/state/MyPageUiSate.kt @@ -1,8 +1,16 @@ package org.sopt.certi.presentation.ui.mypage.state import org.sopt.certi.core.state.UiState +import org.sopt.certi.domain.model.user.CertificationCount import org.sopt.certi.domain.model.user.MyPageInfo data class MyPageUiSate( - val myPageInfoLoadState: UiState = UiState.Loading + val myPageInfoLoadState: UiState = UiState.Loading, + val myPageInfo: MyPageInfo = MyPageInfo( + nickname = "", + email = "", + profileImageUrl = "", + jobs = emptyList(), + certificationCount = CertificationCount(0, 0, 0) + ) )