import { openUrl } from "@tauri-apps/plugin-opener"; import { useStore } from "../store"; import { SectionItem, QuestItem } from "../types"; export default function GuideView() { const { activeGuideData, completedQuests, toggleQuest } = useStore(); if (!activeGuideData) return null; const { name, effect, recommended_level, resources, sections } = activeGuideData; const allQuests = collectAllQuests(sections); const completedCount = allQuests.filter(q => completedQuests.has(q)).length; const pct = allQuests.length > 0 ? Math.round((completedCount / allQuests.length) * 100) : 0; return (
{/* Main quest list */}
{/* Guide header */}

{name}

{recommended_level && ( Niveau recommandé : {recommended_level} )} {completedCount}/{allQuests.length} quêtes · {pct}%
{/* Progress bar */}
{effect && (
Effet : {effect}
)}
{/* Sections */} {sections.map((section, si) => (

{section.name}

{section.items.map((item, ii) => ( ))}
))}
{/* Resources panel */} {resources.length > 0 && (

Ressources

{resources.map((r, i) => (
{r.name} ×{r.quantity}
))}
)}
); } function SectionItemView({ item, completedQuests, onToggle }: { item: SectionItem; completedQuests: Set; onToggle: (name: string) => void; }) { if (item.type === "Instruction") { if (item.text.startsWith("__ZONE__:")) { const zone = item.text.replace("__ZONE__:", ""); return (
{zone}
); } return (
ℹ️ {item.text}
); } if (item.type === "Group") { return (
{item.note && (
🔗 {item.note}
)} {item.quests.map((q, i) => ( ))}
); } if (item.type === "Quest") { return ; } return null; } function QuestRow({ quest, completed, onToggle, indent }: { quest: QuestItem; completed: boolean; onToggle: (name: string) => void; indent?: boolean; }) { return (
onToggle(quest.name)} style={{ display: "flex", alignItems: "flex-start", gap: "8px", padding: indent ? "4px 0" : "5px 6px", borderRadius: "5px", cursor: "pointer", marginBottom: indent ? "2px" : "3px", opacity: completed ? 0.6 : 1, transition: "all 0.12s", }} onMouseEnter={e => { (e.currentTarget as HTMLElement).style.background = "rgba(255,255,255,0.04)"; }} onMouseLeave={e => { (e.currentTarget as HTMLElement).style.background = "transparent"; }} > onToggle(quest.name)} onClick={e => e.stopPropagation()} style={{ marginTop: "2px", flexShrink: 0 }} />
{quest.name} {quest.url && ( { e.stopPropagation(); openUrl(quest.url!); }} style={{ fontSize: "10px", color: "#4a9eff", cursor: "pointer", opacity: 0.7, flexShrink: 0, lineHeight: 1, }} onMouseEnter={e => (e.currentTarget as HTMLElement).style.opacity = "1"} onMouseLeave={e => (e.currentTarget as HTMLElement).style.opacity = "0.7"} > 🔗 )}
{quest.combat_indicators.length > 0 && (
{quest.combat_indicators.map((ci, i) => ( {ci.combat_type} {ci.count} ))}
)} {quest.note && (
→ {quest.note}
)}
); } function collectAllQuests(sections: import("../types").Section[] | undefined): string[] { if (!sections) return []; const names: string[] = []; for (const section of sections) { for (const item of section.items) { if (item.type === "Quest") names.push(item.name); else if (item.type === "Group") item.quests.forEach((q: import("../types").QuestItem) => names.push(q.name)); } } return names; }