示例#1
0
 private IObservable <CheckCodeResult> CheckCode(
     string code,
     string firstName,
     string lastName)
 {
     return(_authenticator
            .CheckCode(code, firstName, lastName)
            .Select(_ => new CheckCodeResult()));
 }
        public AuthenticationModel(
            IFactory <ProxyPopupModel> proxyPopupModelFactory,
            IAuthenticator authenticator,
            IPopupController popupController
            )
        {
            _modelDisposable = new CompositeDisposable();

            SetProxyCommand = ReactiveCommand.Create(() =>
            {
                var popupModel = proxyPopupModelFactory.Create();
                popupController.Show(popupModel);
            });

            var canSendCode = this
                              .WhenAnyValue(x => x.PhoneNumber)
                              .Select(phone => !string.IsNullOrWhiteSpace(phone));

            SendCodeCommand = ReactiveCommand.CreateFromObservable(
                () => authenticator.SetPhoneNumber(PhoneNumber),
                canSendCode, RxApp.MainThreadScheduler);

            var canCheckCode = this
                               .WhenAnyValue(x => x.ConfirmCode)
                               .Select(code => !string.IsNullOrWhiteSpace(code));

            CheckCodeCommand = ReactiveCommand.CreateFromObservable(
                () => authenticator.CheckCode(ConfirmCode, FirstName, LastName),
                canCheckCode, RxApp.MainThreadScheduler);

            var canCheckPassword = this
                                   .WhenAnyValue(x => x.Password)
                                   .Select(password => !string.IsNullOrWhiteSpace(password));

            CheckPasswordCommand = ReactiveCommand.CreateFromObservable(
                () => authenticator.CheckPassword(Password),
                canCheckPassword, RxApp.MainThreadScheduler);

            var stateObservable = authenticator
                                  .ObserveState()
                                  .ObserveOn(RxApp.MainThreadScheduler);

            stateObservable
            .OfType <TdApi.AuthorizationState.AuthorizationStateWaitPhoneNumber>()
            .Subscribe(state => OnWaitingPhoneNumber())
            .DisposeWith(_modelDisposable);

            stateObservable
            .OfType <TdApi.AuthorizationState.AuthorizationStateWaitCode>()
            .Subscribe(state => OnWaitingConfirmCode(!state.IsRegistered))
            .DisposeWith(_modelDisposable);

            stateObservable
            .OfType <TdApi.AuthorizationState.AuthorizationStateWaitPassword>()
            .Subscribe(state => OnWaitingPassword())
            .DisposeWith(_modelDisposable);
        }
        private IDisposable BindAuthenticator(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(
                () => authenticator.SetPhoneNumber(Model.PhoneNumber),
                canSendCode, RxApp.MainThreadScheduler);

            Model.CheckCodeCommand = ReactiveCommand.CreateFromObservable(
                () => authenticator.CheckCode(Model.ConfirmCode, Model.FirstName, Model.LastName),
                canCheckCode, RxApp.MainThreadScheduler);

            Model.CheckPasswordCommand = ReactiveCommand.CreateFromObservable(
                () => authenticator.CheckPassword(Model.Password),
                canCheckPassword, RxApp.MainThreadScheduler);

            var stateObservable = authenticator
                                  .ObserveState()
                                  .SubscribeOn(TaskPoolScheduler.Default)
                                  .ObserveOn(RxApp.MainThreadScheduler);

            return(stateObservable
                   .Subscribe(state =>
            {
                switch (state)
                {
                case TdApi.AuthorizationState.AuthorizationStateWaitPhoneNumber _:
                    OnWaitingPhoneNumber();
                    break;

                case TdApi.AuthorizationState.AuthorizationStateWaitCode wait:
                    OnWaitingConfirmCode(!wait.IsRegistered);
                    break;

                case TdApi.AuthorizationState.AuthorizationStateWaitPassword _:
                    OnWaitingPassword();
                    break;
                }
            }));
        }