133 lines
3.9 KiB
C#
133 lines
3.9 KiB
C#
using ClosedXML.Excel;
|
|
using Phonebook.Utils;
|
|
using Contact = Phonebook.Models.Contact;
|
|
|
|
namespace Phonebook.Services;
|
|
|
|
public class ContactService
|
|
{
|
|
private readonly DatabaseService _databaseService;
|
|
|
|
public Action? OnContactsUpdated;
|
|
|
|
public ContactService(DatabaseService databaseService)
|
|
{
|
|
_databaseService = databaseService;
|
|
}
|
|
|
|
public void InvokeUpdateContacts()
|
|
{
|
|
OnContactsUpdated?.Invoke();
|
|
}
|
|
|
|
public async Task ClearAllContacts()
|
|
{
|
|
await _databaseService.ClearAll();
|
|
}
|
|
|
|
public async Task<List<Contact>> GetAllContacts()
|
|
{
|
|
return await IPlatformApplication.Current!.Services.GetService<DatabaseService>()!.GetContactsAsync();
|
|
}
|
|
|
|
private static async IAsyncEnumerable<Contact> GetPhoneContacts()
|
|
{
|
|
var contacts = await Contacts.Default.GetAllAsync();
|
|
|
|
foreach (var userContact in contacts)
|
|
{
|
|
var contact = new Contact();
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
public async Task ImportFromLocalContact()
|
|
{
|
|
var createList = new List<Contact>();
|
|
|
|
await foreach (var phoneContact in GetPhoneContacts())
|
|
{
|
|
var foundId = await _databaseService.SearchIdByNameOrDefault(phoneContact);
|
|
|
|
if(foundId.Id != 0)
|
|
continue;
|
|
|
|
createList.Add(phoneContact);
|
|
}
|
|
|
|
await _databaseService.SaveContactsAsync(createList);
|
|
InvokeUpdateContacts();
|
|
}
|
|
|
|
public async Task ExportToXlsx()
|
|
{
|
|
try
|
|
{
|
|
var 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)
|
|
{
|
|
|
|
}
|
|
}
|
|
} |