import React, { useState, useEffect } from 'react'; import { BookOpen, CheckCircle, Loader, ArrowRight, Plus, Search, ChevronLeft, MessageSquare } from 'lucide-react'; import { motion, AnimatePresence } from 'framer-motion'; import { Link } from 'react-router-dom'; import Card from '../components/ui/Card'; import Button from '../components/ui/Button'; import Tag from '../components/ui/Tag'; import Input from '../components/ui/Input'; import LearningContentViewer from '../components/ui/LearningContentViewer'; import { useApp } from '../store/AppContext'; import { getAssignedTopic, generateLearningContent, getCachedContent, generateCustomTopic } from '../lib/learningService'; import * as db from '../lib/db'; const Leren = () => { const { state } = useApp(); const [assignedTopic, setAssignedTopic] = useState(null); const [allTopics, setAllTopics] = useState([]); // View state const [view, setView] = useState('overview'); // overview, detail, creating const [activeTopic, setActiveTopic] = useState(null); const [content, setContent] = useState(null); // Loading & Error const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); // Custom Topic const [customTopicQuery, setCustomTopicQuery] = useState(''); // Weekly status const [weeklyDone, setWeeklyDone] = useState(false); const [sessionDone, setSessionDone] = useState(false); // Feedback const [showFeedbackModal, setShowFeedbackModal] = useState(false); const [feedbackText, setFeedbackText] = useState(''); const [feedbackPrompted, setFeedbackPrompted] = useState(false); useEffect(() => { if (state.currentUser) { const load = async () => { const [assigned, topics, done] = await Promise.all([ getAssignedTopic(state.currentUser.id, state.weekNumber), db.getTopics(), db.getLearnDone(state.currentUser.id, state.weekNumber), ]); setAssignedTopic(assigned); setAllTopics(topics); if (done) setWeeklyDone(true); }; load(); } }, [state.currentUser, state.weekNumber]); const handleOpenTopic = (topic) => { setActiveTopic(topic); setView('detail'); setSessionDone(false); setError(null); setFeedbackText(''); setFeedbackPrompted(false); const cached = getCachedContent(topic.id); if (cached) { setContent(cached); } else { setContent(null); } }; const loadContent = async () => { if (!activeTopic) return; setIsLoading(true); setError(null); try { const generated = await generateLearningContent(activeTopic); setContent(generated); } catch (e) { setError(e.message); } finally { setIsLoading(false); } }; const handleCreateCustom = async (e) => { e.preventDefault(); if (!customTopicQuery.trim()) return; setIsLoading(true); setView('creating'); setError(null); try { const newTopic = await generateCustomTopic(customTopicQuery); setAllTopics(await db.getTopics()); setCustomTopicQuery(''); handleOpenTopic(newTopic); } catch (e) { setError(e.message); setView('overview'); } finally { setIsLoading(false); } }; const doComplete = async () => { setSessionDone(true); if (!weeklyDone) { setWeeklyDone(true); await db.setLearnDone(state.currentUser.id, state.weekNumber); } }; const handleComplete = () => { if (!feedbackPrompted) { setFeedbackPrompted(true); setShowFeedbackModal(true); return; } doComplete(); }; const handleSubmitFeedback = async () => { if (feedbackText.trim()) { await db.setSetting( `feedback:${state.currentUser.id}:${activeTopic.id}:${state.weekNumber}`, feedbackText.trim() ); } setShowFeedbackModal(false); doComplete(); }; const handleSkipFeedback = () => { setShowFeedbackModal(false); doComplete(); }; // ── Detail View ────────────────────────────────────────── if (view === 'detail' && activeTopic) { if (sessionDone) { return (

Learning session complete!

You have successfully reviewed "{activeTopic.label}". {weeklyDone && ' Your weekly minimum is met.'}

); } return (
{showFeedbackModal && (

How was this content?

Your feedback helps improve future learning content. This is optional — you can skip if you prefer.