import { useState } from "react"; import { ProgressBar, Label, Tabs } from "@heroui/react"; import Card from "./components/Card"; import Guodegang from "./components/Guodegang"; import Quiz from "./components/Quiz"; import Topic from "./components/Topic"; import Scenario from "./components/Scenario"; /* eslint-disable @typescript-eslint/no-explicit-any */ function App() { const [topic, setTopic] = useState(''); const [cardData, setCardData]: any = useState(null); const [cardLoading, setCardLoading] = useState(false); const [cardError, setCardError] = useState(null); const [guodegangData, setGuodegangData]: any = useState(null); const [guodegangLoading, setGuodegangLoading] = useState(false); const [guodegangError, setGuodegangError] = useState(null); const [quizData, setQuizData]: any = useState(null); const [quizLoading, setQuizLoading] = useState(false); const [quizError, setQuizError] = useState(null); const [scenarioData, setScenarioData]: any = useState(null); const [scenarioLoading, setScenarioLoading] = useState(false); const [scenarioError, setScenarioError] = useState(null); const fetchData = async (topicToFetch: string) => { setCardLoading(true); setGuodegangLoading(true); setQuizLoading(true); setScenarioLoading(true); setCardError(null); setGuodegangError(null); setQuizError(null); setScenarioError(null); const cardUrl = `http://localhost:8080/card/${encodeURIComponent(topicToFetch)}`; const guodegangUrl = `http://localhost:8080/guodegang/${encodeURIComponent(topicToFetch)}`; const quizUrl = `http://localhost:8080/quiz/${encodeURIComponent(topicToFetch)}`; const scenarioUrl = `http://localhost:8080/scenario/${encodeURIComponent(topicToFetch)}`; const abortController = new AbortController(); const timeoutId = setTimeout(() => abortController.abort(), 300000); const fetchCard = async () => { try { const response = await fetch(cardUrl, { signal: abortController.signal }); if (!response.ok) throw new Error(`Card API failed: ${response.status}`); const result = await response.json(); setCardData(result.message); } catch (error) { console.error("Error fetching card data:", error); setCardError("Failed to load card data"); } finally { setCardLoading(false); } }; const fetchGuodegang = async () => { try { const response = await fetch(guodegangUrl, { signal: abortController.signal }); if (!response.ok) throw new Error(`Guodegang API failed: ${response.status}`); const result = await response.json(); setGuodegangData(result.message); } catch (error) { console.error("Error fetching guodegang data:", error); setGuodegangError("Failed to load guodegang data"); } finally { setGuodegangLoading(false); } }; const fetchQuiz = async () => { try { const response = await fetch(quizUrl, { signal: abortController.signal }); if (!response.ok) throw new Error(`Quiz API failed: ${response.status}`); const result = await response.json(); setQuizData(result.message); } catch (error) { console.error("Error fetching quiz data:", error); setQuizError("Failed to load quiz data"); } finally { setQuizLoading(false); } }; const fetchScenario = async () => { try { const response = await fetch(scenarioUrl, { signal: abortController.signal }); if (!response.ok) throw new Error(`Scenario API failed: ${response.status}`); const result = await response.json(); setScenarioData(result.message); } catch (error) { console.error("Error fetching scenario data:", error); setScenarioError("Failed to load scenario data"); } finally { setScenarioLoading(false); } }; Promise.allSettled([fetchCard(), fetchGuodegang(), fetchQuiz(), fetchScenario()]).finally(() => { clearTimeout(timeoutId); }); }; const handleTopicSubmit = (newTopic: string) => { setTopic(newTopic); if (newTopic) { fetchData(newTopic); } }; const cardLoaded = !cardLoading && !!cardData; const guodegangLoaded = !guodegangLoading && !!guodegangData; const quizLoaded = !quizLoading && !!quizData; const scenarioLoaded = !scenarioLoading && !!scenarioData; const progress = (() => { if (!topic) return 0; const loadedCount = [cardLoaded, guodegangLoaded, quizLoaded, scenarioLoaded].filter(Boolean).length; return Math.round((loadedCount / 4) * 100); })(); return (
{topic && (
)}
📚 学习卡片 🎭 德云社讲解 📝 测验问答 💡 工程场景
); } export default App;