import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem } from '@mui/x-tree-view/TreeItem'; import { Card, CardContent, CardHeader, Stack, Typography } from '@mui/material'; import { Maybe, doesExist } from '@apextoaster/js-utils'; import React from 'react'; export interface Item { name: string; description: string; } export interface Actor { name: string; backstory: string; description: string; items: Array; } export interface Room { name: string; description: string; portals: Record; actors: Array; items: Array; } export interface World { name: string; order: Array; rooms: Array; theme: string; } export type SetDetails = (entity: Maybe) => void; export type SetPlayer = (actor: Maybe) => void; export interface BaseEntityItemProps { activeCharacter: Maybe; setDetails: SetDetails; setPlayer: SetPlayer; } export function formatLabel(name: string, active = false): string { if (active) { return `${name} (!)`; } return name; } export function ItemItem(props: { item: Item } & BaseEntityItemProps) { const { item, setDetails } = props; return setDetails(item)} /> ; } export function ActorItem(props: { actor: Actor } & BaseEntityItemProps) { const { actor, activeCharacter, setDetails, setPlayer } = props; const active = doesExist(activeCharacter) && actor === activeCharacter; const label = formatLabel(actor.name, active); let playButton; if (active === false) { playButton = setPlayer(actor)} />; } return {playButton} setDetails(actor)} /> {actor.items.map((item) => )} ; } export function RoomItem(props: { room: Room } & BaseEntityItemProps) { const { room, activeCharacter, setDetails, setPlayer } = props; const active = doesExist(activeCharacter) && room.actors.some((it) => it === activeCharacter); const label = formatLabel(room.name, active); return setDetails(room)} /> {room.actors.map((actor) => )} {room.items.map((item) => )} ; } export function WorldPanel(props: { world: Maybe } & BaseEntityItemProps) { const { world, activeCharacter, setDetails, setPlayer } = props; // eslint-disable-next-line no-restricted-syntax if (!doesExist(world)) { return No world data available ; } return {world.name} Theme: {world.theme} {world.rooms.map((room) => )} ; }