Contacts management.

This commit is contained in:
Burak Kaan Köse
2026-03-01 21:07:10 +01:00
parent bdd32786d6
commit e816e87f61
19 changed files with 855 additions and 32 deletions
@@ -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
{