mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-16 19:47:02 +05:30
104 lines
3.5 KiB
Kotlin
104 lines
3.5 KiB
Kotlin
import androidx.compose.foundation.isSystemInDarkTheme
|
|
import androidx.compose.foundation.layout.Box
|
|
import androidx.compose.foundation.layout.fillMaxHeight
|
|
import androidx.compose.foundation.layout.fillMaxSize
|
|
import androidx.compose.foundation.layout.padding
|
|
import androidx.compose.foundation.lazy.LazyColumn
|
|
import androidx.compose.foundation.lazy.rememberLazyListState
|
|
import androidx.compose.foundation.rememberScrollbarAdapter
|
|
import androidx.compose.runtime.remember
|
|
import androidx.compose.runtime.rememberCoroutineScope
|
|
import androidx.compose.ui.Alignment
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.platform.LocalUriHandler
|
|
import androidx.compose.ui.unit.dp
|
|
import androidx.compose.ui.window.WindowPlacement
|
|
import androidx.compose.ui.window.WindowPosition
|
|
import androidx.compose.ui.window.rememberWindowState
|
|
import dev.msfjarvis.claw.api.LobstersApi
|
|
import dev.msfjarvis.claw.common.posts.LobstersCard
|
|
import dev.msfjarvis.claw.common.posts.PostActions
|
|
import dev.msfjarvis.claw.common.posts.toDbModel
|
|
import dev.msfjarvis.claw.common.theme.DarkThemeColors
|
|
import dev.msfjarvis.claw.common.theme.LightThemeColors
|
|
import dev.msfjarvis.claw.common.theme.LobstersTheme
|
|
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
|
|
import dev.msfjarvis.claw.database.local.SavedPost
|
|
import org.pushingpixels.aurora.component.AuroraVerticalScrollbar
|
|
import org.pushingpixels.aurora.theming.ceruleanSkin
|
|
import org.pushingpixels.aurora.window.AuroraWindow
|
|
import org.pushingpixels.aurora.window.auroraApplication
|
|
|
|
fun main() = auroraApplication {
|
|
val paging = Paging(rememberCoroutineScope())
|
|
val items = paging.pagingData.collectAsLazyPagingItems()
|
|
val urlLauncher = UrlLauncher()
|
|
val state =
|
|
rememberWindowState(
|
|
placement = WindowPlacement.Floating,
|
|
position = WindowPosition.Aligned(Alignment.Center),
|
|
)
|
|
val postActions = remember {
|
|
object : PostActions {
|
|
override fun viewPost(postUrl: String, commentsUrl: String) {
|
|
urlLauncher.openUri(postUrl.ifEmpty { commentsUrl })
|
|
}
|
|
|
|
override fun viewComments(postId: String) {
|
|
urlLauncher.openUri("${LobstersApi.BASE_URL}/s/${postId}")
|
|
}
|
|
|
|
override fun viewCommentsPage(commentsUrl: String) {
|
|
urlLauncher.openUri(commentsUrl)
|
|
}
|
|
|
|
override fun toggleSave(post: SavedPost) {}
|
|
}
|
|
}
|
|
AuroraWindow(
|
|
skin = ceruleanSkin(),
|
|
title = "Claw",
|
|
state = state,
|
|
undecorated = true,
|
|
onCloseRequest = ::exitApplication,
|
|
) {
|
|
val colorScheme =
|
|
if (isSystemInDarkTheme()) {
|
|
DarkThemeColors
|
|
} else {
|
|
LightThemeColors
|
|
}
|
|
LobstersTheme(
|
|
colorScheme = colorScheme,
|
|
providedValues = arrayOf(LocalUriHandler provides urlLauncher),
|
|
) {
|
|
Box(
|
|
modifier = Modifier.fillMaxSize(),
|
|
) {
|
|
val listState = rememberLazyListState()
|
|
if (items.itemCount == 0) {
|
|
Box(modifier = Modifier.fillMaxSize())
|
|
} else {
|
|
LazyColumn(
|
|
state = listState,
|
|
) {
|
|
items(items) { item ->
|
|
if (item != null) {
|
|
LobstersCard(
|
|
post = item.toDbModel(),
|
|
isSaved = false,
|
|
postActions = postActions,
|
|
modifier = Modifier.padding(bottom = 16.dp, start = 16.dp, end = 16.dp),
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
AuroraVerticalScrollbar(
|
|
adapter = rememberScrollbarAdapter(listState),
|
|
modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(),
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|