129 lines
3.9 KiB
C#
129 lines
3.9 KiB
C#
using System.Collections.ObjectModel;
|
||
using CORP_MAUI.Models;
|
||
using CORP_MAUI.Services;
|
||
|
||
namespace CORP_MAUI.Pages;
|
||
|
||
public partial class UsersPage : ContentPage
|
||
{
|
||
private readonly ObservableCollection<User> _users;
|
||
private List<User> _allUsers = new();
|
||
|
||
public UsersPage()
|
||
{
|
||
InitializeComponent();
|
||
|
||
_users = new ObservableCollection<User>();
|
||
|
||
UsersCollectionView.ItemsSource = _users;
|
||
|
||
// Подписываемся на изменения статуса пользователей
|
||
ServiceProvider.WebSocketService.UserStatusChanged += OnUserStatusChanged;
|
||
|
||
// Загружаем пользователей
|
||
_ = LoadUsersAsync();
|
||
}
|
||
|
||
private async Task LoadUsersAsync()
|
||
{
|
||
try
|
||
{
|
||
LoadingIndicator.IsVisible = true;
|
||
LoadingIndicator.IsRunning = true;
|
||
|
||
_allUsers = await ServiceProvider.ApiService.GetEmployeesAsync();
|
||
|
||
_users.Clear();
|
||
foreach (var user in _allUsers.OrderBy(u => u.FullName ?? u.Username))
|
||
{
|
||
_users.Add(user);
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
await DisplayAlert("Ошибка", $"Не удалось загрузить список пользователей: {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)
|
||
{
|
||
var searchText = e.NewTextValue?.ToLower() ?? string.Empty;
|
||
|
||
if (string.IsNullOrWhiteSpace(searchText))
|
||
{
|
||
// Показываем всех пользователей
|
||
_users.Clear();
|
||
foreach (var user in _allUsers.OrderBy(u => u.FullName ?? u.Username))
|
||
{
|
||
_users.Add(user);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// Фильтруем пользователей
|
||
var filtered = _allUsers.Where(u =>
|
||
(u.FullName?.ToLower().Contains(searchText) ?? false) ||
|
||
(u.Username?.ToLower().Contains(searchText) ?? false) ||
|
||
(u.Department?.ToLower().Contains(searchText) ?? false) ||
|
||
(u.Position?.ToLower().Contains(searchText) ?? false)
|
||
).ToList();
|
||
|
||
_users.Clear();
|
||
foreach (var user in filtered.OrderBy(u => u.FullName ?? u.Username))
|
||
{
|
||
_users.Add(user);
|
||
}
|
||
}
|
||
}
|
||
|
||
private void OnUserStatusChanged(object? sender, User updatedUser)
|
||
{
|
||
// Обновляем статус пользователя в списке
|
||
MainThread.BeginInvokeOnMainThread(() =>
|
||
{
|
||
var user = _users.FirstOrDefault(u => u.Id == updatedUser.Id);
|
||
if (user != null)
|
||
{
|
||
user.IsOnline = updatedUser.IsOnline;
|
||
}
|
||
|
||
// Обновляем в основном списке
|
||
var 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;
|
||
}
|
||
}
|
||
|