Contacts management.
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.UI.Xaml;
|
||||
using Microsoft.UI.Xaml.Controls;
|
||||
using Microsoft.UI.Xaml.Media.Imaging;
|
||||
using Wino.Core.Domain;
|
||||
using Wino.Core.Domain.Entities.Shared;
|
||||
using Wino.Core.Domain.Interfaces;
|
||||
using Wino.Mail.WinUI;
|
||||
|
||||
namespace Wino.Dialogs;
|
||||
|
||||
@@ -13,6 +15,7 @@ public sealed partial class ContactEditDialog : ContentDialog
|
||||
{
|
||||
private AccountContact _contact;
|
||||
private IDialogServiceBase? _dialogService;
|
||||
private IContactPictureFileService? _contactPictureFileService;
|
||||
private bool _isEditMode;
|
||||
|
||||
public AccountContact Contact => _contact;
|
||||
@@ -23,6 +26,7 @@ public sealed partial class ContactEditDialog : ContentDialog
|
||||
|
||||
_contact = contact ?? new AccountContact();
|
||||
_dialogService = dialogService;
|
||||
_contactPictureFileService = App.Current.Services.GetService<IContactPictureFileService>();
|
||||
_isEditMode = contact != null && !string.IsNullOrEmpty(contact.Address);
|
||||
|
||||
Title = _isEditMode ? Translator.ContactEditDialog_Title : Translator.ContactEditDialog_AddTitle;
|
||||
@@ -47,10 +51,19 @@ public sealed partial class ContactEditDialog : ContentDialog
|
||||
if (_contact.IsOverridden)
|
||||
OverriddenContactInfoBorder.Visibility = Visibility.Visible;
|
||||
|
||||
// Load existing photo.
|
||||
if (!string.IsNullOrEmpty(_contact.Base64ContactPicture))
|
||||
// Load existing photo — prefer file-based picture, fall back to legacy base64.
|
||||
if (_contact.ContactPictureFileId.HasValue && _contactPictureFileService != null)
|
||||
{
|
||||
LoadContactPhoto(_contact.Base64ContactPicture);
|
||||
var filePath = _contactPictureFileService.GetContactPicturePath(_contact.ContactPictureFileId.Value);
|
||||
if (!string.IsNullOrEmpty(filePath))
|
||||
{
|
||||
LoadContactPhotoFromFile(filePath);
|
||||
RemovePhotoButton.Visibility = Visibility.Visible;
|
||||
}
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(_contact.Base64ContactPicture))
|
||||
{
|
||||
LoadContactPhotoFromBase64(_contact.Base64ContactPicture);
|
||||
RemovePhotoButton.Visibility = Visibility.Visible;
|
||||
}
|
||||
else
|
||||
@@ -72,9 +85,27 @@ public sealed partial class ContactEditDialog : ContentDialog
|
||||
if (files?.Count > 0)
|
||||
{
|
||||
var file = files[0];
|
||||
var base64 = Convert.ToBase64String(file.Data);
|
||||
_contact.Base64ContactPicture = base64;
|
||||
LoadContactPhoto(base64);
|
||||
|
||||
if (_contactPictureFileService != null)
|
||||
{
|
||||
// Delete existing file if replacing.
|
||||
if (_contact.ContactPictureFileId.HasValue)
|
||||
await _contactPictureFileService.DeleteContactPictureAsync(_contact.ContactPictureFileId.Value);
|
||||
|
||||
var fileId = await _contactPictureFileService.SaveContactPictureAsync(file.Data);
|
||||
_contact.ContactPictureFileId = fileId;
|
||||
|
||||
var filePath = _contactPictureFileService.GetContactPicturePath(fileId);
|
||||
if (!string.IsNullOrEmpty(filePath))
|
||||
LoadContactPhotoFromFile(filePath);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Fallback to legacy base64 when service is unavailable (e.g. design-time).
|
||||
_contact.Base64ContactPicture = Convert.ToBase64String(file.Data);
|
||||
LoadContactPhotoFromBase64(_contact.Base64ContactPicture);
|
||||
}
|
||||
|
||||
RemovePhotoButton.Visibility = Visibility.Visible;
|
||||
}
|
||||
}
|
||||
@@ -86,13 +117,33 @@ public sealed partial class ContactEditDialog : ContentDialog
|
||||
|
||||
private void RemovePhotoClicked(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (_contact.ContactPictureFileId.HasValue && _contactPictureFileService != null)
|
||||
_ = _contactPictureFileService.DeleteContactPictureAsync(_contact.ContactPictureFileId.Value);
|
||||
|
||||
_contact.ContactPictureFileId = null;
|
||||
_contact.Base64ContactPicture = null;
|
||||
ContactPhotoPersonPicture.ProfilePicture = null;
|
||||
ContactPhotoPersonPicture.DisplayName = ContactNameTextBox.Text;
|
||||
RemovePhotoButton.Visibility = Visibility.Collapsed;
|
||||
}
|
||||
|
||||
private void LoadContactPhoto(string base64String)
|
||||
private void LoadContactPhotoFromFile(string filePath)
|
||||
{
|
||||
try
|
||||
{
|
||||
var bytes = File.ReadAllBytes(filePath);
|
||||
using var stream = new MemoryStream(bytes);
|
||||
var bitmap = new BitmapImage();
|
||||
bitmap.SetSource(stream.AsRandomAccessStream());
|
||||
ContactPhotoPersonPicture.ProfilePicture = bitmap;
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Failed to load image, ignore.
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadContactPhotoFromBase64(string base64String)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user