@using Iceshrimp.Frontend.Localization @using Iceshrimp.Shared.Schemas.Web @using Microsoft.Extensions.Localization @using Iceshrimp.Assets.PhosphorIcons @using Iceshrimp.Frontend.Core.Miscellaneous @using Iceshrimp.Frontend.Core.Services @inject ApiService Api; @inject GlobalComponentSvc Global; @inject IJSRuntime Js; @inject IStringLocalizer Loc; @inject NavigationManager Nav; @if (File != null && Folder == null) {
@if (File.IsAvatar) { } @if (File.IsBanner) { } @if (File.Description != null) { } else { } @if (File.Sensitive) { }
@if (File.ContentType.StartsWith("image")) { @File.Description } else if (File.ContentType.StartsWith("audio")) { } else if (File.ContentType.StartsWith("video")) { } else { } @File.Filename @Loc["Open"] @Loc["Copy link"] @Loc["Rename"] @if (File.Sensitive) { @Loc["Mark as not sensitive"] } else { @Loc["Mark as sensitive"] } @Loc["Set alt text"] @if (ParentId != null || FolderList.Count != 0) { @Loc["Move"] } @Loc["Delete"]
} @if (Folder != null && File == null) {
@Folder.Name @Loc["Open"] @Loc["Rename"] @if (ParentId != null || FolderList.Count > 1) { @Loc["Move"] }
} @code { [Parameter] public DriveFileResponse? File { get; set; } = null; [Parameter] public DriveFolderResponse? Folder { get; set; } = null; private Menu FileMenu { get; set; } = null!; private Menu FolderMenu { get; set; } = null!; private ElementReference FileButton { get; set; } private ElementReference FolderButton { get; set; } [Parameter, EditorRequired] public required string? ParentId { get; set; } [Parameter, EditorRequired] public required List FolderList { get; set; } private void SelectFile() => FileMenu.Toggle(FileButton); private async Task RenameFile() => await Global.PromptDialog?.Prompt(new EventCallback(this, RenameFileCallback), Loc["Rename file"], Loc["File name"], File!.Filename, buttonText: Loc["Rename"])!; private async Task RenameFileCallback(string? filename) { if (string.IsNullOrWhiteSpace(filename)) return; try { var res = await Api.Drive.UpdateFileAsync(File!.Id, new UpdateDriveFileRequest { Filename = filename }); if (res != null) { File.Filename = res.Filename; StateHasChanged(); } } catch (ApiException e) { await Global.NoticeDialog?.Display(e.Response.Message ?? Loc["An unknown error occurred"], NoticeDialog.NoticeType.Error)!; } } private async Task MarkFileSensitive(bool sensitive) { try { var res = await Api.Drive.UpdateFileAsync(File!.Id, new UpdateDriveFileRequest { Sensitive = sensitive }); if (res != null) { File.Sensitive = res.Sensitive; StateHasChanged(); } } catch (ApiException e) { await Global.NoticeDialog?.Display(e.Response.Message ?? Loc["An unknown error occurred"], NoticeDialog.NoticeType.Error)!; } } private async Task MarkFileNotSensitive() => await MarkFileSensitive(false); private async Task MarkFileAsSensitive() => await MarkFileSensitive(true); private async Task SetFileAltText() => await Global.PromptDialog?.Prompt(new EventCallback(this, SetFileAltTextCallback), Loc["Set alt text"], "", File!.Description ?? "", true, true)!; private async Task SetFileAltTextCallback(string? alt) { if (alt == null) return; try { var res = await Api.Drive.UpdateFileAsync(File!.Id, new UpdateDriveFileRequest { Description = string.IsNullOrWhiteSpace(alt) ? null : alt }); if (res != null) { File.Description = res.Description; StateHasChanged(); } } catch (ApiException e) { await Global.NoticeDialog?.Display(e.Response.Message ?? Loc["An unknown error occurred"], NoticeDialog.NoticeType.Error)!; } } private async Task MoveFile() { var folders = FolderList.Select(f => (f.Name ?? "/", (object)(f.Id ?? ""))).OrderBy(f => f.Item1).ToList(); if (ParentId != null) folders.Insert(0, ("/", "")); await Global.SelectDialog?.Select(new EventCallback(this, MoveFileCallback), Loc["Move to folder"], folders)!; } private async Task MoveFileCallback(object? folderId) { if (folderId is not string id) return; try { var res = await Api.Drive.UpdateFileParentAsync(File!.Id, string.IsNullOrWhiteSpace(id) ? null : id); if (res != null) { File = null; StateHasChanged(); } } catch (ApiException e) { await Global.NoticeDialog?.Display(e.Response.Message ?? Loc["An unknown error occurred"], NoticeDialog.NoticeType.Error)!; } } private void OpenFile() => Js.InvokeVoidAsync("open", File!.Url, "_blank"); private void CopyFileLink() => Js.InvokeVoidAsync("navigator.clipboard.writeText", File!.Url); private async Task DeleteFile() => await Global.ConfirmDialog?.Confirm(new EventCallback(this, DeleteFileCallback), Loc["Delete {0}?", File!.Filename], Icons.Trash, Loc["Delete"])!; private async Task DeleteFileCallback(bool delete) { if (!delete) return; try { await Api.Drive.DeleteFileAsync(File!.Id); File = null; StateHasChanged(); } catch (ApiException e) { await Global.NoticeDialog?.Display(e.Response.Message ?? Loc["An unknown error occurred"], NoticeDialog.NoticeType.Error)!; } } private void SelectFolder() => FolderMenu.Toggle(FolderButton); private async Task RenameFolder() { if (Folder is not { Id: not null, Name: not null }) return; await Global.PromptDialog?.Prompt(new EventCallback(this, RenameFolderCallback), Loc["Rename folder"], Loc["Folder name"], Folder!.Name, buttonText: Loc["Rename"])!; } private async Task RenameFolderCallback(string? name) { if (Folder is not { Id: not null, Name: not null }) return; if (string.IsNullOrWhiteSpace(name)) return; try { var res = await Api.Drive.UpdateFolderAsync(Folder.Id, name); if (res != null) { Folder.Name = res.Name; StateHasChanged(); } } catch (ApiException e) { await Global.NoticeDialog?.Display(e.Response.Message ?? Loc["An unknown error occurred"], NoticeDialog.NoticeType.Error)!; } } private async Task MoveFolder() { var folders = FolderList.Where(f => f.Id != Folder!.Id).Select(f => (f.Name ?? "/", (object)(f.Id ?? ""))).OrderBy(f => f.Item1).ToList(); if (ParentId != null) folders.Insert(0, ("/", "")); await Global.SelectDialog?.Select(new EventCallback(this, MoveFolderCallback), Loc["Move to folder"], folders)!; } private async Task MoveFolderCallback(object? folderId) { if (Folder is not { Id: not null, Name: not null }) return; if (folderId is not string id) return; try { var res = await Api.Drive.UpdateFolderParentAsync(Folder.Id, string.IsNullOrWhiteSpace(id) ? null : id); if (res != null) { Folder = null; StateHasChanged(); } } catch (ApiException e) { await Global.NoticeDialog?.Display(e.Response.Message ?? Loc["An unknown error occurred"], NoticeDialog.NoticeType.Error)!; } } private void OpenFolder() => Nav.NavigateTo($"/drive/{Folder!.Id}"); }