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 +62 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +174 -0
- package/dist/index.js.map +1 -0
- package/package.json +49 -0
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
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|