trackhome-react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # trackhome-react
2
+
3
+ Embeddable trackhome analytics dashboard for React. Pass two props, get a live dashboard.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install trackhome-react
9
+ ```
10
+
11
+ ## Quick start
12
+
13
+ ```tsx
14
+ import { TrackhomeDashboard } from 'trackhome-react';
15
+
16
+ function App() {
17
+ return (
18
+ <TrackhomeDashboard
19
+ endpoint="https://trk.example.com"
20
+ authKey="ek_abc123..."
21
+ uid="my-dashboard"
22
+ />
23
+ );
24
+ }
25
+ ```
26
+
27
+ That's it. The component fetches its config (widgets, name, theme) from the server and renders a styled dashboard. No local config needed.
28
+
29
+ ## Props
30
+
31
+ | Prop | Type | Required | Description |
32
+ |---|---|---|---|
33
+ | `endpoint` | string | Yes | Base URL of your trackhome instance |
34
+ | `authKey` | string | Yes | Read-only embed key (NOT your admin token) |
35
+ | `uid` | string | Yes | Unique dashboard identifier |
36
+ | `editable` | boolean | No | Enable in-browser edit mode (add/remove widgets). Default: false |
37
+ | `refreshInterval` | number | No | Auto-refresh interval in seconds. Default: 30. Set 0 to disable. |
38
+ | `dateRange` | { from?, to? } | No | Custom date range (YYYY-MM-DD). Defaults to last 7 days. |
39
+ | `className` | string | No | CSS class for the container |
40
+
41
+ ## Getting an authKey
42
+
43
+ 1. Open your trackhome admin dashboard
44
+ 2. Go to **Embeds** → **New key**
45
+ 3. Create an embed dashboard (clone from existing or configure from scratch)
46
+ 4. Copy the generated `authKey` + `uid`
47
+
48
+ The authKey is **read-only** — it can only read dashboard configs and aggregate analytics. It cannot access raw events, links, funnels, or admin operations.
49
+
50
+ ## Features
51
+
52
+ - **Zero config**: widget layout stored server-side, fetched by uid
53
+ - **Self-styled**: inline CSS, no dependency on host app's CSS framework
54
+ - **Light/dark theme**: stored in the embed config, switchable
55
+ - **All widget kinds**: metric, timeseries, area, bar, pie, top_events, top_tags
56
+ - **Auto-refresh**: polls for new data every 30s (configurable)
57
+ - **Edit mode**: optional in-browser customization that saves back to server
58
+ - **TypeScript**: full type definitions included
59
+
60
+ ## License
61
+
62
+ MIT
@@ -0,0 +1,41 @@
1
+ /**
2
+ * trackhome-embed — Embeddable analytics dashboard for React.
3
+ *
4
+ * Usage:
5
+ *
6
+ * import { TrackhomeDashboard } from 'trackhome-embed';
7
+ *
8
+ * <TrackhomeDashboard
9
+ * endpoint="https://trk.example.com"
10
+ * authKey="ek_abc123..."
11
+ * uid="my-sales-dashboard"
12
+ * />
13
+ *
14
+ * That's it. The component fetches its config (widgets, name, theme) from
15
+ * the server keyed by (authKey, uid), renders the widgets, and refreshes
16
+ * every 30s. An optional `editable` prop enables in-browser customization
17
+ * (add/remove/edit widgets) that saves back to the server.
18
+ */
19
+ import React from 'react';
20
+ export interface TrackhomeDashboardProps {
21
+ /** Base URL of the trackhome instance. */
22
+ endpoint: string;
23
+ /** Read-only embed auth key (NOT the admin token). */
24
+ authKey: string;
25
+ /** Unique dashboard identifier within this auth key. */
26
+ uid: string;
27
+ /** Enable in-browser edit mode (add/remove/edit widgets). Default: false. */
28
+ editable?: boolean;
29
+ /** Refresh interval in seconds. Default: 30. Set to 0 to disable. */
30
+ refreshInterval?: number;
31
+ /** Custom date range override. If omitted, defaults to last 7 days. */
32
+ dateRange?: {
33
+ from?: string;
34
+ to?: string;
35
+ };
36
+ /** CSS class for the container. */
37
+ className?: string;
38
+ }
39
+ export declare function TrackhomeDashboard({ endpoint, authKey, uid, editable, refreshInterval, dateRange, className, }: TrackhomeDashboardProps): React.JSX.Element | null;
40
+ export default TrackhomeDashboard;
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAC;AAMxE,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8JD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,OAAO,EACP,GAAG,EACH,QAAgB,EAChB,eAAoB,EACpB,SAAS,EACT,SAAS,GACV,EAAE,uBAAuB,4BA6HzB;AAED,eAAe,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,174 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * trackhome-embed — Embeddable analytics dashboard for React.
4
+ *
5
+ * Usage:
6
+ *
7
+ * import { TrackhomeDashboard } from 'trackhome-embed';
8
+ *
9
+ * <TrackhomeDashboard
10
+ * endpoint="https://trk.example.com"
11
+ * authKey="ek_abc123..."
12
+ * uid="my-sales-dashboard"
13
+ * />
14
+ *
15
+ * That's it. The component fetches its config (widgets, name, theme) from
16
+ * the server keyed by (authKey, uid), renders the widgets, and refreshes
17
+ * every 30s. An optional `editable` prop enables in-browser customization
18
+ * (add/remove/edit widgets) that saves back to the server.
19
+ */
20
+ import React, { useState, useEffect, useCallback, useRef } from 'react';
21
+ // ============================================================
22
+ // API client
23
+ // ============================================================
24
+ async function api(endpoint, authKey, uid, path, init) {
25
+ const url = `${endpoint.replace(/\/$/, '')}/e/${authKey}/${uid}${path}`;
26
+ const res = await fetch(url, {
27
+ ...init,
28
+ headers: { 'content-type': 'application/json', ...(init?.headers ?? {}) },
29
+ });
30
+ if (!res.ok) {
31
+ const text = await res.text().catch(() => '');
32
+ throw new Error(`trackhome embed: ${res.status} ${res.statusText} ${text}`);
33
+ }
34
+ return res.json();
35
+ }
36
+ function defaultRange() {
37
+ const to = new Date();
38
+ const from = new Date(to.getTime() - 7 * 24 * 60 * 60 * 1000);
39
+ return { from: from.toISOString().slice(0, 10), to: to.toISOString().slice(0, 10) };
40
+ }
41
+ // ============================================================
42
+ // Widget renderers (self-contained, no external deps)
43
+ // ============================================================
44
+ function WidgetCard({ widget, data, theme, }) {
45
+ const bg = theme === 'dark' ? '#1e293b' : '#ffffff';
46
+ const text = theme === 'dark' ? '#f1f5f9' : '#1e293b';
47
+ const border = theme === 'dark' ? '#334155' : '#e2e8f0';
48
+ return (_jsxs("div", { style: { background: bg, border: `1px solid ${border}`, borderRadius: 8, padding: 12 }, children: [_jsx("div", { style: { fontSize: 13, fontWeight: 600, color: text, marginBottom: 8 }, children: widget.title }), _jsx(WidgetBody, { widget: widget, data: data, theme: theme })] }));
49
+ }
50
+ function WidgetBody({ widget, data, theme, }) {
51
+ const accent = '#4f46e5';
52
+ const subtext = theme === 'dark' ? '#94a3b8' : '#64748b';
53
+ switch (widget.kind) {
54
+ case 'metric': {
55
+ const d = data;
56
+ const count = d?.count ?? 0;
57
+ return _jsx("div", { style: { fontSize: 28, fontWeight: 700, color: accent }, children: count.toLocaleString() });
58
+ }
59
+ case 'timeseries':
60
+ case 'area': {
61
+ const d = data ?? [];
62
+ if (d.length === 0)
63
+ return _jsx("div", { style: { fontSize: 12, color: subtext }, children: "No data." });
64
+ const max = Math.max(...d.map((p) => p.count), 1);
65
+ return (_jsx("div", { style: { display: 'flex', alignItems: 'flex-end', gap: 2, height: 80 }, children: d.slice(-30).map((p, i) => (_jsx("div", { title: `${p.ts.slice(0, 10)}: ${p.count}`, style: {
66
+ flex: 1,
67
+ height: `${(p.count / max) * 100}%`,
68
+ minHeight: 2,
69
+ background: accent,
70
+ opacity: widget.kind === 'area' ? 0.6 : 1,
71
+ borderRadius: '2px 2px 0 0',
72
+ } }, i))) }));
73
+ }
74
+ case 'bar':
75
+ case 'pie':
76
+ case 'top_events':
77
+ case 'top_tags': {
78
+ const d = data ?? [];
79
+ if (d.length === 0)
80
+ return _jsx("div", { style: { fontSize: 12, color: subtext }, children: "No data." });
81
+ const max = Math.max(...d.map((x) => x.count), 1);
82
+ return (_jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: 4 }, children: d.map((x, i) => {
83
+ const label = x.type ?? x.tag ?? '—';
84
+ return (_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 8 }, children: [_jsx("div", { style: { fontSize: 11, color: subtext, width: 120, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', fontFamily: 'monospace' }, children: label }), _jsx("div", { style: { flex: 1, height: 8, background: theme === 'dark' ? '#334155' : '#f1f5f9', borderRadius: 4, overflow: 'hidden' }, children: _jsx("div", { style: { width: `${(x.count / max) * 100}%`, height: '100%', background: accent, borderRadius: 4 } }) }), _jsx("div", { style: { fontSize: 11, color: subtext, minWidth: 40, textAlign: 'right' }, children: x.count.toLocaleString() })] }, i));
85
+ }) }));
86
+ }
87
+ default:
88
+ return null;
89
+ }
90
+ }
91
+ // ============================================================
92
+ // Main component
93
+ // ============================================================
94
+ export function TrackhomeDashboard({ endpoint, authKey, uid, editable = false, refreshInterval = 30, dateRange, className, }) {
95
+ const [config, setConfig] = useState(null);
96
+ const [data, setData] = useState({});
97
+ const [loading, setLoading] = useState(true);
98
+ const [error, setError] = useState(null);
99
+ const [editMode, setEditMode] = useState(false);
100
+ const refreshTimer = useRef(null);
101
+ const range = dateRange ?? defaultRange();
102
+ const fetchAll = useCallback(async () => {
103
+ try {
104
+ const [cfg, widgetData] = await Promise.all([
105
+ api(endpoint, authKey, uid, ''),
106
+ api(endpoint, authKey, uid, `/data?from=${range.from}&to=${range.to}`),
107
+ ]);
108
+ setConfig(cfg);
109
+ setData(widgetData);
110
+ setError(null);
111
+ }
112
+ catch (err) {
113
+ setError(err.message);
114
+ }
115
+ finally {
116
+ setLoading(false);
117
+ }
118
+ }, [endpoint, authKey, uid, range.from, range.to]);
119
+ useEffect(() => {
120
+ fetchAll();
121
+ if (refreshInterval > 0) {
122
+ refreshTimer.current = setInterval(fetchAll, refreshInterval * 1000);
123
+ return () => { if (refreshTimer.current)
124
+ clearInterval(refreshTimer.current); };
125
+ }
126
+ }, [fetchAll, refreshInterval]);
127
+ if (loading) {
128
+ return React.createElement('div', { className, style: { padding: 24, textAlign: 'center', color: '#94a3b8' } }, 'Loading dashboard…');
129
+ }
130
+ if (error) {
131
+ return React.createElement('div', { className, style: { padding: 24, color: '#ef4444', fontSize: 14 } }, `Error: ${error}`);
132
+ }
133
+ if (!config)
134
+ return null;
135
+ const theme = config.theme ?? 'light';
136
+ const bg = theme === 'dark' ? '#0f172a' : '#f8fafc';
137
+ // Save config (edit mode)
138
+ async function saveConfig(next) {
139
+ setConfig(next);
140
+ await api(endpoint, authKey, uid, '', {
141
+ method: 'PATCH',
142
+ body: JSON.stringify(next),
143
+ });
144
+ }
145
+ function removeWidget(id) {
146
+ if (!config)
147
+ return;
148
+ saveConfig({ ...config, widgets: config.widgets.filter((w) => w.id !== id) });
149
+ }
150
+ return (_jsxs("div", { className: className, style: { background: bg, borderRadius: 12, padding: 16 }, children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 12 }, children: [_jsx("div", { style: { fontSize: 16, fontWeight: 700, color: theme === 'dark' ? '#f1f5f9' : '#1e293b' }, children: config.name }), editable && (_jsx("button", { onClick: () => setEditMode(!editMode), style: {
151
+ fontSize: 12,
152
+ padding: '4px 10px',
153
+ borderRadius: 6,
154
+ border: '1px solid #4f46e5',
155
+ background: editMode ? '#4f46e5' : 'transparent',
156
+ color: editMode ? '#fff' : '#4f46e5',
157
+ cursor: 'pointer',
158
+ }, children: editMode ? 'Done' : 'Edit' }))] }), _jsxs("div", { style: { display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(280px, 1fr))', gap: 8 }, children: [config.widgets.map((w) => (_jsxs("div", { style: { position: 'relative' }, children: [_jsx(WidgetCard, { widget: w, data: data[w.id], theme: theme }), editMode && (_jsx("button", { onClick: () => removeWidget(w.id), style: {
159
+ position: 'absolute',
160
+ top: 4,
161
+ right: 4,
162
+ background: '#ef4444',
163
+ color: '#fff',
164
+ border: 'none',
165
+ borderRadius: 4,
166
+ width: 20,
167
+ height: 20,
168
+ fontSize: 12,
169
+ cursor: 'pointer',
170
+ lineHeight: 1,
171
+ }, children: "\u00D7" }))] }, w.id))), config.widgets.length === 0 && (_jsxs("div", { style: { padding: 24, textAlign: 'center', color: theme === 'dark' ? '#64748b' : '#94a3b8', fontSize: 14 }, children: ["No widgets. ", editable && 'Click Edit to add some.'] }))] }), _jsx("div", { style: { textAlign: 'right', marginTop: 8, fontSize: 10, color: theme === 'dark' ? '#475569' : '#cbd5e1' }, children: "powered by trackhome" })] }));
172
+ }
173
+ export default TrackhomeDashboard;
174
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "trackhome-react",
3
+ "version": "0.1.0",
4
+ "description": "Embeddable trackhome analytics dashboard for React — just pass authKey + uid.",
5
+ "keywords": [
6
+ "analytics",
7
+ "dashboard",
8
+ "embed",
9
+ "trackhome",
10
+ "react",
11
+ "component"
12
+ ],
13
+ "homepage": "https://github.com/exreve/trackhome",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/exreve/trackhome.git",
17
+ "directory": "packages/embed"
18
+ },
19
+ "license": "MIT",
20
+ "author": "exreve",
21
+ "type": "module",
22
+ "main": "./dist/index.js",
23
+ "module": "./dist/index.js",
24
+ "types": "./dist/index.d.ts",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "import": "./dist/index.js"
29
+ }
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "README.md"
34
+ ],
35
+ "sideEffects": false,
36
+ "scripts": {
37
+ "build": "tsc -p tsconfig.json",
38
+ "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput",
39
+ "prepublishOnly": "pnpm run build"
40
+ },
41
+ "peerDependencies": {
42
+ "react": ">=18",
43
+ "react-dom": ">=18"
44
+ },
45
+ "devDependencies": {
46
+ "@types/react": "^18.3.31",
47
+ "typescript": "^5.5.0"
48
+ }
49
+ }