#1 Setings ist erledigt
This commit is contained in:
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()
|
||||
}
|
||||
}
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
//
|
||||
|
||||
Reference in new issue
Block a user