@page "/UserCP/{CompanyID:int}" @page "/UserCP/{CompanyID:int}/{ChatID:int?}" @using Common.Dtos.Company @using Common.Dtos.Conversation @using Common.Dtos.Group @using HushianWebApp.Service @using HushianWebApp.Services @inject ChatService ChatService @inject ILocalStorageService localStorageService; @inject AuthService authService; @inject BaseController baseController; @inject CompanyService companyService @inject UserService userService @inject GroupService groupService @inject ChatService chatService @inject IJSRuntime JS @inject ToastService toastService @layout UserPanelLayout
@if (IsEndFirstProcess) { @if (IsLogin) {
@if (LastOpenChat != null) {

@ExperYou

}
@if (LastOpenChat != null) { @if (LastOpenChat.status == Common.Enums.ConversationStatus.InProgress) { } }
@if (LastOpenChat != null && LastOpenChat.Responses != null) {
@{ bool target = false; } @foreach (var msg in LastOpenChat?.Responses) { @if (!target && ((!msg.IsRead && msg.Type != Common.Enums.ConversationType.UE) || LastOpenChat.Responses.Last() == msg)) { target = true;
@if (!msg.IsRead && msg.Type != Common.Enums.ConversationType.UE) {
پیام جدید
}
}
@msg.text
@if (msg.Type == Common.Enums.ConversationType.UE) { if (msg.IsRead) { } else { } }
} @{ target = false; }
} else {

هوشیان

@if (CompanyGroups != null && CompanyGroups.Any()) {
انتخاب گروه:
@foreach (var group in CompanyGroups) {
@if (group.img == null || group.img.Length == 0) { } else { Uploaded Image } @group.Name
}
}
}
@if (LastOpenChat == null || (LastOpenChat != null && LastOpenChat.status != Common.Enums.ConversationStatus.Finished && LastOpenChat.Responses != null)) {
}
} else {
} } else {

در حال بررسی وضعیت ...

}
@code { [Parameter] public int CompanyID { get; set; } [Parameter] public int? ChatID { get; set; } private ConfirmDialog dialog = default!; private bool _shouldObserveVisibility = false; int? GroupID = null; ReadANDUpdate_CompanyDto? CompanyInfo = new(); Common.Dtos.CurrentUserInfo CurrentUser = new(); List CompanyGroups = new(); ChatItemDto? LastOpenChat = new(); string MsgInput = string.Empty; bool chatloading = false; public bool IsLogin { get; set; } = false; public bool IsEndFirstProcess { get; set; } = false; string ExperYou { get { if (CompanyInfo == null) return string.Empty; string value = $"{CompanyInfo.FullName}"; if (GroupID.HasValue) { value += "/" + CompanyGroups.FirstOrDefault(f => f.ID == GroupID.GetValueOrDefault()).Name; } if (LastOpenChat != null && !string.IsNullOrEmpty(LastOpenChat.ExperFullName)) { value += "/" + LastOpenChat.ExperFullName; } return value; } } } @functions { async Task OnClickSendMsg() { if (!string.IsNullOrEmpty(MsgInput)) { if (LastOpenChat != null) { Common.Enums.ConversationType type = Common.Enums.ConversationType.UE; var model = await chatService.ADDChatResponse(LastOpenChat.ID, MsgInput, type); LastOpenChat?.Responses.Add(model); LastOpenChat.LastText = MsgInput; } else { //TODO New Chat var model = await chatService.NewChatFromCurrentUser(new ADD_ConversationDto() { CompanyID = CompanyID, GroupID = GroupID, Question = MsgInput, UserID = 0 }); if (model != null) { LastOpenChat = model; } else toastService.Notify(new ToastMessage(ToastType.Danger, "خطا در گفتگو جدید")); } await Task.Yield(); // Scroll to bottom for user's own messages await JS.InvokeVoidAsync("scrollToBottom", "B1"); MsgInput = string.Empty; } } protected override async Task OnAfterRenderAsync(bool firstRender) { if (_shouldObserveVisibility) { _shouldObserveVisibility = false; await JS.InvokeVoidAsync("observeVisibility", DotNetObjectReference.Create(this)); } } protected override async Task OnInitializedAsync() { await IsOnline(); await base.OnInitializedAsync(); } async Task IsOnline() { var token = await localStorageService.GetItem("U/key"); if (string.IsNullOrEmpty(token)) { IsLogin = false; IsEndFirstProcess = true; } else { await baseController.RemoveToken(); await baseController.SetToken(token); if (!await authService.IsOnline()) { await baseController.RemoveToken(); IsLogin = false; IsEndFirstProcess = true; } else { IsEndFirstProcess = true; await Afterlogin(); } } } async Task Afterlogin() { IsLogin = true; CurrentUser = await userService.GetCurrentUserInfo(); await IsCompany(); } async Task IsCompany() { CompanyInfo = await companyService.GetCompany(CompanyID); if (CompanyInfo != null) CompanyGroups = await groupService.GetGroupsCompany(CompanyID); await IsLastChat(); } async Task IsLastChat() { if (CompanyInfo != null) { if (ChatID.HasValue) LastOpenChat = await ChatService.Getchat(ChatID.GetValueOrDefault()); else LastOpenChat = LastOpenChat = await ChatService.GetLastOpenChatInCompany(CompanyID); if (LastOpenChat != null) { // Always set up visibility observation for chat bubbles _shouldObserveVisibility = true; StateHasChanged(); // Wait for render to complete await Task.Delay(200); // Scroll to target if exists, otherwise scroll to bottom await JS.InvokeVoidAsync("scrollToTargetOrBottom"); } } } [JSInvokable] public async Task MarkAsRead(int id) { var msg = LastOpenChat.Responses.FirstOrDefault(m => m.ID == id); if (msg != null && !msg.IsRead && msg.Type != Common.Enums.ConversationType.UE) { msg.IsRead = true; await chatService.MarkAsReadChatItemAsync(id); // StateHasChanged(); } await Task.CompletedTask; } // Method to handle new messages from other users public async Task HandleNewMessage() { if (LastOpenChat?.Responses != null) { var hasUnreadMessages = LastOpenChat.Responses.Any(m => !m.IsRead && m.Type != Common.Enums.ConversationType.UE); if (hasUnreadMessages) { await JS.InvokeVoidAsync("autoScrollToNewMessage"); } } } async Task NewChat() { LastOpenChat = null; } async Task CloseChat() { var options = new ConfirmDialogOptions { YesButtonText = "بله", YesButtonColor = ButtonColor.Success, NoButtonText = "انصراف", NoButtonColor = ButtonColor.Danger }; var confirmation = await dialog.ShowAsync( title: "پایان دادن به گفتگو", message1: "اطمینان دارید ؟", confirmDialogOptions: options); if (confirmation) { if (await chatService.ChatIsFinishFromUser(LastOpenChat.ID)) { LastOpenChat.status = Common.Enums.ConversationStatus.Finished; StateHasChanged(); } } } async Task Logout() { await baseController.RemoveToken(); await localStorageService.RemoveItem("U/key"); IsLogin = false; StateHasChanged(); } async Task SelectGroup(int groupId) { GroupID = groupId; StateHasChanged(); } private string GetImageSource(byte[] bytes) => $"data:image/jpeg;base64,{Convert.ToBase64String(bytes)}"; private async Task HandleKeyDown(KeyboardEventArgs e) { if (e.Key == "Enter") await OnClickSendMsg(); } }