diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersApp.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersApp.kt
index 0febc3df..a64680d5 100644
--- a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersApp.kt
+++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersApp.kt
@@ -1,11 +1,14 @@
package dev.msfjarvis.lobsters.ui.main
+import androidx.compose.animation.ExperimentalAnimationApi
+import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.BottomNavigation
import androidx.compose.material.BottomNavigationItem
import androidx.compose.material.Scaffold
import androidx.compose.material.Text
+import androidx.compose.material.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
@@ -13,6 +16,7 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.compose.KEY_ROUTE
import androidx.navigation.compose.NavHost
@@ -21,6 +25,7 @@ import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.navigate
import androidx.navigation.compose.rememberNavController
import androidx.paging.compose.collectAsLazyPagingItems
+import dev.msfjarvis.lobsters.R
import dev.msfjarvis.lobsters.ui.navigation.Destination
import dev.msfjarvis.lobsters.ui.posts.HottestPosts
import dev.msfjarvis.lobsters.ui.posts.SavedPosts
@@ -51,6 +56,12 @@ fun LobstersApp() {
}
Scaffold(
+ topBar = {
+ LobstersTopBar(
+ currentDestination = currentDestination,
+ reloadPosts = { viewModel.reloadPosts() },
+ )
+ },
bottomBar = {
LobstersBottomNav(
currentDestination,
@@ -80,6 +91,33 @@ fun LobstersApp() {
}
}
+@OptIn(ExperimentalAnimationApi::class)
+@Composable
+fun LobstersTopBar(
+ currentDestination: Destination,
+ reloadPosts: () -> Unit,
+) {
+ TopAppBar(
+ title = {
+ Text(
+ text = stringResource(id = R.string.app_name),
+ modifier = Modifier.padding(vertical = 8.dp),
+ )
+ },
+ actions = {
+ if (currentDestination == Destination.Hottest) {
+ IconResource(
+ resourceId = R.drawable.ic_refresh_24px,
+ contentDescription = stringResource(id = R.string.refresh_posts_content_description),
+ modifier = Modifier
+ .padding(horizontal = 8.dp, vertical = 8.dp)
+ .clickable { reloadPosts() },
+ )
+ }
+ }
+ )
+}
+
@Composable
fun LobstersBottomNav(
currentDestination: Destination,
diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt
index c4e2fd4a..b03ee7c8 100644
--- a/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt
+++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt
@@ -35,6 +35,10 @@ class LobstersViewModel @Inject constructor(
}.launchIn(viewModelScope)
}
+ fun reloadPosts() {
+ pagingSource.invalidate()
+ }
+
fun toggleSave(post: SavedPost) {
viewModelScope.launch {
val isSaved = lobstersRepository.isPostSaved(post.shortId)
diff --git a/app/src/main/res/drawable/ic_refresh_24px.xml b/app/src/main/res/drawable/ic_refresh_24px.xml
new file mode 100644
index 00000000..843368df
--- /dev/null
+++ b/app/src/main/res/drawable/ic_refresh_24px.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 94b2c294..c6140868 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -8,4 +8,5 @@
%1$s\'s avatar
Add to saved posts
Remove from saved posts
+ Refresh posts