11package com.ninecraft.booket.feature.detail.book
22
3+ import androidx.compose.foundation.clickable
4+ import androidx.compose.foundation.layout.Box
35import androidx.compose.foundation.layout.Column
46import androidx.compose.foundation.layout.Row
57import androidx.compose.foundation.layout.Spacer
@@ -10,16 +12,20 @@ import androidx.compose.foundation.layout.padding
1012import androidx.compose.foundation.layout.size
1113import androidx.compose.foundation.layout.width
1214import androidx.compose.foundation.layout.widthIn
13- import androidx.compose.foundation.rememberScrollState
14- import androidx.compose.foundation.verticalScroll
15+ import androidx.compose.foundation.lazy.LazyListState
16+ import androidx.compose.foundation.lazy.rememberLazyListState
1517import androidx.compose.material3.ExperimentalMaterial3Api
1618import androidx.compose.material3.Icon
19+ import androidx.compose.material3.Text
1720import androidx.compose.material3.rememberModalBottomSheetState
1821import androidx.compose.runtime.Composable
1922import androidx.compose.runtime.rememberCoroutineScope
23+ import androidx.compose.ui.Alignment
2024import androidx.compose.ui.Modifier
2125import androidx.compose.ui.graphics.vector.ImageVector
26+ import androidx.compose.ui.res.stringResource
2227import androidx.compose.ui.res.vectorResource
28+ import androidx.compose.ui.text.style.TextAlign
2329import androidx.compose.ui.unit.dp
2430import com.ninecraft.booket.core.common.constants.BookStatus
2531import com.ninecraft.booket.core.designsystem.ComponentPreview
@@ -28,13 +34,16 @@ import com.ninecraft.booket.core.designsystem.component.button.ReedButton
2834import com.ninecraft.booket.core.designsystem.component.button.ReedButtonColorStyle
2935import com.ninecraft.booket.core.designsystem.component.button.largeButtonStyle
3036import com.ninecraft.booket.core.designsystem.theme.ReedTheme
37+ import com.ninecraft.booket.core.ui.component.InfinityLazyColumn
3138import com.ninecraft.booket.core.ui.component.ReedBackTopAppBar
3239import com.ninecraft.booket.core.ui.component.ReedFullScreen
40+ import com.ninecraft.booket.feature.detail.R
3341import com.ninecraft.booket.feature.detail.book.component.BookItem
3442import com.ninecraft.booket.feature.detail.book.component.BookUpdateBottomSheet
3543import com.ninecraft.booket.feature.detail.book.component.CollectedSeeds
44+ import com.ninecraft.booket.feature.detail.book.component.RecordItem
3645import com.ninecraft.booket.feature.detail.book.component.RecordSortBottomSheet
37- import com.ninecraft.booket.feature.detail.book.component.RecordsCollection
46+ import com.ninecraft.booket.feature.detail.book.component.RecordsCollectionHeader
3847import com.ninecraft.booket.feature.screens.BookDetailScreen
3948import com.slack.circuit.codegen.annotations.CircuitInject
4049import dagger.hilt.android.components.ActivityRetainedComponent
@@ -116,57 +125,115 @@ internal fun BookDetailUi(
116125internal fun BookDetailContent (
117126 state : BookDetailUiState ,
118127 modifier : Modifier = Modifier ,
128+ lazyListState : LazyListState = rememberLazyListState(),
119129) {
120- Column (
121- modifier = modifier
122- .fillMaxSize()
123- .verticalScroll(rememberScrollState()),
130+ InfinityLazyColumn (
131+ modifier = modifier.fillMaxSize(),
132+ state = lazyListState,
133+ loadMore = {
134+ // TODO: 페이지네이션 로직 추가
135+ },
124136 ) {
125- BookItem (bookDetail = state.bookDetail)
126- Spacer (Modifier .height(ReedTheme .spacing.spacing3))
127- Spacer (Modifier .height(ReedTheme .spacing.spacing4))
128- Row (
129- modifier = Modifier
130- .fillMaxWidth()
131- .padding(horizontal = ReedTheme .spacing.spacing5),
132- ) {
133- ReedButton (
134- onClick = {
135- state.eventSink(BookDetailUiEvent .OnBookStatusButtonClick )
136- },
137- text = " 읽는 중" ,
138- sizeStyle = largeButtonStyle,
139- colorStyle = ReedButtonColorStyle .SECONDARY ,
140- modifier = Modifier .widthIn(min = 98 .dp),
141- trailingIcon = {
142- Icon (
143- imageVector = ImageVector .vectorResource(designR.drawable.ic_chevron_down),
144- contentDescription = " Dropdown Icon" ,
145- modifier = Modifier .size(22 .dp),
146- tint = ReedTheme .colors.contentPrimary,
137+ item {
138+ Column {
139+ BookItem (bookDetail = state.bookDetail)
140+ Spacer (Modifier .height(28 .dp))
141+ Row (
142+ modifier = Modifier
143+ .fillMaxWidth()
144+ .padding(horizontal = ReedTheme .spacing.spacing5),
145+ ) {
146+ ReedButton (
147+ onClick = {
148+ state.eventSink(BookDetailUiEvent .OnBookStatusButtonClick )
149+ },
150+ text = " 읽는 중" ,
151+ sizeStyle = largeButtonStyle,
152+ colorStyle = ReedButtonColorStyle .SECONDARY ,
153+ modifier = Modifier .widthIn(min = 98 .dp),
154+ trailingIcon = {
155+ Icon (
156+ imageVector = ImageVector .vectorResource(designR.drawable.ic_chevron_down),
157+ contentDescription = " Dropdown Icon" ,
158+ modifier = Modifier .size(22 .dp),
159+ tint = ReedTheme .colors.contentPrimary,
160+ )
161+ },
147162 )
148- },
149- )
150- Spacer (modifier = Modifier .width(ReedTheme .spacing.spacing2))
151- ReedButton (
152- onClick = {
153- state.eventSink(BookDetailUiEvent .OnRegisterRecordButtonClick )
154- },
155- text = " 독서 기록 추가" ,
156- sizeStyle = largeButtonStyle,
157- colorStyle = ReedButtonColorStyle .PRIMARY ,
158- modifier = Modifier .weight(1f ),
159- )
163+ Spacer (modifier = Modifier .width(ReedTheme .spacing.spacing2))
164+ ReedButton (
165+ onClick = {
166+ state.eventSink(BookDetailUiEvent .OnRegisterRecordButtonClick )
167+ },
168+ text = stringResource(R .string.register_book_record),
169+ sizeStyle = largeButtonStyle,
170+ colorStyle = ReedButtonColorStyle .PRIMARY ,
171+ modifier = Modifier .weight(1f ),
172+ )
173+ }
174+ }
175+ }
176+
177+ item {
178+ if (state.recordCollections.isEmpty()) {
179+ Spacer (modifier = Modifier .height(ReedTheme .spacing.spacing10))
180+ } else {
181+ CollectedSeeds (seedsStats = state.seedsStats)
182+ }
183+
184+ ReedDivider ()
185+ }
186+
187+ item {
188+ Column (
189+ modifier = Modifier .padding(horizontal = ReedTheme .spacing.spacing5)
190+ ) {
191+ Spacer (modifier = Modifier .height(ReedTheme .spacing.spacing6))
192+ RecordsCollectionHeader (state = state)
193+ Spacer (modifier = Modifier .height(ReedTheme .spacing.spacing1))
194+ }
160195 }
161196
162197 if (state.recordCollections.isEmpty()) {
163- Spacer (modifier = Modifier .height(ReedTheme .spacing.spacing10))
198+ item {
199+ Box (
200+ modifier = Modifier
201+ .fillMaxWidth()
202+ .height(324 .dp)
203+ .padding(horizontal = ReedTheme .spacing.spacing5),
204+ contentAlignment = Alignment .Center ,
205+ ) {
206+ Text (
207+ text = stringResource(R .string.records_collection_empty),
208+ color = ReedTheme .colors.contentSecondary,
209+ textAlign = TextAlign .Center ,
210+ style = ReedTheme .typography.body1Medium,
211+ )
212+ }
213+ }
164214 } else {
165- CollectedSeeds (seedsStats = state.seedsStats)
215+ items(
216+ count = state.recordCollections.size,
217+ key = { index -> state.recordCollections[index].id },
218+ ) { index ->
219+ val record = state.recordCollections[index]
220+ RecordItem (
221+ quote = record.quote,
222+ emotionTags = record.emotionTags.toImmutableList(),
223+ pageNumber = record.pageNumber,
224+ createdAt = record.createdAt,
225+ modifier = Modifier
226+ .padding(
227+ start = ReedTheme .spacing.spacing5,
228+ end = ReedTheme .spacing.spacing5,
229+ bottom = ReedTheme .spacing.spacing3,
230+ )
231+ .clickable {
232+ state.eventSink(BookDetailUiEvent .OnRecordItemClick (record.id))
233+ },
234+ )
235+ }
166236 }
167-
168- ReedDivider ()
169- RecordsCollection (state = state)
170237 }
171238}
172239
0 commit comments