< 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:120
Uncovered lines:6
Coverable lines:126
Total lines:242
Line coverage:95.2% (120 of 126)
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%
NavigateToChannel(...)0%3.033085.71%
OpenChannelCreationWindow()0%220100%
SearchChannels(...)0%220100%
ShowRequestedChannels(...)0%4.054085.71%
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.Collections.Generic;
 3using System.Threading;
 4using Cysharp.Threading.Tasks;
 5using SocialFeaturesAnalytics;
 6using Channel = DCL.Chat.Channels.Channel;
 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 IChannelsFeatureFlagService channelsFeatureFlagService;
 20        private ISearchChannelsWindowView view;
 1621        private DateTime loadStartedTimestamp = DateTime.MinValue;
 1622        private CancellationTokenSource loadingCancellationToken = new CancellationTokenSource();
 23        private string paginationToken;
 24        private string searchText;
 3825        private BaseVariable<HashSet<string>> visibleTaskbarPanels => dataStore.HUDs.visibleTaskbarPanels;
 26        private bool isSearchingByName;
 27
 228        public ISearchChannelsWindowView View => view;
 29
 30        public event Action OnClosed;
 31        public event Action OnBack;
 32        public event Action OnOpenChannelCreation;
 33        public event Action<string> OnOpenChannelLeave;
 34
 1635        public SearchChannelsWindowController(IChatController chatController,
 36            IMouseCatcher mouseCatcher,
 37            DataStore dataStore,
 38            ISocialAnalytics socialAnalytics,
 39            IChannelsFeatureFlagService channelsFeatureFlagService)
 40        {
 1641            this.chatController = chatController;
 1642            this.mouseCatcher = mouseCatcher;
 1643            this.dataStore = dataStore;
 1644            this.socialAnalytics = socialAnalytics;
 1645            this.channelsFeatureFlagService = channelsFeatureFlagService;
 1646        }
 47
 48        public void Initialize(ISearchChannelsWindowView view = null)
 49        {
 1650            view ??= SearchChannelsWindowComponentView.Create();
 1651            this.view = view;
 52
 1653            channelsFeatureFlagService.OnAllowedToCreateChannelsChanged += OnAllowedToCreateChannelsChanged;
 1654        }
 55
 56        public void Dispose()
 57        {
 1558            ClearListeners();
 1559            view.Dispose();
 1560            loadingCancellationToken.Cancel();
 1561            loadingCancellationToken.Dispose();
 62
 1563            channelsFeatureFlagService.OnAllowedToCreateChannelsChanged -= OnAllowedToCreateChannelsChanged;
 1564        }
 65
 66        private void SetVisiblePanelList(bool visible)
 67        {
 1968            HashSet<string> newSet = visibleTaskbarPanels.Get();
 1969            if (visible)
 1370                newSet.Add("SearchChanel");
 71            else
 672                newSet.Remove("SearchChanel");
 73
 1974            visibleTaskbarPanels.Set(newSet, true);
 1975        }
 76
 77        public void SetVisibility(bool visible)
 78        {
 1979            SetVisiblePanelList(visible);
 1980            if (visible)
 81            {
 1382                ClearListeners();
 83
 1384                view.ClearSearchInput();
 85
 1386                view.OnSearchUpdated += SearchChannels;
 1387                view.OnRequestMoreChannels += LoadMoreChannels;
 1388                view.OnBack += HandleViewBacked;
 89
 1390                if (mouseCatcher != null)
 1291                    mouseCatcher.OnMouseLock += HandleViewClosed;
 92
 1393                view.OnClose += HandleViewClosed;
 1394                view.OnJoinChannel += HandleJoinChannel;
 1395                view.OnLeaveChannel += HandleLeaveChannel;
 1396                view.OnCreateChannel += OpenChannelCreationWindow;
 1397                view.OnOpenChannel += NavigateToChannel;
 1398                chatController.OnChannelSearchResult += ShowRequestedChannels;
 1399                chatController.OnChannelUpdated += UpdateChannelInfo;
 100
 13101                view.Show();
 13102                view.ClearAllEntries();
 13103                view.ShowLoading();
 104
 13105                loadStartedTimestamp = DateTime.Now;
 13106                paginationToken = null;
 13107                chatController.GetChannels(LOAD_PAGE_SIZE);
 108
 13109                loadingCancellationToken.Cancel();
 13110                loadingCancellationToken = new CancellationTokenSource();
 13111                WaitTimeoutThenHideLoading(loadingCancellationToken.Token).Forget();
 112            }
 113            else
 114            {
 6115                ClearListeners();
 6116                view.Hide();
 117            }
 6118        }
 119
 120        private void NavigateToChannel(string channelId)
 121        {
 2122            var channel = chatController.GetAllocatedChannel(channelId);
 2123            if (channel == null) return;
 3124            if (!channel.Joined) return;
 1125            dataStore.channels.channelToBeOpened.Set(channelId, true);
 1126        }
 127
 128        private void OpenChannelCreationWindow()
 129        {
 1130            dataStore.channels.channelJoinedSource.Set(ChannelJoinedSource.Search);
 1131            OnOpenChannelCreation?.Invoke();
 1132        }
 133
 134        private void SearchChannels(string searchText)
 135        {
 3136            loadStartedTimestamp = DateTime.Now;
 3137            paginationToken = null;
 3138            view.ClearAllEntries();
 3139            view.HideLoadingMore();
 3140            view.ShowLoading();
 3141            view.HideResultsHeader();
 3142            view.HideCreateChannelOnSearch();
 3143            this.searchText = searchText;
 3144            isSearchingByName = !string.IsNullOrEmpty(searchText);
 145
 3146            if (!isSearchingByName)
 1147                chatController.GetChannels(LOAD_PAGE_SIZE);
 148            else
 149            {
 2150                chatController.GetChannelsByName(LOAD_PAGE_SIZE, searchText);
 2151                socialAnalytics.SendChannelSearch(searchText);
 152            }
 153
 3154            loadingCancellationToken.Cancel();
 3155            loadingCancellationToken = new CancellationTokenSource();
 3156            WaitTimeoutThenHideLoading(loadingCancellationToken.Token).Forget();
 3157        }
 158
 159        private void ShowRequestedChannels(string paginationToken, Channel[] channels)
 160        {
 3161            this.paginationToken = paginationToken;
 162
 8163            foreach (var channel in channels)
 1164                view.Set(channel);
 165
 3166            if (isSearchingByName)
 167            {
 1168                view.HideLoadingMore();
 169
 1170                if (view.EntryCount > 0)
 171                {
 1172                    view.ShowResultsHeader();
 1173                    view.ShowCreateChannelOnSearch();
 174                }
 175                else
 176                {
 0177                    view.HideResultsHeader();
 0178                    view.HideCreateChannelOnSearch();
 179                }
 180            }
 181            else
 2182                view.ShowLoadingMore();
 2183        }
 184
 0185        private void UpdateChannelInfo(Channel updatedChannel) => view.Set(updatedChannel);
 186
 187        private void LoadMoreChannels()
 188        {
 2189            if (IsLoading()) return;
 2190            if (string.IsNullOrEmpty(paginationToken)) return;
 191
 2192            loadStartedTimestamp = DateTime.Now;
 2193            view.HideLoadingMore();
 194
 2195            if (string.IsNullOrEmpty(searchText))
 1196                chatController.GetChannels(LOAD_PAGE_SIZE, paginationToken);
 197            else
 1198                chatController.GetChannelsByName(LOAD_PAGE_SIZE, searchText, paginationToken);
 1199        }
 200
 2201        private bool IsLoading() => (DateTime.Now - loadStartedTimestamp).TotalSeconds < LOAD_TIMEOUT;
 202
 0203        private void HandleViewClosed() => OnClosed?.Invoke();
 204
 0205        private void HandleViewBacked() => OnBack?.Invoke();
 206
 207        private void ClearListeners()
 208        {
 34209            chatController.OnChannelSearchResult -= ShowRequestedChannels;
 34210            chatController.OnChannelUpdated -= UpdateChannelInfo;
 34211            view.OnSearchUpdated -= SearchChannels;
 34212            view.OnRequestMoreChannels -= LoadMoreChannels;
 34213            view.OnBack -= HandleViewBacked;
 34214            view.OnClose -= HandleViewClosed;
 34215            view.OnJoinChannel -= HandleJoinChannel;
 34216            view.OnLeaveChannel -= HandleLeaveChannel;
 34217            view.OnCreateChannel -= OpenChannelCreationWindow;
 34218            view.OnOpenChannel -= NavigateToChannel;
 34219        }
 220
 221        private async UniTask WaitTimeoutThenHideLoading(CancellationToken cancellationToken)
 222        {
 48223            await UniTask.Delay(LOAD_TIMEOUT * 1000, cancellationToken: cancellationToken);
 4224            if (cancellationToken.IsCancellationRequested) return;
 4225            view.HideLoading();
 4226        }
 227
 228        private void HandleJoinChannel(string channelId)
 229        {
 1230            dataStore.channels.channelJoinedSource.Set(ChannelJoinedSource.Search);
 1231            chatController.JoinOrCreateChannel(channelId);
 1232        }
 233
 234        private void HandleLeaveChannel(string channelId)
 235        {
 1236            dataStore.channels.channelLeaveSource.Set(ChannelLeaveSource.Search);
 1237            OnOpenChannelLeave?.Invoke(channelId);
 1238        }
 239
 0240        private void OnAllowedToCreateChannelsChanged(bool isAllowed) => view.SetCreateChannelButtonsActive(isAllowed);
 241    }
 242}