Fix account folder layout is not updated if there is a change after the synchronization.
This commit is contained in:
@@ -250,6 +250,9 @@ namespace Wino.Core.UWP.Services
|
|||||||
case nameof(AccountSynchronizationProgressUpdatedMessage):
|
case nameof(AccountSynchronizationProgressUpdatedMessage):
|
||||||
WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize<AccountSynchronizationProgressUpdatedMessage>(messageJson));
|
WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize<AccountSynchronizationProgressUpdatedMessage>(messageJson));
|
||||||
break;
|
break;
|
||||||
|
case nameof(AccountFolderConfigurationUpdated):
|
||||||
|
WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize<AccountFolderConfigurationUpdated>(messageJson));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw new Exception("Invalid data type name passed to client.");
|
throw new Exception("Invalid data type name passed to client.");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,9 +76,7 @@ namespace Wino.Core.Extensions
|
|||||||
|
|
||||||
public static MailItemFolder GetLocalFolder(this Label label, ListLabelsResponse labelsResponse, Guid accountId)
|
public static MailItemFolder GetLocalFolder(this Label label, ListLabelsResponse labelsResponse, Guid accountId)
|
||||||
{
|
{
|
||||||
|
var normalizedLabelName = GetFolderName(label.Name);
|
||||||
|
|
||||||
var normalizedLabelName = GetFolderName(label);
|
|
||||||
|
|
||||||
// Even though we normalize the label name, check is done by capitalizing the label name.
|
// Even though we normalize the label name, check is done by capitalizing the label name.
|
||||||
var capitalNormalizedLabelName = normalizedLabelName.ToUpper();
|
var capitalNormalizedLabelName = normalizedLabelName.ToUpper();
|
||||||
@@ -155,14 +153,14 @@ namespace Wino.Core.Extensions
|
|||||||
return labelsResponse.Labels.FirstOrDefault(a => a.Name == parentLabelName)?.Id ?? string.Empty;
|
return labelsResponse.Labels.FirstOrDefault(a => a.Name == parentLabelName)?.Id ?? string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GetFolderName(Label label)
|
public static string GetFolderName(string fullFolderName)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(label.Name)) return string.Empty;
|
if (string.IsNullOrEmpty(fullFolderName)) return string.Empty;
|
||||||
|
|
||||||
// Folders with "//" at the end has "/" as the name.
|
// Folders with "//" at the end has "/" as the name.
|
||||||
if (label.Name.EndsWith(FOLDER_SEPERATOR_STRING)) return FOLDER_SEPERATOR_STRING;
|
if (fullFolderName.EndsWith(FOLDER_SEPERATOR_STRING)) return FOLDER_SEPERATOR_STRING;
|
||||||
|
|
||||||
string[] parts = label.Name.Split(FOLDER_SEPERATOR_CHAR);
|
string[] parts = fullFolderName.Split(FOLDER_SEPERATOR_CHAR);
|
||||||
|
|
||||||
var lastPart = parts[parts.Length - 1];
|
var lastPart = parts[parts.Length - 1];
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.Linq;
|
|||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using CommunityToolkit.Mvvm.Messaging;
|
||||||
using Google.Apis.Gmail.v1;
|
using Google.Apis.Gmail.v1;
|
||||||
using Google.Apis.Gmail.v1.Data;
|
using Google.Apis.Gmail.v1.Data;
|
||||||
using Google.Apis.Http;
|
using Google.Apis.Http;
|
||||||
@@ -27,6 +28,7 @@ using Wino.Core.Extensions;
|
|||||||
using Wino.Core.Http;
|
using Wino.Core.Http;
|
||||||
using Wino.Core.Integration.Processors;
|
using Wino.Core.Integration.Processors;
|
||||||
using Wino.Core.Requests;
|
using Wino.Core.Requests;
|
||||||
|
using Wino.Messaging.UI;
|
||||||
|
|
||||||
namespace Wino.Core.Synchronizers
|
namespace Wino.Core.Synchronizers
|
||||||
{
|
{
|
||||||
@@ -365,6 +367,11 @@ namespace Wino.Core.Synchronizers
|
|||||||
{
|
{
|
||||||
await _gmailChangeProcessor.UpdateFolderAsync(folder).ConfigureAwait(false);
|
await _gmailChangeProcessor.UpdateFolderAsync(folder).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (insertedFolders.Any() || deletedFolders.Any() || updatedFolders.Any())
|
||||||
|
{
|
||||||
|
WeakReferenceMessenger.Default.Send(new AccountFolderConfigurationUpdated(Account.Id));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
@@ -374,7 +381,10 @@ namespace Wino.Core.Synchronizers
|
|||||||
|
|
||||||
private bool ShouldUpdateFolder(Label remoteFolder, MailItemFolder existingLocalFolder)
|
private bool ShouldUpdateFolder(Label remoteFolder, MailItemFolder existingLocalFolder)
|
||||||
{
|
{
|
||||||
bool isNameChanged = !existingLocalFolder.FolderName.Equals(GoogleIntegratorExtensions.GetFolderName(remoteFolder), StringComparison.OrdinalIgnoreCase);
|
var remoteFolderName = GoogleIntegratorExtensions.GetFolderName(remoteFolder.Name);
|
||||||
|
var localFolderName = GoogleIntegratorExtensions.GetFolderName(existingLocalFolder.FolderName);
|
||||||
|
|
||||||
|
bool isNameChanged = !localFolderName.Equals(remoteFolderName, StringComparison.OrdinalIgnoreCase);
|
||||||
bool isColorChanged = existingLocalFolder.BackgroundColorHex != remoteFolder.Color?.BackgroundColor ||
|
bool isColorChanged = existingLocalFolder.BackgroundColorHex != remoteFolder.Color?.BackgroundColor ||
|
||||||
existingLocalFolder.TextColorHex != remoteFolder.Color?.TextColor;
|
existingLocalFolder.TextColorHex != remoteFolder.Color?.TextColor;
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using CommunityToolkit.Mvvm.Messaging;
|
||||||
using MailKit;
|
using MailKit;
|
||||||
using MailKit.Net.Imap;
|
using MailKit.Net.Imap;
|
||||||
using MailKit.Search;
|
using MailKit.Search;
|
||||||
@@ -21,6 +22,7 @@ using Wino.Core.Integration.Processors;
|
|||||||
using Wino.Core.Mime;
|
using Wino.Core.Mime;
|
||||||
using Wino.Core.Requests;
|
using Wino.Core.Requests;
|
||||||
using Wino.Core.Requests.Bundles;
|
using Wino.Core.Requests.Bundles;
|
||||||
|
using Wino.Messaging.UI;
|
||||||
|
|
||||||
namespace Wino.Core.Synchronizers
|
namespace Wino.Core.Synchronizers
|
||||||
{
|
{
|
||||||
@@ -717,6 +719,11 @@ namespace Wino.Core.Synchronizers
|
|||||||
{
|
{
|
||||||
await _imapChangeProcessor.UpdateFolderAsync(folder).ConfigureAwait(false);
|
await _imapChangeProcessor.UpdateFolderAsync(folder).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (insertedFolders.Any() || deletedFolders.Any() || updatedFolders.Any())
|
||||||
|
{
|
||||||
|
WeakReferenceMessenger.Default.Send(new AccountFolderConfigurationUpdated(Account.Id));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -971,7 +971,8 @@ namespace Wino.Mail.ViewModels
|
|||||||
{
|
{
|
||||||
// Reloading of folders is needed to re-create folder tree if the account is loaded.
|
// Reloading of folders is needed to re-create folder tree if the account is loaded.
|
||||||
|
|
||||||
if (MenuItems.TryGetAccountMenuItem(message.AccountId, out IAccountMenuItem accountMenuItem))
|
if (MenuItems.TryGetAccountMenuItem(message.AccountId, out IAccountMenuItem accountMenuItem) &&
|
||||||
|
latestSelectedAccountMenuItem == accountMenuItem)
|
||||||
{
|
{
|
||||||
await ChangeLoadedAccountAsync(accountMenuItem, true);
|
await ChangeLoadedAccountAsync(accountMenuItem, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,9 +19,9 @@ using Wino.Core.Domain.Models.Folders;
|
|||||||
using Wino.Core.Domain.Models.Synchronization;
|
using Wino.Core.Domain.Models.Synchronization;
|
||||||
using Wino.Core.UWP.Extensions;
|
using Wino.Core.UWP.Extensions;
|
||||||
using Wino.Dialogs;
|
using Wino.Dialogs;
|
||||||
using Wino.Messaging.Client.Accounts;
|
|
||||||
using Wino.Messaging.Client.Shell;
|
using Wino.Messaging.Client.Shell;
|
||||||
using Wino.Messaging.Server;
|
using Wino.Messaging.Server;
|
||||||
|
using Wino.Messaging.UI;
|
||||||
|
|
||||||
namespace Wino.Services
|
namespace Wino.Services
|
||||||
{
|
{
|
||||||
@@ -197,6 +197,8 @@ namespace Wino.Services
|
|||||||
|
|
||||||
if (configuration != null)
|
if (configuration != null)
|
||||||
{
|
{
|
||||||
|
await folderService.UpdateSystemFolderConfigurationAsync(accountId, configuration);
|
||||||
|
|
||||||
InfoBarMessage(Translator.SystemFolderConfigSetupSuccess_Title, Translator.SystemFolderConfigSetupSuccess_Message, InfoBarMessageType.Success);
|
InfoBarMessage(Translator.SystemFolderConfigSetupSuccess_Title, Translator.SystemFolderConfigSetupSuccess_Message, InfoBarMessageType.Success);
|
||||||
|
|
||||||
WeakReferenceMessenger.Default.Send(new AccountFolderConfigurationUpdated(accountId));
|
WeakReferenceMessenger.Default.Send(new AccountFolderConfigurationUpdated(accountId));
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace Wino.Messaging.Client.Accounts
|
namespace Wino.Messaging.UI
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// When account's special folder configuration is updated.
|
/// When account's special folder configuration is updated.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public record AccountFolderConfigurationUpdated(Guid AccountId);
|
public record AccountFolderConfigurationUpdated(Guid AccountId) : UIMessageBase<AccountFolderConfigurationUpdated>;
|
||||||
}
|
}
|
||||||
@@ -41,7 +41,8 @@ namespace Wino.Server
|
|||||||
IRecipient<AccountSynchronizerStateChanged>,
|
IRecipient<AccountSynchronizerStateChanged>,
|
||||||
IRecipient<RefreshUnreadCountsMessage>,
|
IRecipient<RefreshUnreadCountsMessage>,
|
||||||
IRecipient<ServerTerminationModeChanged>,
|
IRecipient<ServerTerminationModeChanged>,
|
||||||
IRecipient<AccountSynchronizationProgressUpdatedMessage>
|
IRecipient<AccountSynchronizationProgressUpdatedMessage>,
|
||||||
|
IRecipient<AccountFolderConfigurationUpdated>
|
||||||
{
|
{
|
||||||
private readonly System.Timers.Timer _timer;
|
private readonly System.Timers.Timer _timer;
|
||||||
private static object connectionLock = new object();
|
private static object connectionLock = new object();
|
||||||
@@ -136,6 +137,8 @@ namespace Wino.Server
|
|||||||
|
|
||||||
public async void Receive(AccountSynchronizationProgressUpdatedMessage message) => await SendMessageAsync(MessageType.UIMessage, message);
|
public async void Receive(AccountSynchronizationProgressUpdatedMessage message) => await SendMessageAsync(MessageType.UIMessage, message);
|
||||||
|
|
||||||
|
public async void Receive(AccountFolderConfigurationUpdated message) => await SendMessageAsync(MessageType.UIMessage, message);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private string GetAppPackagFamilyName()
|
private string GetAppPackagFamilyName()
|
||||||
|
|||||||
Reference in New Issue
Block a user