From 69ab2d448ac5d87df6cebf99e333a93fe03da4a3 Mon Sep 17 00:00:00 2001 From: Carlo Venusino Date: Wed, 24 Mar 2021 14:13:26 +0100 Subject: [PATCH] TT#100755 CallRecordings - As Customer, I want to list CallRecordings - TT#115519 Create separate page and route "Recordings" under "Call Settings" - TT#115520 Integrate and configure QTable - TT#115521 Implement vuex actions, mutations and getters - TT#115522 Implement expanded section to render Streams meta data NOTE #1: for populating recording table, please follow these instructions https://sipwise.atlassian.net/wiki/spaces/DEV/pages/1105494098/Recorded+calls+on+dev+environment NOTE #2: /callrecordingstreams endpoint needs to be fixed (TT#118600 ); in the meantime as workaround to be able to fetch streams you need to go to /usr/share/perl5/NGCP/Panel/Controller/API/CallRecordingStreams.pm on your VM and modify line 30, change 'call' to 'me.call', then execute systemctl restart ngcp-panel Change-Id: Iac102ef7449cf7621166f2492cd8b200005768e1 --- src/api/subscriber.js | 37 +++- src/components/CscConfirmationDialog.vue | 11 +- src/components/CscMainMenuTop.vue | 6 + src/i18n/de.json | 12 +- src/i18n/en.json | 12 +- src/i18n/es.json | 12 +- src/i18n/fr.json | 12 +- src/i18n/it.json | 12 +- src/pages/CscPageCallRecording.vue | 263 +++++++++++++++++++++++ src/router/routes.js | 9 + src/store/call-recordings.js | 45 ++++ src/store/index.js | 2 + 12 files changed, 426 insertions(+), 7 deletions(-) create mode 100644 src/pages/CscPageCallRecording.vue create mode 100644 src/store/call-recordings.js diff --git a/src/api/subscriber.js b/src/api/subscriber.js index c1147c2b..9bf1eb61 100644 --- a/src/api/subscriber.js +++ b/src/api/subscriber.js @@ -17,7 +17,6 @@ import { import { assignNumbers } from './user' - export function getPreferences (id) { return new Promise((resolve, reject) => { Vue.http.get('api/subscriberpreferences/' + id).then((result) => { @@ -561,3 +560,39 @@ export async function getBrandingLogo (subscriberId) { return null } } + +export async function getRecordings (subscriberId) { + let retArr = [] + const res = await Vue.http.get('api/callrecordings/', { + subscriber_id: subscriberId + }) + if (res.body.total_count > 0) { + const recordings = getJsonBody(res.body)._embedded['ngcp:callrecordings'] + retArr = recordings.map(recording => { + return { + id: recording.id, + time: recording.start_time, + files: [] + } + }) + } + return retArr +} + +export async function getRecordingStreams (recId) { + let streams = [] + const res = await Vue.http.get('api/callrecordingstreams/', { + params: { + recording_id: recId + } + }) + if (res.body.total_count > 0) { + streams = getJsonBody(res.body)._embedded['ngcp:callrecordingstreams'] + } + return streams +} + +export async function downloadRecordingStream (fileId) { + const res = await Vue.http.get('api/callrecordingfiles/' + fileId, { responseType: 'blob' }) + return res.body +} diff --git a/src/components/CscConfirmationDialog.vue b/src/components/CscConfirmationDialog.vue index 1c196669..4a583a03 100644 --- a/src/components/CscConfirmationDialog.vue +++ b/src/components/CscConfirmationDialog.vue @@ -3,6 +3,7 @@ ref="dialogComp" :title="title" :title-icon="titleIcon" + :title-icon-color="titleIconColor" :opened="opened" @close="onClose()" > @@ -14,7 +15,7 @@ @@ -40,6 +41,10 @@ export default { type: String, default: '' }, + titleIconColor: { + type: String, + default: 'primary' + }, message: { type: String, default: '' @@ -47,6 +52,10 @@ export default { opened: { type: Boolean, default: false + }, + color: { + type: String, + default: 'primary' } }, data () { diff --git a/src/components/CscMainMenuTop.vue b/src/components/CscMainMenuTop.vue index 91fb6147..a6406782 100644 --- a/src/components/CscMainMenuTop.vue +++ b/src/components/CscMainMenuTop.vue @@ -123,6 +123,12 @@ export default { icon: 'notification_important', label: this.$t('Reminder'), visible: true + }, + { + to: '/user/recordings', + icon: 'play_circle', + label: this.$t('Recordings'), + visible: true } ] }, diff --git a/src/i18n/de.json b/src/i18n/de.json index 4a738e0b..415270bb 100644 --- a/src/i18n/de.json +++ b/src/i18n/de.json @@ -118,6 +118,7 @@ "Call back": "Rückruf", "Call ended": "Beendet", "Call forwarded": "Anruf weitergeleitet", + "Call recordings": "", "Calling": "Anrufen", "Calling {number}...": "{number} wird angerufen...", "Calls": "Anrufe", @@ -177,6 +178,7 @@ "Delete destination": "", "Delete forwarding": "", "Delete from {groupName} forwarding": "", + "Delete recording": "", "Delete sourceset": "Anruferliste löschen", "Delete voicemail after email notification is delivered": "Voicemail löschen, wenn die E-Mail-Benachrichtigung gesendet wurde", "Delete {groupName} forwarding group": "", @@ -236,6 +238,7 @@ "Filter groups": "", "Fine": "Mittel", "Forgot password?": "", + "Format": "", "Forward to Conference": "", "Forward to Fax2Mail": "", "Forward to ManagerSecretary": "", @@ -260,6 +263,7 @@ "Hunt Policy": "Klingelschema", "Hunt Timeout": "Klingeldauer", "Hunt timeout": "Klingeldauer", + "Id": "", "If available": "", "If available and ": "", "If busy": "", @@ -394,6 +398,8 @@ "Random Ringing": "Zufälliges Klingeln", "Receive Reports": "", "Received from IP": "", + "Recording successfully deleted": "", + "Recordings": "", "Recover password": "", "Reloading conversation items failed": "Das Laden der Konversationen ist fehlgeschlagen.", "Reminder": "Erinnerung", @@ -491,6 +497,7 @@ "Show filters": "Filter anzeigen", "Sign In": "Log-in", "Slot": "Kurzwahl", + "Something went wrong. Please retry later": "", "Sound Set": "Soundset", "Sound Sets": "Sound Sets", "Sound set is incomplete ({amount})": "Soundset ist unvollständig ({amount})", @@ -527,6 +534,7 @@ "This sound set is incomplete ({amount} file is missing)": "Soundset ist unvollständig ({amount} Sound fehlt)", "This sound set is incomplete ({amount} files are missing)": "Soundset ist unvollständig ({amount} Sounds fehlen)", "Thursday": "Donnerstag", + "Time": "", "Time is invalid": "", "Time of the day": "Uhrzeit des Tages", "Timeout": "Klingeldauer", @@ -536,6 +544,7 @@ "Toggled deletion successfully": "Löschen der Voicemail erfolgreich geändert", "Tu": "", "Tuesday": "Dienstag", + "Type": "", "Type something": "", "Unassign": "", "Unassigned": "Nicht zugewiesen", @@ -590,6 +599,7 @@ "You are about to change your login password. After the password was changed successfully, you get automatically logged out to authenticate with the new password. ": "Du bist dabei, dein Login-Passwort zu ändern. Nachdem das Passwort erfolgreich geändert wurde, wirst du automatisch abgemeldet, um dich mit dem neuen Passwort zu authentifizieren.", "You are about to delete {name} sourceset": "", "You are about to delete {name} timeset": "", + "You are about to delete recording #{id}": "", "You are about to delete time range \"{from} - {to}\"": "", "You are about to delete {destination} from {groupName} call forwarding": "", "You are about to delete {groupName} call forwarding group": "", @@ -683,4 +693,4 @@ "{field} must have at most {maxLength} letters": "{field} darf höchstens {maxLength} Buchstaben beinhalten", "{mode} of sources": "{mode} of sources", "{mode} own phone": "Eigene Rufnummer {mode}" -} +} \ No newline at end of file diff --git a/src/i18n/en.json b/src/i18n/en.json index 951d06bd..914c8205 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -118,6 +118,7 @@ "Call back": "Call back", "Call ended": "Call ended", "Call forwarded": "Call forwarded", + "Call recordings": "Call recordings", "Calling": "Calling", "Calling {number}...": "Calling {number}...", "Calls": "Calls", @@ -177,6 +178,7 @@ "Delete destination": "Delete destination", "Delete forwarding": "Delete forwarding", "Delete from {groupName} forwarding": "Delete from {groupName} forwarding", + "Delete recording": "Delete recording", "Delete sourceset": "Delete sourceset", "Delete voicemail after email notification is delivered": "Delete voicemail after email notification is delivered", "Delete {groupName} forwarding group": "Delete {groupName} forwarding group", @@ -236,6 +238,7 @@ "Filter groups": "Filter groups", "Fine": "Fine", "Forgot password?": "Forgot password?", + "Format": "Format", "Forward to Conference": "Forward to Conference", "Forward to Fax2Mail": "Forward to Fax2Mail", "Forward to ManagerSecretary": "Forward to ManagerSecretary", @@ -260,6 +263,7 @@ "Hunt Policy": "Hunt Policy", "Hunt Timeout": "Hunt Timeout", "Hunt timeout": "Hunt timeout", + "Id": "Id", "If available": "If available", "If available and ": "If available and ", "If busy": "If busy", @@ -394,6 +398,8 @@ "Random Ringing": "Random Ringing", "Receive Reports": "Receive Reports", "Received from IP": "Received from IP", + "Recording successfully deleted": "Recording successfully deleted", + "Recordings": "Recordings", "Recover password": "Recover password", "Reloading conversation items failed": "Reloading conversation items failed", "Reminder": "Reminder", @@ -491,6 +497,7 @@ "Show filters": "Show filters", "Sign In": "Sign In", "Slot": "Slot", + "Something went wrong. Please retry later": "Something went wrong. Please retry later", "Sound Set": "Sound Set", "Sound Sets": "Sound Sets", "Sound set is incomplete ({amount})": "Sound set is incomplete ({amount})", @@ -527,6 +534,7 @@ "This sound set is incomplete ({amount} file is missing)": "This sound set is incomplete ({amount} file is missing)", "This sound set is incomplete ({amount} files are missing)": "This sound set is incomplete ({amount} files are missing)", "Thursday": "Thursday", + "Time": "Time", "Time is invalid": "Time is invalid", "Time of the day": "Time of the day", "Timeout": "Timeout", @@ -536,6 +544,7 @@ "Toggled deletion successfully": "Toggled deletion successfully", "Tu": "Tu", "Tuesday": "Tuesday", + "Type": "Type", "Type something": "Type something", "Unassign": "Unassign", "Unassigned": "Unassigned", @@ -590,6 +599,7 @@ "You are about to change your login password. After the password was changed successfully, you get automatically logged out to authenticate with the new password. ": "You are about to change your login password. After the password was changed successfully, you get automatically logged out to authenticate with the new password. ", "You are about to delete {name} sourceset": "You are about to delete {name} sourceset", "You are about to delete {name} timeset": "You are about to delete {name} timeset", + "You are about to delete recording #{id}": "You are about to delete recording #{id}", "You are about to delete time range \"{from} - {to}\"": "You are about to delete time range \"{from} - {to}\"", "You are about to delete {destination} from {groupName} call forwarding": "You are about to delete {destination} from {groupName} call forwarding", "You are about to delete {groupName} call forwarding group": "You are about to delete {groupName} call forwarding group", @@ -683,4 +693,4 @@ "{field} must have at most {maxLength} letters": "{field} must have at most {maxLength} letters", "{mode} of sources": "{mode} of sources", "{mode} own phone": "{mode} own phone" -} +} \ No newline at end of file diff --git a/src/i18n/es.json b/src/i18n/es.json index a23bf97a..9c598f80 100644 --- a/src/i18n/es.json +++ b/src/i18n/es.json @@ -118,6 +118,7 @@ "Call back": "Llamar de vuelta", "Call ended": "Llamada terminada", "Call forwarded": "Llamada redirigida", + "Call recordings": "", "Calling": "Llamando", "Calling {number}...": "Iniciando ...", "Calls": "Llamadas", @@ -177,6 +178,7 @@ "Delete destination": "", "Delete forwarding": "", "Delete from {groupName} forwarding": "", + "Delete recording": "", "Delete sourceset": "Eliminar el conjunto de fuentes", "Delete voicemail after email notification is delivered": "Eliminar el correo de voz después de enviar la notificación por correo electrónico", "Delete {groupName} forwarding group": "", @@ -236,6 +238,7 @@ "Filter groups": "", "Fine": "Bien", "Forgot password?": "", + "Format": "", "Forward to Conference": "", "Forward to Fax2Mail": "", "Forward to ManagerSecretary": "", @@ -260,6 +263,7 @@ "Hunt Policy": "Política de búsqueda", "Hunt Timeout": "Tiempo de espera de grupo de búsqueda", "Hunt timeout": "Tiempo de espera de grupo de búsqueda", + "Id": "", "If available": "", "If available and ": "", "If busy": "", @@ -394,6 +398,8 @@ "Random Ringing": "Llamada aleatoria", "Receive Reports": "", "Received from IP": "", + "Recording successfully deleted": "", + "Recordings": "", "Recover password": "", "Reloading conversation items failed": "Falló la recarga de elementos de conversación", "Reminder": "Recordatorio", @@ -491,6 +497,7 @@ "Show filters": "Mostrar filtros", "Sign In": "Iniciar sesión", "Slot": "Ranura", + "Something went wrong. Please retry later": "", "Sound Set": "Conjunto de sonido", "Sound Sets": "Conjuntos de Sonido", "Sound set is incomplete ({amount})": "El conjunto de sonido está incompleto ({amount})", @@ -527,6 +534,7 @@ "This sound set is incomplete ({amount} file is missing)": "Este conjunto de sonidos está incompleto ({amount} falta archivo)", "This sound set is incomplete ({amount} files are missing)": "Este conjunto de sonidos está incompleto ({amount} faltan archivos)", "Thursday": "Jueves", + "Time": "", "Time is invalid": "", "Time of the day": "Hora del día", "Timeout": "Tiempo de espera", @@ -536,6 +544,7 @@ "Toggled deletion successfully": "Eliminación cambiada correctamente", "Tu": "", "Tuesday": "Martes", + "Type": "", "Type something": "", "Unassign": "", "Unassigned": "Sin asignar", @@ -590,6 +599,7 @@ "You are about to change your login password. After the password was changed successfully, you get automatically logged out to authenticate with the new password. ": "Está a punto de cambiar su contraseña de inicio de sesión. Después de que la contraseña se cambie con éxito, se cerrará la sesión automáticamente para autenticarse con la nueva contraseña.", "You are about to delete {name} sourceset": "", "You are about to delete {name} timeset": "", + "You are about to delete recording #{id}": "", "You are about to delete time range \"{from} - {to}\"": "", "You are about to delete {destination} from {groupName} call forwarding": "", "You are about to delete {groupName} call forwarding group": "", @@ -683,4 +693,4 @@ "{field} must have at most {maxLength} letters": "{field} debe tener como máximo {maxLength} letras", "{mode} of sources": "{mode} de fuentes", "{mode} own phone": "{mode} teléfono propio" -} +} \ No newline at end of file diff --git a/src/i18n/fr.json b/src/i18n/fr.json index d5482b8e..2839c698 100644 --- a/src/i18n/fr.json +++ b/src/i18n/fr.json @@ -118,6 +118,7 @@ "Call back": "Rappel", "Call ended": "Appel terminé", "Call forwarded": "", + "Call recordings": "", "Calling": "Appel", "Calling {number}...": "Appel vers le {number} en cours...", "Calls": "Appels", @@ -177,6 +178,7 @@ "Delete destination": "", "Delete forwarding": "", "Delete from {groupName} forwarding": "", + "Delete recording": "", "Delete sourceset": "Supprimer la liste de sources", "Delete voicemail after email notification is delivered": "Supprimer le message vocal une fois la notification e-mail délivrée", "Delete {groupName} forwarding group": "", @@ -236,6 +238,7 @@ "Filter groups": "", "Fine": "Fin", "Forgot password?": "", + "Format": "", "Forward to Conference": "", "Forward to Fax2Mail": "", "Forward to ManagerSecretary": "", @@ -260,6 +263,7 @@ "Hunt Policy": "Politique de groupement d’appels", "Hunt Timeout": "Temporisation des groupements d’appels", "Hunt timeout": "Temporisation des groupements d’appels", + "Id": "", "If available": "", "If available and ": "", "If busy": "", @@ -394,6 +398,8 @@ "Random Ringing": "Sonnerie aléatoire", "Receive Reports": "", "Received from IP": "", + "Recording successfully deleted": "", + "Recordings": "", "Recover password": "", "Reloading conversation items failed": "Le rechargement des conversations a échoué", "Reminder": "Rappel", @@ -491,6 +497,7 @@ "Show filters": "Afficher les filtre", "Sign In": "Authentification", "Slot": "Emplacement", + "Something went wrong. Please retry later": "", "Sound Set": "", "Sound Sets": "", "Sound set is incomplete ({amount})": "", @@ -527,6 +534,7 @@ "This sound set is incomplete ({amount} file is missing)": "", "This sound set is incomplete ({amount} files are missing)": "", "Thursday": "Jeudi", + "Time": "", "Time is invalid": "", "Time of the day": "Heure de la journée", "Timeout": "Temporisation", @@ -536,6 +544,7 @@ "Toggled deletion successfully": "La suppression a été activée avec succès", "Tu": "", "Tuesday": "Mardi", + "Type": "", "Type something": "", "Unassign": "", "Unassigned": "Non attribué", @@ -590,6 +599,7 @@ "You are about to change your login password. After the password was changed successfully, you get automatically logged out to authenticate with the new password. ": "", "You are about to delete {name} sourceset": "", "You are about to delete {name} timeset": "", + "You are about to delete recording #{id}": "", "You are about to delete time range \"{from} - {to}\"": "", "You are about to delete {destination} from {groupName} call forwarding": "", "You are about to delete {groupName} call forwarding group": "", @@ -683,4 +693,4 @@ "{field} must have at most {maxLength} letters": "{field} doit avoir au maximum {maxLength} caractères", "{mode} of sources": "Sources {mode}", "{mode} own phone": "{mode} téléphone personnel" -} +} \ No newline at end of file diff --git a/src/i18n/it.json b/src/i18n/it.json index 87db96d9..9e0cf519 100644 --- a/src/i18n/it.json +++ b/src/i18n/it.json @@ -118,6 +118,7 @@ "Call back": "Richiama", "Call ended": "Chiamata terminata", "Call forwarded": "Chiamata inoltrata", + "Call recordings": "", "Calling": "Composizione", "Calling {number}...": "Stai chiamando {number}...", "Calls": "Chiamate", @@ -177,6 +178,7 @@ "Delete destination": "", "Delete forwarding": "", "Delete from {groupName} forwarding": "", + "Delete recording": "", "Delete sourceset": "Cancella set pattern sorgente", "Delete voicemail after email notification is delivered": "Cancella il messaggio vocale dopo che l'email di notifica è stata inoltrata", "Delete {groupName} forwarding group": "", @@ -236,6 +238,7 @@ "Filter groups": "", "Fine": "Fine", "Forgot password?": "", + "Format": "", "Forward to Conference": "", "Forward to Fax2Mail": "", "Forward to ManagerSecretary": "", @@ -260,6 +263,7 @@ "Hunt Policy": "Modalità di Ricerca", "Hunt Timeout": "Timeout Ricerca", "Hunt timeout": "Timeout Ricerca", + "Id": "", "If available": "", "If available and ": "", "If busy": "", @@ -394,6 +398,8 @@ "Random Ringing": "Squillo Casuale", "Receive Reports": "", "Received from IP": "", + "Recording successfully deleted": "", + "Recordings": "", "Recover password": "", "Reloading conversation items failed": "Caricamento dell'elenco conversazioni fallito", "Reminder": "Promemoria", @@ -491,6 +497,7 @@ "Show filters": "Mostra filtri", "Sign In": "Accedi", "Slot": "Posizione", + "Something went wrong. Please retry later": "", "Sound Set": "Set Messaggi", "Sound Sets": "Annunci", "Sound set is incomplete ({amount})": "Questo set di messaggi è incompleto ({amount})", @@ -527,6 +534,7 @@ "This sound set is incomplete ({amount} file is missing)": "Questo set di messaggi è incompleto ({amount} files mancanti)", "This sound set is incomplete ({amount} files are missing)": "Questo set di messaggi è incompleto ({amount} files mancanti)", "Thursday": "Giovedì", + "Time": "", "Time is invalid": "", "Time of the day": "Ora del giorno", "Timeout": "Timeout", @@ -536,6 +544,7 @@ "Toggled deletion successfully": "Cancellazione modificata con successo", "Tu": "", "Tuesday": "Martedì", + "Type": "", "Type something": "", "Unassign": "", "Unassigned": "Non assegnato", @@ -590,6 +599,7 @@ "You are about to change your login password. After the password was changed successfully, you get automatically logged out to authenticate with the new password. ": "Stai per modificare la tua password di login. Una volta che la password sarà modificata, verrai automaticamente disconnesso e dovrai accedere con la nuova password. ", "You are about to delete {name} sourceset": "", "You are about to delete {name} timeset": "", + "You are about to delete recording #{id}": "", "You are about to delete time range \"{from} - {to}\"": "", "You are about to delete {destination} from {groupName} call forwarding": "", "You are about to delete {groupName} call forwarding group": "", @@ -683,4 +693,4 @@ "{field} must have at most {maxLength} letters": "Il campo {field} può contenere al massimo {maxLength} lettere", "{mode} of sources": "{mode} dei pattern sorgente", "{mode} own phone": "{mode} proprio telefono" -} +} \ No newline at end of file diff --git a/src/pages/CscPageCallRecording.vue b/src/pages/CscPageCallRecording.vue new file mode 100644 index 00000000..3f08c41a --- /dev/null +++ b/src/pages/CscPageCallRecording.vue @@ -0,0 +1,263 @@ + + + + + diff --git a/src/router/routes.js b/src/router/routes.js index 741ec3c7..a1f77a6d 100644 --- a/src/router/routes.js +++ b/src/router/routes.js @@ -13,6 +13,7 @@ import CscPageCallForwardAfterHours from 'src/pages/CscPageCallForwardAfterHours import CscPageCallBlockingIncoming from 'src/pages/CscPageCallBlockingIncoming' import CscPageCallBlockingOutgoing from 'src/pages/CscPageCallBlockingOutgoing' import CscPageCallBlockingPrivacy from 'src/pages/CscPageCallBlockingPrivacy' +import CscPageCallRecording from 'src/pages/CscPageCallRecording' import CscPageReminder from 'src/pages/CscPageReminder' import CscPageSpeedDial from 'src/pages/CscPageSpeedDial' import CscPagePbxGroups from 'src/pages/CscPagePbxGroups' @@ -117,6 +118,14 @@ export default function routes (app) { subtitle: i18n.t('Privacy') } }, + { + path: 'recordings', + component: CscPageCallRecording, + meta: { + title: i18n.t('Recordings'), + subtitle: i18n.t('Call recordings') + } + }, { path: 'reminder', component: CscPageReminder, diff --git a/src/store/call-recordings.js b/src/store/call-recordings.js new file mode 100644 index 00000000..caa95416 --- /dev/null +++ b/src/store/call-recordings.js @@ -0,0 +1,45 @@ +import Vue from 'vue' +import { getRecordings, getRecordingStreams, downloadRecordingStream } from '../api/subscriber' +export default { + namespaced: true, + state: { + recordings: [] + }, + getters: { + subscriberId (state, getters, rootState, rootGetters) { + return parseInt(rootGetters['user/getSubscriberId']) + }, + recordings (state, getters, rootState, rootGetters) { + return state.recordings + } + }, + mutations: { + callRecordings (state, res) { + state.recordings = res + }, + callRecordingStreams (state, data) { + const recording = state.recordings.filter(rec => rec.id === data.recId)[0] + recording.files = data.streams + } + }, + actions: { + async fetchRecordings (context) { + const recs = await getRecordings(context.getters.subscriberId) + context.commit('callRecordings', recs) + }, + async fetchStreams (context, recId) { + const streams = await getRecordingStreams(recId) + context.commit('callRecordingStreams', { + recId: recId, + streams: streams + }) + }, + async deleteRecording (context, recId) { + await Vue.http.delete('api/callrecordings/' + recId + '?force_delete=1') + }, + async downloadRecording (context, fileId) { + const fileBody = await downloadRecordingStream(fileId) + return fileBody + } + } +} diff --git a/src/store/index.js b/src/store/index.js index baecf939..fe2043ac 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -10,6 +10,7 @@ import CallForwardModule from './call-forward' import CallForwardingModule from './call-forwarding' import NewCallForwardModule from './new-call-forward' import CallModule, { errorVisibilityTimeout } from './call' +import CallRecordingsModule from './call-recordings' import CallSettingsModule from './call-settings' import ConversationsModule from './conversations' @@ -57,6 +58,7 @@ export default function (/* { ssrContext } */) { callBlocking: CallBlockingModule, callForward: CallForwardModule, newCallForward: NewCallForwardModule, + callRecordings: CallRecordingsModule, call: CallModule, callSettings: CallSettingsModule, conversations: ConversationsModule,