diff --git a/Directory.Build.props b/Directory.Build.props index 71e49a5..88ed8e8 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 0.5.1 + 0.5.2 me-web? Arasaka di Hvozdikov Yevheniy © 2026 Arasaka di Hvozdikov Yevheniy diff --git a/src/MeWeb.App/ViewModels/MainViewModel.cs b/src/MeWeb.App/ViewModels/MainViewModel.cs index 7961f05..d2806b9 100644 --- a/src/MeWeb.App/ViewModels/MainViewModel.cs +++ b/src/MeWeb.App/ViewModels/MainViewModel.cs @@ -45,6 +45,8 @@ public partial class MainViewModel : ObservableObject readonly Leftovers leftovers; readonly Submissions submissions; RunReport lastRun; + int checks; + bool sent; bool revealing; bool instant; @@ -198,15 +200,20 @@ public partial class MainViewModel : ObservableObject HistoryCleared = false; AskReach = false; OfferShare = false; + sent = false; ShareResult = null; + var generation = ++checks; foreach (var card in Cards) card.Finding = card.Id == CheckId.Reach ? null : Finding.Running(card.Id); Uses.Clear(); ResetPath(platform.Device); try { - lastRun = await runner.Run((finding, run) => Dispatcher.UIThread.Post(() => Apply(finding, run)), ct); + lastRun = await runner.Run((finding, run) => Dispatcher.UIThread.Post(() => + { + if (generation == checks) Apply(finding, run); + }), ct); ShowUses(lastRun); - OfferShare = true; + OfferShare = lastRun.Stun?.Ports?.LifetimeDone != false; OnPropertyChanged(nameof(CanOpenPorts)); AskReach = lastRun.PublicV4 is not null || lastRun.PublicV6 is not null; if (!AskReach) SettleReach(null); @@ -296,6 +303,7 @@ public partial class MainViewModel : ObservableObject Shared.Add(new SubmissionViewModel(submission, Unshare)); OnPropertyChanged(nameof(ShowShared)); ShareResult = Localizer.Instance.Format("ShareSent", shared.Id, Texts.Date(shared.KeepUntil)); + sent = true; OfferShare = false; } finally @@ -474,6 +482,7 @@ public partial class MainViewModel : ObservableObject var ports = run.Stun?.Ports; if (exit is not null && run.Nat == NatKind.Shared && run.PublicV4 is not null && ports?.Pattern is PortPattern.InOrder or PortPattern.Block) exit.Details = Lines(Address($"{run.PublicV4}:{ports.Low}–{ports.High}")); + if (ports?.LifetimeDone == true && run == lastRun && !IsChecking && !sent) OfferShare = true; break; case CheckId.Addresses: var internet = Node(NodeRole.Internet);