Basic signin refine

This commit is contained in:
tarsin committed 2023-01-11 07:58:40 +08:00
1 parent 777a8ffeaa
commit 167185ef45
2 files changed
+119 -7

No files matched your search

@@ -3,6 +3,7 @@ package com.hippo.ehviewer.ui
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.navigation.ActivityNavigator
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
@@ -37,6 +38,11 @@ class LoginActivity : ComponentActivity() {
}
}
override fun finish() {
super.finish()
ActivityNavigator.applyPopAnimationsToPendingTransition(this)
}
companion object {
const val SIGN_IN_ROUTE_NAME = "SignIn"
const val WEBVIEW_SIGN_IN_ROUTE_NAME = "WebViewSignIn"
@@ -11,6 +11,7 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
@@ -26,19 +27,90 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.hippo.ehviewer.R
import com.hippo.ehviewer.Settings
import com.hippo.ehviewer.UrlOpener
import com.hippo.ehviewer.client.EhClient
import com.hippo.ehviewer.client.EhUrl
import com.hippo.ehviewer.client.EhUtils
import com.hippo.ehviewer.ui.scene.getProfile
import com.hippo.util.ExceptionUtils
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.withUIContext
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.Job
import rikka.core.util.ContextUtils.requireActivity
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SignInScreen() {
val coroutineScope = rememberCoroutineScope()
val isProgressIndicatorVisible by remember { mutableStateOf(false) }
val focusManager = LocalFocusManager.current
var isProgressIndicatorVisible by remember { mutableStateOf(false) }
val labelUsername = stringResource(R.string.username)
val labelPassword = stringResource(R.string.password)
val errorTextUsername = stringResource(R.string.error_username_cannot_empty)
val errorTextPasswd = stringResource(R.string.error_password_cannot_empty)
var showUsernameError by remember { mutableStateOf(false) }
var showPasswordError by remember { mutableStateOf(false) }
var showErrorDialog by remember { mutableStateOf(false) }
var loginErrorException by remember { mutableStateOf<Throwable?>(null) }
var username by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") }
val context = LocalContext.current
var signInJob by remember { mutableStateOf<Job?>(null) }
// Basic login request
val signIn = remember {
return@remember lambda@{
if (signInJob?.isActive == true) return@lambda
if (username.isEmpty()) {
showUsernameError = true
return@lambda
} else {
showUsernameError = false
}
if (password.isEmpty()) {
showPasswordError = true
return@lambda
} else {
showPasswordError = false
}
focusManager.clearFocus()
isProgressIndicatorVisible = true
EhUtils.signOut()
signInJob = coroutineScope.launchIO {
runCatching {
(EhClient.execute(EhClient.METHOD_SIGN_IN, username, password) as String).let {
Settings.putDisplayName(it)
}
}.onFailure {
it.printStackTrace()
withUIContext {
focusManager.clearFocus()
isProgressIndicatorVisible = false
showErrorDialog = true
loginErrorException = it
}
}.onSuccess {
// This composable is to be finished
GlobalScope.launchIO {
getProfile()
}
withUIContext {
// navigate to selectSite
}
}
}
}
}
Box(
contentAlignment = Alignment.Center
@@ -61,9 +133,10 @@ fun SignInScreen() {
onValueChange = { username = it },
Modifier.width(dimensionResource(id = R.dimen.single_max_width)),
label = {
Text(text = stringResource(id = R.string.username))
Text(text = if (!showUsernameError) labelUsername else errorTextUsername)
},
singleLine = true
singleLine = true,
isError = showUsernameError
)
OutlinedTextField(
@@ -71,9 +144,10 @@ fun SignInScreen() {
onValueChange = { password = it },
Modifier.width(dimensionResource(id = R.dimen.single_max_width)),
label = {
Text(text = stringResource(id = R.string.password))
Text(text = if (!showPasswordError) labelPassword else errorTextPasswd)
},
singleLine = true
singleLine = true,
isError = showPasswordError
)
Text(
@@ -87,7 +161,13 @@ fun SignInScreen() {
Row {
OutlinedButton(
onClick = { /*TODO*/ },
onClick = {
UrlOpener.openUrl(
requireActivity(context),
EhUrl.URL_REGISTER,
false
)
},
Modifier
.weight(1f)
.padding(horizontal = 4.dp)
@@ -96,7 +176,7 @@ fun SignInScreen() {
}
Button(
onClick = { /*TODO*/ },
onClick = signIn,
Modifier
.weight(1f)
.padding(horizontal = 4.dp)
@@ -132,5 +212,31 @@ fun SignInScreen() {
if (isProgressIndicatorVisible) {
CircularProgressIndicator()
}
if (showErrorDialog) {
AlertDialog(
onDismissRequest = {
showErrorDialog = false
},
confirmButton = {
TextButton(onClick = {
showErrorDialog = false
}) {
Text(text = stringResource(id = R.string.get_it))
}
},
title = {
Text(text = stringResource(id = R.string.sign_in_failed))
},
text = {
Text(
text =
"""
${ExceptionUtils.getReadableString(loginErrorException!!)}
${stringResource(R.string.sign_in_failed_tip)}
""".trimIndent()
)
}
)
}
}
}