using System; using Acr.UserDialogs; using Bit.App.Abstractions; using Bit.App.Controls; using Bit.App.Resources; using Plugin.Connectivity.Abstractions; using Xamarin.Forms; using XLabs.Ioc; using System.Linq; namespace Bit.App.Pages { public class SettingsEditFolderPage : ExtendedContentPage { private readonly string _folderId; private readonly IFolderService _folderService; private readonly IUserDialogs _userDialogs; private readonly IConnectivity _connectivity; private readonly IGoogleAnalyticsService _googleAnalyticsService; public SettingsEditFolderPage(string folderId) { _folderId = folderId; _folderService = Resolver.Resolve(); _userDialogs = Resolver.Resolve(); _connectivity = Resolver.Resolve(); _googleAnalyticsService = Resolver.Resolve(); Init(); } private void Init() { var folder = _folderService.GetByIdAsync(_folderId).GetAwaiter().GetResult(); if(folder == null) { // TODO: handle error. navigate back? should never happen... return; } var nameCell = new FormEntryCell(AppResources.Name); nameCell.Entry.Text = folder.Name.Decrypt(); var deleteCell = new ExtendedTextCell { Text = AppResources.Delete, TextColor = Color.Red }; deleteCell.Tapped += DeleteCell_Tapped; var mainTable = new ExtendedTableView { Intent = TableIntent.Settings, EnableScrolling = false, HasUnevenRows = true, VerticalOptions = LayoutOptions.Start, Root = new TableRoot { new TableSection { nameCell }, new TableSection { deleteCell } } }; if(Device.OS == TargetPlatform.iOS) { mainTable.RowHeight = -1; mainTable.EstimatedRowHeight = 70; } var saveToolBarItem = new ToolbarItem(AppResources.Save, null, async () => { if(!_connectivity.IsConnected) { AlertNoConnection(); return; } if(string.IsNullOrWhiteSpace(nameCell.Entry.Text)) { await DisplayAlert(AppResources.AnErrorHasOccurred, string.Format(AppResources.ValidationFieldRequired, AppResources.Name), AppResources.Ok); return; } folder.Name = nameCell.Entry.Text.Encrypt(); _userDialogs.ShowLoading("Saving...", MaskType.Black); var saveResult = await _folderService.SaveAsync(folder); _userDialogs.HideLoading(); if(saveResult.Succeeded) { await Navigation.PopModalAsync(); _userDialogs.Toast("Folder updated."); _googleAnalyticsService.TrackAppEvent("EditedFolder"); } else if(saveResult.Errors.Count() > 0) { await _userDialogs.AlertAsync(saveResult.Errors.First().Message, AppResources.AnErrorHasOccurred); } else { await _userDialogs.AlertAsync(AppResources.AnErrorHasOccurred); } }, ToolbarItemOrder.Default, 0); Title = "Edit Folder"; Content = mainTable; ToolbarItems.Add(saveToolBarItem); if(Device.OS == TargetPlatform.iOS) { ToolbarItems.Add(new DismissModalToolBarItem(this, "Cancel")); } } protected override void OnAppearing() { base.OnAppearing(); if(!_connectivity.IsConnected) { AlertNoConnection(); } } private async void DeleteCell_Tapped(object sender, EventArgs e) { if(!_connectivity.IsConnected) { AlertNoConnection(); return; } // TODO: Validate the delete operation. ex. Cannot delete a folder that has sites in it? if(!await _userDialogs.ConfirmAsync(AppResources.DoYouReallyWantToDelete, null, AppResources.Yes, AppResources.No)) { return; } _userDialogs.ShowLoading("Deleting...", MaskType.Black); var deleteTask = await _folderService.DeleteAsync(_folderId); _userDialogs.HideLoading(); if(deleteTask.Succeeded) { await Navigation.PopModalAsync(); _userDialogs.Toast("Folder deleted."); } else if(deleteTask.Errors.Count() > 0) { await _userDialogs.AlertAsync(deleteTask.Errors.First().Message, AppResources.AnErrorHasOccurred); } else { await _userDialogs.AlertAsync(AppResources.AnErrorHasOccurred); } } private void AlertNoConnection() { DisplayAlert(AppResources.InternetConnectionRequiredTitle, AppResources.InternetConnectionRequiredMessage, AppResources.Ok); } } }