import React, { useEffect, useState, useMemo } from "react"; import Card from "../../../components/ui/Card"; import { useSocket } from "../../../hooks/useSocket"; import gameDataManager from "../../../services/GameDataManager"; import "./styles/QuestsTab.css"; const QuestsTab = () => { const { socket } = useSocket(); const [quests, setQuests] = useState([]); const [loading, setLoading] = useState(true); const [activeTab, setActiveTab] = useState("ACTIVE"); useEffect(() => { if (!socket) return; socket.emit("quest:get_list"); const localize = (q) => { const staticData = gameDataManager.getQuest(q.id); return { ...q, displayName: staticData?.displayName || q.id, description: staticData?.description || "", objectives: q.objectives.map((obj, idx) => ({ ...obj, description: staticData?.objectives[idx]?.description || obj.type, })), }; }; const handleQuestData = (data) => { const uniqueQuests = new Map(); data.forEach((q) => { uniqueQuests.set(q.id, localize(q)); }); setQuests(Array.from(uniqueQuests.values())); setLoading(false); }; const handleQuestUpdate = (updatedQuest) => { setQuests((prev) => { const localized = localize(updatedQuest); const questMap = new Map(prev.map((q) => [q.id, q])); questMap.set(localized.id, localized); return Array.from(questMap.values()); }); }; socket.on("quest:list_data", handleQuestData); socket.on("quest:update", handleQuestUpdate); return () => { socket.off("quest:list_data", handleQuestData); socket.off("quest:update", handleQuestUpdate); }; }, [socket]); const filteredQuests = useMemo(() => { return quests.filter((q) => activeTab === "ACTIVE" ? q.status === "active" || q.status === "ready" : q.status === "completed", ); }, [quests, activeTab]); const renderObjective = (obj, index) => { const progress = Math.min( (obj.currentAmount / obj.requiredAmount) * 100, 100, ); return (
{quest.description}
NO_{activeTab}_SIGNALS_FOUND