using CounterStrikeSharp.API.Core.Capabilities; using Microsoft.Extensions.Logging; using PanoramaUiKit.Shared.Api; using PanoramaUiKit.Shared.Banners; using PanoramaUiKit.Shared.Common; using PanoramaUiKit.Shared.Menus; using PanoramaUiKit.Shared.Toasts; using PanoramaUiKit.Shared.Votes; namespace CS2_SimpleAdmin.Menus; /// /// Access to the Panorama UI Kit plugin and the layouts SimpleAdmin draws on. /// internal static class UiKit { private static readonly PluginCapability Capability = new(IPanoramaUiKit.CapabilityName); internal static MenuLayout MenuLayout { get; private set; } = new() { Name = "uikit_menu" }; internal static VoteLayout VoteLayout { get; private set; } = new() { Name = "uikit_vote" }; internal static BannerLayout BannerLayout { get; private set; } = new() { Name = "uikit_banner" }; internal static ToastLayout ToastLayout { get; private set; } = new() { Name = "uikit_toast" }; /// /// Resolved on every use so a hot reload of the kit is picked up. /// internal static IPanoramaUiKit? Instance { get { try { return Capability.Get(); } catch (Exception) { return null; } } } internal static void Configure(MenuConfig config) { MenuLayout = new MenuLayout { Name = config.MenuLayout }; VoteLayout = new VoteLayout { Name = config.VoteLayout }; BannerLayout = new BannerLayout { Name = config.BannerLayout }; ToastLayout = new ToastLayout { Name = config.ToastLayout }; } /// /// Spawns the layouts up front: creating one on first use sends the client one big burst. /// internal static bool Preload(ILogger logger) { IPanoramaUiKit? kit = Instance; if (kit == null) { logger.LogError("Panorama UI Kit not found: install PanoramaUiKit and shared/PanoramaUiKit.Shared."); return false; } if (kit.Version != IPanoramaUiKit.ApiVersion) { logger.LogWarning("Panorama UI Kit API v{Running}, SimpleAdmin built against v{Built}.", kit.Version, IPanoramaUiKit.ApiVersion); } UiLayout[] layouts = [MenuLayout, VoteLayout, BannerLayout, ToastLayout]; foreach (UiLayout layout in layouts) { if (!kit.Preload(layout)) { logger.LogError("Layout {Layout} was refused, see the Panorama UI Kit log.", layout); } } return true; } }