birdy-messenger / Android-client

Android OS Client for Birdy Messenger
0 stars 0 forks source link

Refacrtor LoginPresenter #14

Open AntipovAndrey opened 5 years ago

AntipovAndrey commented 5 years ago
  1. В компаньоне лежит набор строк. Так делять нельзя, иначе не будет возможности сделать перевод на другой язык. Правильно класть строки в strings.xml. При этом вместо
    viewState.showError(TOO_LONG_PASSWORD)

    Надо сделать конкретные методы:

    viewState.showTooLongPasswordError()

    и т.д.

  2. Разнести логику в репозитории и интеракторы Презентер должен выглядеть примерно таким образом (убрал валидацию, по идее ее надо в отедльный класс, который вернет результат валидации. И на основании этого поля ты будешь показывать сообщения с ошибкой):

    
    // domain
    interface UserCredentialsRepository {
    
    fun saveCredentials(credentials: Credentials): Completable
    }

class SignInInteractor( private val userCredentialsRepository: UserCredentialsRepository, private val appRequests: AppRequests ) {

fun signIn(email: String, password: String): Completable {
    return appRequests.auth(email, password.createMD5())
        .subscribeOn(Schedulers.io()) // not newThread (!!!)
        .map { Credentials(it.id, it.token) }
        .flatMapCompletable { userCredentialsRepository.saveCredentials(it) }
}

}

data class Credentials(val id: String, val token: String)

// data class UserCredentialsRepositoryImpl(val context: Context) : UserCredentialsRepository {

companion object {

    const val USER = "current.user"
    const val SAVE_ID = "save.id"
    const val SAVE_TOKEN = "save.token"
}

val sharedPrefs = context....

fun saveCredentials(credentials: Credentials): Completable {
    return Completable.fromAction {
        preferences.edit {
            clear()
            this.putInt(SAVE_ID, credentials.id)
            this.putLong(SAVE_TOKEN, credentials.token)
            apply()
        }
    }
}

}

// presenter @InjectViewState class LoginPresenter( private val signInInteractor: SignInInteractor ) : MvpPresenter() {

private val tag = LoginPresenter::class.java.simpleName
private var authRequest: Disposable? = null  // dispose it on destroy the presenter
// (check out a super method for that)

fun signInClicked(email: String, password: String) {
    Log.d(tag, "Sign in Clicked with email : $email and password : $password")
    if (authRequest?.isDisposed == false)
        return
    Log.d(tag, "Checking correctness")

    if (emailValid && passwordValid) {
        viewState.showLoad()
        authRequest = signInInteractor.signIn(email, password)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({
                viewState.hideLoad()
                viewState.signIn()
            }, {
                Log.d(tag, "Error occurred : $it")
                viewState.hideLoad()
            })
    }
}

fun signUpClicked() {}

}