Пример #1
0
        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)));
        }