"use client"; import React, { useState, useEffect } from "react"; import { useParams, useRouter } from "next/navigation"; import { cmsApi, Course, AdvancedAnalytics } from "@/lib/api"; import { useAuth } from "@/context/AuthContext"; import { LineChart, BarChart3, Users, TrendingUp, ArrowLeft, Layers, Calendar, Filter } from "lucide-react"; import CourseEditorLayout from "@/components/CourseEditorLayout"; export default function AdvancedAnalyticsPage() { const { id } = useParams() as { id: string }; const router = useRouter(); const { user } = useAuth(); const [course, setCourse] = useState(null); const [analytics, setAnalytics] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { if (!user) return; try { const [courseData, advancedData] = await Promise.all([ cmsApi.getCourseWithFullOutline(id), cmsApi.getAdvancedAnalytics(id) ]); setCourse(courseData); setAnalytics(advancedData); } catch (err: any) { console.error("Failed to load advanced analytics", err); setError(err.message || "Failed to load data"); } finally { setLoading(false); } }; fetchData(); }, [id, user]); if (loading) return (
); if (error || !course || !analytics) return (
{error || "Data unavailable"}
); return (
{/* Header */}

Advanced Insights

Cohort analysis and student retention for {course.title}

{/* Cohort Analysis */}

Cohort Completion

Grouped by Month
{analytics.cohorts.length === 0 ? ( ) : analytics.cohorts.map((cohort) => ( ))}
Cohort (Enrollment Month) Students Avg. Completion Rate Engagement Status
No cohort data available yet.
{cohort.period} {cohort.count}
{Math.round(cohort.completion_rate * 100)}%
{cohort.completion_rate > 0.8 ? ( Excellent ) : cohort.completion_rate > 0.5 ? ( Healthy ) : ( Low Momentum )}
{/* Retention Analysis */}

Retention Heatmap

{analytics.retention.map((item, index) => { const firstStudentCount = analytics.retention[0]?.student_count || 1; const percentage = (item.student_count / firstStudentCount) * 100; return (
{index + 1}
{item.lesson_title}
{item.student_count} Students
{Math.round(percentage)}% Retention
80 ? 'bg-indigo-500' : percentage > 50 ? 'bg-indigo-600/70' : 'bg-indigo-700/40' }`} style={{ width: `${percentage}%` }} />
{index > 0 && analytics.retention[index - 1].student_count > 0 && (
-{Math.round(100 - (item.student_count / analytics.retention[index - 1].student_count) * 100)}% drop
)}
); })}
); }