import { showToast } from "./toast"; import { Alpine } from "./alpine"; async function loadAnalytics(): Promise { const token = localStorage.getItem("token"); if (!token) return; try { const [statsRes, devicesRes, popularRes] = await Promise.all([ fetch("/api/analytics/stats", { headers: { Authorization: `Bearer ${token}` }, }), fetch("/api/analytics/devices", { headers: { Authorization: `Bearer ${token}` }, }), fetch("/api/analytics/popular", { headers: { Authorization: `Bearer ${token}` }, }), ]); if (statsRes.ok) { const stats: ReadingStatsResponse = await statsRes.json(); renderReadingStats(stats); } if (devicesRes.ok) { const devices: DeviceUsageResponse = await devicesRes.json(); renderDeviceUsage(devices); } if (popularRes.ok) { const popular: PopularBooksResponse = await popularRes.json(); renderPopularBooks(popular); } } catch (error) { console.error("Failed to load analytics:", error); showToast("Failed to load analytics data", "error"); } } function renderReadingStats(stats: ReadingStatsResponse): void { const container = document.getElementById("reading-stats"); if (!container) return; container.innerHTML = `

${stats.total_books_read}

Books Read

${stats.total_pages_read}

Pages Read

${stats.total_reading_time_minutes}

Minutes Reading

${Math.round(stats.completion_rate * 100)}%

Completion Rate

`; } function renderDeviceUsage(devices: DeviceUsageResponse): void { const container = document.getElementById("device-usage"); if (!container) return; if (!devices.devices || devices.devices.length === 0) { container.innerHTML = '

No device usage data available

'; return; } container.innerHTML = devices.devices .map( (device) => `

${device.device_name}

${device.device_type}

${Math.round(device.total_time_minutes)} min

${device.sync_count} syncs

`, ) .join(""); } function renderPopularBooks(popular: PopularBooksResponse): void { const container = document.getElementById("popular-books"); if (!container) return; if (!popular.books || popular.books.length === 0) { container.innerHTML = '

No reading history available

'; return; } container.innerHTML = popular.books .map( (book) => `

${book.title}

${book.author}

${book.read_count}x

${Math.round(book.avg_completion * 100)}%

`, ) .join(""); } export { loadAnalytics }; Alpine.data("analytics", () => ({ loadAnalytics, }));