From 4eed58cfe9ef87f270cb3ad4748cc48e023d2b40 Mon Sep 17 00:00:00 2001 From: LTFan Date: Sun, 21 Jan 2024 16:00:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E5=A4=9A=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E6=BB=9A=E5=8A=A8=E6=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-number.properties | 2 +- .../kotlin/data/components/RootComponent.kt | 10 +- .../data/components/root/SignInComponent.kt | 12 +- .../commonMain/kotlin/ui/pages/root/SignIn.kt | 141 ++++++++---------- 4 files changed, 77 insertions(+), 88 deletions(-) diff --git a/build-number.properties b/build-number.properties index cac07e5..327819d 100644 --- a/build-number.properties +++ b/build-number.properties @@ -15,4 +15,4 @@ # You should have received a copy of the GNU General Public License along # with Fhraise. If not, see . # -buildNumber=32 +buildNumber=34 diff --git a/composeApp/src/commonMain/kotlin/data/components/RootComponent.kt b/composeApp/src/commonMain/kotlin/data/components/RootComponent.kt index 3a388f6..b3d29c5 100644 --- a/composeApp/src/commonMain/kotlin/data/components/RootComponent.kt +++ b/composeApp/src/commonMain/kotlin/data/components/RootComponent.kt @@ -24,7 +24,10 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import com.arkivanov.decompose.ComponentContext -import com.arkivanov.decompose.router.stack.* +import com.arkivanov.decompose.router.stack.ChildStack +import com.arkivanov.decompose.router.stack.StackNavigation +import com.arkivanov.decompose.router.stack.childStack +import com.arkivanov.decompose.router.stack.pop import com.arkivanov.decompose.value.Value import com.arkivanov.essenty.backhandler.BackHandlerOwner import data.AppComponentContext @@ -95,12 +98,7 @@ class AppRootComponent( AppSignInComponent.ComponentState.SignIn( context = this, onGuestSignIn = {}, - onUsernameSignIn = {}, onFaceSignIn = {}, - onSignUp = { - navigation.push(Configuration.SignUp) - }, - onAdminSignIn = {}, ) }, ) diff --git a/composeApp/src/commonMain/kotlin/data/components/root/SignInComponent.kt b/composeApp/src/commonMain/kotlin/data/components/root/SignInComponent.kt index 1a5c526..993b31e 100644 --- a/composeApp/src/commonMain/kotlin/data/components/root/SignInComponent.kt +++ b/composeApp/src/commonMain/kotlin/data/components/root/SignInComponent.kt @@ -86,10 +86,9 @@ interface SignInComponent : AppComponentContext { } val onGuestSignIn: () -> Unit - val onUsernameSignIn: () -> Unit val onFaceSignIn: () -> Unit - val onSignUp: () -> Unit - val onAdminSignIn: () -> Unit + + fun onAdminSignIn() } interface SignUp : ComponentState, UsernamePasswordState { @@ -130,10 +129,7 @@ class AppSignInComponent( canInputVerifyCode: Boolean = false, showMoreSignInOptions: Boolean = false, override val onGuestSignIn: () -> Unit, - override val onUsernameSignIn: () -> Unit, override val onFaceSignIn: () -> Unit, - override val onSignUp: () -> Unit, - override val onAdminSignIn: () -> Unit, ) : ComponentState(context), SignInComponent.ComponentState.SignIn { private val phoneNumberRegex = Regex("^1(3(([0-3]|[5-9])[0-9]{8}|4[0-8][0-9]{7})|(45|5([0-2]|[5-6]|[8-9])|6(2|[5-7])|7([0-1]|[5-8])|8[0-9]|9([0-3]|[5-9]))[0-9]{8})$") @@ -213,6 +209,10 @@ class AppSignInComponent( override val onDone: KeyboardActionScope.() -> Unit = { submit() } + + override fun onAdminSignIn() { + // TODO + } } class SignUp( diff --git a/composeApp/src/commonMain/kotlin/ui/pages/root/SignIn.kt b/composeApp/src/commonMain/kotlin/ui/pages/root/SignIn.kt index 91d82b7..7865d60 100644 --- a/composeApp/src/commonMain/kotlin/ui/pages/root/SignIn.kt +++ b/composeApp/src/commonMain/kotlin/ui/pages/root/SignIn.kt @@ -481,82 +481,73 @@ fun SignInMainLayout( @Composable fun SignInComponent.ComponentState.SignIn.MoreMethods(modifier: Modifier = Modifier) { - Column(modifier = modifier.verticalScroll(state = rememberScrollState())) { - FilledTonalButton( - onClick = onGuestSignIn, - modifier = Modifier.fillMaxWidth(), - shape = MaterialTheme.shapes.large, - ) { - Icon( - imageVector = Icons.Default.NoAccounts, - contentDescription = null, - ) - Spacer(modifier = Modifier.width(8.dp)) - Text(text = "游客登录") - } - FilledTonalButton( - onClick = onUsernameSignIn, - modifier = Modifier.fillMaxWidth(), - shape = MaterialTheme.shapes.large, - ) { - Icon( - imageVector = Icons.Default.Person, - contentDescription = null, - ) - Spacer(modifier = Modifier.width(8.dp)) - Text(text = "用户名登录") - } - FilledTonalButton( - onClick = onFaceSignIn, - modifier = Modifier.fillMaxWidth(), - shape = MaterialTheme.shapes.large, - ) { - Icon( - imageVector = Icons.Default.Face, - contentDescription = null, - ) - Spacer(modifier = Modifier.width(8.dp)) - Text(text = "人脸登录") - } - FilledTonalButton( - onClick = onSignUp, - modifier = Modifier.fillMaxWidth(), - shape = MaterialTheme.shapes.large, - ) { - Icon( - imageVector = Icons.Default.PersonAdd, - contentDescription = null, - ) - Spacer(modifier = Modifier.width(8.dp)) - Text(text = "注册") - } - TextButton( - onClick = ::switchShowMoreSignInOptions, - modifier = Modifier.fillMaxWidth(), - shape = MaterialTheme.shapes.large, - ) { - Icon( - imageVector = Icons.Default.MoreHoriz, - contentDescription = null, - ) - Spacer(modifier = Modifier.width(8.dp)) - Text(text = "更多登录选项") - } - AnimatedVisibility( - visible = showMoreSignInOptions, - ) { - FilledTonalButton( - onClick = onAdminSignIn, - modifier = Modifier.fillMaxWidth(), - shape = MaterialTheme.shapes.large, - ) { - Icon( - imageVector = Icons.Default.AdminPanelSettings, - contentDescription = null, - ) - Spacer(modifier = Modifier.width(8.dp)) - Text(text = "管理员登录") + val scrollState = rememberScrollState() + + SubcomposeLayout { constraints -> + val buttons = subcompose("buttons") { + Column(modifier = modifier.verticalScroll(state = scrollState)) { + FilledTonalButton( + onClick = onGuestSignIn, + modifier = Modifier.fillMaxWidth(), + shape = MaterialTheme.shapes.large, + ) { + Icon( + imageVector = Icons.Default.NoAccounts, + contentDescription = null, + ) + Spacer(modifier = Modifier.width(8.dp)) + Text(text = "游客登录") + } + FilledTonalButton( + onClick = onFaceSignIn, + modifier = Modifier.fillMaxWidth(), + shape = MaterialTheme.shapes.large, + ) { + Icon( + imageVector = Icons.Default.Face, + contentDescription = null, + ) + Spacer(modifier = Modifier.width(8.dp)) + Text(text = "人脸登录") + } + TextButton( + onClick = ::switchShowMoreSignInOptions, + modifier = Modifier.fillMaxWidth(), + shape = MaterialTheme.shapes.large, + ) { + Icon( + imageVector = Icons.Default.MoreHoriz, + contentDescription = null, + ) + Spacer(modifier = Modifier.width(8.dp)) + Text(text = "更多登录选项") + } + AnimatedVisibility( + visible = showMoreSignInOptions, + ) { + FilledTonalButton( + onClick = ::onAdminSignIn, + modifier = Modifier.fillMaxWidth(), + shape = MaterialTheme.shapes.large, + ) { + Icon( + imageVector = Icons.Default.AdminPanelSettings, + contentDescription = null, + ) + Spacer(modifier = Modifier.width(8.dp)) + Text(text = "管理员登录") + } + } } + }.first().measure(constraints) + + val scrollBar = subcompose("scrollBar") { + VerticalScrollbar(scrollState = scrollState) + }.first().measure(Constraints.fixedHeight(buttons.height)) + + layout(buttons.width, buttons.height) { + buttons.placeRelative(0, 0) + scrollBar.placeRelative(buttons.width - scrollBar.width, 0) } } }