Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT/#48] 설정뷰 / 설정 화면 정보 API 구현 #49

Merged
merged 4 commits into from
Jul 16, 2024
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
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@ import co.orange.data.dataSource.DeviceDataSource
import co.orange.data.dataSource.HomeDataSource
import co.orange.data.dataSource.ProfileDataSource
import co.orange.data.dataSource.SearchDataSource
import co.orange.data.dataSource.SettingDataSource
import co.orange.data.dataSourceImpl.AuthDataSourceImpl
import co.orange.data.dataSourceImpl.DeviceDataSourceImpl
import co.orange.data.dataSourceImpl.HomeDataSourceImpl
import co.orange.data.dataSourceImpl.ProfileDataSourceImpl
import co.orange.data.dataSourceImpl.SearchDataSourceImpl
import co.orange.data.dataSourceImpl.SettingDataSourceImpl
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand Down Expand Up @@ -38,4 +40,8 @@ object DataSourceModule {
@Provides
@Singleton
fun provideProfileDataSource(profileDataSourceImpl: ProfileDataSourceImpl): ProfileDataSource = profileDataSourceImpl

@Provides
@Singleton
fun providesSettingDataSource(settingDataSourceImpl: SettingDataSourceImpl): SettingDataSource = settingDataSourceImpl
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@ import co.orange.data.repositoryImpl.DeviceRepositoryImpl
import co.orange.data.repositoryImpl.HomeRepositoryImpl
import co.orange.data.repositoryImpl.ProfileRepositoryImpl
import co.orange.data.repositoryImpl.SearchRepositoryImpl
import co.orange.data.repositoryImpl.SettingRepositoryImpl
import co.orange.domain.repository.AuthRepository
import co.orange.domain.repository.DeviceRepository
import co.orange.domain.repository.HomeRepository
import co.orange.domain.repository.ProfileRepository
import co.orange.domain.repository.SearchRepository
import co.orange.domain.repository.SettingRepository
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand Down Expand Up @@ -38,4 +40,8 @@ object RepositoryModule {
@Provides
@Singleton
fun provideProfileRepository(profileRepositoryImpl: ProfileRepositoryImpl): ProfileRepository = profileRepositoryImpl

@Provides
@Singleton
fun provideSettingRepository(settingRepositoryImpl: SettingRepositoryImpl): SettingRepository = settingRepositoryImpl
}
8 changes: 8 additions & 0 deletions app/src/main/java/co/orange/ddanzi/di/module/ServiceModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import co.orange.data.service.DeviceService
import co.orange.data.service.HomeService
import co.orange.data.service.ProfileService
import co.orange.data.service.SearchService
import co.orange.data.service.SettingService
import co.orange.ddanzi.di.qualifier.RetrofitQualifier
import dagger.Module
import dagger.Provides
Expand Down Expand Up @@ -46,4 +47,11 @@ object ServiceModule {
fun provideProfileService(
@RetrofitQualifier.NOTOKEN retrofit: Retrofit,
): ProfileService = retrofit.create(ProfileService::class.java)

// TODO
@Provides
@Singleton
fun provideSettingService(
@RetrofitQualifier.NOTOKEN retrofit: Retrofit,
): SettingService = retrofit.create(SettingService::class.java)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package co.orange.data.dataSource

import co.orange.data.dto.BaseResponse
import co.orange.data.dto.response.SettingInfoDto

interface SettingDataSource {
suspend fun getSettingInfo(): BaseResponse<SettingInfoDto>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package co.orange.data.dataSourceImpl

import co.orange.data.dataSource.SettingDataSource
import co.orange.data.dto.BaseResponse
import co.orange.data.dto.response.SettingInfoDto
import co.orange.data.service.SettingService
import javax.inject.Inject

data class SettingDataSourceImpl
@Inject
constructor(
private val settingService: SettingService,
) : SettingDataSource {
override suspend fun getSettingInfo(): BaseResponse<SettingInfoDto> = settingService.getSettingInfo()
}
17 changes: 17 additions & 0 deletions data/src/main/java/co/orange/data/dto/response/SettingInfoDto.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package co.orange.data.dto.response

import co.orange.domain.entity.response.SettingInfoModel
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class SettingInfoDto(
@SerialName("name")
val name: String,
@SerialName("nickname")
val nickname: String,
@SerialName("phone")
val phone: String,
) {
fun toModel() = SettingInfoModel(name, nickname, phone)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package co.orange.data.repositoryImpl

import co.orange.data.dataSource.SettingDataSource
import co.orange.domain.entity.response.SettingInfoModel
import co.orange.domain.repository.SettingRepository
import javax.inject.Inject

class SettingRepositoryImpl
@Inject
constructor(
private val settingDataSource: SettingDataSource,
) : SettingRepository {
override suspend fun getSettingInfo(): Result<SettingInfoModel> =
runCatching {
settingDataSource.getSettingInfo().data.toModel()
}
}
10 changes: 10 additions & 0 deletions data/src/main/java/co/orange/data/service/SettingService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package co.orange.data.service

import co.orange.data.dto.BaseResponse
import co.orange.data.dto.response.SettingInfoDto
import retrofit2.http.GET

interface SettingService {
@GET("/api/v1/mypage/setting")
suspend fun getSettingInfo(): BaseResponse<SettingInfoDto>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package co.orange.domain.entity.response

data class SettingInfoModel(
val name: String,
val nickname: String,
val phone: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package co.orange.domain.repository

import co.orange.domain.entity.response.SettingInfoModel

interface SettingRepository {
suspend fun getSettingInfo(): Result<SettingInfoModel>
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,20 @@ package co.orange.presentation.setting
import android.content.Intent
import android.os.Bundle
import androidx.activity.viewModels
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import co.orange.core.base.BaseActivity
import co.orange.core.extension.setOnSingleClickListener
import co.orange.domain.entity.response.SettingModel
import co.orange.core.extension.stringOf
import co.orange.core.extension.toast
import co.orange.core.state.UiState
import co.orange.presentation.setting.account.AccountActivity
import co.orange.presentation.setting.bank.BankActivity
import co.orange.presentation.setting.delivery.DeliveryActivity
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kr.genti.presentation.R
import kr.genti.presentation.databinding.ActivitySettingBinding

Expand All @@ -24,7 +31,7 @@ class SettingActivity : BaseActivity<ActivitySettingBinding>(R.layout.activity_s
initDeliveryManageBtnListener()
initBankManageBtnListener()
initAccountManageBtnListener()
setSettingInfo(viewModel.mockSettingModel)
observeGetSettingInfoState()
}

private fun initBackBtnListener() {
Expand Down Expand Up @@ -55,11 +62,21 @@ class SettingActivity : BaseActivity<ActivitySettingBinding>(R.layout.activity_s
}
}

private fun setSettingInfo(item: SettingModel) {
with(binding) {
tvSettingInfoName.text = item.name
tvSettingInfoPhone.text = item.phone
tvSettingInfoNickname.text = item.nickname
}
private fun observeGetSettingInfoState() {
viewModel.getSettingInfoState.flowWithLifecycle(lifecycle).distinctUntilChanged()
.onEach { state ->
when (state) {
is UiState.Success -> {
with(binding) {
tvSettingInfoName.text = state.data.name
tvSettingInfoPhone.text = state.data.phone
tvSettingInfoNickname.text = state.data.nickname
}
}

is UiState.Failure -> toast(stringOf(R.string.error_msg))
else -> return@onEach
}
}.launchIn(lifecycleScope)
}
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,39 @@
package co.orange.presentation.setting

import androidx.lifecycle.ViewModel
import co.orange.domain.entity.response.SettingModel
import androidx.lifecycle.viewModelScope
import co.orange.core.state.UiState
import co.orange.domain.entity.response.SettingInfoModel
import co.orange.domain.repository.SettingRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class SettingViewModel
@Inject
constructor(
// private val feedRepository: FeedRepository,
private val settingRepository: SettingRepository,
) : ViewModel() {
val mockSettingModel =
SettingModel(
"김상호",
"행복한물개물개물개",
"010-1234-5678",
)
private val _getSettingInfoState = MutableStateFlow<UiState<SettingInfoModel>>(UiState.Empty)
val getSettingInfoState: StateFlow<UiState<SettingInfoModel>> = _getSettingInfoState

init {
getSettingInfoFromServer()
}

private fun getSettingInfoFromServer() {
_getSettingInfoState.value = UiState.Loading
viewModelScope.launch {
settingRepository.getSettingInfo()
.onSuccess {
_getSettingInfoState.value = UiState.Success(it)
}
.onFailure {
_getSettingInfoState.value = UiState.Failure(it.message.toString())
}
}
}
}
Loading