corp-app/CORP-MAUI/Pages/PostDetailsPage.xaml.cs

108 lines
3.2 KiB
C#

using System.Diagnostics;
using CORP_MAUI.Models;
using CORP_MAUI.ViewModels;
namespace CORP_MAUI.Pages;
public partial class PostDetailsPage : ContentPage
{
private readonly PostDetailsViewModel _viewModel;
public PostDetailsPage(PostViewModel postViewModel)
{
InitializeComponent();
_viewModel = new PostDetailsViewModel(postViewModel);
BindingContext = _viewModel;
// Предзагружаем аватар автора поста
_ = PreloadPostAuthorAvatarAsync();
}
protected override async void OnAppearing()
{
base.OnAppearing();
if (_viewModel.Comments.Count == 0)
{
await LoadCommentsAsync();
}
}
private async Task LoadCommentsAsync()
{
_viewModel.IsLoadingComments = true;
try
{
PaginatedResponse<Comment> response = await ServiceProvider.ApiService.GetCommentsPaginatedAsync(postId: _viewModel.PostViewModel.Post.Id);
_viewModel.Comments.Clear();
if (response.Results != null)
{
foreach (Comment comment in response.Results)
{
_viewModel.Comments.Add(comment);
}
// Предзагружаем аватары авторов комментариев
_ = PreloadCommentAuthorsAvatarsAsync();
}
}
catch (Exception ex)
{
Trace.WriteLine($"[PostDetailsPage] Error loading comments: {ex.Message}");
}
finally
{
_viewModel.IsLoadingComments = false;
}
}
private async Task PreloadPostAuthorAvatarAsync()
{
try
{
var author = _viewModel.PostViewModel.Post.Author;
if (author != null)
{
await ServiceProvider.ApiService.LoadUserAvatarAsync(author);
}
}
catch (Exception ex)
{
Trace.WriteLine($"[PostDetailsPage] Ошибка предзагрузки аватара автора: {ex.Message}");
}
}
private async Task PreloadCommentAuthorsAvatarsAsync()
{
try
{
var authors = _viewModel.Comments
.Where(c => c.Author != null)
.Select(c => c.Author!)
.Distinct()
.ToList();
if (authors.Count > 0)
{
await ServiceProvider.ApiService.PreloadUserAvatarsAsync(authors);
// Обновляем UI - переустанавливаем ItemsSource
await MainThread.InvokeOnMainThreadAsync(() =>
{
CommentsCollectionView.ItemsSource = null;
CommentsCollectionView.ItemsSource = _viewModel.Comments;
});
}
}
catch (Exception ex)
{
Trace.WriteLine($"[PostDetailsPage] Ошибка предзагрузки аватаров комментаторов: {ex.Message}");
}
}
private async void OnCloseClicked(object sender, EventArgs e)
{
await Navigation.PopAsync();
}
}