138 lines
3.6 KiB
C#
138 lines
3.6 KiB
C#
using System.Reflection.Metadata;
|
|
using Blazorise;
|
|
using Microsoft.AspNetCore.Components;
|
|
using Microsoft.AspNetCore.Components.Forms;
|
|
using WatchIt.DTO.Models.Generics.Image;
|
|
|
|
namespace WatchIt.Website.Components.Panels.Common;
|
|
|
|
public partial class ImageEditorPanel : Component
|
|
{
|
|
#region PARAMETERS
|
|
|
|
[Parameter] public int ContentWidth { get; set; } = 300;
|
|
[Parameter] public required string ImagePlaceholder { get; set; }
|
|
[Parameter] public bool Circle { get; set; }
|
|
[Parameter] public bool Disabled { get; set; }
|
|
|
|
[Parameter] public string Class { get; set; } = string.Empty;
|
|
|
|
[Parameter]
|
|
public required ImageBase? Image
|
|
{
|
|
get => _imageSaved;
|
|
set
|
|
{
|
|
_imageSet = true;
|
|
_imageSaved = value;
|
|
_imageSelected = ImageToRequest(value);
|
|
}
|
|
}
|
|
|
|
[Parameter] public required Func<Task<ImageResponse?>> ImageGetMethod { get; set; }
|
|
[Parameter] public required Func<ImageRequest, Task<ImageResponse?>> ImagePutMethod { get; set; }
|
|
[Parameter] public required Func<Task<bool>> ImageDeleteMethod { get; set; }
|
|
|
|
[Parameter] public Action<ImageResponse?>? OnImageChanged { get; set; }
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region FIELDS
|
|
|
|
private bool _loaded;
|
|
|
|
private ImageBase? _imageSaved;
|
|
private bool _imageSet;
|
|
private ImageRequest? _imageSelected;
|
|
private bool _imageChanged;
|
|
private bool _imageSaving;
|
|
private bool _imageDeleting;
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region PRIVATE METHODS
|
|
|
|
protected override async Task OnFirstRenderAsync()
|
|
{
|
|
await base.OnFirstRenderAsync();
|
|
|
|
if (!_imageSet)
|
|
{
|
|
_imageSaved = await ImageGetMethod();
|
|
_imageSelected = ImageToRequest(_imageSaved);
|
|
}
|
|
|
|
_loaded = true;
|
|
StateHasChanged();
|
|
}
|
|
|
|
private async Task LoadImageFromFile(FileChangedEventArgs args)
|
|
{
|
|
IFileEntry file = args.Files.First();
|
|
Stream stream = file.OpenReadStream(5242880);
|
|
byte[] array;
|
|
using (MemoryStream ms = new MemoryStream())
|
|
{
|
|
await stream.CopyToAsync(ms);
|
|
array = ms.ToArray();
|
|
}
|
|
_imageSelected = new ImageRequest
|
|
{
|
|
Image = array,
|
|
MimeType = file.Type,
|
|
};
|
|
_imageChanged = true;
|
|
}
|
|
|
|
private async Task SaveImage()
|
|
{
|
|
_imageSaving = true;
|
|
if (_imageSelected is not null)
|
|
{
|
|
ImageResponse? response = await ImagePutMethod(_imageSelected);
|
|
if (response is not null)
|
|
{
|
|
_imageSaved = response;
|
|
_imageSelected = ImageToRequest(_imageSaved);
|
|
_imageChanged = false;
|
|
OnImageChanged?.Invoke(response);
|
|
}
|
|
}
|
|
_imageSaving = false;
|
|
}
|
|
|
|
private void CancelImage()
|
|
{
|
|
_imageSelected = ImageToRequest(_imageSaved);
|
|
_imageChanged = false;
|
|
}
|
|
|
|
private async Task DeleteImage()
|
|
{
|
|
_imageDeleting = true;
|
|
if (_imageSaved is not null)
|
|
{
|
|
bool response = await ImageDeleteMethod();
|
|
if (response)
|
|
{
|
|
_imageSaved = null;
|
|
_imageSelected = null;
|
|
_imageChanged = false;
|
|
OnImageChanged?.Invoke(null);
|
|
}
|
|
}
|
|
_imageDeleting = false;
|
|
}
|
|
|
|
public static ImageRequest? ImageToRequest(ImageBase? image) => image is null ? null : new ImageRequest
|
|
{
|
|
Image = image.Image,
|
|
MimeType = image.MimeType,
|
|
};
|
|
|
|
#endregion
|
|
} |