From 52dca9f3bec615f555ced70c68bb4165b289134d Mon Sep 17 00:00:00 2001 From: Lilian Date: Fri, 12 Jul 2024 23:32:50 +0200 Subject: [PATCH] [frontend] Refactor EmojiPicker and it's usages, add globally accessible components --- Iceshrimp.Frontend/Components/Compose.razor | 18 +++--- .../Components/Compose.razor.css | 25 +++++++- .../Components/Compose.razor.js | 2 +- .../Components/EmojiPicker.razor | 57 +++++++++---------- .../Components/EmojiPicker.razor.css | 12 ++-- .../Components/EmojiPicker.razor.js | 14 +++++ .../Components/GlobalComponents.razor | 4 ++ .../Components/Note/NoteFooter.razor | 12 ++-- .../Core/Services/GlobalComponentSvc.cs | 7 +++ Iceshrimp.Frontend/Layout/Sidebar.razor | 3 +- Iceshrimp.Frontend/Layout/Sidebar.razor.css | 4 +- Iceshrimp.Frontend/Startup.cs | 1 + 12 files changed, 105 insertions(+), 54 deletions(-) create mode 100644 Iceshrimp.Frontend/Components/EmojiPicker.razor.js create mode 100644 Iceshrimp.Frontend/Components/GlobalComponents.razor create mode 100644 Iceshrimp.Frontend/Core/Services/GlobalComponentSvc.cs diff --git a/Iceshrimp.Frontend/Components/Compose.razor b/Iceshrimp.Frontend/Components/Compose.razor index 9d88da15..a2ac4ad4 100644 --- a/Iceshrimp.Frontend/Components/Compose.razor +++ b/Iceshrimp.Frontend/Components/Compose.razor @@ -10,7 +10,9 @@ @inject ComposeService ComposeService @inject SessionService SessionService @inject IStringLocalizer Loc; - +@inject GlobalComponentSvc GlobalComponentSvc + +
-
Upload!
+
+ @code { private ElementReference Dialog { get; set; } private IJSObjectReference _module = null!; @@ -58,7 +61,7 @@ private NoteBase? ReplyOrQuote { get; set; } private string? TextPlaceholder { get; set; } private ElementReference Textarea { get; set; } - private EmojiPicker EmojiPicker { get; set; } = null!; + private ElementReference EmojiButton { get; set; } private NoteCreateRequest NoteDraft { get; set; } = new() { @@ -250,9 +253,8 @@ } private void ToggleEmojiPicker() - { - _ = EmojiPicker.Toggle(); - StateHasChanged(); + { + GlobalComponentSvc.EmojiPicker?.Open(EmojiButton, new EventCallback(this, AddEmoji)); } private async Task AddEmoji(EmojiResponse emoji) diff --git a/Iceshrimp.Frontend/Components/Compose.razor.css b/Iceshrimp.Frontend/Components/Compose.razor.css index 9c504625..9612c568 100644 --- a/Iceshrimp.Frontend/Components/Compose.razor.css +++ b/Iceshrimp.Frontend/Components/Compose.razor.css @@ -4,11 +4,24 @@ margin: 0 auto; top: 10%; padding: 1rem; + position: relative; + width: 45rem; } -.compose::backdrop { - background-color: black; +.dialog { + width: 100vw; + height: 100vh; + top: 0; + left: 0; + position: fixed; + margin: auto; + background-color: unset; + z-index: +1; +} + +.backdrop { opacity: 50%; + background-color: black; } .header { @@ -20,6 +33,7 @@ background-color: var(--background-color); border: none; outline: none; + width: 100%; } .input { @@ -61,11 +75,16 @@ padding: 0.5rem; } +.positioned { + position: relative; + top: 0; +} + .backdrop { position: fixed; width: 100vw; height: 100vh; top: 0; left: 0; - z-index: -1 + z-index: -2 } \ No newline at end of file diff --git a/Iceshrimp.Frontend/Components/Compose.razor.js b/Iceshrimp.Frontend/Components/Compose.razor.js index 2a3498ae..546f806d 100644 --- a/Iceshrimp.Frontend/Components/Compose.razor.js +++ b/Iceshrimp.Frontend/Components/Compose.razor.js @@ -1,5 +1,5 @@ export function openDialog(element) { - element.showModal() + element.show() } export function closeDialog(element) { diff --git a/Iceshrimp.Frontend/Components/EmojiPicker.razor b/Iceshrimp.Frontend/Components/EmojiPicker.razor index 05d1d976..ec9d172a 100644 --- a/Iceshrimp.Frontend/Components/EmojiPicker.razor +++ b/Iceshrimp.Frontend/Components/EmojiPicker.razor @@ -1,10 +1,11 @@ @using Iceshrimp.Frontend.Core.Services @using Iceshrimp.Shared.Schemas.Web -@inject EmojiService EmojiService +@inject EmojiService EmojiService +@inject GlobalComponentSvc GlobalComponentSvc +@inject IJSRuntime Js -@if (_display) -{ -
+ +
@foreach (var el in EmojiList) {
@@ -12,45 +13,43 @@
}
-} + +
+ @code { - [Parameter] public bool Fixed { get; set; } - [Parameter] [EditorRequired] public required EventCallback OnEmojiSelect { get; set; } - - private List EmojiList { get; set; } = []; - private bool _display = false; - private ElementReference EmojiPickerRef { get; set; } + private EventCallback OnEmojiSelect { get; set; } + private List EmojiList { get; set; } = []; + private ElementReference EmojiPickerRef { get; set; } + private float _top; + private float _left; + private IJSInProcessObjectReference _module = null!; protected override async Task OnInitializedAsync() { - EmojiList = await EmojiService.GetEmoji(); + GlobalComponentSvc.EmojiPicker = this; + EmojiList = await EmojiService.GetEmoji(); + _module = (IJSInProcessObjectReference)await Js.InvokeAsync("import", + "./Components/EmojiPicker.razor.js"); } private async void Select(EmojiResponse emoji) { await OnEmojiSelect.InvokeAsync(emoji); - _display = false; - StateHasChanged(); } private void Close() { - _display = false; + _module.InvokeVoid("closeDialog", EmojiPickerRef); + } + + public void Open(ElementReference root, EventCallback func) + { + OnEmojiSelect = func; + var pos = _module.Invoke>("getPosition", root); + _left = pos[0]; + _top = pos[1]; StateHasChanged(); - } - - protected override void OnAfterRender(bool firstRender) - { - if (_display) - { - EmojiPickerRef.FocusAsync(); - } - } - - public async Task Toggle() - { - _display = !_display; - await InvokeAsync(StateHasChanged); + _module.InvokeVoid("openDialog", EmojiPickerRef); } } \ No newline at end of file diff --git a/Iceshrimp.Frontend/Components/EmojiPicker.razor.css b/Iceshrimp.Frontend/Components/EmojiPicker.razor.css index 553a6c3a..029ed5d4 100644 --- a/Iceshrimp.Frontend/Components/EmojiPicker.razor.css +++ b/Iceshrimp.Frontend/Components/EmojiPicker.razor.css @@ -1,4 +1,6 @@ .emoji-picker { + --top: 0px; + --left: 0px; display: grid; grid-template-columns: repeat(auto-fill, minmax(2.5rem, 1fr)); grid-template-rows: repeat(auto-fill, minmax(2.5rem, 1fr)); @@ -10,9 +12,12 @@ min-width: 15rem; min-height: 10rem; overflow: scroll; - z-index: 100; - top: 2.5rem; - left: -6rem; + top: calc(var(--top) + 2.5rem); + left: calc(var(--left) - 5.5rem); +} + +.dialog { + z-index: +2; } .emoji { @@ -22,4 +27,3 @@ width: 2rem; } } - diff --git a/Iceshrimp.Frontend/Components/EmojiPicker.razor.js b/Iceshrimp.Frontend/Components/EmojiPicker.razor.js new file mode 100644 index 00000000..b6c024c1 --- /dev/null +++ b/Iceshrimp.Frontend/Components/EmojiPicker.razor.js @@ -0,0 +1,14 @@ +export function getPosition(ref){ + let rect = ref.getBoundingClientRect() + let x = rect.x + window.scrollX; + let y = rect.y + window.scrollY; + return [x, y] +} + +export function openDialog(ref){ + ref.show(); +} + +export function closeDialog(ref){ + ref.close(); +} \ No newline at end of file diff --git a/Iceshrimp.Frontend/Components/GlobalComponents.razor b/Iceshrimp.Frontend/Components/GlobalComponents.razor new file mode 100644 index 00000000..999b264b --- /dev/null +++ b/Iceshrimp.Frontend/Components/GlobalComponents.razor @@ -0,0 +1,4 @@ + +@code { + +} \ No newline at end of file diff --git a/Iceshrimp.Frontend/Components/Note/NoteFooter.razor b/Iceshrimp.Frontend/Components/Note/NoteFooter.razor index 7b0facb0..14e8354b 100644 --- a/Iceshrimp.Frontend/Components/Note/NoteFooter.razor +++ b/Iceshrimp.Frontend/Components/Note/NoteFooter.razor @@ -6,6 +6,7 @@ @inject IStringLocalizer Loc; @inject IJSRuntime Js; @inject SessionService Session; +@inject GlobalComponentSvc GlobalComponentSvc