< Summary

Class:DCL.Social.Chat.ChatHUDView
Assembly:ChatHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/ChatWidgetHUD/ChatHUDView.cs
Covered lines:128
Uncovered lines:117
Coverable lines:245
Total lines:553
Line coverage:52.2% (128 of 245)
Covered branches:0
Total branches:0
Covered methods:34
Total methods:58
Method coverage:58.6% (34 of 58)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ChatHUDView()0%110100%
add_OnShowMenu(...)0%220100%
remove_OnShowMenu(...)0%220100%
add_OnInputFieldSelected(...)0%110100%
remove_OnInputFieldSelected(...)0%220100%
add_OnInputFieldDeselected(...)0%110100%
remove_OnInputFieldDeselected(...)0%220100%
Awake()0%330100%
OnEnable()0%110100%
OnDisable()0%110100%
Update()0%440100%
ResetInputField(...)0%2.032080%
RefreshControl()0%12300%
FocusInputField()0%110100%
UnfocusInputField()0%220100%
SetInputFieldText(...)0%2.032080%
ShowMentionSuggestions()0%110100%
SetMentionSuggestions(...)0%110100%
HideMentionSuggestions()0%110100%
SetBlockedStatus(...)0%110100%
AddMentionToInputField(...)0%110100%
AddTextIntoInputField(...)0%6200%
SetEntry(...)0%3.063081.25%
SetEntry(...)0%3.033085.71%
RemoveOldestEntry()0%12300%
Hide(...)0%6200%
OnMessageCancelHover()0%2100%
ClearAllEntries()0%2.092071.43%
Populate(...)0%110100%
SetConversationUserId(...)0%2100%
Dock(...)0%110100%
SetFadeoutMode(...)0%20400%
IsEntryVisible(...)0%2100%
OnInputFieldSubmit(...)0%20400%
WaitThenTriggerSendMessage()0%20400%
OnInputFieldSelect(...)0%2100%
OnInputFieldDeselect(...)0%2100%
OnOpenContextMenu(...)0%6200%
OnMessageTriggerHover(...)0%12300%
OnMessageCoordinatesTriggerHover(...)0%2100%
OnMessageCancelGotoHover()0%2100%
SortEntries()0%110100%
SortEntriesImmediate()0%24.8410047.06%
HandleNextChatInHistoryInput(...)0%12300%
HandlePreviousChatInHistoryInput(...)0%12300%
HandleNextMentionSuggestionInput(...)0%6200%
HandlePreviousMentionSuggestionInput(...)0%6200%
HandleCloseMentionSuggestionsInput(...)0%6200%
UpdateLayout()0%110100%
GetFirstEntry()0%20400%
OnMessageCopy(...)0%6200%

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;
 5using System.Collections.Generic;
 6using System.Linq;
 7using System.Text;
 8using TMPro;
 9using UnityEngine;
 10using UnityEngine.Events;
 11using UnityEngine.EventSystems;
 12using UnityEngine.UI;
 13using WebGLIMEInput = WebGLSupport.WebGLInput;
 14
 15namespace DCL.Social.Chat
 16{
 17    public class ChatHUDView : BaseComponentView, IChatHUDComponentView
 18    {
 19        [SerializeField] internal TMP_InputField inputField;
 20        [SerializeField] internal RectTransform chatEntriesContainer;
 21        [SerializeField] internal ScrollRect scrollRect;
 22        [SerializeField] internal GameObject messageHoverPanel;
 23        [SerializeField] internal GameObject messageHoverGotoPanel;
 24        [SerializeField] internal TextMeshProUGUI messageHoverText;
 25        [SerializeField] internal TextMeshProUGUI messageHoverGotoText;
 26        [SerializeField] internal UserContextMenu contextMenu;
 27        [SerializeField] internal UserContextConfirmationDialog confirmationDialog;
 28        [SerializeField] internal DefaultChatEntryFactory defaultChatEntryFactory;
 29        [SerializeField] internal PoolChatEntryFactory poolChatEntryFactory;
 30        [SerializeField] internal InputAction_Trigger nextChatInHistoryInput;
 31        [SerializeField] internal InputAction_Trigger previousChatInHistoryInput;
 32        [SerializeField] internal InputAction_Trigger nextMentionSuggestionInput;
 33        [SerializeField] internal InputAction_Trigger previousMentionSuggestionInput;
 34        [SerializeField] internal InputAction_Trigger closeMentionSuggestionsInput;
 35        [SerializeField] internal ChatMentionSuggestionComponentView chatMentionSuggestions;
 36        [SerializeField] internal WebGLIMEInput webGlImeInput;
 37        [SerializeField] internal Button unblockButton;
 38        [SerializeField] private Model model;
 39
 3840        private readonly Dictionary<string, ChatEntry> entries = new ();
 3841        private readonly ChatMessage currentMessage = new ();
 3842        private readonly Dictionary<Action, UnityAction<string>> inputFieldSelectedListeners = new ();
 3843        private readonly Dictionary<Action, UnityAction<string>> inputFieldUnselectedListeners = new ();
 44
 45        private int updateLayoutDelayedFrames;
 46        private bool isSortingDirty;
 47
 48        public event Action<string, int> OnMessageUpdated;
 49        public event Action<string> OnOpenedContextMenu;
 50
 51        public event Action OnShowMenu
 52        {
 53            add
 54            {
 355                if (contextMenu != null)
 356                    contextMenu.OnShowMenu += value;
 357            }
 58
 59            remove
 60            {
 661                if (contextMenu != null)
 662                    contextMenu.OnShowMenu -= value;
 663            }
 64        }
 65
 66        public event Action OnInputFieldSelected
 67        {
 68            add
 69            {
 70                void Action(string s) =>
 071                    value.Invoke();
 72
 373                inputFieldSelectedListeners[value] = Action;
 374                inputField.onSelect.AddListener(Action);
 375            }
 76
 77            remove
 78            {
 679                if (!inputFieldSelectedListeners.ContainsKey(value))
 380                    return;
 81
 382                inputField.onSelect.RemoveListener(inputFieldSelectedListeners[value]);
 383                inputFieldSelectedListeners.Remove(value);
 384            }
 85        }
 86
 87        public event Action OnInputFieldDeselected
 88        {
 89            add
 90            {
 91                void Action(string s) =>
 092                    value.Invoke();
 93
 394                inputFieldUnselectedListeners[value] = Action;
 395                inputField.onDeselect.AddListener(Action);
 396            }
 97
 98            remove
 99            {
 6100                if (!inputFieldUnselectedListeners.ContainsKey(value))
 3101                    return;
 102
 3103                inputField.onDeselect.RemoveListener(inputFieldUnselectedListeners[value]);
 3104                inputFieldUnselectedListeners.Remove(value);
 3105            }
 106        }
 107
 108        public event Action OnPreviousChatInHistory;
 109        public event Action OnNextChatInHistory;
 110        public event Action<string> OnMentionSuggestionSelected;
 111        public event Action<ChatEntryModel> OnCopyMessageRequested;
 112        public event Action<ChatMessage> OnSendMessage;
 113        public event Action<string> OnUnblockUser;
 0114        public int EntryCount => entries.Count;
 87115        public IChatEntryFactory ChatEntryFactory { get; set; }
 8116        public IComparer<ChatEntryModel> SortingStrategy { get; set; }
 5117        public bool UseLegacySorting { private get; set; }
 118
 119        public override void Awake()
 120        {
 34121            base.Awake();
 34122            inputField.onSubmit.AddListener(OnInputFieldSubmit);
 34123            inputField.onSelect.AddListener(OnInputFieldSelect);
 34124            inputField.onDeselect.AddListener(OnInputFieldDeselect);
 34125            inputField.onValueChanged.AddListener(str => OnMessageUpdated?.Invoke(str, inputField.stringPosition));
 35126            chatMentionSuggestions.OnEntrySubmit += model => OnMentionSuggestionSelected?.Invoke(model.userId);
 34127            ChatEntryFactory ??= (IChatEntryFactory)poolChatEntryFactory ?? defaultChatEntryFactory;
 34128            model.enableFadeoutMode = true;
 34129            contextMenu.SetPassportOpenSource(true);
 130
 34131            unblockButton.onClick.AddListener(() =>
 132            {
 0133                OnUnblockUser?.Invoke(model.conversationUserId);
 0134            });
 135
 136#if (UNITY_WEBGL && !UNITY_EDITOR)
 137            // WebGLInput plugin breaks many features:
 138            // @mentions navigation with ARROW keys
 139            // @mentions suggestions not hiding when pressing SPACE after @
 140            // chat windows toggling with ENTER key
 141            // chat history navigation with ARROW keys
 142            // probably more...
 143            // Key input events are not triggered anymore after focusing the input field
 144            // One of the main reasons is because the plugin replaces the TMP_InputField for a native web input,
 145            // overriding input handing, caret position handling, most of the input behaviour..
 146            // To mitigate the issues for most of the non-asian users,
 147            // we destroy the component because we assume that users dont need IME input
 148            // Users with asian languages will keep experiencing the issues
 149            SystemLanguage systemLanguage = Application.systemLanguage;
 150
 151            if (systemLanguage is not (SystemLanguage.Chinese
 152                or SystemLanguage.ChineseSimplified
 153                or SystemLanguage.ChineseTraditional
 154                or SystemLanguage.Korean
 155                or SystemLanguage.Japanese))
 156                Destroy(webGlImeInput);
 157#endif
 34158        }
 159
 160        public override void OnEnable()
 161        {
 37162            base.OnEnable();
 37163            UpdateLayout();
 37164            nextChatInHistoryInput.OnTriggered += HandleNextChatInHistoryInput;
 37165            previousChatInHistoryInput.OnTriggered += HandlePreviousChatInHistoryInput;
 37166            nextMentionSuggestionInput.OnTriggered += HandleNextMentionSuggestionInput;
 37167            previousMentionSuggestionInput.OnTriggered += HandlePreviousMentionSuggestionInput;
 37168            closeMentionSuggestionsInput.OnTriggered += HandleCloseMentionSuggestionsInput;
 37169        }
 170
 171        public override void OnDisable()
 172        {
 37173            base.OnDisable();
 37174            nextChatInHistoryInput.OnTriggered -= HandleNextChatInHistoryInput;
 37175            previousChatInHistoryInput.OnTriggered -= HandlePreviousChatInHistoryInput;
 37176            nextMentionSuggestionInput.OnTriggered -= HandleNextMentionSuggestionInput;
 37177            previousMentionSuggestionInput.OnTriggered -= HandlePreviousMentionSuggestionInput;
 37178            closeMentionSuggestionsInput.OnTriggered -= HandleCloseMentionSuggestionsInput;
 37179        }
 180
 181        public void Update()
 182        {
 181183            if (updateLayoutDelayedFrames > 0)
 184            {
 25185                updateLayoutDelayedFrames--;
 186
 25187                if (updateLayoutDelayedFrames <= 0)
 3188                    chatEntriesContainer.ForceUpdateLayout(delayed: false);
 189            }
 190
 181191            if (isSortingDirty)
 2192                SortEntriesImmediate();
 193
 181194            isSortingDirty = false;
 181195        }
 196
 197        public void ResetInputField(bool loseFocus = false)
 198        {
 4199            inputField.text = string.Empty;
 4200            inputField.caretColor = Color.white;
 201
 4202            if (loseFocus)
 0203                UnfocusInputField();
 4204        }
 205
 206        public override void RefreshControl()
 207        {
 0208            if (model.isInputFieldFocused)
 0209                FocusInputField();
 210
 0211            SetInputFieldText(model.inputFieldText);
 0212            SetFadeoutMode(model.enableFadeoutMode);
 0213            ClearAllEntries();
 214
 0215            foreach (var entry in model.entries)
 0216                SetEntry(entry);
 0217        }
 218
 219        public void FocusInputField()
 220        {
 5221            inputField.ActivateInputField();
 5222            inputField.Select();
 5223        }
 224
 225        public void UnfocusInputField() =>
 3226            EventSystem.current?.SetSelectedGameObject(null);
 227
 228        public void SetInputFieldText(string text)
 229        {
 4230            model.inputFieldText = text;
 4231            inputField.SetTextWithoutNotify(text);
 4232            inputField.MoveTextEnd(false);
 4233            OnMessageUpdated?.Invoke(inputField.text, inputField.stringPosition);
 0234        }
 235
 236        public void ShowMentionSuggestions()
 237        {
 3238            chatMentionSuggestions.Show();
 3239        }
 240
 241        public void SetMentionSuggestions(List<ChatMentionSuggestionModel> suggestions)
 242        {
 2243            chatMentionSuggestions.Clear();
 2244            chatMentionSuggestions.Set(suggestions);
 2245            chatMentionSuggestions.SelectFirstEntry();
 2246        }
 247
 248        public void HideMentionSuggestions()
 249        {
 4250            chatMentionSuggestions.Hide();
 4251        }
 252
 253        public void SetBlockedStatus(bool blocked)
 254        {
 2255            inputField.gameObject.SetActive(!blocked);
 2256            unblockButton.gameObject.SetActive(blocked);
 2257        }
 258
 259        public void AddMentionToInputField(int fromIndex, int length, string userId, string userName)
 260        {
 2261            string message = inputField.text;
 2262            StringBuilder builder = new (message);
 263
 2264            SetInputFieldText(builder.Remove(fromIndex, length)
 265                                     .Insert(fromIndex, @$"@{userName} ")
 266                                     .ToString());
 2267            FocusInputField();
 2268        }
 269
 270        public void AddTextIntoInputField(string text)
 271        {
 0272            SetInputFieldText(string.IsNullOrEmpty(inputField.text) ? $"{text} " : $"{inputField.text.TrimEnd()} {text} 
 0273            FocusInputField();
 0274        }
 275
 276        public virtual void SetEntry(ChatEntryModel model, bool setScrollPositionToBottom = false)
 277        {
 5278            if (entries.ContainsKey(model.messageId))
 279            {
 0280                var chatEntry = entries[model.messageId];
 0281                Populate(chatEntry, model);
 0282                SetEntry(model.messageId, chatEntry, setScrollPositionToBottom);
 283            }
 284            else
 285            {
 5286                var chatEntry = ChatEntryFactory.Create(model);
 5287                Populate(chatEntry, model);
 5288                chatEntry.ConfigureMentionLinkDetector(contextMenu);
 289
 5290                if (model.subType.Equals(ChatEntryModel.SubType.RECEIVED))
 2291                    chatEntry.OnUserNameClicked += OnOpenContextMenu;
 292
 5293                chatEntry.OnTriggerHover += OnMessageTriggerHover;
 5294                chatEntry.OnTriggerHoverGoto += OnMessageCoordinatesTriggerHover;
 5295                chatEntry.OnCancelHover += OnMessageCancelHover;
 5296                chatEntry.OnCancelGotoHover += OnMessageCancelGotoHover;
 5297                chatEntry.OnCopyClicked += OnMessageCopy;
 298
 5299                SetEntry(model.messageId, chatEntry, setScrollPositionToBottom);
 300            }
 5301        }
 302
 303        public void SetEntry(string messageId, ChatEntry chatEntry, bool setScrollPositionToBottom = false)
 304        {
 5305            Dock(chatEntry);
 5306            entries[messageId] = chatEntry;
 307
 5308            SortEntries();
 5309            UpdateLayout();
 310
 5311            if (setScrollPositionToBottom && scrollRect.verticalNormalizedPosition > 0)
 0312                scrollRect.verticalNormalizedPosition = 0;
 5313        }
 314
 315        public void RemoveOldestEntry()
 316        {
 0317            if (entries.Count <= 0) return;
 0318            var firstEntry = GetFirstEntry();
 0319            if (!firstEntry) return;
 0320            entries.Remove(firstEntry.Model.messageId);
 0321            ChatEntryFactory.Destroy(firstEntry);
 0322            UpdateLayout();
 0323        }
 324
 325        public override void Hide(bool instant = false)
 326        {
 0327            base.Hide(instant);
 328
 0329            if (contextMenu == null)
 0330                return;
 331
 0332            contextMenu.Hide();
 0333            confirmationDialog.Hide();
 0334        }
 335
 336        public void OnMessageCancelHover()
 337        {
 0338            messageHoverPanel.SetActive(false);
 0339            messageHoverText.text = string.Empty;
 0340        }
 341
 342        public virtual void ClearAllEntries()
 343        {
 2344            foreach (var entry in entries.Values)
 0345                ChatEntryFactory.Destroy(entry);
 346
 1347            entries.Clear();
 1348            UpdateLayout();
 1349        }
 350
 351        protected void Populate(ChatEntry entry, ChatEntryModel model)
 352        {
 5353            entry.Populate(model);
 5354            entry.SetFadeout(this.model.enableFadeoutMode);
 5355        }
 356
 357        public void SetConversationUserId(string userId)
 358        {
 0359            model.conversationUserId = userId;
 0360        }
 361
 362        protected void Dock(ChatEntry entry)
 363        {
 5364            entry.transform.SetParent(chatEntriesContainer, false);
 5365        }
 366
 367        private void SetFadeoutMode(bool enabled)
 368        {
 0369            model.enableFadeoutMode = enabled;
 370
 0371            foreach (var entry in entries.Values)
 0372                entry.SetFadeout(enabled && IsEntryVisible(entry));
 373
 0374            if (enabled)
 0375                confirmationDialog.Hide();
 0376        }
 377
 378        private bool IsEntryVisible(ChatEntry entry)
 379        {
 0380            int visibleCorners =
 381                (entry.transform as RectTransform).CountCornersVisibleFrom(scrollRect.viewport.transform as RectTransfor
 382
 0383            return visibleCorners > 0;
 384        }
 385
 386        private void OnInputFieldSubmit(string message)
 387        {
 0388            if (chatMentionSuggestions.IsVisible)
 389            {
 0390                if (!inputField.wasCanceled)
 0391                    chatMentionSuggestions.SubmitSelectedEntry();
 392
 0393                return;
 394            }
 395
 0396            currentMessage.body = message;
 0397            currentMessage.sender = string.Empty;
 0398            currentMessage.messageType = ChatMessage.Type.NONE;
 0399            currentMessage.recipient = string.Empty;
 400
 401            // A TMP_InputField is automatically marked as 'wasCanceled' when the ESC key is pressed
 0402            if (inputField.wasCanceled)
 0403                currentMessage.body = string.Empty;
 404
 405            // we have to wait one frame to disengage the flow triggered by OnSendMessage
 406            // otherwise it crashes the application (WebGL only) due a TextMeshPro bug
 0407            StartCoroutine(WaitThenTriggerSendMessage());
 0408        }
 409
 410        private IEnumerator WaitThenTriggerSendMessage()
 411        {
 0412            yield return null;
 0413            OnSendMessage?.Invoke(currentMessage);
 0414        }
 415
 416        private void OnInputFieldSelect(string message)
 417        {
 0418            AudioScriptableObjects.inputFieldFocus.Play(true);
 0419        }
 420
 421        private void OnInputFieldDeselect(string message)
 422        {
 0423            AudioScriptableObjects.inputFieldUnfocus.Play(true);
 0424        }
 425
 426        private void OnOpenContextMenu(ChatEntry chatEntry)
 427        {
 0428            OnOpenedContextMenu?.Invoke(chatEntry.Model.senderId);
 0429            chatEntry.DockContextMenu((RectTransform)contextMenu.transform);
 0430            contextMenu.transform.parent = transform.parent;
 0431            contextMenu.transform.SetAsLastSibling();
 0432            contextMenu.Show(chatEntry.Model.senderId);
 0433        }
 434
 435        private void OnMessageTriggerHover(ChatEntry chatEntry)
 436        {
 0437            if (contextMenu == null || contextMenu.isVisible)
 0438                return;
 439
 0440            messageHoverText.text = chatEntry.HoverString;
 0441            chatEntry.DockHoverPanel((RectTransform)messageHoverPanel.transform);
 0442            messageHoverPanel.SetActive(true);
 0443        }
 444
 445        private void OnMessageCoordinatesTriggerHover(ChatEntry chatEntry, ParcelCoordinates parcelCoordinates)
 446        {
 0447            messageHoverGotoText.text = $"{parcelCoordinates} INFO";
 0448            chatEntry.DockHoverPanel((RectTransform)messageHoverGotoPanel.transform);
 0449            messageHoverGotoPanel.SetActive(true);
 0450        }
 451
 452        private void OnMessageCancelGotoHover()
 453        {
 0454            messageHoverGotoPanel.SetActive(false);
 0455            messageHoverGotoText.text = string.Empty;
 0456        }
 457
 458        private void SortEntries() =>
 5459            isSortingDirty = true;
 460
 461        private void SortEntriesImmediate()
 462        {
 2463            if (this.entries.Count <= 0) return;
 464
 2465            if (UseLegacySorting)
 466            {
 0467                var entries = this.entries.Values.OrderBy(x => x.Model.timestamp).ToList();
 468
 0469                for (var i = 0; i < entries.Count; i++)
 470                {
 0471                    if (entries[i].transform.GetSiblingIndex() != i)
 0472                        entries[i].transform.SetSiblingIndex(i);
 473                }
 474
 0475                return;
 476            }
 477
 2478            if (SortingStrategy == null) return;
 479
 19480            foreach (var entry in entries.Values.OrderBy(obj => obj.Model, SortingStrategy))
 5481                entry.transform.SetAsLastSibling();
 2482        }
 483
 484        private void HandleNextChatInHistoryInput(DCLAction_Trigger action)
 485        {
 0486            if (chatMentionSuggestions.IsVisible) return;
 0487            OnNextChatInHistory?.Invoke();
 0488        }
 489
 490        private void HandlePreviousChatInHistoryInput(DCLAction_Trigger action)
 491        {
 0492            if (chatMentionSuggestions.IsVisible) return;
 0493            OnPreviousChatInHistory?.Invoke();
 0494        }
 495
 496        private void HandleNextMentionSuggestionInput(DCLAction_Trigger action)
 497        {
 0498            if (!chatMentionSuggestions.IsVisible) return;
 0499            chatMentionSuggestions.SelectNextEntry();
 0500        }
 501
 502        private void HandlePreviousMentionSuggestionInput(DCLAction_Trigger action)
 503        {
 0504            if (!chatMentionSuggestions.IsVisible) return;
 0505            chatMentionSuggestions.SelectPreviousEntry();
 0506        }
 507
 508        private void HandleCloseMentionSuggestionsInput(DCLAction_Trigger action)
 509        {
 0510            if (!chatMentionSuggestions.IsVisible) return;
 0511            chatMentionSuggestions.Hide();
 0512        }
 513
 514        private void UpdateLayout()
 515        {
 516            // we have to wait several frames before updating the layout
 517            // every message entry waits for 3 frames before updating its own layout
 518            // we gotta force the layout updating after that
 519            // TODO: simplify this change to a bool when we update to a working TextMeshPro version
 43520            updateLayoutDelayedFrames = 4;
 43521        }
 522
 523        private ChatEntry GetFirstEntry()
 524        {
 0525            ChatEntry firstEntry = null;
 526
 0527            for (var i = 0; i < chatEntriesContainer.childCount; i++)
 528            {
 0529                var firstChildTransform = chatEntriesContainer.GetChild(i);
 0530                if (!firstChildTransform) continue;
 0531                var entry = firstChildTransform.GetComponent<ChatEntry>();
 0532                if (!entry) continue;
 0533                firstEntry = entry;
 0534                break;
 535            }
 536
 0537            return firstEntry;
 538        }
 539
 540        private void OnMessageCopy(ChatEntry entry) =>
 0541            OnCopyMessageRequested?.Invoke(entry.Model);
 542
 543        [Serializable]
 544        private struct Model
 545        {
 546            public bool isInputFieldFocused;
 547            public string inputFieldText;
 548            public bool enableFadeoutMode;
 549            public ChatEntryModel[] entries;
 550            public string conversationUserId;
 551        }
 552    }
 553}

Methods/Properties

ChatHUDView()
add_OnShowMenu(System.Action)
remove_OnShowMenu(System.Action)
add_OnInputFieldSelected(System.Action)
remove_OnInputFieldSelected(System.Action)
add_OnInputFieldDeselected(System.Action)
remove_OnInputFieldDeselected(System.Action)
EntryCount()
ChatEntryFactory()
ChatEntryFactory(DCL.Social.Chat.IChatEntryFactory)
SortingStrategy()
SortingStrategy(System.Collections.Generic.IComparer[ChatEntryModel])
UseLegacySorting()
UseLegacySorting(System.Boolean)
Awake()
OnEnable()
OnDisable()
Update()
ResetInputField(System.Boolean)
RefreshControl()
FocusInputField()
UnfocusInputField()
SetInputFieldText(System.String)
ShowMentionSuggestions()
SetMentionSuggestions(System.Collections.Generic.List[ChatMentionSuggestionModel])
HideMentionSuggestions()
SetBlockedStatus(System.Boolean)
AddMentionToInputField(System.Int32, System.Int32, System.String, System.String)
AddTextIntoInputField(System.String)
SetEntry(ChatEntryModel, System.Boolean)
SetEntry(System.String, DCL.Social.Chat.ChatEntry, System.Boolean)
RemoveOldestEntry()
Hide(System.Boolean)
OnMessageCancelHover()
ClearAllEntries()
Populate(DCL.Social.Chat.ChatEntry, ChatEntryModel)
SetConversationUserId(System.String)
Dock(DCL.Social.Chat.ChatEntry)
SetFadeoutMode(System.Boolean)
IsEntryVisible(DCL.Social.Chat.ChatEntry)
OnInputFieldSubmit(System.String)
WaitThenTriggerSendMessage()
OnInputFieldSelect(System.String)
OnInputFieldDeselect(System.String)
OnOpenContextMenu(DCL.Social.Chat.ChatEntry)
OnMessageTriggerHover(DCL.Social.Chat.ChatEntry)
OnMessageCoordinatesTriggerHover(DCL.Social.Chat.ChatEntry, ParcelCoordinates)
OnMessageCancelGotoHover()
SortEntries()
SortEntriesImmediate()
HandleNextChatInHistoryInput(DCLAction_Trigger)
HandlePreviousChatInHistoryInput(DCLAction_Trigger)
HandleNextMentionSuggestionInput(DCLAction_Trigger)
HandlePreviousMentionSuggestionInput(DCLAction_Trigger)
HandleCloseMentionSuggestionsInput(DCLAction_Trigger)
UpdateLayout()
GetFirstEntry()
OnMessageCopy(DCL.Social.Chat.ChatEntry)