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

172 lines
6.0 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 System.Collections.ObjectModel;
using System.Diagnostics;
using CORP_MAUI.Models;
namespace CORP_MAUI.Pages;
public partial class UsersPage : ContentPage
{
private readonly ObservableCollection<User> _users;
private List<User> _allUsers = new();
public UsersPage()
{
try
{
Trace.WriteLine("=== USERSPAGE CONSTRUCTOR START ===");
Trace.WriteLine("[UsersPage] >>> Вызов InitializeComponent");
InitializeComponent();
Trace.WriteLine("[UsersPage] >>> InitializeComponent завершен");
_users = new ObservableCollection<User>();
UsersCollectionView.ItemsSource = _users;
Trace.WriteLine("[UsersPage] >>> Подписка на UserStatusChanged");
// Подписываемся на изменения статуса пользователей
ServiceProvider.WebSocketService.UserStatusChanged += OnUserStatusChanged;
Trace.WriteLine("[UsersPage] >>> Запуск LoadUsersAsync");
// Загружаем пользователей
_ = LoadUsersAsync();
Trace.WriteLine("=== USERSPAGE CONSTRUCTOR END ===");
}
catch (Exception ex)
{
Trace.WriteLine("=== USERSPAGE CONSTRUCTOR ERROR ===");
Trace.WriteLine($"[UsersPage] ❌ Тип ошибки: {ex.GetType().FullName}");
Trace.WriteLine($"[UsersPage] ❌ Сообщение: {ex.Message}");
Trace.WriteLine($"[UsersPage] ❌ StackTrace: {ex.StackTrace}");
// Показываем ошибку напрямую
Task.Run(async () =>
{
await Task.Delay(100);
Page? mainPage = Application.Current?.Windows[0]?.Page;
if (mainPage != null)
{
await mainPage.DisplayAlert("Ошибка UsersPage",
$"Ошибка инициализации:\n{ex.Message}\n\nStackTrace:\n{ex.StackTrace}", "OK");
}
});
throw;
}
}
private async Task LoadUsersAsync()
{
try
{
Trace.WriteLine("[UsersPage] >>> LoadUsersAsync START");
LoadingIndicator.IsVisible = true;
LoadingIndicator.IsRunning = true;
Trace.WriteLine("[UsersPage] >>> Вызов GetAllEmployeesAsync");
_allUsers = await ServiceProvider.ApiService.GetAllEmployeesAsync();
Trace.WriteLine($"[UsersPage] >>> Получено пользователей: {_allUsers.Count}");
_users.Clear();
foreach (User user in _allUsers.OrderBy(u => u.FullName))
{
_users.Add(user);
}
Trace.WriteLine($"[UsersPage] ✅ Пользователи загружены успешно");
}
catch (Exception ex)
{
Trace.WriteLine($"[UsersPage] ❌ Ошибка загрузки: {ex.GetType().Name}");
Trace.WriteLine($"[UsersPage] Message: {ex.Message}");
Trace.WriteLine($"[UsersPage] StackTrace: {ex.StackTrace}");
await DisplayAlert("Ошибка", $"Не удалось загрузить список пользователей:\n{ex.Message}", "OK");
}
finally
{
LoadingIndicator.IsVisible = false;
LoadingIndicator.IsRunning = false;
RefreshView.IsRefreshing = false;
}
}
private async void OnRefreshing(object sender, EventArgs e)
{
await LoadUsersAsync();
}
private async void OnUserSelected(object sender, SelectionChangedEventArgs e)
{
if (e.CurrentSelection.FirstOrDefault() is User selectedUser)
{
// Сбрасываем выбор
UsersCollectionView.SelectedItem = null;
// Переходим на страницу чата
await Navigation.PushAsync(new ChatPage(selectedUser));
}
}
private void OnSearchTextChanged(object sender, TextChangedEventArgs e)
{
string searchText = e.NewTextValue?.ToLower() ?? string.Empty;
if (string.IsNullOrWhiteSpace(searchText))
{
// Показываем всех пользователей
_users.Clear();
foreach (User user in _allUsers.OrderBy(u => u.FullName))
{
_users.Add(user);
}
}
else
{
// Фильтруем пользователей
List<User> filtered = _allUsers.Where(u =>
u.FullName.ToLower().Contains(searchText) ||
u.Username.ToLower().Contains(searchText) ||
u.DepartmentName.ToLower().Contains(searchText) ||
u.PositionName.ToLower().Contains(searchText)
).ToList();
_users.Clear();
foreach (User user in filtered.OrderBy(u => u.FullName))
{
_users.Add(user);
}
}
}
private void OnUserStatusChanged(object? sender, User updatedUser)
{
// Обновляем статус пользователя в списке
MainThread.BeginInvokeOnMainThread(() =>
{
User? user = _users.FirstOrDefault(u => u.Id == updatedUser.Id);
if (user != null)
{
user.IsOnline = updatedUser.IsOnline;
}
// Обновляем в основном списке
User? allUser = _allUsers?.FirstOrDefault(u => u.Id == updatedUser.Id);
if (allUser != null)
{
allUser.IsOnline = updatedUser.IsOnline;
}
});
}
protected override void OnDisappearing()
{
base.OnDisappearing();
ServiceProvider.WebSocketService.UserStatusChanged -= OnUserStatusChanged;
}
}