Example #1
0
        public LoginOrRegisterWindowViewModel()
        {
            Title = GetTitleByDisplayName(DisplayName);

            ChooseChannel = ReactiveCommand.CreateFromTask <string>(async channel_ =>
            {
                if (Enum.TryParse <FastLoginChannel>(channel_, out var channel))
                {
                    CurrentSelectChannel = channel_;
                    ChangeLoginState(3);
                    await ThirdPartyLoginHelper.StartAsync(this, channel, isBind: false);
                }
                else
                {
                    switch (channel_)
                    {
                    case FastLoginChannelViewModel.PhoneNumber:
                        ChangeLoginState(1);
                        break;
                    }
                }
            });
            ManualLogin   = ThirdPartyLoginHelper.ManualLogin;
            SendSms       = ReactiveCommand.CreateFromTask(SendSmsAsync);
            Submit        = ReactiveCommand.CreateFromTask(SubmitAsync);
            OpenHyperlink = ReactiveCommand.Create <string>(OpenHyperlink_);

            //SteamConnectService.Current.WhenAnyValue(x => x.CurrentSteamUser)
            //    .Subscribe(_ => this.RaisePropertyChanged(nameof(SteamUser)));

            fastLoginChannels = new(GetFastLoginChannels());
        }
        public UserProfileWindowViewModel()
        {
            Title = GetTitleByDisplayName(DisplayName);

            userManager = DI.Get <IUserManager>();
            Initialize_Ctor();
            async void Initialize_Ctor()
            {
                this.InitAreas();
                userInfoSource = await userManager.GetCurrentUserInfoAsync() ?? new UserInfoDTO();

                userInfoValue = Serializable.SMP(userInfoSource);

                // (SetFields)DTO => VM
                _UID       = userInfoSource.Id.ToString();
                _NickName  = userInfoSource.NickName;
                _Gender    = userInfoSource.Gender;
                _BirthDate = userInfoSource.GetBirthDate();
                if (userInfoSource.AreaId.HasValue)
                {
                    this.SetAreaId(userInfoSource.AreaId.Value);
                }

                userInfoSource = Serializable.DMP <UserInfoDTO>(userInfoValue) ?? throw new ArgumentNullException(nameof(userInfoSource));
                // IsModifySubscribe
                void SubscribeOnNext <T>(T?value, Action <T?> onNext)
                {
                    onNext(value);
                    DetectionIsModify();
                }

                void SubscribeFormItem <T>(Expression <Func <UserProfileWindowViewModel, T?> > expression, Action <T?> onNext) => this.WhenValueChanged(expression, false).Subscribe(value => SubscribeOnNext(value, onNext)).AddTo(this);

                SubscribeFormItem(x => x.NickName, x => userInfoSource.NickName = x ?? string.Empty);
                SubscribeFormItem(x => x.Gender, x => userInfoSource.Gender     = x);
                SubscribeFormItem(x => x.BirthDate, x => userInfoSource.SetBirthDate(x));
                void SubscribeAreaOnNext(IArea?area)
                {
                    var areaId = area?.Id;

                    userInfoSource.AreaId = (!areaId.HasValue ||
                                             areaId.Value == AreaUIHelper.PleaseSelect.Id) ?
                                            this.GetSelectAreaId() : areaId;
                }

                SubscribeFormItem(x => x.AreaSelectItem2, SubscribeAreaOnNext);
                SubscribeFormItem(x => x.AreaSelectItem3, SubscribeAreaOnNext);
                SubscribeFormItem(x => x.AreaSelectItem4, SubscribeAreaOnNext);
            }

            OnBindFastLoginClick = ReactiveCommand.CreateFromTask <string>(async channel_ =>
            {
                if (Enum.TryParse <FastLoginChannel>(channel_, out var channel))
                {
                    CurrentSelectChannel = channel_;
                    await ThirdPartyLoginHelper.StartAsync(this, channel, isBind: true);
                }
            });
            OnManualLoginClick       = ThirdPartyLoginHelper.ManualLogin;
            OnUnbundleFastLoginClick = ReactiveCommand.CreateFromTask <string>(async channel_ =>
            {
                if (Enum.TryParse <FastLoginChannel>(channel_, out var channel))
                {
                    await OnUnbundleFastLoginClickAsync(channel);
                }
            });
            OnCancelBindFastLoginClick = ReactiveCommand.Create(HideFastLoginLoading);
            UIDCommand = ReactiveCommand.CreateFromTask(async() =>
            {
                await IApplication.CopyToClipboardAsync(_UID);
            });
        }