mirror of
				https://github.com/bolucat/Archive.git
				synced 2025-10-31 11:57:05 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			116 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using ReactiveUI;
 | |
| using ReactiveUI.Fody.Helpers;
 | |
| using ReactiveUI.Validation.Extensions;
 | |
| using ReactiveUI.Validation.Helpers;
 | |
| using Shadowsocks.Controller;
 | |
| using Shadowsocks.Localization;
 | |
| using Shadowsocks.Model;
 | |
| using Shadowsocks.View;
 | |
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Collections.ObjectModel;
 | |
| using System.Linq;
 | |
| using System.Reactive;
 | |
| using System.Reactive.Linq;
 | |
| using System.Text;
 | |
| using System.Windows;
 | |
| 
 | |
| namespace Shadowsocks.ViewModels
 | |
| {
 | |
|     public class OnlineConfigViewModel : ReactiveValidationObject
 | |
|     {
 | |
|         public OnlineConfigViewModel()
 | |
|         {
 | |
|             _config = Program.MainController.GetCurrentConfiguration();
 | |
|             _controller = Program.MainController;
 | |
|             _menuViewController = Program.MenuController;
 | |
| 
 | |
|             Sources = new ObservableCollection<string>(_config.onlineConfigSource);
 | |
|             SelectedSource = "";
 | |
|             Address = "";
 | |
| 
 | |
|             // TODO in v5: if http:// show warning as materialDesign:HintAssist.HelperText
 | |
|             AddressRule = this.ValidationRule(
 | |
|                 viewModel => viewModel.Address,
 | |
|                 address => address.StartsWith("http://"),
 | |
|                 "Warning: getting online configuration from plain HTTP sources is NOT secure!");
 | |
| 
 | |
|             var canUpdateCopyRemove = this.WhenAnyValue(
 | |
|                 x => x.SelectedSource,
 | |
|                 selectedSource => !string.IsNullOrWhiteSpace(selectedSource));
 | |
|             var canUpdateAll = this.WhenAnyValue(
 | |
|                 x => x.Sources.Count,
 | |
|                 count => count > 0);
 | |
|             var canAdd = this.WhenAnyValue(
 | |
|                 x => x.Address,
 | |
|                 address => Uri.IsWellFormedUriString(address, UriKind.Absolute) &&
 | |
|                 (address.StartsWith("https://") || address.StartsWith("http://")));
 | |
| 
 | |
|             Update = ReactiveCommand.CreateFromTask(() => _controller.UpdateOnlineConfig(SelectedSource), canUpdateCopyRemove);
 | |
|             UpdateAll = ReactiveCommand.CreateFromTask(_controller.UpdateAllOnlineConfig, canUpdateAll);
 | |
|             CopyLink = ReactiveCommand.Create(() => Clipboard.SetText(SelectedSource), canUpdateCopyRemove);
 | |
|             Remove = ReactiveCommand.Create(() =>
 | |
|             {
 | |
|                 bool result;
 | |
|                 var urlToRemove = SelectedSource; // save it here because SelectedSource is lost once we remove the selection
 | |
|                 do
 | |
|                 {
 | |
|                     result = Sources.Remove(urlToRemove);
 | |
|                 } while (result);
 | |
|                 _controller.RemoveOnlineConfig(urlToRemove);
 | |
|             }, canUpdateCopyRemove);
 | |
|             Add = ReactiveCommand.Create(() =>
 | |
|             {
 | |
|                 Sources.Add(Address);
 | |
|                 SelectedSource = Address;
 | |
|                 _controller.SaveOnlineConfigSource(Sources.ToList());
 | |
|                 Address = "";
 | |
|             }, canAdd);
 | |
| 
 | |
|             // TODO in v5: use MaterialDesignThemes snackbar messages
 | |
|             this.WhenAnyObservable(x => x.Update)
 | |
|                 .Subscribe(x =>
 | |
|                 {
 | |
|                     if (x)
 | |
|                         MessageBox.Show(LocalizationProvider.GetLocalizedValue<string>("sip008UpdateSuccess"));
 | |
|                     else
 | |
|                         MessageBox.Show(LocalizationProvider.GetLocalizedValue<string>("sip008UpdateFailure"));
 | |
|                 });
 | |
|             this.WhenAnyObservable(x => x.UpdateAll)
 | |
|                 .Subscribe(x =>
 | |
|                 {
 | |
|                     if (x.Count == 0)
 | |
|                         MessageBox.Show(LocalizationProvider.GetLocalizedValue<string>("sip008UpdateAllSuccess"));
 | |
|                     else
 | |
|                     {
 | |
|                         var stringBuilder = new StringBuilder(LocalizationProvider.GetLocalizedValue<string>("sip008UpdateAllFailure"));
 | |
|                         foreach (var url in x)
 | |
|                             stringBuilder.AppendLine(url);
 | |
|                         MessageBox.Show(stringBuilder.ToString());
 | |
|                     }
 | |
|                 });
 | |
|         }
 | |
| 
 | |
|         private readonly Configuration _config;
 | |
|         private readonly ShadowsocksController _controller;
 | |
|         private readonly MenuViewController _menuViewController;
 | |
| 
 | |
|         public ValidationHelper AddressRule { get; }
 | |
| 
 | |
|         public ReactiveCommand<Unit, bool> Update { get; }
 | |
|         public ReactiveCommand<Unit, List<string>> UpdateAll { get; }
 | |
|         public ReactiveCommand<Unit, Unit> CopyLink { get; }
 | |
|         public ReactiveCommand<Unit, Unit> Remove { get; }
 | |
|         public ReactiveCommand<Unit, Unit> Add { get; }
 | |
| 
 | |
|         [Reactive]
 | |
|         public ObservableCollection<string> Sources { get; private set; }
 | |
| 
 | |
|         [Reactive]
 | |
|         public string SelectedSource { get; set; }
 | |
| 
 | |
|         [Reactive]
 | |
|         public string Address { get; set; }
 | |
|     }
 | |
| }
 | 
![github-action[bot]](/assets/img/avatar_default.png)