Skip to content

Commit

Permalink
#91 약 관심 처리 로직 제작 완료
Browse files Browse the repository at this point in the history
  • Loading branch information
pknujsp committed Jun 7, 2023
1 parent 6924768 commit 1f57020
Show file tree
Hide file tree
Showing 17 changed files with 94 additions and 50 deletions.
1 change: 0 additions & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.android.mediproject.core.data.remote.interestedmedicine


import com.android.mediproject.core.model.medicine.InterestedMedicine.AddInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.DeleteInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.InterestedMedicineListResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.IsInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.AddInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.DeleteInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.InterestedMedicineListResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.IsInterestedMedicineResponse
import com.android.mediproject.core.model.requestparameters.AddInterestedMedicineParameter
import kotlinx.coroutines.flow.Flow

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.android.mediproject.core.data.remote.interestedmedicine

import com.android.mediproject.core.model.medicine.InterestedMedicine.AddInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.DeleteInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.InterestedMedicineListResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.IsInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.AddInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.DeleteInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.InterestedMedicineListResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.IsInterestedMedicineResponse
import com.android.mediproject.core.model.requestparameters.AddInterestedMedicineParameter
import com.android.mediproject.core.network.datasource.interestedmedicine.InterestedMedicineDataSource
import kotlinx.coroutines.flow.Flow
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package com.android.mediproject.core.domain

import com.android.mediproject.core.data.remote.interestedmedicine.InterestedMedicineRepository
import com.android.mediproject.core.model.medicine.InterestedMedicine.AddInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.DeleteInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.IsInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.toInterestedMedicineDto
import com.android.mediproject.core.model.medicine.interestedMedicine.IsInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.toInterestedMedicineDto
import com.android.mediproject.core.model.requestparameters.AddInterestedMedicineParameter
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.channelFlow
Expand All @@ -21,16 +19,30 @@ class GetInterestedMedicineUseCase @Inject constructor(private val interestedMed
}

/**
* 관심 약 추가
* 관심 약 추가 or 해제
*
* @param medicineId 약 ID
* @param like 관심 약 추가 여부
*
* like가 true면 관심 약 추가, false면 관심 약 해제 요청
*/
fun addInterestedMedicine(addInterestedMedicineParameter: AddInterestedMedicineParameter): Flow<Result<AddInterestedMedicineResponse>> =
interestedMedicineRepository.addInterestedMedicine(addInterestedMedicineParameter)
fun interestedMedicine(medicineId: Long, like: Boolean): Flow<Result<Unit>> = channelFlow {
if (like) {
interestedMedicineRepository.addInterestedMedicine(AddInterestedMedicineParameter(medicineId))
.collect { addInterestedMedicineResponseResult ->
val result =
addInterestedMedicineResponseResult.fold(onSuccess = { Result.success(Unit) }, onFailure = { Result.failure(it) })
trySend(result)
}
} else {
interestedMedicineRepository.deleteInterestedMedicine(medicineId).collect { deleteInterestedMedicineResponseResult ->
val result =
deleteInterestedMedicineResponseResult.fold(onSuccess = { Result.success(Unit) }, onFailure = { Result.failure(it) })
trySend(result)
}
}
}

/**
* 관심 약 삭제
*/
fun deleteInterestedMedicine(medicineId: Long): Flow<Result<DeleteInterestedMedicineResponse>> =
interestedMedicineRepository.deleteInterestedMedicine(medicineId)

