Skip to content

Commit 7450bab

Browse files
authored
Merge pull request #77 from YAPP-Github/epic/moneymong-124-소속
Epic/moneymong 124 소속 -> develop merge
2 parents 03b6bda + b16e734 commit 7450bab

14 files changed

Lines changed: 177 additions & 33 deletions

File tree

data/src/main/java/com/moneymong/moneymong/data/mapper/agency/AgenciesGetMapper.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ fun AgencyGetResponse.toEntity() = AgencyGetEntity(
1212
type = when (type) {
1313
"IN_SCHOOL_CLUB" -> AgencyGetEntity.AgencyType.CLUB
1414
"STUDENT_COUNCIL" -> AgencyGetEntity.AgencyType.COUNCIL
15-
// else -> throw IllegalArgumentException("Unknown type: $type")
16-
else -> AgencyGetEntity.AgencyType.CLUB
15+
else -> throw IllegalArgumentException("Unknown type: $type")
1716
}
1817
)
1918

data/src/main/java/com/moneymong/moneymong/data/pagingsource/AgencyPagingSource.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ class AgencyPagingSource(
1818

1919
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, AgencyGetResponse> {
2020
val page = params.key ?: START_PAGE
21-
val size = params.loadSize
22-
return dataSource.getAgencies(page = page, size = size).fold(
21+
val loadSize = params.loadSize
22+
return dataSource.getAgencies(page = page, size = loadSize).fold(
2323
onSuccess = {
2424
LoadResult.Page(
2525
data = it.agencies,
2626
prevKey = null,
27-
nextKey = if (it.agencies.isEmpty()) null else page + 1
27+
nextKey = if (it.agencies.size < loadSize) null else page + 1
2828
)
2929
},
3030
onFailure = {

feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/navigation/AgencyRegisterNavigation.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package com.moneymong.moneymong.feature.agency.navigation
22

3-
import androidx.compose.foundation.layout.PaddingValues
4-
import androidx.compose.foundation.layout.padding
5-
import androidx.compose.ui.Modifier
63
import androidx.navigation.NavController
74
import androidx.navigation.NavGraphBuilder
85
import androidx.navigation.NavOptions

feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.moneymong.moneymong.feature.agency.register
22

33
import androidx.compose.ui.text.input.TextFieldValue
44
import com.moneymong.moneymong.common.base.State
5-
import com.moneymong.moneymong.feature.agency.AgencyType
5+
import com.moneymong.moneymong.feature.agency.search.AgencyType
66

77
data class AgencyRegisterState(
88
val agencyName: TextFieldValue = TextFieldValue(),

feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/AgencyRegisterViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import com.moneymong.moneymong.common.error.MoneyMongError
66
import com.moneymong.moneymong.domain.param.agency.AgencyRegisterParam
77
import com.moneymong.moneymong.domain.usecase.agency.RegisterAgencyUseCase
88
import com.moneymong.moneymong.domain.usecase.agency.SaveAgencyIdUseCase
9-
import com.moneymong.moneymong.feature.agency.AgencyType
9+
import com.moneymong.moneymong.feature.agency.search.AgencyType
1010
import dagger.hilt.android.lifecycle.HiltViewModel
1111
import org.orbitmvi.orbit.annotation.OrbitExperimental
1212
import org.orbitmvi.orbit.syntax.simple.blockingIntent

feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/complete/AgencyRegisterCompleteScreen.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.moneymong.moneymong.feature.agency.register.complete
22

3+
import androidx.activity.compose.BackHandler
34
import androidx.compose.foundation.Image
45
import androidx.compose.foundation.background
56
import androidx.compose.foundation.clickable
@@ -49,6 +50,8 @@ fun AgencyRegisterCompleteScreen(
4950
}
5051
}
5152

53+
BackHandler { viewModel.navigateToAgencySearch() }
54+
5255
Column(
5356
modifier = modifier
5457
.fillMaxSize()

feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/register/view/AgencyRegisterContentView.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import com.moneymong.moneymong.design_system.theme.Body2
2828
import com.moneymong.moneymong.design_system.theme.Gray06
2929
import com.moneymong.moneymong.design_system.theme.Gray10
3030
import com.moneymong.moneymong.design_system.theme.Heading2
31-
import com.moneymong.moneymong.feature.agency.AgencyType
31+
import com.moneymong.moneymong.feature.agency.search.AgencyType
3232

3333
@Composable
3434
internal fun AgencyResisterContentView(

feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/Agency.kt renamed to feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/Agency.kt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
package com.moneymong.moneymong.feature.agency
1+
package com.moneymong.moneymong.feature.agency.search
22

33
import com.moneymong.moneymong.domain.entity.agency.AgencyGetEntity
4+
import com.moneymong.moneymong.domain.entity.agency.MyAgencyEntity
45
import com.moneymong.moneymong.domain.param.agency.AgencyRegisterParam
56

67
data class Agency(
@@ -22,6 +23,19 @@ fun AgencyGetEntity.toAgency(): Agency {
2223
)
2324
}
2425

26+
fun MyAgencyEntity.toAgency(): Agency {
27+
return Agency(
28+
id = this.id.toLong(),
29+
type = when (this.type) {
30+
"IN_SCHOOL_CLUB" -> AgencyType.CLUB
31+
"STUDENT_COUNCIL" -> AgencyType.COUNCIL
32+
else -> throw IllegalArgumentException("Unknown type: $type")
33+
},
34+
name = this.name,
35+
memberCount = this.headCount
36+
)
37+
}
38+
2539
enum class AgencyType(val text: String) {
2640
CLUB(text = "동아리"),
2741
COUNCIL(text = "학생회");

feature/agency/src/main/java/com/moneymong/moneymong/feature/agency/search/AgencySearchScreen.kt

Lines changed: 71 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.size
1515
import androidx.compose.foundation.lazy.LazyColumn
1616
import androidx.compose.material3.Text
1717
import androidx.compose.runtime.Composable
18+
import androidx.compose.runtime.getValue
1819
import androidx.compose.ui.Alignment
1920
import androidx.compose.ui.Modifier
2021
import androidx.compose.ui.res.painterResource
@@ -25,10 +26,12 @@ import androidx.paging.LoadState
2526
import androidx.paging.compose.LazyPagingItems
2627
import androidx.paging.compose.collectAsLazyPagingItems
2728
import androidx.paging.compose.itemKey
29+
import com.moneymong.moneymong.common.error.MoneyMongError
2830
import com.moneymong.moneymong.design_system.R
2931
import com.moneymong.moneymong.design_system.component.button.MDSFloatingActionButton
3032
import com.moneymong.moneymong.design_system.component.tooltip.MDSToolTip
3133
import com.moneymong.moneymong.design_system.component.tooltip.MDSToolTipPosition
34+
import com.moneymong.moneymong.design_system.error.ErrorDialog
3235
import com.moneymong.moneymong.design_system.error.ErrorItem
3336
import com.moneymong.moneymong.design_system.error.ErrorScreen
3437
import com.moneymong.moneymong.design_system.loading.LoadingItem
@@ -38,9 +41,10 @@ import com.moneymong.moneymong.design_system.theme.Gray01
3841
import com.moneymong.moneymong.design_system.theme.Gray08
3942
import com.moneymong.moneymong.design_system.theme.MMHorizontalSpacing
4043
import com.moneymong.moneymong.design_system.theme.Red03
41-
import com.moneymong.moneymong.feature.agency.Agency
4244
import com.moneymong.moneymong.feature.agency.search.component.AgencySearchTopBar
4345
import com.moneymong.moneymong.feature.agency.search.item.AgencyItem
46+
import org.orbitmvi.orbit.compose.collectAsState
47+
import org.orbitmvi.orbit.compose.collectSideEffect
4448

4549
@Composable
4650
fun AgencySearchScreen(
@@ -49,8 +53,27 @@ fun AgencySearchScreen(
4953
navigateToRegister: () -> Unit,
5054
navigateAgencyJoin: (agencyId: Long) -> Unit
5155
) {
56+
val state by viewModel.collectAsState()
5257
val pagingItems = viewModel.agencies.collectAsLazyPagingItems()
5358

59+
viewModel.collectSideEffect {
60+
when (it) {
61+
is AgencySearchSideEffect.NavigateToRegister -> {
62+
navigateToRegister()
63+
}
64+
65+
is AgencySearchSideEffect.NavigateToAgencyJoin -> {
66+
navigateAgencyJoin(it.agencyId)
67+
}
68+
}
69+
}
70+
71+
if (state.visibleWarningDialog) {
72+
ErrorDialog(message = "이미 가입된 소속입니다") {
73+
viewModel.changeVisibleWarningDialog(false)
74+
}
75+
}
76+
5477
Box(
5578
modifier = modifier
5679
.fillMaxSize()
@@ -65,7 +88,17 @@ fun AgencySearchScreen(
6588
AgencySearchContentView(
6689
modifier = Modifier.weight(1f),
6790
pagingItems = pagingItems,
68-
onClickItem = navigateAgencyJoin
91+
onClickItem = { agencyId ->
92+
if (agencyId in state.joinedAgenciesIds) {
93+
viewModel.changeVisibleWarningDialog(true)
94+
} else {
95+
viewModel.navigateToJoin(agencyId)
96+
}
97+
},
98+
isLoading = state.isLoading,
99+
isError = state.isError,
100+
errorMessage = state.errorMessage,
101+
fetchMyAgencyList = viewModel::fetchMyAgencyList
69102
)
70103
}
71104
Column(
@@ -82,7 +115,7 @@ fun AgencySearchScreen(
82115
Spacer(modifier = Modifier.height(8.dp))
83116
}
84117
MDSFloatingActionButton(
85-
onClick = navigateToRegister,
118+
onClick = viewModel::navigateToRegister,
86119
iconResource = R.drawable.ic_plus_default,
87120
containerColor = Red03
88121
)
@@ -94,19 +127,43 @@ fun AgencySearchScreen(
94127
private fun AgencySearchContentView(
95128
modifier: Modifier = Modifier,
96129
pagingItems: LazyPagingItems<Agency>,
97-
onClickItem: (agencyId: Long) -> Unit
130+
onClickItem: (agencyId: Long) -> Unit,
131+
isLoading: Boolean,
132+
isError: Boolean,
133+
errorMessage: String,
134+
fetchMyAgencyList: () -> Unit
98135
) {
99-
if (pagingItems.itemCount == 0) {
100-
ContentViewWithoutAgencies(
101-
modifier = modifier,
102-
pagingItems = pagingItems
136+
val contentLoading = pagingItems.loadState.refresh is LoadState.Loading || isLoading
137+
val contentError = pagingItems.loadState.refresh is LoadState.Error || isError
138+
val contentErrorMessage = errorMessage.ifEmpty {
139+
(pagingItems.loadState.refresh as? LoadState.Error)?.error?.message
140+
?: MoneyMongError.UnExpectedError.message
141+
}
142+
143+
if (contentLoading) {
144+
LoadingScreen(modifier = modifier.fillMaxSize())
145+
} else if (contentError) {
146+
ErrorScreen(
147+
modifier = modifier.fillMaxSize(),
148+
message = contentErrorMessage,
149+
onRetry = {
150+
pagingItems.retry()
151+
fetchMyAgencyList()
152+
},
103153
)
104154
} else {
105-
ContentViewWithAgencies(
106-
modifier = modifier,
107-
pagingItems = pagingItems,
108-
onClickItem = onClickItem
109-
)
155+
if (pagingItems.itemCount == 0) {
156+
ContentViewWithoutAgencies(
157+
modifier = modifier,
158+
pagingItems = pagingItems
159+
)
160+
} else {
161+
ContentViewWithAgencies(
162+
modifier = modifier,
163+
pagingItems = pagingItems,
164+
onClickItem = onClickItem
165+
)
166+
}
110167
}
111168
}
112169

@@ -151,7 +208,7 @@ private fun ContentViewWithAgencies(
151208
}
152209
}
153210

154-
else -> Unit
211+
is LoadState.NotLoading -> Unit
155212
}
156213
}
157214
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.moneymong.moneymong.feature.agency.search
2+
3+
import com.moneymong.moneymong.common.base.SideEffect
4+
5+
sealed interface AgencySearchSideEffect : SideEffect {
6+
data object NavigateToRegister : AgencySearchSideEffect
7+
data class NavigateToAgencyJoin(val agencyId: Long) : AgencySearchSideEffect
8+
}

0 commit comments

Comments
 (0)