@page "/patient/chat" @attribute [Authorize(Roles = UserRoles.Patient)] @layout PatientLayout @inject IPatientManagementService PatientManagementService @inject IAuthenticationService AuthenticationService @inject IJSRuntime JSRuntime

Chat with Doctors

@if (!string.IsNullOrEmpty(statusMessage)) { }
@foreach (var doctor in doctors) { }
@if (selectedDoctor != null) {
Chat with Dr. @selectedDoctor.Name
@foreach (var message in messages) {
@(message.UserId == userInfo.Id ? "You" : "Dr. " + selectedDoctor.Name): @message.Content
}
}
@code { private string statusMessage = string.Empty; private bool isSuccess; private List doctors = []; private Doctor selectedDoctor; private List messages = []; 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(); doctors = await PatientManagementService.GetAllDoctorsAsync(); 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 (selectedDoctor != null) { var chat = await PatientManagementService.GetConversationAsync(userInfo.Id, selectedDoctor.Id); messages = chat?.Messages ?? new List(); await InvokeAsync(StateHasChanged); // Re-render the component on UI thread } } private async Task OpenChat(Guid doctorId, string doctorName) { selectedDoctor = new Doctor { Id = doctorId, Name = doctorName }; await RefreshChat(); StartOrResetTimer(); // Restart the timer whenever a new chat is opened } private void CloseChat() { selectedDoctor = null; messages.Clear(); refreshTimer?.Change(Timeout.Infinite, 0); // Stop the timer when chat is closed StateHasChanged(); } private async Task SendMessage() { if (!string.IsNullOrWhiteSpace(newMessage) && selectedDoctor != null) { var success = await PatientManagementService.SendMessageAsync(userInfo.Id, selectedDoctor.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(); } }