Skip to content

Commit fdfcd74

Browse files
authored
Merge pull request #1502 from BCSDLab/feature/1496-home-connect-api
[Feature] 홈화면 API 연결
2 parents d9802ba + d7247e2 commit fdfcd74

6 files changed

Lines changed: 180 additions & 7 deletions

File tree

core/navigation/src/main/java/in/koreatech/koin/core/navigation/Navigator.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package `in`.koreatech.koin.core.navigation
33
import android.content.Context
44
import android.content.Intent
55

6+
@Suppress("TooManyFunctions")
67
interface Navigator {
78
fun navigateToSplash(
89
context: Context,
@@ -30,6 +31,26 @@ interface Navigator {
3031
context: Context
3132
): Intent
3233

34+
fun navigateToDining(
35+
context: Context
36+
): Intent
37+
38+
fun navigateToBusTimeTable(
39+
context: Context
40+
): Intent
41+
42+
fun navigateToBusSearch(
43+
context: Context
44+
): Intent
45+
46+
fun navigateToUnibus(
47+
context: Context
48+
): Intent
49+
50+
fun navigateToCallvan(
51+
context: Context
52+
): Intent
53+
3354
fun navigateToChatRoom(
3455
context: Context
3556
): Intent

feature/home/src/main/java/in/koreatech/koin/feature/home/HomeScreen.kt

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,17 @@ import androidx.compose.ui.Modifier
2525
import androidx.compose.ui.draw.clip
2626
import androidx.compose.ui.graphics.Color
2727
import androidx.compose.ui.graphics.vector.ImageVector
28+
import androidx.compose.ui.platform.LocalContext
2829
import androidx.compose.ui.res.stringResource
2930
import androidx.compose.ui.res.vectorResource
3031
import androidx.compose.ui.text.buildAnnotatedString
3132
import androidx.compose.ui.text.withStyle
3233
import androidx.compose.ui.unit.dp
3334
import androidx.compose.ui.unit.sp
3435
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
36+
import `in`.koreatech.koin.core.designsystem.noRippleClickable
3537
import `in`.koreatech.koin.core.designsystem.theme.RebrandKoinTheme
38+
import `in`.koreatech.koin.core.navigation.utils.rememberNavigator
3639
import `in`.koreatech.koin.feature.home.component.DiningPager
3740
import `in`.koreatech.koin.feature.home.component.DiningPagerData
3841
import `in`.koreatech.koin.feature.home.component.HomeChip
@@ -149,6 +152,9 @@ private fun DiningSection(
149152
diningData: ImmutableList<DiningPagerData>,
150153
modifier: Modifier = Modifier
151154
) {
155+
val navigator = rememberNavigator()
156+
val context = LocalContext.current
157+
152158
HomeSection(
153159
modifier = modifier.fillMaxWidth(),
154160
text = {
@@ -159,6 +165,9 @@ private fun DiningSection(
159165
},
160166
more = {
161167
Row(
168+
modifier = Modifier.noRippleClickable {
169+
navigator.navigateToDining(context).let(context::startActivity)
170+
},
162171
verticalAlignment = Alignment.CenterVertically
163172
) {
164173
Text(
@@ -173,7 +182,9 @@ private fun DiningSection(
173182
}
174183
}
175184
) {
176-
DiningPager(data = diningData)
185+
DiningPager(data = diningData) {
186+
navigator.navigateToDining(context).let(context::startActivity)
187+
}
177188
}
178189
}
179190

@@ -182,6 +193,9 @@ private fun BusSection(
182193
callVanRecruitCount: Int,
183194
modifier: Modifier = Modifier
184195
) {
196+
val navigator = rememberNavigator()
197+
val context = LocalContext.current
198+
185199
HomeSection(
186200
modifier = modifier.fillMaxWidth(),
187201
text = {
@@ -191,7 +205,9 @@ private fun BusSection(
191205
)
192206
},
193207
more = {
194-
ShuttleTicketCard()
208+
ShuttleTicketCard {
209+
navigator.navigateToUnibus(context).let(context::startActivity)
210+
}
195211
}
196212
) {
197213
Column(
@@ -243,6 +259,9 @@ private fun BusSection(
243259
style = RebrandKoinTheme.typography.medium13
244260
)
245261
}
262+
},
263+
onClick = {
264+
navigator.navigateToCallvan(context).let(context::startActivity)
246265
}
247266
)
248267
}
@@ -279,6 +298,9 @@ private fun BusSection(
279298
color = Color(0xFFB611F5),
280299
style = RebrandKoinTheme.typography.regular10
281300
)
301+
},
302+
onClick = {
303+
navigator.navigateToBusTimeTable(context).let(context::startActivity)
282304
}
283305
)
284306

@@ -311,6 +333,9 @@ private fun BusSection(
311333
color = Color(0xFFB611F5),
312334
style = RebrandKoinTheme.typography.regular10
313335
)
336+
},
337+
onClick = {
338+
navigator.navigateToBusSearch(context).let(context::startActivity)
314339
}
315340
)
316341
}
@@ -324,6 +349,8 @@ private fun ShopSection(
324349
shopCount: Int,
325350
modifier: Modifier = Modifier
326351
) {
352+
val navigator = rememberNavigator()
353+
val context = LocalContext.current
327354
val shopOpen = stringResource(R.string.shop_open)
328355
val shopTotal = stringResource(R.string.shop_total, shopCount)
329356

@@ -337,6 +364,9 @@ private fun ShopSection(
337364
},
338365
more = {
339366
Row(
367+
modifier = Modifier.noRippleClickable {
368+
navigator.navigateToStore(context).let(context::startActivity)
369+
},
340370
verticalAlignment = Alignment.CenterVertically
341371
) {
342372
Text(
@@ -384,6 +414,9 @@ private fun ShopSection(
384414
style = RebrandKoinTheme.typography.regular13,
385415
color = Color(0xFFA8A8A8)
386416
)
417+
},
418+
onClick = {
419+
navigator.navigateToStore(context).let(context::startActivity)
387420
}
388421
)
389422
}

feature/home/src/main/java/in/koreatech/koin/feature/home/HomeViewModel.kt

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,72 @@ package `in`.koreatech.koin.feature.home
22

33
import androidx.lifecycle.ViewModel
44
import dagger.hilt.android.lifecycle.HiltViewModel
5+
import `in`.koreatech.koin.domain.usecase.callvan.GetRecruitingCallvanCountUseCase
6+
import `in`.koreatech.koin.domain.usecase.dining.GetDiningWithOperationTimeUseCase
7+
import `in`.koreatech.koin.domain.usecase.store.GetStoreCountUseCase
8+
import `in`.koreatech.koin.domain.usecase.store.GetStoreEventCountUseCase
9+
import `in`.koreatech.koin.domain.util.DiningUtil
10+
import `in`.koreatech.koin.domain.util.TimeUtil
11+
import `in`.koreatech.koin.feature.home.mapper.toDiningPagerDataList
512
import javax.inject.Inject
13+
import kotlinx.collections.immutable.toImmutableList
614
import org.orbitmvi.orbit.ContainerHost
15+
import org.orbitmvi.orbit.syntax.simple.intent
16+
import org.orbitmvi.orbit.syntax.simple.reduce
717
import org.orbitmvi.orbit.viewmodel.container
18+
import timber.log.Timber
819

920
@HiltViewModel
10-
class HomeViewModel @Inject constructor() : ViewModel(), ContainerHost<HomeState, HomeSideEffect> {
11-
override val container = container<HomeState, HomeSideEffect>(HomeState())
21+
class HomeViewModel @Inject constructor(
22+
private val getDiningWithOperationTimeUseCase: GetDiningWithOperationTimeUseCase,
23+
private val getStoreCountUseCase: GetStoreCountUseCase,
24+
private val getStoreEventCountUseCase: GetStoreEventCountUseCase,
25+
private val getRecruitingCallvanCountUseCase: GetRecruitingCallvanCountUseCase
26+
) : ViewModel(), ContainerHost<HomeState, HomeSideEffect> {
27+
override val container = container<HomeState, HomeSideEffect>(HomeState()) {
28+
getDining()
29+
getStoreCount()
30+
getStoreEventCount()
31+
getRecruitingCallvanCount()
32+
}
33+
34+
private fun getDining() = intent {
35+
getDiningWithOperationTimeUseCase(TimeUtil.dateFormatToYYMMDD(DiningUtil.getCurrentDate())).onSuccess { data ->
36+
reduce {
37+
state.copy(diningData = data.filter { it.type == DiningUtil.getCurrentType().typeEnglish }.map { it.toDiningPagerDataList() }.toImmutableList())
38+
}
39+
}.onFailure {
40+
Timber.e(it)
41+
}
42+
}
43+
44+
private fun getStoreCount() = intent {
45+
getStoreCountUseCase().onSuccess {
46+
reduce {
47+
state.copy(openShopCount = it.openCount, shopCount = it.totalCount)
48+
}
49+
}.onFailure {
50+
Timber.e(it)
51+
}
52+
}
53+
54+
private fun getStoreEventCount() = intent {
55+
getStoreEventCountUseCase().onSuccess {
56+
reduce {
57+
state.copy(shopEventForKoin = it)
58+
}
59+
}.onFailure {
60+
Timber.e(it)
61+
}
62+
}
63+
64+
private fun getRecruitingCallvanCount() = intent {
65+
getRecruitingCallvanCountUseCase().onSuccess {
66+
reduce {
67+
state.copy(callVanRecruitCount = it)
68+
}
69+
}.onFailure {
70+
Timber.e(it)
71+
}
72+
}
1273
}

feature/home/src/main/java/in/koreatech/koin/feature/home/component/DiningPager.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import androidx.compose.foundation.shape.CircleShape
1717
import androidx.compose.foundation.shape.RoundedCornerShape
1818
import androidx.compose.material3.Text
1919
import androidx.compose.runtime.Composable
20+
import androidx.compose.runtime.remember
2021
import androidx.compose.runtime.rememberCoroutineScope
2122
import androidx.compose.ui.Alignment
2223
import androidx.compose.ui.Modifier
@@ -38,7 +39,8 @@ import kotlinx.coroutines.launch
3839
@Composable
3940
fun DiningPager(
4041
data: ImmutableList<DiningPagerData>,
41-
modifier: Modifier = Modifier
42+
modifier: Modifier = Modifier,
43+
onCardClick: (data: DiningPagerData) -> Unit = { }
4244
) {
4345
val pagerState = rememberPagerState(pageCount = { data.size })
4446
val coroutineScope = rememberCoroutineScope()
@@ -54,7 +56,8 @@ fun DiningPager(
5456
modifier = Modifier.fillMaxWidth()
5557
) { page ->
5658
DiningPagerContent(
57-
data = data[page]
59+
data = data[page],
60+
onClick = onCardClick
5861
)
5962
}
6063

@@ -84,13 +87,17 @@ fun DiningPager(
8487
@Composable
8588
private fun DiningPagerContent(
8689
data: DiningPagerData,
87-
modifier: Modifier = Modifier
90+
modifier: Modifier = Modifier,
91+
onClick: (data: DiningPagerData) -> Unit = { }
8892
) {
93+
val click = remember(data) { { onClick(data) } }
94+
8995
Column(
9096
modifier = modifier
9197
.border(0.5.dp, Color(0xFFE6E6E6), RoundedCornerShape(24.dp))
9298
.clip(RoundedCornerShape(24.dp))
9399
.background(color = Color(0xFFFFFFFF))
100+
.clickable(onClick = click)
94101
.padding(vertical = 20.dp, horizontal = 24.dp),
95102
verticalArrangement = Arrangement.spacedBy(12.dp)
96103
) {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package `in`.koreatech.koin.feature.home.mapper
2+
3+
import `in`.koreatech.koin.domain.model.dining.DiningWithOperationTime
4+
import `in`.koreatech.koin.feature.home.component.DiningPagerData
5+
import kotlinx.collections.immutable.toImmutableList
6+
7+
fun DiningWithOperationTime.toDiningPagerDataList(): DiningPagerData = DiningPagerData(
8+
place = place,
9+
startTime = startTime,
10+
endTime = endTime,
11+
price = priceCard.toIntOrNull() ?: priceCash.toIntOrNull() ?: 0,
12+
kcal = kcal.toIntOrNull() ?: 0,
13+
menu = menu.toImmutableList()
14+
)

koin/src/main/java/in/koreatech/koin/navigation/NavigatorImpl.kt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,26 @@ package `in`.koreatech.koin.navigation
22

33
import android.content.Context
44
import android.content.Intent
5+
import `in`.koreatech.bus.BusSearchActivity
6+
import `in`.koreatech.bus.BusTimetableActivity
57
import `in`.koreatech.koin.core.navigation.Navigator
68
import `in`.koreatech.koin.core.navigation.utils.EXTRA_POST_ID
79
import `in`.koreatech.koin.core.navigation.utils.buildDeepLinkIntent
810
import `in`.koreatech.koin.core.navigation.utils.buildIntent
911
import `in`.koreatech.koin.core.navigation.utils.isValidDeepLink
12+
import `in`.koreatech.koin.feature.callvan.CallvanActivity
1013
import `in`.koreatech.koin.feature.chat.ui.groupchat.GroupChatActivity
1114
import `in`.koreatech.koin.feature.chat.ui.room.ChatRoomActivity
15+
import `in`.koreatech.koin.feature.dining.ui.DiningActivity
1216
import `in`.koreatech.koin.feature.store.StoreActivity
1317
import `in`.koreatech.koin.feature.user.ui.signin.SignInActivity
1418
import `in`.koreatech.koin.ui.main.activity.MainActivity
1519
import `in`.koreatech.koin.ui.notification.NotificationActivity
1620
import `in`.koreatech.koin.ui.splash.SplashActivity
21+
import `in`.koreatech.koin.ui.unibus.UnibusActivity
1722
import javax.inject.Inject
1823

24+
@Suppress("TooManyFunctions")
1925
class NavigatorImpl @Inject constructor() : Navigator {
2026
override fun navigateToSplash(
2127
context: Context,
@@ -64,6 +70,37 @@ class NavigatorImpl @Inject constructor() : Navigator {
6470
}
6571
}
6672

73+
override fun navigateToDining(context: Context): Intent {
74+
return context.buildIntent(DiningActivity::class.java).apply {
75+
putExtra("url", "https://koreatech.unibus.kr/")
76+
flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
77+
}
78+
}
79+
80+
override fun navigateToBusTimeTable(context: Context): Intent {
81+
return context.buildIntent(BusTimetableActivity::class.java).apply {
82+
flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
83+
}
84+
}
85+
86+
override fun navigateToBusSearch(context: Context): Intent {
87+
return context.buildIntent(BusSearchActivity::class.java).apply {
88+
flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
89+
}
90+
}
91+
92+
override fun navigateToUnibus(context: Context): Intent {
93+
return context.buildIntent(UnibusActivity::class.java).apply {
94+
flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
95+
}
96+
}
97+
98+
override fun navigateToCallvan(context: Context): Intent {
99+
return context.buildIntent(CallvanActivity::class.java).apply {
100+
flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
101+
}
102+
}
103+
67104
override fun navigateToChatRoom(context: Context): Intent {
68105
return context.buildIntent(ChatRoomActivity::class.java).apply {
69106
flags = Intent.FLAG_ACTIVITY_CLEAR_TOP

0 commit comments

Comments
 (0)