< 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:236
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;
 7using DCL.Chat.Channels;
 8
 9namespace DCL.Chat.HUD
 10{
 11    public class SearchChannelsWindowController : IHUD
 12    {
 13        private const int LOAD_TIMEOUT = 2;
 14        internal const int LOAD_PAGE_SIZE = 15;
 15
 16        private readonly IChatController chatController;
 17        private readonly IMouseCatcher mouseCatcher;
 18        private readonly DataStore dataStore;
 19        private readonly ISocialAnalytics socialAnalytics;
 20        private readonly IUserProfileBridge userProfileBridge;
 21        private readonly IChannelsFeatureFlagService channelsFeatureFlagService;
 22        private ISearchChannelsWindowView view;
 1423        private DateTime loadStartedTimestamp = DateTime.MinValue;
 1424        private CancellationTokenSource loadingCancellationToken = new CancellationTokenSource();
 25        private string paginationToken;
 26        private string searchText;
 3427        private BaseVariable<HashSet<string>> visibleTaskbarPanels => dataStore.HUDs.visibleTaskbarPanels;
 28        private bool isSearchingByName;
 29
 030        public ISearchChannelsWindowView View => view;
 31
 32        public event Action OnClosed;
 33        public event Action OnBack;
 34        public event Action OnOpenChannelCreation;
 35        public event Action<string> OnOpenChannelLeave;
 36
 1437        public SearchChannelsWindowController(IChatController chatController,
 38            IMouseCatcher mouseCatcher,
 39            DataStore dataStore,
 40            ISocialAnalytics socialAnalytics,
 41            IUserProfileBridge userProfileBridge,
 42            IChannelsFeatureFlagService channelsFeatureFlagService)
 43        {
 1444            this.chatController = chatController;
 1445            this.mouseCatcher = mouseCatcher;
 1446            this.dataStore = dataStore;
 1447            this.socialAnalytics = socialAnalytics;
 1448            this.userProfileBridge = userProfileBridge;
 1449            this.channelsFeatureFlagService = channelsFeatureFlagService;
 1450        }
 51
 52        public void Initialize(ISearchChannelsWindowView view = null)
 53        {
 1454            view ??= SearchChannelsWindowComponentView.Create();
 1455            this.view = view;
 56
 1457            channelsFeatureFlagService.OnAllowedToCreateChannelsChanged += OnAllowedToCreateChannelsChanged;
 1458        }
 59
 60        public void Dispose()
 61        {
 1362            ClearListeners();
 1363            view.Dispose();
 1364            loadingCancellationToken.Cancel();
 1365            loadingCancellationToken.Dispose();
 66
 1367            channelsFeatureFlagService.OnAllowedToCreateChannelsChanged -= OnAllowedToCreateChannelsChanged;
 1368        }
 69
 70        private void SetVisiblePanelList(bool visible)
 71        {
 1772            HashSet<string> newSet = visibleTaskbarPanels.Get();
 1773            if (visible)
 1174                newSet.Add("SearchChanel");
 75            else
 676                newSet.Remove("SearchChanel");
 77
 1778            visibleTaskbarPanels.Set(newSet, true);
 1779        }
 80
 81        public void SetVisibility(bool visible)
 82        {
 1783            SetVisiblePanelList(visible);
 1784            if (visible)
 85            {
 1186                ClearListeners();
 87
 1188                view.ClearSearchInput();
 89
 1190                view.OnSearchUpdated += SearchChannels;
 1191                view.OnRequestMoreChannels += LoadMoreChannels;
 1192                view.OnBack += HandleViewBacked;
 93
 1194                if (mouseCatcher != null)
 1195                    mouseCatcher.OnMouseLock += HandleViewClosed;
 96
 1197                view.OnClose += HandleViewClosed;
 1198                view.OnJoinChannel += HandleJoinChannel;
 1199                view.OnLeaveChannel += HandleLeaveChannel;
 11100                view.OnCreateChannel += OpenChannelCreationWindow;
 11101                chatController.OnChannelSearchResult += ShowRequestedChannels;
 11102                chatController.OnChannelUpdated += UpdateChannelInfo;
 103
 11104                view.Show();
 11105                view.ClearAllEntries();
 11106                view.ShowLoading();
 107
 11108                loadStartedTimestamp = DateTime.Now;
 11109                paginationToken = null;
 11110                chatController.GetChannels(LOAD_PAGE_SIZE);
 111
 11112                loadingCancellationToken.Cancel();
 11113                loadingCancellationToken = new CancellationTokenSource();
 11114                WaitTimeoutThenHideLoading(loadingCancellationToken.Token).Forget();
 11115            }
 116            else
 117            {
 6118                ClearListeners();
 6119                view.Hide();
 120            }
 6121        }
 122
 123        private void OpenChannelCreationWindow()
 124        {
 1125            dataStore.channels.channelJoinedSource.Set(ChannelJoinedSource.Search);
 1126            OnOpenChannelCreation?.Invoke();
 1127        }
 128
 129        private void SearchChannels(string searchText)
 130        {
 3131            loadStartedTimestamp = DateTime.Now;
 3132            paginationToken = null;
 3133            view.ClearAllEntries();
 3134            view.HideLoadingMore();
 3135            view.ShowLoading();
 3136            view.HideResultsHeader();
 3137            view.HideCreateChannelOnSearch();
 3138            this.searchText = searchText;
 3139            isSearchingByName = !string.IsNullOrEmpty(searchText);
 140
 3141            if (!isSearchingByName)
 1142                chatController.GetChannels(LOAD_PAGE_SIZE);
 143            else
 144            {
 2145                chatController.GetChannelsByName(LOAD_PAGE_SIZE, searchText);
 2146                socialAnalytics.SendChannelSearch(searchText);
 147            }
 148
 3149            loadingCancellationToken.Cancel();
 3150            loadingCancellationToken = new CancellationTokenSource();
 3151            WaitTimeoutThenHideLoading(loadingCancellationToken.Token).Forget();
 3152        }
 153
 154        private void ShowRequestedChannels(string paginationToken, Channel[] channels)
 155        {
 3156            this.paginationToken = paginationToken;
 157
 8158            foreach (var channel in channels)
 1159                view.Set(channel);
 160
 3161            if (isSearchingByName)
 162            {
 1163                view.HideLoadingMore();
 164
 1165                if (view.EntryCount > 0)
 166                {
 1167                    view.ShowResultsHeader();
 1168                    view.ShowCreateChannelOnSearch();
 1169                }
 170                else
 171                {
 0172                    view.HideResultsHeader();
 0173                    view.HideCreateChannelOnSearch();
 174                }
 0175            }
 176            else
 2177                view.ShowLoadingMore();
 2178        }
 179
 0180        private void UpdateChannelInfo(Channel updatedChannel) => view.Set(updatedChannel);
 181
 182        private void LoadMoreChannels()
 183        {
 2184            if (IsLoading()) return;
 2185            if (string.IsNullOrEmpty(paginationToken)) return;
 186
 2187            loadStartedTimestamp = DateTime.Now;
 2188            view.HideLoadingMore();
 189
 2190            if (string.IsNullOrEmpty(searchText))
 1191                chatController.GetChannels(LOAD_PAGE_SIZE, paginationToken);
 192            else
 1193                chatController.GetChannelsByName(LOAD_PAGE_SIZE, searchText, paginationToken);
 1194        }
 195
 2196        private bool IsLoading() => (DateTime.Now - loadStartedTimestamp).TotalSeconds < LOAD_TIMEOUT;
 197
 0198        private void HandleViewClosed() => OnClosed?.Invoke();
 199
 0200        private void HandleViewBacked() => OnBack?.Invoke();
 201
 202        private void ClearListeners()
 203        {
 30204            chatController.OnChannelSearchResult -= ShowRequestedChannels;
 30205            chatController.OnChannelUpdated -= UpdateChannelInfo;
 30206            view.OnSearchUpdated -= SearchChannels;
 30207            view.OnRequestMoreChannels -= LoadMoreChannels;
 30208            view.OnBack -= HandleViewBacked;
 30209            view.OnClose -= HandleViewClosed;
 30210            view.OnJoinChannel -= HandleJoinChannel;
 30211            view.OnLeaveChannel -= HandleLeaveChannel;
 30212            view.OnCreateChannel -= OpenChannelCreationWindow;
 30213        }
 214
 215        private async UniTask WaitTimeoutThenHideLoading(CancellationToken cancellationToken)
 216        {
 42217            await UniTask.Delay(LOAD_TIMEOUT * 1000, cancellationToken: cancellationToken);
 4218            if (cancellationToken.IsCancellationRequested) return;
 4219            view.HideLoading();
 4220        }
 221
 222        private void HandleJoinChannel(string channelId)
 223        {
 1224            dataStore.channels.channelJoinedSource.Set(ChannelJoinedSource.Search);
 1225            chatController.JoinOrCreateChannel(channelId);
 1226        }
 227
 228        private void HandleLeaveChannel(string channelId)
 229        {
 1230            dataStore.channels.channelLeaveSource.Set(ChannelLeaveSource.Search);
 1231            OnOpenChannelLeave?.Invoke(channelId);
 1232        }
 233
 0234        private void OnAllowedToCreateChannelsChanged(bool isAllowed) => view.SetCreateChannelButtonsActive(isAllowed);
 235    }
 236}