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 @@
}
@@ -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;
+ }
+
}