using System; using System.Collections; using System.Collections.Generic; using System.Threading; using BITKit; using BITKit.Mod; using BITKit.UX; using Com.Project.B.Lobby; using Cysharp.Threading.Tasks; using Project.B.Player; using UnityEngine; using UnityEngine.UIElements; namespace Project.B.UX { public class UXLobbySearch : UIToolKitPanel { protected override string DocumentPath=>"ux_lobby_search"; private const string TemplatePath="ux_lobby_search-template"; private VisualTreeAsset _template; public override bool AllowCursor => true; public override bool IsWindow => true; public override bool CloseWhenClickOutside => true; private readonly ILobbyServices _lobbyServices; private readonly IUXWaiting _uxWaiting; private readonly IUXDialogue _dialogue; private readonly IPlayerData _playerData; public UXLobbySearch(IUXService uxService, ILobbyServices lobbyServices, IUXWaiting uxWaiting, IPlayerData playerData, IUXDialogue dialogue) : base(uxService) { _lobbyServices = lobbyServices; _uxWaiting = uxWaiting; _playerData = playerData; _dialogue = dialogue; } [UXBindPath("lobby-container")] private VisualElement _lobbyContainer; [UXBindPath("refresh-button")] private Button _refreshButton; private CancellationTokenSource _cancellationTokenSource; public override async UniTask EntryAsync() { await base.EntryAsync(); UXUtils.Inject(this); _template =await ModService.LoadAsset(TemplatePath); _refreshButton.clicked+=()=>Rebuild().Forget(); await Rebuild(); } private async UniTask Rebuild() { try { _cancellationTokenSource?.Cancel(); _cancellationTokenSource = new CancellationTokenSource(); var token = _cancellationTokenSource.Token; _lobbyContainer.Clear(); foreach (var lobbyData in await _lobbyServices.GetAllLobbyDataAsync()) { if (RootVisualElement is null || token.IsCancellationRequested) return; var container = _lobbyContainer.Create(_template); container.Get