@@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.size
1515import androidx.compose.foundation.lazy.LazyColumn
1616import androidx.compose.material3.Text
1717import androidx.compose.runtime.Composable
18+ import androidx.compose.runtime.getValue
1819import androidx.compose.ui.Alignment
1920import androidx.compose.ui.Modifier
2021import androidx.compose.ui.res.painterResource
@@ -25,10 +26,12 @@ import androidx.paging.LoadState
2526import androidx.paging.compose.LazyPagingItems
2627import androidx.paging.compose.collectAsLazyPagingItems
2728import androidx.paging.compose.itemKey
29+ import com.moneymong.moneymong.common.error.MoneyMongError
2830import com.moneymong.moneymong.design_system.R
2931import com.moneymong.moneymong.design_system.component.button.MDSFloatingActionButton
3032import com.moneymong.moneymong.design_system.component.tooltip.MDSToolTip
3133import com.moneymong.moneymong.design_system.component.tooltip.MDSToolTipPosition
34+ import com.moneymong.moneymong.design_system.error.ErrorDialog
3235import com.moneymong.moneymong.design_system.error.ErrorItem
3336import com.moneymong.moneymong.design_system.error.ErrorScreen
3437import com.moneymong.moneymong.design_system.loading.LoadingItem
@@ -38,9 +41,10 @@ import com.moneymong.moneymong.design_system.theme.Gray01
3841import com.moneymong.moneymong.design_system.theme.Gray08
3942import com.moneymong.moneymong.design_system.theme.MMHorizontalSpacing
4043import com.moneymong.moneymong.design_system.theme.Red03
41- import com.moneymong.moneymong.feature.agency.Agency
4244import com.moneymong.moneymong.feature.agency.search.component.AgencySearchTopBar
4345import 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
4650fun 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(
94127private 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}
0 commit comments