Skip to content

Commit

Permalink
Fix LemmyNet#1533 use M3 PullToRefresh (LemmyNet#1534)
Browse files Browse the repository at this point in the history
  • Loading branch information
MV-GH authored Jun 1, 2024
1 parent 984a870 commit 17e2343
Show file tree
Hide file tree
Showing 12 changed files with 344 additions and 639 deletions.
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
Expand Up @@ -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,
Expand Down
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
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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()
}
}

/**
Expand Down
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
Expand All @@ -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
Expand All @@ -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>,
Expand Down Expand Up @@ -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) },
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -420,7 +400,6 @@ fun CommunityActivity(
},
account = account,
showCommunityName = false,
padding = padding,
listState = postListState,
postViewMode = getPostViewMode(appSettingsViewModel),
showVotingArrowsInListView = showVotingArrowsInListView,
Expand Down
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
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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,
) {}
}
}

Expand Down Expand Up @@ -204,7 +208,7 @@ fun HomeActivity(
)
}

@OptIn(ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MainPostListingsContent(
homeViewModel: HomeViewModel,
Expand Down Expand Up @@ -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()
}
Expand Down Expand Up @@ -427,7 +417,6 @@ fun MainPostListingsContent(
homeViewModel.appendPosts()
},
account = account,
padding = padding,
listState = postListState,
postViewMode = getPostViewMode(appSettingsViewModel),
showVotingArrowsInListView = showVotingArrowsInListView,
Expand Down
Loading

0 comments on commit 17e2343

Please sign in to comment.