From 60a7aef136972f63902baf4e85ff554f23896ccd Mon Sep 17 00:00:00 2001 From: JSPark <48265129+pknujsp@users.noreply.github.com> Date: Thu, 8 Jun 2023 03:34:28 +0900 Subject: [PATCH 1/9] =?UTF-8?q?#91=20=EB=8C=93=EA=B8=80=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 3 +- .../remote/comments/CommentsRepository.kt | 3 +- .../remote/comments/CommentsRepositoryImpl.kt | 6 +- .../data/remote/sign/SignRepositoryImpl.kt | 4 +- .../remote/user/UserInfoRepositoryImpl.kt | 1 - .../mediproject/core/datastore/TokenServer.kt | 2 +- .../core/domain/CommentsUseCase.kt | 27 ++++- .../model/comments/CommentChangedResponse.kt | 2 +- .../core/model/comments/CommentDto.kt | 8 +- .../model/comments/CommentListResponse.kt | 25 +++-- .../core/model/comments/LikeResponse.kt | 12 ++ .../requestparameters/LikeCommentParameter.kt | 9 +- .../datasource/comments/CommentsDataSource.kt | 3 +- .../comments/CommentsDataSourceImpl.kt | 11 +- .../core/network/module/AwsNetwork.kt | 20 +++- .../commentsofamedicine/CommentsAdapter.kt | 10 +- .../MedicineCommentsFragment.kt | 21 +++- .../MedicineCommentsViewModel.kt | 104 ++++++++++++------ .../RecentCommentsAdapter.kt | 10 +- .../res/drawable/baseline_thumb_up_24.xml | 5 + .../res/layout/fragment_medicine_comments.xml | 63 +++++++++-- .../comments/src/main/res/values/strings.xml | 4 + .../medicine/main/MedicineInfoViewModel.kt | 16 ++- .../feature/search/SearchMedicinesFragment.kt | 3 +- 24 files changed, 275 insertions(+), 97 deletions(-) create mode 100644 core/model/src/main/java/com/android/mediproject/core/model/comments/LikeResponse.kt create mode 100644 feature/comments/src/main/res/drawable/baseline_thumb_up_24.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index 8bc4a8ec4..cf0ba30d9 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,10 +1,11 @@ + diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/comments/CommentsRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/comments/CommentsRepository.kt index ef3dbe146..1568281c9 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/comments/CommentsRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/remote/comments/CommentsRepository.kt @@ -3,6 +3,7 @@ package com.android.mediproject.core.data.remote.comments import androidx.paging.PagingData 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.comments.MyCommentDto import com.android.mediproject.core.model.requestparameters.DeleteCommentParameter import com.android.mediproject.core.model.requestparameters.EditCommentParameter @@ -39,5 +40,5 @@ interface CommentsRepository { /** * 댓글 좋아요 클릭 */ - fun likeComment(parameter: LikeCommentParameter): Flow> + fun likeComment(parameter: LikeCommentParameter): Flow> } \ No newline at end of file diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/comments/CommentsRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/comments/CommentsRepositoryImpl.kt index 65be1cc32..c56b6cc24 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/comments/CommentsRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/remote/comments/CommentsRepositoryImpl.kt @@ -7,6 +7,7 @@ import com.android.mediproject.core.common.AWS_LOAD_PAGE_SIZE import com.android.mediproject.core.data.remote.sign.SignRepository 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.comments.MyCommentDto import com.android.mediproject.core.model.remote.token.TokenState import com.android.mediproject.core.model.requestparameters.DeleteCommentParameter @@ -23,7 +24,8 @@ import kotlinx.coroutines.flow.lastOrNull import javax.inject.Inject class CommentsRepositoryImpl @Inject constructor( - private val commentsDataSource: CommentsDataSource, private val signRepository: SignRepository) : CommentsRepository { + private val commentsDataSource: CommentsDataSource, private val signRepository: SignRepository +) : CommentsRepository { override fun getCommentsForAMedicine(medicineId: Long): Flow> = Pager(config = PagingConfig(pageSize = AWS_LOAD_PAGE_SIZE, prefetchDistance = 5), pagingSourceFactory = { CommentsListDataSourceImpl(commentsDataSource, medicineId) @@ -70,7 +72,7 @@ class CommentsRepositoryImpl @Inject constructor( } } - override fun likeComment(parameter: LikeCommentParameter): Flow> = channelFlow { + override fun likeComment(parameter: LikeCommentParameter): Flow> = channelFlow { checkToken().collectLatest { tokenState -> tokenState.onSuccess { commentsDataSource.likeComment(parameter).collectLatest { diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/sign/SignRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/sign/SignRepositoryImpl.kt index 6015c749b..e80dbf9c0 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/sign/SignRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/remote/sign/SignRepositoryImpl.kt @@ -45,7 +45,7 @@ class SignRepositoryImpl @Inject constructor( signInResult.onSuccess { // 내 계정 정보 메모리에 저장 userInfoRepository.updateMyAccountInfo(AccountState.SignedIn(it._userId!!.toLong(), it._nickName!!, it._email!!)) - saveMyAccountInfo(if (signInParameter.isSavedEmail) it._email!! else "", it._nickName!!, it._userId!!.toLong()) + saveMyAccountInfo(it._email!!, it._nickName!!, it._userId!!.toLong()) } } @@ -78,7 +78,7 @@ class SignRepositoryImpl @Inject constructor( signUpResult.onSuccess { // 내 계정 정보 메모리에 저장 userInfoRepository.updateMyAccountInfo(AccountState.SignedIn(it._userId!!.toLong(), it._nickName!!, it._email!!)) - saveMyAccountInfo("", it._nickName!!, it._userId!!.toLong()) + saveMyAccountInfo(it._email!!, it._nickName!!, it._userId!!.toLong()) } } diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/user/UserInfoRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/user/UserInfoRepositoryImpl.kt index f04d1ef08..4c035fda0 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/user/UserInfoRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/remote/user/UserInfoRepositoryImpl.kt @@ -16,7 +16,6 @@ class UserInfoRepositoryImpl @Inject constructor( private val userInfoDataSource: UserInfoDataSource, private val appDataStore: AppDataStore ) : UserInfoRepository { - private val _myAccountInfo = MutableStateFlow(AccountState.Unknown) override val myAccountInfo get() = _myAccountInfo as StateFlow diff --git a/core/datastore/src/main/java/com/android/mediproject/core/datastore/TokenServer.kt b/core/datastore/src/main/java/com/android/mediproject/core/datastore/TokenServer.kt index 23790ac4f..15d37a87a 100644 --- a/core/datastore/src/main/java/com/android/mediproject/core/datastore/TokenServer.kt +++ b/core/datastore/src/main/java/com/android/mediproject/core/datastore/TokenServer.kt @@ -19,7 +19,7 @@ class TokenServerImpl @Inject constructor() : TokenServer { */ override val currentTokens: EndpointTokenState get() { - val token = tokens.replayCache.firstOrNull() + val token = tokens.replayCache.lastOrNull() return if (token == null) { EndpointTokenState.NoToken } else { diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/CommentsUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/CommentsUseCase.kt index 7c11d2e3f..51a70b05d 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/CommentsUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/CommentsUseCase.kt @@ -5,6 +5,7 @@ import androidx.paging.flatMap import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.data.remote.comments.CommentsRepository +import com.android.mediproject.core.data.remote.user.UserInfoRepository import com.android.mediproject.core.model.comments.CommentDto import com.android.mediproject.core.model.comments.MyCommentDto import com.android.mediproject.core.model.comments.toDto @@ -13,6 +14,8 @@ import com.android.mediproject.core.model.requestparameters.EditCommentParameter import com.android.mediproject.core.model.requestparameters.LikeCommentParameter import com.android.mediproject.core.model.requestparameters.NewCommentParameter import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow import kotlinx.coroutines.flow.collectLatest @@ -21,19 +24,31 @@ import javax.inject.Inject class CommentsUseCase @Inject constructor( private val commentsRepository: CommentsRepository, - @Dispatcher(MediDispatchers.Default) private val defaultDispatcher: CoroutineDispatcher) { + private val userInfoRepository: UserInfoRepository, + @Dispatcher(MediDispatchers.Default) private val defaultDispatcher: CoroutineDispatcher +) { + + val scrollChannel = Channel(capacity = 3, onBufferOverflow = BufferOverflow.DROP_OLDEST) /** * 약에 대한 댓글을 가져오는 메서드입니다. * * @param medicineId 약의 고유 번호 */ - fun getCommentsForAMedicine(medicineId: Long): Flow> = channelFlow { + fun getCommentsForAMedicine(medicineId: Long, myUserId: Long): Flow> = channelFlow { commentsRepository.getCommentsForAMedicine(medicineId).collectLatest { pagingData -> val result = pagingData.flatMap { (it.replies.map { reply -> - reply.toDto() - }.reversed()) + listOf(it.toDto()) + reply.toDto().apply { + reply.likeList.forEach { like -> + if (like.userId == myUserId) this.isLiked = true + } + } + }.reversed()) + listOf(it.toDto().apply { + it.likeList.forEach { like -> + if (like.userId == myUserId) this.isLiked = true + } + }) } send(result) } @@ -61,7 +76,9 @@ class CommentsUseCase @Inject constructor( */ fun applyNewComment(parameter: NewCommentParameter): Flow> = commentsRepository.applyNewComment(parameter).mapLatest { result -> - result.fold(onSuccess = { Result.success(Unit) }, onFailure = { Result.failure(it) }) + result.fold(onSuccess = { + Result.success(Unit) + }, onFailure = { Result.failure(it) }) } diff --git a/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentChangedResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentChangedResponse.kt index 3ddbc3676..1e4479c1e 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentChangedResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentChangedResponse.kt @@ -8,5 +8,5 @@ import kotlinx.serialization.Serializable */ @Serializable data class CommentChangedResponse( - val commentId: Long + val commentId: Long = 0L, ) : BaseAwsQueryResponse() \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentDto.kt index e25774e78..551abb43d 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentDto.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentDto.kt @@ -32,14 +32,16 @@ data class CommentDto( val content: String, val createdAt: String, val updatedAt: String, - var onClickReply: ((Int) -> Unit)?, - var onClickLike: ((Long) -> Unit)?, + var onClickReply: ((String, Long) -> Unit)?, + var onClickLike: ((Long, Boolean) -> Unit)?, var onClickDelete: ((Long) -> Unit)?, var onClickEdit: ((CommentDto, Int) -> Unit)?, var onClickApplyEdited: ((CommentDto) -> Unit)?, - var isMine: Boolean = false) { + var isMine: Boolean = false +) { var isEditing: Boolean = false + var isLiked: Boolean = false } diff --git a/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentListResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentListResponse.kt index 13c0bc17b..eb293a6ad 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentListResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentListResponse.kt @@ -7,31 +7,38 @@ import kotlinx.serialization.Serializable @Serializable data class CommentListResponse( - @SerialName("commentList") val commentList: List) : BaseAwsQueryResponse() { + @SerialName("commentList") val commentList: List +) : BaseAwsQueryResponse() { @Serializable data class Comment( @SerialName("CONTENT") val content: String, // 테스트 - 메인 댓글 1 @SerialName("createdAt") val createdAt: String, // 2023-06-02T10:43:12.435Z @SerialName("ID") val id: Long, // 2 - @SerialName("likeList") val likeList: List, @SerialName("MEDICINEID") val medicineId: Long, // 41 @SerialName("replies") val replies: List, @SerialName("SUBORDINATION") val subordination: Long, // 0 @SerialName("USERID") val userId: Long, // 2 + @SerialName("likeList") val likeList: List, @SerialName("nickname") val nickName: String, - @SerialName("updatedAt") val updatedAt: String) { - + @SerialName("updatedAt") val updatedAt: String + ) { @Serializable data class Reply( @SerialName("CONTENT") val content: String, // 테스트 - 서브 댓글 1 - 1 @SerialName("createdAt") val createdAt: String, // 2023-06-02T10:43:54.211Z @SerialName("ID") val id: Long, // 5 - @SerialName("likeList") val likeList: List, - @SerialName("MEDICINEID") val medicineId: Long, // 41 + @SerialName("likeList") val likeList: List, @SerialName("MEDICINEID") val medicineId: Long, // 41 @SerialName("SUBORDINATION") val subordination: Long, // 2 @SerialName("USERID") val userId: Long, // 3 - @SerialName("nickname") val nickName: String, - @SerialName("updatedAt") val updatedAt: String) + @SerialName("nickname") val nickName: String, @SerialName("updatedAt") val updatedAt: String + ) } -} \ No newline at end of file +} + +@Serializable +data class Like( + @SerialName("COMMENTID") val commentId: Long, // 2 + @SerialName("ID") val id: Long, // 1 + @SerialName("USERID") val userId: Long +) \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/comments/LikeResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/comments/LikeResponse.kt new file mode 100644 index 000000000..e48daaf89 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/comments/LikeResponse.kt @@ -0,0 +1,12 @@ +package com.android.mediproject.core.model.comments + +import com.android.mediproject.core.model.awscommon.BaseAwsQueryResponse +import kotlinx.serialization.Serializable + +/** + * 댓글 등록,수정,삭제,좋아요 처리 후 서버로 부터 받는 응답 + */ +@Serializable +data class LikeResponse( + val likeId: Long = 0L, +) : BaseAwsQueryResponse() \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/LikeCommentParameter.kt b/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/LikeCommentParameter.kt index 6c5940f88..2e02a2422 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/LikeCommentParameter.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/LikeCommentParameter.kt @@ -1,15 +1,16 @@ package com.android.mediproject.core.model.requestparameters -import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable /** * 댓글 좋아요를 위한 파라미터 클래스입니다. * * @property commentId 댓글 id - * @property userId 사용자 id + * @property medicineId 약 id + * @property toLike 좋아요를 누를지 취소할지 여부 */ @Serializable data class LikeCommentParameter( - @SerialName("commentId") val commentId: Long, // 5 - @SerialName("userId") val userId: Long) \ No newline at end of file + val commentId: Long, // 5 + val medicineId: Long, val toLike: Boolean +) \ No newline at end of file diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/comments/CommentsDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/comments/CommentsDataSource.kt index ec4589049..32f5e6325 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/comments/CommentsDataSource.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/comments/CommentsDataSource.kt @@ -3,6 +3,7 @@ package com.android.mediproject.core.network.datasource.comments import androidx.paging.PagingData 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.requestparameters.DeleteCommentParameter import com.android.mediproject.core.model.requestparameters.EditCommentParameter import com.android.mediproject.core.model.requestparameters.LikeCommentParameter @@ -20,5 +21,5 @@ interface CommentsDataSource { fun applyNewComment(parameter: NewCommentParameter): Flow> fun deleteComment(parameter: DeleteCommentParameter): Flow> - fun likeComment(likeCommentParameter: LikeCommentParameter): Flow> + fun likeComment(likeCommentParameter: LikeCommentParameter): Flow> } \ No newline at end of file diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/comments/CommentsDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/comments/CommentsDataSourceImpl.kt index 21edbce9c..cc897b187 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/comments/CommentsDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/comments/CommentsDataSourceImpl.kt @@ -3,6 +3,7 @@ package com.android.mediproject.core.network.datasource.comments import androidx.paging.PagingData 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.requestparameters.DeleteCommentParameter import com.android.mediproject.core.model.requestparameters.EditCommentParameter import com.android.mediproject.core.model.requestparameters.LikeCommentParameter @@ -14,7 +15,8 @@ import kotlinx.coroutines.flow.flow import javax.inject.Inject class CommentsDataSourceImpl @Inject constructor( - private val awsNetworkApi: AwsNetworkApi) : CommentsDataSource { + private val awsNetworkApi: AwsNetworkApi +) : CommentsDataSource { /** * 약품에 대한 댓글 리스트를 가져온다. @@ -57,8 +59,11 @@ class CommentsDataSourceImpl @Inject constructor( }).also { emit(it) } } - override fun likeComment(parameter: LikeCommentParameter): Flow> = flow { - awsNetworkApi.likeComment(parameter).onResponse().fold(onSuccess = { response -> + override fun likeComment(parameter: LikeCommentParameter): Flow> = flow { + parameter.let { + if (it.toLike) awsNetworkApi.likeComment(parameter.medicineId, parameter.commentId) + else awsNetworkApi.unlikeComment(parameter.medicineId, parameter.commentId) + }.onResponse().fold(onSuccess = { response -> Result.success(response) }, onFailure = { Result.failure(it) diff --git a/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt b/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt index 2ae9ed358..d6b26e48c 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt @@ -5,6 +5,7 @@ import com.android.mediproject.core.common.util.AesCoder 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.InterestedMedicineListResponse import com.android.mediproject.core.model.medicine.MedicineIdResponse import com.android.mediproject.core.model.remote.sign.SignInResponse @@ -15,7 +16,6 @@ import com.android.mediproject.core.model.requestparameters.ChangePasswordReques import com.android.mediproject.core.model.requestparameters.DeleteCommentParameter import com.android.mediproject.core.model.requestparameters.EditCommentParameter import com.android.mediproject.core.model.requestparameters.GetMedicineIdParameter -import com.android.mediproject.core.model.requestparameters.LikeCommentParameter import com.android.mediproject.core.model.requestparameters.NewCommentParameter import com.android.mediproject.core.model.user.remote.ChangeNicknameResponse import com.android.mediproject.core.model.user.remote.ChangePasswordResponse @@ -164,12 +164,22 @@ interface AwsNetworkApi { ): Response /** - * 댓글 좋아요 + * 댓글 좋아요 추가 */ - @POST(value = "medicine/comment") + @POST(value = "medicine/comment/{medicineId}/like/{commentId}") suspend fun likeComment( - @Body likeCommentParameter: LikeCommentParameter - ): Response + @Path("medicineId", encoded = true) medicineId: Long, + @Path("commentId", encoded = true) commentId: Long, + ): Response + + /** + * 댓글 좋아요 해제 + */ + @DELETE(value = "medicine/comment/{medicineId}/like/{commentId}") + suspend fun unlikeComment( + @Path("medicineId", encoded = true) medicineId: Long, + @Path("commentId", encoded = true) commentId: Long, + ): Response /** * 댓글 등록 diff --git a/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/CommentsAdapter.kt b/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/CommentsAdapter.kt index 3338c1ff8..faa576adf 100644 --- a/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/CommentsAdapter.kt +++ b/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/CommentsAdapter.kt @@ -58,12 +58,12 @@ class CommentsAdapter : PagingDataAdapter { - adapter.notifyItemChanged(action.position) + val text = + HtmlCompat.fromHtml(getString(R.string.replyHeader) + action.comment, HtmlCompat.FROM_HTML_MODE_LEGACY) + replayInfoHeader.text = text + replyHeader.isVisible = true } is CommentActionState.CLICKED_EDIT_COMMENT -> { @@ -94,7 +99,10 @@ class MedicineCommentsFragment : } is CommentActionState.COMPLETED_APPLY_COMMENT_REPLY -> { + replayInfoHeader.isVisible = false action.result.fold(onSuccess = { + replyHeader.isVisible = false + toast(getString(R.string.appliedComment)) adapter.refresh() }, onFailure = { toast(it.message.toString()) @@ -104,6 +112,7 @@ class MedicineCommentsFragment : is CommentActionState.COMPLETED_APPLY_EDITED_COMMENT -> { action.result.fold(onSuccess = { adapter.refresh() + toast(getString(R.string.appliedEditComment)) }, onFailure = { toast(it.message.toString()) }) @@ -112,20 +121,24 @@ class MedicineCommentsFragment : is CommentActionState.COMPLETED_DELETE_COMMENT -> { action.result.fold(onSuccess = { adapter.refresh() + toast(getString(R.string.deletedComment)) }, onFailure = { toast(it.message.toString()) }) } - is CommentActionState.NONE -> { } + + is CommentActionState.CANCELED_REPLY -> { + replyHeader.isVisible = false + } } } } launch { - fragmentViewModel.comments.collectLatest { + fragmentViewModel.comments.collect { adapter.submitData(it) } } diff --git a/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/MedicineCommentsViewModel.kt b/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/MedicineCommentsViewModel.kt index eb8688f30..e005589c4 100644 --- a/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/MedicineCommentsViewModel.kt +++ b/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/MedicineCommentsViewModel.kt @@ -25,22 +25,22 @@ import com.android.mediproject.feature.comments.commentsofamedicine.CommentActio import com.android.mediproject.feature.comments.commentsofamedicine.CommentActionState.COMPLETED_APPLY_EDITED_COMMENT import com.android.mediproject.feature.comments.commentsofamedicine.CommentActionState.COMPLETED_DELETE_COMMENT import com.android.mediproject.feature.comments.commentsofamedicine.CommentActionState.COMPLETED_LIKE - import com.android.mediproject.feature.comments.commentsofamedicine.CommentActionState.NONE import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.mapLatest -import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.launch import javax.inject.Inject @@ -64,6 +64,8 @@ class MedicineCommentsViewModel @Inject constructor( private val _accountState = MutableStateFlow(AccountState.SignedOut) val accountState get() = _accountState.asStateFlow() + private val replyId = MutableStateFlow(-1) + init { viewModelScope.launch { getAccountStateUseCase.invoke().collectLatest { @@ -76,10 +78,9 @@ class MedicineCommentsViewModel @Inject constructor( } - val comments: StateFlow> = medicineBasicInfo.flatMapLatest { info -> - commentsUseCase.getCommentsForAMedicine(info.medicineIdInAws).mapLatest { pagingData -> + val comments: SharedFlow> = medicineBasicInfo.flatMapLatest { info -> + commentsUseCase.getCommentsForAMedicine(info.medicineIdInAws, myUserId.value).mapLatest { pagingData -> val signedIn = accountState.value is AccountState.SignedIn - pagingData.map { comment -> comment.apply { onClickReply = ::onClickedReply @@ -96,23 +97,45 @@ class MedicineCommentsViewModel @Inject constructor( } } } - }.flowOn(defaultDispatcher).cachedIn(viewModelScope).stateIn(viewModelScope, SharingStarted.Lazily, PagingData.empty()) + }.flowOn(defaultDispatcher).cachedIn(viewModelScope).shareIn(viewModelScope, SharingStarted.Lazily, replay = 1) /** * 답글 등록 * * @param comment 답글 내용 - * @param subOrdinationId 부모 댓글의 id */ - private fun applyReplyComment(comment: String, subOrdinationId: Long) { + private fun applyReplyComment(comment: String) { viewModelScope.launch { commentsUseCase.applyNewComment(NewCommentParameter(medicineId = medicineBasicInfo.replayCache.last().medicineIdInAws.toString(), userId = myUserId.value.toString(), content = comment, - subOrdinationId = subOrdinationId.toString())).collectLatest { result -> + subOrdinationId = replyId.value.toString())).collectLatest { result -> + result.onSuccess { + // 댓글 등록 성공 + delay(200) + commentsUseCase.scrollChannel.send(Unit) + _action.emit(CommentActionState.COMPLETED_APPLY_COMMENT_REPLY(Result.success(Unit))) + }.onFailure { + _action.emit(CommentActionState.COMPLETED_APPLY_COMMENT_REPLY(Result.failure(it))) + } + } + } + } + + /** + * 새 댓글 등록 + */ + private fun applyNewComment(content: String) { + viewModelScope.launch { + commentsUseCase.applyNewComment(NewCommentParameter(medicineId = medicineBasicInfo.replayCache.last().medicineIdInAws.toString(), + userId = myUserId.value.toString(), + content = content, + subOrdinationId = "0")).collectLatest { result -> result.onSuccess { // 댓글 등록 성공 + delay(200) + commentsUseCase.scrollChannel.send(Unit) _action.emit(CommentActionState.COMPLETED_APPLY_COMMENT_REPLY(Result.success(Unit))) }.onFailure { _action.emit(CommentActionState.COMPLETED_APPLY_COMMENT_REPLY(Result.failure(it))) @@ -133,6 +156,7 @@ class MedicineCommentsViewModel @Inject constructor( medicineId = medicineBasicInfo.replayCache.last().medicineIdInAws)).collectLatest { result -> result.onSuccess { // 댓글 수정 성공 + delay(200) _action.emit(CommentActionState.COMPLETED_APPLY_EDITED_COMMENT(Result.success(Unit))) }.onFailure { _action.emit(CommentActionState.COMPLETED_APPLY_EDITED_COMMENT(Result.failure(it))) @@ -146,11 +170,13 @@ class MedicineCommentsViewModel @Inject constructor( * 답글 작성하기 버튼 클릭 * - 답글 등록하기 버튼 클릭이 아님 * - * @param position 답글 작성 아이템 뷰가 표시될 리스트내 절대 위치 + * @param comment 답글을 작성할 댓글의 id + * @param commentId 답글을 작성할 댓글의 id */ - private fun onClickedReply(position: Int) { + private fun onClickedReply(comment: String, commentId: Long) { viewModelScope.launch { - _action.tryEmit(CommentActionState.CLICKED_REPLY(position)) + replyId.emit(commentId) + _action.emit(CommentActionState.CLICKED_REPLY(comment)) } } @@ -166,12 +192,17 @@ class MedicineCommentsViewModel @Inject constructor( } } + /** + * 댓글 삭제 처리 + */ fun deleteComment(commentId: Long) { viewModelScope.launch { commentsUseCase.deleteComment(DeleteCommentParameter(commentId, medicineBasicInfo.replayCache.last().medicineIdInAws)) .collectLatest { result -> result.onSuccess { // 댓글 삭제 성공 + delay(200) + commentsUseCase.scrollChannel.send(Unit) _action.emit(CommentActionState.COMPLETED_DELETE_COMMENT(Result.success(Unit))) }.onFailure { _action.emit(CommentActionState.COMPLETED_DELETE_COMMENT(Result.failure(it))) @@ -186,16 +217,18 @@ class MedicineCommentsViewModel @Inject constructor( * * @param commentId LIKE를 등록또는 해제 할 댓글의 id */ - private fun onClickedLike(commentId: Long) { + private fun onClickedLike(commentId: Long, isLiked: Boolean) { viewModelScope.launch { - commentsUseCase.likeComment(LikeCommentParameter(commentId, myUserId.value)).collectLatest { result -> - result.onSuccess { - // like 처리 완료 - _action.emit(CommentActionState.COMPLETED_LIKE(Result.success(Unit))) - }.onFailure { - _action.emit(CommentActionState.COMPLETED_LIKE(Result.failure(it))) + commentsUseCase.likeComment(LikeCommentParameter(commentId, medicineBasicInfo.replayCache.last().medicineIdInAws, isLiked)) + .collectLatest { result -> + result.onSuccess { + // like 처리 완료 + delay(200) + _action.emit(CommentActionState.COMPLETED_LIKE(Result.success(Unit))) + }.onFailure { + _action.emit(CommentActionState.COMPLETED_LIKE(Result.failure(it))) + } } - } } } @@ -223,16 +256,12 @@ class MedicineCommentsViewModel @Inject constructor( */ override fun onClickedSendButton(text: CharSequence) { viewModelScope.launch { - if (text.isEmpty()) _action.tryEmit(COMPLETED_APPLY_COMMENT_REPLY(Result.failure(IllegalArgumentException("댓글 내용이 없습니다.")))) - else commentsUseCase.applyNewComment(NewCommentParameter(medicineId = medicineBasicInfo.replayCache.last().medicineIdInAws.toString(), - userId = myUserId.value.toString(), - content = text.toString(), - subOrdinationId = "0")).collectLatest { result -> - result.onSuccess { - // 댓글 등록 성공 - _action.emit(CommentActionState.COMPLETED_APPLY_COMMENT_REPLY(Result.success(Unit))) - }.onFailure { - _action.emit(CommentActionState.COMPLETED_APPLY_COMMENT_REPLY(Result.failure(it))) + if (text.isEmpty()) _action.tryEmit(CommentActionState.COMPLETED_APPLY_COMMENT_REPLY(Result.failure(IllegalArgumentException("댓글 내용이 없습니다.")))) + else { + if (replyId.value == -1L) { + applyNewComment(text.toString()) + } else { + applyReplyComment(text.toString()) } } } @@ -243,6 +272,13 @@ class MedicineCommentsViewModel @Inject constructor( _medicineBasicInfo.emit(medicineBasicInfo) } } + + fun cancelReply() { + viewModelScope.launch { + _action.emit(CommentActionState.CANCELED_REPLY) + replyId.value = -1 + } + } } /** @@ -256,7 +292,6 @@ class MedicineCommentsViewModel @Inject constructor( * @property COMPLETED_APPLY_EDITED_COMMENT 댓글 수정 완료 * @property COMPLETED_LIKE 댓글 좋아요 완료 * @property COMPLETED_DELETE_COMMENT 댓글 삭제 완료 - * @property ERROR 댓글 등록, 수정, 삭제, 좋아요 에러 * @property NONE 초기 상태 */ @Suppress("ClassName") @@ -268,9 +303,10 @@ sealed class CommentActionState { data class CLICKED_DELETE_MY_COMMENT(val commentId: Long) : CommentActionState() /** - * @property position 답글 입력하기 클릭한 댓글의 리스트 내 절대 위치 + * @property comment 답글 내용 */ - data class CLICKED_REPLY(val position: Int) : CommentActionState() + data class CLICKED_REPLY(val comment: String) : CommentActionState() + object CANCELED_REPLY : CommentActionState() object CLICKED_LIKE : CommentActionState() /** diff --git a/feature/comments/src/main/java/com/android/mediproject/feature/comments/recentcommentlist/RecentCommentsAdapter.kt b/feature/comments/src/main/java/com/android/mediproject/feature/comments/recentcommentlist/RecentCommentsAdapter.kt index 9082f19bc..0e3ea7a8a 100644 --- a/feature/comments/src/main/java/com/android/mediproject/feature/comments/recentcommentlist/RecentCommentsAdapter.kt +++ b/feature/comments/src/main/java/com/android/mediproject/feature/comments/recentcommentlist/RecentCommentsAdapter.kt @@ -7,12 +7,10 @@ import androidx.recyclerview.widget.RecyclerView import com.android.mediproject.core.model.comments.CommentDto import com.android.mediproject.core.ui.base.view.SimpleListItemView -class RecentCommentsAdapter : - ListAdapter(AsyncDiffer) { +class RecentCommentsAdapter : ListAdapter(AsyncDiffer) { - class RecentCommentListViewHolder(private val view: SimpleListItemView) : - RecyclerView.ViewHolder(view) { + class RecentCommentListViewHolder(private val view: SimpleListItemView) : RecyclerView.ViewHolder(view) { private var item: CommentDto? = null @@ -20,8 +18,8 @@ class RecentCommentsAdapter : view.setOnItemClickListener { item?.apply { onClickDelete?.invoke(commentId) - onClickLike?.invoke(commentId) - onClickReply?.invoke(absoluteAdapterPosition) + onClickLike?.invoke(commentId, !isLiked) + onClickReply?.invoke(content, commentId) } } } diff --git a/feature/comments/src/main/res/drawable/baseline_thumb_up_24.xml b/feature/comments/src/main/res/drawable/baseline_thumb_up_24.xml new file mode 100644 index 000000000..8fc592b4c --- /dev/null +++ b/feature/comments/src/main/res/drawable/baseline_thumb_up_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/feature/comments/src/main/res/layout/fragment_medicine_comments.xml b/feature/comments/src/main/res/layout/fragment_medicine_comments.xml index 1122165e3..fe0eea45d 100644 --- a/feature/comments/src/main/res/layout/fragment_medicine_comments.xml +++ b/feature/comments/src/main/res/layout/fragment_medicine_comments.xml @@ -1,5 +1,6 @@ - + @@ -8,30 +9,78 @@ type="com.android.mediproject.feature.comments.commentsofamedicine.MedicineCommentsViewModel" /> - + android:paddingHorizontal="16dp"> + + + app:layout_constraintTop_toBottomOf="@id/pagingListView"> + + + + + + + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/replyHeader"> 댓글 삭제 처리 오류 댓글을 삭제하시겠습니까? 댓글 처리 오류 + 답글 대상 : + 등록 완료 + 댓글 수정 완료 + 댓글 삭제 완료 \ No newline at end of file diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoViewModel.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoViewModel.kt index 02dab03bf..c42efdd88 100644 --- a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoViewModel.kt +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoViewModel.kt @@ -6,6 +6,7 @@ import asEventFlow 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.GetMedicineDetailsUseCase import com.android.mediproject.core.model.local.navargs.MedicineInfoArgs import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetatilInfoDto @@ -20,6 +21,8 @@ import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.mapLatest +import kotlinx.coroutines.flow.receiveAsFlow +import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import javax.inject.Inject @@ -27,7 +30,18 @@ import javax.inject.Inject @HiltViewModel class MedicineInfoViewModel @Inject constructor( private val getMedicineDetailsUseCase: GetMedicineDetailsUseCase, - @Dispatcher(MediDispatchers.Default) private val defaultDispatcher: CoroutineDispatcher) : BaseViewModel() { + private val commentsUseCase: CommentsUseCase, + @Dispatcher(MediDispatchers.Default) private val defaultDispatcher: CoroutineDispatcher +) : BaseViewModel() { + + init { + viewModelScope.launch { + // 댓글 업데이트 시 스크롤을 맨 아래로 내립니다. + commentsUseCase.scrollChannel.receiveAsFlow().shareIn(viewModelScope, SharingStarted.Eagerly, replay = 0).collect { + _eventState.emit(EventState.ScrollToBottom) + } + } + } private val _eventState = MutableEventFlow(replay = 1) val eventState get() = _eventState.asEventFlow() diff --git a/feature/search/src/main/java/com/android/mediproject/feature/search/SearchMedicinesFragment.kt b/feature/search/src/main/java/com/android/mediproject/feature/search/SearchMedicinesFragment.kt index 39844aff4..ce112a5b4 100644 --- a/feature/search/src/main/java/com/android/mediproject/feature/search/SearchMedicinesFragment.kt +++ b/feature/search/src/main/java/com/android/mediproject/feature/search/SearchMedicinesFragment.kt @@ -41,8 +41,7 @@ class SearchMedicinesFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - systemBarStyler.changeMode(listOf(SystemBarStyler.ChangeView(binding.root, SystemBarStyler.SpacingType.PADDING)), - listOf(SystemBarStyler.ChangeView(binding.root, SystemBarStyler.SpacingType.PADDING))) + systemBarStyler.changeMode(listOf(SystemBarStyler.ChangeView(binding.root, SystemBarStyler.SpacingType.PADDING))) // contents_fragment_container_view 에 최근 검색 목록과 검색 결과 목록 화면 두 개를 띄운다. initSearchBar() From 60c4638c8c96cb6d5b4ebbbd666b41cd3ebd5cdc Mon Sep 17 00:00:00 2001 From: JSPark <48265129+pknujsp@users.noreply.github.com> Date: Thu, 8 Jun 2023 04:08:37 +0900 Subject: [PATCH 2/9] =?UTF-8?q?#91=20=EC=B9=B4=EB=A9=94=EB=9D=BC=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mediproject/core/model/comments/CommentDto.kt | 8 ++++---- .../mediproject/feature/camera/CameraModule.kt | 1 - .../feature/camera/MedicinesDetectorFragment.kt | 5 ++--- .../feature/camera/tflite/CameraHelper.kt | 13 +++++++------ .../commentsofamedicine/MedicineCommentsFragment.kt | 8 ++++---- 5 files changed, 17 insertions(+), 18 deletions(-) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentDto.kt index 551abb43d..1049aae41 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentDto.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/comments/CommentDto.kt @@ -62,8 +62,8 @@ fun CommentListResponse.Comment.toDto() = CommentDto( isReply = false, subordinationId = subordination, content = content, - createdAt = ZonedDateTime.parse(createdAt, DateTimeFormatter.ISO_ZONED_DATE_TIME).format(dateTimeFormatter), - updatedAt = ZonedDateTime.parse(updatedAt, DateTimeFormatter.ISO_ZONED_DATE_TIME).format(dateTimeFormatter), + createdAt = ZonedDateTime.parse(createdAt, DateTimeFormatter.ISO_ZONED_DATE_TIME).plusHours(10L).format(dateTimeFormatter), + updatedAt = ZonedDateTime.parse(updatedAt, DateTimeFormatter.ISO_ZONED_DATE_TIME).plusHours(10L).format(dateTimeFormatter), onClickReply = null, onClickLike = null, onClickDelete = null, @@ -78,8 +78,8 @@ fun CommentListResponse.Comment.Reply.toDto() = CommentDto( isReply = true, subordinationId = subordination, content = content, - createdAt = ZonedDateTime.parse(createdAt, DateTimeFormatter.ISO_ZONED_DATE_TIME).format(dateTimeFormatter), - updatedAt = ZonedDateTime.parse(updatedAt, DateTimeFormatter.ISO_ZONED_DATE_TIME).format(dateTimeFormatter), + createdAt = ZonedDateTime.parse(createdAt, DateTimeFormatter.ISO_ZONED_DATE_TIME).plusHours(10L).format(dateTimeFormatter), + updatedAt = ZonedDateTime.parse(updatedAt, DateTimeFormatter.ISO_ZONED_DATE_TIME).plusHours(10L).format(dateTimeFormatter), onClickReply = null, onClickLike = null, onClickDelete = null, diff --git a/feature/camera/src/main/java/com/android/mediproject/feature/camera/CameraModule.kt b/feature/camera/src/main/java/com/android/mediproject/feature/camera/CameraModule.kt index 52b127ecd..595d5c5e4 100644 --- a/feature/camera/src/main/java/com/android/mediproject/feature/camera/CameraModule.kt +++ b/feature/camera/src/main/java/com/android/mediproject/feature/camera/CameraModule.kt @@ -23,5 +23,4 @@ class CameraModule { @Provides fun providesAiController(cameraHelper: CameraHelper): AiController = cameraHelper - } \ No newline at end of file diff --git a/feature/camera/src/main/java/com/android/mediproject/feature/camera/MedicinesDetectorFragment.kt b/feature/camera/src/main/java/com/android/mediproject/feature/camera/MedicinesDetectorFragment.kt index 418876536..2bd03d12f 100644 --- a/feature/camera/src/main/java/com/android/mediproject/feature/camera/MedicinesDetectorFragment.kt +++ b/feature/camera/src/main/java/com/android/mediproject/feature/camera/MedicinesDetectorFragment.kt @@ -61,7 +61,6 @@ class MedicinesDetectorFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding.viewModel = fragmentViewModel systemBarStyler.changeMode(listOf(SystemBarStyler.ChangeView(binding.logo, SystemBarStyler.SpacingType.MARGIN)), listOf(SystemBarStyler.ChangeView(binding.detectionDescription, SystemBarStyler.SpacingType.MARGIN))) @@ -72,13 +71,13 @@ class MedicinesDetectorFragment : // AI처리 객체의 콜백을 현재 프래그먼트로 설정 cameraController.detectionCallback = this@MedicinesDetectorFragment } - - + binding.apply { backBtn.setOnClickListener { findNavController().popBackStack() } + viewModel = fragmentViewModel viewLifecycleOwner.repeatOnStarted { launch { diff --git a/feature/camera/src/main/java/com/android/mediproject/feature/camera/tflite/CameraHelper.kt b/feature/camera/src/main/java/com/android/mediproject/feature/camera/tflite/CameraHelper.kt index 8bec45921..de9a4dfef 100644 --- a/feature/camera/src/main/java/com/android/mediproject/feature/camera/tflite/CameraHelper.kt +++ b/feature/camera/src/main/java/com/android/mediproject/feature/camera/tflite/CameraHelper.kt @@ -36,24 +36,25 @@ import kotlin.coroutines.suspendCoroutine * 카메라 제어, ai처리 담당 */ class CameraHelper @Inject constructor( - private val context: Context) : LifecycleEventObserver, AiController, CameraController { + private val context: Context +) : LifecycleEventObserver, AiController, CameraController { private var camera: Camera? = null private var _preview: Preview? = null - private var preview: Preview = _preview!! + private val preview: Preview get() = _preview!! private var _previewView: PreviewView? = null - private val previewView: PreviewView = _previewView!! + private val previewView: PreviewView get() = _previewView!! private var _imageAnalyzer: ImageAnalysis? = null - private val imageAnalyzer: ImageAnalysis = _imageAnalyzer!! + private val imageAnalyzer: ImageAnalysis get() = _imageAnalyzer!! private var _cameraProvider: ProcessCameraProvider? = null - private val cameraProvider = _cameraProvider!! + private val cameraProvider get() = _cameraProvider!! private var _objectDetector: ObjectDetector? = null - private val objectDetector = _objectDetector!! + private val objectDetector get() = _objectDetector!! private val cameraSelector = CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build() diff --git a/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/MedicineCommentsFragment.kt b/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/MedicineCommentsFragment.kt index 96515b31c..692a799cb 100644 --- a/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/MedicineCommentsFragment.kt +++ b/feature/comments/src/main/java/com/android/mediproject/feature/comments/commentsofamedicine/MedicineCommentsFragment.kt @@ -92,7 +92,7 @@ class MedicineCommentsFragment : is CommentActionState.COMPLETED_LIKE -> { action.result.fold(onSuccess = { - adapter.refresh() + adapter.retry() }, onFailure = { toast(it.message.toString()) }) @@ -103,7 +103,7 @@ class MedicineCommentsFragment : action.result.fold(onSuccess = { replyHeader.isVisible = false toast(getString(R.string.appliedComment)) - adapter.refresh() + adapter.retry() }, onFailure = { toast(it.message.toString()) }) @@ -111,7 +111,7 @@ class MedicineCommentsFragment : is CommentActionState.COMPLETED_APPLY_EDITED_COMMENT -> { action.result.fold(onSuccess = { - adapter.refresh() + adapter.retry() toast(getString(R.string.appliedEditComment)) }, onFailure = { toast(it.message.toString()) @@ -120,7 +120,7 @@ class MedicineCommentsFragment : is CommentActionState.COMPLETED_DELETE_COMMENT -> { action.result.fold(onSuccess = { - adapter.refresh() + adapter.retry() toast(getString(R.string.deletedComment)) }, onFailure = { toast(it.message.toString()) From cf0bda5acd4db5eaa8988813a6dde8b69a802e99 Mon Sep 17 00:00:00 2001 From: JSPark <48265129+pknujsp@users.noreply.github.com> Date: Thu, 8 Jun 2023 04:21:08 +0900 Subject: [PATCH 3/9] =?UTF-8?q?#91=20=EA=B4=80=EC=8B=AC=20=EC=95=BD=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=AA=A8?= =?UTF-8?q?=EB=8D=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../favorites/AddFavoriteMedicineResponse.kt | 11 ++++++++++ .../DeleteFavoriteMedicineResponse.kt | 10 +++++++++ .../favorites/FavoriteMedicinesResponse.kt | 22 +++++++++++++++++++ .../favorites/IsFavoriteMedicineResponse.kt | 11 ++++++++++ 4 files changed, 54 insertions(+) create mode 100644 core/model/src/main/java/com/android/mediproject/core/model/favorites/AddFavoriteMedicineResponse.kt create mode 100644 core/model/src/main/java/com/android/mediproject/core/model/favorites/DeleteFavoriteMedicineResponse.kt create mode 100644 core/model/src/main/java/com/android/mediproject/core/model/favorites/FavoriteMedicinesResponse.kt create mode 100644 core/model/src/main/java/com/android/mediproject/core/model/favorites/IsFavoriteMedicineResponse.kt diff --git a/core/model/src/main/java/com/android/mediproject/core/model/favorites/AddFavoriteMedicineResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/favorites/AddFavoriteMedicineResponse.kt new file mode 100644 index 000000000..9ed2c4ef3 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/favorites/AddFavoriteMedicineResponse.kt @@ -0,0 +1,11 @@ +package com.android.mediproject.core.model.favorites + + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class AddFavoriteMedicineResponse( + @SerialName("favoriteMedicineID") val favoriteMedicineID: Int, // 86 + @SerialName("message") val message: String +) \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/favorites/DeleteFavoriteMedicineResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/favorites/DeleteFavoriteMedicineResponse.kt new file mode 100644 index 000000000..766a07e0c --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/favorites/DeleteFavoriteMedicineResponse.kt @@ -0,0 +1,10 @@ +package com.android.mediproject.core.model.favorites + + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class DeleteFavoriteMedicineResponse( + @SerialName("message") val message: String +) \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/favorites/FavoriteMedicinesResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/favorites/FavoriteMedicinesResponse.kt new file mode 100644 index 000000000..0630dd33c --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/favorites/FavoriteMedicinesResponse.kt @@ -0,0 +1,22 @@ +package com.android.mediproject.core.model.favorites + + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class FavoriteMedicinesResponse( + @SerialName("medicineList") val medicineList: List, + @SerialName("message") val message: String +) { + @Serializable + data class Medicine( + @SerialName("ENTP_NAME") val entpName: String, // (주)한국얀센 + @SerialName("ID") val medicineId: Int, // 41 + @SerialName("ITEM_INGR_NAME") val itemIngrName: String, // 덱스트로메토르판브롬화수소산염수화물/슈도에페드린염산염/아세트아미노펜/클로르페니라민말레인산염 + @SerialName("ITEM_NAME") val itemName: String, // 타이레놀콜드-에스정(수출명:TylenolColdTablet,TylenolColdCaplet) + @SerialName("ITEM_SEQ") val itemSeq: String, // 200302348 + @SerialName("PRDUCT_TYPE") val productType: String, // [01140]해열.진통.소염제 + @SerialName("SPCLTY_PBLC") val medicineType: String + ) +} \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/favorites/IsFavoriteMedicineResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/favorites/IsFavoriteMedicineResponse.kt new file mode 100644 index 000000000..a4157ff48 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/favorites/IsFavoriteMedicineResponse.kt @@ -0,0 +1,11 @@ +package com.android.mediproject.core.model.favorites + + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class IsFavoriteMedicineResponse( + @SerialName("isFavorite") val isFavorite: Boolean, // false + @SerialName("message") val message: String +) \ No newline at end of file From e35e458a567f223aee025c644041e39c592c0cbc Mon Sep 17 00:00:00 2001 From: JSPark <48265129+pknujsp@users.noreply.github.com> Date: Thu, 8 Jun 2023 04:35:45 +0900 Subject: [PATCH 4/9] =?UTF-8?q?#91=20=EA=B4=80=EC=8B=AC=20=EC=95=BD=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20DataSource=20=EB=A1=9C=EC=A7=81=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../favorites/FavoriteMedicinesResponse.kt | 22 ------------- .../AddInterestedMedicineResponse.kt} | 4 +-- .../DeleteInterestedMedicineResponse.kt} | 4 +-- .../IsInterestedMedicineResponse.kt} | 5 ++- .../AddInterestedMedicineParameter.kt | 8 +++++ .../InterestedMedicineDataSource.kt | 21 +++++++++++- .../InterestedMedicineDataSourceImpl.kt | 32 ++++++++++++++++--- .../core/network/module/AwsNetwork.kt | 29 +++++++++++++++++ 8 files changed, 91 insertions(+), 34 deletions(-) delete mode 100644 core/model/src/main/java/com/android/mediproject/core/model/favorites/FavoriteMedicinesResponse.kt rename core/model/src/main/java/com/android/mediproject/core/model/{favorites/AddFavoriteMedicineResponse.kt => medicine/InterestedMedicine/AddInterestedMedicineResponse.kt} (66%) rename core/model/src/main/java/com/android/mediproject/core/model/{favorites/DeleteFavoriteMedicineResponse.kt => medicine/InterestedMedicine/DeleteInterestedMedicineResponse.kt} (55%) rename core/model/src/main/java/com/android/mediproject/core/model/{favorites/IsFavoriteMedicineResponse.kt => medicine/InterestedMedicine/IsInterestedMedicineResponse.kt} (65%) create mode 100644 core/model/src/main/java/com/android/mediproject/core/model/requestparameters/AddInterestedMedicineParameter.kt diff --git a/core/model/src/main/java/com/android/mediproject/core/model/favorites/FavoriteMedicinesResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/favorites/FavoriteMedicinesResponse.kt deleted file mode 100644 index 0630dd33c..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/favorites/FavoriteMedicinesResponse.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.android.mediproject.core.model.favorites - - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -data class FavoriteMedicinesResponse( - @SerialName("medicineList") val medicineList: List, - @SerialName("message") val message: String -) { - @Serializable - data class Medicine( - @SerialName("ENTP_NAME") val entpName: String, // (주)한국얀센 - @SerialName("ID") val medicineId: Int, // 41 - @SerialName("ITEM_INGR_NAME") val itemIngrName: String, // 덱스트로메토르판브롬화수소산염수화물/슈도에페드린염산염/아세트아미노펜/클로르페니라민말레인산염 - @SerialName("ITEM_NAME") val itemName: String, // 타이레놀콜드-에스정(수출명:TylenolColdTablet,TylenolColdCaplet) - @SerialName("ITEM_SEQ") val itemSeq: String, // 200302348 - @SerialName("PRDUCT_TYPE") val productType: String, // [01140]해열.진통.소염제 - @SerialName("SPCLTY_PBLC") val medicineType: String - ) -} \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/favorites/AddFavoriteMedicineResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/AddInterestedMedicineResponse.kt similarity index 66% rename from core/model/src/main/java/com/android/mediproject/core/model/favorites/AddFavoriteMedicineResponse.kt rename to core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/AddInterestedMedicineResponse.kt index 9ed2c4ef3..f3d181f3f 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/favorites/AddFavoriteMedicineResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/AddInterestedMedicineResponse.kt @@ -1,11 +1,11 @@ -package com.android.mediproject.core.model.favorites +package com.android.mediproject.core.model.medicine.InterestedMedicine import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -data class AddFavoriteMedicineResponse( +data class AddInterestedMedicineResponse( @SerialName("favoriteMedicineID") val favoriteMedicineID: Int, // 86 @SerialName("message") val message: String ) \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/favorites/DeleteFavoriteMedicineResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/DeleteInterestedMedicineResponse.kt similarity index 55% rename from core/model/src/main/java/com/android/mediproject/core/model/favorites/DeleteFavoriteMedicineResponse.kt rename to core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/DeleteInterestedMedicineResponse.kt index 766a07e0c..cf958afcd 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/favorites/DeleteFavoriteMedicineResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/DeleteInterestedMedicineResponse.kt @@ -1,10 +1,10 @@ -package com.android.mediproject.core.model.favorites +package com.android.mediproject.core.model.medicine.InterestedMedicine import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -data class DeleteFavoriteMedicineResponse( +data class DeleteInterestedMedicineResponse( @SerialName("message") val message: String ) \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/favorites/IsFavoriteMedicineResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/IsInterestedMedicineResponse.kt similarity index 65% rename from core/model/src/main/java/com/android/mediproject/core/model/favorites/IsFavoriteMedicineResponse.kt rename to core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/IsInterestedMedicineResponse.kt index a4157ff48..79da247cb 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/favorites/IsFavoriteMedicineResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/IsInterestedMedicineResponse.kt @@ -1,11 +1,10 @@ -package com.android.mediproject.core.model.favorites - +package com.android.mediproject.core.model.medicine.InterestedMedicine import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -data class IsFavoriteMedicineResponse( +data class IsInterestedMedicineResponse( @SerialName("isFavorite") val isFavorite: Boolean, // false @SerialName("message") val message: String ) \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/AddInterestedMedicineParameter.kt b/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/AddInterestedMedicineParameter.kt new file mode 100644 index 000000000..9b88a1d27 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/AddInterestedMedicineParameter.kt @@ -0,0 +1,8 @@ +package com.android.mediproject.core.model.requestparameters + +import kotlinx.serialization.Serializable + +@Serializable +data class AddInterestedMedicineParameter( + val medicineId: Long +) \ No newline at end of file diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSource.kt index 60d44633f..5e698624b 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSource.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSource.kt @@ -1,9 +1,28 @@ 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.requestparameters.AddInterestedMedicineParameter import kotlinx.coroutines.flow.Flow interface InterestedMedicineDataSource { - suspend fun getInterestedMedicineList() : Flow> + suspend fun getInterestedMedicineList(): Flow> + + /** + * 관심 약 추가 + */ + fun addInterestedMedicine(addInterestedMedicineParameter: AddInterestedMedicineParameter): Flow> + + /** + * 관심 약 삭제 + */ + fun deleteInterestedMedicine(medicineId: Long): Flow> + + /** + * 관심 약 여부 확인 + */ + fun isInterestedMedicine(medicineId: Long): Flow> } \ No newline at end of file diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSourceImpl.kt index 88702e760..f953e849d 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSourceImpl.kt @@ -1,19 +1,43 @@ 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.requestparameters.AddInterestedMedicineParameter import com.android.mediproject.core.network.module.AwsNetworkApi import com.android.mediproject.core.network.onResponse import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow import javax.inject.Inject -class InterestedMedicineDataSourceImpl @Inject constructor(private val awsNetworkApi: AwsNetworkApi) : - InterestedMedicineDataSource { - override suspend fun getInterestedMedicineList(): Flow> = +class InterestedMedicineDataSourceImpl @Inject constructor(private val awsNetworkApi: AwsNetworkApi) : InterestedMedicineDataSource { + override suspend fun getInterestedMedicineList(): Flow> = channelFlow { + awsNetworkApi.getInterestedMedicineList().onResponse().fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }) + .also { + trySend(it) + } + } + + override fun addInterestedMedicine(addInterestedMedicineParameter: AddInterestedMedicineParameter): Flow> = channelFlow { - awsNetworkApi.getInterestedMedicineList().onResponse() + awsNetworkApi.addInterestedMedicine(addInterestedMedicineParameter).onResponse() .fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }).also { trySend(it) } } + + override fun deleteInterestedMedicine(medicineId: Long): Flow> = channelFlow { + awsNetworkApi.deleteInterestedMedicine(medicineId).onResponse() + .fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }).also { + trySend(it) + } + } + + override fun isInterestedMedicine(medicineId: Long): Flow> = channelFlow { + awsNetworkApi.isInterestedMedicine(medicineId).onResponse() + .fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }).also { + trySend(it) + } + } } \ No newline at end of file diff --git a/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt b/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt index d6b26e48c..d40e9e1e2 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt @@ -6,11 +6,15 @@ 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.remote.sign.SignInResponse import com.android.mediproject.core.model.remote.sign.SignUpResponse import com.android.mediproject.core.model.remote.token.ReissueTokenResponse +import com.android.mediproject.core.model.requestparameters.AddInterestedMedicineParameter import com.android.mediproject.core.model.requestparameters.ChangeNicknameParameter import com.android.mediproject.core.model.requestparameters.ChangePasswordRequestParameter import com.android.mediproject.core.model.requestparameters.DeleteCommentParameter @@ -52,6 +56,7 @@ import retrofit2.http.HTTP import retrofit2.http.PATCH import retrofit2.http.POST import retrofit2.http.Path +import retrofit2.http.Query import javax.inject.Named import javax.inject.Singleton @@ -224,4 +229,28 @@ interface AwsNetworkApi { */ @GET(value = "user") suspend fun getUserInfo(): Response + + /** + * 관심 약 조회 + */ + @GET(value = "medicine/favorite") + suspend fun isInterestedMedicine( + @Query("ITEM_SEQ") itemSeq: Long + ): Response + + /** + * 관심 약 추가 + */ + @POST(value = "medicine/favorite") + suspend fun addInterestedMedicine( + @Body addInterestedMedicineParameter: AddInterestedMedicineParameter + ): Response + + /** + * 관심 약 삭제 + */ + @DELETE(value = "medicine/favorite") + suspend fun deleteInterestedMedicine( + @Query("medicineId") medicineId: Long + ): Response } \ No newline at end of file From 69247682beeb0df6d133ddabf243e9dc0c66ac47 Mon Sep 17 00:00:00 2001 From: JSPark <48265129+pknujsp@users.noreply.github.com> Date: Thu, 8 Jun 2023 04:41:56 +0900 Subject: [PATCH 5/9] =?UTF-8?q?#91=20=EC=95=BD=20=EA=B4=80=EC=8B=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80/=EB=AA=A9=EB=A1=9D/=EC=82=AD=EC=A0=9C/?= =?UTF-8?q?=ED=99=95=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=98=81=EC=97=AD=20=EB=B6=80=EB=B6=84=20=EC=9E=91?= =?UTF-8?q?=EC=97=85=20=EC=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InterestedMedicineRepository.kt | 12 ++++++++- .../InterestedMedicineRepositoryImpl.kt | 26 ++++++++++++------ .../domain/GetInterestedMedicineUseCase.kt | 27 ++++++++++++++++--- 3 files changed, 53 insertions(+), 12 deletions(-) diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepository.kt index d82fe7bc2..c906ff667 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepository.kt @@ -1,9 +1,19 @@ 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.requestparameters.AddInterestedMedicineParameter import kotlinx.coroutines.flow.Flow interface InterestedMedicineRepository { - suspend fun getInterestedMedicineList() : Flow>> + suspend fun getInterestedMedicineList(): Flow>> + + fun addInterestedMedicine(addInterestedMedicineParameter: AddInterestedMedicineParameter): Flow> + + fun deleteInterestedMedicine(medicineId: Long): Flow> + + fun isInterestedMedicine(itemSeq: Long): Flow> } \ No newline at end of file diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepositoryImpl.kt index f3968ff98..dc93f2799 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepositoryImpl.kt @@ -1,6 +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.requestparameters.AddInterestedMedicineParameter import com.android.mediproject.core.network.datasource.interestedmedicine.InterestedMedicineDataSource import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow @@ -11,12 +15,18 @@ import javax.inject.Inject class InterestedMedicineRepositoryImpl @Inject constructor(private val interestedMedicineDataSource: InterestedMedicineDataSource) : InterestedMedicineRepository { - override suspend fun getInterestedMedicineList(): Flow>> = - channelFlow { - interestedMedicineDataSource.getInterestedMedicineList().map { result -> - result.fold( - onSuccess = { Result.success(it.medicineList) }, - onFailure = { Result.failure(it) }) - }.collectLatest { trySend(it) } - } + override suspend fun getInterestedMedicineList(): Flow>> = channelFlow { + interestedMedicineDataSource.getInterestedMedicineList().map { result -> + result.fold(onSuccess = { Result.success(it.medicineList) }, onFailure = { Result.failure(it) }) + }.collectLatest { trySend(it) } + } + + override fun addInterestedMedicine(addInterestedMedicineParameter: AddInterestedMedicineParameter): Flow> = + interestedMedicineDataSource.addInterestedMedicine(addInterestedMedicineParameter) + + override fun deleteInterestedMedicine(medicineId: Long): Flow> = + interestedMedicineDataSource.deleteInterestedMedicine(medicineId) + + override fun isInterestedMedicine(itemSeq: Long): Flow> = + interestedMedicineDataSource.isInterestedMedicine(itemSeq) } \ No newline at end of file diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetInterestedMedicineUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetInterestedMedicineUseCase.kt index f4b5cd0cf..6379b30d7 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetInterestedMedicineUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/GetInterestedMedicineUseCase.kt @@ -1,7 +1,12 @@ 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.requestparameters.AddInterestedMedicineParameter +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.map @@ -11,9 +16,25 @@ class GetInterestedMedicineUseCase @Inject constructor(private val interestedMed suspend fun getInterestedMedicineList() = channelFlow { interestedMedicineRepository.getInterestedMedicineList().map { result -> - result.fold( - onSuccess = { Result.success(it.map { it.toInterestedMedicineDto() }) }, - onFailure = { Result.failure(it) }) + result.fold(onSuccess = { Result.success(it.map { it.toInterestedMedicineDto() }) }, onFailure = { Result.failure(it) }) }.collectLatest { trySend(it) } } + + /** + * 관심 약 추가 + */ + fun addInterestedMedicine(addInterestedMedicineParameter: AddInterestedMedicineParameter): Flow> = + interestedMedicineRepository.addInterestedMedicine(addInterestedMedicineParameter) + + /** + * 관심 약 삭제 + */ + fun deleteInterestedMedicine(medicineId: Long): Flow> = + interestedMedicineRepository.deleteInterestedMedicine(medicineId) + + /** + * 관심 약 여부 확인 + */ + fun isInterestedMedicine(medicineId: Long): Flow> = + interestedMedicineRepository.isInterestedMedicine(medicineId) } \ No newline at end of file From 1f5702075982c0c83f4d0b944ec94245ac2854a1 Mon Sep 17 00:00:00 2001 From: JSPark <48265129+pknujsp@users.noreply.github.com> Date: Thu, 8 Jun 2023 05:13:05 +0900 Subject: [PATCH 6/9] =?UTF-8?q?#91=20=EC=95=BD=20=EA=B4=80=EC=8B=AC=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EB=A1=9C=EC=A7=81=20=EC=A0=9C=EC=9E=91=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 1 - .../InterestedMedicineRepository.kt | 8 ++--- .../InterestedMedicineRepositoryImpl.kt | 8 ++--- .../domain/GetInterestedMedicineUseCase.kt | 36 ++++++++++++------- .../InterestedMedicineDto.kt | 6 ---- .../AddInterestedMedicineResponse.kt | 2 +- .../DeleteInterestedMedicineResponse.kt | 2 +- .../InterestedMedicineDto.kt | 6 ++++ .../InterestedMedicineListResponse.kt | 3 +- .../IsInterestedMedicineResponse.kt | 2 +- .../InterestedMedicineDataSource.kt | 9 +++-- .../InterestedMedicineDataSourceImpl.kt | 8 ++--- .../core/network/module/AwsNetwork.kt | 8 ++--- .../InterestedMedicineFragment.kt | 2 +- .../InterstedMedicineViewModel.kt | 2 +- .../medicine/main/MedicineInfoFragment.kt | 6 +++- .../medicine/main/MedicineInfoViewModel.kt | 35 ++++++++++++++++-- 17 files changed, 94 insertions(+), 50 deletions(-) delete mode 100644 core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/InterestedMedicineDto.kt rename core/model/src/main/java/com/android/mediproject/core/model/medicine/{InterestedMedicine => interestedMedicine}/AddInterestedMedicineResponse.kt (80%) rename core/model/src/main/java/com/android/mediproject/core/model/medicine/{InterestedMedicine => interestedMedicine}/DeleteInterestedMedicineResponse.kt (75%) create mode 100644 core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/InterestedMedicineDto.kt rename core/model/src/main/java/com/android/mediproject/core/model/medicine/{InterestedMedicine => interestedMedicine}/InterestedMedicineListResponse.kt (84%) rename core/model/src/main/java/com/android/mediproject/core/model/medicine/{InterestedMedicine => interestedMedicine}/IsInterestedMedicineResponse.kt (80%) diff --git a/.idea/misc.xml b/.idea/misc.xml index cf0ba30d9..e8da491a1 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepository.kt index c906ff667..9376f40c7 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepository.kt @@ -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 diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepositoryImpl.kt index dc93f2799..4e957770c 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepositoryImpl.kt @@ -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 diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetInterestedMedicineUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetInterestedMedicineUseCase.kt index 6379b30d7..991f26f4c 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetInterestedMedicineUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/GetInterestedMedicineUseCase.kt @@ -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 @@ -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> = - interestedMedicineRepository.addInterestedMedicine(addInterestedMedicineParameter) + fun interestedMedicine(medicineId: Long, like: Boolean): Flow> = 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> = - interestedMedicineRepository.deleteInterestedMedicine(medicineId) /** * 관심 약 여부 확인 diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/InterestedMedicineDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/InterestedMedicineDto.kt deleted file mode 100644 index d3a72b4ff..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/InterestedMedicineDto.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.android.mediproject.core.model.medicine.InterestedMedicine - -data class InterestedMedicineDto ( - val itemSeq : String, - val medicineName: String -) \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/AddInterestedMedicineResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/AddInterestedMedicineResponse.kt similarity index 80% rename from core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/AddInterestedMedicineResponse.kt rename to core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/AddInterestedMedicineResponse.kt index f3d181f3f..27d4e9f0c 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/AddInterestedMedicineResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/AddInterestedMedicineResponse.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.model.medicine.InterestedMedicine +package com.android.mediproject.core.model.medicine.interestedMedicine import kotlinx.serialization.SerialName diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/DeleteInterestedMedicineResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/DeleteInterestedMedicineResponse.kt similarity index 75% rename from core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/DeleteInterestedMedicineResponse.kt rename to core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/DeleteInterestedMedicineResponse.kt index cf958afcd..0bbb4ec6f 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/DeleteInterestedMedicineResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/DeleteInterestedMedicineResponse.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.model.medicine.InterestedMedicine +package com.android.mediproject.core.model.medicine.interestedMedicine import kotlinx.serialization.SerialName diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/InterestedMedicineDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/InterestedMedicineDto.kt new file mode 100644 index 000000000..f886499b7 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/InterestedMedicineDto.kt @@ -0,0 +1,6 @@ +package com.android.mediproject.core.model.medicine.interestedMedicine + +data class InterestedMedicineDto( + val itemSeq: String, + val medicineName: String +) \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/InterestedMedicineListResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/InterestedMedicineListResponse.kt similarity index 84% rename from core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/InterestedMedicineListResponse.kt rename to core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/InterestedMedicineListResponse.kt index d8e16144f..a7d2d705d 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/InterestedMedicineListResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/InterestedMedicineListResponse.kt @@ -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 diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/IsInterestedMedicineResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/IsInterestedMedicineResponse.kt similarity index 80% rename from core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/IsInterestedMedicineResponse.kt rename to core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/IsInterestedMedicineResponse.kt index 79da247cb..ef9cfd952 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/medicine/InterestedMedicine/IsInterestedMedicineResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/IsInterestedMedicineResponse.kt @@ -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 diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSource.kt index 5e698624b..c0b1e1dee 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSource.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSource.kt @@ -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 diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSourceImpl.kt index f953e849d..03dea152d 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSourceImpl.kt @@ -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 diff --git a/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt b/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt index d40e9e1e2..8ded7bd56 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt @@ -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 diff --git a/feature/interestedmedicine/src/main/java/com/android/mediproject/feature/interestedmedicine/InterestedMedicineFragment.kt b/feature/interestedmedicine/src/main/java/com/android/mediproject/feature/interestedmedicine/InterestedMedicineFragment.kt index ca378c540..1943f40ad 100644 --- a/feature/interestedmedicine/src/main/java/com/android/mediproject/feature/interestedmedicine/InterestedMedicineFragment.kt +++ b/feature/interestedmedicine/src/main/java/com/android/mediproject/feature/interestedmedicine/InterestedMedicineFragment.kt @@ -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 diff --git a/feature/interestedmedicine/src/main/java/com/android/mediproject/feature/interestedmedicine/InterstedMedicineViewModel.kt b/feature/interestedmedicine/src/main/java/com/android/mediproject/feature/interestedmedicine/InterstedMedicineViewModel.kt index 7a580537f..a98c58dbe 100644 --- a/feature/interestedmedicine/src/main/java/com/android/mediproject/feature/interestedmedicine/InterstedMedicineViewModel.kt +++ b/feature/interestedmedicine/src/main/java/com/android/mediproject/feature/interestedmedicine/InterstedMedicineViewModel.kt @@ -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 diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoFragment.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoFragment.kt index 1c5bf9b37..692a71754 100644 --- a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoFragment.kt +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoFragment.kt @@ -98,7 +98,11 @@ class MedicineInfoFragment : BaseFragment {} + is EventState.Interest -> { + binding.interestBtn.isEnabled = it.lockChecked + binding.interestBtn.isChecked = it.isInterest + } + is EventState.ScrollToBottom -> { binding.topAppBar.setExpanded(false, true) } diff --git a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoViewModel.kt b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoViewModel.kt index c42efdd88..87389dd7c 100644 --- a/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoViewModel.kt +++ b/feature/medicine/src/main/java/com/android/mediproject/feature/medicine/main/MedicineInfoViewModel.kt @@ -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 @@ -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 @@ -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() { @@ -49,6 +52,8 @@ class MedicineInfoViewModel @Inject constructor( private val _medicinePrimaryInfo = MutableSharedFlow(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST) val medicinePrimaryInfo get() = _medicinePrimaryInfo.asSharedFlow() + private val isInterestedMedicine = MutableStateFlow(EventState.Interest(isInterest = false, lockChecked = true)) + val medicineDetails: StateFlow> = medicinePrimaryInfo.flatMapLatest { primaryInfo -> getMedicineDetailsUseCase(primaryInfo).mapLatest { result -> result.fold(onSuccess = { @@ -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)) + } + } + } } } @@ -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() + } \ No newline at end of file From 9b97aee7a3f1f275543b5ad27cc8f7805a4ceb4d Mon Sep 17 00:00:00 2001 From: JSPark <48265129+pknujsp@users.noreply.github.com> Date: Thu, 8 Jun 2023 05:27:00 +0900 Subject: [PATCH 7/9] =?UTF-8?q?#91=20=EA=B4=80=EC=8B=AC=20=EC=95=BD=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=AA=A8?= =?UTF-8?q?=EB=8D=B8=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interestedmedicine/InterestedMedicineRepository.kt | 10 +++++----- .../InterestedMedicineRepositoryImpl.kt | 10 +++++----- .../core/domain/GetInterestedMedicineUseCase.kt | 4 ++-- .../DeleteInterestedMedicineResponse.kt | 2 +- .../InterestedMedicineDto.kt | 2 +- .../InterestedMedicineListResponse.kt | 2 +- .../IsInterestedMedicineResponse.kt | 2 +- .../NewInterestedMedicineResponse.kt} | 4 ++-- .../interestedmedicine/InterestedMedicineDataSource.kt | 10 +++++----- .../InterestedMedicineDataSourceImpl.kt | 10 +++++----- .../mediproject/core/network/module/AwsNetwork.kt | 10 +++++----- .../interestedmedicine/InterestedMedicineFragment.kt | 2 +- .../interestedmedicine/InterstedMedicineViewModel.kt | 2 +- 13 files changed, 35 insertions(+), 35 deletions(-) rename core/model/src/main/java/com/android/mediproject/core/model/{medicine/interestedMedicine => interestedmedicine}/DeleteInterestedMedicineResponse.kt (73%) rename core/model/src/main/java/com/android/mediproject/core/model/{medicine/interestedMedicine => interestedmedicine}/InterestedMedicineDto.kt (55%) rename core/model/src/main/java/com/android/mediproject/core/model/{medicine/interestedMedicine => interestedmedicine}/InterestedMedicineListResponse.kt (92%) rename core/model/src/main/java/com/android/mediproject/core/model/{medicine/interestedMedicine => interestedmedicine}/IsInterestedMedicineResponse.kt (77%) rename core/model/src/main/java/com/android/mediproject/core/model/{medicine/interestedMedicine/AddInterestedMedicineResponse.kt => interestedmedicine/NewInterestedMedicineResponse.kt} (66%) diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepository.kt index 9376f40c7..e8a74c837 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepository.kt @@ -1,17 +1,17 @@ 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.interestedmedicine.DeleteInterestedMedicineResponse +import com.android.mediproject.core.model.interestedmedicine.InterestedMedicineListResponse +import com.android.mediproject.core.model.interestedmedicine.IsInterestedMedicineResponse +import com.android.mediproject.core.model.interestedmedicine.NewInterestedMedicineResponse import com.android.mediproject.core.model.requestparameters.AddInterestedMedicineParameter import kotlinx.coroutines.flow.Flow interface InterestedMedicineRepository { suspend fun getInterestedMedicineList(): Flow>> - fun addInterestedMedicine(addInterestedMedicineParameter: AddInterestedMedicineParameter): Flow> + fun addInterestedMedicine(addInterestedMedicineParameter: AddInterestedMedicineParameter): Flow> fun deleteInterestedMedicine(medicineId: Long): Flow> diff --git a/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepositoryImpl.kt index 4e957770c..b46bcefc4 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/remote/interestedmedicine/InterestedMedicineRepositoryImpl.kt @@ -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.interestedmedicine.DeleteInterestedMedicineResponse +import com.android.mediproject.core.model.interestedmedicine.InterestedMedicineListResponse +import com.android.mediproject.core.model.interestedmedicine.IsInterestedMedicineResponse +import com.android.mediproject.core.model.interestedmedicine.NewInterestedMedicineResponse import com.android.mediproject.core.model.requestparameters.AddInterestedMedicineParameter import com.android.mediproject.core.network.datasource.interestedmedicine.InterestedMedicineDataSource import kotlinx.coroutines.flow.Flow @@ -21,7 +21,7 @@ class InterestedMedicineRepositoryImpl @Inject constructor(private val intereste }.collectLatest { trySend(it) } } - override fun addInterestedMedicine(addInterestedMedicineParameter: AddInterestedMedicineParameter): Flow> = + override fun addInterestedMedicine(addInterestedMedicineParameter: AddInterestedMedicineParameter): Flow> = interestedMedicineDataSource.addInterestedMedicine(addInterestedMedicineParameter) override fun deleteInterestedMedicine(medicineId: Long): Flow> = diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetInterestedMedicineUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetInterestedMedicineUseCase.kt index 991f26f4c..ae2166bab 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetInterestedMedicineUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/GetInterestedMedicineUseCase.kt @@ -1,8 +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.IsInterestedMedicineResponse -import com.android.mediproject.core.model.medicine.interestedMedicine.toInterestedMedicineDto +import com.android.mediproject.core.model.interestedmedicine.IsInterestedMedicineResponse +import com.android.mediproject.core.model.interestedmedicine.toInterestedMedicineDto import com.android.mediproject.core.model.requestparameters.AddInterestedMedicineParameter import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/DeleteInterestedMedicineResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/interestedmedicine/DeleteInterestedMedicineResponse.kt similarity index 73% rename from core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/DeleteInterestedMedicineResponse.kt rename to core/model/src/main/java/com/android/mediproject/core/model/interestedmedicine/DeleteInterestedMedicineResponse.kt index 0bbb4ec6f..9a40bccf8 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/DeleteInterestedMedicineResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/interestedmedicine/DeleteInterestedMedicineResponse.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.model.medicine.interestedMedicine +package com.android.mediproject.core.model.interestedmedicine import kotlinx.serialization.SerialName diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/InterestedMedicineDto.kt b/core/model/src/main/java/com/android/mediproject/core/model/interestedmedicine/InterestedMedicineDto.kt similarity index 55% rename from core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/InterestedMedicineDto.kt rename to core/model/src/main/java/com/android/mediproject/core/model/interestedmedicine/InterestedMedicineDto.kt index f886499b7..0ca1214c5 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/InterestedMedicineDto.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/interestedmedicine/InterestedMedicineDto.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.model.medicine.interestedMedicine +package com.android.mediproject.core.model.interestedmedicine data class InterestedMedicineDto( val itemSeq: String, diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/InterestedMedicineListResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/interestedmedicine/InterestedMedicineListResponse.kt similarity index 92% rename from core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/InterestedMedicineListResponse.kt rename to core/model/src/main/java/com/android/mediproject/core/model/interestedmedicine/InterestedMedicineListResponse.kt index a7d2d705d..77203e082 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/InterestedMedicineListResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/interestedmedicine/InterestedMedicineListResponse.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.model.medicine.interestedMedicine +package com.android.mediproject.core.model.interestedmedicine import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/IsInterestedMedicineResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/interestedmedicine/IsInterestedMedicineResponse.kt similarity index 77% rename from core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/IsInterestedMedicineResponse.kt rename to core/model/src/main/java/com/android/mediproject/core/model/interestedmedicine/IsInterestedMedicineResponse.kt index ef9cfd952..f4bbc44b4 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/IsInterestedMedicineResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/interestedmedicine/IsInterestedMedicineResponse.kt @@ -1,4 +1,4 @@ -package com.android.mediproject.core.model.medicine.interestedMedicine +package com.android.mediproject.core.model.interestedmedicine import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/AddInterestedMedicineResponse.kt b/core/model/src/main/java/com/android/mediproject/core/model/interestedmedicine/NewInterestedMedicineResponse.kt similarity index 66% rename from core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/AddInterestedMedicineResponse.kt rename to core/model/src/main/java/com/android/mediproject/core/model/interestedmedicine/NewInterestedMedicineResponse.kt index 27d4e9f0c..24ffe5f47 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/medicine/interestedMedicine/AddInterestedMedicineResponse.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/interestedmedicine/NewInterestedMedicineResponse.kt @@ -1,11 +1,11 @@ -package com.android.mediproject.core.model.medicine.interestedMedicine +package com.android.mediproject.core.model.interestedmedicine import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -data class AddInterestedMedicineResponse( +data class NewInterestedMedicineResponse( @SerialName("favoriteMedicineID") val favoriteMedicineID: Int, // 86 @SerialName("message") val message: String ) \ No newline at end of file diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSource.kt index c0b1e1dee..e39be547d 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSource.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSource.kt @@ -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.interestedmedicine.DeleteInterestedMedicineResponse +import com.android.mediproject.core.model.interestedmedicine.InterestedMedicineListResponse +import com.android.mediproject.core.model.interestedmedicine.IsInterestedMedicineResponse +import com.android.mediproject.core.model.interestedmedicine.NewInterestedMedicineResponse import com.android.mediproject.core.model.requestparameters.AddInterestedMedicineParameter import kotlinx.coroutines.flow.Flow @@ -13,7 +13,7 @@ interface InterestedMedicineDataSource { /** * 관심 약 추가 */ - fun addInterestedMedicine(addInterestedMedicineParameter: AddInterestedMedicineParameter): Flow> + fun addInterestedMedicine(addInterestedMedicineParameter: AddInterestedMedicineParameter): Flow> /** * 관심 약 삭제 diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSourceImpl.kt index 03dea152d..75b5d589e 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSourceImpl.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/interestedmedicine/InterestedMedicineDataSourceImpl.kt @@ -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.interestedmedicine.DeleteInterestedMedicineResponse +import com.android.mediproject.core.model.interestedmedicine.InterestedMedicineListResponse +import com.android.mediproject.core.model.interestedmedicine.IsInterestedMedicineResponse +import com.android.mediproject.core.model.interestedmedicine.NewInterestedMedicineResponse import com.android.mediproject.core.model.requestparameters.AddInterestedMedicineParameter import com.android.mediproject.core.network.module.AwsNetworkApi import com.android.mediproject.core.network.onResponse @@ -19,7 +19,7 @@ class InterestedMedicineDataSourceImpl @Inject constructor(private val awsNetwor } } - override fun addInterestedMedicine(addInterestedMedicineParameter: AddInterestedMedicineParameter): Flow> = + override fun addInterestedMedicine(addInterestedMedicineParameter: AddInterestedMedicineParameter): Flow> = channelFlow { awsNetworkApi.addInterestedMedicine(addInterestedMedicineParameter).onResponse() .fold(onSuccess = { Result.success(it) }, onFailure = { Result.failure(it) }).also { diff --git a/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt b/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt index 8ded7bd56..4ffb50030 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/module/AwsNetwork.kt @@ -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.interestedmedicine.DeleteInterestedMedicineResponse +import com.android.mediproject.core.model.interestedmedicine.InterestedMedicineListResponse +import com.android.mediproject.core.model.interestedmedicine.IsInterestedMedicineResponse +import com.android.mediproject.core.model.interestedmedicine.NewInterestedMedicineResponse 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 @@ -244,7 +244,7 @@ interface AwsNetworkApi { @POST(value = "medicine/favorite") suspend fun addInterestedMedicine( @Body addInterestedMedicineParameter: AddInterestedMedicineParameter - ): Response + ): Response /** * 관심 약 삭제 diff --git a/feature/interestedmedicine/src/main/java/com/android/mediproject/feature/interestedmedicine/InterestedMedicineFragment.kt b/feature/interestedmedicine/src/main/java/com/android/mediproject/feature/interestedmedicine/InterestedMedicineFragment.kt index 1943f40ad..6eb8e6070 100644 --- a/feature/interestedmedicine/src/main/java/com/android/mediproject/feature/interestedmedicine/InterestedMedicineFragment.kt +++ b/feature/interestedmedicine/src/main/java/com/android/mediproject/feature/interestedmedicine/InterestedMedicineFragment.kt @@ -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.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 diff --git a/feature/interestedmedicine/src/main/java/com/android/mediproject/feature/interestedmedicine/InterstedMedicineViewModel.kt b/feature/interestedmedicine/src/main/java/com/android/mediproject/feature/interestedmedicine/InterstedMedicineViewModel.kt index a98c58dbe..e47927da9 100644 --- a/feature/interestedmedicine/src/main/java/com/android/mediproject/feature/interestedmedicine/InterstedMedicineViewModel.kt +++ b/feature/interestedmedicine/src/main/java/com/android/mediproject/feature/interestedmedicine/InterstedMedicineViewModel.kt @@ -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.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 From 17b1b81f4daf73e360c135fae827d4e386b6eb9b Mon Sep 17 00:00:00 2001 From: JSPark <48265129+pknujsp@users.noreply.github.com> Date: Thu, 8 Jun 2023 06:06:29 +0900 Subject: [PATCH 8/9] =?UTF-8?q?#91=20=EB=84=A4=ED=8A=B8=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=20=EC=97=B0=EA=B2=B0=20=ED=99=95=EC=9D=B8=20=EB=8B=A4=EC=9D=B4?= =?UTF-8?q?=EC=96=BC=EB=A1=9C=EA=B7=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 2 +- .../com/android/mediproject/MainActivity.kt | 11 +++ .../mediproject/NetworkStateDialogFragment.kt | 21 ++++++ .../main/res/layout/view_network_state.xml | 30 ++++++++ app/src/main/res/values/styles.xml | 11 +++ core/common/src/main/res/values/strings.xml | 1 + core/network/src/main/AndroidManifest.xml | 1 + .../core/network/InternetNetworkListener.kt | 73 +++++++++++++++++++ .../res/layout/fragment_search_medicines.xml | 19 ++--- 9 files changed, 157 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/com/android/mediproject/NetworkStateDialogFragment.kt create mode 100644 app/src/main/res/layout/view_network_state.xml create mode 100644 core/network/src/main/java/com/android/mediproject/core/network/InternetNetworkListener.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9ebea58d7..0c5ca96e4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -44,7 +44,7 @@ dependencies { implementation(project(":core:model")) implementation(project(":core:database")) implementation(project(":core:domain")) - + implementation(project(":core:network")) implementation(project(":feature:interestedmedicine")) implementation(project(":feature:home")) diff --git a/app/src/main/java/com/android/mediproject/MainActivity.kt b/app/src/main/java/com/android/mediproject/MainActivity.kt index 4d5da2a53..f70af7233 100644 --- a/app/src/main/java/com/android/mediproject/MainActivity.kt +++ b/app/src/main/java/com/android/mediproject/MainActivity.kt @@ -18,6 +18,7 @@ import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.setupWithNavController import com.android.mediproject.core.common.uiutil.LayoutController import com.android.mediproject.core.common.uiutil.SystemBarStyler +import com.android.mediproject.core.network.InternetNetworkListener import com.android.mediproject.core.ui.WindowViewModel import com.android.mediproject.core.ui.base.BaseActivity import com.android.mediproject.databinding.ActivityMainBinding @@ -32,6 +33,8 @@ class MainActivity : BaseActivity(ActivityMa @Inject lateinit var systemBarStyler: SystemBarStyler + @Inject lateinit var internetNetworkListener: InternetNetworkListener + companion object { const val VISIBLE = 0 const val INVISIBLE = 1 @@ -44,6 +47,14 @@ class MainActivity : BaseActivity(ActivityMa systemBarStyler.init(this, window, this::changeFragmentContainerHeight) systemBarStyler.setStyle(SystemBarStyler.StatusBarColor.WHITE, SystemBarStyler.NavigationBarColor.BLACK) + internetNetworkListener.activityLifeCycle = this.lifecycle + internetNetworkListener.networkStateCallback = InternetNetworkListener.NetworkStateCallback { isConnected -> + if (!isConnected) { + val modalBottomSheet = NetworkStateDialogFragment() + modalBottomSheet.show(supportFragmentManager, NetworkStateDialogFragment::class.java.name) + } + } + //SDK 31이상일 때 Splash가 소소하게 사라지는 이펙트 입니다. 추후 걸리적거리면 삭제해도 됌 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { splashScreen.setOnExitAnimationListener { splashScreenView -> diff --git a/app/src/main/java/com/android/mediproject/NetworkStateDialogFragment.kt b/app/src/main/java/com/android/mediproject/NetworkStateDialogFragment.kt new file mode 100644 index 000000000..6f00d377e --- /dev/null +++ b/app/src/main/java/com/android/mediproject/NetworkStateDialogFragment.kt @@ -0,0 +1,21 @@ +package com.android.mediproject + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class NetworkStateDialogFragment : BottomSheetDialogFragment() { + + private var _binding: BindingView + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? = inflater.inflate(R.layout.modal_bottom_sheet_content, container, false) + +} \ No newline at end of file diff --git a/app/src/main/res/layout/view_network_state.xml b/app/src/main/res/layout/view_network_state.xml new file mode 100644 index 000000000..4e93c2bfd --- /dev/null +++ b/app/src/main/res/layout/view_network_state.xml @@ -0,0 +1,30 @@ + + + + + +