Reacting calendar changes

This commit is contained in:
Burak Kaan Köse
2026-01-20 00:30:24 +01:00
parent 319b0af305
commit 31097e42a9
3 changed files with 112 additions and 4 deletions
@@ -86,9 +86,11 @@ public partial class CalendarAppShellViewModel : CalendarBaseViewModel,
StatePersistenceService.StatePropertyChanged += PrefefencesChanged; StatePersistenceService.StatePropertyChanged += PrefefencesChanged;
} }
private void SelectedCalendarItemsChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) protected override void OnDispatcherAssigned()
{ {
throw new NotImplementedException(); base.OnDispatcherAssigned();
AccountCalendarStateService.Dispatcher = Dispatcher;
} }
private void PrefefencesChanged(object sender, string e) private void PrefefencesChanged(object sender, string e)
@@ -5,11 +5,13 @@ using System.ComponentModel;
using CommunityToolkit.Mvvm.Collections; using CommunityToolkit.Mvvm.Collections;
using Wino.Calendar.ViewModels.Data; using Wino.Calendar.ViewModels.Data;
using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Entities.Shared;
using Wino.Core.Domain.Interfaces;
namespace Wino.Calendar.ViewModels.Interfaces; namespace Wino.Calendar.ViewModels.Interfaces;
public interface IAccountCalendarStateService : INotifyPropertyChanged public interface IAccountCalendarStateService : INotifyPropertyChanged
{ {
IDispatcher Dispatcher { get; set; }
ReadOnlyObservableCollection<GroupedAccountCalendarViewModel> GroupedAccountCalendars { get; } ReadOnlyObservableCollection<GroupedAccountCalendarViewModel> GroupedAccountCalendars { get; }
event EventHandler<GroupedAccountCalendarViewModel> CollectiveAccountGroupSelectionStateChanged; event EventHandler<GroupedAccountCalendarViewModel> CollectiveAccountGroupSelectionStateChanged;
@@ -4,9 +4,12 @@ using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using CommunityToolkit.Mvvm.Collections; using CommunityToolkit.Mvvm.Collections;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Messaging;
using Wino.Calendar.ViewModels.Data; using Wino.Calendar.ViewModels.Data;
using Wino.Calendar.ViewModels.Interfaces; using Wino.Calendar.ViewModels.Interfaces;
using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Entities.Shared;
using Wino.Core.Domain.Interfaces;
using Wino.Messaging.Client.Calendar;
namespace Wino.Mail.WinUI.Services; namespace Wino.Mail.WinUI.Services;
@@ -14,8 +17,14 @@ namespace Wino.Mail.WinUI.Services;
/// Encapsulated state manager for collectively managing the state of account calendars. /// Encapsulated state manager for collectively managing the state of account calendars.
/// Callers must react to the events to update their state only from this service. /// Callers must react to the events to update their state only from this service.
/// </summary> /// </summary>
public partial class AccountCalendarStateService : ObservableObject, IAccountCalendarStateService public partial class AccountCalendarStateService : ObservableRecipient,
IAccountCalendarStateService,
IRecipient<CalendarListAdded>,
IRecipient<CalendarListUpdated>,
IRecipient<CalendarListDeleted>
{ {
public IDispatcher? Dispatcher { get; set; }
public event EventHandler<GroupedAccountCalendarViewModel>? CollectiveAccountGroupSelectionStateChanged; public event EventHandler<GroupedAccountCalendarViewModel>? CollectiveAccountGroupSelectionStateChanged;
public event EventHandler<AccountCalendarViewModel>? AccountCalendarSelectionStateChanged; public event EventHandler<AccountCalendarViewModel>? AccountCalendarSelectionStateChanged;
@@ -47,13 +56,21 @@ public partial class AccountCalendarStateService : ObservableObject, IAccountCal
} }
} }
public AccountCalendarStateService() private readonly IAccountService _accountService;
public AccountCalendarStateService(IAccountService accountService)
{ {
_accountService = accountService;
_internalGroupedAccountCalendars = new ObservableCollection<GroupedAccountCalendarViewModel>(); _internalGroupedAccountCalendars = new ObservableCollection<GroupedAccountCalendarViewModel>();
GroupedAccountCalendars = new ReadOnlyObservableCollection<GroupedAccountCalendarViewModel>(_internalGroupedAccountCalendars); GroupedAccountCalendars = new ReadOnlyObservableCollection<GroupedAccountCalendarViewModel>(_internalGroupedAccountCalendars);
_internalGroupedCalendars = new ObservableGroupedCollection<MailAccount, AccountCalendarViewModel>(); _internalGroupedCalendars = new ObservableGroupedCollection<MailAccount, AccountCalendarViewModel>();
GroupedCalendars = new ReadOnlyObservableGroupedCollection<MailAccount, AccountCalendarViewModel>(_internalGroupedCalendars); GroupedCalendars = new ReadOnlyObservableGroupedCollection<MailAccount, AccountCalendarViewModel>(_internalGroupedCalendars);
Messenger.Register<CalendarListAdded>(this);
Messenger.Register<CalendarListUpdated>(this);
Messenger.Register<CalendarListDeleted>(this);
} }
private void SingleGroupCalendarCollectiveStateChanged(object? sender, EventArgs e) private void SingleGroupCalendarCollectiveStateChanged(object? sender, EventArgs e)
@@ -169,4 +186,91 @@ public partial class AccountCalendarStateService : ObservableObject, IAccountCal
RemoveGroupedAccountCalendar(group); RemoveGroupedAccountCalendar(group);
} }
} }
public async void Receive(CalendarListAdded message)
{
var accountCalendar = message.AccountCalendar;
var mailAccount = await _accountService.GetAccountAsync(accountCalendar.AccountId);
if (mailAccount == null) return;
var accountCalendarViewModel = new AccountCalendarViewModel(mailAccount, accountCalendar);
if (Dispatcher != null)
{
await Dispatcher.ExecuteOnUIThread(() => AddAccountCalendar(accountCalendarViewModel));
}
else
{
AddAccountCalendar(accountCalendarViewModel);
}
}
public async void Receive(CalendarListUpdated message)
{
var accountCalendar = message.AccountCalendar;
if (Dispatcher != null)
{
await Dispatcher.ExecuteOnUIThread(() =>
{
// Find the existing calendar view model
var existingCalendar = AllCalendars.FirstOrDefault(c => c.Id == accountCalendar.Id);
if (existingCalendar != null)
{
// Update properties
existingCalendar.Name = accountCalendar.Name;
existingCalendar.TextColorHex = accountCalendar.TextColorHex;
existingCalendar.BackgroundColorHex = accountCalendar.BackgroundColorHex;
existingCalendar.IsExtended = accountCalendar.IsExtended;
existingCalendar.IsPrimary = accountCalendar.IsPrimary;
}
});
}
else
{
// Find the existing calendar view model
var existingCalendar = AllCalendars.FirstOrDefault(c => c.Id == accountCalendar.Id);
if (existingCalendar != null)
{
// Update properties
existingCalendar.Name = accountCalendar.Name;
existingCalendar.TextColorHex = accountCalendar.TextColorHex;
existingCalendar.BackgroundColorHex = accountCalendar.BackgroundColorHex;
existingCalendar.IsExtended = accountCalendar.IsExtended;
existingCalendar.IsPrimary = accountCalendar.IsPrimary;
}
}
}
public async void Receive(CalendarListDeleted message)
{
var accountCalendar = message.AccountCalendar;
if (Dispatcher != null)
{
await Dispatcher.ExecuteOnUIThread(() =>
{
// Find and remove the calendar view model
var existingCalendar = AllCalendars.FirstOrDefault(c => c.Id == accountCalendar.Id);
if (existingCalendar != null)
{
RemoveAccountCalendar(existingCalendar);
}
});
}
else
{
// Find and remove the calendar view model
var existingCalendar = AllCalendars.FirstOrDefault(c => c.Id == accountCalendar.Id);
if (existingCalendar != null)
{
RemoveAccountCalendar(existingCalendar);
}
}
}
} }