[backend/razor] Add UI for setting instance icon

This commit is contained in:
pancakes 2025-03-29 02:01:31 +10:00
parent 91c7a330b0
commit cde0691cec
No known key found for this signature in database
2 changed files with 23 additions and 6 deletions

View file

@ -80,6 +80,7 @@ public static class MetaEntity
public static readonly NullableStringMeta InstanceDescription = new("instance_description"); public static readonly NullableStringMeta InstanceDescription = new("instance_description");
public static readonly NullableStringMeta AdminContactEmail = new("admin_contact_email"); public static readonly NullableStringMeta AdminContactEmail = new("admin_contact_email");
public static readonly NullableStringMeta ThemeColor = new("theme_color"); public static readonly NullableStringMeta ThemeColor = new("theme_color");
public static readonly NullableStringMeta IconFileId = new("icon_file_id");
} }
public class Meta<T>( public class Meta<T>(

View file

@ -10,7 +10,9 @@
<p>Here you can adjust basic instance metadata. It gets displayed to all users, including guests.</p> <p>Here you can adjust basic instance metadata. It gets displayed to all users, including guests.</p>
<EditForm FormName="update-metadata" Model="Model" OnSubmit="@OnSubmit"> <EditForm FormName="update-metadata" Model="Model" OnSubmit="@OnSubmit" enctype="multipart/form-data">
<label for="icon">Icon</label>
<InputFile name="Model.IconFile" id="icon" accept="image/*"/>
<label for="name">Instance name</label> <label for="name">Instance name</label>
<InputText @bind-Value="@Model.Name" id="name" placeholder="Shrimp & friends"/> <InputText @bind-Value="@Model.Name" id="name" placeholder="Shrimp & friends"/>
<label for="desc">Instance description</label> <label for="desc">Instance description</label>
@ -23,16 +25,19 @@
</EditForm> </EditForm>
@code { @code {
[Inject] public required MetaService Meta { get; set; } [Inject] public required DriveService Drive { get; set; }
[Inject] public required MetaService Meta { get; set; }
[Inject] public required SystemUserService SystemUser { get; set; }
[SupplyParameterFromForm] private MetadataModel Model { get; set; } = null!; [SupplyParameterFromForm] private MetadataModel Model { get; set; } = null!;
private class MetadataModel private class MetadataModel
{ {
public string? Name { get; set; } public string? Name { get; set; }
public string? Description { get; set; } public string? Description { get; set; }
public string? AdminContact { get; set; } public string? AdminContact { get; set; }
public string? ThemeColor { get; set; } public string? ThemeColor { get; set; }
public IFormFile? IconFile { get; set; }
public void Canonicalize() public void Canonicalize()
{ {
@ -51,6 +56,8 @@
AdminContact = null; AdminContact = null;
if (!colorRegex.IsMatch(ThemeColor ?? "")) if (!colorRegex.IsMatch(ThemeColor ?? ""))
ThemeColor = null; ThemeColor = null;
if (!IconFile?.ContentType.StartsWith("image/") ?? false)
IconFile = null;
} }
} }
@ -74,6 +81,15 @@
await Meta.SetAsync(MetaEntity.AdminContactEmail, Model.AdminContact); await Meta.SetAsync(MetaEntity.AdminContactEmail, Model.AdminContact);
await Meta.SetAsync(MetaEntity.ThemeColor, Model.ThemeColor); await Meta.SetAsync(MetaEntity.ThemeColor, Model.ThemeColor);
if (Model.IconFile != null)
{
var ia = await SystemUser.GetInstanceActorAsync();
var req = new DriveFileCreationRequest { Filename = Model.IconFile.Name, IsSensitive = false, MimeType = Model.IconFile.ContentType };
var file = await Drive.StoreFileAsync(Model.IconFile.OpenReadStream(), ia, req);
await Meta.SetAsync(MetaEntity.IconFileId, file.Id);
}
ReloadPage(); ReloadPage();
} }
} }