import { useEffect, useState, useRef } from "react"; import axios from "axios"; import { LineChart, Line, XAxis, YAxis, Tooltip, CartesianGrid, ResponsiveContainer } from "recharts"; import ActivityHeatmap from "../stats/ActivityHeatmap"; import { ReactWordcloud } from '@cp949/react-wordcloud'; type BackendWord = { word: string; count: number; } const StatPage = () => { const [error, setError] = useState(''); const [loading, setLoading] = useState(true); const [postsPerDay, setPostsPerDay] = useState([]); const [heatmapData, setHeatmapData] = useState([]); const [wordFrequencyData, setWordFrequencyData] = useState([]); const inputRef = useRef(null); const getStats = () => { setError(""); Promise.all([ axios.get("http://localhost:5000/stats/time"), axios.get("http://localhost:5000/stats/content"), ]) .then(([timeRes, wordsRes]) => { const eventsPerDay = Array.isArray(timeRes.data?.events_per_day) ? timeRes.data.events_per_day : []; const weekdayHourHeatmap = Array.isArray(timeRes.data?.weekday_hour_heatmap) ? timeRes.data.weekday_hour_heatmap : []; const wordFrequencies = Array.isArray(wordsRes.data?.word_frequencies) ? wordsRes.data.word_frequencies : []; setPostsPerDay( eventsPerDay.filter( (d: any) => new Date(d.date) >= new Date("2026-01-10") ) ); setHeatmapData(weekdayHourHeatmap); setWordFrequencyData( wordFrequencies.map((d: BackendWord) => ({ text: d.word, value: d.count, })) ); }) .catch((e) => setError("Failed to load statistics: " + String(e))); }; const onSearch = () => { const query = inputRef.current?.value ?? ""; axios.post("http://localhost:5000/filter/search", { query: query }) .then(() => { getStats(); }) .catch(e => { setError(e); }) }; const resetFilters = () => { axios.get("http://localhost:5000/filter/reset") .then(() => { getStats(); }) .catch(e => { setError(e); }) }; useEffect(() => { setLoading(true); getStats(); setLoading(false); }, []) if (loading) return

Loading insights…

; if (error) return

{error}

; return (

Events per Day

Word Cloud

Heatmap

); } export default StatPage;