android: extract HottestPosts composable

This commit is contained in:
Harsh Shandilya 2021-10-04 15:12:54 +05:30
parent 7c306acfa9
commit e053ca2028
No known key found for this signature in database
GPG key ID: 366D7BBAD1031E80
2 changed files with 58 additions and 28 deletions

View file

@ -0,0 +1,48 @@
package dev.msfjarvis.claw.android.ui
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.paging.LoadState
import androidx.paging.compose.LazyPagingItems
import com.google.accompanist.swiperefresh.SwipeRefresh
import com.google.accompanist.swiperefresh.rememberSwipeRefreshState
import dev.msfjarvis.claw.database.local.SavedPost
import dev.msfjarvis.claw.model.LobstersPost
import kotlinx.coroutines.launch
@Composable
fun HottestPosts(
items: LazyPagingItems<LobstersPost>,
listState: LazyListState,
isPostSaved: suspend (SavedPost) -> Boolean,
toggleSave: suspend (SavedPost) -> Unit,
reloadPosts: () -> Unit,
launchUrl: (String) -> Unit,
modifier: Modifier,
) {
val coroutineScope = rememberCoroutineScope()
val isRefreshing = items.loadState.refresh == LoadState.Loading
SwipeRefresh(
state = rememberSwipeRefreshState(isRefreshing),
onRefresh = reloadPosts,
) {
if (items.itemCount == 0) {
Box(modifier = Modifier.fillMaxSize())
} else {
NetworkPosts(
items = items,
launchUrl = launchUrl,
listState = listState,
isSaved = isPostSaved,
toggleSave = { coroutineScope.launch { toggleSave(it) } },
modifier = Modifier.padding(top = 16.dp).then(modifier),
)
}
}
}

View file

@ -2,9 +2,6 @@ package dev.msfjarvis.claw.android.ui
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Scaffold
@ -15,7 +12,6 @@ import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
@ -23,20 +19,15 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.paging.LoadState
import androidx.paging.compose.collectAsLazyPagingItems
import com.google.accompanist.insets.ProvideWindowInsets
import com.google.accompanist.insets.navigationBarsPadding
import com.google.accompanist.insets.statusBarsPadding
import com.google.accompanist.swiperefresh.SwipeRefresh
import com.google.accompanist.swiperefresh.rememberSwipeRefreshState
import com.google.accompanist.systemuicontroller.rememberSystemUiController
import dev.msfjarvis.claw.android.viewmodel.ClawViewModel
import dev.msfjarvis.claw.common.theme.LobstersTheme
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
import kotlinx.coroutines.launch
private const val ScrollDelta = 50
@ -49,7 +40,6 @@ fun LobstersApp(
val systemUiController = rememberSystemUiController()
val scaffoldState = rememberScaffoldState()
val listState = rememberLazyListState()
val coroutineScope = rememberCoroutineScope()
var isFabVisible by remember { mutableStateOf(true) }
val nestedScrollConnection = remember {
object : NestedScrollConnection {
@ -77,6 +67,7 @@ fun LobstersApp(
systemUiController.setNavigationBarColor(color = Color.Transparent)
}
val items = viewModel.pagerFlow.collectAsLazyPagingItems()
Scaffold(
scaffoldState = scaffoldState,
topBar = { ClawAppBar(modifier = Modifier.statusBarsPadding()) },
@ -88,24 +79,15 @@ fun LobstersApp(
)
},
) {
val isRefreshing = items.loadState.refresh == LoadState.Loading
SwipeRefresh(
state = rememberSwipeRefreshState(isRefreshing),
onRefresh = viewModel::reloadPosts,
) {
if (items.itemCount == 0) {
Box(modifier = Modifier.fillMaxSize())
} else {
NetworkPosts(
items = items,
launchUrl = urlLauncher::launch,
listState = listState,
isSaved = viewModel::isPostSaved,
toggleSave = { coroutineScope.launch { viewModel.toggleSave(it) } },
modifier = Modifier.padding(top = 16.dp).nestedScroll(nestedScrollConnection),
)
}
}
HottestPosts(
items,
listState,
viewModel::isPostSaved,
viewModel::toggleSave,
viewModel::reloadPosts,
urlLauncher::launch,
Modifier.nestedScroll(nestedScrollConnection),
)
}
}
}