using salesbook.Shared.Core.Dto; using salesbook.Shared.Core.Interface; namespace salesbook.Maui.Core.Services; public class AttachedService : IAttachedService { public async Task SelectImage() { // Richiesta permessi base var cameraPerm = await Permissions.RequestAsync(); var storagePerm = await Permissions.RequestAsync(); if (cameraPerm != PermissionStatus.Granted && storagePerm != PermissionStatus.Granted) return null; // Mostro all'utente un popup di scelta var action = await Application.Current.MainPage.DisplayActionSheet( "Aggiungi immagine", "Annulla", null, "Scatta foto", "Scegli dalla galleria"); FileResult? result = null; try { if (action == "Scatta foto") { result = await MediaPicker.Default.CapturePhotoAsync(); } else if (action == "Scegli dalla galleria") { result = await MediaPicker.Default.PickPhotoAsync(); } } catch (Exception ex) { Console.WriteLine($"Errore selezione immagine: {ex.Message}"); return null; } return result is null ? null : await ConvertToDto(result, AttachedDTO.TypeAttached.Image); } public async Task SelectFile() { var perm = await Permissions.RequestAsync(); if (perm != PermissionStatus.Granted) return null; var result = await FilePicker.PickAsync(); return result is null ? null : await ConvertToDto(result, AttachedDTO.TypeAttached.Document); } public async Task SelectPosition() { var perm = await Permissions.RequestAsync(); if (perm != PermissionStatus.Granted) return null; var loc = await Geolocation.GetLastKnownLocationAsync(); if (loc is null) return null; return new AttachedDTO { Name = "Posizione attuale", Lat = loc.Latitude, Lng = loc.Longitude, Type = AttachedDTO.TypeAttached.Position }; } private static async Task ConvertToDto(FileResult file, AttachedDTO.TypeAttached type) { var stream = await file.OpenReadAsync(); using var ms = new MemoryStream(); await stream.CopyToAsync(ms); return new AttachedDTO { Name = file.FileName, Path = file.FullPath, MimeType = file.ContentType, DimensionBytes = ms.Length, FileBytes = ms.ToArray(), Type = type }; } private static async Task SaveToTempStorage(Stream file, string fileName) { var cacheDirectory = FileSystem.CacheDirectory; var targetDirectory = Path.Combine(cacheDirectory, "file"); if (!Directory.Exists(targetDirectory)) Directory.CreateDirectory(targetDirectory); var tempFilePath = Path.Combine(targetDirectory, fileName + ".temp"); var filePath = Path.Combine(targetDirectory, fileName); if (File.Exists(filePath)) return filePath; try { await using var fileStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write, FileShare.None); await file.CopyToAsync(fileStream); File.Move(tempFilePath, filePath); } catch (Exception e) { Console.WriteLine($"Errore durante il salvataggio dello stream: {e.Message}"); return null; } finally { if (File.Exists(tempFilePath)) File.Delete(tempFilePath); } return filePath; } public async Task OpenFile(Stream file, string fileName) { var filePath = await SaveToTempStorage(file, fileName); if (filePath is null) return; await Launcher.OpenAsync(new OpenFileRequest { File = new ReadOnlyFile(filePath) }); } }