diff --git a/app/src/main/java/com/jerboa/model/PersonProfileViewModel.kt b/app/src/main/java/com/jerboa/model/PersonProfileViewModel.kt index 7f13f9d6c..10f8b36de 100644 --- a/app/src/main/java/com/jerboa/model/PersonProfileViewModel.kt +++ b/app/src/main/java/com/jerboa/model/PersonProfileViewModel.kt @@ -94,6 +94,25 @@ class PersonProfileViewModel(personArg: Either, savedMode: Boo this.savedOnly = savedOnly } + fun refresh() { + when (val profileRes = personDetailsRes) { + is ApiState.Success -> { + resetPage() + getPersonDetails( + GetPersonDetails( + person_id = profileRes.data.person_view.person.id, + sort = sortType, + page = page, + saved_only = savedOnly, + ), + ApiState.Refreshing, + ) + } + + else -> {} + } + } + fun getPersonDetails( form: GetPersonDetails, state: ApiState = ApiState.Loading, diff --git a/app/src/main/java/com/jerboa/ui/components/common/AppBars.kt b/app/src/main/java/com/jerboa/ui/components/common/AppBars.kt index 1ea481dd3..6c0cf4abf 100644 --- a/app/src/main/java/com/jerboa/ui/components/common/AppBars.kt +++ b/app/src/main/java/com/jerboa/ui/components/common/AppBars.kt @@ -15,14 +15,11 @@ import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.ArrowBack import androidx.compose.material.icons.filled.KeyboardArrowDown import androidx.compose.material.icons.filled.KeyboardArrowUp import androidx.compose.material.icons.outlined.* -import androidx.compose.material.pullrefresh.PullRefreshIndicator -import androidx.compose.material.pullrefresh.PullRefreshState import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect @@ -49,6 +46,7 @@ import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.TextUnitType import androidx.compose.ui.unit.dp import com.jerboa.R +import com.jerboa.api.ApiState import com.jerboa.datatypes.UserViewType import com.jerboa.datatypes.VoteDisplayMode import com.jerboa.datatypes.data @@ -739,29 +737,11 @@ fun LoadingBar(padding: PaddingValues = PaddingValues(0.dp)) { ) } -/** - * M3 doesn't have a built-in way to do this yet, so we have to do it ourselves. - * - * Supports M3 theming - */ -@OptIn(ExperimentalMaterialApi::class) @Composable -fun JerboaPullRefreshIndicator( - refreshing: Boolean, - state: PullRefreshState, - modifier: Modifier = Modifier, - backgroundColor: Color = MaterialTheme.colorScheme.surfaceColorAtElevation(6.dp), - contentColor: Color = MaterialTheme.colorScheme.onSurface, - scale: Boolean = true, -) { - PullRefreshIndicator( - refreshing, - state, - modifier, - backgroundColor, - contentColor, - scale, - ) +fun JerboaLoadingBar(apiState: ApiState<*>) { + if (apiState.isLoading()) { + LoadingBar() + } } /** diff --git a/app/src/main/java/com/jerboa/ui/components/community/CommunityActivity.kt b/app/src/main/java/com/jerboa/ui/components/community/CommunityActivity.kt index 932356a70..28e92a884 100644 --- a/app/src/main/java/com/jerboa/ui/components/community/CommunityActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/community/CommunityActivity.kt @@ -1,15 +1,11 @@ package com.jerboa.ui.components.community import android.util.Log -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Add -import androidx.compose.material.pullrefresh.pullRefresh -import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FabPosition import androidx.compose.material3.FloatingActionButton @@ -17,16 +13,15 @@ import androidx.compose.material3.Icon import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource -import androidx.compose.ui.zIndex import androidx.lifecycle.viewmodel.compose.viewModel import arrow.core.Either import com.jerboa.JerboaAppState @@ -53,12 +48,11 @@ import com.jerboa.ui.components.ban.BanFromCommunityReturn import com.jerboa.ui.components.ban.BanPersonReturn import com.jerboa.ui.components.common.ApiEmptyText import com.jerboa.ui.components.common.ApiErrorText -import com.jerboa.ui.components.common.JerboaPullRefreshIndicator +import com.jerboa.ui.components.common.JerboaLoadingBar import com.jerboa.ui.components.common.JerboaSnackbarHost import com.jerboa.ui.components.common.LoadingBar import com.jerboa.ui.components.common.getCurrentAccount import com.jerboa.ui.components.common.getPostViewMode -import com.jerboa.ui.components.common.isLoading import com.jerboa.ui.components.common.isRefreshing import com.jerboa.ui.components.post.PostListings import com.jerboa.ui.components.post.PostViewReturn @@ -78,7 +72,7 @@ import it.vercruysse.lemmyapi.v0x19.datatypes.PersonView import it.vercruysse.lemmyapi.v0x19.datatypes.PostView import it.vercruysse.lemmyapi.v0x19.datatypes.SavePost -@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable fun CommunityActivity( communityArg: Either, @@ -116,14 +110,6 @@ fun CommunityActivity( communityViewModel::updateBannedFromCommunity, ) - val pullRefreshState = - rememberPullRefreshState( - refreshing = communityViewModel.postsRes.isRefreshing(), - onRefresh = { - communityViewModel.refreshPosts() - }, - ) - Scaffold( modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), snackbarHost = { JerboaSnackbarHost(snackbarHostState) }, @@ -195,20 +181,14 @@ fun CommunityActivity( } }, content = { padding -> - Box(modifier = Modifier.pullRefresh(pullRefreshState)) { - // zIndex needed bc some elements of a post get drawn above it. - JerboaPullRefreshIndicator( - communityViewModel.postsRes.isRefreshing(), - pullRefreshState, - Modifier - .padding(padding) - .align(Alignment.TopCenter) - .zIndex(100F), - ) - // Can't be in ApiState.Loading, because of infinite scrolling - if (communityViewModel.postsRes.isLoading()) { - LoadingBar(padding = padding) - } + PullToRefreshBox( + modifier = Modifier.padding(padding), + isRefreshing = communityViewModel.postsRes.isRefreshing(), + onRefresh = communityViewModel::refreshPosts, + ) { + // Can't be inside ApiState.Loading, because can be holder and loading at same time + JerboaLoadingBar(communityViewModel.postsRes) + when (val postsRes = communityViewModel.postsRes) { ApiState.Empty -> ApiEmptyText() is ApiState.Failure -> ApiErrorText(postsRes.msg) @@ -420,7 +400,6 @@ fun CommunityActivity( }, account = account, showCommunityName = false, - padding = padding, listState = postListState, postViewMode = getPostViewMode(appSettingsViewModel), showVotingArrowsInListView = showVotingArrowsInListView, diff --git a/app/src/main/java/com/jerboa/ui/components/home/HomeActivity.kt b/app/src/main/java/com/jerboa/ui/components/home/HomeActivity.kt index 19665134a..8bf77047a 100644 --- a/app/src/main/java/com/jerboa/ui/components/home/HomeActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/home/HomeActivity.kt @@ -2,16 +2,12 @@ package com.jerboa.ui.components.home import android.util.Log import androidx.activity.compose.ReportDrawn -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Add -import androidx.compose.material.pullrefresh.pullRefresh -import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material3.DrawerState import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FabPosition @@ -21,12 +17,12 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarScrollBehavior +import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll @@ -34,7 +30,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTagsAsResourceId -import androidx.compose.ui.zIndex import com.jerboa.JerboaAppState import com.jerboa.R import com.jerboa.api.ApiState @@ -58,13 +53,12 @@ import com.jerboa.ui.components.ban.BanFromCommunityReturn import com.jerboa.ui.components.ban.BanPersonReturn import com.jerboa.ui.components.common.ApiEmptyText import com.jerboa.ui.components.common.ApiErrorText -import com.jerboa.ui.components.common.JerboaPullRefreshIndicator +import com.jerboa.ui.components.common.JerboaLoadingBar import com.jerboa.ui.components.common.JerboaSnackbarHost import com.jerboa.ui.components.common.LoadingBar import com.jerboa.ui.components.common.apiErrorToast import com.jerboa.ui.components.common.getCurrentAccount import com.jerboa.ui.components.common.getPostViewMode -import com.jerboa.ui.components.common.isLoading import com.jerboa.ui.components.common.isRefreshing import com.jerboa.ui.components.post.PostListings import com.jerboa.ui.components.post.PostViewReturn @@ -119,11 +113,21 @@ fun HomeActivity( appState.ConsumeReturn(PostRemoveReturn.POST_VIEW, homeViewModel::updatePost) appState.ConsumeReturn(PostViewReturn.POST_VIEW, homeViewModel::updatePost) appState.ConsumeReturn(BanPersonReturn.PERSON_VIEW, homeViewModel::updateBanned) - appState.ConsumeReturn(BanFromCommunityReturn.BAN_DATA_VIEW, homeViewModel::updateBannedFromCommunity) + appState.ConsumeReturn( + BanFromCommunityReturn.BAN_DATA_VIEW, + homeViewModel::updateBannedFromCommunity, + ) LaunchedEffect(account) { if (!account.isAnon() && !account.isReady()) { - account.doIfReadyElseDisplayInfo(appState, ctx, snackbarHostState, scope, siteViewModel, accountViewModel) {} + account.doIfReadyElseDisplayInfo( + appState, + ctx, + snackbarHostState, + scope, + siteViewModel, + accountViewModel, + ) {} } } @@ -204,7 +208,7 @@ fun HomeActivity( ) } -@OptIn(ExperimentalMaterialApi::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable fun MainPostListingsContent( homeViewModel: HomeViewModel, @@ -235,33 +239,18 @@ fun MainPostListingsContent( is ApiState.Success -> { taglines = siteRes.data.taglines } + else -> {} } ReportDrawn() - val pullRefreshState = - rememberPullRefreshState( - refreshing = homeViewModel.postsRes.isRefreshing(), - onRefresh = { - homeViewModel.refreshPosts() - }, - ) - - Box(modifier = Modifier.pullRefresh(pullRefreshState)) { - // zIndex needed bc some elements of a post get drawn above it. - JerboaPullRefreshIndicator( - homeViewModel.postsRes.isRefreshing(), - pullRefreshState, - Modifier - .padding(padding) - .align(Alignment.TopCenter) - .zIndex(100f), - ) - // Can't be in ApiState.Loading, because of infinite scrolling - if (homeViewModel.postsRes.isLoading()) { - LoadingBar(padding = padding) - } + PullToRefreshBox( + modifier = Modifier.padding(padding), + isRefreshing = homeViewModel.postsRes.isRefreshing(), + onRefresh = homeViewModel::refreshPosts, + ) { + JerboaLoadingBar(homeViewModel.postsRes) val posts = when (val postsRes = homeViewModel.postsRes) { @@ -269,6 +258,7 @@ fun MainPostListingsContent( apiErrorToast(ctx, postsRes.msg) emptyList() } + is ApiState.Holder -> postsRes.data.posts.toList() else -> emptyList() } @@ -427,7 +417,6 @@ fun MainPostListingsContent( homeViewModel.appendPosts() }, account = account, - padding = padding, listState = postListState, postViewMode = getPostViewMode(appSettingsViewModel), showVotingArrowsInListView = showVotingArrowsInListView, diff --git a/app/src/main/java/com/jerboa/ui/components/inbox/InboxActivity.kt b/app/src/main/java/com/jerboa/ui/components/inbox/InboxActivity.kt index 1601e43bd..c2d5dec04 100644 --- a/app/src/main/java/com/jerboa/ui/components/inbox/InboxActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/inbox/InboxActivity.kt @@ -3,8 +3,6 @@ package com.jerboa.ui.components.inbox import android.content.Context import android.util.Log import androidx.annotation.StringRes -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize @@ -14,9 +12,6 @@ import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.pullrefresh.pullRefresh -import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material3.DrawerState import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold @@ -25,6 +20,7 @@ import androidx.compose.material3.Tab import androidx.compose.material3.TabRow import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -37,7 +33,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource -import androidx.compose.ui.zIndex import androidx.lifecycle.viewmodel.compose.viewModel import com.jerboa.JerboaAppState import com.jerboa.R @@ -58,7 +53,7 @@ import com.jerboa.ui.components.comment.mentionnode.CommentMentionNode import com.jerboa.ui.components.comment.replynode.CommentReplyNodeInbox import com.jerboa.ui.components.common.ApiEmptyText import com.jerboa.ui.components.common.ApiErrorText -import com.jerboa.ui.components.common.JerboaPullRefreshIndicator +import com.jerboa.ui.components.common.JerboaLoadingBar import com.jerboa.ui.components.common.JerboaSnackbarHost import com.jerboa.ui.components.common.LoadingBar import com.jerboa.ui.components.common.getCurrentAccount @@ -193,7 +188,7 @@ enum class InboxTab( Messages(R.string.inbox_activity_messages), } -@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterialApi::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable fun InboxTabs( appState: JerboaAppState, @@ -258,29 +253,6 @@ fun InboxTabs( } } - val refreshing = inboxViewModel.repliesRes.isRefreshing() - - val refreshState = - rememberPullRefreshState( - refreshing = refreshing, - onRefresh = { - account.doIfReadyElseDisplayInfo( - appState, - ctx, - snackbarHostState, - scope, - siteViewModel, - ) { - inboxViewModel.resetPageReplies() - inboxViewModel.getReplies( - inboxViewModel.getFormReplies(), - ApiState.Refreshing, - ) - siteViewModel.fetchUnreadCounts() - } - }, - ) - val goToComment = { crv: CommentReplyView -> // Go to the parent comment or post instead for context val parent = getCommentParentId(crv.comment) @@ -311,18 +283,27 @@ fun InboxTabs( } } - Box(modifier = Modifier.pullRefresh(refreshState)) { - JerboaPullRefreshIndicator( - refreshing, - refreshState, - Modifier - .align(Alignment.TopCenter) - .zIndex(100F), - ) + PullToRefreshBox( + isRefreshing = inboxViewModel.repliesRes.isRefreshing(), + onRefresh = { + account.doIfReadyElseDisplayInfo( + appState, + ctx, + snackbarHostState, + scope, + siteViewModel, + ) { + inboxViewModel.resetPageReplies() + inboxViewModel.getReplies( + inboxViewModel.getFormReplies(), + ApiState.Refreshing, + ) + siteViewModel.fetchUnreadCounts() + } + }, + ) { + JerboaLoadingBar(inboxViewModel.repliesRes) - if (inboxViewModel.repliesRes.isLoading()) { - LoadingBar() - } when (val repliesRes = inboxViewModel.repliesRes) { ApiState.Empty -> ApiEmptyText() is ApiState.Failure -> ApiErrorText(repliesRes.msg) @@ -445,6 +426,7 @@ fun InboxTabs( } } } + else -> {} } } @@ -475,46 +457,26 @@ fun InboxTabs( } } - val loading = inboxViewModel.mentionsRes.isLoading() - - val refreshing = inboxViewModel.mentionsRes.isRefreshing() - - val refreshState = - rememberPullRefreshState( - refreshing = refreshing, - onRefresh = { - account.doIfReadyElseDisplayInfo( - appState, - ctx, - snackbarHostState, - scope, - siteViewModel, - ) { - inboxViewModel.resetPageMentions() - inboxViewModel.getMentions( - inboxViewModel.getFormMentions(), - ApiState.Refreshing, - ) - siteViewModel.fetchUnreadCounts() - } - }, - ) - Box( - modifier = - Modifier - .pullRefresh(refreshState) - .fillMaxSize(), + PullToRefreshBox( + isRefreshing = inboxViewModel.mentionsRes.isRefreshing(), + onRefresh = { + account.doIfReadyElseDisplayInfo( + appState, + ctx, + snackbarHostState, + scope, + siteViewModel, + ) { + inboxViewModel.resetPageMentions() + inboxViewModel.getMentions( + inboxViewModel.getFormMentions(), + ApiState.Refreshing, + ) + siteViewModel.fetchUnreadCounts() + } + }, ) { - JerboaPullRefreshIndicator( - refreshing, - refreshState, - Modifier - .align(Alignment.TopCenter) - .zIndex(100F), - ) - if (loading) { - LoadingBar() - } + JerboaLoadingBar(inboxViewModel.mentionsRes) when (val mentionsRes = inboxViewModel.mentionsRes) { ApiState.Empty -> ApiEmptyText() @@ -660,6 +622,7 @@ fun InboxTabs( } } } + else -> {} } } @@ -690,44 +653,26 @@ fun InboxTabs( } } - val loading = inboxViewModel.messagesRes.isLoading() - val refreshing = inboxViewModel.mentionsRes.isRefreshing() - - val refreshState = - rememberPullRefreshState( - refreshing = refreshing, - onRefresh = { - account.doIfReadyElseDisplayInfo( - appState, - ctx, - snackbarHostState, - scope, - siteViewModel, - ) { - inboxViewModel.resetPageMessages() - inboxViewModel.getMessages( - inboxViewModel.getFormMessages(), - ApiState.Refreshing, - ) - siteViewModel.fetchUnreadCounts() - } - }, - ) - Box( - modifier = - Modifier - .pullRefresh(refreshState) - .fillMaxSize(), + PullToRefreshBox( + isRefreshing = inboxViewModel.messagesRes.isRefreshing(), + onRefresh = { + account.doIfReadyElseDisplayInfo( + appState, + ctx, + snackbarHostState, + scope, + siteViewModel, + ) { + inboxViewModel.resetPageMessages() + inboxViewModel.getMessages( + inboxViewModel.getFormMessages(), + ApiState.Refreshing, + ) + siteViewModel.fetchUnreadCounts() + } + }, ) { - JerboaPullRefreshIndicator( - refreshing, - refreshState, - Modifier - .align(Alignment.TopCenter) - .zIndex(100F), - ) - - if (loading) { + if (inboxViewModel.messagesRes.isLoading()) { LoadingBar() } when (val messagesRes = inboxViewModel.messagesRes) { @@ -773,6 +718,7 @@ fun InboxTabs( } } } + else -> {} } } diff --git a/app/src/main/java/com/jerboa/ui/components/person/PersonProfileActivity.kt b/app/src/main/java/com/jerboa/ui/components/person/PersonProfileActivity.kt index 7a7e6e26c..41843f4cb 100644 --- a/app/src/main/java/com/jerboa/ui/components/person/PersonProfileActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/person/PersonProfileActivity.kt @@ -2,8 +2,6 @@ package com.jerboa.ui.components.person import android.content.Context import android.util.Log -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize @@ -14,9 +12,6 @@ import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.pullrefresh.pullRefresh -import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material3.DrawerState import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme @@ -26,6 +21,7 @@ import androidx.compose.material3.Tab import androidx.compose.material3.TabRow import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -39,7 +35,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource -import androidx.compose.ui.zIndex import androidx.lifecycle.viewmodel.compose.viewModel import arrow.core.Either import com.jerboa.JerboaAppState @@ -73,13 +68,12 @@ import com.jerboa.ui.components.comment.edit.CommentEditReturn import com.jerboa.ui.components.comment.reply.CommentReplyReturn import com.jerboa.ui.components.common.ApiEmptyText import com.jerboa.ui.components.common.ApiErrorText -import com.jerboa.ui.components.common.JerboaPullRefreshIndicator +import com.jerboa.ui.components.common.JerboaLoadingBar import com.jerboa.ui.components.common.JerboaSnackbarHost import com.jerboa.ui.components.common.LoadingBar import com.jerboa.ui.components.common.apiErrorToast import com.jerboa.ui.components.common.getCurrentAccount import com.jerboa.ui.components.common.getPostViewMode -import com.jerboa.ui.components.common.isLoading import com.jerboa.ui.components.common.isRefreshing import com.jerboa.ui.components.common.simpleVerticalScrollbar import com.jerboa.ui.components.community.CommunityLink @@ -148,7 +142,10 @@ fun PersonProfileActivity( appState.ConsumeReturn(CommentEditReturn.COMMENT_VIEW, personProfileViewModel::updateComment) appState.ConsumeReturn(CommentRemoveReturn.COMMENT_VIEW, personProfileViewModel::updateComment) appState.ConsumeReturn(BanPersonReturn.PERSON_VIEW, personProfileViewModel::updateBanned) - appState.ConsumeReturn(BanFromCommunityReturn.BAN_DATA_VIEW, personProfileViewModel::updateBannedFromCommunity) + appState.ConsumeReturn( + BanFromCommunityReturn.BAN_DATA_VIEW, + personProfileViewModel::updateBannedFromCommunity, + ) appState.ConsumeReturn(CommentReplyReturn.COMMENT_VIEW) { cv -> when (val res = personProfileViewModel.personDetailsRes) { @@ -157,6 +154,7 @@ fun PersonProfileActivity( personProfileViewModel.insertComment(cv) } } + else -> {} } } @@ -200,6 +198,7 @@ fun PersonProfileActivity( matrixId = null, ) } + is ApiState.Holder -> { val person = profileRes.data.person_view.person val canBan = canMod( @@ -276,6 +275,7 @@ fun PersonProfileActivity( matrixId = person.matrix_user_id, ) } + else -> {} } }, @@ -314,7 +314,7 @@ enum class UserTab { Comments, } -@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterialApi::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable fun UserTabs( appState: JerboaAppState, @@ -351,32 +351,8 @@ fun UserTabs( } val pagerState = rememberPagerState { tabTitles.size } - val loading = personProfileViewModel.personDetailsRes.isLoading() - appState.ConsumeReturn(PostViewReturn.POST_VIEW, personProfileViewModel::updatePost) - val pullRefreshState = - rememberPullRefreshState( - refreshing = personProfileViewModel.personDetailsRes.isRefreshing(), - onRefresh = { - when (val profileRes = personProfileViewModel.personDetailsRes) { - is ApiState.Success -> { - personProfileViewModel.resetPage() - personProfileViewModel.getPersonDetails( - GetPersonDetails( - person_id = profileRes.data.person_view.person.id, - sort = personProfileViewModel.sortType, - page = personProfileViewModel.page, - saved_only = personProfileViewModel.savedOnly, - ), - ApiState.Refreshing, - ) - } - else -> {} - } - }, - ) - Column( modifier = Modifier.padding(padding), ) { @@ -458,28 +434,17 @@ fun UserTabs( } } } + else -> {} } } UserTab.Posts.ordinal -> { - Box( - modifier = - Modifier - .pullRefresh(pullRefreshState) - .fillMaxSize(), + PullToRefreshBox( + isRefreshing = personProfileViewModel.personDetailsRes.isRefreshing(), + onRefresh = personProfileViewModel::refresh, ) { - JerboaPullRefreshIndicator( - personProfileViewModel.personDetailsRes.isRefreshing(), - pullRefreshState, - // zIndex needed bc some elements of a post get drawn above it. - Modifier - .align(Alignment.TopCenter) - .zIndex(100f), - ) - if (loading) { - LoadingBar() - } + JerboaLoadingBar(personProfileViewModel.personDetailsRes) when (val profileRes = personProfileViewModel.personDetailsRes) { ApiState.Empty -> ApiEmptyText() @@ -677,81 +642,68 @@ fun UserTabs( swipeToActionPreset = swipeToActionPreset, ) } + else -> {} } } } UserTab.Comments.ordinal -> { - when (val profileRes = personProfileViewModel.personDetailsRes) { - ApiState.Empty -> ApiEmptyText() - is ApiState.Failure -> ApiErrorText(profileRes.msg) - ApiState.Loading -> LoadingBar() - ApiState.Refreshing -> LoadingBar() - is ApiState.Holder -> { - val nodes = commentsToFlatNodes(profileRes.data.comments) + PullToRefreshBox( + isRefreshing = personProfileViewModel.personDetailsRes.isRefreshing(), + onRefresh = personProfileViewModel::refresh, + ) { + JerboaLoadingBar(personProfileViewModel.personDetailsRes) + when (val profileRes = personProfileViewModel.personDetailsRes) { + ApiState.Empty -> ApiEmptyText() + is ApiState.Failure -> ApiErrorText(profileRes.msg) + is ApiState.Holder -> { + val nodes = commentsToFlatNodes(profileRes.data.comments) - val listState = rememberLazyListState() + val listState = rememberLazyListState() - // observer when reached end of list - val endOfListReached by remember { - derivedStateOf { - listState.isScrolledToEnd() + // observer when reached end of list + val endOfListReached by remember { + derivedStateOf { + listState.isScrolledToEnd() + } } - } - // Holds the un-expanded comment ids - val unExpandedComments = remember { mutableStateListOf() } - val commentsWithToggledActionBar = remember { mutableStateListOf() } + // Holds the un-expanded comment ids + val unExpandedComments = remember { mutableStateListOf() } + val commentsWithToggledActionBar = remember { mutableStateListOf() } - val toggleExpanded = remember { - { commentId: CommentId -> - if (unExpandedComments.contains(commentId)) { - unExpandedComments.remove(commentId) - } else { - unExpandedComments.add(commentId) + val toggleExpanded = remember { + { commentId: CommentId -> + if (unExpandedComments.contains(commentId)) { + unExpandedComments.remove(commentId) + } else { + unExpandedComments.add(commentId) + } } } - } - val toggleActionBar = remember { - { commentId: CommentId -> - if (commentsWithToggledActionBar.contains(commentId)) { - commentsWithToggledActionBar.remove(commentId) - } else { - commentsWithToggledActionBar.add(commentId) + val toggleActionBar = remember { + { commentId: CommentId -> + if (commentsWithToggledActionBar.contains(commentId)) { + commentsWithToggledActionBar.remove(commentId) + } else { + commentsWithToggledActionBar.add(commentId) + } } } - } - val showActionBarByDefault = true + val showActionBarByDefault = true - // act when end of list reached - if (endOfListReached) { - LaunchedEffect(Unit) { - personProfileViewModel.appendData( - profileRes.data.person_view.person.id, - ) + // act when end of list reached + if (endOfListReached) { + LaunchedEffect(Unit) { + personProfileViewModel.appendData( + profileRes.data.person_view.person.id, + ) + } } - } - Box( - modifier = - Modifier - .pullRefresh(pullRefreshState) - .fillMaxSize(), - ) { - JerboaPullRefreshIndicator( - personProfileViewModel.personDetailsRes.isRefreshing(), - pullRefreshState, - // zIndex needed bc some elements of a post get drawn above it. - Modifier - .align(Alignment.TopCenter) - .zIndex(100f), - ) - if (loading) { - LoadingBar() - } CommentNodes( nodes = nodes, admins = siteViewModel.admins(), @@ -915,6 +867,8 @@ fun UserTabs( swipeToActionPreset = swipeToActionPreset, ) } + + else -> {} } } } diff --git a/app/src/main/java/com/jerboa/ui/components/post/PostActivity.kt b/app/src/main/java/com/jerboa/ui/components/post/PostActivity.kt index 58eb569d4..6fd141f48 100644 --- a/app/src/main/java/com/jerboa/ui/components/post/PostActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/post/PostActivity.kt @@ -6,16 +6,14 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.ArrowBack import androidx.compose.material.icons.automirrored.outlined.Sort -import androidx.compose.material.pullrefresh.pullRefresh -import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon @@ -24,6 +22,7 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -32,7 +31,6 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester @@ -47,7 +45,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.compose.ui.unit.dp -import androidx.compose.ui.zIndex import androidx.lifecycle.viewmodel.compose.viewModel import arrow.core.Either import com.jerboa.JerboaAppState @@ -82,7 +79,6 @@ import com.jerboa.ui.components.common.ApiErrorText import com.jerboa.ui.components.common.CommentNavigationBottomAppBar import com.jerboa.ui.components.common.CommentSortOptionsDropdown import com.jerboa.ui.components.common.DualHeaderTitle -import com.jerboa.ui.components.common.JerboaPullRefreshIndicator import com.jerboa.ui.components.common.JerboaSnackbarHost import com.jerboa.ui.components.common.LoadingBar import com.jerboa.ui.components.common.apiErrorToast @@ -118,7 +114,6 @@ object PostViewReturn { @OptIn( ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class, - ExperimentalMaterialApi::class, ) @Composable fun PostActivity( @@ -177,14 +172,6 @@ fun PostActivity( val scope = rememberCoroutineScope() val snackbarHostState = remember { SnackbarHostState() } - val pullRefreshState = - rememberPullRefreshState( - refreshing = postViewModel.postRes.isRefreshing(), - onRefresh = { - postViewModel.getData(ApiState.Refreshing) - }, - ) - LaunchedEffect(Unit) { focusRequester.requestFocus() } @@ -271,26 +258,20 @@ fun PostActivity( } }, content = { padding -> - Box( - modifier = - Modifier - .fillMaxSize() - .pullRefresh(pullRefreshState), + PullToRefreshBox( + modifier = Modifier + .padding(padding) + .fillMaxWidth(), + isRefreshing = postViewModel.postRes.isRefreshing(), + onRefresh = { + postViewModel.getData(ApiState.Refreshing) + }, ) { parentListStateIndexes.clear() lazyListIndexTracker = 2 - JerboaPullRefreshIndicator( - postViewModel.postRes.isRefreshing(), - pullRefreshState, - // zIndex needed bc some elements of a post get drawn above it. - Modifier - .padding(padding) - .align(Alignment.TopCenter) - .zIndex(100f), - ) when (val postRes = postViewModel.postRes) { - is ApiState.Loading -> LoadingBar(padding) - is ApiState.Failure -> ApiErrorText(postRes.msg, padding) + is ApiState.Loading -> LoadingBar() + is ApiState.Failure -> ApiErrorText(postRes.msg) is ApiState.Success -> { val postView = postRes.data.post_view val moderators = remember(postRes) { postRes.data.moderators.map { it.moderator.id } } @@ -305,7 +286,7 @@ fun PostActivity( state = listState, modifier = Modifier - .padding(top = padding.calculateTopPadding()) + .fillMaxSize() .simpleVerticalScrollbar(listState) .testTag("jerboa:comments"), ) { @@ -751,11 +732,6 @@ fun PostActivity( else -> {} } - if (showParentCommentNavigationButtons) { - item { - Spacer(modifier = Modifier.height(padding.calculateBottomPadding())) - } - } } } diff --git a/app/src/main/java/com/jerboa/ui/components/post/PostListings.kt b/app/src/main/java/com/jerboa/ui/components/post/PostListings.kt index 7fbc12cdc..3ae510cca 100644 --- a/app/src/main/java/com/jerboa/ui/components/post/PostListings.kt +++ b/app/src/main/java/com/jerboa/ui/components/post/PostListings.kt @@ -1,8 +1,6 @@ package com.jerboa.ui.components.post -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.itemsIndexed @@ -16,7 +14,6 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp import com.jerboa.JerboaAppState import com.jerboa.PostViewMode import com.jerboa.datatypes.BanFromCommunityData @@ -66,7 +63,6 @@ fun PostListings( loadMorePosts: () -> Unit, account: Account, showCommunityName: Boolean = true, - padding: PaddingValues = PaddingValues(0.dp), listState: LazyListState, postViewMode: PostViewMode, showVotingArrowsInListView: Boolean, @@ -89,7 +85,6 @@ fun PostListings( state = listState, modifier = Modifier - .padding(padding) .fillMaxSize() .simpleVerticalScrollbar(listState) .testTag("jerboa:posts"), diff --git a/app/src/main/java/com/jerboa/ui/components/registrationapplications/RegistrationApplications.kt b/app/src/main/java/com/jerboa/ui/components/registrationapplications/RegistrationApplications.kt index 92dbd82bb..3c9a935f8 100644 --- a/app/src/main/java/com/jerboa/ui/components/registrationapplications/RegistrationApplications.kt +++ b/app/src/main/java/com/jerboa/ui/components/registrationapplications/RegistrationApplications.kt @@ -15,12 +15,9 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.FilterList import androidx.compose.material.icons.outlined.Menu -import androidx.compose.material.pullrefresh.pullRefresh -import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider @@ -32,6 +29,7 @@ import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarScrollBehavior +import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf @@ -47,7 +45,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.compose.ui.zIndex import com.jerboa.JerboaAppState import com.jerboa.R import com.jerboa.UnreadOrAll @@ -65,13 +62,11 @@ import com.jerboa.model.SiteViewModel import com.jerboa.ui.components.common.ApiEmptyText import com.jerboa.ui.components.common.ApiErrorText import com.jerboa.ui.components.common.DualHeaderTitle -import com.jerboa.ui.components.common.JerboaPullRefreshIndicator -import com.jerboa.ui.components.common.LoadingBar +import com.jerboa.ui.components.common.JerboaLoadingBar import com.jerboa.ui.components.common.MarkdownTextField import com.jerboa.ui.components.common.MyMarkdownText import com.jerboa.ui.components.common.TimeAgo import com.jerboa.ui.components.common.UnreadOrAllOptionsDropDown -import com.jerboa.ui.components.common.isLoading import com.jerboa.ui.components.common.isRefreshing import com.jerboa.ui.components.common.simpleVerticalScrollbar import com.jerboa.ui.components.person.PersonProfileLink @@ -147,7 +142,7 @@ fun RegistrationApplicationsHeaderTitle( DualHeaderTitle(topText = title, bottomText = getLocalizedUnreadOrAllName(ctx, selectedUnreadOrAll)) } -@OptIn(ExperimentalMaterialApi::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable fun RegistrationApplications( appState: JerboaAppState, @@ -183,92 +178,73 @@ fun RegistrationApplications( } } - val refreshing = registrationApplicationsViewModel.applicationsRes.isRefreshing() - - val refreshState = - rememberPullRefreshState( - refreshing = refreshing, - onRefresh = { - account.doIfReadyElseDisplayInfo( - appState, - ctx, - snackbarHostState, - scope, - siteViewModel, - ) { - registrationApplicationsViewModel.resetPage() - registrationApplicationsViewModel.listApplications( - registrationApplicationsViewModel.getFormApplications(), - ApiState.Refreshing, - ) - siteViewModel.fetchUnreadAppCount() - } - }, - ) - - Column( + PullToRefreshBox( modifier = Modifier .padding(padding), + isRefreshing = registrationApplicationsViewModel.applicationsRes.isRefreshing(), + onRefresh = { + account.doIfReadyElseDisplayInfo( + appState, + ctx, + snackbarHostState, + scope, + siteViewModel, + ) { + registrationApplicationsViewModel.resetPage() + registrationApplicationsViewModel.listApplications( + registrationApplicationsViewModel.getFormApplications(), + ApiState.Refreshing, + ) + siteViewModel.fetchUnreadAppCount() + } + }, ) { - Box( - modifier = Modifier.pullRefresh(refreshState), - ) { - JerboaPullRefreshIndicator( - refreshing, - refreshState, - Modifier - .align(Alignment.TopCenter) - .zIndex(100F), - ) + JerboaLoadingBar(registrationApplicationsViewModel.applicationsRes) - if (registrationApplicationsViewModel.applicationsRes.isLoading()) { - LoadingBar() - } - when (val appsRes = registrationApplicationsViewModel.applicationsRes) { - ApiState.Empty -> ApiEmptyText() - is ApiState.Failure -> ApiErrorText(appsRes.msg) - is ApiState.Holder -> { - val apps = appsRes.data.registration_applications - LazyColumn( - state = listState, - modifier = - Modifier - .simpleVerticalScrollbar(listState) - .fillMaxSize() - .imePadding(), - ) { - items( - apps, - key = { app -> app.registration_application.id }, - contentType = { "registrationApplication" }, - ) { registrationApplicationView -> - RegistrationApplicationItem( - registrationApplicationView = registrationApplicationView, - onApproveClick = { form -> - account.doIfReadyElseDisplayInfo( - appState, - ctx, - snackbarHostState, - scope, - siteViewModel, - ) { - registrationApplicationsViewModel.approveOrDenyApplication( - form, - ) - } - }, - onPersonClick = { personId -> - appState.toProfile(id = personId) - }, - showAvatar = siteViewModel.showAvatar(), - account = account, - ) - } + when (val appsRes = registrationApplicationsViewModel.applicationsRes) { + ApiState.Empty -> ApiEmptyText() + is ApiState.Failure -> ApiErrorText(appsRes.msg) + is ApiState.Holder -> { + val apps = appsRes.data.registration_applications + LazyColumn( + state = listState, + modifier = + Modifier + .simpleVerticalScrollbar(listState) + .fillMaxSize() + .imePadding(), + ) { + items( + apps, + key = { app -> app.registration_application.id }, + contentType = { "registrationApplication" }, + ) { registrationApplicationView -> + RegistrationApplicationItem( + registrationApplicationView = registrationApplicationView, + onApproveClick = { form -> + account.doIfReadyElseDisplayInfo( + appState, + ctx, + snackbarHostState, + scope, + siteViewModel, + ) { + registrationApplicationsViewModel.approveOrDenyApplication( + form, + ) + } + }, + onPersonClick = { personId -> + appState.toProfile(id = personId) + }, + showAvatar = siteViewModel.showAvatar(), + account = account, + ) } } - - else -> {} } + + else -> {} } } } diff --git a/app/src/main/java/com/jerboa/ui/components/reports/ReportsActivity.kt b/app/src/main/java/com/jerboa/ui/components/reports/ReportsActivity.kt index 776391fc2..09a4b48f5 100644 --- a/app/src/main/java/com/jerboa/ui/components/reports/ReportsActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/reports/ReportsActivity.kt @@ -3,8 +3,6 @@ package com.jerboa.ui.components.reports import android.content.Context import android.util.Log import androidx.annotation.StringRes -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize @@ -14,9 +12,6 @@ import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.pullrefresh.pullRefresh -import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material3.DrawerState import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold @@ -25,6 +20,7 @@ import androidx.compose.material3.Tab import androidx.compose.material3.TabRow import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -37,7 +33,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource -import androidx.compose.ui.zIndex import androidx.lifecycle.viewmodel.compose.viewModel import com.jerboa.JerboaAppState import com.jerboa.R @@ -52,11 +47,9 @@ import com.jerboa.model.ReportsViewModel import com.jerboa.model.SiteViewModel import com.jerboa.ui.components.common.ApiEmptyText import com.jerboa.ui.components.common.ApiErrorText -import com.jerboa.ui.components.common.JerboaPullRefreshIndicator +import com.jerboa.ui.components.common.JerboaLoadingBar import com.jerboa.ui.components.common.JerboaSnackbarHost -import com.jerboa.ui.components.common.LoadingBar import com.jerboa.ui.components.common.getCurrentAccount -import com.jerboa.ui.components.common.isLoading import com.jerboa.ui.components.common.isRefreshing import com.jerboa.ui.components.common.simpleVerticalScrollbar import com.jerboa.unreadOrAllFromBool @@ -155,7 +148,7 @@ enum class ReportsTab( Messages(R.string.inbox_activity_messages, true), } -@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterialApi::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable fun ReportsTabs( appState: JerboaAppState, @@ -224,41 +217,27 @@ fun ReportsTabs( } } - val refreshing = reportsViewModel.postReportsRes.isRefreshing() - - val refreshState = - rememberPullRefreshState( - refreshing = refreshing, - onRefresh = { - account.doIfReadyElseDisplayInfo( - appState, - ctx, - snackbarHostState, - scope, - siteViewModel, - ) { - reportsViewModel.resetPagePostReports() - reportsViewModel.listPostReports( - reportsViewModel.getFormPostReports(), - ApiState.Refreshing, - ) - siteViewModel.fetchUnreadReportCount() - } - }, - ) - - Box(modifier = Modifier.pullRefresh(refreshState)) { - JerboaPullRefreshIndicator( - refreshing, - refreshState, - Modifier - .align(Alignment.TopCenter) - .zIndex(100F), - ) + PullToRefreshBox( + isRefreshing = reportsViewModel.postReportsRes.isRefreshing(), + onRefresh = { + account.doIfReadyElseDisplayInfo( + appState, + ctx, + snackbarHostState, + scope, + siteViewModel, + ) { + reportsViewModel.resetPagePostReports() + reportsViewModel.listPostReports( + reportsViewModel.getFormPostReports(), + ApiState.Refreshing, + ) + siteViewModel.fetchUnreadReportCount() + } + }, + ) { + JerboaLoadingBar(reportsViewModel.postReportsRes) - if (reportsViewModel.postReportsRes.isLoading()) { - LoadingBar() - } when (val reportsRes = reportsViewModel.postReportsRes) { ApiState.Empty -> ApiEmptyText() is ApiState.Failure -> ApiErrorText(reportsRes.msg) @@ -266,10 +245,9 @@ fun ReportsTabs( val reports = reportsRes.data.post_reports LazyColumn( state = listState, - modifier = - Modifier - .fillMaxSize() - .simpleVerticalScrollbar(listState), + modifier = Modifier + .fillMaxSize() + .simpleVerticalScrollbar(listState), ) { items( reports, @@ -338,46 +316,26 @@ fun ReportsTabs( } } - val loading = reportsViewModel.commentReportsRes.isLoading() - - val refreshing = reportsViewModel.commentReportsRes.isRefreshing() - - val refreshState = - rememberPullRefreshState( - refreshing = refreshing, - onRefresh = { - account.doIfReadyElseDisplayInfo( - appState, - ctx, - snackbarHostState, - scope, - siteViewModel, - ) { - reportsViewModel.resetPageCommentReports() - reportsViewModel.listCommentReports( - reportsViewModel.getFormCommentReports(), - ApiState.Refreshing, - ) - siteViewModel.fetchUnreadReportCount() - } - }, - ) - Box( - modifier = - Modifier - .pullRefresh(refreshState) - .fillMaxSize(), + PullToRefreshBox( + isRefreshing = reportsViewModel.commentReportsRes.isRefreshing(), + onRefresh = { + account.doIfReadyElseDisplayInfo( + appState, + ctx, + snackbarHostState, + scope, + siteViewModel, + ) { + reportsViewModel.resetPageCommentReports() + reportsViewModel.listCommentReports( + reportsViewModel.getFormCommentReports(), + ApiState.Refreshing, + ) + siteViewModel.fetchUnreadReportCount() + } + }, ) { - JerboaPullRefreshIndicator( - refreshing, - refreshState, - Modifier - .align(Alignment.TopCenter) - .zIndex(100F), - ) - if (loading) { - LoadingBar() - } + JerboaLoadingBar(reportsViewModel.commentReportsRes) when (val reportsRes = reportsViewModel.commentReportsRes) { ApiState.Empty -> ApiEmptyText() @@ -450,46 +408,27 @@ fun ReportsTabs( } } - val loading = reportsViewModel.messageReportsRes.isLoading() - val refreshing = reportsViewModel.messageReportsRes.isRefreshing() - - val refreshState = - rememberPullRefreshState( - refreshing = refreshing, - onRefresh = { - account.doIfReadyElseDisplayInfo( - appState, - ctx, - snackbarHostState, - scope, - siteViewModel, - ) { - reportsViewModel.resetPageMessageReports() - reportsViewModel.listMessageReports( - reportsViewModel.getFormMessageReports(), - ApiState.Refreshing, - ) - siteViewModel.fetchUnreadReportCount() - } - }, - ) - Box( - modifier = - Modifier - .pullRefresh(refreshState) - .fillMaxSize(), + PullToRefreshBox( + isRefreshing = reportsViewModel.messageReportsRes.isRefreshing(), + onRefresh = { + account.doIfReadyElseDisplayInfo( + appState, + ctx, + snackbarHostState, + scope, + siteViewModel, + ) { + reportsViewModel.resetPageMessageReports() + reportsViewModel.listMessageReports( + reportsViewModel.getFormMessageReports(), + ApiState.Refreshing, + ) + siteViewModel.fetchUnreadReportCount() + } + }, ) { - JerboaPullRefreshIndicator( - refreshing, - refreshState, - Modifier - .align(Alignment.TopCenter) - .zIndex(100F), - ) + JerboaLoadingBar(reportsViewModel.messageReportsRes) - if (loading) { - LoadingBar() - } when (val reportsRes = reportsViewModel.messageReportsRes) { ApiState.Empty -> ApiEmptyText() is ApiState.Failure -> ApiErrorText(reportsRes.msg) diff --git a/app/src/main/java/com/jerboa/ui/components/viewvotes/comment/CommentLikesActivity.kt b/app/src/main/java/com/jerboa/ui/components/viewvotes/comment/CommentLikesActivity.kt index 08c88c4bb..dc8cc6740 100644 --- a/app/src/main/java/com/jerboa/ui/components/viewvotes/comment/CommentLikesActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/viewvotes/comment/CommentLikesActivity.kt @@ -1,23 +1,18 @@ package com.jerboa.ui.components.viewvotes.comment import android.util.Log -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.pullrefresh.pullRefresh -import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold +import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.zIndex import androidx.lifecycle.viewmodel.compose.viewModel import com.jerboa.JerboaAppState import com.jerboa.R @@ -26,15 +21,13 @@ import com.jerboa.isScrolledToEnd import com.jerboa.model.CommentLikesViewModel import com.jerboa.ui.components.common.ApiEmptyText import com.jerboa.ui.components.common.ApiErrorText -import com.jerboa.ui.components.common.JerboaPullRefreshIndicator -import com.jerboa.ui.components.common.LoadingBar +import com.jerboa.ui.components.common.JerboaLoadingBar import com.jerboa.ui.components.common.SimpleTopAppBar -import com.jerboa.ui.components.common.isLoading import com.jerboa.ui.components.common.isRefreshing import com.jerboa.ui.components.viewvotes.ViewVotesBody import it.vercruysse.lemmyapi.v0x19.datatypes.CommentId -@OptIn(ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable fun CommentLikesActivity( appState: JerboaAppState, @@ -70,32 +63,15 @@ fun CommentLikesActivity( } } - val refreshing = commentLikesViewModel.likesRes.isRefreshing() - - val refreshState = - rememberPullRefreshState( - refreshing = refreshing, - onRefresh = { - commentLikesViewModel.resetPage() - commentLikesViewModel.getLikes(ApiState.Refreshing) - }, - ) - - Box( - modifier = Modifier.pullRefresh(refreshState) - .padding(padding), + PullToRefreshBox( + modifier = Modifier.padding(padding), + isRefreshing = commentLikesViewModel.likesRes.isRefreshing(), + onRefresh = { + commentLikesViewModel.resetPage() + commentLikesViewModel.getLikes(ApiState.Refreshing) + }, ) { - JerboaPullRefreshIndicator( - refreshing, - refreshState, - Modifier - .align(Alignment.TopCenter) - .zIndex(100F), - ) - - if (commentLikesViewModel.likesRes.isLoading()) { - LoadingBar() - } + JerboaLoadingBar(commentLikesViewModel.likesRes) when (val likesRes = commentLikesViewModel.likesRes) { ApiState.Empty -> ApiEmptyText() diff --git a/app/src/main/java/com/jerboa/ui/components/viewvotes/post/PostLikesActivity.kt b/app/src/main/java/com/jerboa/ui/components/viewvotes/post/PostLikesActivity.kt index 15cb40af8..b3bffcb4d 100644 --- a/app/src/main/java/com/jerboa/ui/components/viewvotes/post/PostLikesActivity.kt +++ b/app/src/main/java/com/jerboa/ui/components/viewvotes/post/PostLikesActivity.kt @@ -1,23 +1,18 @@ package com.jerboa.ui.components.viewvotes.post import android.util.Log -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.pullrefresh.pullRefresh -import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold +import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.zIndex import androidx.lifecycle.viewmodel.compose.viewModel import com.jerboa.JerboaAppState import com.jerboa.R @@ -26,15 +21,13 @@ import com.jerboa.isScrolledToEnd import com.jerboa.model.PostLikesViewModel import com.jerboa.ui.components.common.ApiEmptyText import com.jerboa.ui.components.common.ApiErrorText -import com.jerboa.ui.components.common.JerboaPullRefreshIndicator -import com.jerboa.ui.components.common.LoadingBar +import com.jerboa.ui.components.common.JerboaLoadingBar import com.jerboa.ui.components.common.SimpleTopAppBar -import com.jerboa.ui.components.common.isLoading import com.jerboa.ui.components.common.isRefreshing import com.jerboa.ui.components.viewvotes.ViewVotesBody import it.vercruysse.lemmyapi.v0x19.datatypes.PostId -@OptIn(ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable fun PostLikesActivity( appState: JerboaAppState, @@ -70,33 +63,15 @@ fun PostLikesActivity( } } - val refreshing = postLikesViewModel.likesRes.isRefreshing() - - val refreshState = - rememberPullRefreshState( - refreshing = refreshing, - onRefresh = { - postLikesViewModel.resetPage() - postLikesViewModel.getLikes(ApiState.Refreshing) - }, - ) - - Box( - modifier = Modifier - .pullRefresh(refreshState) - .padding(padding), + PullToRefreshBox( + modifier = Modifier.padding(padding), + isRefreshing = postLikesViewModel.likesRes.isRefreshing(), + onRefresh = { + postLikesViewModel.resetPage() + postLikesViewModel.getLikes(ApiState.Refreshing) + }, ) { - JerboaPullRefreshIndicator( - refreshing, - refreshState, - Modifier - .align(Alignment.TopCenter) - .zIndex(100F), - ) - - if (postLikesViewModel.likesRes.isLoading()) { - LoadingBar() - } + JerboaLoadingBar(postLikesViewModel.likesRes) when (val likesRes = postLikesViewModel.likesRes) { ApiState.Empty -> ApiEmptyText() @@ -109,6 +84,7 @@ fun PostLikesActivity( onPersonClick = appState::toProfile, ) } + else -> {} } }