Loading app/src/main/java/foundation/e/apps/feature/auth/login/LoginViewModel.kt +12 −10 Original line number Diff line number Diff line Loading @@ -150,17 +150,19 @@ class LoginViewModel @Inject constructor( } private fun beginSubmission(): Boolean { // Atomic compare-and-set: the first caller to flip isSubmitting false -> true wins and // returns true. A read-modify-write on _uiState.value would let two concurrent callers // both read isSubmitting=false and both proceed, kicking off duplicate submissions. while (true) { val currentState = _uiState.value if (currentState.isSubmitting) { return false } _uiState.value = currentState.copy( if (currentState.isSubmitting) return false val nextState = currentState.copy( isSubmitting = true, errorMessage = null, navigationTarget = null, ) return true if (_uiState.compareAndSet(currentState, nextState)) return true } } private fun finishSubmission() { Loading Loading
app/src/main/java/foundation/e/apps/feature/auth/login/LoginViewModel.kt +12 −10 Original line number Diff line number Diff line Loading @@ -150,17 +150,19 @@ class LoginViewModel @Inject constructor( } private fun beginSubmission(): Boolean { // Atomic compare-and-set: the first caller to flip isSubmitting false -> true wins and // returns true. A read-modify-write on _uiState.value would let two concurrent callers // both read isSubmitting=false and both proceed, kicking off duplicate submissions. while (true) { val currentState = _uiState.value if (currentState.isSubmitting) { return false } _uiState.value = currentState.copy( if (currentState.isSubmitting) return false val nextState = currentState.copy( isSubmitting = true, errorMessage = null, navigationTarget = null, ) return true if (_uiState.compareAndSet(currentState, nextState)) return true } } private fun finishSubmission() { Loading