-

+
+

+
{{ isSetup ? "Initial Setup" : "Authentication Required" }}
diff --git a/meshchatx/src/frontend/components/call/CallPage.vue b/meshchatx/src/frontend/components/call/CallPage.vue
index e599c8f..ab7e362 100644
--- a/meshchatx/src/frontend/components/call/CallPage.vue
+++ b/meshchatx/src/frontend/components/call/CallPage.vue
@@ -45,8 +45,8 @@
-
-
+
+
-
+
Telephone
Enter an identity hash to call.
@@ -249,7 +249,7 @@
-
+
@@ -283,18 +283,25 @@
{{ entry.timestamp ? formatDateTime(entry.timestamp * 1000) : "" }}
-
-
-
{{ entry.status }}
-
• {{ formatDuration(entry.duration_seconds) }}
+
+
+ {{ entry.status }}
+ • {{ formatDuration(entry.duration_seconds) }}
+
+
+ {{ entry.remote_identity_hash }}
+
@@ -582,6 +604,7 @@ export default {
isGeneratingGreeting: false,
playingVoicemailId: null,
audioPlayer: null,
+ isPlayingGreeting: false,
};
},
computed: {
@@ -773,6 +796,27 @@ export default {
ToastUtils.error("Failed to delete voicemail");
}
},
+ async playGreeting() {
+ if (this.isPlayingGreeting) {
+ this.audioPlayer.pause();
+ this.isPlayingGreeting = false;
+ return;
+ }
+
+ if (this.audioPlayer) {
+ this.audioPlayer.pause();
+ }
+
+ this.isPlayingGreeting = true;
+ this.audioPlayer = new Audio("/api/v1/telephone/voicemail/greeting/audio");
+ this.audioPlayer.play().catch(() => {
+ ToastUtils.error("No greeting audio found. Please generate one first.");
+ this.isPlayingGreeting = false;
+ });
+ this.audioPlayer.onended = () => {
+ this.isPlayingGreeting = false;
+ };
+ },
async call(identityHash) {
if (!identityHash) {
ToastUtils.error("Enter an identity hash to call");
diff --git a/meshchatx/src/frontend/components/interfaces/InterfacesPage.vue b/meshchatx/src/frontend/components/interfaces/InterfacesPage.vue
index b07add8..8ae56da 100644
--- a/meshchatx/src/frontend/components/interfaces/InterfacesPage.vue
+++ b/meshchatx/src/frontend/components/interfaces/InterfacesPage.vue
@@ -2,7 +2,7 @@