/**
* 관심 약 여부 확인
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.android.mediproject.core.model.medicine.InterestedMedicine
package com.android.mediproject.core.model.medicine.interestedMedicine


import kotlinx.serialization.SerialName
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.android.mediproject.core.model.medicine.InterestedMedicine
package com.android.mediproject.core.model.medicine.interestedMedicine


import kotlinx.serialization.SerialName
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.android.mediproject.core.model.medicine.interestedMedicine

data class InterestedMedicineDto(
val itemSeq: String,
val medicineName: String
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.android.mediproject.core.model.medicine.InterestedMedicine
package com.android.mediproject.core.model.medicine.interestedMedicine

import com.android.mediproject.core.model.medicine.InterestedMedicine.InterestedMedicineDto
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.android.mediproject.core.model.medicine.InterestedMedicine
package com.android.mediproject.core.model.medicine.interestedMedicine

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package com.android.mediproject.core.network.datasource.interestedmedicine


import com.android.mediproject.core.model.medicine.InterestedMedicine.AddInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.DeleteInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.InterestedMedicineListResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.IsInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.AddInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.DeleteInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.InterestedMedicineListResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.IsInterestedMedicineResponse
import com.android.mediproject.core.model.requestparameters.AddInterestedMedicineParameter
import kotlinx.coroutines.flow.Flow

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.android.mediproject.core.network.datasource.interestedmedicine

import com.android.mediproject.core.model.medicine.InterestedMedicine.AddInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.DeleteInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.InterestedMedicineListResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.IsInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.AddInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.DeleteInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.InterestedMedicineListResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.IsInterestedMedicineResponse
import com.android.mediproject.core.model.requestparameters.AddInterestedMedicineParameter
import com.android.mediproject.core.network.module.AwsNetworkApi
import com.android.mediproject.core.network.onResponse
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import com.android.mediproject.core.datastore.TokenDataSourceImpl
import com.android.mediproject.core.model.comments.CommentChangedResponse
import com.android.mediproject.core.model.comments.CommentListResponse
import com.android.mediproject.core.model.comments.LikeResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.AddInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.DeleteInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.InterestedMedicineListResponse
import com.android.mediproject.core.model.medicine.InterestedMedicine.IsInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.MedicineIdResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.AddInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.DeleteInterestedMedicineResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.InterestedMedicineListResponse
import com.android.mediproject.core.model.medicine.interestedMedicine.IsInterestedMedicineResponse
import com.android.mediproject.core.model.remote.sign.SignInResponse
import com.android.mediproject.core.model.remote.sign.SignUpResponse
import com.android.mediproject.core.model.remote.token.ReissueTokenResponse
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import androidx.core.content.ContextCompat
import androidx.core.net.toUri
import androidx.fragment.app.viewModels
import androidx.navigation.findNavController
import com.android.mediproject.core.model.medicine.InterestedMedicine.InterestedMedicineDto
import com.android.mediproject.core.model.medicine.interestedMedicine.InterestedMedicineDto
import com.android.mediproject.core.model.remote.token.CurrentTokenDto
import com.android.mediproject.core.model.remote.token.TokenState
import com.android.mediproject.core.ui.R
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.android.mediproject.feature.interestedmedicine
import androidx.lifecycle.viewModelScope
import com.android.mediproject.core.domain.GetInterestedMedicineUseCase
import com.android.mediproject.core.domain.GetTokenUseCase
import com.android.mediproject.core.model.medicine.InterestedMedicine.InterestedMedicineDto
import com.android.mediproject.core.model.medicine.interestedMedicine.InterestedMedicineDto
import com.android.mediproject.core.model.remote.token.CurrentTokenDto
import com.android.mediproject.core.model.remote.token.TokenState
import com.android.mediproject.core.ui.base.BaseViewModel
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,11 @@ class MedicineInfoFragment : BaseFragment<FragmentMedicineInfoBinding, MedicineI
launch {
fragmentViewModel.eventState.collectLatest {
when (it) {
is EventState.Interest -> {}
is EventState.Interest -> {
binding.interestBtn.isEnabled = it.lockChecked
binding.interestBtn.isChecked = it.isInterest
}

is EventState.ScrollToBottom -> {
binding.topAppBar.setExpanded(false, true)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.android.mediproject.core.common.network.Dispatcher
import com.android.mediproject.core.common.network.MediDispatchers
import com.android.mediproject.core.common.viewmodel.UiState
import com.android.mediproject.core.domain.CommentsUseCase
import com.android.mediproject.core.domain.GetInterestedMedicineUseCase
import com.android.mediproject.core.domain.GetMedicineDetailsUseCase
import com.android.mediproject.core.model.local.navargs.MedicineInfoArgs
import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetatilInfoDto
Expand All @@ -15,6 +16,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asSharedFlow
Expand All @@ -31,6 +33,7 @@ import javax.inject.Inject
class MedicineInfoViewModel @Inject constructor(
private val getMedicineDetailsUseCase: GetMedicineDetailsUseCase,
private val commentsUseCase: CommentsUseCase,
private val interestedMedicineUseCase: GetInterestedMedicineUseCase,
@Dispatcher(MediDispatchers.Default) private val defaultDispatcher: CoroutineDispatcher
) : BaseViewModel() {

Expand All @@ -49,6 +52,8 @@ class MedicineInfoViewModel @Inject constructor(
private val _medicinePrimaryInfo = MutableSharedFlow<MedicineInfoArgs>(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)
val medicinePrimaryInfo get() = _medicinePrimaryInfo.asSharedFlow()

private val isInterestedMedicine = MutableStateFlow(EventState.Interest(isInterest = false, lockChecked = true))

val medicineDetails: StateFlow<UiState<MedicineDetatilInfoDto>> = medicinePrimaryInfo.flatMapLatest { primaryInfo ->
getMedicineDetailsUseCase(primaryInfo).mapLatest { result ->
result.fold(onSuccess = {
Expand All @@ -63,9 +68,34 @@ class MedicineInfoViewModel @Inject constructor(
}
}

fun checkInterestMedicine() {
private fun loadInterestedMedicine(medicineIdInAws: Long) {
viewModelScope.launch {
interestedMedicineUseCase.isInterestedMedicine(medicineIdInAws).collect { responseResult ->
responseResult.onSuccess {
// 관심약 여부를 보여줍니다.
_eventState.emit(EventState.Interest(it.isFavorite, false))
}.onFailure {
// 로그인이 되지 않았거나 그 외의 문제이므로 관심약 여부를 보여주지 않습니다.
// 체크박스를 비활성화 시킵니다.
_eventState.emit(EventState.Interest(lockChecked = true))
}
}
}
}

fun checkInterestMedicine() {
viewModelScope.launch {
if (!isInterestedMedicine.value.lockChecked) {
val newState = !isInterestedMedicine.value.isInterest
interestedMedicineUseCase.interestedMedicine(medicinePrimaryInfo.replayCache.last().itemSeq, newState)
.collect { responseResult ->
responseResult.onSuccess {
_eventState.emit(EventState.Interest(newState, false))
}.onFailure {
_eventState.emit(EventState.Interest(lockChecked = true))
}
}
}
}
}

Expand All @@ -77,6 +107,7 @@ class MedicineInfoViewModel @Inject constructor(
}

sealed class EventState {
data class Interest(val isInterest: Boolean) : EventState()
data class Interest(val isInterest: Boolean = false, val lockChecked: Boolean) : EventState()
object ScrollToBottom : EventState()

}

0 comments on commit 1f57020

Please sign in to comment.