Files
Phonebook/MainPage.xaml.cs

180 lines
5.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Phonebook.Models;
using Phonebook.Services;
using Contact = Phonebook.Models.Contact;
using ClosedXML.Excel;
using Communication = Microsoft.Maui.ApplicationModel.Communication;
using Android.Content;
namespace Phonebook;
public partial class MainPage : ContentPage
{
private readonly DatabaseService _databaseService;
private List<Contact> _allContacts = [];
public MainPage()
{
InitializeComponent();
_databaseService = new DatabaseService();
}
protected override async void OnAppearing()
{
base.OnAppearing();
await LoadContacts();
}
private async Task LoadContacts()
{
_allContacts = await GetAllContacts();
contactsList.ItemsSource = _allContacts;
}
private async Task<List<Contact>> GetAllContacts()
{
var allContacts = await _databaseService.GetContactsAsync();
if (!await IsPermissionGranted<Permissions.ContactsRead>())
return allContacts;
var contacts = GetContacts();
await foreach (var contact in contacts)
{
allContacts.Add(contact);
}
return allContacts;
}
private async Task<bool> IsPermissionGranted<T>() where T : Permissions.BasePermission, new()
{
return await Permissions.RequestAsync<T>() == PermissionStatus.Granted;
}
private async Task ExportToXlsx()
{
try
{
_allContacts = await GetAllContacts();
if (_allContacts.Count <= 0)
{
return;
}
var fileName = $"contacts_{DateTime.Now:yyyyMMdd_HHmmss}.xlsx";
var localPath = Path.Combine(FileSystem.CacheDirectory, fileName);
using (var workbook = new XLWorkbook())
{
var worksheet = workbook.Worksheets.Add("Contacts");
worksheet.Cell(1, 1).Value = "Id";
worksheet.Cell(1, 2).Value = "Name";
worksheet.Cell(1, 3).Value = "PhoneNumber";
worksheet.Cell(1, 4).Value = "Email";
worksheet.Cell(1, 5).Value = "Address";
worksheet.Cell(1, 6).Value = "Description";
worksheet.Cell(1, 7).Value = "PhotoPath";
for (var i = 0; i < _allContacts.Count; i++)
{
var contact = _allContacts[i];
worksheet.Cell(2 + i, 1).Value = contact.Id;
worksheet.Cell(2 + i, 2).Value = contact.Name;
worksheet.Cell(2 + i, 3).Value = contact.PhoneNumber;
worksheet.Cell(2 + i, 4).Value = contact.Email;
worksheet.Cell(2 + i, 5).Value = contact.Address;
worksheet.Cell(2 + i, 6).Value = contact.Description;
worksheet.Cell(2 + i, 7).Value = contact.PhotoPath;
}
workbook.SaveAs(localPath);
}
await Share.Default.RequestAsync(new ShareFileRequest
{
Title = "Сохранить контакты",
File = new ShareFile(localPath)
});
}
catch (Exception ex)
{
await DisplayAlert("Ошибка!", $"Не удалось экспортировать: {ex.Message}", "OK");
}
}
private async IAsyncEnumerable<Contact> GetContacts()
{
var contacts = await Contacts.Default.GetAllAsync();
foreach (var userContact in contacts)
{
var contact = new Contact();
if(int.TryParse(userContact.Id, out var id))
contact.Id = id;
contact.Name = userContact.DisplayName;
var firstPhoneNumber = userContact.Phones.FirstOrDefault();
contact.PhoneNumber = firstPhoneNumber != null ?
firstPhoneNumber.PhoneNumber : "";
var firstEmail = userContact.Emails.FirstOrDefault();
contact.Email = firstEmail != null ?
firstEmail.EmailAddress : "";
contact.Address = "";
contact.Description = "";
contact.PhotoPath = "";
yield return contact;
}
}
private async void OnContactSelected(object sender, SelectionChangedEventArgs e)
{
if (e.CurrentSelection.FirstOrDefault() is not Contact selectedContact)
return;
await Navigation.PushAsync(new ContactDetailPage(selectedContact));
contactsList.SelectedItem = null;
}
private async void OnSearchTextChanged(object sender, TextChangedEventArgs e)
{
var searchTerm = e.NewTextValue;
var filteredContacts = await _databaseService.SearchContactsAsync(searchTerm);
contactsList.ItemsSource = filteredContacts;
}
private async void OnAddContactClicked(object sender, EventArgs e)
{
await Navigation.PushAsync(new ContactDetailPage(new Contact()));
}
private async void OnExportContactClicked(object sender, EventArgs e)
{
await ExportToXlsx();
}
private async void SearchBar_TextChanged(object sender, TextChangedEventArgs e)
{
if (string.IsNullOrWhiteSpace(e.NewTextValue))
{
contactsList.ItemsSource = _allContacts;
}
else
{
contactsList.ItemsSource = await _databaseService.SearchContactsAsync(e.NewTextValue);
}
}
}