From 06bda7c881005b30a94eb40eaddff35f7ea4adac Mon Sep 17 00:00:00 2001 From: MarcoE Date: Thu, 18 Sep 2025 10:56:21 +0200 Subject: [PATCH] Gestita fotocamera per allegare immagini --- .../Core/Services/AttachedService.cs | 48 +++--- .../SingleElements/Modal/ActivityForm.razor | 37 +---- .../SingleElements/Modal/AddAttached.razor | 143 +++++++++++++----- salesbook.Shared/Core/Helpers/ModalHelpers.cs | 3 +- .../Core/Interface/IAttachedService.cs | 3 +- 5 files changed, 139 insertions(+), 95 deletions(-) diff --git a/salesbook.Maui/Core/Services/AttachedService.cs b/salesbook.Maui/Core/Services/AttachedService.cs index 5ccdd32..0d42acc 100644 --- a/salesbook.Maui/Core/Services/AttachedService.cs +++ b/salesbook.Maui/Core/Services/AttachedService.cs @@ -5,45 +5,49 @@ namespace salesbook.Maui.Core.Services; public class AttachedService : IAttachedService { - public async Task SelectImage() + public async Task SelectImageFromCamera() { - // Richiesta permessi base var cameraPerm = await Permissions.RequestAsync(); - var storagePerm = await Permissions.RequestAsync(); - - if (cameraPerm != PermissionStatus.Granted && storagePerm != PermissionStatus.Granted) + if (cameraPerm != 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(); - } + result = await MediaPicker.Default.CapturePhotoAsync(); } catch (Exception ex) { - Console.WriteLine($"Errore selezione immagine: {ex.Message}"); + Console.WriteLine($"Errore cattura foto: {ex.Message}"); return null; } return result is null ? null : await ConvertToDto(result, AttachedDTO.TypeAttached.Image); } + public async Task SelectImageFromGallery() + { + var storagePerm = await Permissions.RequestAsync(); + if (storagePerm != PermissionStatus.Granted) + return null; + + FileResult? result = null; + + try + { + result = await MediaPicker.Default.PickPhotoAsync(); + } + catch (Exception ex) + { + Console.WriteLine($"Errore selezione galleria: {ex.Message}"); + return null; + } + + return result is null ? null : await ConvertToDto(result, AttachedDTO.TypeAttached.Image); + } + + public async Task SelectFile() { var perm = await Permissions.RequestAsync(); diff --git a/salesbook.Shared/Components/SingleElements/Modal/ActivityForm.razor b/salesbook.Shared/Components/SingleElements/Modal/ActivityForm.razor index 4f1d798..e2b13b7 100644 --- a/salesbook.Shared/Components/SingleElements/Modal/ActivityForm.razor +++ b/salesbook.Shared/Components/SingleElements/Modal/ActivityForm.razor @@ -101,7 +101,7 @@ ShowProgressIndicator="true" DebounceInterval="300" MaxItems="50" - Class="customIcon-select" + Class="customIcon-select" AdornmentIcon="@Icons.Material.Filled.Code"/> @@ -218,30 +218,6 @@ - - - - - - - - Salva - - - - - - - Vuoi creare un promemoria? - - - - Crea - - - @@ -282,12 +258,9 @@ //MessageBox private MudMessageBox ConfirmDelete { get; set; } - private MudMessageBox ConfirmMemo { get; set; } - private MudMessageBox AddNamePosition { get; set; } //Attached private List? AttachedList { get; set; } - private string? NamePosition { get; set; } private bool CanAddPosition { get; set; } = true; // cache per commesse @@ -634,16 +607,8 @@ var attached = (AttachedDTO)result.Data; if (attached.Type == AttachedDTO.TypeAttached.Position) - { CanAddPosition = false; - var resultNamePosition = await AddNamePosition.ShowAsync(); - - if (resultNamePosition is true) - attached.Description = NamePosition; - attached.Name = NamePosition!; - } - AttachedList ??= []; AttachedList.Add(attached); diff --git a/salesbook.Shared/Components/SingleElements/Modal/AddAttached.razor b/salesbook.Shared/Components/SingleElements/Modal/AddAttached.razor index 2427b3d..0c3f55c 100644 --- a/salesbook.Shared/Components/SingleElements/Modal/AddAttached.razor +++ b/salesbook.Shared/Components/SingleElements/Modal/AddAttached.razor @@ -8,23 +8,54 @@ -
- - - - - @if (CanAddPosition) + @if (RequireNewName) + { + + } + else + { + @if (!SelectTypePicture) { - +
+ + + + + @if (CanAddPosition) + { + + } +
} -
+ else + { +
+ + + +
+ } + }
+ + @if (RequireNewName) + { + + Salva + + } + @@ -40,36 +71,47 @@ private AttachedDTO? Attached { get; set; } + private bool RequireNewName { get; set; } private bool SelectTypePicture { get; set; } + private string? _newName; + private string? NewName + { + get => _newName; + set + { + _newName = value; + StateHasChanged(); + } + } + protected override async Task OnInitializedAsync() { + SelectTypePicture = false; + RequireNewName = false; Snackbar.Configuration.PositionClass = Defaults.Classes.Position.TopCenter; - - _ = LoadData(); - } - - private async Task LoadData() - { - } - - private async Task Save() - { - VisibleOverlay = true; - StateHasChanged(); - - SuccessAnimation = true; - StateHasChanged(); - - await Task.Delay(1250); - - MudDialog.Close(); } private async Task OnImage() { - Attached = await AttachedService.SelectImage(); - MudDialog.Close(Attached); + SelectTypePicture = true; + StateHasChanged(); + } + + private async Task OnCamera() + { + Attached = await AttachedService.SelectImageFromCamera(); + + RequireNewName = true; + StateHasChanged(); + } + + private async Task OnGallery() + { + Attached = await AttachedService.SelectImageFromGallery(); + + RequireNewName = true; + StateHasChanged(); } private async Task OnFile() @@ -81,6 +123,37 @@ private async Task OnPosition() { Attached = await AttachedService.SelectPosition(); + + RequireNewName = true; + StateHasChanged(); + } + + private void OnNewName() + { + switch (Attached.Type) + { + case AttachedDTO.TypeAttached.Position: + { + CanAddPosition = false; + + Attached.Description = NewName!; + Attached.Name = NewName!; + + break; + } + case AttachedDTO.TypeAttached.Image: + { + var extension = Path.GetExtension(Attached.Name); + Attached.Name = NewName! + extension; + + break; + } + case AttachedDTO.TypeAttached.Document: + break; + default: + throw new ArgumentOutOfRangeException(); + } + MudDialog.Close(Attached); } diff --git a/salesbook.Shared/Core/Helpers/ModalHelpers.cs b/salesbook.Shared/Core/Helpers/ModalHelpers.cs index da4bad7..74da67e 100644 --- a/salesbook.Shared/Core/Helpers/ModalHelpers.cs +++ b/salesbook.Shared/Core/Helpers/ModalHelpers.cs @@ -80,7 +80,8 @@ public class ModalHelpers { FullScreen = false, CloseButton = false, - NoHeader = true + NoHeader = true, + BackdropClick = false } ); diff --git a/salesbook.Shared/Core/Interface/IAttachedService.cs b/salesbook.Shared/Core/Interface/IAttachedService.cs index a038c49..bc267bc 100644 --- a/salesbook.Shared/Core/Interface/IAttachedService.cs +++ b/salesbook.Shared/Core/Interface/IAttachedService.cs @@ -4,7 +4,8 @@ namespace salesbook.Shared.Core.Interface; public interface IAttachedService { - Task SelectImage(); + Task SelectImageFromCamera(); + Task SelectImageFromGallery(); Task SelectFile(); Task SelectPosition(); Task OpenFile(Stream file, string fileName);