using System; using System.Threading; using System.Threading.Tasks; using System.Windows; using Aitex.Core.Account; namespace MECF.Framework.UI.Client.ClientBase.Dialog { /// /// Interaction logic for LoginRequestConfirmationDialog.xaml /// public partial class LoginRequestConfirmationDialog : Window { #region Variables private readonly Credential _requestingCredential; private readonly CancellationTokenSource _ctsCountDownTask; private readonly IProgress _progCountDown; #endregion public LoginRequestConfirmationDialog(Credential requestingCredential) { _requestingCredential = requestingCredential; _ctsCountDownTask = new CancellationTokenSource(); _progCountDown = new Progress(countDown => { if (countDown > 0) BtnRejected.Content = $"Reject ({countDown:F0}s)"; else DialogResult = false; }); InitializeComponent(); } #region Properties public string Description => $"User [{_requestingCredential}] is requesting to login from somewhere, do you agree to it's request and logout from the system?"; #endregion protected override void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized(e); var closeTime = DateTime.Now.Add(TimeSpan.FromSeconds(CredentialManager.REQ_LOGIN_DIALOG_LIFT_TIME_SEC)); Task.Run(() => { while (true) { var timeRemained = (closeTime - DateTime.Now).TotalSeconds; if (timeRemained <= 0) { // force to reject _progCountDown.Report(0); break; } _progCountDown.Report(timeRemained); Thread.Sleep(500); if (_ctsCountDownTask.Token.IsCancellationRequested) break; } }); } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { _ctsCountDownTask?.Cancel(); } private void BtnRejected_Click(object sender, RoutedEventArgs e) { DialogResult = false; } private void BtnAccept_Click(object sender, RoutedEventArgs e) { DialogResult = true; } } }