#1 Setings ist erledigt

This commit is contained in:
Hartmut Bauer committed 2026-02-06 16:40:40 +01:00
1 parent 632d7c34ef
commit 698490a6f8
8 files changed
+268 -164

No files matched your search

@@ -1,28 +1,9 @@
package net.keinekekse.app
//import org.koin.plugin.module.dsl.startKoin
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Text
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import net.keinekekse.app.auth.AuthResult
import net.keinekekse.app.auth.Authenticator
import net.keinekekse.app.books.di.KoinApp
import net.keinekekse.app.config.ConfigProperties
import net.keinekekse.app.config.Settings
import net.keinekekse.app.ui.ProgressIndicator
import org.koin.compose.koinInject
import org.koin.plugin.module.dsl.startKoin
//@PropertyValue("kc_server")
@@ -38,126 +19,118 @@ fun main() = application {
startKoin<KoinApp>()
val config: ConfigProperties = koinInject()
val settings: Settings = koinInject()
// val config: ConfigProperties = koinInject()
// val settings: Settings = koinInject()
// val settings: Settings = PreferencesSettings(delegate)
//
// settings.put("kc_server", "kec.keinekekse.net")
println("Properties: ${config["keycloakServer"]}")
println("Settings: ${settings.get("kc_server", "default")}")
// println(Preferences.userRoot())
// println("System properties:")
// System.getProperties().forEach { println("${it.key}=${it.value}") }
// println("")
// keycloakServer = "kec.keinekekse.net"
// keycloakRealm = "app-server-realm"
// keycloakClient = "pkce-book-app"
// settings.putInt("intValue", 42)
// val sett = settings.export()
// settings.putInt("intValue", 4242)
// println("Properties: ${config["keycloakServer"]}")
// println("Settings: ${settings.get("kc_server", "default")}")
// println(settings.export())
// settings.import(sett)
// println("Settings: ${settings.getInt("intValue", -1)}")
// val inj = koinInject<String>(named("AppString"))
val authResultState = remember { mutableStateOf<AuthResult?>(null) }
// val authResultState = remember { mutableStateOf<AuthResult?>(null) }
//
// val authenticator: Authenticator = koinInject()
val authenticator: Authenticator = koinInject()
LaunchedEffect(Unit) {
authResultState.value = withContext(Dispatchers.IO) {
// TODO - (~) Verständnis für App-Aufbau und DI
// - (x) das object muss global angelegt werden -> DI singleton
// - (x) globale Speicherung der Tokens
// - Tokens persistieren? Multiplatform! (evtl. library)
// - (x) globaler httpClient mit Konfig für Tokens -> DI
// - (x) Error-Handling: 401 -> refresh -> 401 -> reauth [implizit]
// Authenticator(
// "kec.keinekekse.net",
// "app-server-realm",
// "pkce-book-app",
// ).use {
val result = authenticator.authenticate()
when (result) {
is AuthResult.Success -> {
// println("Access Token: ${result.tokens?.accessToken}")
// println("Refresh Token: ${result.tokens?.refreshToken}")
// delay(3000)
/*
// klappt, gibt aber nicht mehr her, als ohnehin im Token steht
it.requestUserInfo(result.tokens!!.accessToken)
*/
/*
// funktioniert -> jetzt fehlt die DI-Mimik für die compose app
when (val res = it.requestRefreshToken(result.tokens)) {
is AuthResult.Success -> {
println("Access Token: ${res.tokens?.accessToken}")
println("Refresh Token: ${res.tokens?.refreshToken}")
}
is AuthResult.Error -> {
println("Refresh Token fehlgeschlagen ${res.code}: ${res.details ?: ""}")
}
is AuthResult.Fatal -> {
println("Refresh Token fehlgeschlagen ${res.code}: ${res.details ?: ""}")
}
}
*/
}
else -> {}
}
result
// }
}
}
// LaunchedEffect(Unit) {
// authResultState.value = withContext(Dispatchers.IO) {
// // TODO - (~) Verständnis für App-Aufbau und DI
// // - (x) das object muss global angelegt werden -> DI singleton
// // - (x) globale Speicherung der Tokens
// // - Tokens persistieren? Multiplatform! (evtl. library)
// // - (x) globaler httpClient mit Konfig für Tokens -> DI
// // - (x) Error-Handling: 401 -> refresh -> 401 -> reauth [implizit]
//
// val result = authenticator.authenticate()
//
// when (result) {
// is AuthResult.Success -> {
//// println("Access Token: ${result.tokens?.accessToken}")
//// println("Refresh Token: ${result.tokens?.refreshToken}")
//
//// delay(3000)
// /*
// // klappt, gibt aber nicht mehr her, als ohnehin im Token steht
// it.requestUserInfo(result.tokens!!.accessToken)
// */
// /*
// // funktioniert -> jetzt fehlt die DI-Mimik für die compose app
// when (val res = it.requestRefreshToken(result.tokens)) {
// is AuthResult.Success -> {
// println("Access Token: ${res.tokens?.accessToken}")
// println("Refresh Token: ${res.tokens?.refreshToken}")
// }
//
// is AuthResult.Error -> {
// println("Refresh Token fehlgeschlagen ${res.code}: ${res.details ?: ""}")
// }
//
// is AuthResult.Fatal -> {
// println("Refresh Token fehlgeschlagen ${res.code}: ${res.details ?: ""}")
//
// }
// }
// */
// }
//
// else -> {}
// }
//
// result
// // }
// }
// }
Window(
onCloseRequest = ::exitApplication,
title = "app",
) {
when (val result = authResultState.value) {
null -> {
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Text("Warten auf Anmeldung...")
// Icon(
// imageVector = Icons.Default.HourglassTop,
// contentDescription = "Home",
// modifier = Modifier.padding(top = 16.dp).size(32.dp)
// )
ProgressIndicator()
}
}
is AuthResult.Error -> {
// TODO show an error UI (and maybe a retry button)
Text("Fehler bei der Anmeldung: ${result.message} (${result.code})")
Text("Fehlerbeschreibung: ${result.details ?: ""}")
App()
// when (val result = authResultState.value) {
// null -> {
// Column(
// modifier = Modifier.fillMaxSize(),
// horizontalAlignment = Alignment.CenterHorizontally,
// verticalArrangement = Arrangement.Center
// ) {
// Text("Warten auf Anmeldung...")
//
//// Icon(
//// imageVector = Icons.Default.HourglassTop,
//// contentDescription = "Home",
//// modifier = Modifier.padding(top = 16.dp).size(32.dp)
//// )
// ProgressIndicator()
// }
// }
//
// is AuthResult.Error -> {
// // TODO show an error UI (and maybe a retry button)
// Text("Fehler bei der Anmeldung: ${result.message} (${result.code})")
// Text("Fehlerbeschreibung: ${result.details ?: ""}")
//// App()
// }
//
// is AuthResult.Fatal -> {
// Text("Fataler Fehler bei der Anmeldung: ${result.message} (${result.code})")
// Text("Fehlerbeschreibung: ${result.details ?: ""}")
// }
//
// is AuthResult.Success -> {
// val test = koinInject<TestAuth>()
// CoroutineScope(Dispatchers.Default).launch {
// println("requesting '/'")
// test.request("/")
// }
// App()
}
is AuthResult.Fatal -> {
Text("Fataler Fehler bei der Anmeldung: ${result.message} (${result.code})")
Text("Fehlerbeschreibung: ${result.details ?: ""}")
}
is AuthResult.Success -> {
val test = koinInject<TestAuth>()
CoroutineScope(Dispatchers.Default).launch {
println("requesting '/'")
test.request("/")
}
App()
}
}
// }
// }
}
}
//