From efe3fd2ed07ebf3043561948451d48e19888d062 Mon Sep 17 00:00:00 2001 From: Yash Date: Tue, 14 Jul 2026 11:17:09 +0530 Subject: [PATCH 1/4] fix(analytics): persist analytics toggle to disk and respect it on app startup --- src-tauri/src/main.rs | 6 ++++-- src-tauri/src/services/analytics.rs | 29 ++++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index ee46a67..c6dfe27 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -43,16 +43,18 @@ async fn main() { builder .setup(|app| { + let analytics = AnalyticsService::new(app.handle()); + let is_analytics_enabled = tauri::async_runtime::block_on(analytics.is_enabled()); + let has_aptabase = option_env!("APTABASE_APP_KEY") .map(String::from) .or_else(|| std::env::var("APTABASE_APP_KEY").ok()) .is_some(); - if has_aptabase { + if has_aptabase && is_analytics_enabled { let _ = app.track_event("app_started", None); } - let analytics = AnalyticsService::new(app.handle()); app.manage(analytics); let handle = app.handle().clone(); diff --git a/src-tauri/src/services/analytics.rs b/src-tauri/src/services/analytics.rs index e82249f..63b2e3a 100644 --- a/src-tauri/src/services/analytics.rs +++ b/src-tauri/src/services/analytics.rs @@ -1,16 +1,31 @@ use std::sync::Arc; -use tauri::AppHandle; +use tauri::{AppHandle, Manager}; use tokio::sync::RwLock; +use std::fs; #[derive(Clone)] pub struct AnalyticsService { enabled: Arc>, + app_handle: AppHandle, } impl AnalyticsService { - pub fn new(_app: &AppHandle) -> Self { + pub fn new(app: &AppHandle) -> Self { + let mut enabled = false; + if let Ok(path) = app.path().app_data_dir() { + let config_path = path.join("analytics.json"); + if let Ok(content) = fs::read_to_string(&config_path) { + if let Ok(val) = serde_json::from_str::(&content) { + if let Some(e) = val.get("enabled").and_then(|v| v.as_bool()) { + enabled = e; + } + } + } + } + Self { - enabled: Arc::new(RwLock::new(false)), + enabled: Arc::new(RwLock::new(enabled)), + app_handle: app.clone(), } } @@ -21,6 +36,14 @@ impl AnalyticsService { pub async fn set_enabled(&self, enabled: bool) { let mut e = self.enabled.write().await; *e = enabled; + + if let Ok(path) = self.app_handle.path().app_data_dir() { + let _ = fs::create_dir_all(&path); + let config_path = path.join("analytics.json"); + let content = serde_json::json!({ "enabled": enabled }).to_string(); + let _ = fs::write(&config_path, content); + } + if enabled { println!("Analytics have been enabled by the user."); } else { From ca60054637e42f6d348725ec8cc025d6da1e20a5 Mon Sep 17 00:00:00 2001 From: Yash Date: Tue, 14 Jul 2026 11:19:06 +0530 Subject: [PATCH 2/4] feat(analytics): add clear console verification logs for telemetry status --- src-tauri/src/main.rs | 3 +++ src-tauri/src/services/analytics.rs | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index c6dfe27..df583e4 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -53,6 +53,9 @@ async fn main() { if has_aptabase && is_analytics_enabled { let _ = app.track_event("app_started", None); + println!("🚀 Analytics is ON: Successfully dispatched 'app_started' event."); + } else if has_aptabase && !is_analytics_enabled { + println!("🛑 Analytics is OFF: User opted out, no telemetry will be sent."); } app.manage(analytics); diff --git a/src-tauri/src/services/analytics.rs b/src-tauri/src/services/analytics.rs index 63b2e3a..26947cf 100644 --- a/src-tauri/src/services/analytics.rs +++ b/src-tauri/src/services/analytics.rs @@ -45,9 +45,9 @@ impl AnalyticsService { } if enabled { - println!("Analytics have been enabled by the user."); + println!("🚀 Analytics have been enabled by the user. Events will now be sent."); } else { - println!("Analytics have been disabled by the user."); + println!("🛑 Analytics have been disabled by the user. Tracking stopped."); } } } From 009f84f6e6fa31273fc1d5c1ce8ca56bbed311d8 Mon Sep 17 00:00:00 2001 From: Yash Date: Wed, 29 Jul 2026 20:29:41 +0530 Subject: [PATCH 3/4] fix(analytics): resolve tokio runtime panic by spawning async task in setup --- src-tauri/src/main.rs | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index df583e4..0508291 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -44,19 +44,23 @@ async fn main() { builder .setup(|app| { let analytics = AnalyticsService::new(app.handle()); - let is_analytics_enabled = tauri::async_runtime::block_on(analytics.is_enabled()); - - let has_aptabase = option_env!("APTABASE_APP_KEY") - .map(String::from) - .or_else(|| std::env::var("APTABASE_APP_KEY").ok()) - .is_some(); + let analytics_clone = analytics.clone(); + let app_handle = app.handle().clone(); + tauri::async_runtime::spawn(async move { + let is_analytics_enabled = analytics_clone.is_enabled().await; - if has_aptabase && is_analytics_enabled { - let _ = app.track_event("app_started", None); - println!("🚀 Analytics is ON: Successfully dispatched 'app_started' event."); - } else if has_aptabase && !is_analytics_enabled { - println!("🛑 Analytics is OFF: User opted out, no telemetry will be sent."); - } + let has_aptabase = option_env!("APTABASE_APP_KEY") + .map(String::from) + .or_else(|| std::env::var("APTABASE_APP_KEY").ok()) + .is_some(); + + if has_aptabase && is_analytics_enabled { + let _ = app_handle.track_event("app_started", None); + println!("🚀 Analytics is ON: Successfully dispatched 'app_started' event."); + } else if has_aptabase && !is_analytics_enabled { + println!("🛑 Analytics is OFF: User opted out, no telemetry will be sent."); + } + }); app.manage(analytics); From 78376c744e98d190548c3bc101f20d535d8fb3bc Mon Sep 17 00:00:00 2001 From: Yash Date: Wed, 29 Jul 2026 23:50:59 +0530 Subject: [PATCH 4/4] chore: update version --- bridge/package.json | 2 +- package.json | 2 +- src-tauri/tauri.conf.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bridge/package.json b/bridge/package.json index 352183e..ca96f56 100644 --- a/bridge/package.json +++ b/bridge/package.json @@ -1,6 +1,6 @@ { "name": "relwave-bridge", - "version": "1.0.1", + "version": "1.0.2", "type": "commonjs", "main": "dist/index.cjs", "scripts": { diff --git a/package.json b/package.json index 0f57907..fda32dd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "relwave", "private": true, - "version": "1.0.1", + "version": "1.0.2", "type": "module", "scripts": { "dev": "vite", diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 4d54573..89ee1c7 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "RelWave", - "version": "1.0.1", + "version": "1.0.2", "identifier": "tech.relwave.app", "build": { "beforeDevCommand": "vite",