Fas 1b punkt 6: First Scan Coach + aktiveringsmätning
This commit is contained in:
@@ -27,6 +27,14 @@ interface EventCountsResult {
|
||||
unique_users: number;
|
||||
}>;
|
||||
}
|
||||
interface ActivationResult {
|
||||
totalHouseholds: number;
|
||||
scanned: number;
|
||||
activated: number;
|
||||
valueConfirmed: number;
|
||||
activationRate: number;
|
||||
valueConfirmationRate: number;
|
||||
}
|
||||
|
||||
function today() {
|
||||
return new Date().toISOString().slice(0, 10);
|
||||
@@ -51,6 +59,7 @@ export function AnalyticsPage() {
|
||||
const [countsStart, setCountsStart] = useState<string>(weekAgo());
|
||||
const [countsEnd, setCountsEnd] = useState<string>(today());
|
||||
const [counts, setCounts] = useState<EventCountsResult | null>(null);
|
||||
const [activation, setActivation] = useState<ActivationResult | null>(null);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
@@ -60,6 +69,9 @@ export function AnalyticsPage() {
|
||||
if (res.funnels[0]) setFunnelName(res.funnels[0].name);
|
||||
})
|
||||
.catch((e) => setError(String(e.message)));
|
||||
api<ActivationResult>("/admin/v1/analytics/activation")
|
||||
.then(setActivation)
|
||||
.catch((e) => setError(String(e.message)));
|
||||
}, []);
|
||||
|
||||
const loadFunnel = () => {
|
||||
@@ -107,6 +119,30 @@ export function AnalyticsPage() {
|
||||
<h2>Analytics</h2>
|
||||
{error && <div className="error-text">{error}</div>}
|
||||
|
||||
{activation && (
|
||||
<div className="panel">
|
||||
<h3>Aktivering</h3>
|
||||
<div className="metrics">
|
||||
<div className="stat">
|
||||
<div className="value">{activation.totalHouseholds}</div>
|
||||
<div className="label">Hushåll</div>
|
||||
</div>
|
||||
<div className="stat">
|
||||
<div className="value">{activation.scanned}</div>
|
||||
<div className="label">Skannat</div>
|
||||
</div>
|
||||
<div className="stat">
|
||||
<div className="value">{(activation.activationRate * 100).toFixed(1)}%</div>
|
||||
<div className="label">Aktiverade</div>
|
||||
</div>
|
||||
<div className="stat">
|
||||
<div className="value">{(activation.valueConfirmationRate * 100).toFixed(1)}%</div>
|
||||
<div className="label">Value confirmed</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="panel">
|
||||
<h3>Funnels</h3>
|
||||
<div className="form-row">
|
||||
|
||||
Reference in New Issue
Block a user