using System; using System.Collections.Generic; using System.IO; using System.Threading; using System.Threading.Tasks; using CommunityToolkit.Mvvm.Messaging; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Serilog; using Windows.Storage; using Windows.Storage.AccessCache; using Windows.Storage.Pickers; using Wino.Core.Domain; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.Accounts; using Wino.Core.Domain.Models.Common; using Wino.Core.Domain.Models.Printing; using Wino.Dialogs; using Wino.Mail.WinUI.Dialogs; using Wino.Mail.WinUI.Extensions; using Wino.Messaging.Client.Shell; using WinRT.Interop; namespace Wino.Mail.WinUI.Services; public class DialogServiceBase : IDialogServiceBase { private SemaphoreSlim _presentationSemaphore = new SemaphoreSlim(1); protected INewThemeService ThemeService { get; } protected IConfigurationService ConfigurationService { get; } protected IApplicationResourceManager ApplicationResourceManager { get; } public DialogServiceBase(INewThemeService themeService, IConfigurationService configurationService, IApplicationResourceManager applicationResourceManager) { ThemeService = themeService; ConfigurationService = configurationService; ApplicationResourceManager = applicationResourceManager; } protected XamlRoot? GetXamlRoot() { return WinoApplication.MainWindow?.Content?.XamlRoot; } public async Task PickFilePathAsync(string saveFileName) { var picker = new FolderPicker() { SuggestedStartLocation = PickerLocationId.Desktop, }; picker.FileTypeFilter.Add("*"); var mainWindow = WinoApplication.MainWindow; if (mainWindow == null) return string.Empty; nint windowHandle = WindowNative.GetWindowHandle(mainWindow); InitializeWithWindow.Initialize(picker, windowHandle); var folder = await picker.PickSingleFolderAsync(); if (folder == null) return string.Empty; StorageApplicationPermissions.FutureAccessList.Add(folder); return $"{Path.Combine(folder.Path, saveFileName)}"; //var picker = new FileSavePicker //{ // SuggestedStartLocation = PickerLocationId.Desktop, // SuggestedFileName = saveFileName //}; //picker.FileTypeChoices.Add(Translator.FilteringOption_All, [".*"]); //var file = await picker.PickSaveFileAsync(); //if (file == null) return string.Empty; //StorageApplicationPermissions.FutureAccessList.Add(file); //return file.Path; } public async Task> PickFilesAsync(params object[] typeFilters) { var returnList = new List(); var picker = new FileOpenPicker { ViewMode = PickerViewMode.Thumbnail, SuggestedStartLocation = PickerLocationId.Desktop }; foreach (var filter in typeFilters) { picker.FileTypeFilter.Add(filter.ToString()); } var mainWindow = WinoApplication.MainWindow; if (mainWindow == null) return returnList; nint windowHandle = WindowNative.GetWindowHandle(mainWindow); InitializeWithWindow.Initialize(picker, windowHandle); var files = await picker.PickMultipleFilesAsync(); if (files == null) return returnList; foreach (var file in files) { StorageApplicationPermissions.FutureAccessList.Add(file); var sharedFile = await file.ToSharedFileAsync(); returnList.Add(sharedFile); } return returnList; } private async Task PickFileAsync(params object[] typeFilters) { var picker = new FileOpenPicker { ViewMode = PickerViewMode.Thumbnail }; foreach (var filter in typeFilters) { picker.FileTypeFilter.Add(filter.ToString()); } var mainWindow = WinoApplication.MainWindow; if (mainWindow == null) return null; nint windowHandle = WindowNative.GetWindowHandle(mainWindow); InitializeWithWindow.Initialize(picker, windowHandle); var file = await picker.PickSingleFileAsync(); if (file == null) return null; StorageApplicationPermissions.FutureAccessList.Add(file); return file; } public virtual IAccountCreationDialog GetAccountCreationDialog(AccountCreationDialogResult accountCreationDialogResult) { return new AccountCreationDialog { RequestedTheme = ThemeService.RootTheme.ToWindowsElementTheme(), XamlRoot = GetXamlRoot() }; } public async Task PickWindowsFileContentAsync(params object[] typeFilters) { var file = await PickFileAsync(typeFilters); if (file == null) return []; return await file.ToByteArrayAsync(); } public Task ShowMessageAsync(string message, string title, WinoCustomMessageDialogIcon icon = WinoCustomMessageDialogIcon.Information) => ShowWinoCustomMessageDialogAsync(title, message, Translator.Buttons_Close, icon); public Task ShowConfirmationDialogAsync(string question, string title, string confirmationButtonTitle) => ShowWinoCustomMessageDialogAsync(title, question, confirmationButtonTitle, WinoCustomMessageDialogIcon.Question, Translator.Buttons_Cancel, string.Empty); public async Task ShowWinoCustomMessageDialogAsync(string title, string description, string approveButtonText, WinoCustomMessageDialogIcon? icon, string cancelButtonText = "", string dontAskAgainConfigurationKey = "") { // This config key has been marked as don't ask again already. // Return immidiate result without presenting the dialog. bool isDontAskEnabled = !string.IsNullOrEmpty(dontAskAgainConfigurationKey); if (isDontAskEnabled && ConfigurationService.Get(dontAskAgainConfigurationKey, false)) return false; var informationContainer = new CustomMessageDialogInformationContainer(title, description, icon ?? WinoCustomMessageDialogIcon.Information, isDontAskEnabled); var dialog = new ContentDialog { Style = ApplicationResourceManager.GetResource