Fixing some messaging issues with calendar add/delete.

This commit is contained in:
Burak Kaan Köse
2026-02-20 10:03:16 +01:00
parent 317113a1b3
commit a912ada890
2 changed files with 73 additions and 14 deletions
@@ -8,6 +8,7 @@ using CommunityToolkit.Diagnostics;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging;
using Itenso.TimePeriod;
using MoreLinq; using MoreLinq;
using Serilog; using Serilog;
using Wino.Calendar.ViewModels.Data; using Wino.Calendar.ViewModels.Data;
@@ -1001,8 +1002,11 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
Debug.WriteLine($"Calendar item deleted: {calendarItem.Id}"); Debug.WriteLine($"Calendar item deleted: {calendarItem.Id}");
// Check if the deleted item is currently displayed in details view // Check if the deleted item (or its series master) is currently displayed in details view.
if (DisplayDetailsCalendarItemViewModel?.Id == calendarItem.Id) var isDeletedDetailsItem = DisplayDetailsCalendarItemViewModel?.Id == calendarItem.Id;
var isDeletedSeriesMasterOfDetailsItem = DisplayDetailsCalendarItemViewModel?.CalendarItem?.RecurringCalendarItemId == calendarItem.Id;
if (isDeletedDetailsItem || isDeletedSeriesMasterOfDetailsItem)
{ {
// Clear the details view since this item was deleted // Clear the details view since this item was deleted
DisplayDetailsCalendarItemViewModel = null; DisplayDetailsCalendarItemViewModel = null;
@@ -1015,11 +1019,9 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
{ {
foreach (var calendarDay in dayRange.CalendarDays) foreach (var calendarDay in dayRange.CalendarDays)
{ {
var existingItem = calendarDay.EventsCollection.GetCalendarItem(calendarItem.Id); calendarDay.EventsCollection.RemoveCalendarItems(item =>
if (existingItem != null) item.Id == calendarItem.Id ||
{ (item is CalendarItemViewModel vm && vm.CalendarItem.RecurringCalendarItemId == calendarItem.Id));
calendarDay.EventsCollection.RemoveCalendarItem(existingItem);
}
} }
} }
}); });
@@ -1119,9 +1121,11 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
// Series master events should not be visible on the UI. // Series master events should not be visible on the UI.
// Their instances are already expanded and synced individually. // Their instances are already expanded and synced individually.
// For revert scenarios, restore visible child instances from local storage.
if (calendarItem.IsRecurringParent) if (calendarItem.IsRecurringParent)
{ {
Debug.WriteLine($"Skipping series master event: {calendarItem.Title}"); Debug.WriteLine($"Skipping series master event: {calendarItem.Title}");
await RestoreVisibleRecurringSeriesInstancesAsync(calendarItem);
return; return;
} }
@@ -1167,4 +1171,45 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
FilterActiveCalendars(DayRanges); FilterActiveCalendars(DayRanges);
} }
private async Task RestoreVisibleRecurringSeriesInstancesAsync(CalendarItem recurringParent)
{
if (DayRanges.DisplayRange == null || recurringParent?.AssignedCalendar == null)
return;
var visibleRange = new TimeRange(DayRanges.DisplayRange.StartDate, DayRanges.DisplayRange.EndDate);
var visibleItems = await _calendarService.GetCalendarEventsAsync(recurringParent.AssignedCalendar, visibleRange).ConfigureAwait(false);
var recurringChildren = visibleItems
.Where(item => item.RecurringCalendarItemId == recurringParent.Id && !item.IsHidden && !item.IsRecurringParent)
.ToList();
if (!recurringChildren.Any())
return;
await ExecuteUIThread(() =>
{
foreach (var child in recurringChildren)
{
child.AssignedCalendar ??= recurringParent.AssignedCalendar;
var targetDays = DayRanges
.SelectMany(a => a.CalendarDays)
.Where(day => day.Period.OverlapsWith(child.Period));
foreach (var day in targetDays)
{
if (day.EventsCollection.GetCalendarItem(child.Id) != null)
continue;
day.EventsCollection.AddCalendarItem(new CalendarItemViewModel(child)
{
IsBusy = string.IsNullOrEmpty(child.RemoteEventId)
});
}
}
});
FilterActiveCalendars(DayRanges);
}
} }
+21 -7
View File
@@ -370,29 +370,43 @@ public abstract class WinoSynchronizer<TBaseRequest, TMessageType, TCalendarEven
switch (calendarSynchronizerOperation) switch (calendarSynchronizerOperation)
{ {
case CalendarSynchronizerOperation.CreateEvent: case CalendarSynchronizerOperation.CreateEvent:
nativeRequests.AddRange(CreateCalendarEvent(group.ElementAt(0) as CreateCalendarEventRequest)); nativeRequests.AddRange(group
.OfType<CreateCalendarEventRequest>()
.SelectMany(CreateCalendarEvent));
break; break;
case CalendarSynchronizerOperation.AcceptEvent: case CalendarSynchronizerOperation.AcceptEvent:
nativeRequests.AddRange(AcceptEvent(group.ElementAt(0) as AcceptEventRequest)); nativeRequests.AddRange(group
.OfType<AcceptEventRequest>()
.SelectMany(AcceptEvent));
break; break;
case CalendarSynchronizerOperation.DeclineEvent: case CalendarSynchronizerOperation.DeclineEvent:
if (Account.ProviderType == MailProviderType.Outlook) if (Account.ProviderType == MailProviderType.Outlook)
{ {
nativeRequests.AddRange(OutlookDeclineEvent(group.ElementAt(0) as OutlookDeclineEventRequest)); nativeRequests.AddRange(group
.OfType<OutlookDeclineEventRequest>()
.SelectMany(OutlookDeclineEvent));
} }
else else
{ {
nativeRequests.AddRange(DeclineEvent(group.ElementAt(0) as DeclineEventRequest)); nativeRequests.AddRange(group
.OfType<DeclineEventRequest>()
.SelectMany(DeclineEvent));
} }
break; break;
case CalendarSynchronizerOperation.TentativeEvent: case CalendarSynchronizerOperation.TentativeEvent:
nativeRequests.AddRange(TentativeEvent(group.ElementAt(0) as TentativeEventRequest)); nativeRequests.AddRange(group
.OfType<TentativeEventRequest>()
.SelectMany(TentativeEvent));
break; break;
case CalendarSynchronizerOperation.UpdateEvent: case CalendarSynchronizerOperation.UpdateEvent:
nativeRequests.AddRange(UpdateCalendarEvent(group.ElementAt(0) as UpdateCalendarEventRequest)); nativeRequests.AddRange(group
.OfType<UpdateCalendarEventRequest>()
.SelectMany(UpdateCalendarEvent));
break; break;
case CalendarSynchronizerOperation.DeleteEvent: case CalendarSynchronizerOperation.DeleteEvent:
nativeRequests.AddRange(DeleteCalendarEvent(group.ElementAt(0) as DeleteCalendarEventRequest)); nativeRequests.AddRange(group
.OfType<DeleteCalendarEventRequest>()
.SelectMany(DeleteCalendarEvent));
break; break;
default: default:
break; break;