Files
Mimante/Mimante/Core/MainWindow.UserInfo.cs
Alberto Balbo 62d5cebf9c Refactoring gestione sessione e persistenza impostazioni
Introdotto `SessionService` per centralizzare la gestione della
sessione utente, migliorando la separazione delle responsabilità
e la testabilità. Risolto il problema del caricamento del cookie
di autenticazione all'avvio e garantita la persistenza delle
checkbox di esportazione (`IncludeMetadata`, `RemoveAfterExport`,
`OverwriteExisting`).

Ottimizzata la gestione della barra degli indirizzi del browser
con aggiornamenti locali immediati. Applicato il pattern "Load ?
Modify ? Save" per il salvataggio delle impostazioni, migliorando
la simmetria e la leggibilità del codice. Logging centralizzato
e semplificato per eventi rilevanti.

Aggiornata la documentazione per riflettere i cambiamenti e
verificati i test per garantire il corretto funzionamento.
2025-11-24 12:00:13 +01:00

201 lines
7.2 KiB
C#

using System;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using AutoBidder.Services;
using AutoBidder.Utilities;
namespace AutoBidder
{
/// <summary>
/// User info and banner management - REFACTORED con SessionService
/// </summary>
public partial class MainWindow
{
private System.Windows.Threading.DispatcherTimer _userBannerTimer;
private System.Windows.Threading.DispatcherTimer _userHtmlTimer;
private SessionService _sessionService; // NUOVO: Servizio centralizzato
private void InitializeUserInfoTimers()
{
// Timer per aggiornamento dati utente da HTML ogni 5 minuti (PRINCIPALE)
_userHtmlTimer = new System.Windows.Threading.DispatcherTimer();
_userHtmlTimer.Interval = TimeSpan.FromMinutes(5);
_userHtmlTimer.Tick += UserHtmlTimer_Tick;
_userHtmlTimer.Start();
// Timer per aggiornamento banner API ogni 10 minuti (SECONDARIO - fallback)
_userBannerTimer = new System.Windows.Threading.DispatcherTimer();
_userBannerTimer.Interval = TimeSpan.FromMinutes(10);
_userBannerTimer.Tick += UserBannerTimer_Tick;
_userBannerTimer.Start();
}
private void InitializeSessionService()
{
// NUOVO: Inizializza SessionService
_sessionService = new SessionService(_auctionMonitor.GetApiClient());
// Event handlers
_sessionService.OnLog += (msg) => Log(msg, LogLevel.Info);
_sessionService.OnSessionChanged += (session) =>
{
Dispatcher.Invoke(() => SetUserBanner(session.Username, session.RemainingBids));
};
}
private void SetUserBanner(string username, int? remainingBids)
{
try
{
var session = _sessionService?.GetCurrentSession();
if (!string.IsNullOrEmpty(username))
{
// === HEADER - 2 RIGHE ===
// Riga 1: Puntate + Credito
RemainingBidsText.Text = remainingBids?.ToString() ?? "0";
if (session?.ShopCredit > 0)
{
AuctionMonitor.ShopCreditText.Text = $"EUR {session.ShopCredit:F2}";
}
else
{
AuctionMonitor.ShopCreditText.Text = "EUR 0.00";
}
// Riga 2: Aste vinte (TODO: implementare)
BannerAsteDaRiscattare.Text = "0";
// === SIDEBAR - Pannello Utente ===
// Username
SidebarUsernameText.Text = username;
// ID Utente
if (session?.UserId > 0)
{
SidebarUserIdText.Text = $"ID: {session.UserId}";
SidebarUserIdText.Visibility = System.Windows.Visibility.Visible;
}
else
{
SidebarUserIdText.Visibility = System.Windows.Visibility.Collapsed;
}
// Email
if (!string.IsNullOrEmpty(session?.Email))
{
SidebarUserEmailText.Text = session.Email;
SidebarUserEmailText.Visibility = System.Windows.Visibility.Visible;
}
else
{
SidebarUserEmailText.Visibility = System.Windows.Visibility.Collapsed;
}
// Mostra il pannello sidebar
SidebarUserInfoPanel.Visibility = System.Windows.Visibility.Visible;
}
else
{
// Nascondi pannello sidebar
SidebarUserInfoPanel.Visibility = System.Windows.Visibility.Collapsed;
// Reset header
RemainingBidsText.Text = "0";
AuctionMonitor.ShopCreditText.Text = "EUR 0.00";
BannerAsteDaRiscattare.Text = "0";
}
}
catch { }
}
private async void UserBannerTimer_Tick(object? sender, EventArgs e)
{
// Usa SessionService per refresh
if (_sessionService != null)
{
await _sessionService.RefreshUserInfoAsync();
}
}
private async void UserHtmlTimer_Tick(object? sender, EventArgs e)
{
// Usa SessionService per refresh
if (_sessionService != null)
{
await _sessionService.RefreshUserInfoAsync();
}
}
/// <summary>
/// Carica sessione salvata - SEMPLIFICATO con SessionService
/// </summary>
private async void LoadSavedSession()
{
try
{
// 1. Carica sessione da disco
var session = _sessionService.LoadSession();
if (session == null)
{
return;
}
// 2. Mostra cookie in UI
try
{
SettingsCookieTextBox.Text = session.CookieString ?? string.Empty;
}
catch { }
StartButton.IsEnabled = true;
// 3. Valida e attiva in background
_ = Task.Run(async () =>
{
var result = await _sessionService.ValidateAndActivateSessionAsync(
session.CookieString,
session.Username
);
if (!result.Success)
{
Dispatcher.Invoke(() =>
{
Log($"[WARN] Validazione fallita: {result.ErrorMessage}");
Log($"[INFO] Aggiorna il cookie nelle Impostazioni se necessario");
});
}
});
}
catch (Exception ex)
{
Log($"[WARN] Errore caricamento sessione: {ex.Message}");
}
}
/// <summary>
/// Aggiorna immediatamente il banner delle puntate residue (chiamato dopo ogni puntata)
/// </summary>
public void UpdateRemainingBidsDisplay()
{
try
{
var session = _sessionService?.GetCurrentSession();
if (session != null && session.RemainingBids > 0)
{
RemainingBidsText.Text = session.RemainingBids.ToString();
Log($"[BANNER UPDATE] Puntate residue aggiornate: {session.RemainingBids}", LogLevel.Info);
}
}
catch (Exception ex)
{
Log($"[ERROR] Errore aggiornamento banner: {ex.Message}", LogLevel.Error);
}
}
}
}