@inherits LayoutComponentBase @using TradingBot.Services @using TradingBot.Models @inject TradingBotService BotService @inject SettingsService SettingsService @inject NavigationManager Navigation @implements IDisposable
@Body
@code { private bool sidebarCollapsed = false; private bool isRunning => BotService.Status.IsRunning; private decimal portfolioValue = 0; private decimal totalProfit = 0; protected override void OnInitialized() { var settings = SettingsService.GetSettings(); sidebarCollapsed = settings.SidebarCollapsed; BotService.OnStatusChanged += HandleUpdate; BotService.OnPriceUpdated += HandlePriceUpdate; SettingsService.OnSettingsChanged += HandleSettingsChanged; UpdateStats(); if (settings.AutoStartBot && !BotService.Status.IsRunning) { BotService.Start(); } } private void ToggleSidebar() { sidebarCollapsed = !sidebarCollapsed; SettingsService.UpdateSetting(nameof(AppSettings.SidebarCollapsed), sidebarCollapsed); StateHasChanged(); // Force immediate UI update Console.WriteLine($"Sidebar toggled: collapsed={sidebarCollapsed}"); // Debug log } private void ToggleBot() { if (isRunning) BotService.Stop(); else BotService.Start(); } private void UpdateStats() { portfolioValue = BotService.AssetConfigurations.Values.Sum(c => c.CurrentBalance + (c.CurrentHoldings * (BotService.GetLatestPrice(c.Symbol)?.Price ?? 0))); totalProfit = BotService.AssetConfigurations.Values.Sum(c => c.TotalProfit); } private void HandleUpdate() { UpdateStats(); InvokeAsync(StateHasChanged); } private void HandlePriceUpdate(string symbol, MarketPrice price) { UpdateStats(); InvokeAsync(StateHasChanged); } private void HandleSettingsChanged() { var settings = SettingsService.GetSettings(); sidebarCollapsed = settings.SidebarCollapsed; InvokeAsync(StateHasChanged); } public void Dispose() { BotService.OnStatusChanged -= HandleUpdate; BotService.OnPriceUpdated -= HandlePriceUpdate; SettingsService.OnSettingsChanged -= HandleSettingsChanged; } }