diff --git a/Wino.Core.Domain/Interfaces/IUnsubscriptionService.cs b/Wino.Core.Domain/Interfaces/IUnsubscriptionService.cs
new file mode 100644
index 00000000..f066895a
--- /dev/null
+++ b/Wino.Core.Domain/Interfaces/IUnsubscriptionService.cs
@@ -0,0 +1,15 @@
+using System.Threading.Tasks;
+using Wino.Core.Domain.Models.Reader;
+
+namespace Wino.Core.Domain.Interfaces
+{
+ public interface IUnsubscriptionService
+ {
+ ///
+ /// Unsubscribes from the subscription using one-click method.
+ ///
+ /// Unsubscribtion information.
+ /// Whether the unsubscription is succeeded or not.
+ Task OneClickUnsubscribeAsync(UnsubscribeInfo info);
+ }
+}
diff --git a/Wino.Core/CoreContainerSetup.cs b/Wino.Core/CoreContainerSetup.cs
index 0554b0a0..67f4c2ce 100644
--- a/Wino.Core/CoreContainerSetup.cs
+++ b/Wino.Core/CoreContainerSetup.cs
@@ -37,6 +37,7 @@ namespace Wino.Core
services.AddTransient();
services.AddTransient();
services.AddTransient();
+ services.AddTransient();
services.AddTransient();
services.AddTransient();
diff --git a/Wino.Core/Services/UnsubscriptionService.cs b/Wino.Core/Services/UnsubscriptionService.cs
new file mode 100644
index 00000000..c9f7225d
--- /dev/null
+++ b/Wino.Core/Services/UnsubscriptionService.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Net.Http;
+using System.Text;
+using System.Threading.Tasks;
+using Serilog;
+using Wino.Core.Domain.Interfaces;
+using Wino.Core.Domain.Models.Reader;
+
+namespace Wino.Core.Services
+{
+ public class UnsubscriptionService : IUnsubscriptionService
+ {
+ public async Task OneClickUnsubscribeAsync(UnsubscribeInfo info)
+ {
+ try
+ {
+ using var httpClient = new HttpClient();
+
+ var unsubscribeRequest = new HttpRequestMessage(HttpMethod.Post, info.HttpLink)
+ {
+ Content = new StringContent("List-Unsubscribe=One-Click", Encoding.UTF8, "application/x-www-form-urlencoded")
+ };
+
+ var result = await httpClient.SendAsync(unsubscribeRequest).ConfigureAwait(false);
+
+ return result.IsSuccessStatusCode;
+ }
+ catch (Exception ex)
+ {
+ Log.Error("Failed to unsubscribe from {HttpLink} - {Message}", info.HttpLink, ex.Message);
+ }
+
+ return false;
+ }
+ }
+}
diff --git a/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs b/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs
index 6f4ffa2c..df3dac28 100644
--- a/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs
+++ b/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs
@@ -2,8 +2,6 @@
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
-using System.Net.Http;
-using System.Text;
using System.Threading;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.ComponentModel;
@@ -40,6 +38,7 @@ namespace Wino.Mail.ViewModels
private readonly IWinoSynchronizerFactory _winoSynchronizerFactory;
private readonly IWinoRequestDelegator _requestDelegator;
private readonly IClipboardService _clipboardService;
+ private readonly IUnsubscriptionService _unsubscriptionService;
private bool forceImageLoading = false;
@@ -127,6 +126,7 @@ namespace Wino.Mail.ViewModels
IWinoRequestDelegator requestDelegator,
IStatePersistanceService statePersistanceService,
IClipboardService clipboardService,
+ IUnsubscriptionService unsubscriptionService,
IPreferencesService preferencesService) : base(dialogService)
{
NativeAppService = nativeAppService;
@@ -134,6 +134,7 @@ namespace Wino.Mail.ViewModels
PreferencesService = preferencesService;
_clipboardService = clipboardService;
+ _unsubscriptionService = unsubscriptionService;
_underlyingThemeService = underlyingThemeService;
_mimeFileService = mimeFileService;
_mailService = mailService;
@@ -194,15 +195,9 @@ namespace Wino.Mail.ViewModels
confirmed = await DialogService.ShowConfirmationDialogAsync(string.Format(Translator.DialogMessage_UnsubscribeConfirmationOneClickMessage, FromName), Translator.DialogMessage_UnsubscribeConfirmationTitle, Translator.Unsubscribe);
if (!confirmed) return;
- using var httpClient = new HttpClient();
+ bool isOneClickUnsubscribed = await _unsubscriptionService.OneClickUnsubscribeAsync(CurrentRenderModel.UnsubscribeInfo);
- var unsubscribeRequest = new HttpRequestMessage(HttpMethod.Post, CurrentRenderModel.UnsubscribeInfo.HttpLink)
- {
- Content = new StringContent("List-Unsubscribe=One-Click", Encoding.UTF8, "application/x-www-form-urlencoded")
- };
-
- var result = await httpClient.SendAsync(unsubscribeRequest);
- if (result.IsSuccessStatusCode)
+ if (isOneClickUnsubscribed)
{
DialogService.InfoBarMessage(Translator.Unsubscribe, string.Format(Translator.Info_UnsubscribeSuccessMessage, FromName), InfoBarMessageType.Success);
}