From 37dcd192274432892133b63b99dd6a12f70abad8 Mon Sep 17 00:00:00 2001 From: AllenTom Date: Thu, 5 Sep 2024 23:30:37 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E7=99=BB=E5=BD=95=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E9=A1=B5=E9=9D=A2UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 提取ActionButton组件以复用 - 提取TextInputField组件以复用 - 更新Profile页面布局 - 更新ChangePasswordScreen页面布局 - 更新EmailSignup页面布局 - 更新UserAuth页面布局 - 更新Signup页面布局 - 更新Login页面布局 --- .../riderpro/ui/account/changepassword.kt | 141 ++++++++++++------ .../riderpro/ui/composables/ActionButton.kt | 48 ++++++ .../riderpro/ui/composables/TextInputField.kt | 125 ++++++++++++++++ .../riderpro/ui/index/tabs/profile/Profile.kt | 76 ++++++---- .../aiosman/riderpro/ui/login/emailsignup.kt | 2 + .../com/aiosman/riderpro/ui/login/login.kt | 37 +---- .../com/aiosman/riderpro/ui/login/signup.kt | 8 +- .../com/aiosman/riderpro/ui/login/userauth.kt | 74 +-------- .../res/mipmap-hdpi/rider_pro_btn_bg_grey.png | Bin 0 -> 2396 bytes .../mipmap-hdpi/rider_pro_change_password.png | Bin 0 -> 708 bytes .../res/mipmap-hdpi/rider_pro_input_error.png | Bin 0 -> 333 bytes .../main/res/mipmap-hdpi/rider_pro_logout.png | Bin 0 -> 909 bytes .../res/mipmap-mdpi/rider_pro_btn_bg_grey.png | Bin 0 -> 1425 bytes .../mipmap-mdpi/rider_pro_change_password.png | Bin 0 -> 445 bytes .../res/mipmap-mdpi/rider_pro_input_error.png | Bin 0 -> 197 bytes .../main/res/mipmap-mdpi/rider_pro_logout.png | Bin 0 -> 520 bytes .../mipmap-xhdpi/rider_pro_btn_bg_grey.png | Bin 0 -> 3070 bytes .../rider_pro_change_password.png | Bin 0 -> 844 bytes .../mipmap-xhdpi/rider_pro_input_error.png | Bin 0 -> 390 bytes .../res/mipmap-xhdpi/rider_pro_logout.png | Bin 0 -> 1139 bytes .../mipmap-xxhdpi/rider_pro_btn_bg_grey.png | Bin 0 -> 5421 bytes .../rider_pro_change_password.png | Bin 0 -> 1393 bytes .../mipmap-xxhdpi/rider_pro_input_error.png | Bin 0 -> 640 bytes .../res/mipmap-xxhdpi/rider_pro_logout.png | Bin 0 -> 1837 bytes .../mipmap-xxxhdpi/rider_pro_btn_bg_grey.png | Bin 0 -> 7365 bytes .../rider_pro_change_password.png | Bin 0 -> 1741 bytes .../mipmap-xxxhdpi/rider_pro_input_error.png | Bin 0 -> 700 bytes .../res/mipmap-xxxhdpi/rider_pro_logout.png | Bin 0 -> 2416 bytes 28 files changed, 325 insertions(+), 186 deletions(-) create mode 100644 app/src/main/java/com/aiosman/riderpro/ui/composables/ActionButton.kt create mode 100644 app/src/main/java/com/aiosman/riderpro/ui/composables/TextInputField.kt create mode 100644 app/src/main/res/mipmap-hdpi/rider_pro_btn_bg_grey.png create mode 100644 app/src/main/res/mipmap-hdpi/rider_pro_change_password.png create mode 100644 app/src/main/res/mipmap-hdpi/rider_pro_input_error.png create mode 100644 app/src/main/res/mipmap-hdpi/rider_pro_logout.png create mode 100644 app/src/main/res/mipmap-mdpi/rider_pro_btn_bg_grey.png create mode 100644 app/src/main/res/mipmap-mdpi/rider_pro_change_password.png create mode 100644 app/src/main/res/mipmap-mdpi/rider_pro_input_error.png create mode 100644 app/src/main/res/mipmap-mdpi/rider_pro_logout.png create mode 100644 app/src/main/res/mipmap-xhdpi/rider_pro_btn_bg_grey.png create mode 100644 app/src/main/res/mipmap-xhdpi/rider_pro_change_password.png create mode 100644 app/src/main/res/mipmap-xhdpi/rider_pro_input_error.png create mode 100644 app/src/main/res/mipmap-xhdpi/rider_pro_logout.png create mode 100644 app/src/main/res/mipmap-xxhdpi/rider_pro_btn_bg_grey.png create mode 100644 app/src/main/res/mipmap-xxhdpi/rider_pro_change_password.png create mode 100644 app/src/main/res/mipmap-xxhdpi/rider_pro_input_error.png create mode 100644 app/src/main/res/mipmap-xxhdpi/rider_pro_logout.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/rider_pro_btn_bg_grey.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/rider_pro_change_password.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/rider_pro_input_error.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/rider_pro_logout.png diff --git a/app/src/main/java/com/aiosman/riderpro/ui/account/changepassword.kt b/app/src/main/java/com/aiosman/riderpro/ui/account/changepassword.kt index 1f3a277..d965076 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/account/changepassword.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/account/changepassword.kt @@ -1,12 +1,30 @@ -import androidx.compose.foundation.layout.* -import androidx.compose.material3.* -import androidx.compose.runtime.* +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import com.aiosman.riderpro.LocalNavController +import com.aiosman.riderpro.R import com.aiosman.riderpro.data.AccountService import com.aiosman.riderpro.data.AccountServiceImpl +import com.aiosman.riderpro.ui.comment.NoticeScreenHeader +import com.aiosman.riderpro.ui.composables.ActionButton +import com.aiosman.riderpro.ui.composables.StatusBarSpacer +import com.aiosman.riderpro.ui.composables.TextInputField import kotlinx.coroutines.launch /** @@ -37,60 +55,93 @@ fun ChangePasswordScreen() { var errorMessage by remember { mutableStateOf("") } val scope = rememberCoroutineScope() val navController = LocalNavController.current - Scaffold { paddingValues -> - Column( - modifier = Modifier - .fillMaxSize() - .padding(paddingValues), - verticalArrangement = Arrangement.Center + var oldPasswordError by remember { mutableStateOf(null) } + var confirmPasswordError by remember { mutableStateOf(null) } + var passwordError by remember { mutableStateOf(null) } + fun validate(): Boolean { + oldPasswordError = + if (currentPassword.isEmpty()) "Please enter your current password" else null + passwordError = when { + newPassword.length < 8 -> "Password must be at least 8 characters long" + !newPassword.any { it.isDigit() } -> "Password must contain at least one digit" + !newPassword.any { it.isUpperCase() } -> "Password must contain at least one uppercase letter" + !newPassword.any { it.isLowerCase() } -> "Password must contain at least one lowercase letter" + else -> null + } + confirmPasswordError = + if (newPassword != confirmPassword) "Passwords do not match" else null + return passwordError == null && confirmPasswordError == null && oldPasswordError == null + } + Column( + modifier = Modifier + .fillMaxSize() + .background(Color.White), + horizontalAlignment = Alignment.CenterHorizontally + ) { + StatusBarSpacer() + Box( + modifier = Modifier.padding(horizontal = 24.dp, vertical = 16.dp) ) { - TextField( - value = currentPassword, + NoticeScreenHeader( + title = "Change password", + moreIcon = false + ) + + } + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp) + ) { + Spacer(modifier = Modifier.height(80.dp)) + TextInputField( + text = currentPassword, onValueChange = { currentPassword = it }, - label = { Text("Current Password") }, - visualTransformation = PasswordVisualTransformation(), - modifier = Modifier.fillMaxWidth() + password = true, + label = "Current password", + hint = "Enter your current password", + error = oldPasswordError ) - Spacer(modifier = Modifier.height(16.dp)) - TextField( - value = newPassword, + Spacer(modifier = Modifier.height(24.dp)) + TextInputField( + text = newPassword, onValueChange = { newPassword = it }, - label = { Text("New Password") }, - visualTransformation = PasswordVisualTransformation(), - modifier = Modifier.fillMaxWidth() + password = true, + label = "New password", + hint = "Enter your new password", + error = passwordError ) - Spacer(modifier = Modifier.height(16.dp)) - TextField( - value = confirmPassword, + Spacer(modifier = Modifier.height(24.dp)) + TextInputField( + text = confirmPassword, onValueChange = { confirmPassword = it }, - label = { Text("Confirm New Password") }, - visualTransformation = PasswordVisualTransformation(), - modifier = Modifier.fillMaxWidth() + password = true, + label = "Confirm new password", + hint = "Enter your new password again", + error = confirmPasswordError ) - Spacer(modifier = Modifier.height(16.dp)) - if (errorMessage.isNotEmpty()) { - Text( - text = errorMessage, - color = MaterialTheme.colorScheme.error, - modifier = Modifier.padding(bottom = 16.dp) - ) - } - Button( - onClick = { - if (newPassword == confirmPassword) { - scope.launch { + Spacer(modifier = Modifier.height(80.dp)) + ActionButton( + modifier = Modifier + .width(345.dp) + .height(48.dp), + text = "LET'S RIDE".uppercase(), + backgroundImage = R.mipmap.rider_pro_signup_red_bg + ) { + if (validate()) { + scope.launch { + try { viewModel.changePassword(currentPassword, newPassword) navController.popBackStack() + } catch (e: Exception) { + errorMessage = e.message ?: "An error occurred" } - } else { - errorMessage = "Passwords do not match" } - }, - modifier = Modifier.fillMaxWidth() - ) { - Text("Change Password") + } } } + } } \ No newline at end of file diff --git a/app/src/main/java/com/aiosman/riderpro/ui/composables/ActionButton.kt b/app/src/main/java/com/aiosman/riderpro/ui/composables/ActionButton.kt new file mode 100644 index 0000000..2fa0910 --- /dev/null +++ b/app/src/main/java/com/aiosman/riderpro/ui/composables/ActionButton.kt @@ -0,0 +1,48 @@ +package com.aiosman.riderpro.ui.composables + +import androidx.annotation.DrawableRes +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp +import com.aiosman.riderpro.ui.modifiers.noRippleClickable + +@Composable +fun ActionButton( + modifier: Modifier, + text: String, + color: Color = Color.White, + @DrawableRes backgroundImage: Int, + leading: @Composable (() -> Unit)? = null, + click: () -> Unit = {} +) { + Box( + modifier = modifier.noRippleClickable { + click() + } + ) { + Image( + painter = painterResource(id = backgroundImage), + contentDescription = "Rider Pro", + modifier = Modifier.fillMaxSize(), + contentScale = ContentScale.FillBounds + ) + Row( + modifier = Modifier.align(Alignment.Center), + verticalAlignment = Alignment.CenterVertically + ) { + leading?.invoke() + Text(text, fontSize = 16.sp, color = color, fontWeight = FontWeight.W400) + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/aiosman/riderpro/ui/composables/TextInputField.kt b/app/src/main/java/com/aiosman/riderpro/ui/composables/TextInputField.kt new file mode 100644 index 0000000..b738685 --- /dev/null +++ b/app/src/main/java/com/aiosman/riderpro/ui/composables/TextInputField.kt @@ -0,0 +1,125 @@ +package com.aiosman.riderpro.ui.composables + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.input.VisualTransformation +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.aiosman.riderpro.R +import com.aiosman.riderpro.ui.modifiers.noRippleClickable + +@Composable +fun TextInputField( + modifier: Modifier = Modifier, + text: String, + onValueChange: (String) -> Unit, + password: Boolean = false, + label: String? = null, + hint: String? = null, + error: String? = null +) { + var showPassword by remember { mutableStateOf(!password) } + var isFocused by remember { mutableStateOf(false) } + Column(modifier = modifier) { + label?.let { + Text(it, color = Color(0xFFCCCCCC)) + Spacer(modifier = Modifier.height(16.dp)) + } + Box( + contentAlignment = Alignment.CenterStart + ) { + Row { + BasicTextField( + value = text, + onValueChange = onValueChange, + modifier = Modifier + .weight(1f) + .onFocusChanged { focusState -> + isFocused = focusState.isFocused + }, + textStyle = TextStyle( + fontSize = 16.sp, + fontWeight = FontWeight.W500, + color = Color(0xff333333) + ), + keyboardOptions = KeyboardOptions( + keyboardType = if (password) KeyboardType.Password else KeyboardType.Text + ), + visualTransformation = if (showPassword) VisualTransformation.None else PasswordVisualTransformation(), + singleLine = true, + ) + if (password) { + Image( + painter = painterResource(id = R.drawable.rider_pro_eye), + contentDescription = "Password", + modifier = Modifier + .size(24.dp) + .noRippleClickable { + showPassword = !showPassword + }, + colorFilter = ColorFilter.tint(Color.Black) + ) + } + } + + if (text.isEmpty()) { + hint?.let { + Text(it, color = Color(0xFFCCCCCC), fontWeight = FontWeight.W600) + } + } + } + Spacer(modifier = Modifier.height(16.dp)) + Box( + modifier = Modifier + .fillMaxWidth() + .height(1.dp) + .background(if (isFocused) Color(0xff333333) else Color(0xFFF5F5F5)) + + ) + Spacer(modifier = Modifier.height(8.dp)) + Row( + modifier = Modifier + .fillMaxWidth() + .height(16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + if (error != null) { + Image( + painter = painterResource(id = R.mipmap.rider_pro_input_error), + contentDescription = "Error", + modifier = Modifier.size(8.dp) + ) + Spacer(modifier = Modifier.size(4.dp)) + Text(error, color = Color(0xFFE53935), fontSize = 12.sp) + } + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/Profile.kt b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/Profile.kt index b8a6c34..cff2269 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/Profile.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/profile/Profile.kt @@ -95,8 +95,12 @@ fun ProfilePage() { val statusBarPaddingValues = WindowInsets.systemBars.asPaddingValues() LazyColumn( modifier = Modifier - .fillMaxSize().background(Color(0xFFF5F5F5)).padding(bottom = with(LocalDensity.current) { - val da = WindowInsets.navigationBars.getBottom(this).toDp() + 48.dp + .fillMaxSize() + .background(Color(0xFFF5F5F5)) + .padding(bottom = with(LocalDensity.current) { + val da = WindowInsets.navigationBars + .getBottom(this) + .toDp() + 48.dp da }) ) { @@ -118,7 +122,7 @@ fun ProfilePage() { contentScale = ContentScale.Crop ) } else { - Image( + Image( painter = painterResource(id = R.drawable.rider_pro_moment_demo_2), modifier = Modifier .fillMaxWidth() @@ -145,44 +149,60 @@ fun ProfilePage() { }, tint = Color.White ) - MaterialTheme(shapes = MaterialTheme.shapes.copy(extraSmall = RoundedCornerShape(16.dp))) { + MaterialTheme( + shapes = MaterialTheme.shapes.copy( + extraSmall = RoundedCornerShape( + 16.dp + ) + ) + ) { DropdownMenu( expanded = expanded, onDismissRequest = { expanded = false }, - modifier = Modifier.width(250.dp).background(Color.White) + modifier = Modifier + .width(250.dp) + .background(Color.White) ) { - Box(modifier = Modifier.padding(vertical = 14.dp, horizontal = 24.dp)) { + Box( + modifier = Modifier + .padding(vertical = 14.dp, horizontal = 24.dp) + .noRippleClickable { + expanded = false + scope.launch { + model.logout() + navController.navigate(NavigationRoute.Login.route) { + popUpTo(NavigationRoute.Index.route) { + inclusive = true + } + } + } + }) { Row { Text("Logout", fontWeight = FontWeight.W500) Spacer(modifier = Modifier.weight(1f)) Icon( painter = painterResource(id = R.mipmap.rider_pro_logout), contentDescription = "", - modifier = Modifier.size(24.dp).noRippleClickable { - scope.launch { - model.logout() - navController.navigate(NavigationRoute.Login.route) { - popUpTo(NavigationRoute.Index.route) { - inclusive = true - } - } - } - } + modifier = Modifier.size(24.dp) ) } } - Box(modifier = Modifier.padding(vertical = 14.dp, horizontal = 24.dp)) { + Box( + modifier = Modifier + .padding(vertical = 14.dp, horizontal = 24.dp) + .noRippleClickable { + expanded = false + scope.launch { + navController.navigate(NavigationRoute.ChangePasswordScreen.route) + } + }) { Row { - Text("Change password",fontWeight = FontWeight.W500) + Text("Change password", fontWeight = FontWeight.W500) Spacer(modifier = Modifier.weight(1f)) Icon( painter = painterResource(id = R.mipmap.rider_pro_change_password), contentDescription = "", - modifier = Modifier.size(24.dp).noRippleClickable { - scope.launch { - navController.navigate(NavigationRoute.ChangePasswordScreen.route) - } - } + modifier = Modifier.size(24.dp) ) } } @@ -444,7 +464,9 @@ fun CommunicationOperatorGroup( contentDescription = "" ) Text( - text = if (isFollowing) stringResource(R.string.following_upper) else stringResource(R.string.follow_upper), + text = if (isFollowing) stringResource(R.string.following_upper) else stringResource( + R.string.follow_upper + ), fontSize = 16.sp, color = Color.White, style = TextStyle(fontWeight = FontWeight.Bold) @@ -565,7 +587,9 @@ fun TimeGroup(time: String = "2024.06.08 12:23") { verticalAlignment = Alignment.CenterVertically ) { Image( - modifier = Modifier.height(16.dp).width(14.dp), + modifier = Modifier + .height(16.dp) + .width(14.dp), painter = painterResource(id = R.drawable.rider_pro_moment_time_flag), contentDescription = "" ) @@ -654,7 +678,7 @@ fun MomentCardPicture(imageUrl: String, momentEntity: MomentEntity) { imageUrl, modifier = Modifier .fillMaxSize() - .aspectRatio(3f/2f) + .aspectRatio(3f / 2f) .padding(16.dp) .noRippleClickable { PostViewModel.preTransit(momentEntity) diff --git a/app/src/main/java/com/aiosman/riderpro/ui/login/emailsignup.kt b/app/src/main/java/com/aiosman/riderpro/ui/login/emailsignup.kt index 2a20dd4..497d869 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/login/emailsignup.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/login/emailsignup.kt @@ -33,7 +33,9 @@ import com.aiosman.riderpro.data.ServiceException import com.aiosman.riderpro.data.AccountServiceImpl import com.aiosman.riderpro.ui.NavigationRoute import com.aiosman.riderpro.ui.comment.NoticeScreenHeader +import com.aiosman.riderpro.ui.composables.ActionButton import com.aiosman.riderpro.ui.composables.StatusBarMaskLayout +import com.aiosman.riderpro.ui.composables.TextInputField import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/aiosman/riderpro/ui/login/login.kt b/app/src/main/java/com/aiosman/riderpro/ui/login/login.kt index 12e7b34..afa383a 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/login/login.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/login/login.kt @@ -1,6 +1,5 @@ package com.aiosman.riderpro.ui.login -import androidx.annotation.DrawableRes import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -18,18 +17,14 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.navigation.NavOptions -import androidx.navigation.navOptions import com.aiosman.riderpro.LocalNavController import com.aiosman.riderpro.R import com.aiosman.riderpro.ui.NavigationRoute -import com.aiosman.riderpro.ui.modifiers.noRippleClickable +import com.aiosman.riderpro.ui.composables.ActionButton @Composable fun LoginPage() { @@ -106,33 +101,3 @@ fun LoginPage() { } } -@Composable -fun ActionButton( - modifier: Modifier, - text: String, - color: Color = Color.White, - @DrawableRes backgroundImage: Int, - leading: @Composable (() -> Unit)? = null, - click: () -> Unit = {} -) { - Box( - modifier = modifier.noRippleClickable { - click() - } - ) { - Image( - painter = painterResource(id = backgroundImage), - contentDescription = "Rider Pro", - modifier = Modifier.fillMaxSize(), - contentScale = ContentScale.FillBounds - ) - Row( - modifier = Modifier.align(Alignment.Center), - verticalAlignment = Alignment.CenterVertically - ) { - leading?.invoke() - Text(text, fontSize = 16.sp, color = color, fontWeight = FontWeight.W400) - } - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/aiosman/riderpro/ui/login/signup.kt b/app/src/main/java/com/aiosman/riderpro/ui/login/signup.kt index a463ee5..6967099 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/login/signup.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/login/signup.kt @@ -15,25 +15,18 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.credentials.Credential -import androidx.credentials.CredentialManager -import androidx.credentials.CustomCredential -import androidx.credentials.GetCredentialRequest -import androidx.credentials.GetCredentialResponse import com.aiosman.riderpro.AppStore import com.aiosman.riderpro.LocalNavController import com.aiosman.riderpro.Messaging @@ -42,6 +35,7 @@ import com.aiosman.riderpro.data.AccountService import com.aiosman.riderpro.data.AccountServiceImpl import com.aiosman.riderpro.data.ServiceException import com.aiosman.riderpro.ui.NavigationRoute +import com.aiosman.riderpro.ui.composables.ActionButton import com.aiosman.riderpro.ui.modifiers.noRippleClickable import com.aiosman.riderpro.utils.GoogleLogin import kotlinx.coroutines.Dispatchers diff --git a/app/src/main/java/com/aiosman/riderpro/ui/login/userauth.kt b/app/src/main/java/com/aiosman/riderpro/ui/login/userauth.kt index c972e5c..d44ed64 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/login/userauth.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/login/userauth.kt @@ -2,7 +2,6 @@ package com.aiosman.riderpro.ui.login import android.widget.Toast import androidx.compose.foundation.Image -import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -14,8 +13,6 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.foundation.text.BasicTextField -import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.Checkbox import androidx.compose.material3.CheckboxDefaults import androidx.compose.material3.ExperimentalMaterial3Api @@ -31,13 +28,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.input.KeyboardType -import androidx.compose.ui.text.input.PasswordVisualTransformation -import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import androidx.credentials.CredentialManager import com.aiosman.riderpro.AppStore import com.aiosman.riderpro.LocalNavController @@ -48,7 +39,9 @@ import com.aiosman.riderpro.data.AccountServiceImpl import com.aiosman.riderpro.data.ServiceException import com.aiosman.riderpro.ui.NavigationRoute import com.aiosman.riderpro.ui.comment.NoticeScreenHeader +import com.aiosman.riderpro.ui.composables.ActionButton import com.aiosman.riderpro.ui.composables.StatusBarMaskLayout +import com.aiosman.riderpro.ui.composables.TextInputField import com.aiosman.riderpro.ui.modifiers.noRippleClickable import com.aiosman.riderpro.utils.GoogleLogin import kotlinx.coroutines.launch @@ -227,66 +220,3 @@ fun UserAuthScreen() { } -@Composable -fun TextInputField( - modifier: Modifier = Modifier, - text: String, - onValueChange: (String) -> Unit, - password: Boolean = false, - label: String? = null, - hint: String? = null - -) { - var showPassword by remember { mutableStateOf(!password) } - Column(modifier = modifier) { - label?.let { - Text(it, color = Color(0xFFCCCCCC)) - Spacer(modifier = Modifier.height(16.dp)) - } - Box( - contentAlignment = Alignment.CenterStart - ) { - Row { - BasicTextField( - value = text, - onValueChange = onValueChange, - modifier = Modifier.weight(1f), - textStyle = TextStyle( - fontSize = 16.sp, - fontWeight = FontWeight.W500 - ), - keyboardOptions = KeyboardOptions( - keyboardType = if (password) KeyboardType.Password else KeyboardType.Text - ), - visualTransformation = if (showPassword) VisualTransformation.None else PasswordVisualTransformation(), - singleLine = true - ) - if (password) { - Image( - painter = painterResource(id = R.drawable.rider_pro_eye), - contentDescription = "Password", - modifier = Modifier - .size(24.dp) - .noRippleClickable { - showPassword = !showPassword - }, - colorFilter = androidx.compose.ui.graphics.ColorFilter.tint(Color.Black) - ) - } - } - - if (text.isEmpty()) { - hint?.let { - Text(it, color = Color(0xFFCCCCCC), fontWeight = FontWeight.W600) - } - } - } - Spacer(modifier = Modifier.height(16.dp)) - Box( - modifier = Modifier - .fillMaxWidth() - .height(1.dp) - .background(Color(0xFFF5F5F5)) - ) - } -} \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/rider_pro_btn_bg_grey.png b/app/src/main/res/mipmap-hdpi/rider_pro_btn_bg_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..389055e9f5048dd56f0f019175fcc2cccbbcbd5d GIT binary patch literal 2396 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/rider_pro_logout.png b/app/src/main/res/mipmap-hdpi/rider_pro_logout.png new file mode 100644 index 0000000000000000000000000000000000000000..aafc928b0d691b35f77e0f974a58fcd2851aaa4a GIT binary patch literal 909 zcmV;819JR{P)Px&M@d9MR9HvtmszMyVHC%I7a23lP^OH9@0OJR1w$; zf1Dc!ye~}Da}l9oz#an{Zod;V1B^#LXB zVc>26SRA0HzyM$`@Hi?*d`aB`I1AJQPMOg!83uhoWq~6=FW?2x6}S}!6$MltI01Av z<(0rJ;AfUVC4d#cOw&6L^l`R62SG&vjRv-v(lwwx@IB#`l>#m~2iutbn6UN`2Ba{* z1Im~uje+MOVfI~FO070<-$hH2{|ZzAGOs^$mdyc{nk6+mHNG&33ncyVz$P;^7g&~Q zG%P}@rY68kK#Bc2M?lprp=$#7099W;2?EmfTm`B*m;=^{72;e(NGY((K@A4p0B!9W z|Jn`$>H!=DD!5Y%-AGsz)i;3jSvE1P5W>_JnB7l6f8b2|!62X^z)qkfFcsL~0qO?q zw=+XCUl5=>30MpKFlYApfV4uS_M12!%U*XIuKBzTaYQA*5%>j+1$O&@2HBy~z;s}Z zCqmgio(8N2zPbF7^9OxEom{e=1hfgN!_Ln3jh^$%t>b@m#nanG_ks^dC3(}`a}CRf zeqn7s0jQedF+hd$%0;K8wU)>#)5D8E2TQz$ZdZPq;N?Lob%BRgFd8Kt~CGx>52VOQJ@=ahr)!Ra2Z{`B}h}Z)2sB)#X+zTh?2r!3pBJeH`3yv+!-eM?oZ5 j5};U~COuRPPx)OG!jQRCr$HoZn93N*KUf7-(geMV38!E{U2L8zq_siFdw)59Dh!nvfW;cmQvG z5^jy|vaHK4ER?M$Lrw{lPUo9{Wr|G*#(wkt{dGFbS1=9AadC0+IhV`XG&x<)mr5le zSGKmcn8%CSgc?lCPLe-C5CkU0VYAh0?I48m(7<$%6G<*BG$OWGa+Q`HnopzAXp#uc z<>e*veSe3hNXPTMN!AS--Z)g%WIP`KqCsQ(zW-U31FH4%B%B2r9{tdmRqBTN5GOYn z4El-Cv|6oC2%(Q6M%F!+HTmm?hSlFR^NSFA>-YOFw3+6M@B76x9aCY8wGa?+Sas6k zlC6(skLP?Ym-~BjbMu@8joEBAcZmv*V_1rkCNwO5tvjctY5uvrz5Pyv#&z9- zZQK8>+fkYJp#`Er1J#q{y9^yNa|6*e7z}=PIvw&t*md1f5Cq#;Sr!8%B>@tPYG@!n zK#G{Q%+u3T@8RKLOq^*>Pfxc^(pKMORf{Zo`y zuv*;NZnxXdhGD!Bp*cQ2-YpagT6eZ(7b>c65t<}hvi$&8GDSgz(8Tk+Z=uPRh3?hW zRleKp?f@Q}NYQPWDbWHhj;BE*Y6}*T9#XioeSd%dlL$?{Ubm~&YGymzacO2La3~u> z6CKNS@=f~JEjNW1nmKMUevmFG%Ms>EK1z&^%|2-OwR)Be@01XVoz_0lcg=XH_h9*19 za&ZuZ|HIIPvrb%$?+73~%i!529-4Z+zFn=&hV|Nkb$~0y9g=jqD(l`goYsFd1RRbNp}GL#5C({lc15>*-ke$vNdS2qjDn9 zY|spZKLyM>+p*9%j#IQO>x(YM7V!fLN>Xv7&_HifNq+PAC6WgTV_yx!_)UbS(P(_g z=kpZ_hSsKnw6v^R5Fz##z zNiz-ev=)TGE4z|YQnjZ+)$)8t*()xNVW6BgQxkpvBGtjzk! zj+wzXyq3Xhnw4V)jn18IRY{}ir9qP>IBU9%^$o+AceWSFnL(ptXPZ`3hASpk6rx{8 za8d*a@6XIT+bhuM(%FU-QWO@J8A4}h6t9Eu;&=XdXWT+~?VatkU||6U%R-=G)hPq| zBps4+xzgEQnrZM47rnl|rvAf4l7eHd0gGKIG`fK!;TE>i*o$V!P_V)HFl}hCUDC?X;ti|FqlQ@jWhfRVenw*4u#CEoqpi$M? z<|&d2SU9h=*)UdUbf0ZV`Hj>nwzItiO|#kjcRHO)d%ROOSVRiR1C5A1l@|?E_i#AG fdoy^ChIsr3Y_tN$nQJ<|00000NkvXXu0mjf>>sPX literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/rider_pro_change_password.png b/app/src/main/res/mipmap-mdpi/rider_pro_change_password.png new file mode 100644 index 0000000000000000000000000000000000000000..15bde694faf29a61b3f4b367ca0699d5f9f7b309 GIT binary patch literal 445 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 M07*qoM6N<$g84l5G5`Po literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/rider_pro_change_password.png b/app/src/main/res/mipmap-xhdpi/rider_pro_change_password.png new file mode 100644 index 0000000000000000000000000000000000000000..c14da3408bb031970d363c0117aa049cb95e6b27 GIT binary patch literal 844 zcmV-S1GD^zP)Px&21!IgRA@u(nK!6ZK@^6+X8;Su05+lsqK%56HY%8~u@Mo>iWx&|DhwbP3R7#q zjAASl8yhiUXjBljQ3O$J1Or+K#{1*BkL$j>yL0ExzQ@W8JeGZX!vCLhX6~7DTWIpt z(&YGw1Ufo{jmW?tU^*}Y=w}4q0Z)J{z^jm?LlPJT>;|UP0eBtQ2s{cwBou+I37Bm_ zCr41fOn$qgd{wa!1dag9b3A+jUfcf%0zGnMjsh#nkSI%FJ+P+&z)fH$pwA!nTbJbf zBw(|BW>q!-dwofiAut4ZmVoVQ&Q%tw?R|B?th2q6mfLq=81TY}L>U6-fH@hbita8) z5SuJZsrY$duA}ZhV!i}=0`D`?e+-NUemjDY--pSuI@08og}%UNNBveYUjmBO*^IM= zz?p*17XYU-I`aT!wb1eVV4>rB8zzGK%c_K@aKB&9>@DjLY{gXELRhRan-X>O`vmaOkboK=4tM(H(0IW@# zKs~8*S3LqJlN;0`Uj%{lP63O32u!q=IIF9u=ub={_*d$!$0xC;zod$jLxBylpHw`Huu*2C7FOmXK2fVhP0(Dj9)TLL~$EUq8rh z1LG|~8Xf8dMtd&307*xWcYp~+n>mdN=bMslL^AN8ofwP(6u@-yEi4*ewpq1GNJAz~ zjngF(Pl0a@CeaNTo&hg+nu2SXR)~P+_ex!Rx6zd#?^^ct{-F>732WqixdTZE{0tlA z=O(`1rCv(P#7uj2su^f{hiz0P>5i?jieAZH0&*jtI(H$^D4;>?Mgl>?Si(rtXW$RG WG^;V_y&-%60000Px$KuJVFR5(wqlRHZTQ4mJYm?gzRf+S5e!6v~65p3-r4UScr{{pdk1=L_xvE zMl8h2E{#~&*$N3hFpWe_vq3hHBJ4V{yXLi6sL6CQbH8(E?#vZJW~Fj@B5WWmp-lK` z;RWRimy=}ex!fy}wo`)WcqY52$|fR_FxdB1T@jAos+HYYXa#J*6OW~{MMM^V6o!MU z*YB^Df(P*d^-T6qk*!~ezYhs|l&Ds=CFoi2`pPy10fk(c2q7Yc(3H>wY+Pe#%HH#mD?Y2*QC_nOq6TcL0V#ym*N*GmZQBiy58G==~eLJI>v;-F(3c#(#( k%5BKMKU42;|N5Q30Cq3BZPnZSBme*a07*qoM6N<$f~st*fdBvi literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/rider_pro_logout.png b/app/src/main/res/mipmap-xhdpi/rider_pro_logout.png new file mode 100644 index 0000000000000000000000000000000000000000..25d434a4c81cd100786452cd398535f5353e9f0e GIT binary patch literal 1139 zcmV-(1dRKMP)Px(ElET{RA@u(nOW#nRTRd5iX%axsAwfVm5P!RPKl8v6!RMqeBL^py2;59kB@ zR0>2$22?r<*vS-NbGe&I0YD}v1DibC0;Ez(lyU%Gwhz}CIAY$ykbvORWWbsI3K;D9 z5TE)k$!9qL+kiJb<^F&kSct@ykh3Y$cieNZ9e6VhfTs45K5dm_8D&}ka;HmDo0i-H z^vM4$2BK63RQIZXCv$+cAy;qDR03c&u*UPHccAz1n3MvbE$Smrqbu-pl>l@B&UwDx z0anHWP&ZIlkleQI?S7R2=wj8bn_GYCdg^{r8Q5pW`*5pq0q7JFypC47Ql1AoTA%yP zEE*9DKs7heD*b4ON(=@q^-8;LQza0))N6S5whoUK%%VqelzIb)y`F#Cu*4oQ(Pwa0 zj92VbqS-JsHUqmYb(Y@mX8N|zAgCA<%GmQ(VUOWTqhkTAGQ51QRT3}JJkZ0chKLWT z|2zJ*+Wb8)7Qmze&NB=+RE_8jk9yVY1P47|>V{il0lZ+B3#X?creRhM(Gb%xbD|~c z*H{2L|BKf?#r-<~|KyCI8StB>4|1h;+BwN*IWo5p_`p-1Wel&+8Nf_no#$hbSv8lZ z1<=~whMS0g+Tn6DClD^8OWk5^iw(YhUfOA^=iWTRY(OWsy2L^xsD%cvR=Q5O<-P zJFkVb?T`$(z}^KuEQoR!FwG8~Gys&{&rGKoU!eRRup-1@3;@~lr?a#F2e81h&pRPb zfyQ=KRd;Dupp!Uti`k9^ARB6}O1B&H&aU{9DD;tNfpMQ? z)XNpL=7}~veH@6{uM;t5380dTOs!i7koxK}Qmpw5JOCBw#xYc1m+t@o002ovPDHLk FV1n)K1l<4t literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/rider_pro_btn_bg_grey.png b/app/src/main/res/mipmap-xxhdpi/rider_pro_btn_bg_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..ebc1d9adb5377723b85fa7badf00ec029f2956d7 GIT binary patch literal 5421 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/rider_pro_input_error.png b/app/src/main/res/mipmap-xxhdpi/rider_pro_input_error.png new file mode 100644 index 0000000000000000000000000000000000000000..52895afd0316e7223fc773bc71716c510606fc21 GIT binary patch literal 640 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 bi=cl2MHe(!B4(0~00000NkvXXu0mjfDvU_K literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/rider_pro_btn_bg_grey.png b/app/src/main/res/mipmap-xxxhdpi/rider_pro_btn_bg_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..09eb245aaf4f3466ba15d850e6ad418b65a9a1fc GIT binary patch literal 7365 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/rider_pro_change_password.png b/app/src/main/res/mipmap-xxxhdpi/rider_pro_change_password.png new file mode 100644 index 0000000000000000000000000000000000000000..36fed511f8d02e3e5c28a6d9af7cec6db98a8826 GIT binary patch literal 1741 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