Finalize metrics verification and backlog updates

This commit is contained in:
2026-06-05 21:49:57 +02:00
parent d3928d61c4
commit f069b74b08
15 changed files with 240 additions and 36 deletions

View File

@@ -1,8 +1,8 @@
"use client";
import { useMemo } from "react";
import { useEffect, useMemo, useState } from "react";
import { useQuery } from "convex/react";
import { Activity, BarChart3, Filter, MousePointerClick } from "lucide-react";
import { Activity, Filter, MousePointerClick } from "lucide-react";
import { api } from "@/convex/_generated/api";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
@@ -30,6 +30,12 @@ const metricLabels: Record<string, string> = {
export function AnalyticsDashboard() {
const dashboard = useQuery(api.campaignMetrics.getDashboard, { limit: 20 });
const [rybbitData, setRybbitData] = useState<{
auditOpens: number;
ctaClicks: number;
outboundClicks: number;
} | null>(null);
const [rybbitError, setRybbitError] = useState<string | null>(null);
const metricEntries = useMemo(() => {
if (!dashboard) {
return [];
@@ -38,6 +44,31 @@ export function AnalyticsDashboard() {
return Object.entries(dashboard.metrics).filter(([key]) => key in metricLabels);
}, [dashboard]);
useEffect(() => {
let isMounted = true;
fetch("/api/internal/rybbit/campaign")
.then(async (response) => {
const payload = await response.json();
if (!isMounted) {
return;
}
if (!payload.ok) {
setRybbitError("Rybbit-Daten konnten nicht geladen werden.");
}
setRybbitData(payload.data ?? null);
})
.catch(() => {
if (isMounted) {
setRybbitError("Rybbit-Daten konnten nicht geladen werden.");
}
});
return () => {
isMounted = false;
};
}, []);
if (dashboard === undefined) {
return (
<section className="space-y-4">
@@ -130,6 +161,10 @@ export function AnalyticsDashboard() {
</CardHeader>
<CardContent className="space-y-2 text-sm text-muted-foreground">
<p>Rybbit-Daten konnten nicht geladen werden, wenn API-URL, Site-ID oder API-Key fehlen.</p>
{rybbitError ? <p className="text-destructive">{rybbitError}</p> : null}
<p>Audit-Öffnungen: {rybbitData?.auditOpens ?? dashboard.metrics.rybbitAuditOpens}</p>
<p>CTA-Klicks: {rybbitData?.ctaClicks ?? dashboard.metrics.rybbitCtaClicks}</p>
<p>Website-Link-Klicks: {rybbitData?.outboundClicks ?? 0}</p>
<p>Public-Audit Tracking läuft nur auf veröffentlichten Audit-Seiten.</p>
</CardContent>
</Card>