using Microsoft.UI.Dispatching; using RblxTool.Interop; using RblxTool.Models; namespace RblxTool.Services; public sealed class AppState { private static readonly Lazy Instance = new(() => new AppState()); private AppState() { Engine = RblxEngine.Open(); } public static AppState Current => Instance.Value; public RblxEngine Engine { get; } public AccountSummary? Active { get; private set; } public event Action? AccountsChanged; public IReadOnlyList Accounts() { var accounts = Engine.Accounts(); Active ??= accounts.FirstOrDefault(); return accounts; } public void SetActive(AccountSummary account) { if (Engine.Select(account.Id)) { Active = account; AccountsChanged?.Invoke(); } } public void NotifyAccountsChanged() { Active = Engine.Accounts().FirstOrDefault(a => a.Id == Active?.Id) ?? Engine.Accounts().FirstOrDefault(); AccountsChanged?.Invoke(); } public JobRunner CreateRunner(DispatcherQueue dispatcher) => new(Engine, dispatcher); }