diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 43062b2a..ff2dbb07 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -15,6 +15,7 @@
+
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index d18bfd3f..adc18efd 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -21,5 +21,15 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 5a0aa43e..4f7b3df0 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -9,13 +9,6 @@ plugins {
`core-library-desugaring`
}
-repositories {
- // kotlinx-collections-immutable-jvm used by Compose is stored here.
- maven("https://dl.bintray.com/kotlin/kotlinx") {
- name = "KotlinX Bintray"
- }
-}
-
android {
defaultConfig {
applicationId = "dev.msfjarvis.lobsters"
diff --git a/buildSrc/src/main/java/BaseProjectConfig.kt b/buildSrc/src/main/java/BaseProjectConfig.kt
index c7c02b8b..6bede5ad 100644
--- a/buildSrc/src/main/java/BaseProjectConfig.kt
+++ b/buildSrc/src/main/java/BaseProjectConfig.kt
@@ -11,6 +11,7 @@ import org.gradle.api.tasks.Delete
import org.gradle.api.tasks.testing.Test
import org.gradle.api.tasks.testing.logging.TestLogEvent
import org.gradle.api.tasks.wrapper.Wrapper
+import org.gradle.kotlin.dsl.maven
import org.gradle.kotlin.dsl.register
import org.gradle.kotlin.dsl.repositories
import org.gradle.kotlin.dsl.withType
@@ -39,6 +40,18 @@ internal fun Project.configureForAllProjects() {
repositories {
google()
mavenCentral()
+ jcenter {
+ content {
+ includeGroup("org.jetbrains.compose.*")
+ }
+ }
+ maven("https://dl.bintray.com/kotlin/kotlinx") {
+ name = "KotlinX Bintray"
+ content {
+ includeModule("org.jetbrains.kotlinx", "kotlinx-collections-immutable")
+ includeModule("org.jetbrains.kotlinx", "kotlinx-collections-immutable-jvm")
+ }
+ }
}
tasks.withType {
kotlinOptions {
diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt
index d700b6a6..42c34ee9 100644
--- a/buildSrc/src/main/java/Dependencies.kt
+++ b/buildSrc/src/main/java/Dependencies.kt
@@ -25,6 +25,7 @@ object Dependencies {
private const val version = "1.4.3"
const val android = "org.jetbrains.kotlinx:kotlinx-coroutines-android:$version"
const val core = "org.jetbrains.kotlinx:kotlinx-coroutines-core:$version"
+ const val jvmCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:$version"
}
}
diff --git a/desktop/build.gradle.kts b/desktop/build.gradle.kts
new file mode 100644
index 00000000..45033f0a
--- /dev/null
+++ b/desktop/build.gradle.kts
@@ -0,0 +1,26 @@
+import org.jetbrains.compose.compose
+
+plugins {
+ kotlin("jvm")
+ id("org.jetbrains.compose") version "0.4.0-build173"
+ `lobsters-plugin`
+}
+
+repositories {
+ maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
+}
+
+dependencies {
+ implementation(project(":api"))
+ implementation(project(":database"))
+ implementation(compose.desktop.currentOs)
+ implementation(compose.runtime)
+ implementation(compose.material)
+ implementation(Dependencies.Kotlin.Coroutines.jvmCore)
+}
+
+compose.desktop {
+ application {
+ mainClass = "MainKt"
+ }
+}
diff --git a/desktop/src/main/kotlin/LobstersItem.kt b/desktop/src/main/kotlin/LobstersItem.kt
new file mode 100644
index 00000000..9d3e7154
--- /dev/null
+++ b/desktop/src/main/kotlin/LobstersItem.kt
@@ -0,0 +1,31 @@
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.requiredHeight
+import androidx.compose.material.Surface
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import dev.msfjarvis.lobsters.data.local.SavedPost
+import java.awt.Desktop
+import java.net.URI
+
+@Composable
+fun LobstersItem(
+ post: SavedPost,
+) {
+ Surface(
+ modifier = Modifier
+ .fillMaxWidth()
+ .requiredHeight(48.dp)
+ .clickable {
+ if (Desktop.isDesktopSupported() && Desktop.getDesktop()
+ .isSupported(Desktop.Action.BROWSE)
+ ) {
+ Desktop.getDesktop().browse(URI(post.url))
+ }
+ }
+ ) {
+ Text(post.title)
+ }
+}
diff --git a/desktop/src/main/kotlin/Main.kt b/desktop/src/main/kotlin/Main.kt
new file mode 100644
index 00000000..153bb276
--- /dev/null
+++ b/desktop/src/main/kotlin/Main.kt
@@ -0,0 +1,49 @@
+import androidx.compose.desktop.Window
+import androidx.compose.foundation.VerticalScrollbar
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.rememberScrollbarAdapter
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import dev.msfjarvis.lobsters.data.local.SavedPost
+
+val TEST_POST = SavedPost(
+ shortId = "zqyydb",
+ title = "k2k20 hackathon report: Bob Beck on LibreSSL progress",
+ url = "https://undeadly.org/cgi?action=article;sid=20200921105847",
+ createdAt = "2020-09-21T07:11:14.000-05:00",
+ commentsUrl = "https://lobste.rs/s/zqyydb/k2k20_hackathon_report_bob_beck_on",
+ submitterName = "Vigdis",
+ submitterAvatarUrl = "/avatars/Vigdis-100.png",
+ tags = listOf("openbsd", "linux", "containers", "hack the planet", "no thanks"),
+)
+
+@OptIn(ExperimentalStdlibApi::class)
+fun main() = Window(title = "Claw for lobste.rs") {
+ LobstersTheme {
+ Box(
+ modifier = Modifier.fillMaxSize(),
+ ) {
+ val stateVertical = rememberScrollState(0)
+ Box(
+ modifier = Modifier
+ .fillMaxSize()
+ .verticalScroll(stateVertical),
+ ) {
+ Column {
+ repeat(50) {
+ LobstersItem(TEST_POST)
+ }
+ }
+ }
+ VerticalScrollbar(
+ modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(),
+ adapter = rememberScrollbarAdapter(stateVertical),
+ )
+ }
+ }
+}
diff --git a/desktop/src/main/kotlin/Theme.kt b/desktop/src/main/kotlin/Theme.kt
new file mode 100644
index 00000000..512628b7
--- /dev/null
+++ b/desktop/src/main/kotlin/Theme.kt
@@ -0,0 +1,42 @@
+@file:Suppress("UNUSED")
+
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.darkColors
+import androidx.compose.material.lightColors
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+
+val titleColor = Color(0xFF7395D9)
+
+val lightColors = lightColors(
+ primary = Color.White,
+ secondary = Color(0xFF6C0000),
+ background = Color.White,
+ surface = Color.White,
+ onPrimary = Color.DarkGray,
+ onSecondary = Color.White,
+ onBackground = Color.White,
+ onSurface = Color.White,
+)
+
+val darkColors = darkColors(
+ primary = Color.White,
+ secondary = Color(0xFF6C0000),
+ background = Color.Black,
+ surface = Color.Black,
+ onPrimary = Color.Black,
+ onSecondary = Color.White,
+ onBackground = Color.White,
+ onSurface = Color.White,
+)
+
+@Composable
+fun LobstersTheme(
+ useLightColors: Boolean = true,
+ children: @Composable () -> Unit
+) {
+ MaterialTheme(
+ colors = if (useLightColors) lightColors else darkColors,
+ content = children,
+ )
+}
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 704d0a6e..c47242d3 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -1,9 +1,10 @@
rootProject.name = "Claw"
-include(":app", ":api", ":database")
+include(":app", ":api", ":database", ":desktop")
enableFeaturePreview("GRADLE_METADATA")
pluginManagement {
repositories {
google()
gradlePluginPortal()
+ maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
}
}