/** * Live-Projektzahl für die Statistik-Zeile im Hero. * * Quelle: GET /api/projects (contact-api-Container) – zählt serverseitig die * Repositories, die aktuell in Gitea (git.webklar.com) liegen, angereichert um * die Hosting-Metadaten aus Appwrite. Der Gitea-Token bleibt dadurch auf dem * Server. Die Antwort enthält mehr Felder als hier genutzt werden; für die * Homepage ist nur `total` relevant. */ export type ProjectsSnapshot = { /** Zeitpunkt, zu dem der Server-Snapshot erzeugt wurde (ISO) */ generatedAt: string; /** Anzahl der Repositories, die aktuell in Gitea existieren */ total: number; counts: Record; source: string; }; const API_URL = import.meta.env.VITE_PROJECTS_API ?? "/api/projects"; export async function fetchProjects(signal?: AbortSignal): Promise { const res = await fetch(API_URL, { signal, headers: { Accept: "application/json" } }); if (!res.ok) throw new Error(`Projektzahl konnte nicht geladen werden (HTTP ${res.status})`); const data = (await res.json()) as ProjectsSnapshot; if (typeof data?.total !== "number") throw new Error("Unerwartete Antwort der Projekt-API"); return data; }