< Summary

Class:ChannelLinkDetector
Assembly:UIHelpers
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Helpers/UIHelpers/ChannelLinkDetector.cs
Covered lines:22
Uncovered lines:21
Coverable lines:43
Total lines:109
Line coverage:51.1% (22 of 43)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ChannelLinkDetector()0%110100%
Awake()0%6.325062.5%
OnDestroy()0%3.333066.67%
OnAllowedToCreateChannelsChanged(...)0%6200%
OnTextComponentPreRenderText(...)0%3.213071.43%
RefreshChannelPatterns()0%550100%
OnPointerClick(...)0%20400%
GetChannelLinkByPointerPosition(...)0%12300%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Helpers/UIHelpers/ChannelLinkDetector.cs

#LineLine coverage
 1using System.Collections;
 2using System.Collections.Generic;
 3using DCL;
 4using DCL.Chat;
 5using TMPro;
 6using UnityEngine;
 7using UnityEngine.EventSystems;
 8
 9public class ChannelLinkDetector : MonoBehaviour, IPointerClickHandler
 10{
 11    [SerializeField] internal TMP_Text textComponent;
 12
 13    internal string currentText;
 14    internal bool hasNoParseLabel;
 13715    internal List<string> channelsFoundInText = new List<string>();
 16    private IChannelsFeatureFlagService channelsFeatureFlagService;
 13717    private bool isAllowedToCreateChannels = true;
 18
 19    private void Awake()
 20    {
 11421        if (textComponent == null)
 222            return;
 23
 11224        textComponent.OnPreRenderText += OnTextComponentPreRenderText;
 25
 11226        if (Environment.i != null
 27            && Environment.i.serviceLocator.Get<IChannelsFeatureFlagService>() != null)
 28        {
 029            channelsFeatureFlagService = Environment.i.serviceLocator.Get<IChannelsFeatureFlagService>();
 030            isAllowedToCreateChannels = channelsFeatureFlagService.IsChannelsFeatureEnabled()
 31                                        && channelsFeatureFlagService.IsAllowedToCreateChannels();
 032            channelsFeatureFlagService.OnAllowedToCreateChannelsChanged += OnAllowedToCreateChannelsChanged;
 33        }
 11234    }
 35
 36    private void OnDestroy()
 37    {
 11438        if (textComponent == null)
 039            return;
 40
 11441        textComponent.OnPreRenderText -= OnTextComponentPreRenderText;
 42
 11443        if (channelsFeatureFlagService != null)
 044            channelsFeatureFlagService.OnAllowedToCreateChannelsChanged -= OnAllowedToCreateChannelsChanged;
 11445    }
 46
 47    private void OnAllowedToCreateChannelsChanged(bool isAllowed) =>
 048        isAllowedToCreateChannels = isAllowed && channelsFeatureFlagService.IsChannelsFeatureEnabled();
 49
 50    private void OnTextComponentPreRenderText(TMP_TextInfo textInfo)
 51    {
 2652        if (currentText == textComponent.text) return;
 2653        if (!isAllowedToCreateChannels) return;
 54
 2655        hasNoParseLabel = textInfo.textComponent.text.ToLower().Contains("<noparse>");
 2656        CoroutineStarter.Start(RefreshChannelPatterns());
 2657    }
 58
 59    internal IEnumerator RefreshChannelPatterns()
 60    {
 2861        yield return new WaitForEndOfFrame();
 62
 263        channelsFoundInText = ChannelUtils.ExtractChannelIdsFromText(textComponent.text);
 64
 2065        foreach (var channelFound in channelsFoundInText)
 66        {
 867            textComponent.text = textComponent.text.Replace(
 68                channelFound,
 69                hasNoParseLabel ?
 70                    $"</noparse><link={channelFound}><color=#4886E3><u>{channelFound}</u></color></link><noparse>" :
 71                    $"<link={channelFound}><color=#4886E3><u>{channelFound}</u></color></link>");
 72        }
 73
 274        currentText = textComponent.text;
 275    }
 76
 77    public void OnPointerClick(PointerEventData eventData)
 78    {
 079        if (!isAllowedToCreateChannels) return;
 80
 081        if (eventData.button == PointerEventData.InputButton.Left)
 82        {
 083            string clickedLink = GetChannelLinkByPointerPosition(eventData.position);
 84
 085            if (ChannelUtils.IsAChannel(clickedLink))
 86            {
 087                DataStore.i.channels.channelJoinedSource.Set(ChannelJoinedSource.Link);
 088                DataStore.i.channels.currentJoinChannelModal.Set(clickedLink.ToLower(), true);
 89            }
 90        }
 091    }
 92
 93    private string GetChannelLinkByPointerPosition(Vector2 pointerPosition)
 94    {
 095        if (textComponent == null)
 096            return "";
 97
 098        string result = string.Empty;
 099        int linkIndex = TMP_TextUtilities.FindIntersectingLink(textComponent, pointerPosition, textComponent.canvas.worl
 100
 0101        if (linkIndex != -1)
 102        {
 0103            TMP_LinkInfo linkInfo = textComponent.textInfo.linkInfo[linkIndex];
 0104            result = linkInfo.GetLinkID();
 105        }
 106
 0107        return result;
 108    }
 109}