public IDisposable Bind(AuthenticationModel model) { var canSendCode = model .WhenAnyValue(x => x.PhoneNumber) .Select(phone => IsPhoneValid(model, phone)); var canCheckCode = model .WhenAnyValue(x => x.ConfirmCode) .Select(code => !string.IsNullOrWhiteSpace(code)); var canCheckPassword = model .WhenAnyValue(x => x.Password) .Select(password => !string.IsNullOrWhiteSpace(password)); var disposable = new CompositeDisposable(); model.WhenAnyValue(m => m.PhoneNumber) .ObserveOn(RxApp.MainThreadScheduler) .Accept(phone => HandlePhoneChange(model, phone)) .DisposeWith(disposable); model.WhenAnyValue(m => m.PhoneCode) .ObserveOn(RxApp.MainThreadScheduler) .Accept(phoneCode => HandlePhoneCodeChange(model, phoneCode)) .DisposeWith(disposable); model.SendCodeCommand = ReactiveCommand.CreateFromObservable( (AuthenticationModel m) => { var phone = m.PhoneCode.Code + new string(m.PhoneNumber.Where(char.IsDigit).ToArray()); return(SendCode(phone)); }, canSendCode, RxApp.MainThreadScheduler) .DisposeWith(disposable); model.CheckCodeCommand = ReactiveCommand.CreateFromObservable( (AuthenticationModel m) => CheckCode(m.ConfirmCode, m.FirstName, m.LastName), canCheckCode, RxApp.MainThreadScheduler) .DisposeWith(disposable); model.CheckPasswordCommand = ReactiveCommand.CreateFromObservable( (AuthenticationModel m) => CheckPassword(m.Password), canCheckPassword, RxApp.MainThreadScheduler) .DisposeWith(disposable); _authenticator.ObserveState() .SubscribeOn(RxApp.TaskpoolScheduler) .ObserveOn(RxApp.MainThreadScheduler) .Accept(state => HandleState(model, state)) .DisposeWith(disposable); return(disposable); }
public static IDisposable BindAuthentication( this AuthenticationModel model, IAuthenticator authenticator) { var canSendCode = model .WhenAnyValue(x => x.PhoneNumber) .Select(phone => !string.IsNullOrWhiteSpace(phone)); var canCheckCode = model .WhenAnyValue(x => x.ConfirmCode) .Select(code => !string.IsNullOrWhiteSpace(code)); var canCheckPassword = model .WhenAnyValue(x => x.Password) .Select(password => !string.IsNullOrWhiteSpace(password)); model.SendCodeCommand = ReactiveCommand.CreateFromObservable( (AuthenticationModel m) => SendCode(authenticator, m.PhoneNumber), canSendCode, RxApp.MainThreadScheduler); model.CheckCodeCommand = ReactiveCommand.CreateFromObservable( (AuthenticationModel m) => CheckCode(authenticator, m.ConfirmCode, m.FirstName, m.LastName), canCheckCode, RxApp.MainThreadScheduler); model.CheckPasswordCommand = ReactiveCommand.CreateFromObservable( (AuthenticationModel m) => CheckPassword(authenticator, m.Password), canCheckPassword, RxApp.MainThreadScheduler); return(authenticator.ObserveState() .SubscribeOn(RxApp.TaskpoolScheduler) .ObserveOn(RxApp.MainThreadScheduler) .Accept(state => HandleState(model, state))); }