@page "/doctor/chat" @attribute [Authorize(Roles = UserRoles.Doctor)] @layout DoctorLayout @inject IDoctorManagementService DoctorManagementService @inject IAuthenticationService AuthenticationService @inject IJSRuntime JSRuntime

Chat with Patients

@if (!string.IsNullOrEmpty(statusMessage)) { }
@foreach (var patient in patients) { }
@if (selectedPatient != null) {
Chat with @selectedPatient.Name
@foreach (var message in messages) {
@(message.UserId == userInfo.Id ? "You" : selectedPatient.Name): @message.Content
}
}
@code { private string statusMessage = string.Empty; private bool isSuccess; private List patients = new(); private Patient selectedPatient; private List messages = new(); private string newMessage = string.Empty; private UserInformation userInfo; private Timer? refreshTimer; private const int refreshPeriod = 2000; // Refresh every 2000 milliseconds (2 seconds) protected override async Task OnInitializedAsync() { userInfo = await AuthenticationService.GetUserInformation(); patients = await DoctorManagementService.GetAllPatientsAsync(); StartOrResetTimer(); } private void StartOrResetTimer() { if (refreshTimer != null) { refreshTimer.Change(Timeout.Infinite, 0); // Stop the timer if already running } refreshTimer = new Timer(async _ => await RefreshChat(), null, 0, refreshPeriod); } private async Task RefreshChat() { if (selectedPatient != null) { var chat = await DoctorManagementService.GetConversationAsync(userInfo.Id, selectedPatient.Id); messages = chat?.Messages ?? new List(); await InvokeAsync(StateHasChanged); // Re-render the component on UI thread } } private async Task OpenChat(Guid patientId, string patientName) { selectedPatient = new Patient { Id = patientId, Name = patientName }; await RefreshChat(); StartOrResetTimer(); // Restart the timer whenever a new chat is opened } private void CloseChat() { selectedPatient = null; messages.Clear(); refreshTimer?.Change(Timeout.Infinite, 0); // Stop the timer when chat is closed StateHasChanged(); } private async Task SendMessage() { if (!string.IsNullOrWhiteSpace(newMessage) && selectedPatient != null) { var success = await DoctorManagementService.SendMessageAsync(userInfo.Id, selectedPatient.Id, newMessage); if (success) { messages.Add(new Message(userInfo.Id, newMessage)); newMessage = string.Empty; StateHasChanged(); } else { statusMessage = "Failed to send message."; isSuccess = false; } } } private void HandleKeyDown(KeyboardEventArgs e) { if (e.Key == "Enter" && !string.IsNullOrWhiteSpace(newMessage)) { SendMessage().GetAwaiter().GetResult(); } } public void Dispose() { refreshTimer?.Dispose(); } }