Replace useState-based page switching with react-router-dom Routes.
Layout now renders admin or player nav items based on user.role.
Add stub pages for PlayerDashboard, GameLobby, and GameRoom.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Split ItemStudio (1863->388), Settings (1445->355), and Users
(1062->164) into focused sub-components under pages/components/.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace all hardcoded custom ID strings with module-level constants.
Each module now has *_CUSTOM_IDS in its types file, using functions
for dynamic IDs and PREFIX for startsWith matching.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fix web/ -> api/, add missing panel/modules/graphics sections,
expand module and utility listings to match actual codebase.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add routing table mapping custom ID prefixes to handler files and
describe the ComponentInteractionHandler dispatch mechanism.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
One-line JSDoc on 82 methods across 11 service files for quick
scanning without reading full implementations.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Provide non-obvious business rules and constraints for economy,
inventory, quest, moderation, trade, and trivia modules to reduce
context-gathering overhead for AI tools.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace setTimeout race in use-item flow with explicit Back button
- Fix collector end handler to re-render current view instead of blanking
- Add appendUseBackButton helper to attach navigation to use results
- Remove unused isInventoryInteraction import
- Fix rarity test type assertions
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Viewing another user's inventory is read-only — Use and Discard
buttons only render when viewer is the inventory owner, with a
server-side guard in the interaction handler.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds a limit check to assignQuest that reads maxActiveQuests from game
settings and throws a UserError when the user has reached their active
quest limit. Completed quests are excluded from the count.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
These domain events were only connected to dashboard recording but never
called questService.handleEvent(), so quests with triggers TRANSFER_OUT,
DAILY_REWARD, TRIVIA_WIN, and EXAM_REWARD never tracked progress. Added
userId and tx to event payloads and switched from emit to emitAsync for
transaction atomicity.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Discord counts all nested components (buttons inside action rows)
toward the message-level 40 component cap. 7 per page exceeded this
when pagination buttons were included.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The available quests view was exceeding Discord's 40-component container
limit when many quests existed, causing an API error. Paginate both
active and available quest views at 7 quests per page with prev/next
navigation buttons.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Resolve ITEM-type pool entry names from the API when loading an
existing lootbox for editing, so the ItemSearchPicker displays
the selected item instead of showing an empty default.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>