< Summary

Class:ChatHUDView
Assembly:ChatHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/ChatWidgetHUD/ChatHUDView.cs
Covered lines:77
Uncovered lines:18
Coverable lines:95
Total lines:215
Line coverage:81% (77 of 95)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ChatHUDView()0%110100%
ChatHUDView()0%110100%
Create()0%110100%
Initialize(...)0%110100%
OnInputFieldSubmit(...)0%660100%
OnInputFieldSelect(...)0%110100%
OnInputFieldDeselect(...)0%110100%
ResetInputField()0%2100%
OnEnable()0%110100%
FocusInputField()0%110100%
EntryIsVisible(...)0%110100%
SetFadeoutMode(...)0%4.074083.33%
AddEntry(...)0%8.098088.89%
OnOpenContextMenu(...)0%2100%
OnMessageTriggerHover(...)0%12300%
OnMessageCancelHover()0%110100%
SortEntries()0%440100%
CleanAllEntries()0%3.053081.82%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/ChatWidgetHUD/ChatHUDView.cs

#LineLine coverage
 1using DCL.Helpers;
 2using DCL.Interface;
 3using System;
 4using System.Collections.Generic;
 5using System.Linq;
 6using TMPro;
 7using UnityEngine;
 8using UnityEngine.Events;
 9using UnityEngine.UI;
 10using System.Text.RegularExpressions;
 11
 12public class ChatHUDView : MonoBehaviour
 13{
 114    static string VIEW_PATH = "Chat Widget";
 4115    string ENTRY_PATH = "Chat Entry";
 16
 4117    public bool detectWhisper = true;
 18    public TMP_InputField inputField;
 19    public RectTransform chatEntriesContainer;
 20
 21    public ScrollRect scrollRect;
 22    public ChatHUDController controller;
 23    public GameObject messageHoverPanel;
 24    public TextMeshProUGUI messageHoverText;
 25    public UserContextMenu contextMenu;
 26    public UserContextConfirmationDialog confirmationDialog;
 27
 4128    [NonSerialized] public List<ChatEntry> entries = new List<ChatEntry>();
 4129    [NonSerialized] public List<DateSeparatorEntry> dateSeparators = new List<DateSeparatorEntry>();
 30
 4131    ChatMessage currentMessage = new ChatMessage();
 4132    Regex whisperRegex = new Regex(@"(?i)^\/(whisper|w) (\S+)( *)(.*)");
 33    Match whisperRegexMatch;
 34
 35    public event UnityAction<string> OnPressPrivateMessage;
 36    public event UnityAction<ChatMessage> OnSendMessage;
 37
 38    public static ChatHUDView Create()
 39    {
 440        var view = Instantiate(Resources.Load<GameObject>(VIEW_PATH)).GetComponent<ChatHUDView>();
 441        return view;
 42    }
 43
 44    public void Initialize(ChatHUDController controller, UnityAction<ChatMessage> OnSendMessage)
 45    {
 2246        this.controller = controller;
 2247        this.OnSendMessage += OnSendMessage;
 2248        inputField.onSubmit.AddListener(OnInputFieldSubmit);
 2249        inputField.onSelect.AddListener(OnInputFieldSelect);
 2250        inputField.onDeselect.AddListener(OnInputFieldDeselect);
 2251    }
 52
 53    private void OnInputFieldSubmit(string message)
 54    {
 455        currentMessage.body = message;
 456        currentMessage.sender = UserProfile.GetOwnUserProfile().userId;
 457        currentMessage.messageType = ChatMessage.Type.NONE;
 458        currentMessage.recipient = string.Empty;
 59
 460        if (detectWhisper && !string.IsNullOrWhiteSpace(message))
 61        {
 462            whisperRegexMatch = whisperRegex.Match(message);
 63
 464            if (whisperRegexMatch.Success)
 65            {
 266                currentMessage.messageType = ChatMessage.Type.PRIVATE;
 267                currentMessage.recipient = whisperRegexMatch.Groups[2].Value;
 268                currentMessage.body = whisperRegexMatch.Groups[4].Value;
 69            }
 70        }
 71
 72        // A TMP_InputField is automatically marked as 'wasCanceled' when the ESC key is pressed
 473        if (inputField.wasCanceled)
 174            currentMessage.body = string.Empty;
 75
 476        OnSendMessage?.Invoke(currentMessage);
 477    }
 78
 879    private void OnInputFieldSelect(string message) { AudioScriptableObjects.inputFieldFocus.Play(true); }
 80
 481    private void OnInputFieldDeselect(string message) { AudioScriptableObjects.inputFieldUnfocus.Play(true); }
 82
 83    public void ResetInputField()
 84    {
 085        inputField.text = string.Empty;
 086        inputField.caretColor = Color.white;
 087    }
 88
 6089    void OnEnable() { Utils.ForceUpdateLayout(transform as RectTransform); }
 90
 91    public void FocusInputField()
 92    {
 493        inputField.ActivateInputField();
 494        inputField.Select();
 495    }
 96
 97    bool enableFadeoutMode = false;
 98
 99    bool EntryIsVisible(ChatEntry entry)
 100    {
 1101        int visibleCorners =
 102            (entry.transform as RectTransform).CountCornersVisibleFrom(scrollRect.viewport.transform as RectTransform);
 1103        return visibleCorners > 0;
 104    }
 105
 106    public void SetFadeoutMode(bool enabled)
 107    {
 8108        enableFadeoutMode = enabled;
 109
 18110        for (int i = 0; i < entries.Count; i++)
 111        {
 1112            ChatEntry entry = entries[i];
 113
 1114            if (enabled)
 115            {
 0116                entry.SetFadeout(EntryIsVisible(entry));
 0117            }
 118            else
 119            {
 1120                entry.SetFadeout(false);
 121            }
 122        }
 123
 8124        if (enabled)
 125        {
 3126            confirmationDialog.Hide();
 127        }
 8128    }
 129
 130    public virtual void AddEntry(ChatEntry.Model chatEntryModel, bool setScrollPositionToBottom = false)
 131    {
 21132        var chatEntryGO = Instantiate(Resources.Load(ENTRY_PATH) as GameObject, chatEntriesContainer);
 21133        ChatEntry chatEntry = chatEntryGO.GetComponent<ChatEntry>();
 134
 21135        if (enableFadeoutMode && EntryIsVisible(chatEntry))
 0136            chatEntry.SetFadeout(true);
 137        else
 21138            chatEntry.SetFadeout(false);
 139
 21140        chatEntry.Populate(chatEntryModel);
 141
 21142        if (chatEntryModel.messageType == ChatMessage.Type.PRIVATE)
 4143            chatEntry.OnPress += OnPressPrivateMessage;
 144
 21145        if (chatEntryModel.messageType == ChatMessage.Type.PUBLIC || chatEntryModel.messageType == ChatMessage.Type.PRIV
 21146            chatEntry.OnPressRightButton += OnOpenContextMenu;
 147
 21148        chatEntry.OnTriggerHover += OnMessageTriggerHover;
 21149        chatEntry.OnCancelHover += OnMessageCancelHover;
 150
 21151        entries.Add(chatEntry);
 152
 21153        SortEntries();
 154
 21155        Utils.ForceUpdateLayout(chatEntry.transform as RectTransform, delayed: false);
 156
 21157        if (setScrollPositionToBottom && scrollRect.verticalNormalizedPosition > 0)
 0158            scrollRect.verticalNormalizedPosition = 0;
 21159    }
 160
 161    private void OnOpenContextMenu(ChatEntry chatEntry)
 162    {
 0163        contextMenu.transform.position = chatEntry.contextMenuPositionReference.position;
 0164        contextMenu.transform.parent = this.transform;
 0165        contextMenu.Show(chatEntry.model.senderId);
 0166    }
 167
 168    protected virtual void OnMessageTriggerHover(ChatEntry chatEntry)
 169    {
 0170        if (contextMenu == null || contextMenu.isVisible)
 0171            return;
 172
 0173        messageHoverText.text = chatEntry.messageLocalDateTime;
 0174        messageHoverPanel.transform.position = chatEntry.hoverPanelPositionReference.position;
 0175        messageHoverPanel.SetActive(true);
 0176    }
 177
 178    public void OnMessageCancelHover()
 179    {
 28180        messageHoverPanel.SetActive(false);
 28181        messageHoverText.text = string.Empty;
 28182    }
 183
 184    public void SortEntries()
 185    {
 138186        entries = entries.OrderBy(x => x.model.timestamp).ToList();
 187
 21188        int count = entries.Count;
 276189        for (int i = 0; i < count; i++)
 190        {
 117191            if (entries[i].transform.GetSiblingIndex() != i)
 192            {
 44193                entries[i].transform.SetSiblingIndex(i);
 44194                Utils.ForceUpdateLayout(entries[i].transform as RectTransform, delayed: false);
 195            }
 196        }
 21197    }
 198
 199    public void CleanAllEntries()
 200    {
 18201        foreach (var entry in entries)
 202        {
 1203            Destroy(entry.gameObject);
 204        }
 205
 8206        entries.Clear();
 207
 16208        foreach (DateSeparatorEntry separator in dateSeparators)
 209        {
 0210            Destroy(separator.gameObject);
 211        }
 212
 8213        dateSeparators.Clear();
 8214    }
 215}