/
kochkatech
/
Queue
Обзор
Документация
Войти
/
kochkatech
/
Queue
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
dev
src/Queue.Display/ViewModels/BoardViewModel.cs
82 строки
3 KB
kochkareal
feat: табло очереди
24 июл 2026, 22:27
24 июл 2026, 22:27
2805d52
Код
Авторство
О чём код?
using System; using System.Collections.ObjectModel; using System.Linq; using System.Media; using System.Threading.Tasks; using System.Windows.Threading; using CommunityToolkit.Mvvm.ComponentModel; using Queue.Display.Models; using Queue.Display.Services; namespace Queue.Display.ViewModels; public partial class BoardViewModel : ObservableObject { private readonly QueueApiClient _apiClient; private readonly DispatcherTimer _pollTimer; private DateTime _lastAnnouncedCallAt = DateTime.MinValue; // Вызовы, предшествующие текущему (CurrentCall из этого списка исключён — см. RefreshAsync). public ObservableCollection<BoardTicketDto> RecentCalls { get; } = new(); public ObservableCollection<BoardTicketDto> Waiting { get; } = new(); [ObservableProperty] private BoardTicketDto? currentCall; [ObservableProperty] private int waitingCount; public BoardViewModel(QueueApiClient apiClient) { _apiClient = apiClient; _apiClient.QueueChanged += async () => await RefreshAsync(); // Резервный опрос — если соединение SignalR незаметно оборвётся, табло не должно "зависнуть". _pollTimer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(20) }; _pollTimer.Tick += async (_, _) => await RefreshAsync(); _pollTimer.Start(); _ = RefreshAsync(); } private async Task RefreshAsync() { var snapshot = await _apiClient.GetBoardAsync(); if (snapshot is null) { return; } CurrentCall = snapshot.ActiveCalls.FirstOrDefault(); RecentCalls.Clear(); foreach (var call in snapshot.ActiveCalls.Skip(1)) { RecentCalls.Add(call); } Waiting.Clear(); foreach (var ticket in snapshot.Waiting) { Waiting.Add(ticket); } WaitingCount = snapshot.Waiting.Count; var newestCall = snapshot.ActiveCalls .Where(c => c.CalledAt.HasValue) .Select(c => c.CalledAt!.Value) .DefaultIfEmpty(DateTime.MinValue) .Max(); if (newestCall > _lastAnnouncedCallAt) { _lastAnnouncedCallAt = newestCall; if (_lastAnnouncedCallAt != DateTime.MinValue) { // Системный звук — без внешних аудиофайлов, работает на любой чистой установке Windows. SystemSounds.Asterisk.Play(); } } } }