import { useEffect, useState, useRef } from "react"; import axios from "axios"; import { useParams } from "react-router-dom"; import StatsStyling from "../styles/stats_styling"; import SummaryStats from "../components/SummaryStats"; import EmotionalStats from "../components/EmotionalStats"; import InteractionStats from "../components/UserStats"; import { type SummaryResponse, type UserAnalysisResponse, type TimeAnalysisResponse, type ContentAnalysisResponse } from '../types/ApiTypes' const API_BASE_URL = import.meta.env.VITE_BACKEND_URL const styles = StatsStyling; const StatPage = () => { const { datasetId: routeDatasetId } = useParams<{ datasetId: string }>(); const [error, setError] = useState(''); const [loading, setLoading] = useState(false); const [activeView, setActiveView] = useState<"summary" | "emotional" | "interaction">("summary"); const [userData, setUserData] = useState(null); const [timeData, setTimeData] = useState(null); const [contentData, setContentData] = useState(null); const [summary, setSummary] = useState(null); const searchInputRef = useRef(null); const beforeDateRef = useRef(null); const afterDateRef = useRef(null); const parsedDatasetId = Number(routeDatasetId ?? ""); const datasetId = Number.isInteger(parsedDatasetId) && parsedDatasetId > 0 ? parsedDatasetId : null; const getFilterParams = () => { const params: Record = {}; const query = (searchInputRef.current?.value ?? "").trim(); const start = (afterDateRef.current?.value ?? "").trim(); const end = (beforeDateRef.current?.value ?? "").trim(); if (query) { params.search_query = query; } if (start) { params.start_date = start; } if (end) { params.end_date = end; } return params; }; const getAuthHeaders = () => { const token = localStorage.getItem("access_token"); if (!token) { return null; } return { Authorization: `Bearer ${token}`, }; }; const getStats = (params: Record = {}) => { if (!datasetId) { setError("Missing dataset id. Open /dataset//stats."); return; } const authHeaders = getAuthHeaders(); if (!authHeaders) { setError("You must be signed in to load stats."); return; } setError(""); setLoading(true); Promise.all([ axios.get(`${API_BASE_URL}/dataset/${datasetId}/time`, { params, headers: authHeaders, }), axios.get(`${API_BASE_URL}/dataset/${datasetId}/user`, { params, headers: authHeaders, }), axios.get(`${API_BASE_URL}/dataset/${datasetId}/content`, { params, headers: authHeaders, }), axios.get(`${API_BASE_URL}/dataset/${datasetId}/summary`, { params, headers: authHeaders, }), ]) .then(([timeRes, userRes, contentRes, summaryRes]) => { setUserData(userRes.data || null); setTimeData(timeRes.data || null); setContentData(contentRes.data || null); setSummary(summaryRes.data || null); }) .catch((e) => setError("Failed to load statistics: " + String(e))) .finally(() => setLoading(false)); }; const onSubmitFilters = () => { getStats(getFilterParams()); }; const resetFilters = () => { if (searchInputRef.current) { searchInputRef.current.value = ""; } if (beforeDateRef.current) { beforeDateRef.current.value = ""; } if (afterDateRef.current) { afterDateRef.current.value = ""; } getStats(); }; useEffect(() => { setError(""); if (!datasetId) { setError("Missing dataset id. Open /dataset//stats."); return; } getStats(); }, [datasetId]) if (loading) return

Loading insights…

; if (error) return

{error}

; return (
Analytics Dashboard
Dataset #{datasetId ?? "-"}
{activeView === "summary" && ( )} {activeView === "emotional" && contentData && ( )} {activeView === "emotional" && !contentData && (
No emotional data available.
)} {activeView === "interaction" && userData && ( )}
); } export default StatPage;