diff --git a/Iceshrimp.Frontend/Components/DriveEntry.razor b/Iceshrimp.Frontend/Components/DriveEntry.razor index 8e07183d..bc75e290 100644 --- a/Iceshrimp.Frontend/Components/DriveEntry.razor +++ b/Iceshrimp.Frontend/Components/DriveEntry.razor @@ -2,12 +2,15 @@ @using Iceshrimp.Shared.Schemas.Web @using Microsoft.Extensions.Localization @using Iceshrimp.Assets.PhosphorIcons +@using Iceshrimp.Frontend.Core.Services +@inject ApiService Api; +@inject IJSRuntime Js; @inject IStringLocalizer Loc; @inject NavigationManager Nav; @if (File != null && Folder == null) { -
+
@if (File.Description != null) { @@ -39,6 +42,36 @@ } @File.Filename + + + @Loc["Rename"] + + @if (File.Sensitive) + { + + @Loc["Mark as not sensitive"] + + } + else + { + + @Loc["Mark as sensitive"] + + } + + @Loc["Set alt text"] + + + @Loc["Open"] + + + @Loc["Copy link"] + + + @Loc["Delete"] + + +
} @if (Folder != null && File == null) @@ -50,12 +83,62 @@ } @code { - [Parameter] public DriveFileResponse? File { get; set; } = null; - [Parameter] public DriveFolderResponse? Folder { get; set; } = null; + [Parameter] public DriveFileResponse? File { get; set; } = null; + [Parameter] public DriveFolderResponse? Folder { get; set; } = null; + private Menu FileMenu { get; set; } = null!; + private ElementReference FileButton { get; set; } - private void SelectFile() + private void SelectFile() => FileMenu.Toggle(FileButton); + + private async Task RenameFile() { - + var filename = await Js.InvokeAsync("prompt", "Rename file", File!.Filename); + if (string.IsNullOrWhiteSpace(filename)) return; + + var res = await Api.Drive.UpdateFileAsync(File!.Id, new UpdateDriveFileRequest { Filename = filename.Trim() }); + if (res != null) + { + File.Filename = res.Filename; + StateHasChanged(); + } + } + + private async Task MarkFileSensitive(bool sensitive) + { + var res = await Api.Drive.UpdateFileAsync(File!.Id, new UpdateDriveFileRequest { Sensitive = sensitive}); + if (res != null) + { + File.Sensitive = res.Sensitive; + StateHasChanged(); + } + } + + private async Task MarkFileNotSensitive() => await MarkFileSensitive(false); + + private async Task MarkFileAsSensitive() => await MarkFileSensitive(true); + + private async Task SetFileAltText() + { + var alt = await Js.InvokeAsync("prompt", "Set alt text", File!.Description); + if (alt == null) return; + + var res = await Api.Drive.UpdateFileAsync(File!.Id, new UpdateDriveFileRequest { Description = string.IsNullOrWhiteSpace(alt) ? null : alt.Trim() }); + if (res != null) + { + File.Description = res.Description; + StateHasChanged(); + } + } + + private void OpenFile() => Js.InvokeVoidAsync("open", File!.Url, "_blank"); + + private void CopyFileLink() => Js.InvokeVoidAsync("navigator.clipboard.writeText", File!.Url); + + private async Task DeleteFile() + { + await Api.Drive.DeleteFileAsync(File!.Id); + File = null; + StateHasChanged(); } private void SelectFolder() diff --git a/Iceshrimp.Frontend/Core/ControllerModels/DriveControllerModel.cs b/Iceshrimp.Frontend/Core/ControllerModels/DriveControllerModel.cs index 9dd17f99..c9db9613 100644 --- a/Iceshrimp.Frontend/Core/ControllerModels/DriveControllerModel.cs +++ b/Iceshrimp.Frontend/Core/ControllerModels/DriveControllerModel.cs @@ -19,6 +19,9 @@ internal class DriveControllerModel(ApiClient api) public Task UpdateFileAsync(string id, UpdateDriveFileRequest request) => api.CallNullableAsync(HttpMethod.Patch, $"/drive/{id}", data: request); + public Task DeleteFileAsync(string id) => + api.CallNullableAsync(HttpMethod.Delete, $"/drive/{id}"); + public Task GetFolderAsync(string? id) => api.CallNullableAsync(HttpMethod.Get, "/drive/folder" + (id != null ? $"/{id}" : "")); } \ No newline at end of file