Skip to content

Commit

Permalink
Feat.소속 삭제 기능 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
eunseo0105 committed Aug 7, 2024
1 parent a9aa873 commit e9a5b95
Show file tree
Hide file tree
Showing 13 changed files with 205 additions and 13 deletions.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.moneymong.moneymong.model.agency.MyAgencyResponse
import com.moneymong.moneymong.model.agency.RegisterAgencyResponse
import com.moneymong.moneymong.model.member.InvitationCodeResponse
import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.GET
import retrofit2.http.Header
import retrofit2.http.PATCH
Expand Down Expand Up @@ -49,4 +50,10 @@ interface AgencyApi {
suspend fun reInvitationCode(
@Path("agencyId") agencyId: Long
): Result<InvitationCodeResponse>

//DELETE
@DELETE("api/v1/agencies/{agencyId}")
suspend fun deleteAgency(
@Path("agencyId") agencyId: Int
) : Result<Unit>
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,6 @@ interface MemberRemoteDataSource {
suspend fun getMemberLists(agencyId: Long): Result<MemberListResponse>
suspend fun updateMemberAuthor(agencyId : Long, data : UpdateAuthorRequest) : Result<Unit>
suspend fun blockMemberAuthor(agencyId: Long, data : MemberBlockRequest) : Result<Unit>
suspend fun deleteAgency(agencyId: Int) : Result<Unit>

}
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,8 @@ class MemberRemoteDataSourceImpl @Inject constructor(
override suspend fun blockMemberAuthor(agencyId: Long, data: MemberBlockRequest): Result<Unit> {
return memberApi.blockMemberAuthor(agencyId, data)
}

override suspend fun deleteAgency(agencyId: Int): Result<Unit> {
return agencyApi.deleteAgency(agencyId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,8 @@ class MemberRepositoryImpl @Inject constructor(
return memberRemoteDataSource.blockMemberAuthor(agencyId, data)

}

override suspend fun deleteAgency(agencyId: Int): Result<Unit> {
return memberRemoteDataSource.deleteAgency(agencyId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,6 @@ interface MemberRepository {
suspend fun getMemberLists(agencyId: Long) : Result<MemberListResponse>
suspend fun updateMemberAuthor(agencyId : Long, data : UpdateAuthorRequest) : Result<Unit>
suspend fun blockMemberAuthor(agencyId: Long, data: MemberBlockRequest) : Result<Unit>
suspend fun deleteAgency(agencyId: Int) :Result<Unit>

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.moneymong.moneymong.domain.usecase.member

import com.moneymong.moneymong.domain.repository.member.MemberRepository
import javax.inject.Inject

class AgencyDeleteUseCase @Inject constructor(
private val memberRepository: MemberRepository
) {
suspend operator fun invoke(agencyId: Int) : Result<Unit> {
return memberRepository.deleteAgency(agencyId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,17 @@ fun LedgerScreen(
}
} else {
Box(modifier = modifier.fillMaxSize()) {
MemberScreen(agencyId = state.agencyId)
MemberScreen(
agencyId = state.agencyId,
agencyList = state.agencyList,
onClickItem = {
viewModel.eventEmit(
LedgerSideEffect.LedgerSelectedAgencyChange(
it
)
)
},
changeAgencyList = { viewModel.changeAgencyList(it) })
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.moneymong.moneymong.ledger

import android.util.Log
import androidx.lifecycle.SavedStateHandle
import com.moneymong.moneymong.common.base.BaseViewModel
import com.moneymong.moneymong.common.error.MoneyMongError
Expand All @@ -14,6 +15,7 @@ import com.moneymong.moneymong.domain.usecase.member.MemberListUseCase
import com.moneymong.moneymong.domain.usecase.user.FetchUserIdUseCase
import com.moneymong.moneymong.ledger.navigation.LedgerArgs
import com.moneymong.moneymong.ledger.view.LedgerTransactionType
import com.moneymong.moneymong.model.agency.MyAgencyResponse
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.collectLatest
import org.orbitmvi.orbit.annotation.OrbitExperimental
Expand Down Expand Up @@ -69,6 +71,7 @@ class LedgerViewModel @Inject constructor(
reduce { state.copy(isAgencyExistLoading = true) }
fetchAgencyExistLedgerUseCase(state.agencyId)
.onSuccess {
Log.d("fetchAgencyExistLedger${state.agencyId}",it.toString() )
reduce {
state.copy(
isExistLedger = it,
Expand All @@ -90,18 +93,26 @@ class LedgerViewModel @Inject constructor(
page = 0,
limit = 100
).onSuccess {
Log.d("fetchLedgerTransactionList${state.existAgency}",it.toString() )

reduce {
state.copy(
ledgerTransaction = it,
visibleError = false
)
}
}.onFailure {
reduce {
if (it.message.equals("장부가 존재하지 않습니다.")) { //TODO - 서버 의논 후 변경 예정
state.copy(
visibleError = true,
errorMessage = it.message ?: MoneyMongError.UnExpectedError.message
visibleError = false,
)
} else {
reduce {
state.copy(
visibleError = true,
errorMessage = it.message ?: MoneyMongError.UnExpectedError.message
)
}
}
}.also { reduce { state.copy(isLedgerTransactionLoading = false) } }
}
Expand All @@ -111,6 +122,8 @@ class LedgerViewModel @Inject constructor(
reduce { state.copy(isMyAgencyLoading = true) }
fetchMyAgencyListUseCase()
.onSuccess {
Log.d("fetchMyAgencyList${state.existAgency}",it.toString() )

reduce {
state.copy(
agencyList = it,
Expand Down Expand Up @@ -142,11 +155,20 @@ class LedgerViewModel @Inject constructor(
)
}
}.onFailure {
reduce {
state.copy(
visibleError = true,
errorMessage = it.message ?: MoneyMongError.UnExpectedError.message
)
if (it.message.equals("소속에 가입 후 장부를 사용할 수 있습니다.")) { //TODO - 서버 의논 후 변경 예정
reduce {
state.copy(
visibleError = false
)
}
} else {
reduce {
state.copy(
visibleError = true,
errorMessage = it.message
?: MoneyMongError.UnExpectedError.message
)
}
}
}.also { reduce { state.copy(isAgencyMemberLoading = false) } }
}
Expand Down Expand Up @@ -216,4 +238,13 @@ class LedgerViewModel @Inject constructor(
postDisplayedLedgerOnboardingUseCase(onboardingType = state.onboardingType)
reduce { state.copy(visibleOnboarding = false) }
}
}


fun changeAgencyList(filteredAgencyList: List<MyAgencyResponse>) = intent {
reduce {
state.copy(
agencyList = filteredAgencyList
)
}
}
}
49 changes: 48 additions & 1 deletion feature/member/src/main/java/com/example/member/MemberScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import com.moneymong.moneymong.design_system.component.bottomSheet.MDSBottomShee
import com.moneymong.moneymong.design_system.component.button.MDSButton
import com.moneymong.moneymong.design_system.component.button.MDSButtonSize
import com.moneymong.moneymong.design_system.component.button.MDSButtonType
import com.moneymong.moneymong.design_system.component.modal.MDSModal
import com.moneymong.moneymong.design_system.component.snackbar.MDSSnackbarHost
import com.moneymong.moneymong.design_system.error.ErrorDialog
import com.moneymong.moneymong.design_system.error.ErrorScreen
Expand All @@ -50,6 +51,7 @@ import com.moneymong.moneymong.design_system.theme.Gray08
import com.moneymong.moneymong.design_system.theme.MMHorizontalSpacing
import com.moneymong.moneymong.design_system.theme.Red03
import com.moneymong.moneymong.design_system.theme.White
import com.moneymong.moneymong.model.agency.MyAgencyResponse
import kotlinx.coroutines.launch
import org.orbitmvi.orbit.compose.collectAsState
import org.orbitmvi.orbit.compose.collectSideEffect
Expand All @@ -59,7 +61,10 @@ import org.orbitmvi.orbit.compose.collectSideEffect
@Composable
fun MemberScreen(
viewModel: MemberViewModel = hiltViewModel(),
agencyId: Int
agencyId: Int,
agencyList: List<MyAgencyResponse>,
onClickItem: (agencyId: Int) -> Unit,
changeAgencyList: (changeAgencyList: List<MyAgencyResponse>) -> Unit
) {
val sheetState = rememberModalBottomSheetState(
skipPartiallyExpanded = true,
Expand Down Expand Up @@ -196,6 +201,44 @@ fun MemberScreen(
)
}

if (state.deleteAgency) {
MDSModal(
icon = R.drawable.ic_warning_filled,
title = "소속을 정말 삭제하시겠어요?",
description = "등록된 회비 내역이 모두 사라져요.",
negativeBtnText = "취소",
positiveBtnText = "확인",
onClickNegative = { viewModel.deleteAgencyBtnClicked(false) },
onClickPositive = {
viewModel.deleteAgency(
agencyId,
agencyList,
onClickItem,
changeAgencyList
)
}
)
}

if (state.deleteAgency) {
MDSModal(
icon = R.drawable.ic_warning_filled,
title = "소속을 정말 삭제하시겠어요?",
description = "등록된 회비 내역이 모두 사라져요.",
negativeBtnText = "취소",
positiveBtnText = "확인",
onClickNegative = { viewModel.deleteAgencyBtnClicked(false) },
onClickPositive = {
viewModel.deleteAgency(
agencyId,
agencyList,
onClickItem,
changeAgencyList
)
}
)
}

if (state.visibleBottomSheet) {
viewModel.isRoleChanged(false)
MDSBottomSheet(
Expand Down Expand Up @@ -383,6 +426,8 @@ fun MemberScreen(
invitationCode = state.invitationCode,
isReInvitationCode = { viewModel.eventEmit(MemberSideEffect.GetReInvitationCode(it)) }, //TODO
onCopyChange = { onCopyClick -> viewModel.onCopyClickChanged(onCopyClick) },
deleteAgencyBtnClicked = { onClick -> viewModel.deleteAgencyBtnClicked(onClick)}

)

MemberListView(
Expand Down Expand Up @@ -428,6 +473,8 @@ fun MemberScreen(
invitationCode = state.invitationCode,
isReInvitationCode = { viewModel.eventEmit(MemberSideEffect.GetReInvitationCode(it)) },
onCopyChange = { onCopyClick -> viewModel.onCopyClickChanged(onCopyClick) },
deleteAgencyBtnClicked = { onClick -> viewModel.deleteAgencyBtnClicked(onClick)}

)

MemberListView(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,6 @@ data class MemberState(
val isUserAuthor: String = "",
val agencyId: Int = 0,
val isBlockedUser : Boolean = false,
val deleteAgency : Boolean = false,

) : State
50 changes: 48 additions & 2 deletions feature/member/src/main/java/com/example/member/MemberViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ package com.example.member
import android.util.Log
import com.moneymong.moneymong.common.base.BaseViewModel
import com.moneymong.moneymong.domain.usecase.agency.FetchAgencyIdUseCase
import com.moneymong.moneymong.domain.usecase.member.AgencyDeleteUseCase
import com.moneymong.moneymong.domain.usecase.member.MemberBlockUseCase
import com.moneymong.moneymong.domain.usecase.member.MemberInvitationCodeUseCase
import com.moneymong.moneymong.domain.usecase.member.MemberListUseCase
import com.moneymong.moneymong.domain.usecase.member.MemberReInvitationCodeUseCase
import com.moneymong.moneymong.domain.usecase.member.UpdateMemberAuthorUseCase
import com.moneymong.moneymong.domain.usecase.user.GetMyInfoUseCase
import com.moneymong.moneymong.model.agency.MyAgencyResponse
import com.moneymong.moneymong.model.member.AgencyUser
import com.moneymong.moneymong.model.member.MemberBlockRequest
import com.moneymong.moneymong.model.member.UpdateAuthorRequest
Expand All @@ -27,7 +29,8 @@ class MemberViewModel @Inject constructor(
private val getMyInfoUseCase: GetMyInfoUseCase,
private val updateMemberAuthorUseCase: UpdateMemberAuthorUseCase,
private val memberBlockUseCase: MemberBlockUseCase,
private val fetchAgencyIdUseCase: FetchAgencyIdUseCase
private val fetchAgencyIdUseCase: FetchAgencyIdUseCase,
private val delecteAgencyUseCase: AgencyDeleteUseCase
) : BaseViewModel<MemberState, MemberSideEffect>(MemberState()) {

init {
Expand Down Expand Up @@ -256,14 +259,15 @@ class MemberViewModel @Inject constructor(
}
}


fun blockMemberAuthor(agencyId: Long, userId: Long) = intent {
memberBlockUseCase(agencyId, MemberBlockRequest(userId))
.onSuccess {
updateFilteredMemberListByBlock(userId)
updateMemberListByBlock(userId)
}
.onFailure {
reduce{
reduce {
state.copy(
visiblePopUpError = true,
errorPopUpMessage = it.message.toString()
Expand All @@ -272,6 +276,48 @@ class MemberViewModel @Inject constructor(
}
}


fun deleteAgency(
agencyId: Int,
agencyList: List<MyAgencyResponse>,
onClickItem: (agencyId: Int) -> Unit,
changeAgencyList: (agencyList: List<MyAgencyResponse>) -> Unit
) = intent {
delecteAgencyUseCase.invoke(agencyId)
.onSuccess {
Log.d("deleteAgency${agencyId}", it.toString())
val filteredList = agencyList.filter { it.id != agencyId }
if (filteredList.isNotEmpty()) {
val randomAgency = filteredList.random()
onClickItem(randomAgency.id)
changeAgencyList(filteredList)
} else {
changeAgencyList(emptyList())
}
reduce {
state.copy(
deleteAgency = false
)
}
}.onFailure {
reduce {
state.copy(
visiblePopUpError = true,
errorPopUpMessage = it.message.toString()
)
}
}
}


fun deleteAgencyBtnClicked(deleteAgencyBtnClicked : Boolean) = intent {
reduce {
state.copy(
deleteAgency = deleteAgencyBtnClicked
)
}
}

private fun updateFilteredMemberListByBlock(userId: Long) = intent {
val currentMemberList = state.filteredMemberList
val updateBlockedMemberList = currentMemberList.filterNot { member ->
Expand Down
Loading

0 comments on commit e9a5b95

Please sign in to comment.