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

129 lines
3.9 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 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;
}
}