diff --git a/Hushian.Application/Services/ChatService.cs b/Hushian.Application/Services/ChatService.cs index bed5466..7b5d735 100644 --- a/Hushian.Application/Services/ChatService.cs +++ b/Hushian.Application/Services/ChatService.cs @@ -272,11 +272,44 @@ namespace Hushian.Application.Services return Response; } - public async Task FinishChat(int ChatID) + public async Task FinishChat(int ChatID, int CompanyID) { var convModel = await _ConversationRepository.Get() .Include(inc => inc.ConversationResponses) - .FirstOrDefaultAsync(w => w.ID == ChatID); + .FirstOrDefaultAsync(w => w.ID == ChatID && w.CompanyID==CompanyID); + + if (convModel != null && convModel.Status != ConversationStatus.Finished) + { + convModel.Status = ConversationStatus.Finished; + convModel.FinishedDateTime = DateTime.Now; + return await _ConversationRepository.UPDATEBool(convModel); + } + + return true; + } + public async Task OpenChat(int ChatID, int CompanyID,int? ExperID) + { + var convModel = await _ConversationRepository.Get() + .Include(inc => inc.ConversationResponses) + .FirstOrDefaultAsync(w => + w.ID == ChatID + && w.CompanyID == CompanyID + && ExperID.HasValue ? w.ConversationResponses.Any(a=>a.ExperID==ExperID.GetValueOrDefault()) :true); + + if (convModel != null && convModel.Status == ConversationStatus.Finished) + { + convModel.Status = ConversationStatus.InProgress; + convModel.FinishedDateTime = null; + return await _ConversationRepository.UPDATEBool(convModel); + } + + return true; + } + public async Task FinishChatFromUser(int ChatID, int userID) + { + var convModel = await _ConversationRepository.Get() + .Include(inc => inc.ConversationResponses) + .FirstOrDefaultAsync(w => w.ID == ChatID && w.UserID == userID); if (convModel != null && convModel.Status != ConversationStatus.Finished) { diff --git a/Presentation/Hushian.WebApi/Controllers/v1/ChatController.cs b/Presentation/Hushian.WebApi/Controllers/v1/ChatController.cs index a6f23ed..66a17e9 100644 --- a/Presentation/Hushian.WebApi/Controllers/v1/ChatController.cs +++ b/Presentation/Hushian.WebApi/Controllers/v1/ChatController.cs @@ -122,11 +122,60 @@ namespace Hushian.WebApi.Controllers.v1 return Response.Success ? Ok(Response.Value) : BadRequest(Response.Errors); } - [HttpGet("ChatIsFinish/{ChatID}")] + [HttpPut("ChatIsFinish/{ChatID}")] [Authorize(Roles = "Company,Exper")] public async Task ChatIsFinish(int ChatID) { - return await _chatService.FinishChat(ChatID) ? NoContent() + + int CompanyID = 0; + if (User.IsInRole("Exper")) + { + string strExperID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => s.Value).First(); + int ExperID = Convert.ToInt32(strExperID); + + CompanyID = await _experService.GetCompanyIDExper(ExperID); + } + else if (User.IsInRole("Company")) + { + string strCompanyID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => s.Value).First(); + CompanyID = Convert.ToInt32(strCompanyID); + } + + return await _chatService.FinishChat(ChatID, CompanyID) ? NoContent() + : BadRequest(new List { "خطا در بروزرسانی وضعیت" }); + } + [HttpPut("OpenChat/{ChatID}")] + [Authorize(Roles = "Company,Exper")] + public async Task OpenChat(int ChatID) + { + + int CompanyID = 0; + int? ExperID =null; + if (User.IsInRole("Exper")) + { + string strExperID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => s.Value).First(); + ExperID = Convert.ToInt32(strExperID); + + CompanyID = await _experService.GetCompanyIDExper(ExperID.GetValueOrDefault()); + } + else if (User.IsInRole("Company")) + { + string strCompanyID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => s.Value).First(); + CompanyID = Convert.ToInt32(strCompanyID); + } + + return await _chatService.OpenChat(ChatID, CompanyID, ExperID) ? NoContent() + : BadRequest(new List { "خطا در بروزرسانی وضعیت" }); + } + [HttpPut("ChatIsFinishFromUser/{ChatID}")] + [Authorize(Roles = "User")] + public async Task ChatIsFinishFromUser(int ChatID) + { + string strUserID = User.Claims.Where(w => w.Type == CustomClaimTypes.Uid).Select(s => s.Value).First(); + int UserID = Convert.ToInt32(strUserID); + + + return await _chatService.FinishChatFromUser(ChatID, UserID) ? NoContent() : BadRequest(new List { "خطا در بروزرسانی وضعیت" }); } [HttpPut("MarkAsReadChatItem/{ConversationItemID}")] diff --git a/Presentation/Hushian.WebApi/appsettings.json b/Presentation/Hushian.WebApi/appsettings.json index 478d85e..7c10eb1 100644 --- a/Presentation/Hushian.WebApi/appsettings.json +++ b/Presentation/Hushian.WebApi/appsettings.json @@ -27,7 +27,7 @@ "Key": "84322CFB66934ECC86D547C5CF4F2EFC", "Audience": "MMRbnjd", "Issuer": "MMRbnjd", - "DurationInMinutes": 60 + "DurationInMinutes": 6000 }, "AllowedHosts": "*" } diff --git a/Presentation/HushianWebApp/Pages/Chat.razor b/Presentation/HushianWebApp/Pages/Chat.razor index eb38b5c..ad6364d 100644 --- a/Presentation/HushianWebApp/Pages/Chat.razor +++ b/Presentation/HushianWebApp/Pages/Chat.razor @@ -8,6 +8,8 @@ @inject GroupService groupService @inject UserService userService @inject IJSRuntime JS +@inject ToastService toastService + گفتمان
@@ -64,11 +66,11 @@ @item.GroupName
} - +
@item.LastMsgdate @item.LastMsgtime - +
@item.LastText
@@ -152,11 +154,7 @@ @if (ChatCurrent.status == Common.Enums.ConversationStatus.InProgress) { @@ -167,7 +165,8 @@ else if (ChatCurrent.status == Common.Enums.ConversationStatus.Finished && (CurrentUser.Role == "Company" || ChatCurrent.ExperID == CurrentUser.ExperID)) { - @@ -283,7 +282,7 @@ bool chatloading = false; string SelectedChatUserName = "مهدی ربیع نژاد"; private bool _shouldObserveVisibility = false; - + private ConfirmDialog dialog = default!; } @functions { @@ -351,7 +350,7 @@ chatloading = true; SelectedChatUserName = "در حال گفتگو با " + chatItem.UserFullName; ChatCurrent = chatItem; - + _shouldObserveVisibility = true; // فعال کن تا در OnAfterRenderAsync صدا زده بشه StateHasChanged(); // مجبور کن Blazor رندر کنه @@ -367,8 +366,50 @@ msg.IsRead = true; await chatService.MarkAsReadChatItemAsync(id); } - // StateHasChanged(); + // StateHasChanged(); await Task.CompletedTask; + } + async Task OpenChat() + { + if (CurrentUser.Role == "Company" || CurrentUser.Role == "Exper" && ChatCurrent.ExperID==CurrentUser.ExperID) + { + if (ChatCurrent.status != Common.Enums.ConversationStatus.Finished) return; + if (await chatService.OpenChat(ChatCurrent.ID)) + { + ChatCurrent.status = Common.Enums.ConversationStatus.InProgress; + StateHasChanged(); + } + } + else toastService.Notify(new ToastMessage(ToastType.Danger, "دسترسی به این گفتگو ندارید")); + + } + async Task CloseChat() + { + if (ChatCurrent.status == Common.Enums.ConversationStatus.Finished) return; + 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.ChatIsFinish(ChatCurrent.ID)) + { + ChatCurrent.status = Common.Enums.ConversationStatus.Finished; + StateHasChanged(); + } + } + + + } } diff --git a/Presentation/HushianWebApp/Pages/FromUserSide/UserCP.razor b/Presentation/HushianWebApp/Pages/FromUserSide/UserCP.razor index 349bf3d..75d588a 100644 --- a/Presentation/HushianWebApp/Pages/FromUserSide/UserCP.razor +++ b/Presentation/HushianWebApp/Pages/FromUserSide/UserCP.razor @@ -16,6 +16,8 @@ @inject IJSRuntime JS @inject ToastService toastService @layout UserPanelLayout + +
@if (IsEndFirstProcess) @@ -33,11 +35,11 @@ { @if (LastOpenChat.status == Common.Enums.ConversationStatus.InProgress) { - } - } @@ -105,7 +107,7 @@ @foreach (var group in CompanyGroups) {
+ @onclick="() => SelectGroup(group.ID)">
@if (group.img == null || group.img.Length == 0) { @@ -133,7 +135,7 @@
- + @@ -170,6 +172,7 @@ @code { [Parameter] public int CompanyID { get; set; } [Parameter] public int? ChatID { get; set; } + private ConfirmDialog dialog = default!; private bool _shouldObserveVisibility = false; int? GroupID = null; @@ -297,7 +300,7 @@ { if (ChatID.HasValue) LastOpenChat = await ChatService.Getchat(ChatID.GetValueOrDefault()); else LastOpenChat = LastOpenChat = await ChatService.GetLastOpenChatInCompany(CompanyID); - + if (LastOpenChat != null) { @@ -337,6 +340,37 @@ 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() { @@ -345,7 +379,6 @@ IsLogin = false; StateHasChanged(); } - async Task SelectGroup(int groupId) { GroupID = groupId; @@ -353,7 +386,10 @@ } private string GetImageSource(byte[] bytes) => $"data:image/jpeg;base64,{Convert.ToBase64String(bytes)}"; - + private async Task HandleKeyDown(KeyboardEventArgs e) + { + if (e.Key == "Enter") await OnClickSendMsg(); + } }