Fix double init on calendar days.
This commit is contained in:
@@ -168,29 +168,28 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
|
|||||||
|
|
||||||
AccountCalendarStateService.AccountCalendarSelectionStateChanged += UpdateAccountCalendarRequested;
|
AccountCalendarStateService.AccountCalendarSelectionStateChanged += UpdateAccountCalendarRequested;
|
||||||
AccountCalendarStateService.CollectiveAccountGroupSelectionStateChanged += AccountCalendarStateCollectivelyChanged;
|
AccountCalendarStateService.CollectiveAccountGroupSelectionStateChanged += AccountCalendarStateCollectivelyChanged;
|
||||||
|
|
||||||
|
// We don't register on navigation here. This page is cached.
|
||||||
|
RegisterRecipients();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void RegisterRecipients()
|
protected override void RegisterRecipients()
|
||||||
{
|
{
|
||||||
base.RegisterRecipients();
|
base.RegisterRecipients();
|
||||||
|
|
||||||
Messenger.Register<LoadCalendarMessage>(this);
|
|
||||||
Messenger.Register<CalendarSettingsUpdatedMessage>(this);
|
|
||||||
Messenger.Register<CalendarItemTappedMessage>(this);
|
|
||||||
Messenger.Register<CalendarItemDoubleTappedMessage>(this);
|
|
||||||
Messenger.Register<CalendarItemRightTappedMessage>(this);
|
|
||||||
Messenger.Register<AccountRemovedMessage>(this);
|
|
||||||
}
|
|
||||||
protected override void UnregisterRecipients()
|
|
||||||
{
|
|
||||||
base.UnregisterRecipients();
|
|
||||||
|
|
||||||
Messenger.Unregister<LoadCalendarMessage>(this);
|
Messenger.Unregister<LoadCalendarMessage>(this);
|
||||||
Messenger.Unregister<CalendarSettingsUpdatedMessage>(this);
|
Messenger.Unregister<CalendarSettingsUpdatedMessage>(this);
|
||||||
Messenger.Unregister<CalendarItemTappedMessage>(this);
|
Messenger.Unregister<CalendarItemTappedMessage>(this);
|
||||||
Messenger.Unregister<CalendarItemDoubleTappedMessage>(this);
|
Messenger.Unregister<CalendarItemDoubleTappedMessage>(this);
|
||||||
Messenger.Unregister<CalendarItemRightTappedMessage>(this);
|
Messenger.Unregister<CalendarItemRightTappedMessage>(this);
|
||||||
Messenger.Unregister<AccountRemovedMessage>(this);
|
Messenger.Unregister<AccountRemovedMessage>(this);
|
||||||
|
|
||||||
|
Messenger.Register<LoadCalendarMessage>(this);
|
||||||
|
Messenger.Register<CalendarSettingsUpdatedMessage>(this);
|
||||||
|
Messenger.Register<CalendarItemTappedMessage>(this);
|
||||||
|
Messenger.Register<CalendarItemDoubleTappedMessage>(this);
|
||||||
|
Messenger.Register<CalendarItemRightTappedMessage>(this);
|
||||||
|
Messenger.Register<AccountRemovedMessage>(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AccountCalendarStateCollectivelyChanged(object sender, GroupedAccountCalendarViewModel e)
|
private void AccountCalendarStateCollectivelyChanged(object sender, GroupedAccountCalendarViewModel e)
|
||||||
@@ -234,19 +233,10 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
|
|||||||
|
|
||||||
public override void OnNavigatedTo(NavigationMode mode, object parameters)
|
public override void OnNavigatedTo(NavigationMode mode, object parameters)
|
||||||
{
|
{
|
||||||
base.OnNavigatedTo(mode, parameters);
|
|
||||||
|
|
||||||
if (mode == NavigationMode.Back)
|
|
||||||
{
|
|
||||||
// We unregister recipients on navigate-away, so mutations that happened while this page
|
|
||||||
// was not active (e.g. CalendarItemDeleted from details page) can be missed.
|
|
||||||
// Rehydrate currently visible ranges to guarantee UI and DB are consistent on return.
|
|
||||||
_ = RefreshVisibleRangesAsync();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
RefreshSettings();
|
RefreshSettings();
|
||||||
|
|
||||||
|
if (mode == NavigationMode.Back) return;
|
||||||
|
|
||||||
// Automatically select the first primary calendar for quick event dialog.
|
// Automatically select the first primary calendar for quick event dialog.
|
||||||
SelectedQuickEventAccountCalendar = AccountCalendarStateService.ActiveCalendars.FirstOrDefault(a => a.IsPrimary);
|
SelectedQuickEventAccountCalendar = AccountCalendarStateService.ActiveCalendars.FirstOrDefault(a => a.IsPrimary);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ using Microsoft.UI.Xaml.Controls;
|
|||||||
using Wino.Calendar.Views;
|
using Wino.Calendar.Views;
|
||||||
using Wino.Core.Domain.Enums;
|
using Wino.Core.Domain.Enums;
|
||||||
using Wino.Core.Domain.Interfaces;
|
using Wino.Core.Domain.Interfaces;
|
||||||
|
using Wino.Core.Domain.Models.Calendar;
|
||||||
using Wino.Core.Domain.Models.Navigation;
|
using Wino.Core.Domain.Models.Navigation;
|
||||||
using Wino.Helpers;
|
using Wino.Helpers;
|
||||||
using Wino.Mail.ViewModels.Data;
|
using Wino.Mail.ViewModels.Data;
|
||||||
@@ -15,6 +16,7 @@ using Wino.Mail.WinUI.Interfaces;
|
|||||||
using Wino.Mail.WinUI.Services;
|
using Wino.Mail.WinUI.Services;
|
||||||
using Wino.Mail.WinUI.Views.Calendar;
|
using Wino.Mail.WinUI.Views.Calendar;
|
||||||
using Wino.Messaging.Client.Mails;
|
using Wino.Messaging.Client.Mails;
|
||||||
|
using Wino.Messaging.Client.Calendar;
|
||||||
using Wino.Messaging.Client.Navigation;
|
using Wino.Messaging.Client.Navigation;
|
||||||
using Wino.Views;
|
using Wino.Views;
|
||||||
using Wino.Views.Account;
|
using Wino.Views.Account;
|
||||||
@@ -136,6 +138,7 @@ public class NavigationService : NavigationServiceBase, INavigationService
|
|||||||
NavigationTransitionType transition = NavigationTransitionType.None)
|
NavigationTransitionType transition = NavigationTransitionType.None)
|
||||||
{
|
{
|
||||||
var pageType = GetPageType(page);
|
var pageType = GetPageType(page);
|
||||||
|
if (pageType == null) return false;
|
||||||
|
|
||||||
var currentApplicationMode = GetCoreFrame(NavigationReferenceFrame.ShellFrame)?.Content?.GetType() == typeof(MailAppShell)
|
var currentApplicationMode = GetCoreFrame(NavigationReferenceFrame.ShellFrame)?.Content?.GetType() == typeof(MailAppShell)
|
||||||
? WinoApplicationMode.Mail
|
? WinoApplicationMode.Mail
|
||||||
@@ -151,6 +154,30 @@ public class NavigationService : NavigationServiceBase, INavigationService
|
|||||||
// Calendar navigations.
|
// Calendar navigations.
|
||||||
if (currentApplicationMode == WinoApplicationMode.Calendar)
|
if (currentApplicationMode == WinoApplicationMode.Calendar)
|
||||||
{
|
{
|
||||||
|
var currentFrameType = GetCurrentFrameType(ref innerShellFrame);
|
||||||
|
|
||||||
|
if (page == WinoPage.CalendarPage &&
|
||||||
|
parameter is CalendarPageNavigationArgs calendarNavigationArgs)
|
||||||
|
{
|
||||||
|
var loadCalendarMessage = CreateLoadCalendarMessage(calendarNavigationArgs);
|
||||||
|
|
||||||
|
// Date changes while CalendarPage is already active should not re-navigate the frame.
|
||||||
|
if (currentFrameType == pageType)
|
||||||
|
{
|
||||||
|
WeakReferenceMessenger.Default.Send(loadCalendarMessage);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If CalendarPage is the previous page, reuse it instead of creating a second instance.
|
||||||
|
var lastBackStackEntry = innerShellFrame.BackStack.Count > 0 ? innerShellFrame.BackStack[^1] : null;
|
||||||
|
if (innerShellFrame.CanGoBack && lastBackStackEntry?.SourcePageType == pageType)
|
||||||
|
{
|
||||||
|
innerShellFrame.GoBack();
|
||||||
|
WeakReferenceMessenger.Default.Send(loadCalendarMessage);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return innerShellFrame.Navigate(pageType, parameter);
|
return innerShellFrame.Navigate(pageType, parameter);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -221,6 +248,19 @@ public class NavigationService : NavigationServiceBase, INavigationService
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static LoadCalendarMessage CreateLoadCalendarMessage(CalendarPageNavigationArgs args)
|
||||||
|
{
|
||||||
|
var targetDate = args.RequestDefaultNavigation
|
||||||
|
? DateTime.Now.Date
|
||||||
|
: args.NavigationDate;
|
||||||
|
|
||||||
|
var initiative = args.RequestDefaultNavigation
|
||||||
|
? CalendarInitInitiative.App
|
||||||
|
: CalendarInitInitiative.User;
|
||||||
|
|
||||||
|
return new LoadCalendarMessage(targetDate, initiative);
|
||||||
|
}
|
||||||
|
|
||||||
public void GoBack(Core.Domain.Enums.NavigationTransitionEffect slideEffect = Core.Domain.Enums.NavigationTransitionEffect.FromRight)
|
public void GoBack(Core.Domain.Enums.NavigationTransitionEffect slideEffect = Core.Domain.Enums.NavigationTransitionEffect.FromRight)
|
||||||
{
|
{
|
||||||
// Check if we're navigating within ManageAccountsPage (applies to both modes)
|
// Check if we're navigating within ManageAccountsPage (applies to both modes)
|
||||||
|
|||||||
Reference in New Issue
Block a user