180 lines
5.4 KiB
C#
180 lines
5.4 KiB
C#
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);
|
||
}
|
||
}
|
||
} |