From bf822b6abacccad60f5ca122948fcffe0b693c0f Mon Sep 17 00:00:00 2001 From: Ivan Date: Wed, 1 Apr 2026 02:31:50 +0300 Subject: [PATCH] refactor(api): replace axios with window.api for all API calls in frontend components --- meshchatx/src/frontend/components/App.vue | 20 +-- .../frontend/components/ChangelogModal.vue | 8 +- .../frontend/components/CommandPalette.vue | 6 +- .../components/IntegrityWarningModal.vue | 2 +- .../frontend/components/NotificationBell.vue | 12 +- .../src/frontend/components/TutorialModal.vue | 16 +-- .../frontend/components/about/AboutPage.vue | 34 ++--- .../components/archives/ArchivesPage.vue | 6 +- .../src/frontend/components/auth/AuthPage.vue | 4 +- .../components/blocked/BlockedPage.vue | 8 +- .../frontend/components/call/CallOverlay.vue | 10 +- .../src/frontend/components/call/CallPage.vue | 78 +++++----- .../components/call/RingtoneEditor.vue | 2 +- .../components/call/RingtoneEditorModal.vue | 6 +- .../components/contacts/ContactsPage.vue | 16 +-- .../components/debug/DebugLogsPage.vue | 4 +- .../src/frontend/components/docs/DocsPage.vue | 22 +-- .../interfaces/AddInterfacePage.vue | 16 +-- .../interfaces/ImportInterfacesModal.vue | 4 +- .../components/interfaces/InterfacesPage.vue | 26 ++-- .../src/frontend/components/map/MapPage.vue | 50 +++---- .../src/frontend/components/map/MiniChat.vue | 4 +- .../messages/ConversationDropDownMenu.vue | 16 +-- .../messages/ConversationViewer.vue | 56 ++++---- .../components/messages/MessagesPage.vue | 28 ++-- .../components/messages/MessagesSidebar.vue | 8 +- .../components/messages/PaperMessageModal.vue | 4 +- .../micron-editor/MicronEditorPage.vue | 6 +- .../network-visualiser/NetworkVisualiser.vue | 28 ++-- .../nomadnetwork/NomadNetworkPage.vue | 20 +-- .../nomadnetwork/NomadNetworkSidebar.vue | 8 +- .../components/page-nodes/PageNodesPage.vue | 26 ++-- .../src/frontend/components/ping/PingPage.vue | 7 +- .../components/profile/ProfileIconPage.vue | 4 +- .../PropagationNodesPage.vue | 6 +- .../src/frontend/components/rncp/RNCPPage.vue | 6 +- .../components/rnprobe/RNProbePage.vue | 4 +- .../components/rnstatus/RNStatusPage.vue | 2 +- .../components/settings/IdentitiesPage.vue | 18 +-- .../components/settings/SettingsPage.vue | 34 ++--- .../frontend/components/tools/BotsPage.vue | 12 +- .../components/tools/PaperMessagePage.vue | 2 +- .../frontend/components/tools/RNPathPage.vue | 14 +- .../components/tools/RNPathTracePage.vue | 2 +- .../components/translator/TranslatorPage.vue | 8 +- .../src/frontend/js/WebSocketConnection.js | 2 +- meshchatx/src/frontend/js/apiClient.js | 136 ++++++++++++++++++ tests/frontend/AboutPage.test.js | 4 +- tests/frontend/AddInterfaceDiscovery.test.js | 2 +- tests/frontend/AppModals.test.js | 2 +- tests/frontend/AppPropagationSync.test.js | 2 +- tests/frontend/AuthPage.test.js | 4 +- tests/frontend/BanishedPage.test.js | 4 +- tests/frontend/BlockedPage.test.js | 4 +- tests/frontend/BotsPage.test.js | 4 +- tests/frontend/CallPage.test.js | 6 +- tests/frontend/CallPageCustomImage.test.js | 4 +- tests/frontend/ChangelogModal.test.js | 2 +- tests/frontend/CommandPalette.test.js | 4 +- tests/frontend/ContactsPage.test.js | 2 +- tests/frontend/ConversationViewer.test.js | 4 +- .../ConversationViewerButtons.test.js | 4 +- tests/frontend/DebugLogsPage.test.js | 16 +-- tests/frontend/DocsPage.test.js | 4 +- tests/frontend/IdentitiesPage.test.js | 4 +- .../InterfacesDiscoveryActions.test.js | 2 +- tests/frontend/InterfacesPerformance.test.js | 5 +- tests/frontend/LoadTimePerformance.test.js | 6 +- tests/frontend/MapDrawing.test.js | 2 +- tests/frontend/MapPage.test.js | 10 +- tests/frontend/MessagesPage.test.js | 4 +- tests/frontend/NetworkVisualiser.test.js | 5 +- tests/frontend/NomadNetworkPage.test.js | 4 +- tests/frontend/NomadNetworkSidebar.test.js | 4 +- tests/frontend/NotificationBell.test.js | 50 +++---- tests/frontend/PaperMessagePage.test.js | 4 +- tests/frontend/Performance.test.js | 5 +- tests/frontend/PingPage.test.js | 4 +- tests/frontend/RNPathPage.test.js | 4 +- tests/frontend/RNPathTracePage.test.js | 4 +- tests/frontend/RNProbePage.test.js | 5 +- tests/frontend/RNStatusPage.test.js | 4 +- tests/frontend/TranslatorPage.test.js | 8 +- tests/frontend/UIComponents.test.js | 4 +- tests/frontend/UIThemeAndVisibility.test.js | 24 ++-- tests/frontend/VisualizerOptimization.test.js | 4 +- tests/frontend/setup.js | 7 +- 87 files changed, 599 insertions(+), 457 deletions(-) create mode 100644 meshchatx/src/frontend/js/apiClient.js diff --git a/meshchatx/src/frontend/components/App.vue b/meshchatx/src/frontend/components/App.vue index d686ce9..8e471eb 100644 --- a/meshchatx/src/frontend/components/App.vue +++ b/meshchatx/src/frontend/components/App.vue @@ -974,7 +974,7 @@ export default { }, async getAppInfo() { try { - const response = await window.axios.get(`/api/v1/app/info`); + const response = await window.api.get(`/api/v1/app/info`); this.appInfo = response.data.app_info; if (this.appInfo.database_health_issues && this.appInfo.database_health_issues.length > 0) { @@ -1019,7 +1019,7 @@ export default { }, async getConfig() { try { - const response = await window.axios.get(`/api/v1/config`); + const response = await window.api.get(`/api/v1/config`); this.config = response.data.config; GlobalState.config = response.data.config; this.displayName = response.data.config.display_name; @@ -1030,7 +1030,7 @@ export default { }, async getBlockedDestinations() { try { - const response = await window.axios.get("/api/v1/blocked-destinations"); + const response = await window.api.get("/api/v1/blocked-destinations"); GlobalState.blockedDestinations = response.data.blocked_destinations || []; } catch (e) { console.log("Failed to load blocked destinations:", e); @@ -1045,7 +1045,7 @@ export default { }, async sendAnnounce() { try { - await window.axios.get(`/api/v1/announce`); + await window.api.get(`/api/v1/announce`); } catch (e) { ToastUtils.error(this.$t("app.failed_announce")); console.log(e); @@ -1156,7 +1156,7 @@ export default { // request sync try { - await axios.get("/api/v1/lxmf/propagation-node/sync"); + await window.api.get("/api/v1/lxmf/propagation-node/sync"); } catch (e) { const errorMessage = e.response?.data?.message ?? this.$t("app.sync_error_generic"); ToastUtils.error(errorMessage); @@ -1194,7 +1194,7 @@ export default { async stopSyncingPropagationNode() { // stop sync try { - await axios.get("/api/v1/lxmf/propagation-node/stop-sync"); + await window.api.get("/api/v1/lxmf/propagation-node/stop-sync"); } catch { // do nothing on error } @@ -1204,7 +1204,7 @@ export default { }, async updatePropagationNodeStatus() { try { - const response = await axios.get("/api/v1/lxmf/propagation-node/status"); + const response = await window.api.get("/api/v1/lxmf/propagation-node/status"); this.propagationNodeStatus = response.data.propagation_node_status; } catch { // do nothing on error @@ -1222,7 +1222,7 @@ export default { if (this.config?.custom_ringtone_enabled) { try { - const response = await window.axios.get("/api/v1/telephone/ringtones/status"); + const response = await window.api.get("/api/v1/telephone/ringtones/status"); const status = response.data; if (status.has_custom_ringtone && status.id) { this.ringtonePlayer = new Audio(`/api/v1/telephone/ringtones/${status.id}/audio`); @@ -1258,7 +1258,7 @@ export default { async updateTelephoneStatus() { try { // fetch status - const response = await axios.get("/api/v1/telephone/status"); + const response = await window.api.get("/api/v1/telephone/status"); const oldCall = this.activeCall; const newCall = response.data.active_call; @@ -1337,7 +1337,7 @@ export default { this.isFetchingRingtone = true; try { const caller_hash = this.activeCall.remote_identity_hash; - const ringResponse = await window.axios.get( + const ringResponse = await window.api.get( `/api/v1/telephone/ringtones/status?caller_hash=${caller_hash}` ); const status = ringResponse.data; diff --git a/meshchatx/src/frontend/components/ChangelogModal.vue b/meshchatx/src/frontend/components/ChangelogModal.vue index c2276f8..e50ff66 100644 --- a/meshchatx/src/frontend/components/ChangelogModal.vue +++ b/meshchatx/src/frontend/components/ChangelogModal.vue @@ -172,7 +172,7 @@ export default { this.loading = true; this.error = null; try { - const response = await window.axios.get("/api/v1/app/changelog"); + const response = await window.api.get("/api/v1/app/changelog"); this.version = response.data.version; // Process HTML to make version headers look better @@ -192,7 +192,7 @@ export default { // mark as seen for current version automatically on close if not already marked if (!this.dontShowEver && !this.dontShowAgain) { try { - await window.axios.post("/api/v1/app/changelog/seen", { + await window.api.post("/api/v1/app/changelog/seen", { version: this.currentVersion || "0.0.0", }); } catch (e) { @@ -206,7 +206,7 @@ export default { async markAsSeen() { if (this.dontShowEver) { try { - await window.axios.post("/api/v1/app/changelog/seen", { + await window.api.post("/api/v1/app/changelog/seen", { version: "999.999.999", }); } catch (e) { @@ -214,7 +214,7 @@ export default { } } else if (this.dontShowAgain) { try { - await window.axios.post("/api/v1/app/changelog/seen", { + await window.api.post("/api/v1/app/changelog/seen", { version: this.currentVersion, }); } catch (e) { diff --git a/meshchatx/src/frontend/components/CommandPalette.vue b/meshchatx/src/frontend/components/CommandPalette.vue index c185966..eee01be 100644 --- a/meshchatx/src/frontend/components/CommandPalette.vue +++ b/meshchatx/src/frontend/components/CommandPalette.vue @@ -432,13 +432,13 @@ export default { async loadPeersAndContacts() { try { // fetch announces for "lxmf.delivery" aspect to get peers - const peerResponse = await window.axios.get(`/api/v1/announces`, { + const peerResponse = await window.api.get(`/api/v1/announces`, { params: { aspect: "lxmf.delivery", limit: 20 }, }); this.peers = peerResponse.data.announces; // fetch telephone contacts - const contactResponse = await window.axios.get("/api/v1/telephone/contacts"); + const contactResponse = await window.api.get("/api/v1/telephone/contacts"); this.contacts = contactResponse.data?.contacts ?? (Array.isArray(contactResponse.data) ? contactResponse.data : []); } catch (e) { @@ -486,7 +486,7 @@ export default { }, async dialContact(hash) { try { - await window.axios.get(`/api/v1/telephone/call/${hash}`); + await window.api.get(`/api/v1/telephone/call/${hash}`); if (this.$route.name !== "call") { this.$router.push({ name: "call" }); } diff --git a/meshchatx/src/frontend/components/IntegrityWarningModal.vue b/meshchatx/src/frontend/components/IntegrityWarningModal.vue index 7bd17d6..c8888b4 100644 --- a/meshchatx/src/frontend/components/IntegrityWarningModal.vue +++ b/meshchatx/src/frontend/components/IntegrityWarningModal.vue @@ -103,7 +103,7 @@ export default { }, async acknowledgeAndReset() { try { - await window.axios.post("/api/v1/app/integrity/acknowledge"); + await window.api.post("/api/v1/app/integrity/acknowledge"); ToastUtils.success(this.$t("about.integrity_acknowledged_reset")); this.visible = false; } catch (e) { diff --git a/meshchatx/src/frontend/components/NotificationBell.vue b/meshchatx/src/frontend/components/NotificationBell.vue index d7149cf..8eea6e4 100644 --- a/meshchatx/src/frontend/components/NotificationBell.vue +++ b/meshchatx/src/frontend/components/NotificationBell.vue @@ -228,7 +228,7 @@ export default { } this.isLoading = true; try { - const response = await window.axios.get(`/api/v1/notifications`, { + const response = await window.api.get(`/api/v1/notifications`, { params: { unread: true, limit: 10, @@ -258,7 +258,7 @@ export default { .map((n) => n.destination_hash); const notification_ids = this.notifications.filter((n) => n.type !== "lxmf_message").map((n) => n.id); - await window.axios.post("/api/v1/notifications/mark-as-viewed", { + await window.api.post("/api/v1/notifications/mark-as-viewed", { destination_hashes: destination_hashes, notification_ids: notification_ids, }); @@ -271,18 +271,18 @@ export default { return; } try { - await window.axios.post("/api/v1/notifications/mark-as-viewed", { + await window.api.post("/api/v1/notifications/mark-as-viewed", { destination_hashes: [], notification_ids: [], }); - const response = await window.axios.get("/api/v1/lxmf/conversations"); + const response = await window.api.get("/api/v1/lxmf/conversations"); const conversations = response.data.conversations || []; for (const conversation of conversations) { if (conversation.is_unread) { try { - await window.axios.get( + await window.api.get( `/api/v1/lxmf/conversations/${conversation.destination_hash}/mark-as-read` ); } catch (e) { @@ -311,7 +311,7 @@ export default { const destination_hashes = notification.type === "lxmf_message" ? [notification.destination_hash] : []; const notification_ids = notification.type !== "lxmf_message" ? [notification.id] : []; - await window.axios.post("/api/v1/notifications/mark-as-viewed", { + await window.api.post("/api/v1/notifications/mark-as-viewed", { destination_hashes: destination_hashes, notification_ids: notification_ids, }); diff --git a/meshchatx/src/frontend/components/TutorialModal.vue b/meshchatx/src/frontend/components/TutorialModal.vue index dcd5ba9..035e87d 100644 --- a/meshchatx/src/frontend/components/TutorialModal.vue +++ b/meshchatx/src/frontend/components/TutorialModal.vue @@ -1458,7 +1458,7 @@ export default { async toggleTheme() { const newTheme = this.config.theme === "dark" ? "light" : "dark"; try { - await window.axios.patch("/api/v1/config", { + await window.api.patch("/api/v1/config", { theme: newTheme, }); GlobalState.config.theme = newTheme; @@ -1468,7 +1468,7 @@ export default { }, async onLanguageChange(langCode) { try { - await window.axios.patch("/api/v1/config", { + await window.api.patch("/api/v1/config", { language: langCode, }); this.$i18n.locale = langCode; @@ -1495,7 +1495,7 @@ export default { async loadCommunityInterfaces() { this.loadingInterfaces = true; try { - const response = await window.axios.get("/api/v1/community-interfaces"); + const response = await window.api.get("/api/v1/community-interfaces"); this.communityInterfaces = response.data.interfaces; } catch (e) { console.error("Failed to load community interfaces:", e); @@ -1506,7 +1506,7 @@ export default { async loadDiscoveredInterfaces() { this.loadingDiscovered = true; try { - const response = await window.axios.get(`/api/v1/reticulum/discovered-interfaces`); + const response = await window.api.get(`/api/v1/reticulum/discovered-interfaces`); this.discoveredInterfaces = response.data?.interfaces ?? []; this.discoveredActive = response.data?.active ?? []; } catch (e) { @@ -1522,7 +1522,7 @@ export default { discover_interfaces: true, autoconnect_discovered_interfaces: 3, // default to 3 slots }; - await window.axios.patch(`/api/v1/reticulum/discovery`, payload); + await window.api.patch(`/api/v1/reticulum/discovery`, payload); ToastUtils.success(this.$t("tutorial.discovery_enabled")); this.discoveryOption = "yes"; this.nextStep(); @@ -1536,7 +1536,7 @@ export default { async enableAutoPropagation() { this.savingPropagation = true; try { - await window.axios.patch("/api/v1/config", { + await window.api.patch("/api/v1/config", { lxmf_preferred_propagation_node_auto_select: true, }); ToastUtils.success("Auto-propagation enabled"); @@ -1599,7 +1599,7 @@ export default { }, async selectCommunityInterface(iface) { try { - await window.axios.post("/api/v1/reticulum/interfaces/add", { + await window.api.post("/api/v1/reticulum/interfaces/add", { name: iface.name, type: iface.type, target_host: iface.target_host, @@ -1651,7 +1651,7 @@ export default { if (this.markingSeen) return; this.markingSeen = true; try { - await window.axios.post("/api/v1/app/tutorial/seen"); + await window.api.post("/api/v1/app/tutorial/seen"); } catch (e) { console.error("Failed to mark tutorial as seen:", e); } finally { diff --git a/meshchatx/src/frontend/components/about/AboutPage.vue b/meshchatx/src/frontend/components/about/AboutPage.vue index d920aa4..f022e4a 100644 --- a/meshchatx/src/frontend/components/about/AboutPage.vue +++ b/meshchatx/src/frontend/components/about/AboutPage.vue @@ -900,7 +900,7 @@ export default { methods: { async listSnapshots() { try { - const response = await window.axios.get("/api/v1/database/snapshots", { + const response = await window.api.get("/api/v1/database/snapshots", { params: { limit: this.snapshotsLimit, offset: this.snapshotsOffset, @@ -914,7 +914,7 @@ export default { }, async listAutoBackups() { try { - const response = await window.axios.get("/api/v1/database/backups", { + const response = await window.api.get("/api/v1/database/backups", { params: { limit: this.autoBackupsLimit, offset: this.autoBackupsOffset, @@ -928,7 +928,7 @@ export default { }, async downloadSnapshot(filename) { try { - const response = await window.axios.get(`/api/v1/database/snapshots/${filename}/download`, { + const response = await window.api.get(`/api/v1/database/snapshots/${filename}/download`, { responseType: "blob", }); const url = window.URL.createObjectURL(new Blob([response.data])); @@ -946,7 +946,7 @@ export default { }, async downloadBackupFile(filename) { try { - const response = await window.axios.get(`/api/v1/database/backups/${filename}/download`, { + const response = await window.api.get(`/api/v1/database/backups/${filename}/download`, { responseType: "blob", }); const url = window.URL.createObjectURL(new Blob([response.data])); @@ -965,7 +965,7 @@ export default { async deleteSnapshot(filename) { if (!(await DialogUtils.confirm(this.$t("about.delete_snapshot_confirm")))) return; try { - await window.axios.delete(`/api/v1/database/snapshots/${filename}`); + await window.api.delete(`/api/v1/database/snapshots/${filename}`); ToastUtils.success(this.$t("about.snapshot_deleted")); await this.listSnapshots(); } catch { @@ -975,7 +975,7 @@ export default { async deleteBackup(filename) { if (!(await DialogUtils.confirm(this.$t("about.delete_backup_confirm")))) return; try { - await window.axios.delete(`/api/v1/database/backups/${filename}`); + await window.api.delete(`/api/v1/database/backups/${filename}`); ToastUtils.success(this.$t("about.backup_deleted")); await this.listAutoBackups(); } catch { @@ -1012,7 +1012,7 @@ export default { this.snapshotMessage = ""; this.snapshotError = ""; try { - await window.axios.post("/api/v1/database/snapshot", { + await window.api.post("/api/v1/database/snapshot", { name: this.snapshotName || `snapshot-${Math.floor(Date.now() / 1000)}`, }); this.snapshotMessage = "Snapshot created successfully"; @@ -1029,7 +1029,7 @@ export default { return; } try { - const response = await window.axios.post("/api/v1/database/restore", { path }); + const response = await window.api.post("/api/v1/database/restore", { path }); if (response.data.status === "success") { ToastUtils.success(this.$t("about.database_restored")); if (this.isElectron) { @@ -1042,7 +1042,7 @@ export default { }, async getAppInfo() { try { - const response = await window.axios.get("/api/v1/app/info"); + const response = await window.api.get("/api/v1/app/info"); this.appInfo = response.data.app_info; if (this.isElectron) { @@ -1059,7 +1059,7 @@ export default { async acknowledgeIntegrity() { if (await DialogUtils.confirm(this.$t("about.integrity_acknowledge_confirm"))) { try { - await window.axios.post("/api/v1/app/integrity/acknowledge"); + await window.api.post("/api/v1/app/integrity/acknowledge"); ToastUtils.success(this.$t("about.integrity_acknowledged")); await this.getAppInfo(); } catch { @@ -1070,7 +1070,7 @@ export default { async getDatabaseHealth(showMessage = false) { this.healthLoading = true; try { - const response = await window.axios.get("/api/v1/database/health"); + const response = await window.api.get("/api/v1/database/health"); this.databaseHealth = response.data.database; if (showMessage) { this.databaseActionMessage = "Database health refreshed"; @@ -1091,7 +1091,7 @@ export default { this.databaseActionError = ""; this.databaseRecoveryActions = []; try { - const response = await window.axios.post("/api/v1/database/vacuum"); + const response = await window.api.post("/api/v1/database/vacuum"); if (response.data.database?.health) { this.databaseHealth = response.data.database.health; } @@ -1111,7 +1111,7 @@ export default { this.backupMessage = ""; this.backupError = ""; try { - const response = await window.axios.get("/api/v1/database/backup/download", { + const response = await window.api.get("/api/v1/database/backup/download", { responseType: "blob", }); const blob = new Blob([response.data], { type: "application/zip" }); @@ -1149,7 +1149,7 @@ export default { try { const formData = new FormData(); formData.append("file", this.restoreFile); - const response = await window.axios.post("/api/v1/database/restore", formData, { + const response = await window.api.post("/api/v1/database/restore", formData, { headers: { "Content-Type": "multipart/form-data" }, }); this.restoreMessage = response.data.message || "Database restored"; @@ -1171,7 +1171,7 @@ export default { this.databaseActionMessage = ""; this.databaseActionError = ""; try { - const response = await window.axios.post("/api/v1/database/recover"); + const response = await window.api.post("/api/v1/database/recover"); if (response.data.database?.health) { this.databaseHealth = response.data.database.health; } @@ -1186,7 +1186,7 @@ export default { }, async getConfig() { try { - const response = await window.axios.get("/api/v1/config"); + const response = await window.api.get("/api/v1/config"); this.config = response.data.config; } catch (e) { // do nothing if failed to load config @@ -1215,7 +1215,7 @@ export default { ) { try { // try to notify backend first - await window.axios.post("/api/v1/app/shutdown"); + await window.api.post("/api/v1/app/shutdown"); } catch { // ignore errors if backend is already stopping } diff --git a/meshchatx/src/frontend/components/archives/ArchivesPage.vue b/meshchatx/src/frontend/components/archives/ArchivesPage.vue index cdba903..67ccbe4 100644 --- a/meshchatx/src/frontend/components/archives/ArchivesPage.vue +++ b/meshchatx/src/frontend/components/archives/ArchivesPage.vue @@ -307,7 +307,7 @@ export default { async getArchives() { this.isLoading = true; try { - const response = await window.axios.get("/api/v1/nomadnet/archives", { + const response = await window.api.get("/api/v1/nomadnet/archives", { params: { page: 1, limit: 500, @@ -354,7 +354,7 @@ export default { } try { - await window.axios.delete("/api/v1/nomadnet/archives", { + await window.api.delete("/api/v1/nomadnet/archives", { data: { ids: this.selectedArchives }, }); @@ -381,7 +381,7 @@ export default { } try { - await window.axios.delete("/api/v1/nomadnet/archives", { + await window.api.delete("/api/v1/nomadnet/archives", { data: { ids: [archive.id] }, }); diff --git a/meshchatx/src/frontend/components/auth/AuthPage.vue b/meshchatx/src/frontend/components/auth/AuthPage.vue index b29e0c7..4825d04 100644 --- a/meshchatx/src/frontend/components/auth/AuthPage.vue +++ b/meshchatx/src/frontend/components/auth/AuthPage.vue @@ -103,7 +103,7 @@ export default { methods: { async checkAuthStatus() { try { - const response = await window.axios.get("/api/v1/auth/status"); + const response = await window.api.get("/api/v1/auth/status"); const status = response.data; if (!status.auth_enabled) { @@ -141,7 +141,7 @@ export default { try { const endpoint = this.isSetup ? "/api/v1/auth/setup" : "/api/v1/auth/login"; - await window.axios.post(endpoint, { + await window.api.post(endpoint, { password: this.password, }); diff --git a/meshchatx/src/frontend/components/blocked/BlockedPage.vue b/meshchatx/src/frontend/components/blocked/BlockedPage.vue index 6e4834b..bd3f6be 100644 --- a/meshchatx/src/frontend/components/blocked/BlockedPage.vue +++ b/meshchatx/src/frontend/components/blocked/BlockedPage.vue @@ -195,13 +195,13 @@ export default { this.isLoading = true; try { // Load local blocked destinations - const response = await window.axios.get("/api/v1/blocked-destinations"); + const response = await window.api.get("/api/v1/blocked-destinations"); const blockedHashes = response.data.blocked_destinations || []; // Load Reticulum blackholed identities let reticulumBlackholed = {}; try { - const rnsResponse = await window.axios.get("/api/v1/reticulum/blackhole"); + const rnsResponse = await window.api.get("/api/v1/reticulum/blackhole"); reticulumBlackholed = rnsResponse.data.blackholed_identities || {}; } catch (e) { console.error("Failed to load Reticulum blackhole", e); @@ -212,7 +212,7 @@ export default { let isNode = false; try { - const announceResponse = await window.axios.get("/api/v1/announces", { + const announceResponse = await window.api.get("/api/v1/announces", { params: { identity_hash: hash, include_blocked: true, @@ -272,7 +272,7 @@ export default { } try { - await window.axios.delete(`/api/v1/blocked-destinations/${item.destination_hash}`); + await window.api.delete(`/api/v1/blocked-destinations/${item.destination_hash}`); await this.loadBlockedDestinations(); ToastUtils.success(this.$t("banishment.banishment_lifted")); } catch (e) { diff --git a/meshchatx/src/frontend/components/call/CallOverlay.vue b/meshchatx/src/frontend/components/call/CallOverlay.vue index 0d5cd48..5b46fee 100644 --- a/meshchatx/src/frontend/components/call/CallOverlay.vue +++ b/meshchatx/src/frontend/components/call/CallOverlay.vue @@ -416,7 +416,7 @@ export default { }, async answerCall() { try { - await window.axios.get("/api/v1/telephone/answer"); + await window.api.get("/api/v1/telephone/answer"); } catch { ToastUtils.error(this.$t("call.failed_to_answer_call")); } @@ -424,14 +424,14 @@ export default { async hangupCall() { try { this.$emit("hangup"); - await window.axios.get("/api/v1/telephone/hangup"); + await window.api.get("/api/v1/telephone/hangup"); } catch { ToastUtils.error(this.$t("call.failed_to_hangup_call")); } }, async sendToVoicemail() { try { - await window.axios.get("/api/v1/telephone/send-to-voicemail"); + await window.api.get("/api/v1/telephone/send-to-voicemail"); ToastUtils.success(this.$t("call.call_sent_to_voicemail")); } catch { ToastUtils.error(this.$t("call.failed_to_send_to_voicemail")); @@ -449,7 +449,7 @@ export default { const endpoint = isCurrentlyMuted ? "/api/v1/telephone/unmute-transmit" : "/api/v1/telephone/mute-transmit"; - await window.axios.get(endpoint); + await window.api.get(endpoint); setTimeout(() => { this.isMicMuting = false; @@ -473,7 +473,7 @@ export default { const endpoint = isCurrentlyMuted ? "/api/v1/telephone/unmute-receive" : "/api/v1/telephone/mute-receive"; - await window.axios.get(endpoint); + await window.api.get(endpoint); setTimeout(() => { this.isSpeakerMuting = false; diff --git a/meshchatx/src/frontend/components/call/CallPage.vue b/meshchatx/src/frontend/components/call/CallPage.vue index ad3f85f..e6c6065 100644 --- a/meshchatx/src/frontend/components/call/CallPage.vue +++ b/meshchatx/src/frontend/components/call/CallPage.vue @@ -2641,7 +2641,7 @@ export default { }, async getConfig() { try { - const response = await window.axios.get("/api/v1/config"); + const response = await window.api.get("/api/v1/config"); this.config = response.data.config; } catch (e) { console.log(e); @@ -2649,7 +2649,7 @@ export default { }, async updateConfig(config) { try { - const response = await window.axios.patch("/api/v1/config", config); + const response = await window.api.patch("/api/v1/config", config); if (response.data?.config) { this.config = response.data.config; } @@ -2660,7 +2660,7 @@ export default { }, async getAudioProfiles() { try { - const response = await window.axios.get("/api/v1/telephone/audio-profiles"); + const response = await window.api.get("/api/v1/telephone/audio-profiles"); this.audioProfiles = response.data.audio_profiles; this.selectedAudioProfileId = response.data.default_audio_profile_id; } catch (e) { @@ -2669,7 +2669,7 @@ export default { }, async getStatus() { try { - const response = await window.axios.get("/api/v1/telephone/status"); + const response = await window.api.get("/api/v1/telephone/status"); const oldCall = this.activeCall; const newCall = response.data.active_call; @@ -2756,7 +2756,7 @@ export default { this.callHistoryOffset = 0; } - const response = await window.axios.get( + const response = await window.api.get( `/api/v1/telephone/history?limit=${this.callHistoryLimit}&offset=${this.callHistoryOffset}${ this.callHistorySearch ? `&search=${encodeURIComponent(this.callHistorySearch)}` : "" }` @@ -2792,7 +2792,7 @@ export default { this.hasMoreDiscovery = true; } - const response = await window.axios.get("/api/v1/announces", { + const response = await window.api.get("/api/v1/announces", { params: { aspect: "lxst.telephony", limit: this.discoveryLimit, @@ -2826,7 +2826,7 @@ export default { }, async toggleDoNotDisturb(value) { try { - await window.axios.patch("/api/v1/config", { + await window.api.patch("/api/v1/config", { do_not_disturb_enabled: value, }); if (this.config) { @@ -2839,7 +2839,7 @@ export default { }, async toggleAllowCallsFromContactsOnly(value) { try { - await window.axios.patch("/api/v1/config", { + await window.api.patch("/api/v1/config", { telephone_allow_calls_from_contacts_only: value, }); if (this.config) { @@ -2852,7 +2852,7 @@ export default { }, async toggleCallRecording(value) { try { - await window.axios.patch("/api/v1/config", { + await window.api.patch("/api/v1/config", { call_recording_enabled: value, }); if (this.config) { @@ -2866,7 +2866,7 @@ export default { async clearHistory() { if (!confirm(this.$t("common.delete_confirm"))) return; try { - await window.axios.delete("/api/v1/telephone/history"); + await window.api.delete("/api/v1/telephone/history"); this.callHistory = []; ToastUtils.success(this.$t("call.call_history_cleared")); } catch (e) { @@ -2877,7 +2877,7 @@ export default { async blockIdentity(hash) { if (!confirm(`Are you sure you want to banish this identity?`)) return; try { - await window.axios.post("/api/v1/blocked-destinations", { + await window.api.post("/api/v1/blocked-destinations", { destination_hash: hash, }); ToastUtils.success(this.$t("call.identity_banished")); @@ -2888,7 +2888,7 @@ export default { }, async getVoicemailStatus() { try { - const response = await window.axios.get("/api/v1/telephone/voicemail/status"); + const response = await window.api.get("/api/v1/telephone/voicemail/status"); this.voicemailStatus = response.data; } catch (e) { console.log(e); @@ -2896,7 +2896,7 @@ export default { }, async getRingtoneStatus() { try { - const response = await window.axios.get("/api/v1/telephone/ringtones/status"); + const response = await window.api.get("/api/v1/telephone/ringtones/status"); this.ringtoneStatus = response.data; } catch (e) { console.log(e); @@ -2904,7 +2904,7 @@ export default { }, async getRingtones() { try { - const response = await window.axios.get("/api/v1/telephone/ringtones"); + const response = await window.api.get("/api/v1/telephone/ringtones"); this.ringtones = response.data; } catch (e) { console.error("Failed to get ringtones:", e); @@ -2913,7 +2913,7 @@ export default { async deleteRingtone(ringtone) { if (!confirm(this.$t("common.delete_confirm"))) return; try { - await window.axios.delete(`/api/v1/telephone/ringtones/${ringtone.id}`); + await window.api.delete(`/api/v1/telephone/ringtones/${ringtone.id}`); ToastUtils.success(this.$t("call.ringtone_deleted")); await this.getRingtones(); await this.getRingtoneStatus(); @@ -2924,7 +2924,7 @@ export default { }, async setPrimaryRingtone(ringtone) { try { - await window.axios.patch(`/api/v1/telephone/ringtones/${ringtone.id}`, { + await window.api.patch(`/api/v1/telephone/ringtones/${ringtone.id}`, { is_primary: true, }); ToastUtils.success(this.$t("call.primary_ringtone_set")); @@ -2941,7 +2941,7 @@ export default { }, async saveRingtoneName() { try { - await window.axios.patch(`/api/v1/telephone/ringtones/${this.editingRingtoneId}`, { + await window.api.patch(`/api/v1/telephone/ringtones/${this.editingRingtoneId}`, { display_name: this.editingRingtoneName, }); this.editingRingtoneId = null; @@ -2960,7 +2960,7 @@ export default { formData.append("file", file); try { - await window.axios.post("/api/v1/telephone/ringtones/upload", formData, { + await window.api.post("/api/v1/telephone/ringtones/upload", formData, { headers: { "Content-Type": "multipart/form-data", }, @@ -3016,7 +3016,7 @@ export default { }, async getVoicemails() { try { - const response = await window.axios.get("/api/v1/telephone/voicemails", { + const response = await window.api.get("/api/v1/telephone/voicemails", { params: { search: this.voicemailSearch }, }); this.voicemails = response.data.voicemails || []; @@ -3037,7 +3037,7 @@ export default { }, async getContacts() { try { - const response = await window.axios.get("/api/v1/telephone/contacts", { + const response = await window.api.get("/api/v1/telephone/contacts", { params: { search: this.contactsSearch }, }); this.contacts = response.data.contacts || (Array.isArray(response.data) ? response.data : []); @@ -3122,10 +3122,10 @@ export default { if (this.editingContact && this.editingContact.custom_image && !contact.custom_image) { contact.clear_image = true; } - await window.axios.patch(`/api/v1/telephone/contacts/${contact.id}`, contact); + await window.api.patch(`/api/v1/telephone/contacts/${contact.id}`, contact); ToastUtils.success(this.$t("call.contact_updated")); } else { - await window.axios.post("/api/v1/telephone/contacts", contact); + await window.api.post("/api/v1/telephone/contacts", contact); ToastUtils.success(this.$t("call.contact_added")); } this.isContactModalOpen = false; @@ -3137,7 +3137,7 @@ export default { async deleteContact(contactId) { if (!confirm("Are you sure you want to delete this contact?")) return; try { - await window.axios.delete(`/api/v1/telephone/contacts/${contactId}`); + await window.api.delete(`/api/v1/telephone/contacts/${contactId}`); ToastUtils.success(this.$t("call.contact_deleted")); this.getContacts(); } catch { @@ -3178,7 +3178,7 @@ export default { async generateGreeting() { this.isGeneratingGreeting = true; try { - await window.axios.post("/api/v1/telephone/voicemail/generate-greeting"); + await window.api.post("/api/v1/telephone/voicemail/generate-greeting"); ToastUtils.success(this.$t("call.greeting_generated_successfully")); await this.getVoicemailStatus(); } catch (e) { @@ -3196,7 +3196,7 @@ export default { formData.append("file", file); try { - await window.axios.post("/api/v1/telephone/voicemail/greeting/upload", formData, { + await window.api.post("/api/v1/telephone/voicemail/greeting/upload", formData, { headers: { "Content-Type": "multipart/form-data", }, @@ -3214,7 +3214,7 @@ export default { if (!confirm("Are you sure you want to delete your custom greeting?")) return; try { - await window.axios.delete("/api/v1/telephone/voicemail/greeting"); + await window.api.delete("/api/v1/telephone/voicemail/greeting"); ToastUtils.success(this.$t("call.greeting_deleted")); await this.getVoicemailStatus(); } catch { @@ -3223,7 +3223,7 @@ export default { }, async startRecordingGreetingMic() { try { - await window.axios.post("/api/v1/telephone/voicemail/greeting/record/start"); + await window.api.post("/api/v1/telephone/voicemail/greeting/record/start"); await this.getVoicemailStatus(); } catch { ToastUtils.error(this.$t("call.failed_to_start_recording_greeting")); @@ -3231,7 +3231,7 @@ export default { }, async stopRecordingGreetingMic() { try { - await window.axios.post("/api/v1/telephone/voicemail/greeting/record/stop"); + await window.api.post("/api/v1/telephone/voicemail/greeting/record/stop"); await this.getVoicemailStatus(); ToastUtils.success(this.$t("call.greeting_recorded_from_mic")); } catch { @@ -3277,7 +3277,7 @@ export default { async markVoicemailAsRead(voicemail) { if (!voicemail.is_read) { try { - await window.axios.post(`/api/v1/telephone/voicemails/${voicemail.id}/read`); + await window.api.post(`/api/v1/telephone/voicemails/${voicemail.id}/read`); voicemail.is_read = 1; this.unreadVoicemailsCount = Math.max(0, this.unreadVoicemailsCount - 1); } catch (e) { @@ -3292,7 +3292,7 @@ export default { }, async deleteVoicemail(voicemailId) { try { - await window.axios.delete(`/api/v1/telephone/voicemails/${voicemailId}`); + await window.api.delete(`/api/v1/telephone/voicemails/${voicemailId}`); this.getVoicemails(); ToastUtils.success(this.$t("call.voicemail_deleted")); } catch { @@ -3301,7 +3301,7 @@ export default { }, async getRecordings() { try { - const response = await window.axios.get("/api/v1/telephone/recordings", { + const response = await window.api.get("/api/v1/telephone/recordings", { params: { search: this.recordingSearch }, }); this.recordings = response.data.recordings || []; @@ -3351,7 +3351,7 @@ export default { async deleteRecording(recordingId) { if (!confirm("Are you sure you want to delete this recording?")) return; try { - await window.axios.delete(`/api/v1/telephone/recordings/${recordingId}`); + await window.api.delete(`/api/v1/telephone/recordings/${recordingId}`); this.getRecordings(); ToastUtils.success(this.$t("call.recording_deleted")); } catch { @@ -3410,7 +3410,7 @@ export default { this.wasDeclined = false; try { - await window.axios.get(`/api/v1/telephone/call/${hashToCall}`); + await window.api.get(`/api/v1/telephone/call/${hashToCall}`); } catch (e) { this.initiationStatus = null; ToastUtils.error(e.response?.data?.message || "Failed to initiate call"); @@ -3457,7 +3457,7 @@ export default { }, async answerCall() { try { - await window.axios.get("/api/v1/telephone/answer"); + await window.api.get("/api/v1/telephone/answer"); } catch { ToastUtils.error(this.$t("call.failed_to_answer_call")); } @@ -3467,14 +3467,14 @@ export default { if (this.activeCall && this.activeCall.is_incoming && this.activeCall.status === 4) { this.wasDeclined = true; } - await window.axios.get("/api/v1/telephone/hangup"); + await window.api.get("/api/v1/telephone/hangup"); } catch { ToastUtils.error(this.$t("call.failed_to_hangup_call")); } }, async sendToVoicemail() { try { - await window.axios.get("/api/v1/telephone/send-to-voicemail"); + await window.api.get("/api/v1/telephone/send-to-voicemail"); ToastUtils.success(this.$t("call.call_sent_to_voicemail")); } catch { ToastUtils.error(this.$t("call.failed_to_send_to_voicemail")); @@ -3482,7 +3482,7 @@ export default { }, async switchAudioProfile(audioProfileId) { try { - await window.axios.get(`/api/v1/telephone/switch-audio-profile/${audioProfileId}`); + await window.api.get(`/api/v1/telephone/switch-audio-profile/${audioProfileId}`); } catch { ToastUtils.error(this.$t("call.failed_to_switch_audio_profile")); } @@ -3501,7 +3501,7 @@ export default { const endpoint = isCurrentlyMuted ? "/api/v1/telephone/unmute-transmit" : "/api/v1/telephone/mute-transmit"; - await window.axios.get(endpoint); + await window.api.get(endpoint); // clear muting state after a short delay to allow backend to catch up setTimeout(() => { @@ -3528,7 +3528,7 @@ export default { const endpoint = isCurrentlyMuted ? "/api/v1/telephone/unmute-receive" : "/api/v1/telephone/mute-receive"; - await window.axios.get(endpoint); + await window.api.get(endpoint); // clear muting state after a short delay to allow backend to catch up setTimeout(() => { diff --git a/meshchatx/src/frontend/components/call/RingtoneEditor.vue b/meshchatx/src/frontend/components/call/RingtoneEditor.vue index 4dd8f22..df0a9bf 100644 --- a/meshchatx/src/frontend/components/call/RingtoneEditor.vue +++ b/meshchatx/src/frontend/components/call/RingtoneEditor.vue @@ -414,7 +414,7 @@ export default { formData.append("file", blob, filename); - await window.axios.post("/api/v1/telephone/ringtones/upload", formData, { + await window.api.post("/api/v1/telephone/ringtones/upload", formData, { headers: { "Content-Type": "multipart/form-data" }, }); diff --git a/meshchatx/src/frontend/components/call/RingtoneEditorModal.vue b/meshchatx/src/frontend/components/call/RingtoneEditorModal.vue index 695bc91..5d6703a 100644 --- a/meshchatx/src/frontend/components/call/RingtoneEditorModal.vue +++ b/meshchatx/src/frontend/components/call/RingtoneEditorModal.vue @@ -431,7 +431,7 @@ export default { formData.append("file", blob, filename); if (this.saveAsNew) { - await window.axios.post("/api/v1/telephone/ringtones/upload", formData, { + await window.api.post("/api/v1/telephone/ringtones/upload", formData, { headers: { "Content-Type": "multipart/form-data" }, }); } else { @@ -441,12 +441,12 @@ export default { // but the user might expect replacement. // The backend doesn't seem to support direct replacement via the upload endpoint. // Let's just upload it. - await window.axios.post("/api/v1/telephone/ringtones/upload", formData, { + await window.api.post("/api/v1/telephone/ringtones/upload", formData, { headers: { "Content-Type": "multipart/form-data" }, }); // If not saving as new, maybe delete the old one? - // await window.axios.delete(`/api/v1/telephone/ringtones/${this.ringtone.id}`); + // await window.api.delete(`/api/v1/telephone/ringtones/${this.ringtone.id}`); } ToastUtils.success(this.$t("call.ringtone_saved")); diff --git a/meshchatx/src/frontend/components/contacts/ContactsPage.vue b/meshchatx/src/frontend/components/contacts/ContactsPage.vue index abde623..da6f2fb 100644 --- a/meshchatx/src/frontend/components/contacts/ContactsPage.vue +++ b/meshchatx/src/frontend/components/contacts/ContactsPage.vue @@ -453,7 +453,7 @@ export default { methods: { async getConfig() { try { - const response = await window.axios.get("/api/v1/config"); + const response = await window.api.get("/api/v1/config"); this.config = response.data.config; this.myIdentityUri = this.buildMyIdentityUri(); if (this.myIdentityUri) { @@ -478,7 +478,7 @@ export default { this.contactsOffset = 0; } try { - const response = await window.axios.get("/api/v1/telephone/contacts", { + const response = await window.api.get("/api/v1/telephone/contacts", { params: { search: this.contactsSearch || undefined, limit: this.contactsPageSize, @@ -548,7 +548,7 @@ export default { }, async importContacts(contacts) { try { - const response = await window.axios.post("/api/v1/telephone/contacts/import", { + const response = await window.api.post("/api/v1/telephone/contacts/import", { contacts, }); const added = response.data?.added ?? 0; @@ -561,7 +561,7 @@ export default { }, async exportContacts() { try { - const response = await window.axios.get("/api/v1/telephone/contacts/export"); + const response = await window.api.get("/api/v1/telephone/contacts/export"); const contacts = response.data?.contacts ?? []; const blob = new Blob([JSON.stringify({ contacts }, null, 2)], { type: "application/json", @@ -628,13 +628,13 @@ export default { return; } - const existing = await window.axios.get(`/api/v1/telephone/contacts/check/${destinationHash}`); + const existing = await window.api.get(`/api/v1/telephone/contacts/check/${destinationHash}`); if (existing.data?.id) { ToastUtils.info(this.$t("contacts.contact_already_exists")); return; } - await window.axios.post("/api/v1/telephone/contacts", { + await window.api.post("/api/v1/telephone/contacts", { name: this.newContactName?.trim() || `Contact ${destinationHash.slice(0, 8)}`, remote_identity_hash: destinationHash, lxmf_address: destinationHash, @@ -673,7 +673,7 @@ export default { if (!contact?.id) return; if (!window.confirm(this.$t("contacts.remove_contact_confirm"))) return; try { - await window.axios.delete(`/api/v1/telephone/contacts/${contact.id}`); + await window.api.delete(`/api/v1/telephone/contacts/${contact.id}`); ToastUtils.success(this.$t("contacts.contact_removed")); await this.getContacts(); } catch { @@ -707,7 +707,7 @@ export default { const destinationHash = (contact?.lxmf_address || contact?.remote_identity_hash || "").toLowerCase(); if (!/^[0-9a-f]{32}$/.test(destinationHash)) return null; try { - const response = await window.axios.get("/api/v1/announces", { + const response = await window.api.get("/api/v1/announces", { params: { destination_hash: destinationHash, limit: 1, diff --git a/meshchatx/src/frontend/components/debug/DebugLogsPage.vue b/meshchatx/src/frontend/components/debug/DebugLogsPage.vue index c0ca9f4..1c47791 100644 --- a/meshchatx/src/frontend/components/debug/DebugLogsPage.vue +++ b/meshchatx/src/frontend/components/debug/DebugLogsPage.vue @@ -323,7 +323,7 @@ export default { level: this.level || undefined, is_anomaly: this.is_anomaly ? true : undefined, }; - const response = await window.axios.get("/api/v1/debug/logs", { params }); + const response = await window.api.get("/api/v1/debug/logs", { params }); this.logs = response.data.logs; this.total = response.data.total; } catch (e) { @@ -342,7 +342,7 @@ export default { search: this.accessSearch || undefined, outcome: this.accessOutcome || undefined, }; - const response = await window.axios.get("/api/v1/debug/access-attempts", { params }); + const response = await window.api.get("/api/v1/debug/access-attempts", { params }); this.accessAttempts = response.data.attempts; this.accessTotal = response.data.total; } catch (e) { diff --git a/meshchatx/src/frontend/components/docs/DocsPage.vue b/meshchatx/src/frontend/components/docs/DocsPage.vue index d050ec4..7d8c1d9 100644 --- a/meshchatx/src/frontend/components/docs/DocsPage.vue +++ b/meshchatx/src/frontend/components/docs/DocsPage.vue @@ -630,7 +630,7 @@ export default { methods: { async fetchStatus() { try { - const response = await window.axios.get("/api/v1/docs/status"); + const response = await window.api.get("/api/v1/docs/status"); this.status = response.data; // Auto-download Reticulum docs if missing and we're not already doing something @@ -650,7 +650,7 @@ export default { }, async fetchMeshChatXDocs() { try { - const response = await window.axios.get("/api/v1/meshchatx-docs/list"); + const response = await window.api.get("/api/v1/meshchatx-docs/list"); this.meshchatxDocs = response.data; if (this.meshchatxDocs.length > 0 && !this.selectedDocPath) { this.selectDoc(this.meshchatxDocs[0].path); @@ -662,7 +662,7 @@ export default { async selectDoc(path) { this.selectedDocPath = path; try { - const response = await window.axios.get("/api/v1/meshchatx-docs/content", { + const response = await window.api.get("/api/v1/meshchatx-docs/content", { params: { path }, }); this.selectedDocContent = response.data; @@ -675,7 +675,7 @@ export default { }, async updateDocs() { try { - await window.axios.post("/api/v1/docs/update"); + await window.api.post("/api/v1/docs/update"); this.fetchStatus(); } catch (error) { console.error("Failed to trigger docs update:", error); @@ -685,12 +685,12 @@ export default { if (!this.alternateDocsUrl) return; try { // Get current config - const configResponse = await window.axios.get("/api/v1/config"); + const configResponse = await window.api.get("/api/v1/config"); const currentUrls = configResponse.data.config.docs_download_urls || ""; const newUrls = currentUrls ? `${currentUrls},${this.alternateDocsUrl}` : this.alternateDocsUrl; // Update config - await window.axios.patch("/api/v1/config", { + await window.api.patch("/api/v1/config", { docs_download_urls: newUrls, }); @@ -704,7 +704,7 @@ export default { }, async switchVersion(version) { try { - await window.axios.post("/api/v1/docs/switch", { version }); + await window.api.post("/api/v1/docs/switch", { version }); this.showVersions = false; this.selectedReticulumPath = null; this.fetchStatus(); @@ -725,7 +725,7 @@ export default { } try { - await window.axios.delete(`/api/v1/docs/version/${encodeURIComponent(version)}`); + await window.api.delete(`/api/v1/docs/version/${encodeURIComponent(version)}`); this.fetchStatus(); ToastUtils.success(`Version ${version} deleted`); } catch (error) { @@ -744,7 +744,7 @@ export default { formData.append("file", file); try { - await window.axios.post(`/api/v1/docs/upload?version=${encodeURIComponent(version)}`, formData, { + await window.api.post(`/api/v1/docs/upload?version=${encodeURIComponent(version)}`, formData, { headers: { "Content-Type": "multipart/form-data", }, @@ -776,7 +776,7 @@ export default { try { this.showLanguages = false; this.selectedReticulumPath = null; - await window.axios.patch("/api/v1/config", { + await window.api.patch("/api/v1/config", { language: langCode, }); // The app will update automatically via websocket config sync @@ -798,7 +798,7 @@ export default { if (!this.searchQuery) return; this.isSearching = true; try { - const response = await window.axios.get("/api/v1/docs/search", { + const response = await window.api.get("/api/v1/docs/search", { params: { q: this.searchQuery, lang: this.currentLang, diff --git a/meshchatx/src/frontend/components/interfaces/AddInterfacePage.vue b/meshchatx/src/frontend/components/interfaces/AddInterfacePage.vue index a6d75b7..462ead1 100644 --- a/meshchatx/src/frontend/components/interfaces/AddInterfacePage.vue +++ b/meshchatx/src/frontend/components/interfaces/AddInterfacePage.vue @@ -1189,7 +1189,7 @@ export default { methods: { async getConfig() { try { - const response = await window.axios.get(`/api/v1/config`); + const response = await window.api.get(`/api/v1/config`); this.config = response.data.config; } catch (e) { console.log(e); @@ -1197,7 +1197,7 @@ export default { }, async updateConfig(config) { try { - const response = await window.axios.patch("/api/v1/config", config); + const response = await window.api.patch("/api/v1/config", config); this.config = response.data.config; } catch (e) { ToastUtils.error(this.$t("common.save_failed")); @@ -1212,7 +1212,7 @@ export default { }, async loadReticulumDiscoveryConfig() { try { - const response = await window.axios.get(`/api/v1/reticulum/discovery`); + const response = await window.api.get(`/api/v1/reticulum/discovery`); const discovery = response.data?.discovery ?? {}; this.reticulumDiscovery.discover_interfaces = this.parseBool(discovery.discover_interfaces); this.reticulumDiscovery.interface_discovery_whitelist = discovery.interface_discovery_whitelist ?? ""; @@ -1230,7 +1230,7 @@ export default { interface_discovery_whitelist: this.reticulumDiscovery.interface_discovery_whitelist || null, interface_discovery_blacklist: this.reticulumDiscovery.interface_discovery_blacklist || null, }; - await window.axios.patch(`/api/v1/reticulum/discovery`, payload); + await window.api.patch(`/api/v1/reticulum/discovery`, payload); ToastUtils.success("Discovery listener preferences saved."); } catch (e) { ToastUtils.error("Failed to save discovery preferences."); @@ -1241,7 +1241,7 @@ export default { }, async loadComports() { try { - const response = await window.axios.get(`/api/v1/comports`); + const response = await window.api.get(`/api/v1/comports`); this.comports = response.data.comports; } catch (e) { console.log(e); @@ -1249,7 +1249,7 @@ export default { }, async loadCommunityInterfaces() { try { - const response = await window.axios.get(`/api/v1/community-interfaces`); + const response = await window.api.get(`/api/v1/community-interfaces`); this.communityInterfaces = response.data.interfaces ?? []; } catch (e) { console.log(e); @@ -1260,7 +1260,7 @@ export default { }, async loadInterfaceToEdit(interfaceName) { try { - const response = await window.axios.get(`/api/v1/reticulum/interfaces`); + const response = await window.api.get(`/api/v1/reticulum/interfaces`); const interfaces = response.data.interfaces; const iface = interfaces[interfaceName]; if (!iface) { @@ -1412,7 +1412,7 @@ export default { ? (this.I2PSettings.newInterfacePeers || []).map((p) => String(p).trim()).filter(Boolean) : undefined; - const response = await window.axios.post(`/api/v1/reticulum/interfaces/add`, { + const response = await window.api.post(`/api/v1/reticulum/interfaces/add`, { allow_overwriting_interface: this.isEditingInterface, name: this.newInterfaceName, type: this.newInterfaceType, diff --git a/meshchatx/src/frontend/components/interfaces/ImportInterfacesModal.vue b/meshchatx/src/frontend/components/interfaces/ImportInterfacesModal.vue index 8372a54..be01385 100644 --- a/meshchatx/src/frontend/components/interfaces/ImportInterfacesModal.vue +++ b/meshchatx/src/frontend/components/interfaces/ImportInterfacesModal.vue @@ -186,7 +186,7 @@ export default { try { // fetch preview of interfaces to import - const response = await window.axios.post("/api/v1/reticulum/interfaces/import-preview", { + const response = await window.api.post("/api/v1/reticulum/interfaces/import-preview", { config: await file.text(), }); @@ -249,7 +249,7 @@ export default { try { // import interfaces - await window.axios.post("/api/v1/reticulum/interfaces/import", { + await window.api.post("/api/v1/reticulum/interfaces/import", { config: await this.selectedFile.text(), selected_interface_names: this.selectedInterfaces, }); diff --git a/meshchatx/src/frontend/components/interfaces/InterfacesPage.vue b/meshchatx/src/frontend/components/interfaces/InterfacesPage.vue index 831453b..9d33158 100644 --- a/meshchatx/src/frontend/components/interfaces/InterfacesPage.vue +++ b/meshchatx/src/frontend/components/interfaces/InterfacesPage.vue @@ -796,11 +796,11 @@ export default { }, async loadInterfaces() { try { - const response = await window.axios.get(`/api/v1/reticulum/interfaces`); + const response = await window.api.get(`/api/v1/reticulum/interfaces`); this.interfaces = response.data.interfaces; // also check app info for running state - const appInfoResponse = await window.axios.get(`/api/v1/app/info`); + const appInfoResponse = await window.api.get(`/api/v1/app/info`); this.isReticulumRunning = appInfoResponse.data.app_info.is_reticulum_running; } catch { // do nothing if failed to load interfaces @@ -809,7 +809,7 @@ export default { async updateInterfaceStats() { try { // fetch interface stats - const response = await window.axios.get(`/api/v1/interface-stats`); + const response = await window.api.get(`/api/v1/interface-stats`); // update data const interfaces = response.data.interface_stats?.interfaces ?? []; @@ -823,7 +823,7 @@ export default { async enableInterface(interfaceName) { // enable interface try { - await window.axios.post(`/api/v1/reticulum/interfaces/enable`, { + await window.api.post(`/api/v1/reticulum/interfaces/enable`, { name: interfaceName, }); this.trackInterfaceChange(interfaceName); @@ -838,7 +838,7 @@ export default { async disableInterface(interfaceName) { // disable interface try { - await window.axios.post(`/api/v1/reticulum/interfaces/disable`, { + await window.api.post(`/api/v1/reticulum/interfaces/disable`, { name: interfaceName, }); this.trackInterfaceChange(interfaceName); @@ -866,7 +866,7 @@ export default { // delete interface try { - await window.axios.post(`/api/v1/reticulum/interfaces/delete`, { + await window.api.post(`/api/v1/reticulum/interfaces/delete`, { name: interfaceName, }); this.trackInterfaceChange(interfaceName); @@ -881,7 +881,7 @@ export default { async exportInterfaces() { try { // fetch exported interfaces - const response = await window.axios.post("/api/v1/reticulum/interfaces/export"); + const response = await window.api.post("/api/v1/reticulum/interfaces/export"); // download file to browser DownloadUtils.downloadFile("meshchat_interfaces.txt", new Blob([response.data])); @@ -893,7 +893,7 @@ export default { async exportInterface(interfaceName) { try { // fetch exported interfaces - const response = await window.axios.post("/api/v1/reticulum/interfaces/export", { + const response = await window.api.post("/api/v1/reticulum/interfaces/export", { selected_interface_names: [interfaceName], }); @@ -916,7 +916,7 @@ export default { }, async loadDiscoveredInterfaces() { try { - const response = await window.axios.get(`/api/v1/reticulum/discovered-interfaces`); + const response = await window.api.get(`/api/v1/reticulum/discovered-interfaces`); const incoming = response.data?.interfaces ?? []; const active = response.data?.active ?? []; @@ -1021,7 +1021,7 @@ export default { }, async loadDiscoveryConfig() { try { - const response = await window.axios.get(`/api/v1/reticulum/discovery`); + const response = await window.api.get(`/api/v1/reticulum/discovery`); const discovery = response.data?.discovery ?? {}; this.discoveryConfig.discover_interfaces = this.parseBool(discovery.discover_interfaces); this.discoveryConfig.interface_discovery_sources = discovery.interface_discovery_sources ?? ""; @@ -1066,7 +1066,7 @@ export default { network_identity: this.discoveryConfig.network_identity || null, }; - await window.axios.patch(`/api/v1/reticulum/discovery`, payload); + await window.api.patch(`/api/v1/reticulum/discovery`, payload); ToastUtils.success(this.$t("interfaces.discovery_settings_saved")); await this.loadDiscoveryConfig(); } catch (e) { @@ -1192,7 +1192,7 @@ export default { interface_discovery_whitelist: nextWhitelist.length ? nextWhitelist.join(",") : null, interface_discovery_blacklist: nextBlacklist.length ? nextBlacklist.join(",") : null, }; - await window.axios.patch(`/api/v1/reticulum/discovery`, payload); + await window.api.patch(`/api/v1/reticulum/discovery`, payload); this.discoveryConfig.interface_discovery_whitelist = payload.interface_discovery_whitelist || ""; this.discoveryConfig.interface_discovery_blacklist = payload.interface_discovery_blacklist || ""; ToastUtils.success( @@ -1251,7 +1251,7 @@ export default { try { this.reloadingRns = true; - const response = await window.axios.post("/api/v1/reticulum/reload"); + const response = await window.api.post("/api/v1/reticulum/reload"); ToastUtils.success(response.data.message); GlobalState.hasPendingInterfaceChanges = false; GlobalState.modifiedInterfaceNames.clear(); diff --git a/meshchatx/src/frontend/components/map/MapPage.vue b/meshchatx/src/frontend/components/map/MapPage.vue index 0fb38ac..13a40fb 100644 --- a/meshchatx/src/frontend/components/map/MapPage.vue +++ b/meshchatx/src/frontend/components/map/MapPage.vue @@ -1662,7 +1662,7 @@ export default { }, async getConfig() { try { - const response = await window.axios.get("/api/v1/config"); + const response = await window.api.get("/api/v1/config"); this.config = response.data.config; this.offlineEnabled = this.config.map_offline_enabled; this.cachingEnabled = @@ -1680,7 +1680,7 @@ export default { }, async loadMBTilesList() { try { - const response = await window.axios.get("/api/v1/map/mbtiles"); + const response = await window.api.get("/api/v1/map/mbtiles"); this.mbtilesList = response.data; } catch (e) { console.error("Failed to load MBTiles list", e); @@ -1688,7 +1688,7 @@ export default { }, async setActiveMBTiles(filename) { try { - await window.axios.post("/api/v1/map/mbtiles/active", { filename }); + await window.api.post("/api/v1/map/mbtiles/active", { filename }); await this.checkOfflineMap(); await this.loadMBTilesList(); ToastUtils.success(this.$t("map.source_updated")); @@ -1699,7 +1699,7 @@ export default { async deleteMBTiles(filename) { if (!confirm(`Are you sure you want to delete ${filename}?`)) return; try { - await window.axios.delete(`/api/v1/map/mbtiles/${filename}`); + await window.api.delete(`/api/v1/map/mbtiles/${filename}`); await this.loadMBTilesList(); if (this.metadata && this.metadata.path && this.metadata.path.endsWith(filename)) { await this.checkOfflineMap(); @@ -1711,7 +1711,7 @@ export default { }, async saveMBTilesDir() { try { - await window.axios.patch("/api/v1/config", { + await window.api.patch("/api/v1/config", { map_mbtiles_dir: this.mbtilesDir, }); ToastUtils.success(this.$t("map.storage_saved")); @@ -2142,7 +2142,7 @@ export default { }, async checkOfflineMap() { try { - const response = await window.axios.get("/api/v1/map/offline"); + const response = await window.api.get("/api/v1/map/offline"); if (response.data && response.data.loaded !== false && Object.keys(response.data).length > 0) { this.metadata = response.data; this.hasOfflineMap = true; @@ -2240,7 +2240,7 @@ export default { // Persist setting try { - await window.axios.patch("/api/v1/config", { + await window.api.patch("/api/v1/config", { map_offline_enabled: enabled, }); } catch (e) { @@ -2252,7 +2252,7 @@ export default { this.tileErrorCount = 0; this.showOfflineHint = false; try { - await window.axios.patch("/api/v1/config", { + await window.api.patch("/api/v1/config", { map_tile_cache_enabled: enabled, }); } catch (e) { @@ -2275,7 +2275,7 @@ export default { return; } try { - await window.axios.delete(`/api/v1/map/export/${this.exportId}`); + await window.api.delete(`/api/v1/map/export/${this.exportId}`); this.exportStatus = null; this.exportId = null; ToastUtils.success(this.$t("map.export_cancelled")); @@ -2287,7 +2287,7 @@ export default { if (!this.selectedBbox) return; this.isExporting = true; try { - const response = await window.axios.post("/api/v1/map/export", { + const response = await window.api.post("/api/v1/map/export", { bbox: this.selectedBbox, min_zoom: this.exportMinZoom, max_zoom: this.exportMaxZoom, @@ -2306,7 +2306,7 @@ export default { if (this.exportInterval) clearInterval(this.exportInterval); this.exportInterval = setInterval(async () => { try { - const response = await window.axios.get(`/api/v1/map/export/${this.exportId}`); + const response = await window.api.get(`/api/v1/map/export/${this.exportId}`); this.exportStatus = response.data; if (this.exportStatus.status === "completed" || this.exportStatus.status === "failed") { clearInterval(this.exportInterval); @@ -2344,7 +2344,7 @@ export default { formData.append("file", file); try { - const response = await window.axios.post("/api/v1/map/offline", formData, { + const response = await window.api.post("/api/v1/map/offline", formData, { headers: { "Content-Type": "multipart/form-data", }, @@ -2381,7 +2381,7 @@ export default { const zoom = Math.round(view.getZoom()); try { - await window.axios.patch("/api/v1/config", { + await window.api.patch("/api/v1/config", { map_default_lat: center[1], map_default_lon: center[0], map_default_zoom: zoom, @@ -2401,7 +2401,7 @@ export default { }, async saveTileServerUrl() { try { - await window.axios.patch("/api/v1/config", { + await window.api.patch("/api/v1/config", { map_tile_server_url: this.tileServerUrl, }); this.updateMapSource(); @@ -2427,7 +2427,7 @@ export default { }, async saveNominatimApiUrl() { try { - await window.axios.patch("/api/v1/config", { + await window.api.patch("/api/v1/config", { map_nominatim_api_url: this.nominatimApiUrl, }); ToastUtils.success(this.$t("map.nominatim_api_saved")); @@ -2640,9 +2640,9 @@ export default { this.isMobileScreen = window.innerWidth < 640; }, async fetchPeers() { - if (!window.axios) return; + if (!window.api) return; try { - const response = await window.axios.get("/api/v1/lxmf/conversations"); + const response = await window.api.get("/api/v1/lxmf/conversations"); const peers = {}; for (const conv of response.data.conversations) { peers[conv.destination_hash] = conv; @@ -3259,7 +3259,7 @@ export default { this.showLoadDrawingModal = true; this.isLoadingDrawings = true; try { - const response = await window.axios.get("/api/v1/map/drawings"); + const response = await window.api.get("/api/v1/map/drawings"); this.savedDrawings = response.data.drawings; } catch { ToastUtils.error(this.$t("map.failed_load_drawings")); @@ -3283,7 +3283,7 @@ export default { }); try { - await window.axios.post("/api/v1/map/drawings", { + await window.api.post("/api/v1/map/drawings", { name: this.newDrawingName, data: json, }); @@ -3311,7 +3311,7 @@ export default { async deleteDrawing(drawing) { if (!confirm(`Delete drawing "${drawing.name}"?`)) return; try { - await window.axios.delete(`/api/v1/map/drawings/${drawing.id}`); + await window.api.delete(`/api/v1/map/drawings/${drawing.id}`); this.savedDrawings = this.savedDrawings.filter((d) => d.id !== drawing.id); ToastUtils.success(this.$t("map.deleted")); } catch { @@ -3368,9 +3368,9 @@ export default { } }, async fetchTelemetryMarkers() { - if (!window.axios) return; + if (!window.api) return; try { - const response = await window.axios.get("/api/v1/telemetry/peers"); + const response = await window.api.get("/api/v1/telemetry/peers"); this.telemetryList = response.data.telemetry; this.updateMarkers(); } catch (e) { @@ -3520,7 +3520,7 @@ export default { async drawTelemetryPath(hash) { this.clearTelemetryPath(); try { - const response = await window.axios.get(`/api/v1/telemetry/history/${hash}?limit=50`); + const response = await window.api.get(`/api/v1/telemetry/history/${hash}?limit=50`); const history = response.data.telemetry; if (!history || history.length < 2) return; @@ -3622,7 +3622,7 @@ export default { }, async toggleTracking(hash) { try { - const response = await window.axios.post(`/api/v1/telemetry/tracking/${hash}/toggle`, { + const response = await window.api.post(`/api/v1/telemetry/tracking/${hash}/toggle`, { is_tracking: this.selectedMarker.telemetry.is_tracking ? false : true, }); if (this.selectedMarker && this.selectedMarker.telemetry.destination_hash === hash) { @@ -3640,7 +3640,7 @@ export default { }, async mapDiscoveredNodes() { try { - const response = await window.axios.get("/api/v1/reticulum/discovered-interfaces"); + const response = await window.api.get("/api/v1/reticulum/discovered-interfaces"); const discovered = response.data?.interfaces ?? []; const nodesWithLoc = discovered.filter((n) => n.latitude != null && n.longitude != null); diff --git a/meshchatx/src/frontend/components/map/MiniChat.vue b/meshchatx/src/frontend/components/map/MiniChat.vue index 65e88a4..6b18e74 100644 --- a/meshchatx/src/frontend/components/map/MiniChat.vue +++ b/meshchatx/src/frontend/components/map/MiniChat.vue @@ -133,7 +133,7 @@ export default { if (!this.destinationHash) return; this.loading = true; try { - const response = await window.axios.get( + const response = await window.api.get( `/api/v1/lxmf-messages/conversation/${this.destinationHash}?count=20&order=desc` ); this.messages = (response.data.lxmf_messages || []).reverse(); @@ -148,7 +148,7 @@ export default { if (!this.newMessage.trim() || this.sending) return; this.sending = true; try { - const response = await window.axios.post("/api/v1/lxmf-messages/send", { + const response = await window.api.post("/api/v1/lxmf-messages/send", { lxmf_message: { destination_hash: this.destinationHash, content: this.newMessage, diff --git a/meshchatx/src/frontend/components/messages/ConversationDropDownMenu.vue b/meshchatx/src/frontend/components/messages/ConversationDropDownMenu.vue index eac0213..9b7189f 100644 --- a/meshchatx/src/frontend/components/messages/ConversationDropDownMenu.vue +++ b/meshchatx/src/frontend/components/messages/ConversationDropDownMenu.vue @@ -129,9 +129,7 @@ export default { async fetchContact() { if (!this.peer || !this.peer.destination_hash) return; try { - const response = await window.axios.get( - `/api/v1/telephone/contacts/check/${this.peer.destination_hash}` - ); + const response = await window.api.get(`/api/v1/telephone/contacts/check/${this.peer.destination_hash}`); if (response.data.is_contact) { this.contact = response.data.contact; } else { @@ -146,14 +144,14 @@ export default { try { if (!this.contact) { // create contact first - await window.axios.post("/api/v1/telephone/contacts", { + await window.api.post("/api/v1/telephone/contacts", { name: this.peer.display_name, remote_identity_hash: this.peer.destination_hash, is_telemetry_trusted: true, }); await this.fetchContact(); } else { - await window.axios.patch(`/api/v1/telephone/contacts/${this.contact.id}`, { + await window.api.patch(`/api/v1/telephone/contacts/${this.contact.id}`, { is_telemetry_trusted: newStatus, }); this.contact.is_telemetry_trusted = newStatus; @@ -182,7 +180,7 @@ export default { } try { - await window.axios.post("/api/v1/blocked-destinations", { + await window.api.post("/api/v1/blocked-destinations", { destination_hash: this.peer.destination_hash, }); GlobalEmitter.emit("block-status-changed"); @@ -195,7 +193,7 @@ export default { }, async onUnblockDestination() { try { - await window.axios.delete(`/api/v1/blocked-destinations/${this.peer.destination_hash}`); + await window.api.delete(`/api/v1/blocked-destinations/${this.peer.destination_hash}`); GlobalEmitter.emit("block-status-changed"); DialogUtils.alert(this.$t("banishment.banishment_lifted")); this.$emit("block-status-changed"); @@ -212,7 +210,7 @@ export default { // delete all lxmf messages from "us to destination" and from "destination to us" try { - await window.axios.delete(`/api/v1/lxmf-messages/conversation/${this.peer.destination_hash}`); + await window.api.delete(`/api/v1/lxmf-messages/conversation/${this.peer.destination_hash}`); } catch (e) { DialogUtils.alert(this.$t("messages.failed_delete_history")); console.log(e); @@ -238,7 +236,7 @@ export default { try { // ping destination - const response = await window.axios.get(`/api/v1/ping/${destinationHash}/lxmf.delivery`, { + const response = await window.api.get(`/api/v1/ping/${destinationHash}/lxmf.delivery`, { params: { timeout: 30, }, diff --git a/meshchatx/src/frontend/components/messages/ConversationViewer.vue b/meshchatx/src/frontend/components/messages/ConversationViewer.vue index 78f2bd3..2625db6 100644 --- a/meshchatx/src/frontend/components/messages/ConversationViewer.vue +++ b/meshchatx/src/frontend/components/messages/ConversationViewer.vue @@ -2198,7 +2198,7 @@ export default { }, async updatePropagationNodeStatus() { try { - const response = await window.axios.get("/api/v1/lxmf/propagation-node/status"); + const response = await window.api.get("/api/v1/lxmf/propagation-node/status"); this.propagationNodeStatus = response.data.propagation_node_status; } catch { // do nothing on error @@ -2226,7 +2226,7 @@ export default { }, async fetchContacts() { try { - const response = await window.axios.get("/api/v1/telephone/contacts"); + const response = await window.api.get("/api/v1/telephone/contacts"); this.contacts = response.data?.contacts ?? (Array.isArray(response.data) ? response.data : []); } catch (e) { console.log("Failed to fetch contacts:", e); @@ -2238,7 +2238,7 @@ export default { return; } try { - const response = await window.axios.get("/api/v1/translator/languages"); + const response = await window.api.get("/api/v1/translator/languages"); this.translatorLanguages = response.data.languages || []; this.hasTranslator = this.translatorLanguages.length > 0; } catch (e) { @@ -2252,7 +2252,7 @@ export default { try { this.isSendingMessage = true; const targetLang = this.$i18n.locale || "en"; - const response = await window.axios.post("/api/v1/translator/translate", { + const response = await window.api.post("/api/v1/translator/translate", { text: this.newMessageText, source_lang: "auto", target_lang: targetLang, @@ -2303,7 +2303,7 @@ export default { return; } try { - const response = await window.axios.get( + const response = await window.api.get( `/api/v1/telephone/contacts/check/${this.selectedPeer.destination_hash}` ); this.isStrangerPeer = !response.data.is_contact; @@ -2415,7 +2415,7 @@ export default { // fetch lxmf messages from "us to destination" and from "destination to us" const pageSize = 30; - const response = await window.axios.get( + const response = await window.api.get( `/api/v1/lxmf-messages/conversation/${this.selectedPeer.destination_hash}`, { params: { @@ -2515,13 +2515,13 @@ export default { async addContact(name, hash, lxmf_address = null, lxst_address = null) { try { // Check if contact already exists - const checkResponse = await window.axios.get(`/api/v1/telephone/contacts/check/${hash}`); + const checkResponse = await window.api.get(`/api/v1/telephone/contacts/check/${hash}`); if (checkResponse.data?.id) { ToastUtils.info(`${name} is already in your contacts`); return; } - await window.axios.post("/api/v1/telephone/contacts", { + await window.api.post("/api/v1/telephone/contacts", { name: name, remote_identity_hash: hash, lxmf_address: lxmf_address, @@ -2752,7 +2752,7 @@ export default { if (this.selectedPeer) { try { // get path to destination - const response = await window.axios.get( + const response = await window.api.get( `/api/v1/destination/${this.selectedPeer.destination_hash}/path` ); @@ -2770,7 +2770,7 @@ export default { if (this.selectedPeer) { try { // get lxmf stamp info - const response = await window.axios.get( + const response = await window.api.get( `/api/v1/destination/${this.selectedPeer.destination_hash}/lxmf-stamp-info` ); @@ -2788,7 +2788,7 @@ export default { if (this.selectedPeer) { try { // get signal metrics - const response = await window.axios.get( + const response = await window.api.get( `/api/v1/destination/${this.selectedPeer.destination_hash}/signal-metrics` ); @@ -2868,7 +2868,7 @@ export default { if (this.selectedPeer) { try { // get custom display name - const response = await window.axios.get( + const response = await window.api.get( `/api/v1/destination/${this.selectedPeer.destination_hash}/custom-display-name` ); @@ -2896,7 +2896,7 @@ export default { try { // update display name on server - await axios.post( + await window.api.post( `/api/v1/destination/${this.selectedPeer.destination_hash}/custom-display-name/update`, { display_name: displayName, @@ -2928,7 +2928,7 @@ export default { return; } try { - await window.axios.post("/api/v1/blocked-destinations", { + await window.api.post("/api/v1/blocked-destinations", { destination_hash: this.selectedPeer.destination_hash, }); GlobalEmitter.emit("block-status-changed"); @@ -2944,7 +2944,7 @@ export default { return; } try { - await window.axios.delete(`/api/v1/blocked-destinations/${this.selectedPeer.destination_hash}`); + await window.api.delete(`/api/v1/blocked-destinations/${this.selectedPeer.destination_hash}`); GlobalEmitter.emit("block-status-changed"); DialogUtils.alert(this.$t("banishment.banishment_lifted")); } catch (e) { @@ -3024,7 +3024,7 @@ export default { async showRawMessage(chatItem) { try { // we'll try to get the URI first as it contains the raw signed message - const response = await window.axios.get(`/api/v1/lxmf-messages/${chatItem.lxmf_message.hash}/uri`); + const response = await window.api.get(`/api/v1/lxmf-messages/${chatItem.lxmf_message.hash}/uri`); this.rawMessageData = { ...chatItem.lxmf_message, raw_uri: response.data.uri, @@ -3041,7 +3041,7 @@ export default { this.isDownloadingAudio[chatItem.lxmf_message.hash] = true; try { // fetch audio bytes from api - const response = await window.axios.get( + const response = await window.api.get( `/api/v1/lxmf-messages/attachment/${chatItem.lxmf_message.hash}/audio`, { responseType: "arraybuffer", @@ -3238,7 +3238,7 @@ export default { } // delete lxmf message from server - await window.axios.delete(`/api/v1/lxmf-messages/${chatItem.lxmf_message.hash}`); + await window.api.delete(`/api/v1/lxmf-messages/${chatItem.lxmf_message.hash}`); // remove lxmf message from chat items using hash, as other pending items might not have an id yet this.chatItems = this.chatItems.filter((item) => { @@ -3250,7 +3250,7 @@ export default { }, async openShareContactModal() { try { - const response = await window.axios.get("/api/v1/telephone/contacts"); + const response = await window.api.get("/api/v1/telephone/contacts"); this.contacts = response.data?.contacts ?? (Array.isArray(response.data) ? response.data : []); if (this.contacts.length === 0) { @@ -3359,7 +3359,7 @@ export default { if (images.length === 0) { const repliedContent = this.replyingTo && this.getRepliedMessage(this.replyingTo.lxmf_message?.hash)?.content; - const response = await window.axios.post(`/api/v1/lxmf-messages/send`, { + const response = await window.api.post(`/api/v1/lxmf-messages/send`, { delivery_method: this.newMessageDeliveryMethod, lxmf_message: { destination_hash: this.selectedPeer.destination_hash, @@ -3386,7 +3386,7 @@ export default { const repliedContent = this.replyingTo && this.getRepliedMessage(this.replyingTo.lxmf_message?.hash)?.content; - const response = await window.axios.post(`/api/v1/lxmf-messages/send`, { + const response = await window.api.post(`/api/v1/lxmf-messages/send`, { delivery_method: this.newMessageDeliveryMethod, lxmf_message: { destination_hash: this.selectedPeer.destination_hash, @@ -3412,7 +3412,7 @@ export default { }; try { - const subResponse = await window.axios.post(`/api/v1/lxmf-messages/send`, { + const subResponse = await window.api.post(`/api/v1/lxmf-messages/send`, { delivery_method: this.newMessageDeliveryMethod, lxmf_message: { destination_hash: this.selectedPeer.destination_hash, @@ -3465,7 +3465,7 @@ export default { try { // cancel sending lxmf message - const response = await window.axios.post(`/api/v1/lxmf-messages/${lxmfMessageHash}/cancel`); + const response = await window.api.post(`/api/v1/lxmf-messages/${lxmfMessageHash}/cancel`); // get lxmf message from response const lxmfMessage = response.data.lxmf_message; @@ -3490,7 +3490,7 @@ export default { chatItem.lxmf_message.fields?.reply_quoted_content || (chatItem.lxmf_message.reply_to_hash && this.getRepliedMessage(chatItem.lxmf_message.reply_to_hash)?.content); - const response = await window.axios.post(`/api/v1/lxmf-messages/send`, { + const response = await window.api.post(`/api/v1/lxmf-messages/send`, { lxmf_message: { destination_hash: chatItem.lxmf_message.destination_hash, content: chatItem.lxmf_message.content, @@ -3604,7 +3604,7 @@ export default { if (!this.selectedPeer) return; // Send a telemetry request command - await window.axios.post(`/api/v1/lxmf-messages/send`, { + await window.api.post(`/api/v1/lxmf-messages/send`, { lxmf_message: { destination_hash: this.selectedPeer.destination_hash, content: "", @@ -3643,7 +3643,7 @@ export default { if (!this.selectedPeer) return; const hash = this.selectedPeer.destination_hash; try { - const response = await window.axios.post(`/api/v1/telemetry/tracking/${hash}/toggle`, { + const response = await window.api.post(`/api/v1/telemetry/tracking/${hash}/toggle`, { is_tracking: !this.selectedPeer.is_tracking, }); // Emit event to parent to update peer status @@ -3695,7 +3695,7 @@ export default { }, async onStartCall() { try { - await window.axios.get(`/api/v1/telephone/call/${this.selectedPeer.destination_hash}`); + await window.api.get(`/api/v1/telephone/call/${this.selectedPeer.destination_hash}`); } catch (e) { const message = e.response?.data?.message ?? "Failed to start call"; DialogUtils.alert(message); @@ -3986,7 +3986,7 @@ export default { // mark conversation as read on server try { - await window.axios.get(`/api/v1/lxmf/conversations/${conversation.destination_hash}/mark-as-read`); + await window.api.get(`/api/v1/lxmf/conversations/${conversation.destination_hash}/mark-as-read`); } catch (e) { // do nothing if failed to mark as read console.log(e); diff --git a/meshchatx/src/frontend/components/messages/MessagesPage.vue b/meshchatx/src/frontend/components/messages/MessagesPage.vue index e2fb5c7..56d61a9 100644 --- a/meshchatx/src/frontend/components/messages/MessagesPage.vue +++ b/meshchatx/src/frontend/components/messages/MessagesPage.vue @@ -271,7 +271,7 @@ export default { }, async getConfig() { try { - const response = await window.axios.get(`/api/v1/config`); + const response = await window.api.get(`/api/v1/config`); this.config = response.data.config; } catch (e) { // do nothing if failed to load config @@ -331,7 +331,7 @@ export default { async getLxmfDeliveryAnnounces(append = false) { try { const offset = append ? Object.keys(this.peers).length : 0; - const response = await window.axios.get(`/api/v1/announces`, { + const response = await window.api.get(`/api/v1/announces`, { params: { aspect: "lxmf.delivery", limit: this.pageSize, @@ -366,7 +366,7 @@ export default { async getLxmfDeliveryAnnounce(destinationHash) { try { // fetch announce for destination hash - const response = await window.axios.get(`/api/v1/announces`, { + const response = await window.api.get(`/api/v1/announces`, { params: { destination_hash: destinationHash, limit: 1, @@ -392,7 +392,7 @@ export default { } const offset = append ? this.conversations.length : 0; - const response = await window.axios.get(`/api/v1/lxmf/conversations`, { + const response = await window.api.get(`/api/v1/lxmf/conversations`, { params: { ...this.buildConversationQueryParams(), limit: this.pageSize, @@ -481,7 +481,7 @@ export default { }, async resolvePeerDisplayName(peerHash) { try { - const response = await window.axios.get(`/api/v1/lxmf/conversations`, { + const response = await window.api.get(`/api/v1/lxmf/conversations`, { params: { search: peerHash, limit: 1 }, }); const results = response.data.conversations; @@ -514,7 +514,7 @@ export default { }, async getFolders() { try { - const response = await window.axios.get("/api/v1/lxmf/folders"); + const response = await window.api.get("/api/v1/lxmf/folders"); this.folders = response.data; } catch (e) { console.error("Failed to load folders", e); @@ -522,7 +522,7 @@ export default { }, async onCreateFolder(name) { try { - await window.axios.post("/api/v1/lxmf/folders", { name }); + await window.api.post("/api/v1/lxmf/folders", { name }); await this.getFolders(); ToastUtils.success(this.$t("messages.folder_created")); } catch { @@ -531,7 +531,7 @@ export default { }, async onRenameFolder({ id, name }) { try { - await window.axios.patch(`/api/v1/lxmf/folders/${id}`, { name }); + await window.api.patch(`/api/v1/lxmf/folders/${id}`, { name }); await this.getFolders(); ToastUtils.success(this.$t("messages.folder_renamed")); } catch { @@ -540,7 +540,7 @@ export default { }, async onDeleteFolder(id) { try { - await window.axios.delete(`/api/v1/lxmf/folders/${id}`); + await window.api.delete(`/api/v1/lxmf/folders/${id}`); if (this.selectedFolderId === id) { this.selectedFolderId = null; } @@ -555,7 +555,7 @@ export default { try { // Treat 0 as null (Uncategorized) for the backend const targetFolderId = folder_id === 0 ? null : folder_id; - await window.axios.post("/api/v1/lxmf/conversations/move-to-folder", { + await window.api.post("/api/v1/lxmf/conversations/move-to-folder", { peer_hashes, folder_id: targetFolderId, }); @@ -567,7 +567,7 @@ export default { }, async onBulkMarkAsRead(destination_hashes) { try { - await window.axios.post("/api/v1/lxmf/conversations/bulk-mark-as-read", { + await window.api.post("/api/v1/lxmf/conversations/bulk-mark-as-read", { destination_hashes, }); await this.getConversations(); @@ -584,7 +584,7 @@ export default { ); if (!confirmed) return; - await window.axios.post("/api/v1/lxmf/conversations/bulk-delete", { + await window.api.post("/api/v1/lxmf/conversations/bulk-delete", { destination_hashes, }); await this.getConversations(); @@ -595,7 +595,7 @@ export default { }, async onExportFolders() { try { - const response = await window.axios.get("/api/v1/lxmf/folders/export"); + const response = await window.api.get("/api/v1/lxmf/folders/export"); const data = JSON.stringify(response.data, null, 2); const blob = new Blob([data], { type: "application/json" }); const url = URL.createObjectURL(blob); @@ -619,7 +619,7 @@ export default { reader.onload = async (re) => { try { const data = JSON.parse(re.target.result); - await window.axios.post("/api/v1/lxmf/folders/import", data); + await window.api.post("/api/v1/lxmf/folders/import", data); await this.getFolders(); await this.getConversations(); ToastUtils.success(this.$t("messages.folders_imported")); diff --git a/meshchatx/src/frontend/components/messages/MessagesSidebar.vue b/meshchatx/src/frontend/components/messages/MessagesSidebar.vue index f313eff..582a98b 100644 --- a/meshchatx/src/frontend/components/messages/MessagesSidebar.vue +++ b/meshchatx/src/frontend/components/messages/MessagesSidebar.vue @@ -883,7 +883,7 @@ export default { }, async fetchContactForContextMenu(hash) { try { - const response = await window.axios.get(`/api/v1/telephone/contacts/check/${hash}`); + const response = await window.api.get(`/api/v1/telephone/contacts/check/${hash}`); if (response.data.is_contact) { this.contextMenu.targetContact = response.data.contact; } else { @@ -990,13 +990,13 @@ export default { if (!contact) { // find display name from conversations const conv = this.conversations.find((c) => c.destination_hash === hash); - await window.axios.post("/api/v1/telephone/contacts", { + await window.api.post("/api/v1/telephone/contacts", { name: conv?.display_name || hash.substring(0, 8), remote_identity_hash: hash, is_telemetry_trusted: true, }); } else { - await window.axios.patch(`/api/v1/telephone/contacts/${contact.id}`, { + await window.api.patch(`/api/v1/telephone/contacts/${contact.id}`, { is_telemetry_trusted: newStatus, }); } @@ -1056,7 +1056,7 @@ export default { return; } try { - await window.axios.delete(`/api/v1/blocked-destinations/${hash}`); + await window.api.delete(`/api/v1/blocked-destinations/${hash}`); GlobalEmitter.emit("block-status-changed"); DialogUtils.alert(this.$t("banishment.banishment_lifted")); } catch (e) { diff --git a/meshchatx/src/frontend/components/messages/PaperMessageModal.vue b/meshchatx/src/frontend/components/messages/PaperMessageModal.vue index 9293762..92752db 100644 --- a/meshchatx/src/frontend/components/messages/PaperMessageModal.vue +++ b/meshchatx/src/frontend/components/messages/PaperMessageModal.vue @@ -215,7 +215,7 @@ export default { async fetchUri() { try { this.isLoading = true; - const response = await window.axios.get(`/api/v1/lxmf-messages/${this.messageHash}/uri`); + const response = await window.api.get(`/api/v1/lxmf-messages/${this.messageHash}/uri`); this.uri = response.data.uri; if (this.uri) { this.$nextTick(() => { @@ -302,7 +302,7 @@ export default { } // send message - const response = await window.axios.post(`/api/v1/lxmf-messages/send`, { + const response = await window.api.post(`/api/v1/lxmf-messages/send`, { delivery_method: "opportunistic", lxmf_message: lxmf_message, }); diff --git a/meshchatx/src/frontend/components/micron-editor/MicronEditorPage.vue b/meshchatx/src/frontend/components/micron-editor/MicronEditorPage.vue index 8d7d77c..824a32b 100644 --- a/meshchatx/src/frontend/components/micron-editor/MicronEditorPage.vue +++ b/meshchatx/src/frontend/components/micron-editor/MicronEditorPage.vue @@ -789,7 +789,7 @@ ${b}= this.showPublishMenu = !this.showPublishMenu; if (this.showPublishMenu) { try { - const response = await window.axios.get("/api/v1/page-nodes"); + const response = await window.api.get("/api/v1/page-nodes"); this.pageNodes = response.data; } catch { this.pageNodes = []; @@ -800,7 +800,7 @@ ${b}= const tab = this.tabs[this.activeTabIndex]; const pageName = tab.name.replace(/\s+/g, "_"); try { - await window.axios.post(`/api/v1/page-nodes/${node.node_id}/pages`, { + await window.api.post(`/api/v1/page-nodes/${node.node_id}/pages`, { name: pageName, content: tab.content, }); @@ -827,7 +827,7 @@ ${b}= for (const tab of this.tabs) { const pageName = tab.name.replace(/\s+/g, "_"); try { - await window.axios.post(`/api/v1/page-nodes/${node.node_id}/pages`, { + await window.api.post(`/api/v1/page-nodes/${node.node_id}/pages`, { name: pageName, content: tab.content, }); diff --git a/meshchatx/src/frontend/components/network-visualiser/NetworkVisualiser.vue b/meshchatx/src/frontend/components/network-visualiser/NetworkVisualiser.vue index 46ddc24..2b71582 100644 --- a/meshchatx/src/frontend/components/network-visualiser/NetworkVisualiser.vue +++ b/meshchatx/src/frontend/components/network-visualiser/NetworkVisualiser.vue @@ -405,24 +405,24 @@ export default { methods: { async getInterfaceStats() { try { - const response = await window.axios.get(`/api/v1/interface-stats`, { + const response = await window.api.get(`/api/v1/interface-stats`, { signal: this.abortController.signal, }); this.interfaces = response.data.interface_stats?.interfaces ?? []; } catch (e) { - if (window.axios.isCancel(e)) return; + if (window.api.isCancel(e)) return; console.error("Failed to fetch interface stats", e); } }, async getDiscoveredInterfaces() { try { - const response = await window.axios.get(`/api/v1/reticulum/discovered-interfaces`, { + const response = await window.api.get(`/api/v1/reticulum/discovered-interfaces`, { signal: this.abortController.signal, }); this.discoveredInterfaces = response.data?.interfaces ?? []; this.discoveredActive = response.data?.active ?? []; } catch (e) { - if (window.axios.isCancel(e)) return; + if (window.api.isCancel(e)) return; } }, async getPathTableBatch(destinationHashes = null) { @@ -430,7 +430,7 @@ export default { try { this.loadingStatus = "Loading paths..."; if (destinationHashes && destinationHashes.length > 0) { - const resp = await window.axios.post( + const resp = await window.api.post( `/api/v1/path-table`, { destination_hashes: destinationHashes }, { @@ -439,7 +439,7 @@ export default { ); this.pathTable.push(...resp.data.path_table); } else { - const firstResp = await window.axios.get(`/api/v1/path-table`, { + const firstResp = await window.api.get(`/api/v1/path-table`, { params: { limit: this.pageSize, offset: 0 }, signal: this.abortController.signal, }); @@ -454,7 +454,7 @@ export default { chunk.push(offset + i * this.pageSize); } const promises = chunk.map((o) => - window.axios.get(`/api/v1/path-table`, { + window.api.get(`/api/v1/path-table`, { params: { limit: this.pageSize, offset: o }, signal: this.abortController.signal, }) @@ -468,7 +468,7 @@ export default { } } } catch (e) { - if (window.axios.isCancel(e)) return; + if (window.api.isCancel(e)) return; console.error("Failed to fetch path table batch", e); } }, @@ -482,7 +482,7 @@ export default { let offset = 0; let hasMore = true; while (hasMore) { - const resp = await window.axios.get(`/api/v1/announces`, { + const resp = await window.api.get(`/api/v1/announces`, { params: { aspect, limit: this.pageSize, offset }, signal: this.abortController.signal, }); @@ -497,24 +497,24 @@ export default { } } } catch (e) { - if (window.axios.isCancel(e)) return; + if (window.api.isCancel(e)) return; console.error("Failed to fetch announces batch", e); } }, async getConfig() { try { - const response = await window.axios.get("/api/v1/config", { + const response = await window.api.get("/api/v1/config", { signal: this.abortController.signal, }); this.config = response.data.config; } catch (e) { - if (window.axios.isCancel(e)) return; + if (window.api.isCancel(e)) return; console.error("Failed to fetch config", e); } }, async getConversations() { try { - const response = await window.axios.get(`/api/v1/lxmf/conversations`, { + const response = await window.api.get(`/api/v1/lxmf/conversations`, { signal: this.abortController.signal, }); this.conversations = {}; @@ -522,7 +522,7 @@ export default { this.conversations[conversation.destination_hash] = conversation; } } catch (e) { - if (window.axios.isCancel(e)) return; + if (window.api.isCancel(e)) return; console.error("Failed to fetch conversations", e); } }, diff --git a/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue b/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue index e3f3c59..f0627ec 100644 --- a/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue +++ b/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue @@ -753,7 +753,7 @@ export default { }, async getFavourites() { try { - const response = await window.axios.get("/api/v1/favourites", { + const response = await window.api.get("/api/v1/favourites", { params: { aspect: "nomadnetwork.node", }, @@ -774,7 +774,7 @@ export default { async addFavourite(node) { // add to favourites try { - await window.axios.post("/api/v1/favourites/add", { + await window.api.post("/api/v1/favourites/add", { destination_hash: node.destination_hash, display_name: node.display_name, aspect: "nomadnetwork.node", @@ -789,7 +789,7 @@ export default { async removeFavourite(node) { // remove from favourites try { - await window.axios.delete(`/api/v1/favourites/${node.destination_hash}`); + await window.api.delete(`/api/v1/favourites/${node.destination_hash}`); } catch (e) { console.log(e); } @@ -800,7 +800,7 @@ export default { async getNomadnetworkNodeAnnounces(append = false) { try { const offset = append ? Object.keys(this.nodes).length : 0; - const response = await window.axios.get(`/api/v1/announces`, { + const response = await window.api.get(`/api/v1/announces`, { params: { aspect: "nomadnetwork.node", limit: this.pageSize, @@ -823,7 +823,7 @@ export default { this.hasMoreNodes = nodeAnnounces.length === this.pageSize; } catch (e) { - if (window.axios.isCancel?.(e)) return; + if (window.api.isCancel?.(e)) return; console.log(e); } finally { this.isLoadingMoreNodes = false; @@ -845,7 +845,7 @@ export default { }, async getNomadnetworkNodeAnnounce(destinationHash) { try { - const response = await window.axios.get(`/api/v1/announces`, { + const response = await window.api.get(`/api/v1/announces`, { params: { destination_hash: destinationHash, limit: 1, @@ -858,7 +858,7 @@ export default { this.updateNodeFromAnnounce(nodeAnnounce); } } catch (e) { - if (window.axios.isCancel?.(e)) return; + if (window.api.isCancel?.(e)) return; console.log(e); } }, @@ -1399,7 +1399,7 @@ export default { try { // rename on server - await window.axios.post(`/api/v1/favourites/${favourite.destination_hash}/rename`, { + await window.api.post(`/api/v1/favourites/${favourite.destination_hash}/rename`, { display_name: displayName, }); @@ -1511,7 +1511,7 @@ export default { try { // get path to destination - const response = await window.axios.get(`/api/v1/destination/${destinationHash}/path`); + const response = await window.api.get(`/api/v1/destination/${destinationHash}/path`); // update ui this.selectedNodePath = response.data.path; @@ -1527,7 +1527,7 @@ export default { } // identify self to nomadnetwork node - await window.axios.post(`/api/v1/nomadnetwork/${destinationHash}/identify`); + await window.api.post(`/api/v1/nomadnetwork/${destinationHash}/identify`); // reload page this.reloadNodePage(); diff --git a/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkSidebar.vue b/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkSidebar.vue index d319823..4c3cfa0 100644 --- a/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkSidebar.vue +++ b/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkSidebar.vue @@ -723,7 +723,7 @@ export default { } try { - await window.axios.post("/api/v1/blocked-destinations", { + await window.api.post("/api/v1/blocked-destinations", { destination_hash: node.identity_hash, }); GlobalEmitter.emit("block-status-changed"); @@ -735,7 +735,7 @@ export default { }, async onUnblockNode(identityHash) { try { - await window.axios.delete(`/api/v1/blocked-destinations/${identityHash}`); + await window.api.delete(`/api/v1/blocked-destinations/${identityHash}`); GlobalEmitter.emit("block-status-changed"); DialogUtils.alert(this.$t("nomadnet.banishment_lifted")); } catch (e) { @@ -942,7 +942,7 @@ export default { return; } try { - await window.axios.post("/api/v1/blocked-destinations", { + await window.api.post("/api/v1/blocked-destinations", { destination_hash: favourite.destination_hash, }); GlobalEmitter.emit("block-status-changed"); @@ -960,7 +960,7 @@ export default { } this.closeContextMenus(); try { - await window.axios.delete(`/api/v1/blocked-destinations/${hash}`); + await window.api.delete(`/api/v1/blocked-destinations/${hash}`); GlobalEmitter.emit("block-status-changed"); DialogUtils.alert(this.$t("nomadnet.banishment_lifted")); } catch (e) { diff --git a/meshchatx/src/frontend/components/page-nodes/PageNodesPage.vue b/meshchatx/src/frontend/components/page-nodes/PageNodesPage.vue index 2175078..a7a7965 100644 --- a/meshchatx/src/frontend/components/page-nodes/PageNodesPage.vue +++ b/meshchatx/src/frontend/components/page-nodes/PageNodesPage.vue @@ -381,7 +381,7 @@ export default { async loadNodes() { this.loading = true; try { - const response = await window.axios.get("/api/v1/page-nodes"); + const response = await window.api.get("/api/v1/page-nodes"); this.nodes = response.data; if (this.selectedNode) { const updated = this.nodes.find((n) => n.node_id === this.selectedNode.node_id); @@ -405,7 +405,7 @@ export default { async createNode() { if (!this.createNodeName.trim()) return; try { - await window.axios.post("/api/v1/page-nodes", { name: this.createNodeName.trim() }); + await window.api.post("/api/v1/page-nodes", { name: this.createNodeName.trim() }); this.createNodeName = ""; this.showCreateDialog = false; this.showStatus("Server created", true); @@ -417,7 +417,7 @@ export default { async deleteNode(nodeId) { if (!(await DialogUtils.confirm("Delete this mesh server and all its content?"))) return; try { - await window.axios.delete(`/api/v1/page-nodes/${nodeId}`); + await window.api.delete(`/api/v1/page-nodes/${nodeId}`); if (this.selectedNode && this.selectedNode.node_id === nodeId) { this.selectedNode = null; } @@ -429,7 +429,7 @@ export default { }, async startNode(nodeId) { try { - const response = await window.axios.post(`/api/v1/page-nodes/${nodeId}/start`); + const response = await window.api.post(`/api/v1/page-nodes/${nodeId}/start`); this.showStatus(`Server started: ${response.data.destination_hash}`, true); await this.loadNodes(); } catch (e) { @@ -438,7 +438,7 @@ export default { }, async stopNode(nodeId) { try { - await window.axios.post(`/api/v1/page-nodes/${nodeId}/stop`); + await window.api.post(`/api/v1/page-nodes/${nodeId}/stop`); this.showStatus("Server stopped", true); await this.loadNodes(); } catch { @@ -447,7 +447,7 @@ export default { }, async announceNode(nodeId) { try { - await window.axios.post(`/api/v1/page-nodes/${nodeId}/announce`); + await window.api.post(`/api/v1/page-nodes/${nodeId}/announce`); this.showStatus("Announced on mesh", true); } catch { this.showStatus("Failed to announce", false); @@ -456,7 +456,7 @@ export default { async renameNode() { if (!this.renameNodeName.trim() || !this.selectedNode) return; try { - await window.axios.put(`/api/v1/page-nodes/${this.selectedNode.node_id}/rename`, { + await window.api.put(`/api/v1/page-nodes/${this.selectedNode.node_id}/rename`, { name: this.renameNodeName.trim(), }); this.renameNodeName = ""; @@ -470,7 +470,7 @@ export default { async addPage() { if (!this.newPageName.trim() || !this.selectedNode) return; try { - await window.axios.post(`/api/v1/page-nodes/${this.selectedNode.node_id}/pages`, { + await window.api.post(`/api/v1/page-nodes/${this.selectedNode.node_id}/pages`, { name: this.newPageName.trim(), content: "", }); @@ -483,7 +483,7 @@ export default { }, async editPage(pageName) { try { - const response = await window.axios.get( + const response = await window.api.get( `/api/v1/page-nodes/${this.selectedNode.node_id}/pages/${encodeURIComponent(pageName)}` ); this.editingPage = pageName; @@ -495,7 +495,7 @@ export default { async savePage() { if (!this.editingPage || !this.selectedNode) return; try { - await window.axios.post(`/api/v1/page-nodes/${this.selectedNode.node_id}/pages`, { + await window.api.post(`/api/v1/page-nodes/${this.selectedNode.node_id}/pages`, { name: this.editingPage, content: this.editingPageContent, }); @@ -510,7 +510,7 @@ export default { async deletePage(pageName) { if (!(await DialogUtils.confirm(`Delete page "${pageName}"?`))) return; try { - await window.axios.delete( + await window.api.delete( `/api/v1/page-nodes/${this.selectedNode.node_id}/pages/${encodeURIComponent(pageName)}` ); if (this.editingPage === pageName) { @@ -528,7 +528,7 @@ export default { const formData = new FormData(); formData.append("file", file); try { - await window.axios.post(`/api/v1/page-nodes/${this.selectedNode.node_id}/files`, formData, { + await window.api.post(`/api/v1/page-nodes/${this.selectedNode.node_id}/files`, formData, { headers: { "Content-Type": "multipart/form-data" }, }); this.showStatus("File uploaded", true); @@ -541,7 +541,7 @@ export default { async deleteFile(fileName) { if (!(await DialogUtils.confirm(`Delete file "${fileName}"?`))) return; try { - await window.axios.delete( + await window.api.delete( `/api/v1/page-nodes/${this.selectedNode.node_id}/files/${encodeURIComponent(fileName)}` ); this.showStatus("File deleted", true); diff --git a/meshchatx/src/frontend/components/ping/PingPage.vue b/meshchatx/src/frontend/components/ping/PingPage.vue index da6d4e1..379c597 100644 --- a/meshchatx/src/frontend/components/ping/PingPage.vue +++ b/meshchatx/src/frontend/components/ping/PingPage.vue @@ -148,7 +148,6 @@