< Summary

Class:DCL.Chat.HUD.SearchChannelsWindowComponentView
Assembly:WorldChatWindowHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/WorldChatWindowHUD/SearchChannelsWindowComponentView.cs
Covered lines:85
Uncovered lines:8
Coverable lines:93
Total lines:210
Line coverage:91.3% (85 of 93)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Awake()0%330100%
Update()0%3.023087.5%
Dispose()0%3.333066.67%
Create()0%110100%
ClearAllEntries()0%110100%
ShowLoading()0%110100%
Set(...)0%110100%
Show()0%110100%
Hide()0%110100%
ClearSearchInput()0%110100%
HideLoading()0%110100%
ShowLoadingMore()0%110100%
HideLoadingMore()0%110100%
ShowResultsHeader()0%110100%
HideResultsHeader()0%110100%
ShowCreateChannelOnSearch()0%110100%
HideCreateChannelOnSearch()0%110100%
SetCreateChannelButtonsActive(...)0%330100%
RefreshControl()0%2100%
UpdateLayout()0%110100%
Sort()0%110100%
UpdateHeaders()0%220100%
HandleJoinRequest(...)0%6200%
HandleOpenChat(...)0%6200%
HandleLeaveRequest(...)0%220100%
LoadMoreEntries(...)0%4.054085.71%
WaitThenRequireMoreEntries()0%440100%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Collections;
 3using DCL.Chat.Channels;
 4using DCL.Helpers;
 5using TMPro;
 6using UnityEngine;
 7using UnityEngine.UI;
 8
 9namespace DCL.Chat.HUD
 10{
 11    public class SearchChannelsWindowComponentView : BaseComponentView, ISearchChannelsWindowView
 12    {
 13        [SerializeField] internal CollapsablePublicChannelListComponentView channelList;
 14        [SerializeField] internal GameObject resultsHeaderLabelContainer;
 15        [SerializeField] internal TMP_Text resultsHeaderLabel;
 16        [SerializeField] internal GameObject loadingContainer;
 17        [SerializeField] internal ScrollRect scroll;
 18        [SerializeField] internal SearchBarComponentView searchBar;
 19        [SerializeField] internal Button backButton;
 20        [SerializeField] internal Button closeButton;
 21        [SerializeField] internal GameObject loadMoreContainer;
 22        [SerializeField] internal GameObject loadMoreContent;
 23        [SerializeField] internal GameObject loadMoreSpinner;
 24        [SerializeField] internal GameObject createChannelOnSearchContainer;
 25        [SerializeField] internal GameObject createChannelOnSearchContent;
 26        [SerializeField] internal Button[] createChannelButtons;
 27
 28        private bool isLayoutDirty;
 29        private bool isSortDirty;
 30        private Vector2 lastScrollPosition;
 31        private Coroutine requireMoreEntriesRoutine;
 32        private bool shouldCreationBeActive;
 33        private bool isLoading;
 34
 35        public event Action OnBack;
 36        public event Action OnClose;
 37        public event Action<string> OnSearchUpdated;
 38        public event Action OnRequestMoreChannels;
 39        public event Action<string> OnJoinChannel;
 40        public event Action<string> OnLeaveChannel;
 41        public event Action OnCreateChannel;
 42        public event Action<string> OnOpenChannel;
 43
 044        public RectTransform Transform => (RectTransform) transform;
 045        public int EntryCount => channelList.Count();
 046        public bool IsActive => gameObject.activeInHierarchy;
 47
 48        public override void Awake()
 49        {
 2150            base.Awake();
 2151            backButton.onClick.AddListener(() => OnBack?.Invoke());
 2152            closeButton.onClick.AddListener(() => OnClose?.Invoke());
 2653            searchBar.OnSearchText += s => OnSearchUpdated?.Invoke(s);
 2154            channelList.SortingMethod = (a, b) => b.Model.memberCount.CompareTo(a.Model.memberCount);
 2155            scroll.onValueChanged.AddListener(LoadMoreEntries);
 56
 16857            foreach (var button in createChannelButtons)
 6358                button.onClick.AddListener(() => OnCreateChannel?.Invoke());
 2159        }
 60
 61        public override void Update()
 62        {
 10863            base.Update();
 64
 10865            if (isLayoutDirty)
 166                ((RectTransform) scroll.transform).ForceUpdateLayout();
 10867            isLayoutDirty = false;
 68
 10869            if (isSortDirty)
 070                channelList.Sort();
 10871            isSortDirty = false;
 10872        }
 73
 74        public override void Dispose()
 75        {
 4276            if (!this) return;
 4277            if (!gameObject) return;
 4278            base.Dispose();
 4279        }
 80
 81        public static SearchChannelsWindowComponentView Create()
 82        {
 2183            return Instantiate(Resources.Load<SearchChannelsWindowComponentView>("SocialBarV1/ChannelSearchHUD"));
 84        }
 85
 86        public void ClearAllEntries()
 87        {
 388            channelList.Clear();
 389            UpdateLayout();
 390            UpdateHeaders();
 391        }
 92
 93        public void ShowLoading()
 94        {
 295            isLoading = true;
 296            loadingContainer.SetActive(true);
 297            channelList.gameObject.SetActive(false);
 298            resultsHeaderLabel.gameObject.SetActive(false);
 299            createChannelOnSearchContent.SetActive(false);
 2100            loadMoreContent.SetActive(false);
 2101        }
 102
 103        public void Set(Channel channel)
 104        {
 13105            channelList.Set(channel.ChannelId,
 106                new PublicChatEntryModel(channel.ChannelId, channel.Name, channel.Joined, channel.MemberCount,
 107                    showOnlyOnlineMembers: false, channel.Muted));
 108
 13109            var entry = channelList.Get(channel.ChannelId);
 13110            entry.OnJoin -= HandleJoinRequest;
 13111            entry.OnJoin += HandleJoinRequest;
 13112            entry.OnOpenChat -= HandleOpenChat;
 13113            entry.OnOpenChat += HandleOpenChat;
 13114            entry.OnLeave -= HandleLeaveRequest;
 13115            entry.OnLeave += HandleLeaveRequest;
 116
 13117            UpdateLayout();
 13118            Sort();
 13119            UpdateHeaders();
 13120        }
 121
 122        public void Show()
 123        {
 8124            gameObject.SetActive(true);
 8125            searchBar.SetFocus();
 8126        }
 127
 2128        public void Hide() => gameObject.SetActive(false);
 129
 2130        public void ClearSearchInput() => searchBar.ClearSearch();
 131
 132        public void HideLoading()
 133        {
 1134            isLoading = false;
 1135            loadingContainer.SetActive(false);
 1136            channelList.gameObject.SetActive(true);
 1137            resultsHeaderLabel.gameObject.SetActive(true);
 1138            createChannelOnSearchContent.SetActive(shouldCreationBeActive);
 1139            loadMoreContent.SetActive(true);
 1140        }
 141
 1142        public void ShowLoadingMore() => loadMoreContainer.SetActive(true);
 143
 1144        public void HideLoadingMore() => loadMoreContainer.SetActive(false);
 145
 1146        public void ShowResultsHeader() => resultsHeaderLabelContainer.SetActive(true);
 147
 1148        public void HideResultsHeader() => resultsHeaderLabelContainer.SetActive(false);
 149
 1150        public void ShowCreateChannelOnSearch() => createChannelOnSearchContainer.SetActive(true);
 151
 1152        public void HideCreateChannelOnSearch() => createChannelOnSearchContainer.SetActive(false);
 153
 154        public void SetCreateChannelButtonsActive(bool isActive)
 155        {
 1156            shouldCreationBeActive = isActive;
 157
 8158            foreach (var button in createChannelButtons)
 3159                button.gameObject.SetActive(isActive);
 160
 1161            createChannelOnSearchContent.SetActive(isActive && !isLoading);
 1162        }
 163
 164        public override void RefreshControl()
 165        {
 0166            throw new NotImplementedException();
 167        }
 168
 16169        private void UpdateLayout() => isLayoutDirty = true;
 170
 13171        private void Sort() => isSortDirty = true;
 172
 173        private void UpdateHeaders()
 174        {
 16175            var text = $"Results ({channelList.Count()})";
 176
 16177            if (!string.IsNullOrEmpty(searchBar.Text))
 4178                text = "Did you mean?";
 179
 16180            resultsHeaderLabel.text = text;
 16181        }
 182
 0183        private void HandleJoinRequest(PublicChatEntry entry) => OnJoinChannel?.Invoke(entry.Model.channelId);
 184
 0185        private void HandleOpenChat(PublicChatEntry entry) => OnOpenChannel?.Invoke(entry.Model.channelId);
 186
 1187        private void HandleLeaveRequest(PublicChatEntry entry) => OnLeaveChannel?.Invoke(entry.Model.channelId);
 188
 189        private void LoadMoreEntries(Vector2 scrollPosition)
 190        {
 2191            if (scrollPosition.y < 0.005f && lastScrollPosition.y >= 0.005f)
 192            {
 1193                if (requireMoreEntriesRoutine != null)
 0194                    StopCoroutine(requireMoreEntriesRoutine);
 195
 1196                loadMoreSpinner.SetActive(true);
 1197                requireMoreEntriesRoutine = StartCoroutine(WaitThenRequireMoreEntries());
 198            }
 199
 2200            lastScrollPosition = scrollPosition;
 2201        }
 202
 203        private IEnumerator WaitThenRequireMoreEntries()
 204        {
 1205            yield return new WaitForSeconds(1f);
 1206            loadMoreSpinner.SetActive(false);
 1207            OnRequestMoreChannels?.Invoke();
 1208        }
 209    }
 210}