[frontend] Add emoji picker to Note Compose
This commit is contained in:
parent
b39007362c
commit
791252ccd4
4 changed files with 47 additions and 12 deletions
|
@ -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"];
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
|
@ -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()
|
||||||
{
|
{
|
||||||
|
|
|
@ -21,3 +21,8 @@
|
||||||
width: 2rem;
|
width: 2rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.fixed {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 10%;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue