diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/MainActivity.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/MainActivity.kt index 2274bc07..64e55a9c 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/MainActivity.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/MainActivity.kt @@ -4,21 +4,31 @@ import android.os.Bundle import androidx.activity.compose.setContent import androidx.appcompat.app.AppCompatActivity import androidx.compose.foundation.isSystemInDarkTheme -import dev.msfjarvis.claw.common.posts.LobstersItem -import dev.msfjarvis.claw.common.posts.TEST_POST +import androidx.paging.Pager +import androidx.paging.PagingConfig +import androidx.paging.compose.collectAsLazyPagingItems +import dagger.hilt.android.AndroidEntryPoint +import dev.msfjarvis.claw.android.paging.LobstersPagingSource +import dev.msfjarvis.claw.android.ui.NetworkPosts +import dev.msfjarvis.claw.api.LobstersApi import dev.msfjarvis.claw.common.theme.LobstersTheme +import dev.msfjarvis.claw.common.urllauncher.UrlLauncher +import javax.inject.Inject +@AndroidEntryPoint class MainActivity : AppCompatActivity() { + @Inject lateinit var api: LobstersApi + @Inject lateinit var urlLauncher: UrlLauncher + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + val pager = Pager(PagingConfig(20)) { LobstersPagingSource(api::getHottestPosts) } setContent { LobstersTheme(darkTheme = isSystemInDarkTheme()) { - LobstersItem( - post = TEST_POST, - isSaved = false, - {}, - {}, - {}, + val items = pager.flow.collectAsLazyPagingItems() + NetworkPosts( + items = items, + urlLauncher = urlLauncher, ) } } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ext/database.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ext/database.kt new file mode 100644 index 00000000..89cac5f5 --- /dev/null +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ext/database.kt @@ -0,0 +1,18 @@ +package dev.msfjarvis.claw.android.ext + +import dev.msfjarvis.claw.api.model.LobstersPost +import dev.msfjarvis.claw.database.local.SavedPost + +/** Convert a [LobstersPost] object returned by the API into a [SavedPost] for persistence. */ +fun LobstersPost.toDbModel(): SavedPost { + return SavedPost( + shortId = shortId, + title = title, + url = url, + createdAt = createdAt, + commentsUrl = commentsUrl, + submitterName = submitter.username, + submitterAvatarUrl = submitter.avatarUrl, + tags = tags, + ) +} diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/NetworkPosts.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/NetworkPosts.kt new file mode 100644 index 00000000..c07d952d --- /dev/null +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/NetworkPosts.kt @@ -0,0 +1,30 @@ +package dev.msfjarvis.claw.android.ui + +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.runtime.Composable +import androidx.paging.compose.LazyPagingItems +import androidx.paging.compose.items +import dev.msfjarvis.claw.android.ext.toDbModel +import dev.msfjarvis.claw.api.model.LobstersPost +import dev.msfjarvis.claw.common.posts.LobstersItem +import dev.msfjarvis.claw.common.urllauncher.UrlLauncher + +@Composable +fun NetworkPosts( + items: LazyPagingItems, + urlLauncher: UrlLauncher, +) { + LazyColumn { + items(items) { item -> + if (item != null) { + LobstersItem( + post = item.toDbModel(), + isSaved = false, + viewPost = { urlLauncher.launch(item.url.ifEmpty { item.commentsUrl }) }, + viewComments = { urlLauncher.launch(item.commentsUrl) }, + toggleSave = {}, + ) + } + } + } +}