[frontend] Add emoji picker to Note Compose

This commit is contained in:
Lilian 2024-06-28 21:59:57 +02:00 committed by Laura Hausmann
parent b39007362c
commit 791252ccd4
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
4 changed files with 47 additions and 12 deletions

View file

@ -30,7 +30,7 @@
<input @bind="NoteDraft.Cw" class="input cw-field" placeholder="Content Warning"/> <input @bind="NoteDraft.Cw" class="input cw-field" placeholder="Content Warning"/>
<hr class="separator"/> <hr class="separator"/>
} }
<textarea @bind="NoteDraft.Text" class="textarea" placeholder="@TextPlaceholder" rows="5" cols="35"></textarea> <textarea @ref="Textarea" @bind="NoteDraft.Text" class="textarea" placeholder="@TextPlaceholder" rows="5" cols="35"></textarea>
<div class="footer"> <div class="footer">
<button class="footer-btn" @onclick="OpenUpload"> <button class="footer-btn" @onclick="OpenUpload">
<Icon Name="Icons.Upload" Size="1.3rem"></Icon> <Icon Name="Icons.Upload" Size="1.3rem"></Icon>
@ -38,6 +38,10 @@
<button class="footer-btn" @onclick="ToggleCw"> <button class="footer-btn" @onclick="ToggleCw">
<Icon Name="Icons.EyeSlash" Size="1.3rem"></Icon> <Icon Name="Icons.EyeSlash" Size="1.3rem"></Icon>
</button> </button>
<button class="footer-btn positioned" @onclick="ToggleEmojiPicker">
<Icon Name="Icons.Smiley" Size="1.3rem"></Icon>
<EmojiPicker @ref="EmojiPicker" OnEmojiSelect="AddEmoji" Fixed="true"></EmojiPicker>
</button>
<div class="file-input"> <div class="file-input">
<InputFile @ref="UploadInput" OnChange="Upload">Upload!</InputFile> <InputFile @ref="UploadInput" OnChange="Upload">Upload!</InputFile>
</div> </div>
@ -51,6 +55,8 @@
private InputFile UploadInput { get; set; } = null!; private InputFile UploadInput { get; set; } = null!;
private NoteBase? ReplyOrQuote { get; set; } private NoteBase? ReplyOrQuote { get; set; }
private string? TextPlaceholder { get; set; } private string? TextPlaceholder { get; set; }
private EmojiPicker EmojiPicker { get; set; } = null!;
private ElementReference Textarea { get; set; }
private NoteCreateRequest NoteDraft { get; set; } = new NoteCreateRequest private NoteCreateRequest NoteDraft { get; set; } = new NoteCreateRequest
{ {
Text = "", Text = "",
@ -211,6 +217,23 @@
} }
} }
private void ToggleEmojiPicker()
{
EmojiPicker.Toggle();
Console.WriteLine("showing picker");
StateHasChanged();
}
private async Task AddEmoji(EmojiResponse emoji)
{
var pos = await _module.InvokeAsync<int>("getSelectionStart");
var text = NoteDraft.Text;
var emojiString = $":{emoji.Name}";
NoteDraft.Text = text.Insert(pos, emojiString);
StateHasChanged();
}
protected override void OnInitialized() protected override void OnInitialized()
{ {
TextPlaceholder = AvailablePlaceholders["default"]; TextPlaceholder = AvailablePlaceholders["default"];

View file

@ -5,6 +5,10 @@ export function closeDialog(element){
element.close() element.close()
} }
export function getSelectionStart(element){
return element.selectionStart;
}
export function openUpload(element){ export function openUpload(element){
element.click(); element.click();
} }

View file

@ -2,21 +2,24 @@
@using Iceshrimp.Shared.Schemas @using Iceshrimp.Shared.Schemas
@inject ApiService Api @inject ApiService Api
@if (_display){ @if (_display)
<div class="emoji-picker"> {
@foreach (var el in EmojiList) <div class="emoji-picker @(Fixed ? "fixed" : "")">
{ @foreach (var el in EmojiList)
<div class="emoji"> {
<img @onclick="() => Select(el)" src="@el.PublicUrl" alt="@el.Name"/> <div class="emoji">
</div> <img @onclick="() => Select(el)" src="@el.PublicUrl" alt="@el.Name"/>
} </div>
</div> }
</div>
} }
@code { @code {
[Parameter] [EditorRequired] public required EventCallback<EmojiResponse> OnEmojiSelect { get; set; } [Parameter] [EditorRequired] public required EventCallback<EmojiResponse> OnEmojiSelect { get; set; }
private List<EmojiResponse> EmojiList { get; set; } = []; [Parameter] public bool Fixed { get; set; } = false;
private bool _display = false;
private List<EmojiResponse> EmojiList { get; set; } = [];
private bool _display = false;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {

View file

@ -21,3 +21,8 @@
width: 2rem; width: 2rem;
} }
} }
.fixed {
position: fixed;
bottom: 10%;
}