using System.Numerics; using Robust.Client.AutoGenerated; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; using Content.Shared._White.CartridgeLoader.Cartridges; using Content.Shared.Roles; using Robust.Shared.Prototypes; namespace Content.Client._White.CartridgeLoader.Cartridges; [GenerateTypedNameReferences] public sealed partial class MessagesUiFragment : BoxContainer { public event Action? OnMessageSent; public event Action? OnButtonPressed; private string _searchText = string.Empty; public MessagesUiFragment() { RobustXamlLoader.Load(this); Input.OnTextEntered += _ => { if (!string.IsNullOrEmpty(Input.Text)) OnMessageSent?.Invoke(Input.Text); Input.Clear(); }; BackButton.OnPressed += _ => OnButtonPressed?.Invoke(null); SearchBar.OnTextChanged += OnSearchTextChanged; UpdateState(MessagesUiStateMode.UserList, [], [], null); } public void UpdateState(MessagesUiStateMode mode, List<(MessagesUserData, int?)>? users, List<(string, int?)>? messages, string? name) { MessageContainer.DisposeAllChildren(); Input.Orphan(); BackButton.Orphan(); SearchBar.Visible = false; if (mode == MessagesUiStateMode.Chat && messages != null) { HeaderLabel.Text = name; foreach (var (senderName, message) in messages) { AddNote($"{senderName} {message}"); } OverContainer.AddChild(Input); HeaderBox.AddChild(BackButton); BackButton.SetPositionInParent(0); } else if (mode == MessagesUiStateMode.Error) { HeaderLabel.Text = Loc.GetString("messages-pda-error-header"); AddNote(Loc.GetString("messages-pda-error-message")); } else if (mode == MessagesUiStateMode.UserList && users != null) { SearchBar.Visible = true; HeaderLabel.Text = Loc.GetString("messages-pda-chat-choice"); foreach (var (messagesUser, userUid) in users) { AddButton(userUid, messagesUser.Name + ", " + messagesUser.Job, messagesUser.Department); } } } /// /// Adding a button for selecting a chat /// private void AddButton(int? userUid, string userName, string departmentId) { var styleClass = IoCManager.Resolve().Index(departmentId).ButtonStyle; var button = new Button { Text = userName, HorizontalExpand = true, ClipText = true, StyleClasses = { styleClass }, MinWidth = 60 }; button.OnPressed += _ => OnButtonPressed?.Invoke(userUid); MessageContainer.AddChild(button); } /// /// Adding a text label to the message container /// private void AddNote(string note) { MessageContainer.AddChild(new Label { Text = note, HorizontalExpand = true, ClipText = false }); } private bool ButtonIsVisible(Button button) { return string.IsNullOrEmpty(_searchText) || button.Text == null || button.Text.Contains(_searchText, StringComparison.OrdinalIgnoreCase); } private void UpdateVisibleButtons() { foreach (var child in MessageContainer.Children) { if (child is Button button) button.Visible = ButtonIsVisible(button); } } private void OnSearchTextChanged(LineEdit.LineEditEventArgs args) { _searchText = args.Text; UpdateVisibleButtons(); MessagesScroll.SetScrollValue(Vector2.Zero); } }