From acd378e2bd2dd8db3b08c256e735a353ccc335bd Mon Sep 17 00:00:00 2001 From: menvae Date: Fri, 2 Jan 2026 14:24:00 +0200 Subject: [PATCH 1/2] add message header button to user overlay --- fluXis/Overlay/User/ProfileHeader.cs | 43 ++++++++++++++++------- fluXis/Overlay/User/UserProfileOverlay.cs | 2 +- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/fluXis/Overlay/User/ProfileHeader.cs b/fluXis/Overlay/User/ProfileHeader.cs index 36262b6a2..cd100ea46 100644 --- a/fluXis/Overlay/User/ProfileHeader.cs +++ b/fluXis/Overlay/User/ProfileHeader.cs @@ -6,6 +6,7 @@ using fluXis.Graphics.UserInterface.Color; using fluXis.Online.API.Models.Groups; using fluXis.Online.API.Models.Users; +using fluXis.Online.Chat; using fluXis.Online.Drawables.Clubs; using fluXis.Online.Drawables.Images; using fluXis.Online.Fluxel; @@ -23,15 +24,22 @@ namespace fluXis.Overlay.User; public partial class ProfileHeader : Container { + [CanBeNull] + [Resolved(CanBeNull = true)] + private ChatClient chat { get; set; } + private APIUser user { get; } private bool showUsername => user.Username != user.PreferredName; private bool showPronouns => !string.IsNullOrEmpty(user.Pronouns); private bool showBottomRow => showUsername || showPronouns; - public ProfileHeader(APIUser user) + private UserProfileOverlay overlay; + + public ProfileHeader(APIUser user, UserProfileOverlay overlay) { this.user = user; + this.overlay = overlay; } [BackgroundDependencyLoader(true)] @@ -235,17 +243,7 @@ private void load(IAPIClient api, [CanBeNull] FluXisGame game) Spacing = new Vector2(10), Anchor = Anchor.CentreRight, Origin = Anchor.CentreRight, - Children = new Drawable[] - { - new HeaderButton - { - Icon = FontAwesome6.Solid.ShareNodes, - Action = () => game?.OpenLink($"{api.Endpoint.WebsiteRootUrl}/u/{user.ID}"), - }, - api.User.Value?.ID == user.ID - ? new HeaderEditButton() - : new HeaderFollowButton(user) - } + ChildrenEnumerable = createHeaderButtons(api, game) } } } @@ -259,6 +257,27 @@ protected override void Update() Height = DrawWidth / 3f; // 3:1 aspect ratio } + private IEnumerable createHeaderButtons(IAPIClient api, [CanBeNull] FluXisGame game) + { + yield return new HeaderButton + { + Icon = FontAwesome6.Solid.ShareNodes, + Action = () => game?.OpenLink($"{api.Endpoint.WebsiteRootUrl}/u/{user.ID}"), + }; + + if (user.Following is UserFollowState.Mutual && api.User.Value?.ID != user.ID) + yield return new HeaderButton + { + Icon = FontAwesome6.Solid.Message, + Text = "Message", + Action = () => { chat?.CreatePrivateChannel(user.ID); overlay.Hide(); }, + }; + + yield return api.User.Value?.ID == user.ID + ? new HeaderEditButton() + : new HeaderFollowButton(user); + } + private IEnumerable createGroups() { if (user.IsSupporter) diff --git a/fluXis/Overlay/User/UserProfileOverlay.cs b/fluXis/Overlay/User/UserProfileOverlay.cs index 29e0fa31b..864b33653 100644 --- a/fluXis/Overlay/User/UserProfileOverlay.cs +++ b/fluXis/Overlay/User/UserProfileOverlay.cs @@ -153,7 +153,7 @@ private void displayData(APIUser user) flow.Show(); flow.Children = new Drawable[] { - new ProfileHeader(user), + new ProfileHeader(user, this), new FillFlowContainer { RelativeSizeAxes = Axes.X, From b094e6fd3f85cfdbde7242d2863414073373c12e Mon Sep 17 00:00:00 2001 From: menvae Date: Tue, 10 Mar 2026 22:21:39 +0200 Subject: [PATCH 2/2] apply style changes --- fluXis/Overlay/User/ProfileHeader.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/fluXis/Overlay/User/ProfileHeader.cs b/fluXis/Overlay/User/ProfileHeader.cs index cd100ea46..96d93695c 100644 --- a/fluXis/Overlay/User/ProfileHeader.cs +++ b/fluXis/Overlay/User/ProfileHeader.cs @@ -34,7 +34,7 @@ public partial class ProfileHeader : Container private bool showPronouns => !string.IsNullOrEmpty(user.Pronouns); private bool showBottomRow => showUsername || showPronouns; - private UserProfileOverlay overlay; + private readonly UserProfileOverlay overlay; public ProfileHeader(APIUser user, UserProfileOverlay overlay) { @@ -266,16 +266,22 @@ private IEnumerable createHeaderButtons(IAPIClient api, [CanBeNull] Fl }; if (user.Following is UserFollowState.Mutual && api.User.Value?.ID != user.ID) + { yield return new HeaderButton { Icon = FontAwesome6.Solid.Message, Text = "Message", - Action = () => { chat?.CreatePrivateChannel(user.ID); overlay.Hide(); }, + Action = () => + { + chat?.CreatePrivateChannel(user.ID); + overlay.Hide(); + }, }; + } yield return api.User.Value?.ID == user.ID - ? new HeaderEditButton() - : new HeaderFollowButton(user); + ? new HeaderEditButton() + : new HeaderFollowButton(user); } private IEnumerable createGroups()