Contacts management.
This commit is contained in:
@@ -31,6 +31,7 @@ public partial class EventDetailsPageViewModel : CalendarBaseViewModel
|
||||
private readonly IWinoRequestDelegator _winoRequestDelegator;
|
||||
private readonly INavigationService _navigationService;
|
||||
private readonly IUnderlyingThemeService _underlyingThemeService;
|
||||
private readonly IContactService _contactService;
|
||||
|
||||
public CalendarSettings CurrentSettings { get; }
|
||||
public INativeAppService NativeAppService => _nativeAppService;
|
||||
@@ -143,7 +144,8 @@ public partial class EventDetailsPageViewModel : CalendarBaseViewModel
|
||||
IMailDialogService dialogService,
|
||||
IWinoRequestDelegator winoRequestDelegator,
|
||||
INavigationService navigationService,
|
||||
IUnderlyingThemeService underlyingThemeService)
|
||||
IUnderlyingThemeService underlyingThemeService,
|
||||
IContactService contactService)
|
||||
{
|
||||
_calendarService = calendarService;
|
||||
_nativeAppService = nativeAppService;
|
||||
@@ -152,6 +154,7 @@ public partial class EventDetailsPageViewModel : CalendarBaseViewModel
|
||||
_winoRequestDelegator = winoRequestDelegator;
|
||||
_navigationService = navigationService;
|
||||
_underlyingThemeService = underlyingThemeService;
|
||||
_contactService = contactService;
|
||||
|
||||
CurrentSettings = _preferencesService.GetCurrentCalendarSettings();
|
||||
IsDarkWebviewRenderer = _underlyingThemeService.IsUnderlyingThemeDark();
|
||||
@@ -260,6 +263,24 @@ public partial class EventDetailsPageViewModel : CalendarBaseViewModel
|
||||
|
||||
var attendees = await _calendarService.GetAttendeesAsync(calendarItemId);
|
||||
|
||||
// Resolve contacts for all attendees in a single batch DB query.
|
||||
var emails = attendees
|
||||
.Where(a => !string.IsNullOrEmpty(a.Email))
|
||||
.Select(a => a.Email)
|
||||
.ToList();
|
||||
|
||||
if (!string.IsNullOrEmpty(calendarItem.OrganizerEmail))
|
||||
emails.Add(calendarItem.OrganizerEmail);
|
||||
|
||||
var contacts = await _contactService.GetContactsByAddressesAsync(emails).ConfigureAwait(false);
|
||||
var contactLookup = contacts.ToDictionary(c => c.Address, StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
foreach (var attendee in attendees)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(attendee.Email) && contactLookup.TryGetValue(attendee.Email, out var contact))
|
||||
attendee.ResolvedContact = contact;
|
||||
}
|
||||
|
||||
// Separate organizer from other attendees to ensure organizer is always first
|
||||
var organizer = attendees.FirstOrDefault(a => a.IsOrganizer);
|
||||
var nonOrganizerAttendees = attendees.Where(a => !a.IsOrganizer).ToList();
|
||||
@@ -281,6 +302,10 @@ public partial class EventDetailsPageViewModel : CalendarBaseViewModel
|
||||
IsOrganizer = true,
|
||||
AttendenceStatus = AttendeeStatus.Accepted
|
||||
};
|
||||
|
||||
if (contactLookup.TryGetValue(calendarItem.OrganizerEmail, out var organizerContact))
|
||||
organizerAttendee.ResolvedContact = organizerContact;
|
||||
|
||||
CurrentEvent.Attendees.Add(organizerAttendee);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user