Skip to content

Commit 3aeecd7

Browse files
committed
add track
1 parent fef6ac9 commit 3aeecd7

File tree

5 files changed

+148
-7
lines changed

5 files changed

+148
-7
lines changed

src-tauri/src/commands.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::mcp_server::{
22
get_server_address, is_server_running, start_server_with_permissions, stop_server,
33
};
44
use tauri::Manager;
5+
use tauri_plugin_aptabase::EventTracker;
56
use tauri_plugin_sql::{Migration, MigrationKind};
67

78
// ============================================================================
@@ -379,3 +380,19 @@ pub async fn get_mcp_server_status() -> Result<serde_json::Value, String> {
379380
"address": address.map(|addr| addr.to_string())
380381
}))
381382
}
383+
384+
// ============================================================================
385+
// 事件追踪
386+
// ============================================================================
387+
388+
/// 通用事件追踪命令
389+
#[tauri::command]
390+
pub async fn track_event(
391+
app: tauri::AppHandle,
392+
event_name: String,
393+
properties: Option<serde_json::Value>,
394+
) -> Result<(), String> {
395+
// 使用 Aptabase 追踪事件
396+
let _ = app.track_event(&event_name, properties);
397+
Ok(())
398+
}

src-tauri/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ pub async fn run() {
121121
commands::start_mcp_server,
122122
commands::stop_mcp_server,
123123
commands::get_mcp_server_status,
124+
commands::track_event,
124125
])
125126
.build(tauri::generate_context!())
126127
.expect("error while building tauri application");

src/App.vue

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,23 @@ const saveClipboardAsSnippet = async (content: string) => {
590590
});
591591
592592
if (snippet) {
593+
// 追踪从剪贴板保存为代码片段的事件
594+
try {
595+
const { invoke } = await import("@tauri-apps/api/core");
596+
await invoke("track_event", {
597+
eventName: "clipboard_saved_as_snippet",
598+
properties: {
599+
language: detectedLanguage,
600+
content_length: content.length,
601+
},
602+
});
603+
} catch (trackingError) {
604+
console.warn(
605+
"Failed to track clipboard saved as snippet event:",
606+
trackingError
607+
);
608+
}
609+
593610
// 切换到代码片段选项卡并选中新创建的片段
594611
activeTab.value = "snippets";
595612
selectSnippet(snippet);

src/composables/useAppUpdater.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { ref } from "vue";
22
import { check } from "@tauri-apps/plugin-updater";
33
import { relaunch } from "@tauri-apps/plugin-process";
4-
import { useI18n } from "vue-i18n";
54

65
// 全局单例状态
76
const updateDialogVisible = ref(false);
@@ -14,17 +13,16 @@ let updateObj: any = null;
1413
async function checkForUpdates() {
1514
if (isChecking.value) return;
1615
isChecking.value = true;
17-
const { t } = useI18n();
1816
try {
1917
const update = await check();
2018
if (update) {
2119
updateObj = update;
2220
updateDialogVisible.value = true;
2321
} else {
24-
console.log(t("update.alreadyLatest"));
22+
console.log("Already latest version");
2523
}
2624
} catch (e) {
27-
console.log(t("update.checkFailed"));
25+
console.log("Failed to check for updates");
2826
} finally {
2927
isChecking.value = false;
3028
}
@@ -36,7 +34,6 @@ async function handleUpdate() {
3634
updateLoading.value = true;
3735
let downloaded = 0;
3836
let contentLength = 0;
39-
const { t } = useI18n();
4037
try {
4138
await updateObj.downloadAndInstall((event: any) => {
4239
switch (event.event) {
@@ -56,14 +53,14 @@ async function handleUpdate() {
5653
// 重启应用(会自动退出当前实例)
5754
await relaunch();
5855
} catch (e) {
59-
console.error(t("update.restartFailed"), e);
56+
console.error("Failed to restart app", e);
6057
}
6158
}, 1000);
6259
break;
6360
}
6461
});
6562
} catch (e) {
66-
console.log(t("update.updateFailed"));
63+
console.log("Update failed");
6764
updateLoading.value = false;
6865
}
6966
}

