diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/HottestPosts.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/HottestPosts.kt new file mode 100644 index 00000000..0c79c13d --- /dev/null +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/HottestPosts.kt @@ -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, + 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), + ) + } + } +} diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt index 8e9c452f..763f0656 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt @@ -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), + ) } } }