Skip to content

Commit 082b2ca

Browse files
committed
[BOOK-161] refactor: Search에 공통 컴포넌트 적용
1 parent b5eb72e commit 082b2ca

File tree

8 files changed

+97
-218
lines changed

8 files changed

+97
-218
lines changed

core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/InfinityLazyColumn.kt

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,42 @@
11
package com.ninecraft.booket.core.ui.component
22

33
import android.annotation.SuppressLint
4+
import androidx.compose.foundation.background
45
import androidx.compose.foundation.gestures.FlingBehavior
56
import androidx.compose.foundation.gestures.ScrollableDefaults
67
import androidx.compose.foundation.layout.Arrangement
8+
import androidx.compose.foundation.layout.Box
9+
import androidx.compose.foundation.layout.Column
710
import androidx.compose.foundation.layout.PaddingValues
11+
import androidx.compose.foundation.layout.Row
12+
import androidx.compose.foundation.layout.Spacer
13+
import androidx.compose.foundation.layout.fillMaxWidth
14+
import androidx.compose.foundation.layout.height
15+
import androidx.compose.foundation.layout.padding
16+
import androidx.compose.foundation.layout.width
817
import androidx.compose.foundation.lazy.LazyColumn
918
import androidx.compose.foundation.lazy.LazyListScope
1019
import androidx.compose.foundation.lazy.LazyListState
20+
import androidx.compose.foundation.lazy.items
1121
import androidx.compose.foundation.lazy.rememberLazyListState
22+
import androidx.compose.foundation.shape.RoundedCornerShape
23+
import androidx.compose.material3.Surface
24+
import androidx.compose.material3.Text
1225
import androidx.compose.runtime.Composable
1326
import androidx.compose.runtime.LaunchedEffect
1427
import androidx.compose.runtime.derivedStateOf
1528
import androidx.compose.runtime.getValue
29+
import androidx.compose.runtime.mutableIntStateOf
30+
import androidx.compose.runtime.mutableStateListOf
1631
import androidx.compose.runtime.remember
32+
import androidx.compose.runtime.setValue
1733
import androidx.compose.ui.Alignment
1834
import androidx.compose.ui.Modifier
35+
import androidx.compose.ui.tooling.preview.Preview
1936
import androidx.compose.ui.unit.dp
37+
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
2038

39+
// 기기에서 평균적으로 한 화면에 보이는 아이템 개수
2140
private const val LIMIT_COUNT = 6
2241

2342
@Composable
@@ -81,3 +100,67 @@ private fun LazyListState.reachedBottom(
81100
val lastVisibleItem = layoutInfo.visibleItemsInfo.lastOrNull()
82101
return (triggerOnEnd && lastVisibleItem?.index == layoutInfo.totalItemsCount - 1) || lastVisibleItem?.index != 0 && lastVisibleItem?.index == layoutInfo.totalItemsCount - (limitCount + 1)
83102
}
103+
104+
@Preview
105+
@Composable
106+
private fun InfinityLazyColumnPreview() {
107+
ReedTheme {
108+
Surface {
109+
var page by remember { mutableIntStateOf(1) }
110+
val contents = remember { mutableStateListOf(*Array(10) { it }) }
111+
112+
Column {
113+
Text(
114+
modifier = Modifier.padding(16.dp),
115+
text = "Loaded Page: $page",
116+
style = ReedTheme.typography.label1Medium,
117+
)
118+
InfinityLazyColumn(
119+
loadMore = {
120+
contents.addAll(page * 10 until (page + 1) * 10)
121+
page++
122+
},
123+
contentPadding = PaddingValues(vertical = 16.dp, horizontal = 8.dp),
124+
verticalArrangement = Arrangement.spacedBy(8.dp),
125+
content = {
126+
items(contents, key = { it }) {
127+
Row(
128+
modifier = Modifier
129+
.fillMaxWidth()
130+
.padding(
131+
horizontal = ReedTheme.spacing.spacing5,
132+
vertical = ReedTheme.spacing.spacing4
133+
),
134+
verticalAlignment = Alignment.CenterVertically,
135+
) {
136+
Box(
137+
modifier = Modifier
138+
.width(68.dp)
139+
.height(100.dp)
140+
.background(
141+
color = ReedTheme.colors.contentTertiary,
142+
shape = RoundedCornerShape(ReedTheme.radius.sm),
143+
),
144+
)
145+
Spacer(Modifier.width(ReedTheme.spacing.spacing4))
146+
Column {
147+
Text(
148+
text = "Title",
149+
color = ReedTheme.colors.contentPrimary,
150+
style = ReedTheme.typography.body1SemiBold,
151+
)
152+
Spacer(Modifier.height(ReedTheme.spacing.spacing1))
153+
Text(
154+
text = "Description",
155+
color = ReedTheme.colors.contentTertiary,
156+
style = ReedTheme.typography.label1Medium,
157+
)
158+
}
159+
}
160+
}
161+
},
162+
)
163+
}
164+
}
165+
}
166+
}

