Merged feature/vNext. Initial commit for Wino Mail 2.0

This commit is contained in:
Burak Kaan Köse
2026-04-05 16:30:26 +02:00
1513 changed files with 93788 additions and 26896 deletions
@@ -1,5 +1,5 @@
using System;
using Wino.Core.Domain.Models.MailItem;
using Wino.Core.Domain.Entities.Mail;
namespace Wino.Messaging.Client.Accounts;
@@ -10,4 +10,4 @@ namespace Wino.Messaging.Client.Accounts;
/// <param name="AutoSelectAccount">Account to extend menu item for.</param>
/// <param name="FolderId">Folder to select after expansion.</param>
/// <param name="NavigateMailItem">Mail item to select if possible in the expanded folder.</param>
public record AccountMenuItemExtended(Guid FolderId, IMailItem NavigateMailItem);
public record AccountMenuItemExtended(Guid FolderId, MailCopy NavigateMailItem);
@@ -0,0 +1,6 @@
namespace Wino.Messaging.Client.Calendar;
/// <summary>
/// Message to trigger rendering of calendar event description in WebView2.
/// </summary>
public record CalendarDescriptionRenderingRequested();
@@ -1,7 +1,8 @@
using Wino.Core.Domain.Entities.Calendar;
using Wino.Core.Domain.Entities.Calendar;
using Wino.Core.Domain.Enums;
namespace Wino.Messaging.Client.Calendar;
public record CalendarItemAdded(CalendarItem CalendarItem);
public record CalendarItemUpdated(CalendarItem CalendarItem);
public record CalendarItemUpdated(CalendarItem CalendarItem, CalendarItemUpdateSource Source);
public record CalendarItemDeleted(CalendarItem CalendarItem);
@@ -1,6 +0,0 @@
namespace Wino.Messaging.Client.Calendar;
/// <summary>
/// When event details page is activated or deactivated.
/// </summary>
public record DetailsPageStateChangedMessage(bool IsActivated);
@@ -1,6 +0,0 @@
namespace Wino.Messaging.Client.Calendar;
/// <summary>
/// Raised when user clicks '>' button from the shell.
/// </summary>
public record GoNextDateRequestedMessage;
@@ -1,6 +0,0 @@
namespace Wino.Messaging.Client.Calendar;
/// <summary>
/// Raised when user clicks '<' button from the shell.
/// </summary>
public record GoPreviousDateRequestedMessage;
@@ -1,13 +1,10 @@
using System;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.Calendar;
namespace Wino.Messaging.Client.Calendar;
/// <summary>
/// Raised when a new calendar range is requested for drawing.
/// Raised when a new calendar display range is requested.
/// </summary>
/// <param name="DisplayType">Type of the calendar.</param>
/// <param name="DisplayDate">Exact date to highlight.</param>
/// <param name="DayDisplayCount">How many days to load with Day calendar display type.</param>
/// <param name="ForceRedraw">Remove all days and force re-render of everything. Used when settings are updated.</param>
public record LoadCalendarMessage(DateTime DisplayDate, CalendarInitInitiative CalendarInitInitiative, bool ForceRedraw = false);
/// <param name="DisplayRequest">Display type and anchor date to resolve.</param>
/// <param name="ForceReload">Force a reload even if the resolved range did not change.</param>
public record LoadCalendarMessage(CalendarDisplayRequest DisplayRequest, bool ForceReload = false);
@@ -1,9 +0,0 @@
using System;
namespace Wino.Messaging.Client.Calendar;
/// <summary>
/// Raised when requested date is already loaded into calendar flip view to scroll to it.
/// </summary>
/// <param name="Date">Date to scroll.</param>
public record ScrollToDateMessage(DateTime Date);
@@ -1,9 +0,0 @@
using System;
namespace Wino.Messaging.Client.Calendar;
/// <summary>
/// Emitted when vertical scroll position is requested to be changed.
/// </summary>
/// <param name="TimeSpan">Hour to scroll vertically on flip view item.</param>
public record ScrollToHourMessage(TimeSpan TimeSpan);
@@ -1,10 +0,0 @@
using Wino.Core.Domain.Models.Calendar;
namespace Wino.Messaging.Client.Calendar;
/// <summary>
/// Raised when calendar's visible date range is updated.
/// Used to update the background of the visible date range in CalendarView.
/// </summary>
/// <param name="DateRange">New visible date range.</param>
public record VisibleDateRangeChangedMessage(DateRange DateRange);
@@ -0,0 +1,3 @@
namespace Wino.Messaging.Client.Contacts;
public record NewContactRequested;
@@ -1,11 +0,0 @@
using System;
namespace Wino.Messaging.Client.Mails;
/// <summary>
/// When IMAP setup dialog requestes back breadcrumb navigation.
/// Not providing PageType will go back to previous page by doing back navigation.
/// </summary>
/// <param name="PageType">Type to go back.</param>
/// <param name="Parameter">Back parameters.</param>
public record ImapSetupBackNavigationRequested(Type PageType = null, object Parameter = null);
@@ -1,9 +0,0 @@
using Wino.Core.Domain.Entities.Shared;
namespace Wino.Messaging.Client.Mails;
/// <summary>
/// When user asked to dismiss IMAP setup dialog.
/// </summary>
/// <param name="CompletedServerInformation"> Validated server information that is ready to be saved to database. </param>
public record ImapSetupDismissRequested(CustomServerInformation CompletedServerInformation = null);
@@ -1,10 +0,0 @@
using System;
namespace Wino.Messaging.Client.Mails;
/// <summary>
/// When IMAP setup dialog breadcrumb navigation requested.
/// </summary>
/// <param name="PageType">Page type to navigate.</param>
/// <param name="Parameter">Navigation parameters.</param>
public record ImapSetupNavigationRequested(Type PageType, object Parameter);
@@ -0,0 +1,7 @@
namespace Wino.Messaging.Client.Mails;
/// <summary>
/// Selection of items are handled in the view model collection.
/// This message notifies interested parties that the selection has changed.
/// </summary>
public record SelectedItemsChangedMessage;
@@ -0,0 +1,5 @@
using Wino.Core.Domain.Enums;
namespace Wino.Messaging.Client.Navigation;
public sealed record ActiveSettingsPageChanged(WinoPage RootPage);
@@ -1,6 +1,9 @@
namespace Wino.Messaging.Client.Navigation;
using Wino.Core.Domain.Enums;
namespace Wino.Messaging.Client.Navigation;
/// <summary>
/// When back navigation is requested for breadcrumb pages.
/// </summary>
public record BackBreadcrumNavigationRequested { }
/// <param name="SlideEffect">The slide animation effect to use during navigation.</param>
public record BackBreadcrumNavigationRequested(NavigationTransitionEffect SlideEffect = NavigationTransitionEffect.FromRight);
@@ -0,0 +1,7 @@
namespace Wino.Messaging.Client.Navigation;
/// <summary>
/// User clicked "Get Started" on the welcome page.
/// App should close the welcome window and open the shell window.
/// </summary>
public record GetStartedFromWelcomeRequested;
@@ -1,6 +0,0 @@
namespace Wino.Messaging.Client.Navigation;
/// <summary>
/// Navigates to manage accounts page.
/// </summary>
public record NavigateManageAccountsRequested;
@@ -0,0 +1,5 @@
using Wino.Core.Domain.Enums;
namespace Wino.Messaging.Client.Navigation;
public sealed record SettingsRootNavigationRequested(WinoPage PageType);
@@ -1,6 +1,6 @@
using System;
using Wino.Core.Domain.Entities.Mail;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.MailItem;
namespace Wino.Messaging.Server;
@@ -10,4 +10,4 @@ namespace Wino.Messaging.Server;
/// </summary>
/// <param name="AccountId">Account id for corresponding synchronizer.</param>
/// <param name="MailCopyId">Mail copy id to download.</param>
public record DownloadMissingMessageRequested(Guid AccountId, IMailItem MailItem) : IClientMessage;
public record DownloadMissingMessageRequested(Guid AccountId, MailCopy MailItem) : IClientMessage;
@@ -1,5 +1,4 @@
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Synchronization;
namespace Wino.Messaging.Server;
@@ -8,10 +7,10 @@ namespace Wino.Messaging.Server;
/// Triggers a new mail synchronization if possible.
/// </summary>
/// <param name="Options">Options for synchronization.</param>
public record NewMailSynchronizationRequested(MailSynchronizationOptions Options, SynchronizationSource Source) : IClientMessage, IUIMessage;
public record NewMailSynchronizationRequested(MailSynchronizationOptions Options) : IClientMessage, IUIMessage;
/// <summary>
/// Triggers a new calendar synchronization if possible.
/// </summary>
/// <param name="Options">Options for synchronization.</param>
public record NewCalendarSynchronizationRequested(CalendarSynchronizationOptions Options, SynchronizationSource Source) : IClientMessage;
public record NewCalendarSynchronizationRequested(CalendarSynchronizationOptions Options) : IClientMessage, IUIMessage;
@@ -1,10 +0,0 @@
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
namespace Wino.Messaging.Server;
/// <summary>
/// App close behavior for server is changed.
/// </summary>
/// <param name="ServerBackgroundMode">New server background mode.</param>
public record ServerTerminationModeChanged(ServerBackgroundMode ServerBackgroundMode) : IClientMessage;
@@ -0,0 +1,13 @@
using System;
using Wino.Core.Domain.Enums;
namespace Wino.Messaging.UI;
/// <summary>
/// Emitted when calendar synchronization state for an account changes.
/// </summary>
public record AccountCalendarSynchronizationStateChanged(
Guid AccountId,
CalendarSynchronizationType SynchronizationType,
bool IsSynchronizationInProgress,
string SynchronizationStatus = "") : UIMessageBase<AccountCalendarSynchronizationStateChanged>;
@@ -6,6 +6,14 @@ namespace Wino.Messaging.UI;
/// <summary>
/// Emitted when synchronizer state is updated.
/// </summary>
/// <param name="synchronizer">Account Synchronizer</param>
/// <param name="newState">New state.</param>
public record AccountSynchronizerStateChanged(Guid AccountId, AccountSynchronizerState NewState) : UIMessageBase<AccountSynchronizerStateChanged>;
/// <param name="AccountId">Account id</param>
/// <param name="NewState">New synchronizer state</param>
/// <param name="TotalItemsToSync">Total items to sync (0 for indeterminate)</param>
/// <param name="RemainingItemsToSync">Remaining items to sync</param>
/// <param name="SynchronizationStatus">Current synchronization status message</param>
public record AccountSynchronizerStateChanged(
Guid AccountId,
AccountSynchronizerState NewState,
int TotalItemsToSync = 0,
int RemainingItemsToSync = 0,
string SynchronizationStatus = "") : UIMessageBase<AccountSynchronizerStateChanged>;
+5
View File
@@ -0,0 +1,5 @@
using Wino.Core.Domain.Entities.Mail;
namespace Wino.Messaging.UI;
public record FolderDeleted(MailItemFolder MailItemFolder) : UIMessageBase<FolderDeleted>;
+2 -1
View File
@@ -1,5 +1,6 @@
using Wino.Core.Domain.Entities.Mail;
using Wino.Core.Domain.Enums;
namespace Wino.Messaging.UI;
public record MailUpdatedMessage(MailCopy UpdatedMail) : UIMessageBase<MailUpdatedMessage>;
public record MailUpdatedMessage(MailCopy UpdatedMail, MailUpdateSource Source, MailCopyChangeFlags ChangedProperties = MailCopyChangeFlags.None) : UIMessageBase<MailUpdatedMessage>;
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using Wino.Core.Domain.Models.Synchronization;
namespace Wino.Messaging.UI;
/// <summary>
/// Sent when synchronization requests are queued for an account.
/// Contains grouped action descriptions for the UI to display.
/// </summary>
public record SynchronizationActionsAdded(
Guid AccountId,
string AccountName,
List<SynchronizationActionItem> Actions) : UIMessageBase<SynchronizationActionsAdded>;
@@ -0,0 +1,9 @@
using System;
namespace Wino.Messaging.UI;
/// <summary>
/// Sent when all queued synchronization requests for an account have been executed.
/// </summary>
public record SynchronizationActionsCompleted(
Guid AccountId) : UIMessageBase<SynchronizationActionsCompleted>;
@@ -0,0 +1,3 @@
namespace Wino.Messaging.UI;
public record TitleBarShellContentUpdated;
@@ -0,0 +1,3 @@
namespace Wino.Messaging.UI;
public record WelcomeImportCompletedMessage(int ImportedMailboxCount) : UIMessageBase<WelcomeImportCompletedMessage>;
@@ -0,0 +1,5 @@
using Wino.Core.Domain.Enums;
namespace Wino.Messaging.UI;
public record WinoAccountAddOnPurchasedMessage(WinoAddOnProductType ProductType) : UIMessageBase<WinoAccountAddOnPurchasedMessage>;
@@ -0,0 +1,5 @@
using Wino.Core.Domain.Entities.Shared;
namespace Wino.Messaging.UI;
public record WinoAccountProfileDeletedMessage(WinoAccount Account) : UIMessageBase<WinoAccountProfileDeletedMessage>;
@@ -0,0 +1,5 @@
using Wino.Core.Domain.Entities.Shared;
namespace Wino.Messaging.UI;
public record WinoAccountProfileUpdatedMessage(WinoAccount Account) : UIMessageBase<WinoAccountProfileUpdatedMessage>;
@@ -0,0 +1,5 @@
using Wino.Core.Domain.Entities.Shared;
namespace Wino.Messaging.UI;
public record WinoAccountSignedInMessage(WinoAccount Account) : UIMessageBase<WinoAccountSignedInMessage>;
@@ -0,0 +1,5 @@
using Wino.Core.Domain.Entities.Shared;
namespace Wino.Messaging.UI;
public record WinoAccountSignedOutMessage(WinoAccount Account) : UIMessageBase<WinoAccountSignedOutMessage>;
+4 -4
View File
@@ -1,17 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<Platforms>x86;x64;arm64</Platforms>
<RuntimeIdentifiers>win-x86;win-x64;win-arm64</RuntimeIdentifiers>
<AccelerateBuildsInVisualStudio>true</AccelerateBuildsInVisualStudio>
<ProduceReferenceAssembly>true</ProduceReferenceAssembly>
<IsTrimmable>true</IsTrimmable>
<EnableTrimAnalyzer>true</EnableTrimAnalyzer>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Wino.Core.Domain\Wino.Core.Domain.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="System.Text.Json" />
</ItemGroup>
<ItemGroup>
<Folder Include="Client\Authorization\" />
</ItemGroup>