172 lines
6.0 KiB
C#
172 lines
6.0 KiB
C#
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;
|
||
}
|
||
}
|
||
|