core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/LoadStateFooter.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ import androidx.compose.material3.Text
1212
import androidx.compose.runtime.Composable
1313
import androidx.compose.ui.Alignment
1414
import androidx.compose.ui.Modifier
15+
import androidx.compose.ui.res.stringResource
1516
import androidx.compose.ui.unit.dp
1617
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
18+
import com.ninecraft.booket.core.ui.R
1719

1820
@Composable
1921
fun LoadStateFooter(
@@ -46,14 +48,14 @@ fun LoadStateFooter(
4648
style = ReedTheme.typography.body2Regular,
4749
)
4850
Button(onClick = onRetryClick) {
49-
Text(text = "다시 시도")
51+
Text(text = stringResource(R.string.retry))
5052
}
5153
}
5254
}
5355

5456
is FooterState.End -> {
5557
Text(
56-
text = "더 이상 결과가 없습니다",
58+
text = stringResource(R.string.no_more_result),
5759
color = ReedTheme.colors.contentSecondary,
5860
style = ReedTheme.typography.body2Regular,
5961
)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<string name="no_more_result">더 이상 결과가 없습니다</string>
4+
<string name="retry">다시 시도</string>
5+
</resources>

feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchPresenter.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.ninecraft.booket.core.common.utils.handleException
1212
import com.ninecraft.booket.core.data.api.repository.BookRepository
1313
import com.ninecraft.booket.core.model.BookSearchModel
1414
import com.ninecraft.booket.core.model.BookSummaryModel
15+
import com.ninecraft.booket.core.ui.component.FooterState
1516
import com.ninecraft.booket.feature.screens.LoginScreen
1617
import com.ninecraft.booket.feature.screens.SearchScreen
1718
import com.orhanobut.logger.Logger

feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUi.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ import com.ninecraft.booket.core.designsystem.component.ReedTextField
2727
import com.ninecraft.booket.core.designsystem.component.appbar.ReedBackTopAppBar
2828
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
2929
import com.ninecraft.booket.core.designsystem.theme.White
30+
import com.ninecraft.booket.core.ui.component.InfinityLazyColumn
31+
import com.ninecraft.booket.core.ui.component.LoadStateFooter
3032
import com.ninecraft.booket.core.ui.component.ReedFullScreen
33+
import com.ninecraft.booket.feature.screens.SearchScreen
3134
import com.ninecraft.booket.feature.search.component.BookItem
3235
import com.ninecraft.booket.feature.search.component.BookRegisterBottomSheet
3336
import com.ninecraft.booket.feature.search.component.BookRegisterSuccessBottomSheet
34-
import com.ninecraft.booket.feature.search.component.InfinityLazyColumn
35-
import com.ninecraft.booket.feature.search.component.LoadStateFooter
36-
import com.ninecraft.booket.feature.screens.SearchScreen
3737
import com.slack.circuit.codegen.annotations.CircuitInject
3838
import dagger.hilt.android.components.ActivityRetainedComponent
3939
import kotlinx.collections.immutable.toImmutableList

feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/SearchUiState.kt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.ninecraft.booket.feature.search
33
import androidx.compose.foundation.text.input.TextFieldState
44
import com.ninecraft.booket.core.model.BookSearchModel
55
import com.ninecraft.booket.core.model.BookSummaryModel
6+
import com.ninecraft.booket.core.ui.component.FooterState
67
import com.slack.circuit.runtime.CircuitUiEvent
78
import com.slack.circuit.runtime.CircuitUiState
89
import kotlinx.collections.immutable.ImmutableList
@@ -16,13 +17,6 @@ sealed interface UiState {
1617
data class Error(val message: String) : UiState
1718
}
1819

19-
sealed interface FooterState {
20-
data object Idle : FooterState
21-
data object Loading : FooterState
22-
data object End : FooterState
23-
data class Error(val message: String) : FooterState
24-
}
25-
2620
data class SearchUiState(
2721
val uiState: UiState = UiState.Idle,
2822
val footerState: FooterState = FooterState.Idle,

feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/component/InfiniteLazyColumn.kt

Lines changed: 0 additions & 136 deletions
This file was deleted.

feature/search/src/main/kotlin/com/ninecraft/booket/feature/search/component/LoadStateFooter.kt

Lines changed: 0 additions & 70 deletions
This file was deleted.

0 commit comments

Comments
 (0)