Skip to content

Commit 46ef824

Browse files
committed
[BOOK-212] refactor: 부스 상세 화면 UI 구조 개편
무한 스크롤 가능하도록 전체 뷰를 InfinityLazyColumn으로 감쌈, 사용하지 않는 컴포넌트 제거
1 parent aa7ad98 commit 46ef824

File tree

4 files changed

+114
-181
lines changed

4 files changed

+114
-181
lines changed

feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/BookDetailUi.kt

Lines changed: 113 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.ninecraft.booket.feature.detail.book
22

3+
import androidx.compose.foundation.clickable
4+
import androidx.compose.foundation.layout.Box
35
import androidx.compose.foundation.layout.Column
46
import androidx.compose.foundation.layout.Row
57
import androidx.compose.foundation.layout.Spacer
@@ -10,16 +12,20 @@ import androidx.compose.foundation.layout.padding
1012
import androidx.compose.foundation.layout.size
1113
import androidx.compose.foundation.layout.width
1214
import 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
1517
import androidx.compose.material3.ExperimentalMaterial3Api
1618
import androidx.compose.material3.Icon
19+
import androidx.compose.material3.Text
1720
import androidx.compose.material3.rememberModalBottomSheetState
1821
import androidx.compose.runtime.Composable
1922
import androidx.compose.runtime.rememberCoroutineScope
23+
import androidx.compose.ui.Alignment
2024
import androidx.compose.ui.Modifier
2125
import androidx.compose.ui.graphics.vector.ImageVector
26+
import androidx.compose.ui.res.stringResource
2227
import androidx.compose.ui.res.vectorResource
28+
import androidx.compose.ui.text.style.TextAlign
2329
import androidx.compose.ui.unit.dp
2430
import com.ninecraft.booket.core.common.constants.BookStatus
2531
import com.ninecraft.booket.core.designsystem.ComponentPreview
@@ -28,13 +34,16 @@ import com.ninecraft.booket.core.designsystem.component.button.ReedButton
2834
import com.ninecraft.booket.core.designsystem.component.button.ReedButtonColorStyle
2935
import com.ninecraft.booket.core.designsystem.component.button.largeButtonStyle
3036
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
37+
import com.ninecraft.booket.core.ui.component.InfinityLazyColumn
3138
import com.ninecraft.booket.core.ui.component.ReedBackTopAppBar
3239
import com.ninecraft.booket.core.ui.component.ReedFullScreen
40+
import com.ninecraft.booket.feature.detail.R
3341
import com.ninecraft.booket.feature.detail.book.component.BookItem
3442
import com.ninecraft.booket.feature.detail.book.component.BookUpdateBottomSheet
3543
import com.ninecraft.booket.feature.detail.book.component.CollectedSeeds
44+
import com.ninecraft.booket.feature.detail.book.component.RecordItem
3645
import 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
3847
import com.ninecraft.booket.feature.screens.BookDetailScreen
3948
import com.slack.circuit.codegen.annotations.CircuitInject
4049
import dagger.hilt.android.components.ActivityRetainedComponent
@@ -116,57 +125,115 @@ internal fun BookDetailUi(
116125
internal 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

feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/BookDetailUiState.kt

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@ import androidx.compose.runtime.Immutable
44
import com.ninecraft.booket.core.common.R
55
import com.ninecraft.booket.core.common.constants.BookStatus
66
import com.ninecraft.booket.core.model.BookDetailModel
7-
import com.ninecraft.booket.core.model.Emotion
87
import com.ninecraft.booket.core.model.EmotionModel
98
import com.ninecraft.booket.core.model.RecordRegisterModel
10-
import com.ninecraft.booket.core.model.SeedModel
119
import com.slack.circuit.runtime.CircuitUiEvent
1210
import com.slack.circuit.runtime.CircuitUiState
1311
import kotlinx.collections.immutable.ImmutableList
@@ -20,24 +18,6 @@ data class BookDetailUiState(
2018
val seedsStats: ImmutableList<EmotionModel> = persistentListOf(),
2119
val isBookUpdateBottomSheetVisible: Boolean = false,
2220
val isRecordSortBottomSheetVisible: Boolean = false,
23-
val emotionList: ImmutableList<EmotionModel> = persistentListOf(
24-
EmotionModel(
25-
name = Emotion.WARM,
26-
count = 3,
27-
),
28-
EmotionModel(
29-
name = Emotion.JOY,
30-
count = 1,
31-
),
32-
EmotionModel(
33-
name = Emotion.TENSION,
34-
count = 2,
35-
),
36-
EmotionModel(
37-
name = Emotion.SADNESS,
38-
count = 2,
39-
),
40-
),
4121
val currentBookStatus: BookStatus = BookStatus.BEFORE_READING,
4222
val currentRecordSort: RecordSort = RecordSort.PAGE_ASCENDING,
4323
val recordCollections: ImmutableList<RecordRegisterModel> = persistentListOf(

feature/detail/src/main/kotlin/com/ninecraft/booket/feature/detail/book/component/RecordsCollection.kt

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

feature/detail/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@
99
<string name="record_collection">내 기록 모음</string>
1010
<string name="collected_seed_title">내가 모은 씨앗</string>
1111
<string name="records_collection_empty">첫 기록을 남겨 보세요!\n나만의 아카이브를 만들 수 있어요.</string>
12+
<string name="register_book_record">독서 기록 추가</string>
1213
</resources>

0 commit comments

Comments
 (0)