using ReactiveUI; using ReactiveUI.Fody.Helpers; using System.Reactive; namespace ServiceLib.ViewModels { public class RoutingRuleDetailsViewModel : MyReactiveObject { public IList ProtocolItems { get; set; } public IList InboundTagItems { get; set; } [Reactive] public RulesItem SelectedSource { get; set; } [Reactive] public string Domain { get; set; } [Reactive] public string IP { get; set; } [Reactive] public string Process { get; set; } [Reactive] public bool AutoSort { get; set; } public ReactiveCommand SaveCmd { get; } public RoutingRuleDetailsViewModel(RulesItem rulesItem, Func>? updateView) { _config = AppHandler.Instance.Config; _updateView = updateView; SaveCmd = ReactiveCommand.CreateFromTask(async () => { await SaveRulesAsync(); }); if (rulesItem.Id.IsNullOrEmpty()) { rulesItem.Id = Utils.GetGuid(false); rulesItem.OutboundTag = Global.ProxyTag; rulesItem.Enabled = true; SelectedSource = rulesItem; } else { SelectedSource = rulesItem; } Domain = Utils.List2String(SelectedSource.Domain, true); IP = Utils.List2String(SelectedSource.Ip, true); Process = Utils.List2String(SelectedSource.Process, true); } private async Task SaveRulesAsync() { Domain = Utils.Convert2Comma(Domain); IP = Utils.Convert2Comma(IP); Process = Utils.Convert2Comma(Process); if (AutoSort) { SelectedSource.Domain = Utils.String2ListSorted(Domain); SelectedSource.Ip = Utils.String2ListSorted(IP); SelectedSource.Process = Utils.String2ListSorted(Process); } else { SelectedSource.Domain = Utils.String2List(Domain); SelectedSource.Ip = Utils.String2List(IP); SelectedSource.Process = Utils.String2List(Process); } SelectedSource.Protocol = ProtocolItems?.ToList(); SelectedSource.InboundTag = InboundTagItems?.ToList(); bool hasRule = SelectedSource.Domain?.Count > 0 || SelectedSource.Ip?.Count > 0 || SelectedSource.Protocol?.Count > 0 || SelectedSource.Process?.Count > 0 || Utils.IsNotEmpty(SelectedSource.Port); if (!hasRule) { NoticeHandler.Instance.Enqueue(string.Format(ResUI.RoutingRuleDetailRequiredTips, "Port/Protocol/Domain/IP/Process")); return; } //NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); await _updateView?.Invoke(EViewAction.CloseWindow, null); } } }