@using System.Net.Http.Headers @using Microsoft.AspNetCore.Components.WebAssembly.Authentication @inject IHttpClientFactory HttpClientFactory @inject IJSRuntime JSRuntime @inject NavigationManager Nav @inject ISnackbar Snackbar
@MapName
map image
Map's Image
Design Setting Element Export @* *@
Update Map's Image
Map 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; } } }