-
+
@@ -106,11 +106,14 @@
{{file.title}}
-
+
+
{{file.description}}
•
- {{msg.displayType}}
+ {{msg.displayType}}
-
+
@@ -238,30 +245,36 @@
+
+
-
-
+
-
+
+
-
+
-
diff --git a/src/app/shared/chat/messages/messages.page.ts b/src/app/shared/chat/messages/messages.page.ts
index 2bc888dd0..cf9219240 100644
--- a/src/app/shared/chat/messages/messages.page.ts
+++ b/src/app/shared/chat/messages/messages.page.ts
@@ -19,7 +19,6 @@ import { ThemeService } from 'src/app/services/theme.service'
import { ViewMediaPage } from 'src/app/modals/view-media/view-media.page';
import { SqliteService } from 'src/app/services/sqlite.service';
import { StorageService } from 'src/app/services/storage.service';
-import { Directory, Filesystem } from '@capacitor/filesystem';
import { ViewEventPage } from 'src/app/modals/view-event/view-event.page';
import { Storage } from '@ionic/storage';
import { WsChatMethodsService } from 'src/app/services/chat/ws-chat-methods.service'
@@ -34,6 +33,8 @@ import { ProcessesService } from 'src/app/services/processes.service';
import { FileToBase64Service } from 'src/app/services/file/file-to-base64.service';
import { Camera, CameraResultType, CameraSource } from '@capacitor/camera';
import { DocumentViewer, DocumentViewerOptions } from '@ionic-native/document-viewer';
+import { VoiceRecorder, VoiceRecorderPlugin, RecordingData, GenericResponse, CurrentRecordingStatus } from 'capacitor-voice-recorder';
+import { Filesystem, Directory, Encoding } from '@capacitor/filesystem';
const IMAGE_DIR = 'stored-images';
@Component({
@@ -78,7 +79,16 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
downloadFile: any;
massages: MessageService[] = []
- showAvatar = true
+ showAvatar = true;
+
+ recording = false;
+ allowTyping = true;
+ storedFileNames = [];
+ lastAudioRecorded = '';
+ audioRecorded:any = "";
+ audioDownloaded:any = "";
+ durationDisplay = '';
+ duration = 0;
constructor(
public popoverController: PopoverController,
@@ -136,7 +146,8 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
this.scrollToBottom();
this.getChatMembers();
-
+ VoiceRecorder.requestAudioRecordingPermission();
+ this.loadFiles();
}
@@ -209,6 +220,100 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
this.currentPosition = scroll;
}
+ calculateDuration() {
+ if (!this.recording) {
+ this.duration = 0;
+ this.durationDisplay = '';
+ return;
+ }
+ this.duration += 1;
+ const minutes = Math.floor(this.duration / 60);
+ const seconds = (this.duration % 60).toString().padStart(2, '0');
+ this.durationDisplay = `${minutes}:${seconds}`;
+
+ setTimeout(() => {
+ this.calculateDuration();
+ }, 1000)
+ }
+
+ async getFile(fileName?:any){
+ const audioFile = await Filesystem.readFile({
+ path: fileName,
+ directory: Directory.Data
+ })
+ //console.log(audioFile);
+ const base64sound = audioFile.data;
+
+ //Converting base64 to blob
+ const base64 = await fetch(base64sound);
+ //console.log(base64);
+
+ const base64Response = await fetch(`data:audio/ogg;base64,${base64sound}`);
+ //console.log(base64Response);
+
+ this.audioRecorded = base64Response.url;
+
+ console.log(this.audioRecorded);
+
+ }
+
+ async loadFiles() {
+ Filesystem.readdir({
+ path: '',
+ directory: Directory.Data
+ }).then(result => {
+ console.log(result);
+ this.storedFileNames = result.files.reverse();
+ this.lastAudioRecorded = this.storedFileNames[0];
+ this.getFile(this.lastAudioRecorded);
+ })
+ }
+
+ startRecording() {
+ console.log('Recording');
+
+ if (this.recording) {
+ return;
+ }
+ this.recording = true;
+ VoiceRecorder.startRecording();
+ this.calculateDuration();
+ }
+
+ stopRecording() {
+ this.allowTyping = false;
+ console.log('Stop');
+ if (!this.recording) {
+ return;
+ }
+ this.recording = false;
+ VoiceRecorder.stopRecording().then(async (result: RecordingData) => {
+ this.recording = false;
+ if (result.value && result.value.recordDataBase64) {
+ const recordData = result.value.recordDataBase64;
+ const fileName = new Date().getTime() + ".wav";
+ await Filesystem.writeFile({
+ path: fileName,
+ directory: Directory.Data,
+ data: recordData,
+ })
+ }
+ })
+ setTimeout(async () => {
+ this.loadFiles();
+ }, 500);
+ }
+
+ async deleteRecording(fileName){
+ await Filesystem.deleteFile({
+ directory: Directory.Data,
+ path: fileName
+ });
+ this.allowTyping = true;
+ this.lastAudioRecorded = '';
+ this.loadFiles();
+ }
+
ngOnDestroy() {
this.checktimeOut = false;
window.removeEventListener('scroll', this.scrollChangeCallback, true);
@@ -250,6 +355,38 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
this.wsChatMethodsService.getDmRoom(this.roomId).send({})
}
+ async sendAudio(fileName) {
+ const roomId = this.roomId
+ const audioFile = await Filesystem.readFile({
+ path: fileName,
+ directory: Directory.Data
+ })
+ const base64sound = audioFile.data;
+ const base64Response = await fetch(`data:audio/aac;base64,${base64sound}`);
+ const blob = await base64Response.blob();
+
+ const formData = new FormData();
+ formData.append("blobFile", blob);
+
+ this.wsChatMethodsService.getDmRoom(roomId).send({
+ file: {
+ "type": "aplication/audio",
+ /* "guid": '', */
+ },
+ attachments: [{
+ "title": fileName ,
+ "title_link": `data:audio/aac;base64,${base64sound}`,
+ "title_link_download": true,
+ "type": "file"
+ }],
+ temporaryData: formData
+ })
+
+ this.allowTyping = true;
+ this.lastAudioRecorded = '';
+
+ }
+
deleteMessage(msgId: string) {
const room = this.wsChatMethodsService.getDmRoom(this.roomId)
this.alertService.confirmDeleteMessage(msgId, room);