Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix #1533 use M3 PullToRefresh #1534

Merged
merged 1 commit into from
Jun 1, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions app/src/main/java/com/jerboa/model/PersonProfileViewModel.kt
Original file line number Diff line number Diff line change
@@ -94,6 +94,25 @@ class PersonProfileViewModel(personArg: Either<PersonId, String>, 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<GetPersonDetailsResponse> = ApiState.Loading,
30 changes: 5 additions & 25 deletions app/src/main/java/com/jerboa/ui/components/common/AppBars.kt
Original file line number Diff line number Diff line change
@@ -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()
}
}

/**
Original file line number Diff line number Diff line change
@@ -1,32 +1,27 @@
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
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<CommunityId, String>,
@@ -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,
57 changes: 23 additions & 34 deletions app/src/main/java/com/jerboa/ui/components/home/HomeActivity.kt
Original file line number Diff line number Diff line change
@@ -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,20 +17,19 @@ 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
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<PostView>(PostRemoveReturn.POST_VIEW, homeViewModel::updatePost)
appState.ConsumeReturn<PostView>(PostViewReturn.POST_VIEW, homeViewModel::updatePost)
appState.ConsumeReturn<PersonView>(BanPersonReturn.PERSON_VIEW, homeViewModel::updateBanned)
appState.ConsumeReturn<BanFromCommunityData>(BanFromCommunityReturn.BAN_DATA_VIEW, homeViewModel::updateBannedFromCommunity)
appState.ConsumeReturn<BanFromCommunityData>(
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,40 +239,26 @@ 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) {
is ApiState.Failure -> {
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,
Loading