mirror of
https://github.com/TeamNewPipe/NewPipe.git
synced 2024-11-22 11:02:35 +01:00
Add comment view model
This commit is contained in:
parent
02c5f2607a
commit
c5d94a5b60
@ -294,11 +294,9 @@ dependencies {
|
|||||||
implementation 'androidx.activity:activity-compose'
|
implementation 'androidx.activity:activity-compose'
|
||||||
implementation 'androidx.compose.ui:ui-tooling-preview'
|
implementation 'androidx.compose.ui:ui-tooling-preview'
|
||||||
implementation 'androidx.compose.ui:ui-text:1.7.0-beta04' // Needed for parsing HTML to AnnotatedString
|
implementation 'androidx.compose.ui:ui-text:1.7.0-beta04' // Needed for parsing HTML to AnnotatedString
|
||||||
implementation 'com.github.nanihadesuka:LazyColumnScrollbar:2.1.0'
|
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose'
|
||||||
|
|
||||||
// Paging
|
|
||||||
implementation 'androidx.paging:paging-rxjava3:3.3.0'
|
|
||||||
implementation 'androidx.paging:paging-compose:3.3.0'
|
implementation 'androidx.paging:paging-compose:3.3.0'
|
||||||
|
implementation 'com.github.nanihadesuka:LazyColumnScrollbar:2.1.0'
|
||||||
|
|
||||||
/** Debugging **/
|
/** Debugging **/
|
||||||
// Memory leak detection
|
// Memory leak detection
|
||||||
|
@ -144,14 +144,14 @@ fun Comment(comment: CommentsInfoItem) {
|
|||||||
if (showReplies) {
|
if (showReplies) {
|
||||||
ModalBottomSheet(onDismissRequest = { showReplies = false }) {
|
ModalBottomSheet(onDismissRequest = { showReplies = false }) {
|
||||||
val coroutineScope = rememberCoroutineScope()
|
val coroutineScope = rememberCoroutineScope()
|
||||||
val flow = remember(coroutineScope) {
|
val flow = remember {
|
||||||
Pager(PagingConfig(pageSize = 20, enablePlaceholders = false)) {
|
Pager(PagingConfig(pageSize = 20, enablePlaceholders = false)) {
|
||||||
CommentsSource(comment.serviceId, comment.url, comment.replies)
|
CommentsSource(comment.serviceId, comment.url, comment.replies)
|
||||||
}.flow
|
}.flow
|
||||||
.cachedIn(coroutineScope)
|
.cachedIn(coroutineScope)
|
||||||
}
|
}
|
||||||
|
|
||||||
CommentSection(parentComment = comment, commentsData = flow)
|
CommentSection(parentComment = comment, commentsFlow = flow)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,9 +36,9 @@ import org.schabi.newpipe.paging.CommentsDisabledException
|
|||||||
@Composable
|
@Composable
|
||||||
fun CommentSection(
|
fun CommentSection(
|
||||||
parentComment: CommentsInfoItem? = null,
|
parentComment: CommentsInfoItem? = null,
|
||||||
commentsData: Flow<PagingData<CommentsInfoItem>>
|
commentsFlow: Flow<PagingData<CommentsInfoItem>>
|
||||||
) {
|
) {
|
||||||
val comments = commentsData.collectAsLazyPagingItems()
|
val comments = commentsFlow.collectAsLazyPagingItems()
|
||||||
val itemCount by remember { derivedStateOf { comments.itemCount } }
|
val itemCount by remember { derivedStateOf { comments.itemCount } }
|
||||||
|
|
||||||
Surface(color = MaterialTheme.colorScheme.background) {
|
Surface(color = MaterialTheme.colorScheme.background) {
|
||||||
@ -113,7 +113,7 @@ private fun CommentSectionPreview(
|
|||||||
@PreviewParameter(CommentDataProvider::class) pagingData: PagingData<CommentsInfoItem>
|
@PreviewParameter(CommentDataProvider::class) pagingData: PagingData<CommentsInfoItem>
|
||||||
) {
|
) {
|
||||||
AppTheme {
|
AppTheme {
|
||||||
CommentSection(commentsData = flowOf(pagingData))
|
CommentSection(commentsFlow = flowOf(pagingData))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,6 +137,6 @@ private fun CommentRepliesPreview() {
|
|||||||
val flow = flowOf(PagingData.from(replies))
|
val flow = flowOf(PagingData.from(replies))
|
||||||
|
|
||||||
AppTheme {
|
AppTheme {
|
||||||
CommentSection(parentComment = comment, commentsData = flow)
|
CommentSection(parentComment = comment, commentsFlow = flow)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,60 +2,37 @@ package org.schabi.newpipe.fragments.list.comments
|
|||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.compose.runtime.remember
|
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
|
||||||
import androidx.compose.ui.platform.ComposeView
|
import androidx.compose.ui.platform.ComposeView
|
||||||
import androidx.compose.ui.platform.ViewCompositionStrategy
|
import androidx.compose.ui.platform.ViewCompositionStrategy
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.paging.Pager
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||||
import androidx.paging.PagingConfig
|
|
||||||
import androidx.paging.cachedIn
|
|
||||||
import org.schabi.newpipe.compose.comment.CommentSection
|
import org.schabi.newpipe.compose.comment.CommentSection
|
||||||
import org.schabi.newpipe.compose.theme.AppTheme
|
import org.schabi.newpipe.compose.theme.AppTheme
|
||||||
import org.schabi.newpipe.paging.CommentsSource
|
import org.schabi.newpipe.util.KEY_SERVICE_ID
|
||||||
import org.schabi.newpipe.util.NO_SERVICE_ID
|
import org.schabi.newpipe.util.KEY_URL
|
||||||
|
import org.schabi.newpipe.viewmodels.CommentsViewModel
|
||||||
|
|
||||||
class CommentsFragment : Fragment() {
|
class CommentsFragment : Fragment() {
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
container: ViewGroup?,
|
container: ViewGroup?,
|
||||||
savedInstanceState: Bundle?
|
savedInstanceState: Bundle?
|
||||||
): View {
|
) = ComposeView(requireContext()).apply {
|
||||||
val arguments = requireArguments()
|
|
||||||
val serviceId = arguments.getInt(SERVICE_ID, NO_SERVICE_ID)
|
|
||||||
val url = arguments.getString(URL)
|
|
||||||
|
|
||||||
return ComposeView(requireContext()).apply {
|
|
||||||
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
|
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
|
||||||
setContent {
|
setContent {
|
||||||
val coroutineScope = rememberCoroutineScope()
|
val viewModel = viewModel<CommentsViewModel>()
|
||||||
val flow = remember(coroutineScope) {
|
|
||||||
Pager(PagingConfig(pageSize = 20, enablePlaceholders = false)) {
|
|
||||||
CommentsSource(serviceId, url, null)
|
|
||||||
}.flow
|
|
||||||
.cachedIn(coroutineScope)
|
|
||||||
}
|
|
||||||
|
|
||||||
AppTheme {
|
AppTheme {
|
||||||
CommentSection(commentsData = flow)
|
CommentSection(commentsFlow = viewModel.comments)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val SERVICE_ID = "serviceId"
|
|
||||||
private const val URL = "url"
|
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun getInstance(serviceId: Int, url: String?) = CommentsFragment().apply {
|
fun getInstance(serviceId: Int, url: String?) = CommentsFragment().apply {
|
||||||
arguments = bundleOf(
|
arguments = bundleOf(KEY_SERVICE_ID to serviceId, KEY_URL to url)
|
||||||
SERVICE_ID to serviceId,
|
|
||||||
URL to url
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
package org.schabi.newpipe.viewmodels
|
||||||
|
|
||||||
|
import androidx.lifecycle.SavedStateHandle
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
|
import androidx.paging.Pager
|
||||||
|
import androidx.paging.PagingConfig
|
||||||
|
import androidx.paging.cachedIn
|
||||||
|
import org.schabi.newpipe.paging.CommentsSource
|
||||||
|
import org.schabi.newpipe.util.KEY_SERVICE_ID
|
||||||
|
import org.schabi.newpipe.util.KEY_URL
|
||||||
|
import org.schabi.newpipe.util.NO_SERVICE_ID
|
||||||
|
|
||||||
|
class CommentsViewModel(savedStateHandle: SavedStateHandle) : ViewModel() {
|
||||||
|
private val serviceId = savedStateHandle[KEY_SERVICE_ID] ?: NO_SERVICE_ID
|
||||||
|
private val url = savedStateHandle.get<String>(KEY_URL)
|
||||||
|
|
||||||
|
val comments = Pager(PagingConfig(pageSize = 20, enablePlaceholders = false)) {
|
||||||
|
CommentsSource(serviceId, url, null)
|
||||||
|
}.flow
|
||||||
|
.cachedIn(viewModelScope)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user