using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using CommunityToolkit.Mvvm.Messaging; using Serilog; using Windows.Storage; using Windows.Storage.AccessCache; using Windows.Storage.Pickers; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; 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.UWP.Dialogs; using Wino.Core.UWP.Extensions; using Wino.Dialogs; using Wino.Messaging.Client.Shell; namespace Wino.Core.UWP.Services; public class DialogServiceBase : IDialogServiceBase { private SemaphoreSlim _presentationSemaphore = new SemaphoreSlim(1); protected IThemeService ThemeService { get; } protected IConfigurationService ConfigurationService { get; } protected IApplicationResourceManager ApplicationResourceManager { get; } public DialogServiceBase(IThemeService themeService, IConfigurationService configurationService, IApplicationResourceManager applicationResourceManager) { ThemeService = themeService; ConfigurationService = configurationService; ApplicationResourceManager = applicationResourceManager; } public async Task PickFilePathAsync(string saveFileName) { var picker = new FolderPicker() { SuggestedStartLocation = PickerLocationId.Desktop }; picker.FileTypeFilter.Add("*"); var folder = await picker.PickSingleFolderAsync(); if (folder == null) return string.Empty; StorageApplicationPermissions.FutureAccessList.Add(folder); return folder.Path; //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 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 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() }; } 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.Value, isDontAskEnabled); var dialog = new ContentDialog { Style = ApplicationResourceManager.GetResource