Update On Tue Dec 31 19:31:58 CET 2024

This commit is contained in:
github-action[bot]
2024-12-31 19:31:59 +01:00
parent 24d7dba717
commit a3e7f86215
576 changed files with 22919 additions and 15080 deletions

View File

@@ -0,0 +1,115 @@
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; }
}
}