diff --git a/app/src/main/java/com/aiosman/riderpro/ui/account/AccountEditViewModel.kt b/app/src/main/java/com/aiosman/riderpro/ui/account/AccountEditViewModel.kt index 244a725..7dc2578 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/account/AccountEditViewModel.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/account/AccountEditViewModel.kt @@ -21,6 +21,7 @@ object AccountEditViewModel : ViewModel() { val accountService: AccountService = AccountServiceImpl() var profile by mutableStateOf(null) var croppedBitmap by mutableStateOf(null) + var isUpdating by mutableStateOf(false) suspend fun reloadProfile() { accountService.getMyAccountProfile().let { profile = it @@ -30,7 +31,6 @@ object AccountEditViewModel : ViewModel() { } suspend fun updateUserProfile(context: Context) { - val newAvatar = croppedBitmap?.let { val file = File(context.cacheDir, "avatar.jpg") it.compress(Bitmap.CompressFormat.JPEG, 100, file.outputStream()) @@ -47,6 +47,5 @@ object AccountEditViewModel : ViewModel() { reloadProfile() // 刷新个人资料页面的用户资料 MyProfileViewModel.loadUserProfile() - } } \ No newline at end of file diff --git a/app/src/main/java/com/aiosman/riderpro/ui/account/ResetPassword.kt b/app/src/main/java/com/aiosman/riderpro/ui/account/ResetPassword.kt index 4638471..7aaa1d6 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/account/ResetPassword.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/account/ResetPassword.kt @@ -194,7 +194,7 @@ fun ResetPasswordScreen() { text = stringResource(R.string.back_upper), contentPadding = PaddingValues(0.dp), ) { - navController.popBackStack() + navController.navigateUp() } } 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 9764e1c..3e36036 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 @@ -140,7 +140,7 @@ fun ChangePasswordScreen() { try { viewModel.changePassword(currentPassword, newPassword) - navController.popBackStack() + navController.navigateUp() } catch (e: ServiceException) { when (e.errorType) { ErrorCode.IncorrectOldPassword -> diff --git a/app/src/main/java/com/aiosman/riderpro/ui/account/edit2.kt b/app/src/main/java/com/aiosman/riderpro/ui/account/edit2.kt index cd23436..2ad9756 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/account/edit2.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/account/edit2.kt @@ -39,6 +39,7 @@ import com.aiosman.riderpro.ui.composables.CustomAsyncImage import com.aiosman.riderpro.ui.composables.StatusBarSpacer import com.aiosman.riderpro.ui.composables.form.FormTextInput import com.aiosman.riderpro.ui.modifiers.noRippleClickable +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch /** @@ -60,6 +61,7 @@ fun AccountEditScreen2() { else -> null } } + val appColors = LocalAppTheme.current fun onBioChange(value: String) { @@ -75,7 +77,7 @@ fun AccountEditScreen2() { } LaunchedEffect(Unit) { - if (model.profile == null){ + if (model.profile == null) { model.reloadProfile() } @@ -99,14 +101,22 @@ fun AccountEditScreen2() { modifier = Modifier .size(24.dp) .noRippleClickable { - model.viewModelScope.launch { - model.updateUserProfile(context) - navController.popBackStack() + + if (validate() && !model.isUpdating) { + model.viewModelScope.launch { + model.isUpdating = true + model.updateUserProfile(context) + model.viewModelScope.launch(Dispatchers.Main) { + navController.navigateUp() + model.isUpdating = false + } + } } + }, imageVector = Icons.Default.Check, contentDescription = "保存", - tint = if (validate()) Color.Black else Color.Gray + tint = if (validate() && !model.isUpdating) Color.Black else Color.Gray ) } } diff --git a/app/src/main/java/com/aiosman/riderpro/ui/chat/ChatScreen.kt b/app/src/main/java/com/aiosman/riderpro/ui/chat/ChatScreen.kt index ec800b6..eedec32 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/chat/ChatScreen.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/chat/ChatScreen.kt @@ -176,7 +176,7 @@ fun ChatScreen(userId: String) { modifier = Modifier .size(28.dp) .noRippleClickable { - navController.popBackStack() + navController.navigateUp() }, contentDescription = null, colorFilter = ColorFilter.tint( diff --git a/app/src/main/java/com/aiosman/riderpro/ui/comment/CommentsScreen.kt b/app/src/main/java/com/aiosman/riderpro/ui/comment/CommentsScreen.kt index ee418ef..5bfe3e3 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/comment/CommentsScreen.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/comment/CommentsScreen.kt @@ -81,7 +81,7 @@ fun NoticeScreenHeader( indication = null, interactionSource = remember { MutableInteractionSource() } ) { - nav.popBackStack() + nav.navigateUp() }, colorFilter = ColorFilter.tint(AppColors.text) ) diff --git a/app/src/main/java/com/aiosman/riderpro/ui/crop/ImageCropScreen.kt b/app/src/main/java/com/aiosman/riderpro/ui/crop/ImageCropScreen.kt index 16889db..93e692a 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/crop/ImageCropScreen.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/crop/ImageCropScreen.kt @@ -115,6 +115,7 @@ fun ImageCropScreen() { AccountEditViewModel.viewModelScope.launch { AccountEditViewModel.updateUserProfile(context) navController.popBackStack() + } } diff --git a/app/src/main/java/com/aiosman/riderpro/ui/imageviewer/imageviewer.kt b/app/src/main/java/com/aiosman/riderpro/ui/imageviewer/imageviewer.kt index c064f16..cd78309 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/imageviewer/imageviewer.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/imageviewer/imageviewer.kt @@ -94,7 +94,7 @@ fun ImageViewer() { .zoomable( zoomState = zoomState, onTap = { - navController.popBackStack() + navController.navigateUp() } ) , diff --git a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/search/SearchScreen.kt b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/search/SearchScreen.kt index 1035b20..e213fdf 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/search/SearchScreen.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/index/tabs/search/SearchScreen.kt @@ -131,7 +131,7 @@ fun SearchScreen() { stringResource(R.string.cancel), fontSize = 16.sp, modifier = Modifier.noRippleClickable { - navController.popBackStack() + navController.navigateUp() }, color = AppColors.text ) 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 66d6b64..8d6d89a 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 @@ -229,7 +229,7 @@ fun SignupScreen() { Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.noRippleClickable { - navController.popBackStack() + navController.navigateUp() } ) { Image( diff --git a/app/src/main/java/com/aiosman/riderpro/ui/modifiers/ModifierExp.kt b/app/src/main/java/com/aiosman/riderpro/ui/modifiers/ModifierExp.kt index 3954680..7e6d943 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/modifiers/ModifierExp.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/modifiers/ModifierExp.kt @@ -3,12 +3,38 @@ package com.aiosman.riderpro.ui.modifiers import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.composed +import com.aiosman.riderpro.LocalNavController +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch inline fun Modifier.noRippleClickable(crossinline onClick: () -> Unit): Modifier = composed { this.clickable(indication = null, interactionSource = remember { MutableInteractionSource() }) { onClick() } -} \ No newline at end of file +} + + +inline fun Modifier.noRippleClickable( + debounceTime: Long = 300L, + crossinline onClick: () -> Unit +): Modifier = composed { + var job: Job? = null + val scope = rememberCoroutineScope() + this.clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() } + ) { + job?.cancel() + job = scope.launch { + delay(debounceTime) + onClick() + } + } +} + + diff --git a/app/src/main/java/com/aiosman/riderpro/ui/post/Post.kt b/app/src/main/java/com/aiosman/riderpro/ui/post/Post.kt index 84be28a..e294840 100644 --- a/app/src/main/java/com/aiosman/riderpro/ui/post/Post.kt +++ b/app/src/main/java/com/aiosman/riderpro/ui/post/Post.kt @@ -331,7 +331,7 @@ fun PostScreen( }, onDeleteClick = { viewModel.deleteMoment { - navController.popBackStack() + navController.navigateUp() } } ) @@ -682,7 +682,7 @@ fun Header( contentDescription = "Back", modifier = Modifier .noRippleClickable { - navController.popBackStack() + navController.navigateUp() } .size(32.dp), colorFilter = ColorFilter.tint(AppColors.text)