diff --git a/Iceshrimp.Frontend/Core/ControllerModels/EmojiControllerModel.cs b/Iceshrimp.Frontend/Core/ControllerModels/EmojiControllerModel.cs index df81d7d6..2be12fb1 100644 --- a/Iceshrimp.Frontend/Core/ControllerModels/EmojiControllerModel.cs +++ b/Iceshrimp.Frontend/Core/ControllerModels/EmojiControllerModel.cs @@ -11,8 +11,15 @@ internal class EmojiControllerModel(ApiClient api) public Task> GetAllEmojiAsync() => api.CallAsync>(HttpMethod.Get, "/emoji"); - public Task>> GetRemoteEmojiAsync(PaginationQuery pq) => - api.CallAsync>>(HttpMethod.Get, "/emoji/remote", pq); + public Task>> GetRemoteEmojiAsync(string? name, string? host, PaginationQuery pq) => + api.CallAsync>>(HttpMethod.Get, "/emoji/remote", + (name != null + ? QueryString.Create("name", name) + : QueryString.Empty) + + (host != null + ? QueryString.Create("host", host) + : QueryString.Empty) + + pq); public Task>> GetRemoteEmojiAsync(string instance, PaginationQuery pq) => api.CallAsync>>(HttpMethod.Get, $"/emoji/remote/{instance}", pq); diff --git a/Iceshrimp.Frontend/Layout/MainLayout.razor.css b/Iceshrimp.Frontend/Layout/MainLayout.razor.css index 99e2c2a6..7ff4a36f 100644 --- a/Iceshrimp.Frontend/Layout/MainLayout.razor.css +++ b/Iceshrimp.Frontend/Layout/MainLayout.razor.css @@ -70,6 +70,7 @@ .top-bar { .action { margin-left: auto; + color: var(--notice-color); } } diff --git a/Iceshrimp.Frontend/Pages/Moderation/CustomEmojis.razor b/Iceshrimp.Frontend/Pages/Moderation/CustomEmojis.razor index 8ed7e936..622a0c6e 100644 --- a/Iceshrimp.Frontend/Pages/Moderation/CustomEmojis.razor +++ b/Iceshrimp.Frontend/Pages/Moderation/CustomEmojis.razor @@ -30,6 +30,12 @@ } + @if (State is not State.Loading) + { + + + + }
@@ -175,7 +181,7 @@ } else { - var res = await Api.Emoji.GetRemoteEmojiAsync(new PaginationQuery()); + var res = await Api.Emoji.GetRemoteEmojiAsync(null, null, new PaginationQuery()); PaginationData = res.Links; StoredRemoteEmojis = res.Data; } @@ -213,7 +219,7 @@ { if (PaginationData?.Next == null) return; var pq = new PaginationQuery { MaxId = PaginationData.Next?.Split('=')[1], Limit = PaginationData.Limit }; - var res = await Api.Emoji.GetRemoteEmojiAsync(pq); + var res = await Api.Emoji.GetRemoteEmojiAsync(null, null, pq); PaginationData = res.Links; StoredRemoteEmojis.AddRange(res.Data); if (EmojiFilter.Length == 0) diff --git a/Iceshrimp.Frontend/Pages/Moderation/CustomEmojisRemote.razor b/Iceshrimp.Frontend/Pages/Moderation/CustomEmojisRemote.razor new file mode 100644 index 00000000..419069fb --- /dev/null +++ b/Iceshrimp.Frontend/Pages/Moderation/CustomEmojisRemote.razor @@ -0,0 +1,99 @@ +@page "/mod/emojis/remote" +@using Iceshrimp.Frontend.Core.Services +@using Iceshrimp.Frontend.Localization +@using Microsoft.AspNetCore.Authorization +@using Microsoft.Extensions.Localization +@using Iceshrimp.Frontend.Components +@using Microsoft.AspNetCore.Components.Sections +@using Iceshrimp.Assets.PhosphorIcons +@using Iceshrimp.Frontend.Core.Miscellaneous +@using Iceshrimp.Shared.Schemas.Web +@attribute [Authorize(Roles = "moderator")] +@layout ModerationLayout +@inject ApiService Api; +@inject GlobalComponentSvc Global; +@inject IJSRuntime Js; +@inject IStringLocalizer Loc; +@inject ILogger Logger; + + + + + + @Loc["Remote Emojis"] + @if (State is not State.Loading) + { + + + + } + + +
+ @if (State is State.Empty or State.Error or State.Loaded) + { + + } + @if (State is State.Loaded) + { +
+ @foreach (var emoji in Emojis) + { + + } +
+ @if (PaginationData is { Next: not null }) + { + + } + } + @if (State is State.Empty) + { + This instance hasn't received remote emojis + } + @if (State is State.Loading) + { +
+ +
+ } +
+ +@code { + private List Emojis { get; set; } = []; + private string EmojiFilter { get; set; } = ""; + private string HostFilter { get; set; } = ""; + private State State { get; set; } + private PaginationData? PaginationData { get; set; } + + private async Task Search() + { + State = State.Loading; + + var res = await Api.Emoji.GetRemoteEmojiAsync(string.IsNullOrWhiteSpace(EmojiFilter) ? null : EmojiFilter.ToLower().Replace(" ", ""), string.IsNullOrWhiteSpace(HostFilter) ? null : HostFilter.ToLower().Replace(" ", ""), new PaginationQuery()); + PaginationData = res.Links; + Emojis = res.Data; + + State = State.Loaded; + StateHasChanged(); + } + + private async Task FetchMore() + { + if (PaginationData?.Next == null) return; + var pq = new PaginationQuery { MaxId = PaginationData.Next?.Split('=')[1], Limit = PaginationData.Limit }; + var res = await Api.Emoji.GetRemoteEmojiAsync(string.IsNullOrWhiteSpace(EmojiFilter) ? null : EmojiFilter.ToLower().Replace(" ", ""), string.IsNullOrWhiteSpace(HostFilter) ? null : HostFilter.ToLower().Replace(" ", ""), pq); + PaginationData = res.Links; + Emojis.AddRange(res.Data); + StateHasChanged(); + } + + protected override async Task OnInitializedAsync() + { + await Search(); + } +} \ No newline at end of file diff --git a/Iceshrimp.Frontend/Pages/Moderation/CustomEmojisRemote.razor.css b/Iceshrimp.Frontend/Pages/Moderation/CustomEmojisRemote.razor.css new file mode 100644 index 00000000..4efaa779 --- /dev/null +++ b/Iceshrimp.Frontend/Pages/Moderation/CustomEmojisRemote.razor.css @@ -0,0 +1,22 @@ +.emoji-search { + display: flex; + margin-top: 1rem; +} + +.search { + display: inline-block; + width: 100%; +} + +.emoji-list { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.5rem; + width: 100%; +} + +.loading { + display: flex; + justify-content: center; + margin-top: 5rem; +} \ No newline at end of file