This commit is contained in:
2024-08-13 22:32:27 +08:00
parent c99e168c53
commit d5067ca05b
9 changed files with 212 additions and 8 deletions

View File

@@ -1,5 +1,6 @@
package com.aiosman.riderpro.ui
import ChangePasswordScreen
import ImageViewer
import ModificationListScreen
import androidx.compose.animation.ExperimentalSharedTransitionApi
@@ -64,6 +65,7 @@ sealed class NavigationRoute(
data object EmailSignUp : NavigationRoute("EmailSignUp")
data object AccountEdit : NavigationRoute("AccountEditScreen")
data object ImageViewer : NavigationRoute("ImageViewer")
data object ChangePasswordScreen : NavigationRoute("ChangePasswordScreen")
}
@@ -184,6 +186,9 @@ fun NavigationController(
ImageViewer()
}
}
composable(route = NavigationRoute.ChangePasswordScreen.route) {
ChangePasswordScreen()
}
}

View File

@@ -0,0 +1,85 @@
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.unit.dp
import com.aiosman.riderpro.LocalNavController
import com.aiosman.riderpro.data.AccountService
import com.aiosman.riderpro.data.TestAccountServiceImpl
import kotlinx.coroutines.launch
class ChangePasswordViewModel {
val accountService :AccountService = TestAccountServiceImpl()
suspend fun changePassword(currentPassword: String, newPassword: String) {
accountService.changeAccountPassword(currentPassword, newPassword)
}
}
@Composable
fun ChangePasswordScreen(
) {
val viewModel = remember { ChangePasswordViewModel() }
var currentPassword by remember { mutableStateOf("") }
var newPassword by remember { mutableStateOf("") }
var confirmPassword by remember { mutableStateOf("") }
var errorMessage by remember { mutableStateOf("") }
val scope = rememberCoroutineScope()
val navController = LocalNavController.current
Scaffold { paddingValues ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues),
verticalArrangement = Arrangement.Center
) {
TextField(
value = currentPassword,
onValueChange = { currentPassword = it },
label = { Text("Current Password") },
visualTransformation = PasswordVisualTransformation(),
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(16.dp))
TextField(
value = newPassword,
onValueChange = { newPassword = it },
label = { Text("New Password") },
visualTransformation = PasswordVisualTransformation(),
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(16.dp))
TextField(
value = confirmPassword,
onValueChange = { confirmPassword = it },
label = { Text("Confirm New Password") },
visualTransformation = PasswordVisualTransformation(),
modifier = Modifier.fillMaxWidth()
)
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 {
viewModel.changePassword(currentPassword, newPassword)
navController.popBackStack()
}
} else {
errorMessage = "Passwords do not match"
}
},
modifier = Modifier.fillMaxWidth()
) {
Text("Change Password")
}
}
}
}

View File

@@ -76,7 +76,6 @@ fun ProfilePage() {
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Top,
) {
item {
Box(
modifier = Modifier
@@ -116,6 +115,13 @@ fun ProfilePage() {
}, text = {
Text("Edit")
})
DropdownMenuItem(onClick = {
scope.launch {
navController.navigate(NavigationRoute.ChangePasswordScreen.route)
}
}, text = {
Text("Change password")
})
}
}

View File

@@ -0,0 +1,60 @@
package com.aiosman.riderpro.ui.splash
import android.window.SplashScreen
import androidx.compose.foundation.Image
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.material.Scaffold
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
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 com.aiosman.riderpro.R
@Composable
fun SplashScreen() {
Scaffold {
it
Box(
modifier = Modifier.fillMaxSize()
) {
// to bottom
Box(
contentAlignment = Alignment.TopCenter,
modifier = Modifier.padding(top = 211.dp)
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.fillMaxWidth()
) {
Image(
painter = painterResource(id = R.mipmap.rider_pro_logo),
contentDescription = "Rider Pro",
modifier = Modifier
.width(108.dp)
.height(45.dp)
)
Spacer(modifier = Modifier.height(32.dp))
Text(
"Connecting Riders".uppercase(),
fontSize = 28.sp,
fontWeight = FontWeight.Bold
)
Text("Worldwide".uppercase(), fontSize = 28.sp, fontWeight = FontWeight.Bold)
}
}
}
}
}