|
|
|
@ -19,7 +19,6 @@ import androidx.compose.ui.text.input.ImeAction |
|
|
|
|
import androidx.compose.ui.text.input.KeyboardType |
|
|
|
|
import androidx.compose.ui.text.input.PasswordVisualTransformation |
|
|
|
|
import androidx.compose.ui.text.withStyle |
|
|
|
|
import androidx.compose.ui.tooling.preview.Preview |
|
|
|
|
import androidx.compose.ui.unit.dp |
|
|
|
|
import androidx.lifecycle.viewmodel.compose.viewModel |
|
|
|
|
import androidx.navigation.compose.NavHost |
|
|
|
@ -117,282 +116,263 @@ class AccountActivity : ComponentActivity() { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 帐号表单 |
|
|
|
|
* |
|
|
|
|
* @param accountViewModel |
|
|
|
|
* @param Action 表单操作区域 |
|
|
|
|
*/ |
|
|
|
|
@Composable |
|
|
|
|
private fun Account( |
|
|
|
|
accountViewModel: AccountViewModel = viewModel(), |
|
|
|
|
scaffoldState: ScaffoldState, |
|
|
|
|
route: AccountRoute, |
|
|
|
|
Action: @Composable (isValidForm: Boolean, accountViewModel: AccountViewModel) -> Unit |
|
|
|
|
) { |
|
|
|
|
accountViewModel.route = route |
|
|
|
|
Row( |
|
|
|
|
horizontalArrangement = Arrangement.Center, |
|
|
|
|
verticalAlignment = Alignment.CenterVertically, |
|
|
|
|
modifier = Modifier.fillMaxSize() |
|
|
|
|
/** |
|
|
|
|
* 帐号表单 |
|
|
|
|
* |
|
|
|
|
* @param accountViewModel |
|
|
|
|
* @param Action 表单操作区域 |
|
|
|
|
*/ |
|
|
|
|
@Composable |
|
|
|
|
private fun Account( |
|
|
|
|
accountViewModel: AccountViewModel = viewModel(), |
|
|
|
|
scaffoldState: ScaffoldState, |
|
|
|
|
route: AccountRoute, |
|
|
|
|
Action: @Composable (isValidForm: Boolean, accountViewModel: AccountViewModel) -> Unit |
|
|
|
|
) { |
|
|
|
|
Column(modifier = Modifier.width(IntrinsicSize.Min)) { |
|
|
|
|
Text(buildAnnotatedString { |
|
|
|
|
withStyle( |
|
|
|
|
style = MaterialTheme.typography.subtitle1.toSpanStyle() |
|
|
|
|
.copy(color = MaterialTheme.colors.primary) |
|
|
|
|
) { |
|
|
|
|
append(accountViewModel.name.formValue.value ?: "") |
|
|
|
|
} |
|
|
|
|
withStyle(style = MaterialTheme.typography.subtitle1.toSpanStyle()) { |
|
|
|
|
append(accountViewModel.welcomeStart) |
|
|
|
|
} |
|
|
|
|
withStyle(style = MaterialTheme.typography.subtitle2.toSpanStyle()) { |
|
|
|
|
append(accountViewModel.welcomeEnd) |
|
|
|
|
} |
|
|
|
|
withStyle( |
|
|
|
|
style = MaterialTheme.typography.subtitle2.toSpanStyle() |
|
|
|
|
.copy(color = MaterialTheme.colors.secondary) |
|
|
|
|
) { |
|
|
|
|
append(BuildConfig.foreground_app_name) |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
StudentId(checkRepeat = route == AccountRoute.register) |
|
|
|
|
Spacer(modifier = Modifier.height(10.dp)) |
|
|
|
|
|
|
|
|
|
accountViewModel.route = route |
|
|
|
|
Row( |
|
|
|
|
horizontalArrangement = Arrangement.Center, |
|
|
|
|
verticalAlignment = Alignment.CenterVertically, |
|
|
|
|
modifier = Modifier.fillMaxSize() |
|
|
|
|
) { |
|
|
|
|
Column(modifier = Modifier.width(IntrinsicSize.Min)) { |
|
|
|
|
Text(buildAnnotatedString { |
|
|
|
|
withStyle( |
|
|
|
|
style = MaterialTheme.typography.subtitle1.toSpanStyle() |
|
|
|
|
.copy(color = MaterialTheme.colors.primary) |
|
|
|
|
) { |
|
|
|
|
append(accountViewModel.name.formValue.value ?: "") |
|
|
|
|
} |
|
|
|
|
withStyle(style = MaterialTheme.typography.subtitle1.toSpanStyle()) { |
|
|
|
|
append(accountViewModel.welcomeStart) |
|
|
|
|
} |
|
|
|
|
withStyle(style = MaterialTheme.typography.subtitle2.toSpanStyle()) { |
|
|
|
|
append(accountViewModel.welcomeEnd) |
|
|
|
|
} |
|
|
|
|
withStyle( |
|
|
|
|
style = MaterialTheme.typography.subtitle2.toSpanStyle() |
|
|
|
|
.copy(color = MaterialTheme.colors.secondary) |
|
|
|
|
) { |
|
|
|
|
append(BuildConfig.foreground_app_name) |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
if (route == AccountRoute.register) Name() else Password() |
|
|
|
|
StudentId(checkRepeat = route == AccountRoute.register) |
|
|
|
|
Spacer(modifier = Modifier.height(10.dp)) |
|
|
|
|
|
|
|
|
|
Spacer(modifier = Modifier.height(10.dp)) |
|
|
|
|
PasswordTip() |
|
|
|
|
val isValidForm: Boolean by accountViewModel.isValidForm.observeAsState(false) |
|
|
|
|
Action(isValidForm = isValidForm, accountViewModel = accountViewModel) |
|
|
|
|
|
|
|
|
|
val snackBarMsg: String by accountViewModel.snackBarMsg.observeAsState("") |
|
|
|
|
if (route == AccountRoute.register) Name() else Password() |
|
|
|
|
|
|
|
|
|
if (snackBarMsg != "") { |
|
|
|
|
LaunchedEffect(scaffoldState) { |
|
|
|
|
scaffoldState.snackbarHostState.showSnackbar( |
|
|
|
|
message = snackBarMsg |
|
|
|
|
) |
|
|
|
|
accountViewModel.resetRegisterResMsg() |
|
|
|
|
Spacer(modifier = Modifier.height(10.dp)) |
|
|
|
|
PasswordTip() |
|
|
|
|
val isValidForm: Boolean by accountViewModel.isValidForm.observeAsState(false) |
|
|
|
|
Action(isValidForm = isValidForm, accountViewModel = accountViewModel) |
|
|
|
|
|
|
|
|
|
val snackBarMsg: String by accountViewModel.snackBarMsg.observeAsState("") |
|
|
|
|
|
|
|
|
|
if (snackBarMsg != "") { |
|
|
|
|
LaunchedEffect(scaffoldState) { |
|
|
|
|
scaffoldState.snackbarHostState.showSnackbar( |
|
|
|
|
message = snackBarMsg |
|
|
|
|
) |
|
|
|
|
accountViewModel.resetRegisterResMsg() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
RegisterDialog() |
|
|
|
|
RegisterDialog() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 学号 |
|
|
|
|
* @param accountViewModel |
|
|
|
|
*/ |
|
|
|
|
@Composable |
|
|
|
|
private fun StudentId(accountViewModel: AccountViewModel = viewModel(), checkRepeat: Boolean) { |
|
|
|
|
Column { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val isValidStudentId: Boolean by accountViewModel.isValidStudentId.observeAsState(false) |
|
|
|
|
BaseTextField( |
|
|
|
|
form = accountViewModel.studentId, keyboardOptions = KeyboardOptions.Default.copy( |
|
|
|
|
keyboardType = KeyboardType.Number, |
|
|
|
|
imeAction = ImeAction.Done |
|
|
|
|
), isError = !isValidStudentId |
|
|
|
|
) |
|
|
|
|
if (isValidStudentId) { |
|
|
|
|
if (checkRepeat) { |
|
|
|
|
val isRepeat: Boolean? by accountViewModel.isRepeat.observeAsState(null) |
|
|
|
|
Logger.i("isRepeat=$isRepeat") |
|
|
|
|
when (isRepeat) { |
|
|
|
|
null -> AnimationText(text = accountViewModel.checkRegTip) |
|
|
|
|
true -> |
|
|
|
|
Text(buildAnnotatedString { |
|
|
|
|
append(accountViewModel.studentId.formDesc) |
|
|
|
|
withStyle( |
|
|
|
|
style = MaterialTheme.typography.body1.toSpanStyle().copy( |
|
|
|
|
color = MaterialTheme.colors.error |
|
|
|
|
) |
|
|
|
|
) { |
|
|
|
|
append(accountViewModel.studentId.formValue.value ?: "") |
|
|
|
|
} |
|
|
|
|
append(accountViewModel.registered) |
|
|
|
|
}) |
|
|
|
|
false -> |
|
|
|
|
Text(buildAnnotatedString { |
|
|
|
|
append(accountViewModel.studentId.formDesc) |
|
|
|
|
withStyle( |
|
|
|
|
style = MaterialTheme.typography.body1.toSpanStyle().copy( |
|
|
|
|
color = MaterialTheme.colors.primary |
|
|
|
|
) |
|
|
|
|
) { |
|
|
|
|
append(accountViewModel.studentId.formValue.value ?: "") |
|
|
|
|
} |
|
|
|
|
append(accountViewModel.canRegister) |
|
|
|
|
}) |
|
|
|
|
/** |
|
|
|
|
* 学号 |
|
|
|
|
* @param accountViewModel |
|
|
|
|
*/ |
|
|
|
|
@Composable |
|
|
|
|
private fun StudentId(accountViewModel: AccountViewModel = viewModel(), checkRepeat: Boolean) { |
|
|
|
|
Column { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val isValidStudentId: Boolean by accountViewModel.isValidStudentId.observeAsState(false) |
|
|
|
|
BaseTextField( |
|
|
|
|
form = accountViewModel.studentId, keyboardOptions = KeyboardOptions.Default.copy( |
|
|
|
|
keyboardType = KeyboardType.Number, |
|
|
|
|
imeAction = ImeAction.Done |
|
|
|
|
), isError = !isValidStudentId |
|
|
|
|
) |
|
|
|
|
if (isValidStudentId) { |
|
|
|
|
if (checkRepeat) { |
|
|
|
|
val isRepeat: Boolean? by accountViewModel.isRepeat.observeAsState(null) |
|
|
|
|
Logger.i("isRepeat=$isRepeat") |
|
|
|
|
when (isRepeat) { |
|
|
|
|
null -> AnimationText(text = accountViewModel.checkRegTip) |
|
|
|
|
true -> |
|
|
|
|
Text(buildAnnotatedString { |
|
|
|
|
append(accountViewModel.studentId.formDesc) |
|
|
|
|
withStyle( |
|
|
|
|
style = MaterialTheme.typography.body1.toSpanStyle().copy( |
|
|
|
|
color = MaterialTheme.colors.error |
|
|
|
|
) |
|
|
|
|
) { |
|
|
|
|
append(accountViewModel.studentId.formValue.value ?: "") |
|
|
|
|
} |
|
|
|
|
append(accountViewModel.registered) |
|
|
|
|
}) |
|
|
|
|
false -> |
|
|
|
|
Text(buildAnnotatedString { |
|
|
|
|
append(accountViewModel.studentId.formDesc) |
|
|
|
|
withStyle( |
|
|
|
|
style = MaterialTheme.typography.body1.toSpanStyle().copy( |
|
|
|
|
color = MaterialTheme.colors.primary |
|
|
|
|
) |
|
|
|
|
) { |
|
|
|
|
append(accountViewModel.studentId.formValue.value ?: "") |
|
|
|
|
} |
|
|
|
|
append(accountViewModel.canRegister) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
Text( |
|
|
|
|
text = accountViewModel.studentIdFormat, |
|
|
|
|
color = MaterialTheme.colors.error, |
|
|
|
|
style = MaterialTheme.typography.body1 |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
Text( |
|
|
|
|
text = accountViewModel.studentIdFormat, |
|
|
|
|
color = MaterialTheme.colors.error, |
|
|
|
|
style = MaterialTheme.typography.body1 |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 注册弹窗 |
|
|
|
|
* |
|
|
|
|
* @param accountViewModel |
|
|
|
|
*/ |
|
|
|
|
@Composable |
|
|
|
|
private fun RegisterDialog(accountViewModel: AccountViewModel = viewModel()) { |
|
|
|
|
val dialogMsg: DialogMessage? by accountViewModel.dialogMsg.observeAsState(null) |
|
|
|
|
|
|
|
|
|
val message = dialogMsg?.userResDto?.password |
|
|
|
|
if (message?.isNotEmpty() == true) { |
|
|
|
|
PasswordDialog(message = message) |
|
|
|
|
/** |
|
|
|
|
* 注册弹窗 |
|
|
|
|
* |
|
|
|
|
* @param accountViewModel |
|
|
|
|
*/ |
|
|
|
|
@Composable |
|
|
|
|
private fun RegisterDialog(accountViewModel: AccountViewModel = viewModel()) { |
|
|
|
|
val dialogMsg: DialogMessage? by accountViewModel.dialogMsg.observeAsState(null) |
|
|
|
|
|
|
|
|
|
val message = dialogMsg?.userResDto?.password |
|
|
|
|
if (message?.isNotEmpty() == true) { |
|
|
|
|
PasswordDialog(message = message) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 密码弹窗 |
|
|
|
|
* |
|
|
|
|
* @param accountViewModel |
|
|
|
|
* @param message |
|
|
|
|
*/ |
|
|
|
|
@Composable |
|
|
|
|
private fun PasswordDialog(accountViewModel: AccountViewModel = viewModel(), message: String) { |
|
|
|
|
val context = LocalContext.current |
|
|
|
|
val button: @Composable () -> Unit = { |
|
|
|
|
Row( |
|
|
|
|
horizontalArrangement = Arrangement.Center, modifier = Modifier |
|
|
|
|
.fillMaxWidth() |
|
|
|
|
.padding(bottom = 10.dp) |
|
|
|
|
) { |
|
|
|
|
OutlinedButton( |
|
|
|
|
onClick = { accountViewModel.resetDialogMsg() }, |
|
|
|
|
modifier = Modifier.padding(end = 10.dp) |
|
|
|
|
) { |
|
|
|
|
Text(text = accountViewModel.confirmDesc) |
|
|
|
|
} |
|
|
|
|
OutlinedButton( |
|
|
|
|
onClick = { |
|
|
|
|
context.startActivity(Intent(context, AccountActivity::class.java)) |
|
|
|
|
}, |
|
|
|
|
colors = ButtonDefaults.outlinedButtonColors( |
|
|
|
|
contentColor = MaterialTheme.colors.onBackground |
|
|
|
|
) |
|
|
|
|
/** |
|
|
|
|
* 密码弹窗 |
|
|
|
|
* |
|
|
|
|
* @param accountViewModel |
|
|
|
|
* @param message |
|
|
|
|
*/ |
|
|
|
|
@Composable |
|
|
|
|
private fun PasswordDialog(accountViewModel: AccountViewModel = viewModel(), message: String) { |
|
|
|
|
val context = LocalContext.current |
|
|
|
|
val button: @Composable () -> Unit = { |
|
|
|
|
Row( |
|
|
|
|
horizontalArrangement = Arrangement.Center, modifier = Modifier |
|
|
|
|
.fillMaxWidth() |
|
|
|
|
.padding(bottom = 10.dp) |
|
|
|
|
) { |
|
|
|
|
Text(text = accountViewModel.backLogin) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
AlertDialog(onDismissRequest = { accountViewModel.resetDialogMsg() }, |
|
|
|
|
buttons = button, |
|
|
|
|
title = { Text(text = accountViewModel.title) }, |
|
|
|
|
text = { |
|
|
|
|
Text(buildAnnotatedString { |
|
|
|
|
append(accountViewModel.passwordDialogStart) |
|
|
|
|
withStyle( |
|
|
|
|
style = MaterialTheme.typography.body1.toSpanStyle() |
|
|
|
|
.copy(color = MaterialTheme.colors.secondary) |
|
|
|
|
OutlinedButton( |
|
|
|
|
onClick = { accountViewModel.resetDialogMsg() }, |
|
|
|
|
modifier = Modifier.padding(end = 10.dp) |
|
|
|
|
) { |
|
|
|
|
Text(text = accountViewModel.confirmDesc) |
|
|
|
|
} |
|
|
|
|
OutlinedButton( |
|
|
|
|
onClick = { |
|
|
|
|
context.startActivity(Intent(context, AccountActivity::class.java)) |
|
|
|
|
}, |
|
|
|
|
colors = ButtonDefaults.outlinedButtonColors( |
|
|
|
|
contentColor = MaterialTheme.colors.onBackground |
|
|
|
|
) |
|
|
|
|
) { |
|
|
|
|
append(message) |
|
|
|
|
Text(text = accountViewModel.backLogin) |
|
|
|
|
} |
|
|
|
|
append(accountViewModel.passwordDialogEnd) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
AlertDialog(onDismissRequest = { accountViewModel.resetDialogMsg() }, |
|
|
|
|
buttons = button, |
|
|
|
|
title = { Text(text = accountViewModel.title) }, |
|
|
|
|
text = { |
|
|
|
|
Text(buildAnnotatedString { |
|
|
|
|
append(accountViewModel.passwordDialogStart) |
|
|
|
|
withStyle( |
|
|
|
|
style = MaterialTheme.typography.body1.toSpanStyle() |
|
|
|
|
.copy(color = MaterialTheme.colors.secondary) |
|
|
|
|
) { |
|
|
|
|
append(message) |
|
|
|
|
} |
|
|
|
|
append(accountViewModel.passwordDialogEnd) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 姓名文本框 |
|
|
|
|
* @param accountViewModel |
|
|
|
|
*/ |
|
|
|
|
@Composable |
|
|
|
|
private fun Name(accountViewModel: AccountViewModel = viewModel()) { |
|
|
|
|
Column { |
|
|
|
|
/** |
|
|
|
|
* 姓名文本框 |
|
|
|
|
* @param accountViewModel |
|
|
|
|
*/ |
|
|
|
|
@Composable |
|
|
|
|
private fun Name(accountViewModel: AccountViewModel = viewModel()) { |
|
|
|
|
Column { |
|
|
|
|
|
|
|
|
|
val isValidName: Boolean by accountViewModel.isValidName.observeAsState(false) |
|
|
|
|
BaseTextField(form = accountViewModel.name, isError = !isValidName) |
|
|
|
|
val isValidName: Boolean by accountViewModel.isValidName.observeAsState(false) |
|
|
|
|
BaseTextField(form = accountViewModel.name, isError = !isValidName) |
|
|
|
|
|
|
|
|
|
if (!isValidName) { |
|
|
|
|
Text( |
|
|
|
|
text = accountViewModel.nameFormat, |
|
|
|
|
color = MaterialTheme.colors.error |
|
|
|
|
) |
|
|
|
|
if (!isValidName) { |
|
|
|
|
Text( |
|
|
|
|
text = accountViewModel.nameFormat, |
|
|
|
|
color = MaterialTheme.colors.error |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 密码框 |
|
|
|
|
* @param accountViewModel |
|
|
|
|
*/ |
|
|
|
|
@Composable |
|
|
|
|
private fun Password(accountViewModel: AccountViewModel = viewModel()) { |
|
|
|
|
Column { |
|
|
|
|
val isValidPwd: Boolean by accountViewModel.isValidPwd.observeAsState(false) |
|
|
|
|
|
|
|
|
|
BaseTextField( |
|
|
|
|
form = accountViewModel.password, isError = !isValidPwd, |
|
|
|
|
keyboardOptions = KeyboardOptions.Default.copy( |
|
|
|
|
imeAction = ImeAction.Done, |
|
|
|
|
keyboardType = KeyboardType.Number, |
|
|
|
|
), visualTransformation = PasswordVisualTransformation() |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!isValidPwd) { |
|
|
|
|
Text( |
|
|
|
|
text = accountViewModel.passwordFormat, |
|
|
|
|
color = MaterialTheme.colors.error |
|
|
|
|
/** |
|
|
|
|
* 密码框 |
|
|
|
|
* @param accountViewModel |
|
|
|
|
*/ |
|
|
|
|
@Composable |
|
|
|
|
private fun Password(accountViewModel: AccountViewModel = viewModel()) { |
|
|
|
|
Column { |
|
|
|
|
val isValidPwd: Boolean by accountViewModel.isValidPwd.observeAsState(false) |
|
|
|
|
|
|
|
|
|
BaseTextField( |
|
|
|
|
form = accountViewModel.password, isError = !isValidPwd, |
|
|
|
|
keyboardOptions = KeyboardOptions.Default.copy( |
|
|
|
|
imeAction = ImeAction.Done, |
|
|
|
|
keyboardType = KeyboardType.Number, |
|
|
|
|
), visualTransformation = PasswordVisualTransformation() |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!isValidPwd) { |
|
|
|
|
Text( |
|
|
|
|
text = accountViewModel.passwordFormat, |
|
|
|
|
color = MaterialTheme.colors.error |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 提示自动生成密码 |
|
|
|
|
* |
|
|
|
|
* @param accountViewModel |
|
|
|
|
*/ |
|
|
|
|
@Composable |
|
|
|
|
private fun PasswordTip(accountViewModel: AccountViewModel = viewModel()) { |
|
|
|
|
if (accountViewModel.isValidForm.value == true) { |
|
|
|
|
Text( |
|
|
|
|
text = accountViewModel.passwordTip, color = MaterialTheme.colors.primary, |
|
|
|
|
modifier = Modifier.fillMaxWidth() |
|
|
|
|
) |
|
|
|
|
/** |
|
|
|
|
* 提示自动生成密码 |
|
|
|
|
* |
|
|
|
|
* @param accountViewModel |
|
|
|
|
*/ |
|
|
|
|
@Composable |
|
|
|
|
private fun PasswordTip(accountViewModel: AccountViewModel = viewModel()) { |
|
|
|
|
if (accountViewModel.isValidForm.value == true) { |
|
|
|
|
Text( |
|
|
|
|
text = accountViewModel.passwordTip, color = MaterialTheme.colors.primary, |
|
|
|
|
modifier = Modifier.fillMaxWidth() |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Preview(showBackground = true) |
|
|
|
|
@Composable |
|
|
|
|
fun DefaultPreview() { |
|
|
|
|
CSAMSTheme { |
|
|
|
|
|
|
|
|
|
Row( |
|
|
|
|
horizontalArrangement = Arrangement.Center, |
|
|
|
|
verticalAlignment = Alignment.CenterVertically, |
|
|
|
|
modifier = Modifier.fillMaxSize() |
|
|
|
|
) { |
|
|
|
|
Column(modifier = Modifier.width(IntrinsicSize.Min)) { |
|
|
|
|
val model: AccountViewModel = viewModel() |
|
|
|
|
|
|
|
|
|
StudentId(model, false) |
|
|
|
|
Spacer(modifier = Modifier.height(10.dp)) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|