package com.kickstarter.viewmodels; import android.support.annotation.NonNull; import com.kickstarter.libs.ActivityViewModel; import com.kickstarter.libs.Environment; import com.kickstarter.libs.rx.transformers.Transformers; import com.kickstarter.libs.utils.StringUtils; import com.kickstarter.models.User; import com.kickstarter.services.ApiClientType; import com.kickstarter.services.apiresponses.ErrorEnvelope; import com.kickstarter.ui.activities.ResetPasswordActivity; import com.kickstarter.viewmodels.errors.ResetPasswordViewModelErrors; import com.kickstarter.viewmodels.inputs.ResetPasswordViewModelInputs; import com.kickstarter.viewmodels.outputs.ResetPasswordViewModelOutputs; import rx.Observable; import rx.subjects.PublishSubject; public final class ResetPasswordViewModel extends ActivityViewModel<ResetPasswordActivity> implements ResetPasswordViewModelInputs, ResetPasswordViewModelOutputs, ResetPasswordViewModelErrors { // INPUTS private final PublishSubject<String> email = PublishSubject.create(); private final PublishSubject<Void> resetPasswordClick = PublishSubject.create(); // OUTPUTS private final PublishSubject<Void> resetSuccess = PublishSubject.create(); public Observable<Void> resetSuccess() { return resetSuccess.asObservable(); } private final PublishSubject<Boolean> isFormSubmitting = PublishSubject.create(); public Observable<Boolean> isFormSubmitting() { return isFormSubmitting.asObservable(); } private final PublishSubject<Boolean> isFormValid = PublishSubject.create(); public Observable<Boolean> isFormValid() { return isFormValid.asObservable(); } // ERRORS private final PublishSubject<ErrorEnvelope> resetError = PublishSubject.create(); public Observable<String> resetError() { return resetError .takeUntil(resetSuccess) .map(ErrorEnvelope::errorMessage); } private final ApiClientType client; public final ResetPasswordViewModelInputs inputs = this; public final ResetPasswordViewModelOutputs outputs = this; public final ResetPasswordViewModelErrors errors = this; @Override public void email(final @NonNull String s) { email.onNext(s); } @Override public void resetPasswordClick() { resetPasswordClick.onNext(null); } public ResetPasswordViewModel(final @NonNull Environment environment) { super(environment); client = environment.apiClient(); email .map(StringUtils::isEmail) .compose(bindToLifecycle()) .subscribe(isFormValid); email .compose(Transformers.takeWhen(resetPasswordClick)) .switchMap(this::submitEmail) .compose(bindToLifecycle()) .subscribe(__ -> success()); resetError .compose(bindToLifecycle()) .subscribe(__ -> koala.trackResetPasswordError()); resetSuccess .compose(bindToLifecycle()) .subscribe(__ -> koala.trackResetPasswordSuccess()); koala.trackResetPasswordFormView(); } private Observable<User> submitEmail(final @NonNull String email) { return client.resetPassword(email) .compose(Transformers.pipeApiErrorsTo(resetError)) .compose(Transformers.neverError()) .doOnSubscribe(() -> isFormSubmitting.onNext(true)) .doAfterTerminate(() -> isFormSubmitting.onNext(false)); } private void success() { resetSuccess.onNext(null); } }