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 (
{obj.description || obj.type} {obj.currentAmount} / {obj.requiredAmount}
); }; return (

MISSION_LOG

{loading ? (
SCANNING_NEURAL_NETWORK...
) : (
{filteredQuests.length > 0 ? ( filteredQuests.map((quest) => (
{quest.category || "MISSION"}

{quest.displayName}

{quest.description}

OBJECTIVES
{quest.objectives.map((obj, idx) => renderObjective(obj, idx), )}
REWARDS
{quest.rewards?.credits > 0 && ( +{quest.rewards.credits} CR )} {quest.rewards?.xp > 0 && ( +{quest.rewards.xp} XP )}
{quest.status === "ready" && ( )} {quest.status === "completed" && (
MISSION_ACCOMPLISHED
)}
)) ) : (

NO_{activeTab}_SIGNALS_FOUND

)}
)}
); }; export default QuestsTab;