Files
Wino-Mail/Wino.Core/Requests/Calendar/CreateCalendarEventRequest.cs
T

64 lines
2.5 KiB
C#
Raw Normal View History

2025-12-30 11:59:54 +01:00
using System;
using CommunityToolkit.Mvvm.Messaging;
using Wino.Core.Domain.Entities.Calendar;
using Wino.Core.Domain.Enums;
2026-03-07 17:13:48 +01:00
using Wino.Core.Domain.Models.Calendar;
2025-12-30 11:59:54 +01:00
using Wino.Core.Domain.Models.Requests;
2026-03-07 17:13:48 +01:00
using Wino.Core.Helpers;
2025-12-30 11:59:54 +01:00
using Wino.Messaging.Client.Calendar;
namespace Wino.Core.Requests.Calendar;
/// <summary>
/// Request to create a new calendar event on the server.
2026-03-07 17:13:48 +01:00
/// Non-recurring events create an optimistic in-memory item for immediate UI feedback.
/// Recurring events skip optimistic rendering and rely on provider synchronization to materialize instances.
2025-12-30 11:59:54 +01:00
/// </summary>
2026-03-07 17:13:48 +01:00
public record CreateCalendarEventRequest : CalendarRequestBase
2025-12-30 11:59:54 +01:00
{
2026-03-07 17:13:48 +01:00
public CalendarEventComposeResult ComposeResult { get; }
public AccountCalendar AssignedCalendar { get; }
public PreparedCalendarEventCreateModel PreparedEvent { get; }
public CalendarItem PreparedItem => PreparedEvent.CalendarItem;
public bool IsRecurring => !string.IsNullOrWhiteSpace(ComposeResult?.Recurrence);
public CreateCalendarEventRequest(CalendarEventComposeResult composeResult, AccountCalendar assignedCalendar)
: this(composeResult, assignedCalendar, CalendarEventComposeMapper.Prepare(composeResult, assignedCalendar))
{
}
private CreateCalendarEventRequest(
CalendarEventComposeResult composeResult,
AccountCalendar assignedCalendar,
PreparedCalendarEventCreateModel preparedEvent)
: base(ShouldCreateOptimisticItem(composeResult) ? preparedEvent.CalendarItem : null)
{
ComposeResult = composeResult ?? throw new ArgumentNullException(nameof(composeResult));
AssignedCalendar = assignedCalendar ?? throw new ArgumentNullException(nameof(assignedCalendar));
PreparedEvent = preparedEvent ?? throw new ArgumentNullException(nameof(preparedEvent));
}
2025-12-30 11:59:54 +01:00
public override CalendarSynchronizerOperation Operation => CalendarSynchronizerOperation.CreateEvent;
2026-03-07 17:13:48 +01:00
public override int ResynchronizationDelay => 5000;
2025-12-30 11:59:54 +01:00
public override void ApplyUIChanges()
{
2026-03-07 17:13:48 +01:00
if (Item == null)
return;
WeakReferenceMessenger.Default.Send(new CalendarItemAdded(Item, EntityUpdateSource.ClientUpdated));
2025-12-30 11:59:54 +01:00
}
public override void RevertUIChanges()
{
2026-03-07 17:13:48 +01:00
if (Item == null)
return;
WeakReferenceMessenger.Default.Send(new CalendarItemDeleted(Item, EntityUpdateSource.ClientReverted));
2025-12-30 11:59:54 +01:00
}
2026-03-07 17:13:48 +01:00
private static bool ShouldCreateOptimisticItem(CalendarEventComposeResult composeResult)
=> string.IsNullOrWhiteSpace(composeResult?.Recurrence);
2025-12-30 11:59:54 +01:00
}