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
+
+
+ @CurrentIcon
+
+
+@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
+
+
+ @Icon
+ @Content
+
+
+@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