import React from "react"; import { toast } from "sonner"; import { Card, CardContent, CardHeader, CardTitle } from "./ui/card"; import { Badge } from "./ui/badge"; import { Skeleton } from "./ui/skeleton"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./ui/tooltip"; import { cn } from "../lib/utils"; import { FileText, RefreshCw, Trash2, Pencil, Star, Coins } from "lucide-react"; interface QuestListItem { id: number; name: string; description: string | null; triggerEvent: string; requirements: { target?: number }; rewards: { xp?: number; balance?: number }; } interface QuestTableProps { quests: QuestListItem[]; isInitialLoading: boolean; isRefreshing: boolean; onRefresh?: () => void; onDelete?: (id: number) => void; onEdit?: (id: number) => void; } const TRIGGER_EVENT_LABELS: Record = { XP_GAIN: "XP Gain", ITEM_COLLECT: "Item Collect", ITEM_USE: "Item Use", DAILY_REWARD: "Daily Reward", LOOTBOX: "Lootbox Currency Reward", EXAM_REWARD: "Exam Reward", PURCHASE: "Purchase", TRANSFER_IN: "Transfer In", TRANSFER_OUT: "Transfer Out", TRADE_IN: "Trade In", TRADE_OUT: "Trade Out", QUEST_REWARD: "Quest Reward", TRIVIA_ENTRY: "Trivia Entry", TRIVIA_WIN: "Trivia Win", }; function getTriggerEventLabel(triggerEvent: string): string { return TRIGGER_EVENT_LABELS[triggerEvent] || triggerEvent; } function TruncatedText({ text, maxLength = 100 }: { text: string; maxLength?: number }) { if (!text || text.length <= maxLength) { return {text || "-"}; } return ( {text.slice(0, maxLength)}...

{text}

); } function QuestTableSkeleton() { return (
{Array.from({ length: 5 }).map((_, i) => (
))}
); } function EmptyQuestState() { return (

No quests available

There are no quests in the database yet. Create your first quest using the form below.

); } function QuestTableContent({ quests, onDelete, onEdit }: { quests: QuestListItem[]; onDelete?: (id: number) => void; onEdit?: (id: number) => void }) { if (quests.length === 0) { return ; } return (
{quests.map((quest) => { const requirements = quest.requirements as { target?: number }; const rewards = quest.rewards as { xp?: number; balance?: number }; const target = requirements?.target || 1; return ( ); })}
ID Name Description Trigger Event Target XP Reward AU Reward Actions
#{quest.id} {quest.name} {getTriggerEventLabel(quest.triggerEvent)} {target} {rewards?.xp ? ( {rewards.xp} ) : ( - )} {rewards?.balance ? ( {rewards.balance} ) : ( - )}
); } export function QuestTable({ quests, isInitialLoading, isRefreshing, onRefresh, onDelete, onEdit }: QuestTableProps) { const showSkeleton = isInitialLoading && quests.length === 0; return (
Quest Inventory
{showSkeleton ? ( Loading... ) : ( {quests.length} quest{quests.length !== 1 ? "s" : ""} )}
{showSkeleton ? ( ) : ( )}
); }