< Summary

Class:DCL.Chat.HUD.SearchChannelsWindowController
Assembly:WorldChatWindowHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/WorldChatWindowHUD/SearchChannelsWindowController.cs
Covered lines:115
Uncovered lines:8
Coverable lines:123
Total lines:235
Line coverage:93.4% (115 of 123)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
SearchChannelsWindowController(...)0%110100%
Initialize(...)0%220100%
Dispose()0%110100%
SetVisiblePanelList(...)0%220100%
SetVisibility(...)0%330100%
OpenChannelCreationWindow()0%220100%
SearchChannels(...)0%220100%
ShowRequestedChannels(...)0%4.114081.25%
UpdateChannelInfo(...)0%2100%
LoadMoreChannels()0%4.134080%
IsLoading()0%110100%
HandleViewClosed()0%6200%
HandleViewBacked()0%6200%
ClearListeners()0%110100%
WaitTimeoutThenHideLoading()0%4.054085.71%
HandleJoinChannel(...)0%110100%
HandleLeaveChannel(...)0%220100%
OnAllowedToCreateChannelsChanged(...)0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/WorldChatWindowHUD/SearchChannelsWindowController.cs

#LineLine coverage
 1using System;
 2using System.Threading;
 3using Cysharp.Threading.Tasks;
 4using Channel = DCL.Chat.Channels.Channel;
 5using System.Collections.Generic;
 6using SocialFeaturesAnalytics;
 7
 8namespace DCL.Chat.HUD
 9{
 10    public class SearchChannelsWindowController : IHUD
 11    {
 12        private const int LOAD_TIMEOUT = 2;
 13        internal const int LOAD_PAGE_SIZE = 15;
 14
 15        private readonly IChatController chatController;
 16        private readonly IMouseCatcher mouseCatcher;
 17        private readonly DataStore dataStore;
 18        private readonly ISocialAnalytics socialAnalytics;
 19        private readonly IUserProfileBridge userProfileBridge;
 20        private readonly IChannelsFeatureFlagService channelsFeatureFlagService;
 21        private ISearchChannelsWindowView view;
 1422        private DateTime loadStartedTimestamp = DateTime.MinValue;
 1423        private CancellationTokenSource loadingCancellationToken = new CancellationTokenSource();
 24        private string paginationToken;
 25        private string searchText;
 3426        private BaseVariable<HashSet<string>> visibleTaskbarPanels => dataStore.HUDs.visibleTaskbarPanels;
 27        private bool isSearchingByName;
 28
 029        public ISearchChannelsWindowView View => view;
 30
 31        public event Action OnClosed;
 32        public event Action OnBack;
 33        public event Action OnOpenChannelCreation;
 34        public event Action<string> OnOpenChannelLeave;
 35
 1436        public SearchChannelsWindowController(IChatController chatController,
 37            IMouseCatcher mouseCatcher,
 38            DataStore dataStore,
 39            ISocialAnalytics socialAnalytics,
 40            IUserProfileBridge userProfileBridge,
 41            IChannelsFeatureFlagService channelsFeatureFlagService)
 42        {
 1443            this.chatController = chatController;
 1444            this.mouseCatcher = mouseCatcher;
 1445            this.dataStore = dataStore;
 1446            this.socialAnalytics = socialAnalytics;
 1447            this.userProfileBridge = userProfileBridge;
 1448            this.channelsFeatureFlagService = channelsFeatureFlagService;
 1449        }
 50
 51        public void Initialize(ISearchChannelsWindowView view = null)
 52        {
 1453            view ??= SearchChannelsWindowComponentView.Create();
 1454            this.view = view;
 55
 1456            channelsFeatureFlagService.OnAllowedToCreateChannelsChanged += OnAllowedToCreateChannelsChanged;
 1457        }
 58
 59        public void Dispose()
 60        {
 1361            ClearListeners();
 1362            view.Dispose();
 1363            loadingCancellationToken.Cancel();
 1364            loadingCancellationToken.Dispose();
 65
 1366            channelsFeatureFlagService.OnAllowedToCreateChannelsChanged -= OnAllowedToCreateChannelsChanged;
 1367        }
 68
 69        private void SetVisiblePanelList(bool visible)
 70        {
 1771            HashSet<string> newSet = visibleTaskbarPanels.Get();
 1772            if (visible)
 1173                newSet.Add("SearchChanel");
 74            else
 675                newSet.Remove("SearchChanel");
 76
 1777            visibleTaskbarPanels.Set(newSet, true);
 1778        }
 79
 80        public void SetVisibility(bool visible)
 81        {
 1782            SetVisiblePanelList(visible);
 1783            if (visible)
 84            {
 1185                ClearListeners();
 86
 1187                view.ClearSearchInput();
 88
 1189                view.OnSearchUpdated += SearchChannels;
 1190                view.OnRequestMoreChannels += LoadMoreChannels;
 1191                view.OnBack += HandleViewBacked;
 92
 1193                if (mouseCatcher != null)
 1194                    mouseCatcher.OnMouseLock += HandleViewClosed;
 95
 1196                view.OnClose += HandleViewClosed;
 1197                view.OnJoinChannel += HandleJoinChannel;
 1198                view.OnLeaveChannel += HandleLeaveChannel;
 1199                view.OnCreateChannel += OpenChannelCreationWindow;
 11100                chatController.OnChannelSearchResult += ShowRequestedChannels;
 11101                chatController.OnChannelUpdated += UpdateChannelInfo;
 102
 11103                view.Show();
 11104                view.ClearAllEntries();
 11105                view.ShowLoading();
 106
 11107                loadStartedTimestamp = DateTime.Now;
 11108                paginationToken = null;
 11109                chatController.GetChannels(LOAD_PAGE_SIZE);
 110
 11111                loadingCancellationToken.Cancel();
 11112                loadingCancellationToken = new CancellationTokenSource();
 11113                WaitTimeoutThenHideLoading(loadingCancellationToken.Token).Forget();
 11114            }
 115            else
 116            {
 6117                ClearListeners();
 6118                view.Hide();
 119            }
 6120        }
 121
 122        private void OpenChannelCreationWindow()
 123        {
 1124            dataStore.channels.channelJoinedSource.Set(ChannelJoinedSource.Search);
 1125            OnOpenChannelCreation?.Invoke();
 1126        }
 127
 128        private void SearchChannels(string searchText)
 129        {
 3130            loadStartedTimestamp = DateTime.Now;
 3131            paginationToken = null;
 3132            view.ClearAllEntries();
 3133            view.HideLoadingMore();
 3134            view.ShowLoading();
 3135            view.HideResultsHeader();
 3136            view.HideCreateChannelOnSearch();
 3137            this.searchText = searchText;
 3138            isSearchingByName = !string.IsNullOrEmpty(searchText);
 139
 3140            if (!isSearchingByName)
 1141                chatController.GetChannels(LOAD_PAGE_SIZE);
 142            else
 143            {
 2144                chatController.GetChannelsByName(LOAD_PAGE_SIZE, searchText);
 2145                socialAnalytics.SendChannelSearch(searchText);
 146            }
 147
 3148            loadingCancellationToken.Cancel();
 3149            loadingCancellationToken = new CancellationTokenSource();
 3150            WaitTimeoutThenHideLoading(loadingCancellationToken.Token).Forget();
 3151        }
 152
 153        private void ShowRequestedChannels(string paginationToken, Channel[] channels)
 154        {
 3155            this.paginationToken = paginationToken;
 156
 8157            foreach (var channel in channels)
 1158                view.Set(channel);
 159
 3160            if (isSearchingByName)
 161            {
 1162                view.HideLoadingMore();
 163
 1164                if (view.EntryCount > 0)
 165                {
 1166                    view.ShowResultsHeader();
 1167                    view.ShowCreateChannelOnSearch();
 1168                }
 169                else
 170                {
 0171                    view.HideResultsHeader();
 0172                    view.HideCreateChannelOnSearch();
 173                }
 0174            }
 175            else
 2176                view.ShowLoadingMore();
 2177        }
 178
 0179        private void UpdateChannelInfo(Channel updatedChannel) => view.Set(updatedChannel);
 180
 181        private void LoadMoreChannels()
 182        {
 2183            if (IsLoading()) return;
 2184            if (string.IsNullOrEmpty(paginationToken)) return;
 185
 2186            loadStartedTimestamp = DateTime.Now;
 2187            view.HideLoadingMore();
 188
 2189            if (string.IsNullOrEmpty(searchText))
 1190                chatController.GetChannels(LOAD_PAGE_SIZE, paginationToken);
 191            else
 1192                chatController.GetChannelsByName(LOAD_PAGE_SIZE, searchText, paginationToken);
 1193        }
 194
 2195        private bool IsLoading() => (DateTime.Now - loadStartedTimestamp).TotalSeconds < LOAD_TIMEOUT;
 196
 0197        private void HandleViewClosed() => OnClosed?.Invoke();
 198
 0199        private void HandleViewBacked() => OnBack?.Invoke();
 200
 201        private void ClearListeners()
 202        {
 30203            chatController.OnChannelSearchResult -= ShowRequestedChannels;
 30204            chatController.OnChannelUpdated -= UpdateChannelInfo;
 30205            view.OnSearchUpdated -= SearchChannels;
 30206            view.OnRequestMoreChannels -= LoadMoreChannels;
 30207            view.OnBack -= HandleViewBacked;
 30208            view.OnClose -= HandleViewClosed;
 30209            view.OnJoinChannel -= HandleJoinChannel;
 30210            view.OnLeaveChannel -= HandleLeaveChannel;
 30211            view.OnCreateChannel -= OpenChannelCreationWindow;
 30212        }
 213
 214        private async UniTask WaitTimeoutThenHideLoading(CancellationToken cancellationToken)
 215        {
 42216            await UniTask.Delay(LOAD_TIMEOUT * 1000, cancellationToken: cancellationToken);
 4217            if (cancellationToken.IsCancellationRequested) return;
 4218            view.HideLoading();
 4219        }
 220
 221        private void HandleJoinChannel(string channelId)
 222        {
 1223            dataStore.channels.channelJoinedSource.Set(ChannelJoinedSource.Search);
 1224            chatController.JoinOrCreateChannel(channelId);
 1225        }
 226
 227        private void HandleLeaveChannel(string channelId)
 228        {
 1229            dataStore.channels.channelLeaveSource.Set(ChannelLeaveSource.Search);
 1230            OnOpenChannelLeave?.Invoke(channelId);
 1231        }
 232
 0233        private void OnAllowedToCreateChannelsChanged(bool isAllowed) => view.SetCreateChannelButtonsActive(isAllowed);
 234    }
 235}