src/composables/useSnippets.ts

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,22 @@ export function useSnippets() {
6060
// 将新代码片段添加到列表开头
6161
snippets.value.unshift(newSnippet);
6262

63+
// 追踪代码片段创建事件
64+
try {
65+
const { invoke } = await import("@tauri-apps/api/core");
66+
await invoke("track_event", {
67+
eventName: "snippet_created",
68+
properties: {
69+
language: snippet.language,
70+
has_tags: snippet.tags.length > 0 ? "true" : "false",
71+
tags_count: snippet.tags.length,
72+
},
73+
});
74+
console.log("snippet_created", snippet.language);
75+
} catch (trackingError) {
76+
console.warn("Failed to track snippet creation event:", trackingError);
77+
}
78+
6379
return newSnippet;
6480
} catch (err) {
6581
console.error("Failed to create snippet:", err);
@@ -93,6 +109,28 @@ export function useSnippets() {
93109
if (selectedSnippet.value?.id === id) {
94110
selectedSnippet.value = updatedSnippet;
95111
}
112+
113+
// 追踪代码片段更新事件
114+
try {
115+
const { invoke } = await import("@tauri-apps/api/core");
116+
await invoke("track_event", {
117+
eventName: "snippet_updated",
118+
properties: {
119+
language: updates.language || "unknown",
120+
has_tags: updates.tags
121+
? updates.tags.length > 0
122+
? "true"
123+
: "false"
124+
: "false",
125+
tags_count: updates.tags ? updates.tags.length : 0,
126+
},
127+
});
128+
} catch (trackingError) {
129+
console.warn(
130+
"Failed to track snippet update event:",
131+
trackingError
132+
);
133+
}
96134
}
97135
}
98136
} catch (err) {
@@ -108,6 +146,9 @@ export function useSnippets() {
108146
error.value = null;
109147

110148
try {
149+
// 获取要删除的片段信息用于事件追踪
150+
const snippetToDelete = snippets.value.find((s) => s.id === id);
151+
111152
await snippetApi.delete(id);
112153

113154
// 从本地列表中移除
@@ -117,6 +158,26 @@ export function useSnippets() {
117158
if (selectedSnippet.value?.id === id) {
118159
selectedSnippet.value = null;
119160
}
161+
162+
// 追踪代码片段删除事件
163+
if (snippetToDelete) {
164+
try {
165+
const { invoke } = await import("@tauri-apps/api/core");
166+
await invoke("track_event", {
167+
eventName: "snippet_deleted",
168+
properties: {
169+
language: snippetToDelete.language,
170+
had_tags: snippetToDelete.tags.length > 0 ? "true" : "false",
171+
tags_count: snippetToDelete.tags.length,
172+
},
173+
});
174+
} catch (trackingError) {
175+
console.warn(
176+
"Failed to track snippet deletion event:",
177+
trackingError
178+
);
179+
}
180+
}
120181
} catch (err) {
121182
console.error("Failed to delete snippet:", err);
122183
error.value = err instanceof Error ? err.message : "删除代码片段失败";
@@ -136,6 +197,20 @@ export function useSnippets() {
136197

137198
try {
138199
snippets.value = await snippetApi.search(query);
200+
201+
// 追踪代码片段搜索事件
202+
try {
203+
const { invoke } = await import("@tauri-apps/api/core");
204+
await invoke("track_event", {
205+
eventName: "snippet_searched",
206+
properties: {
207+
query_length: query.length,
208+
results_count: snippets.value.length,
209+
},
210+
});
211+
} catch (trackingError) {
212+
console.warn("Failed to track snippet search event:", trackingError);
213+
}
139214
} catch (err) {
140215
console.error("Failed to search snippets:", err);
141216
error.value = err instanceof Error ? err.message : "搜索代码片段失败";
@@ -155,6 +230,23 @@ export function useSnippets() {
155230

156231
try {
157232
snippets.value = await snippetApi.getByLanguage(language);
233+
234+
// 追踪代码片段语言过滤事件
235+
try {
236+
const { invoke } = await import("@tauri-apps/api/core");
237+
await invoke("track_event", {
238+
eventName: "snippet_filtered_by_language",
239+
properties: {
240+
language: language,
241+
results_count: snippets.value.length,
242+
},
243+
});
244+
} catch (trackingError) {
245+
console.warn(
246+
"Failed to track snippet language filter event:",
247+
trackingError
248+
);
249+
}
158250
} catch (err) {
159251
console.error("Failed to filter snippets by language:", err);
160252
error.value = err instanceof Error ? err.message : "按语言过滤失败";
@@ -173,6 +265,23 @@ export function useSnippets() {
173265

174266
try {
175267
snippets.value = await snippetApi.getByTags(tags);
268+
269+
// 追踪代码片段标签过滤事件
270+
try {
271+
const { invoke } = await import("@tauri-apps/api/core");
272+
await invoke("track_event", {
273+
eventName: "snippet_filtered_by_tags",
274+
properties: {
275+
tags_count: tags.length,
276+
results_count: snippets.value.length,
277+
},
278+
});
279+
} catch (trackingError) {
280+
console.warn(
281+
"Failed to track snippet tags filter event:",
282+
trackingError
283+
);
284+
}
176285
} catch (err) {
177286
console.error("Failed to filter snippets by tags:", err);
178287
error.value = err instanceof Error ? err.message : "按标签过滤失败";

0 commit comments

Comments
 (0)