11package org.schabi.newpipe.ui.components.comment
22
33import android.content.res.Configuration
4- import androidx.compose.foundation.layout.Column
5- import androidx.compose.foundation.layout.fillMaxWidth
64import androidx.compose.foundation.layout.padding
7- import androidx.compose.foundation.layout.wrapContentSize
85import androidx.compose.foundation.lazy.LazyColumn
96import androidx.compose.foundation.lazy.rememberLazyListState
107import androidx.compose.material3.HorizontalDivider
118import androidx.compose.material3.MaterialTheme
129import androidx.compose.material3.Surface
13- import androidx.compose.material3.Text
1410import androidx.compose.runtime.Composable
1511import androidx.compose.runtime.derivedStateOf
1612import androidx.compose.runtime.getValue
1713import androidx.compose.runtime.remember
18- import androidx.compose.ui.Alignment
1914import androidx.compose.ui.Modifier
2015import androidx.compose.ui.input.nestedscroll.nestedScroll
2116import androidx.compose.ui.platform.rememberNestedScrollInteropConnection
22- import androidx.compose.ui.res.stringResource
2317import androidx.compose.ui.tooling.preview.Preview
2418import androidx.compose.ui.tooling.preview.PreviewParameter
2519import androidx.compose.ui.tooling.preview.PreviewParameterProvider
2620import androidx.compose.ui.unit.dp
27- import androidx.compose.ui.unit.sp
21+ import androidx.lifecycle.viewmodel.compose.viewModel
2822import androidx.paging.LoadState
2923import androidx.paging.LoadStates
3024import androidx.paging.PagingData
@@ -37,66 +31,58 @@ import org.schabi.newpipe.extractor.comments.CommentsInfoItem
3731import org.schabi.newpipe.extractor.stream.Description
3832import org.schabi.newpipe.paging.CommentsDisabledException
3933import org.schabi.newpipe.ui.components.common.LoadingIndicator
34+ import org.schabi.newpipe.ui.components.common.NoItemsMessage
4035import org.schabi.newpipe.ui.theme.AppTheme
36+ import org.schabi.newpipe.viewmodels.CommentsViewModel
37+
38+ @Composable
39+ fun CommentSection (commentsViewModel : CommentsViewModel = viewModel()) {
40+ CommentSection (commentsFlow = commentsViewModel.comments)
41+ }
4142
4243@Composable
4344fun CommentSection (
4445 parentComment : CommentsInfoItem ? = null,
4546 commentsFlow : Flow <PagingData <CommentsInfoItem >>
4647) {
47- Surface (color = MaterialTheme .colorScheme.background) {
48- val comments = commentsFlow.collectAsLazyPagingItems()
49- val itemCount by remember { derivedStateOf { comments.itemCount } }
50- val nestedScrollInterop = rememberNestedScrollInteropConnection()
51- val state = rememberLazyListState()
48+ val comments = commentsFlow.collectAsLazyPagingItems()
49+ val itemCount by remember { derivedStateOf { comments.itemCount } }
50+ val nestedScrollInterop = rememberNestedScrollInteropConnection()
51+ val state = rememberLazyListState()
5252
53- LazyColumnScrollbar (state = state) {
54- LazyColumn (modifier = Modifier .nestedScroll(nestedScrollInterop), state = state) {
55- if (parentComment != null ) {
56- item {
57- CommentRepliesHeader (comment = parentComment)
58- HorizontalDivider (thickness = 1 .dp)
59- }
53+ LazyColumnScrollbar (state = state) {
54+ LazyColumn (modifier = Modifier .nestedScroll(nestedScrollInterop), state = state) {
55+ if (parentComment != null ) {
56+ item {
57+ CommentRepliesHeader (comment = parentComment)
58+ HorizontalDivider (thickness = 1 .dp)
6059 }
60+ }
6161
62- if (itemCount == 0 ) {
63- item {
64- val refresh = comments.loadState.refresh
65- if (refresh is LoadState .Loading ) {
66- LoadingIndicator (modifier = Modifier .padding(top = 8 .dp))
62+ if (itemCount == 0 ) {
63+ item {
64+ val refresh = comments.loadState.refresh
65+ if (refresh is LoadState .Loading ) {
66+ LoadingIndicator (modifier = Modifier .padding(top = 8 .dp))
67+ } else {
68+ val error = (refresh as ? LoadState .Error )?.error
69+ val message = if (error is CommentsDisabledException ) {
70+ R .string.comments_are_disabled
6771 } else {
68- NoCommentsMessage ((refresh as ? LoadState . Error )?.error)
72+ R .string.no_comments
6973 }
70- }
71- } else {
72- items(itemCount) {
73- Comment (comment = comments[it]!! )
74+ NoItemsMessage (message)
7475 }
7576 }
77+ } else {
78+ items(itemCount) {
79+ Comment (comment = comments[it]!! )
80+ }
7681 }
7782 }
7883 }
7984}
8085
81- @Composable
82- private fun NoCommentsMessage (error : Throwable ? ) {
83- val message = if (error is CommentsDisabledException ) {
84- R .string.comments_are_disabled
85- } else {
86- R .string.no_comments
87- }
88-
89- Column (
90- modifier = Modifier
91- .fillMaxWidth()
92- .wrapContentSize(Alignment .Center ),
93- horizontalAlignment = Alignment .CenterHorizontally
94- ) {
95- Text (text = " (╯°-°)╯" , fontSize = 35 .sp)
96- Text (text = stringResource(id = message), fontSize = 24 .sp)
97- }
98- }
99-
10086private class CommentDataProvider : PreviewParameterProvider <PagingData <CommentsInfoItem >> {
10187 private val notLoading = LoadState .NotLoading (true )
10288
@@ -130,7 +116,9 @@ private fun CommentSectionPreview(
130116 @PreviewParameter(CommentDataProvider ::class ) pagingData : PagingData <CommentsInfoItem >
131117) {
132118 AppTheme {
133- CommentSection (commentsFlow = flowOf(pagingData))
119+ Surface (color = MaterialTheme .colorScheme.background) {
120+ CommentSection (commentsFlow = flowOf(pagingData))
121+ }
134122 }
135123}
136124
@@ -154,6 +142,8 @@ private fun CommentRepliesPreview() {
154142 val flow = flowOf(PagingData .from(replies))
155143
156144 AppTheme {
157- CommentSection (parentComment = comment, commentsFlow = flow)
145+ Surface (color = MaterialTheme .colorScheme.background) {
146+ CommentSection (parentComment = comment, commentsFlow = flow)
147+ }
158148 }
159149}
0 commit comments