questro
Version:
A lightweight, modular gamification library for React with unique visual components. Features combo meters, daily challenges, achievement toasts, and progress rings. Add points, badges, quests, leaderboards, levels/XP, streaks, and notifications with zero
161 lines (154 loc) • 6.13 kB
text/typescript
import { a as EntityId, T as Timestamp, E as EventEmitter, R as Result } from '../types-B4P_iNGe.mjs';
import * as react_jsx_runtime from 'react/jsx-runtime';
import { ReactNode } from 'react';
type QuestStatus = 'available' | 'in-progress' | 'completed' | 'failed' | 'expired';
type QuestDifficulty = 'easy' | 'medium' | 'hard' | 'expert';
type QuestRecurrence = 'daily' | 'weekly' | 'monthly' | 'one-time';
interface QuestObjective {
id: EntityId;
description: string;
target: number;
current: number;
completed: boolean;
}
interface QuestReward {
points?: number;
badgeId?: EntityId;
customReward?: Record<string, unknown>;
}
interface Quest {
id: EntityId;
title: string;
description: string;
icon?: string;
difficulty: QuestDifficulty;
recurrence: QuestRecurrence;
status: QuestStatus;
objectives: QuestObjective[];
rewards: QuestReward;
startDate?: Timestamp;
endDate?: Timestamp;
expiresAt?: Timestamp;
completedAt?: Timestamp;
createdAt: Timestamp;
updatedAt: Timestamp;
}
interface QuestsState {
quests: Quest[];
activeQuests: Quest[];
completedQuests: Quest[];
lastUpdated: Timestamp;
}
interface QuestsConfig {
maxActiveQuests?: number;
storageKey?: string;
autoStartQuests?: boolean;
persistState?: boolean;
}
type QuestsEvents = {
'quest-started': Quest;
'quest-completed': Quest;
'quest-failed': Quest;
'quest-expired': Quest;
'objective-progress': {
quest: Quest;
objective: QuestObjective;
};
'objective-completed': {
quest: Quest;
objective: QuestObjective;
};
'state-changed': QuestsState;
};
interface QuestsService extends EventEmitter<QuestsEvents> {
getState(): QuestsState;
getAllQuests(): Quest[];
getQuestById(id: EntityId): Quest | undefined;
getActiveQuests(): Quest[];
getCompletedQuests(): Quest[];
getAvailableQuests(): Quest[];
startQuest(questId: EntityId): Result<Quest>;
updateObjectiveProgress(questId: EntityId, objectiveId: EntityId, progress: number): Result<Quest>;
completeObjective(questId: EntityId, objectiveId: EntityId): Result<Quest>;
checkQuestCompletion(questId: EntityId): Result<Quest>;
abandonQuest(questId: EntityId): Result<Quest>;
resetQuest(questId: EntityId): Result<Quest>;
addQuest(quest: Omit<Quest, 'id' | 'createdAt' | 'updatedAt'>): Result<Quest>;
removeQuest(questId: EntityId): Result<boolean>;
reset(): void;
}
declare class QuestsServiceImpl implements QuestsService {
private state;
private config;
readonly events: EventEmitter<QuestsEvents>;
constructor(initialQuests?: Quest[], config?: QuestsConfig);
on: <K extends keyof QuestsEvents>(event: K, handler: (data: QuestsEvents[K]) => void) => () => void;
emit: <K extends keyof QuestsEvents>(event: K, data: QuestsEvents[K]) => void;
private notifyStateChange;
private checkExpiredQuests;
getState(): QuestsState;
getAllQuests(): Quest[];
getQuestById(id: EntityId): Quest | undefined;
getActiveQuests(): Quest[];
getCompletedQuests(): Quest[];
getAvailableQuests(): Quest[];
startQuest(questId: EntityId): Result<Quest>;
updateObjectiveProgress(questId: EntityId, objectiveId: EntityId, progress: number): Result<Quest>;
completeObjective(questId: EntityId, objectiveId: EntityId): Result<Quest>;
checkQuestCompletion(questId: EntityId): Result<Quest>;
abandonQuest(questId: EntityId): Result<Quest>;
resetQuest(questId: EntityId): Result<Quest>;
addQuest(questData: Omit<Quest, 'id' | 'createdAt' | 'updatedAt'>): Result<Quest>;
removeQuest(questId: EntityId): Result<boolean>;
reset(): void;
}
interface QuestsContextValue {
service: QuestsService;
}
interface QuestsProviderProps {
children: ReactNode;
quests?: Quest[];
config?: QuestsConfig;
}
declare function QuestsProvider({ children, quests, config }: QuestsProviderProps): react_jsx_runtime.JSX.Element;
declare function useQuestsContext(): QuestsContextValue;
interface UseQuestsReturn {
allQuests: Quest[];
activeQuests: Quest[];
completedQuests: Quest[];
availableQuests: Quest[];
startQuest: (questId: EntityId) => void;
abandonQuest: (questId: EntityId) => void;
updateProgress: (questId: EntityId, objectiveId: EntityId, progress: number) => void;
completeObjective: (questId: EntityId, objectiveId: EntityId) => void;
getQuestById: (questId: EntityId) => Quest | undefined;
resetQuest: (questId: EntityId) => void;
addQuest: (quest: Omit<Quest, 'id' | 'createdAt' | 'updatedAt'>) => void;
removeQuest: (questId: EntityId) => void;
}
declare function useQuests(): UseQuestsReturn;
interface QuestCardProps {
quest: Quest;
onStart?: () => void;
onAbandon?: () => void;
showActions?: boolean;
className?: string;
}
declare function QuestCard({ quest, onStart, onAbandon, showActions, className, }: QuestCardProps): react_jsx_runtime.JSX.Element;
interface QuestListProps {
quests: Quest[];
onQuestStart?: (questId: string) => void;
onQuestAbandon?: (questId: string) => void;
showActions?: boolean;
emptyMessage?: string;
className?: string;
}
declare function QuestList({ quests, onQuestStart, onQuestAbandon, showActions, emptyMessage, className, }: QuestListProps): react_jsx_runtime.JSX.Element;
interface QuestStatsProps {
activeCount: number;
completedCount: number;
availableCount: number;
className?: string;
}
declare function QuestStats({ activeCount, completedCount, availableCount, className, }: QuestStatsProps): react_jsx_runtime.JSX.Element;
export { type Quest, QuestCard, type QuestCardProps, type QuestDifficulty, QuestList, type QuestListProps, type QuestObjective, type QuestRecurrence, type QuestReward, QuestStats, type QuestStatsProps, type QuestStatus, type QuestsConfig, type QuestsEvents, QuestsProvider, type QuestsProviderProps, type QuestsService, QuestsServiceImpl, type QuestsState, type UseQuestsReturn, useQuests, useQuestsContext };