// modules/admin/components/courses/AchievementsBuilder.jsx // The "Achievements" sub-section of the Rewards step: pick an existing // achievement from the registry or define a new one — same New/Attach // pattern as RoadmapBuilder's Units section. A course carries at most one // achievement. import { useState } from "react"; import * as LucideIcons from "lucide-react"; import { Plus, Link2, Trophy, BadgeCheck, Trash2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import AttachAchievementDialog from "./AttachAchievementDialog"; import CreateAchievementDialog from "./CreateAchievementDialog"; export default function AchievementsBuilder({ achievementKeys, onAchievementKeysChange, registry, onRegistryChange }) { const [attachOpen, setAttachOpen] = useState(false); const [createOpen, setCreateOpen] = useState(false); const selected = registry.find((a) => a.key === achievementKeys[0]) ?? null; const handleAttach = (key) => onAchievementKeysChange([key]); const handleCreated = (achievement) => { onRegistryChange([...registry, achievement]); onAchievementKeysChange([achievement.key]); }; const declineAchievement = () => { onAchievementKeysChange([]); }; return (

Achievements

Attach an existing achievement from the registry, or define a new one from scratch.

{!selected ? (

No achievement selected

) : (
{(() => { const Icon = LucideIcons[selected.icon] ?? Trophy; return ; })()}

{selected.label}

{selected.description && (

{selected.description}

)}
{selected.type === "badge" ? : } {selected.type}
)}
); }