feat: basic persistent settings

This commit is contained in:
Cilly Leang 2026-01-24 00:37:57 +11:00
parent 61bb748925
commit 946429a2f5
Signed by: cilly
GPG key ID: 6500251E087653C9
6 changed files with 38 additions and 4 deletions

View file

@ -18,7 +18,7 @@ kotlin {
sourceSets { sourceSets {
commonMain.dependencies { commonMain.dependencies {
// Add any common dependencies here implementation(libs.settings)
} }
commonTest.dependencies { commonTest.dependencies {
implementation(libs.kotlin.test) implementation(libs.kotlin.test)

View file

@ -0,0 +1,16 @@
package moe.lava.neon.core
import com.russhwolf.settings.Settings
import com.russhwolf.settings.nullableString
import com.russhwolf.settings.string
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.SingleIn
@SingleIn(AppScope::class)
@Inject
class AppSettings {
private val settings = Settings()
var token by settings.nullableString()
}

View file

@ -1,9 +1,11 @@
package moe.lava.neon.core.di package moe.lava.neon.core.di
import com.russhwolf.settings.Settings
import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.DependencyGraph import dev.zacsweers.metro.DependencyGraph
import dev.zacsweers.metro.GraphExtension import dev.zacsweers.metro.GraphExtension
import dev.zacsweers.metro.SingleIn import dev.zacsweers.metro.SingleIn
import moe.lava.neon.core.AppSettings
import moe.lava.neon.core.repository.AuthRepository import moe.lava.neon.core.repository.AuthRepository
import moe.lava.neon.core.repository.UserRepository import moe.lava.neon.core.repository.UserRepository
@ -11,4 +13,5 @@ import moe.lava.neon.core.repository.UserRepository
interface AppGraph { interface AppGraph {
val auth: AuthRepository val auth: AuthRepository
val users: UserRepository val users: UserRepository
val settings: AppSettings
} }

View file

@ -0,0 +1,12 @@
package moe.lava.neon.core.di
import com.russhwolf.settings.Settings
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesTo
import dev.zacsweers.metro.Provides
@ContributesTo(AppScope::class)
interface Providers {
// @Provides
// fun providesSettings(): Settings = Settings()
}

View file

@ -3,14 +3,15 @@ package moe.lava.neon.core.repository
import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.Inject import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.SingleIn import dev.zacsweers.metro.SingleIn
import moe.lava.neon.core.AppSettings
@Inject @Inject
@SingleIn(AppScope::class) @SingleIn(AppScope::class)
class AuthRepository { class AuthRepository(private val settings: AppSettings) {
var token: String? = null var token by settings::token
private set private set
fun login(username: String, password: String) { suspend fun login(username: String, password: String) {
// api.login(username, password) // api.login(username, password)
} }
suspend fun login(token: String) { suspend fun login(token: String) {

View file

@ -20,6 +20,7 @@ kotlinx-coroutines = "1.10.2"
material3 = "1.10.0-alpha05" material3 = "1.10.0-alpha05"
material3-adaptive = "1.3.0-alpha03" material3-adaptive = "1.3.0-alpha03"
metro = "0.10.0" metro = "0.10.0"
settings = "1.3.0"
sqldelight = "2.2.1" sqldelight = "2.2.1"
[libraries] [libraries]
@ -47,6 +48,7 @@ compose-components-resources = { module = "org.jetbrains.compose.components:comp
compose-uiToolingPreview = { module = "org.jetbrains.compose.ui:ui-tooling-preview", version.ref = "composeMultiplatform" } compose-uiToolingPreview = { module = "org.jetbrains.compose.ui:ui-tooling-preview", version.ref = "composeMultiplatform" }
kotlinx-coroutinesSwing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "kotlinx-coroutines" } kotlinx-coroutinesSwing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "kotlinx-coroutines" }
metrox-viewmodel-compose = { module = "dev.zacsweers.metro:metrox-viewmodel-compose", version.ref = "metro" } metrox-viewmodel-compose = { module = "dev.zacsweers.metro:metrox-viewmodel-compose", version.ref = "metro" }
settings = { module = "com.russhwolf:multiplatform-settings-no-arg", version.ref = "settings" }
[plugins] [plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" } androidApplication = { id = "com.android.application", version.ref = "agp" }