@using System.Net.Http.Headers
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@inject IHttpClientFactory HttpClientFactory
@inject IJSRuntime JSRuntime
@inject NavigationManager Nav
@inject ISnackbar Snackbar
@MapName
Design
Setting
Element
Export
@*
*@
Update Map's Image
Cancel
Update
@code {
[Parameter]
public EventCallback MapImageChangedCallBack { get; set; }
private bool Disable = true;
private string imageSrc = "/images/Image-not-found.png";
private string MapName = "Map preview";
private Guid MapId = Guid.Empty;
private string ImagePreview = "";
private IBrowserFile? MapImageChange;
private bool IsUpdateMapImageVisable;
private HttpClient Http = default!;
protected override void OnInitialized()
{
base.OnInitialized();
Http = HttpClientFactory.CreateClient("MapManagerAPI");
}
public void SetMapPreview(MapInfoDto? map)
{
if (map is null)
{
Disable = true;
MapName = "Map preview";
imageSrc = "/images/Image-not-found.png";
MapId = Guid.Empty;
}
else
{
imageSrc = $"{Http.BaseAddress}api/Images/map/{map.Id}?t={DateTime.Now}";
MapName = map.Name;
MapId = map.Id;
Disable = false;
}
StateHasChanged();
}
private async Task DownloadImage()
{
try
{
var response = await Http.GetAsync(imageSrc);
if (response.IsSuccessStatusCode)
{
var fileBytes = await response.Content.ReadAsByteArrayAsync();
var base64Data = Convert.ToBase64String(fileBytes);
var mimeType = "image/png";
var url = $"data:{mimeType};base64,{base64Data}";
await JSRuntime.InvokeVoidAsync("DownloadImage", url, $"{MapName}.png");
}
else Snackbar.Add("Không thể tải ảnh map", Severity.Warning);
}
catch (Exception ex)
{
Snackbar.Add($"Không thể tải ảnh map: {ex.Message}", Severity.Warning);
}
}
private void OpenUpdateMapImage()
{
ImagePreview = imageSrc;
MapImageChange = null;
IsUpdateMapImageVisable = true;
StateHasChanged();
}
public async Task UploadMedia(IBrowserFile file)
{
var path = Path.Combine(Path.GetTempPath(), MapName);
await using var fs = new FileStream(path, FileMode.Create);
await file.OpenReadStream(file.Size).CopyToAsync(fs);
var bytes = new byte[file.Size];
fs.Position = 0;
await fs.ReadAsync(bytes);
fs.Close();
File.Delete(path);
return $"data:{file.ContentType};base64,{Convert.ToBase64String(bytes)}";
}
private async Task MapImageChanged(InputFileChangeEventArgs e)
{
MapImageChange = e.File;
if (MapImageChange is not null)
{
ImagePreview = await UploadMedia(MapImageChange);
StateHasChanged();
}
}
private async Task UpdateMapImage()
{
if (MapImageChange is null) return;
using var content = new MultipartFormDataContent();
var fileContent = new StreamContent(MapImageChange.OpenReadStream(maxAllowedSize: 20480000));
fileContent.Headers.ContentType = new MediaTypeHeaderValue(MapImageChange.ContentType);
content.Add(fileContent, "image", MapImageChange.Name);
var result = await (await Http.PutAsync($"api/MapsManager/image/{MapId}", content)).Content.ReadFromJsonAsync();
if (result is null) Snackbar.Add("Lỗi giao tiếp với hệ thống", Severity.Error);
else if (!result.IsSuccess) Snackbar.Add(result.Message ?? "Lỗi chưa xác định.", Severity.Error);
else
{
imageSrc = ImagePreview;
await MapImageChangedCallBack.InvokeAsync(MapId);
IsUpdateMapImageVisable = false;
Snackbar.Add("Thay đổi thành công", Severity.Success);
}
StateHasChanged();
}
private async Task ExportMap()
{
try
{
if (MapId == Guid.Empty) return;
var response = await Http.GetAsync($"api/MapExport/encrypt/{MapId}");
if (response is not null && response.IsSuccessStatusCode)
{
var fileBytes = await response.Content.ReadAsByteArrayAsync();
var fileName = response.Content.Headers.ContentDisposition?.FileName;
using var streamRef = new DotNetStreamReference(stream: new MemoryStream(fileBytes));
await JSRuntime.InvokeVoidAsync("DownloadMap", string.IsNullOrEmpty(fileName) ? $"{MapName}.map" : fileName, streamRef);
}
}
catch (AccessTokenNotAvailableException ex)
{
ex.Redirect();
return;
}
}
}