diff --git a/Iceshrimp.Frontend/Components/Compose.razor b/Iceshrimp.Frontend/Components/Compose.razor index 5fe74495..24bc6e93 100644 --- a/Iceshrimp.Frontend/Components/Compose.razor +++ b/Iceshrimp.Frontend/Components/Compose.razor @@ -8,35 +8,81 @@ - - + + + - @if (NoteDraft.Cw != null) { - + @if (NoteDraft.Cw != null) + { + +
} - + @code { private ElementReference Dialog { get; set; } private IJSObjectReference? _module; private IList Attachments { get; set; } = []; - private NoteCreateRequest NoteDraft { get; set; } = new NoteCreateRequest + private InputFile UploadInput { get; set; } + + private NoteCreateRequest NoteDraft { get; set; } = new NoteCreateRequest { Text = "", Visibility = NoteVisibility.Public, // FIXME: Default to visibilty in settings - Cw = null + Cw = null }; + RenderFragment DropdownIcon(NoteVisibility vis) + { + return vis switch + { + NoteVisibility.Public => (@), + NoteVisibility.Home => (@), + NoteVisibility.Followers => (@), + NoteVisibility.Specified => (@), + _ => throw new ArgumentOutOfRangeException() + }; + } + + RenderFragment DropdownContent(NoteVisibility vis) + { + return vis switch + { + NoteVisibility.Public => (@Public), + NoteVisibility.Home => (@Unlisted), + NoteVisibility.Followers => (@Followers), + NoteVisibility.Specified => (@Direct), + _ => throw new ArgumentOutOfRangeException() + }; + } + + private IList> DropDownCreate() + { + return Enum.GetValues() + .Select(vis => + new DropdownElement { Icon = DropdownIcon(vis), Content = DropdownContent(vis), Selection = vis }) + .ToList(); + } + + // The Component is hidden, and triggered by a sepperate button. + // That way we get it's functionality, without the styling limitations of the InputFile component + private async Task OpenUpload() + { + await _module.InvokeVoidAsync("openUpload", UploadInput.Element); + } + public async Task OpenDialog() { await _module.InvokeVoidAsync("openDialog", Dialog); @@ -53,6 +99,7 @@ { NoteDraft.MediaIds = Attachments.Select(x => x.Id).ToList(); } + await ApiService.Notes.CreateNote(NoteDraft); await CloseDialog(); // FIXME: Implement timeline refresh and call it here. @@ -79,5 +126,5 @@ "./Components/Compose.razor.js"); } } - + } \ No newline at end of file diff --git a/Iceshrimp.Frontend/Components/Compose.razor.css b/Iceshrimp.Frontend/Components/Compose.razor.css index 04390b77..d4ec584c 100644 --- a/Iceshrimp.Frontend/Components/Compose.razor.css +++ b/Iceshrimp.Frontend/Components/Compose.razor.css @@ -2,11 +2,49 @@ background-color: var(--background-color); border-radius: 1rem; margin: 0 auto; - top: 10% + top: 10%; + padding: 1rem; +} +.compose::backdrop { + background-color: black; + opacity: 50%; +} +.header { + margin-bottom: 0.5rem; } .textarea { display: block; + background-color: var(--background-color); + border: none; + outline: none; } .input { display: block; + background-color: var(--background-color); + border: none; + outline: none; + } + +.cw-field { + margin-bottom: 0.5rem; + width: 100%; +} +.post-btn { + background: var(--accent-color); + float: right; +} + +.footer-btn { + width: 2.5rem; + height: max-content; + background-color: var(--background-color); +} +.separator { + color: var(--highlight-color); + margin-top: 0.25rem; + margin-bottom: 0.25rem; +} + +.file-input { + display: none; } \ No newline at end of file diff --git a/Iceshrimp.Frontend/Components/Compose.razor.js b/Iceshrimp.Frontend/Components/Compose.razor.js index 0022d5e1..aee5a96e 100644 --- a/Iceshrimp.Frontend/Components/Compose.razor.js +++ b/Iceshrimp.Frontend/Components/Compose.razor.js @@ -1,8 +1,10 @@ export function openDialog(element){ - console.log("opening JS") element.showModal() } export function closeDialog(element){ - console.log("closing JS") element.close() +} + +export function openUpload(element){ + element.click(); } \ No newline at end of file diff --git a/Iceshrimp.Frontend/Components/Dropdown.razor b/Iceshrimp.Frontend/Components/Dropdown.razor new file mode 100644 index 00000000..e5cc62c2 --- /dev/null +++ b/Iceshrimp.Frontend/Components/Dropdown.razor @@ -0,0 +1,42 @@ +@typeparam TBind + + + +@if (Visible) +{ + +} + +@code { + [Parameter] [EditorRequired] public required IEnumerable> Elements { get; set; } + [Parameter] [EditorRequired] public required TBind Value { get; set; } + [Parameter] public EventCallback ValueChanged { get; set; } + private DropdownElement? CurrentSelection { get; set; } + private RenderFragment? CurrentIcon { get; set; } + private bool Visible { get; set; } = false; + + private void UpdateSelected(DropdownElement element) + { + CurrentSelection = element; + CurrentIcon = CurrentSelection.Icon; + ValueChanged.InvokeAsync(element.Selection); + Visible = false; + } + + private void Toggle() + { + Visible = !Visible; + } + protected override void OnInitialized() + { + UpdateSelected(Elements.FirstOrDefault() ?? throw new InvalidOperationException()); + } + +} \ No newline at end of file diff --git a/Iceshrimp.Frontend/Components/Dropdown.razor.css b/Iceshrimp.Frontend/Components/Dropdown.razor.css new file mode 100644 index 00000000..a61b72f3 --- /dev/null +++ b/Iceshrimp.Frontend/Components/Dropdown.razor.css @@ -0,0 +1,10 @@ +.dropdown-menu { + position: absolute; + top: 5rem; + background-color: var(--background-color); + padding: 0.5rem; + border-color: var(--highlight-color); + border-style: solid; + border-width: 0.1rem; + border-radius: 0.5rem; +} \ No newline at end of file diff --git a/Iceshrimp.Frontend/Components/Dropdown.razor.js b/Iceshrimp.Frontend/Components/Dropdown.razor.js new file mode 100644 index 00000000..3db2d0a5 --- /dev/null +++ b/Iceshrimp.Frontend/Components/Dropdown.razor.js @@ -0,0 +1,5 @@ +export class Dropdown { + +} + +window.Dropdown = Dropdown; \ No newline at end of file diff --git a/Iceshrimp.Frontend/Components/DropdownElement.razor b/Iceshrimp.Frontend/Components/DropdownElement.razor new file mode 100644 index 00000000..d02f41b2 --- /dev/null +++ b/Iceshrimp.Frontend/Components/DropdownElement.razor @@ -0,0 +1,19 @@ +@typeparam TBind + + + +@code { + [Parameter] [EditorRequired] public required RenderFragment Icon { get; set; } + [Parameter] [EditorRequired] public required RenderFragment Content { get; set; } + [Parameter] [EditorRequired] public EventCallback> OnSelect { get; set; } + [Parameter] [EditorRequired] public required TBind Selection { get; set; } + + private async Task OnClick() + { + await OnSelect.InvokeAsync(this); + } + +} \ No newline at end of file diff --git a/Iceshrimp.Frontend/Components/DropdownElement.razor.css b/Iceshrimp.Frontend/Components/DropdownElement.razor.css new file mode 100644 index 00000000..edf99df7 --- /dev/null +++ b/Iceshrimp.Frontend/Components/DropdownElement.razor.css @@ -0,0 +1,4 @@ +.dropdown-element { + margin: 0.25em; + cursor: pointer; +} \ No newline at end of file