feat(analytics): add custom event tracking to Context, SkillTree, Planta, Questions

Add app-specific Umami event helpers and integrate tracking into:
- Context: 6 events (document create/delete/pin, space create/delete, AI generated)
- SkillTree: 3 events (skill create/delete with branch, XP added with level-up)
- Planta: 4 events (plant analyzed/created/deleted, plant watered)
- Questions: 5 events (question create/delete, research started, collection create/delete)

Updates ManaScore analytics from 3/5 to 4/5 for all four apps.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-03-25 10:13:05 +01:00
parent 623ce1f051
commit 12b3c4f0f3
14 changed files with 75 additions and 4 deletions

View file

@ -1,4 +1,5 @@
import type { Document, DocumentType } from '$lib/types';
import { ContextEvents } from '@manacore/shared-utils/analytics';
import * as docsService from '$lib/services/documents';
let documents = $state<Document[]>([]);
@ -133,6 +134,7 @@ export const documentsStore = {
if (result.data) {
documents = [result.data, ...documents];
currentDocument = result.data;
ContextEvents.documentCreated(type);
}
return result;
} finally {
@ -159,6 +161,7 @@ export const documentsStore = {
async delete(id: string) {
const result = await docsService.deleteDocument(id);
if (result.success) {
ContextEvents.documentDeleted();
documents = documents.filter((d) => d.id !== id);
if (currentDocument?.id === id) {
currentDocument = null;
@ -173,6 +176,7 @@ export const documentsStore = {
const newPinned = !doc.pinned;
const result = await docsService.toggleDocumentPinned(id, newPinned);
if (result.success) {
ContextEvents.documentPinned(newPinned);
documents = documents.map((d) => (d.id === id ? { ...d, pinned: newPinned } : d));
if (currentDocument?.id === id) {
currentDocument = { ...currentDocument, pinned: newPinned };

View file

@ -1,4 +1,5 @@
import type { Space } from '$lib/types';
import { ContextEvents } from '@manacore/shared-utils/analytics';
import * as spacesService from '$lib/services/spaces';
let spaces = $state<Space[]>([]);
@ -39,6 +40,7 @@ export const spacesStore = {
const result = await spacesService.createSpace(userId, name, description);
if (result.data) {
spaces = [result.data, ...spaces];
ContextEvents.spaceCreated();
}
return result;
},
@ -66,6 +68,7 @@ export const spacesStore = {
const result = await spacesService.deleteSpace(id);
if (result.success) {
spaces = spaces.filter((s) => s.id !== id);
ContextEvents.spaceDeleted();
}
return result;
},