From 7a28196cdea355832c8e047b080e6d37e9c07cfc Mon Sep 17 00:00:00 2001 From: mmrbnjd Date: Tue, 12 Aug 2025 22:38:27 +0330 Subject: [PATCH] ... --- Presentation/HushianWebApp/Pages/Chat.razor | 473 +++++++++++++++++++- 1 file changed, 471 insertions(+), 2 deletions(-) diff --git a/Presentation/HushianWebApp/Pages/Chat.razor b/Presentation/HushianWebApp/Pages/Chat.razor index f08b9b0..8471218 100644 --- a/Presentation/HushianWebApp/Pages/Chat.razor +++ b/Presentation/HushianWebApp/Pages/Chat.razor @@ -289,11 +289,67 @@
- - + + + + +
+ + @if (SelectedImagePreview != null) + { +
+ preview + +
+ } + + + @if (RecordedAudioBytes != null) + { +
+
+ +
+ @RecordedAudioDuration +
+
+ +
+ } + + @if (IsRecording) + { +
+
+ + در حال ضبط... @RecordingTime +
+
+ }
} @@ -318,6 +374,19 @@ ///////////// ChatItemDto? ChatCurrent { get; set; } = null; string MsgInput { get; set; } + IBrowserFile? SelectedImageFile = null; + byte[]? SelectedImageBytes = null; + string? SelectedImagePreview = null; + + // Audio recording properties + bool IsRecording = false; + string RecordingTime = "00:00"; + byte[]? RecordedAudioBytes = null; + string? RecordedAudioUrl = null; + string RecordedAudioDuration = "00:00"; + private System.Threading.Timer? recordingTimer; + private DateTime recordingStartTime; + bool chatloading = false; string SelectedChatUserName = "مهدی ربیع نژاد"; private bool _shouldObserveVisibility = false; @@ -548,9 +617,145 @@ var seconds = durationSeconds % 60; return $"{minutes:D2}:{seconds:D2}"; } + + // Audio recording methods + private async Task ToggleAudioRecording() + { + if (IsRecording) + { + await StopAudioRecording(); + } + else + { + await StartAudioRecording(); + } + } + private async Task StartAudioRecording() + { + try + { + var result = await JS.InvokeAsync("startAudioRecording"); + if (result) + { + IsRecording = true; + recordingStartTime = DateTime.Now; + recordingTimer = new System.Threading.Timer(UpdateRecordingTime, null, 0, 1000); + StateHasChanged(); + } + else + { + toastService.Notify(new ToastMessage(ToastType.Warning, "خطا در شروع ضبط صدا")); + } + } + catch (Exception ex) + { + toastService.Notify(new ToastMessage(ToastType.Danger, $"خطا در ضبط صدا: {ex.Message}")); + } + } + private async Task StopAudioRecording() + { + try + { + var audioData = await JS.InvokeAsync("stopAudioRecording"); + if (!string.IsNullOrEmpty(audioData)) + { + // Convert base64 to bytes + var base64Data = audioData.Split(',')[1]; + RecordedAudioBytes = Convert.FromBase64String(base64Data); + RecordedAudioUrl = audioData; + RecordedAudioDuration = RecordingTime; + + IsRecording = false; + recordingTimer?.Dispose(); + recordingTimer = null; + await ClearSelectedImage(); + StateHasChanged(); + } + } + catch (Exception ex) + { + toastService.Notify(new ToastMessage(ToastType.Danger, $"خطا در توقف ضبط صدا: {ex.Message}")); + } + finally + { + IsRecording = false; + recordingTimer?.Dispose(); + recordingTimer = null; + StateHasChanged(); + } + } + private void UpdateRecordingTime(object? state) + { + var elapsed = DateTime.Now - recordingStartTime; + RecordingTime = $"{elapsed.Minutes:D2}:{elapsed.Seconds:D2}"; + InvokeAsync(StateHasChanged); + } + private Task ClearRecordedAudio() + { + RecordedAudioBytes = null; + RecordedAudioUrl = null; + RecordedAudioDuration = "00:00"; + return Task.CompletedTask; + } + private async Task OpenFileDialog() + { + await JS.InvokeVoidAsync("triggerClick", "chatImageInput"); + } + private async Task OnImageSelected(InputFileChangeEventArgs e) + { + var file = e.File; + if (file is null) + { + SelectedImageFile = null; + SelectedImageBytes = null; + SelectedImagePreview = null; + return; + } + + SelectedImageFile = file; + using var memoryStream = new MemoryStream(); + await file.OpenReadStream().CopyToAsync(memoryStream); + SelectedImageBytes = memoryStream.ToArray(); + SelectedImagePreview = $"data:{file.ContentType};base64,{Convert.ToBase64String(SelectedImageBytes)}"; + await ClearRecordedAudio(); + } + private Task ClearSelectedImage() + { + SelectedImageFile = null; + SelectedImageBytes = null; + SelectedImagePreview = null; + return Task.CompletedTask; + } + }