Skip to content

Commit 3914a18

Browse files
authored
Merge pull request #75 from YAPP-Github/BOOK-166-feature/#68
feat: 홈 화면 UI 구현
2 parents 5bbac4b + ac5f247 commit 3914a18

File tree

9 files changed

+551
-22
lines changed

9 files changed

+551
-22
lines changed

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/theme/Color.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ val Blue800 = Color(0xFF1269EC)
6464
val Blue900 = Color(0xFF1F47CD)
6565

6666
val Kakao = Color(0xFFFBD300)
67+
val HomeBg = Color(0xFFF0F9E8)
6768

6869
// Emotion Color
6970
val WarmthTextColor = Color(0xFFE3931B)
@@ -104,6 +105,7 @@ data class ReedColorScheme(
104105

105106
// Border
106107
val borderPrimary: Color = Neutral200,
108+
val borderSecondary: Color = Neutral100,
107109
val borderBrand: Color = Green500,
108110
val borderError: Color = Red500,
109111

feature/home/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,7 @@ ksp {
1717
dependencies {
1818
implementations(
1919
libs.logger,
20+
21+
libs.compose.system.ui.controller,
2022
)
2123
}

feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomePresenter.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ package com.ninecraft.booket.feature.home
22

33
import androidx.compose.runtime.Composable
44
import androidx.compose.runtime.rememberCoroutineScope
5+
import com.ninecraft.booket.feature.screens.BookDetailScreen
56
import com.ninecraft.booket.feature.screens.HomeScreen
67
import com.ninecraft.booket.feature.screens.RecordScreen
78
import com.ninecraft.booket.feature.screens.SearchScreen
9+
import com.ninecraft.booket.feature.screens.SettingsScreen
810
import com.slack.circuit.codegen.annotations.CircuitInject
911
import com.slack.circuit.runtime.Navigator
1012
import com.slack.circuit.runtime.presenter.Presenter
@@ -24,12 +26,21 @@ class HomePresenter @AssistedInject constructor(
2426

2527
fun handleEvent(event: HomeUiEvent) {
2628
when (event) {
27-
is HomeUiEvent.OnButtonClick -> {
29+
is HomeUiEvent.OnSettingsClick -> {
30+
navigator.goTo(SettingsScreen)
31+
}
32+
33+
is HomeUiEvent.OnBookRegisterClick -> {
2834
navigator.goTo(SearchScreen)
2935
}
36+
3037
is HomeUiEvent.OnRecordButtonClick -> {
3138
navigator.goTo(RecordScreen(""))
3239
}
40+
41+
is HomeUiEvent.OnBookDetailClick -> {
42+
navigator.goTo(BookDetailScreen(""))
43+
}
3344
}
3445
}
3546

feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomeUi.kt

Lines changed: 97 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,38 @@
11
package com.ninecraft.booket.feature.home
22

3+
import androidx.compose.foundation.background
34
import androidx.compose.foundation.layout.Arrangement
5+
import androidx.compose.foundation.layout.Box
46
import androidx.compose.foundation.layout.Column
7+
import androidx.compose.foundation.layout.PaddingValues
8+
import androidx.compose.foundation.layout.Row
59
import androidx.compose.foundation.layout.Spacer
610
import androidx.compose.foundation.layout.fillMaxSize
11+
import androidx.compose.foundation.layout.fillMaxWidth
712
import androidx.compose.foundation.layout.height
8-
import androidx.compose.material3.Button
13+
import androidx.compose.foundation.layout.padding
14+
import androidx.compose.foundation.layout.size
15+
import androidx.compose.foundation.pager.HorizontalPager
16+
import androidx.compose.foundation.pager.rememberPagerState
17+
import androidx.compose.foundation.shape.CircleShape
918
import androidx.compose.material3.Text
1019
import androidx.compose.runtime.Composable
11-
import androidx.compose.ui.Alignment
20+
import androidx.compose.runtime.DisposableEffect
1221
import androidx.compose.ui.Modifier
22+
import androidx.compose.ui.draw.clip
23+
import androidx.compose.ui.res.stringResource
1324
import androidx.compose.ui.unit.dp
1425
import com.ninecraft.booket.core.designsystem.DevicePreview
26+
import com.ninecraft.booket.core.designsystem.theme.HomeBg
1527
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
28+
import com.ninecraft.booket.core.designsystem.theme.White
29+
import com.ninecraft.booket.feature.home.component.BookCard
30+
import com.ninecraft.booket.feature.home.component.HomeBanner
31+
import com.ninecraft.booket.feature.home.component.HomeHeader
1632
import com.ninecraft.booket.feature.screens.HomeScreen
1733
import com.slack.circuit.codegen.annotations.CircuitInject
1834
import dagger.hilt.android.components.ActivityRetainedComponent
35+
import tech.thdev.compose.exteions.system.ui.controller.rememberSystemUiController
1936

2037
@CircuitInject(HomeScreen::class, ActivityRetainedComponent::class)
2138
@Composable
@@ -25,38 +42,98 @@ internal fun HomeUi(
2542
) {
2643
Column(
2744
modifier = modifier.fillMaxSize(),
28-
horizontalAlignment = Alignment.CenterHorizontally,
29-
verticalArrangement = Arrangement.Center,
3045
) {
46+
// TODO: Android 15에서 statusBar 색상 적용 안되는 문제 있음. 해결 예정.
47+
val systemUiController = rememberSystemUiController()
48+
49+
DisposableEffect(systemUiController) {
50+
systemUiController.setStatusBarColor(
51+
color = HomeBg,
52+
darkIcons = true,
53+
)
54+
onDispose {
55+
systemUiController.setStatusBarColor(
56+
color = White,
57+
darkIcons = true,
58+
)
59+
}
60+
}
61+
62+
HomeHeader(
63+
onSettingsClick = {
64+
state.eventSink(HomeUiEvent.OnSettingsClick)
65+
},
66+
modifier = modifier,
67+
)
68+
HomeBanner(
69+
onBookRegisterClick = {
70+
state.eventSink(HomeUiEvent.OnBookRegisterClick)
71+
},
72+
modifier = modifier,
73+
)
3174
HomeContent(
3275
state = state,
3376
modifier = modifier,
3477
)
3578
}
3679
}
3780

38-
@Suppress("unused")
3981
@Composable
4082
internal fun HomeContent(
4183
state: HomeUiState,
4284
modifier: Modifier = Modifier,
4385
) {
44-
Text(text = "")
45-
Spacer(modifier = Modifier.height(16.dp))
46-
Button(
47-
onClick = {
48-
state.eventSink(HomeUiEvent.OnButtonClick)
49-
},
50-
) {
51-
Text(text = "도서 검색 이동")
52-
}
53-
Spacer(modifier = Modifier.height(16.dp))
54-
Button(
55-
onClick = {
56-
state.eventSink(HomeUiEvent.OnRecordButtonClick)
57-
},
86+
val dummyBooks = listOf(
87+
Book("여름은 오래 그곳에 남아", "마쓰이에 마사시", "비채", "https://image.aladin.co.kr/product/7492/9/cover200/8934972203_1.jpg", 3),
88+
Book("여름은 오래 그곳에 남아", "마쓰이에 마사시", "비채", "https://image.aladin.co.kr/product/7492/9/cover200/8934972203_1.jpg", 3),
89+
Book("여름은 오래 그곳에 남아", "마쓰이에 마사시", "비채", "https://image.aladin.co.kr/product/7492/9/cover200/8934972203_1.jpg", 3),
90+
)
91+
Column(
92+
modifier = modifier
93+
.fillMaxSize()
94+
.background(ReedTheme.colors.baseSecondary),
5895
) {
59-
Text(text = "독서 기록 작성")
96+
Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing6))
97+
Text(
98+
text = stringResource(R.string.home_content_label_reading_now),
99+
modifier = Modifier.padding(start = ReedTheme.spacing.spacing5),
100+
color = ReedTheme.colors.contentSecondary,
101+
style = ReedTheme.typography.headline2Medium,
102+
)
103+
Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing3))
104+
val pagerState = rememberPagerState(pageCount = { dummyBooks.size })
105+
HorizontalPager(
106+
state = pagerState,
107+
modifier = Modifier.fillMaxWidth(),
108+
contentPadding = PaddingValues(horizontal = ReedTheme.spacing.spacing5),
109+
pageSpacing = ReedTheme.spacing.spacing5,
110+
) { page ->
111+
BookCard(
112+
bookInfo = dummyBooks[page],
113+
onBookDetailClick = {
114+
state.eventSink(HomeUiEvent.OnBookDetailClick)
115+
},
116+
onRecordButtonClick = {
117+
state.eventSink(HomeUiEvent.OnRecordButtonClick)
118+
},
119+
)
120+
}
121+
Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing5))
122+
Row(
123+
modifier = Modifier.fillMaxWidth(),
124+
horizontalArrangement = Arrangement.Center,
125+
) {
126+
repeat(pagerState.pageCount) { iteration ->
127+
val color = if (pagerState.currentPage == iteration) ReedTheme.colors.bgPrimary else ReedTheme.colors.bgSecondaryPressed
128+
Box(
129+
modifier = Modifier
130+
.size(12.dp)
131+
.padding(3.dp)
132+
.clip(CircleShape)
133+
.background(color),
134+
)
135+
}
136+
}
60137
}
61138
}
62139

feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomeUiState.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ data class HomeUiState(
88
) : CircuitUiState
99

1010
sealed interface HomeUiEvent : CircuitUiEvent {
11-
data object OnButtonClick : HomeUiEvent
11+
data object OnSettingsClick : HomeUiEvent
12+
data object OnBookRegisterClick : HomeUiEvent
1213
data object OnRecordButtonClick : HomeUiEvent
14+
data object OnBookDetailClick : HomeUiEvent
1315
}
16+
17+
data class Book(
18+
val title: String = "",
19+
val author: String = "",
20+
val publisher: String = "",
21+
val imageUrl: String = "",
22+
val reviewCount: Int = 0,
23+
)

0 commit comments

Comments
 (0)