import { useState, useEffect } from 'react' import { LineChart, Line, BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Legend } from 'recharts' import { Download, RefreshCw, AlertCircle, Loader2 } from 'lucide-react' import api from '../services/api' export default function Analytics() { const [data, setData] = useState(null) const [logs, setLogs] = useState([]) const [pagination, setPagination] = useState({ total: 0, page: 1, page_size: 20, total_pages: 1, has_prev: false, has_next: false }) const [page, setPage] = useState(1) const [pageSize, setPageSize] = useState(20) const [loading, setLoading] = useState(true) useEffect(() => { fetchData() }, [page, pageSize]) const fetchData = async () => { setLoading(true) try { const [summaryRes, logsRes] = await Promise.all([ api.get('/api/user/analytics/summary'), api.get(`/api/user/analytics/logs?page=${page}&page_size=${pageSize}`) ]) setData(summaryRes.data) setLogs(logsRes.data.logs) setPagination(logsRes.data.pagination || { total: 0, page: 1, page_size: pageSize, total_pages: 1, has_prev: false, has_next: false }) } catch (err) { console.error("Failed to fetch analytics", err) } finally { setLoading(false) } } if (loading || !data) { return (
) } return (
{/* Header */}

Usage & Analytics

Monitor API performance and OTP delivery rates over time.

{/* Main Charts */}
{/* OTPs Sent Line Chart */}

Volume Sent (Last 7 Days)

{/* Success vs Failed Bar Chart */}

Delivery Status Breakdown

{/* Detailed Log Table */}

Recent Request Logs

Rows
Request ID
Phone Number
Timestamp
Status
{logs.length === 0 ? (
No requests found yet.
) : ( logs.map((log) => (
{log.request_id}
{log.phone}
{new Date(log.created_at).toLocaleString()}
{log.status === 'failed' ? : null} {log.status}
)) )}
Showing page {pagination.page} of {pagination.total_pages} • Total logs: {pagination.total}
) }