import { Maybe, doesExist } from '@apextoaster/js-utils'; import { Card, CardContent, Typography } from '@mui/material'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem } from '@mui/x-tree-view/TreeItem'; import React from 'react'; import { useStore } from 'zustand'; import { StoreState, store } from './store'; import { Actor, Item, Room } from './models'; export type SetDetails = (entity: Maybe) => void; export type SetPlayer = (actor: Maybe) => void; export interface BaseEntityItemProps { setPlayer: SetPlayer; } export function formatLabel(name: string, active = false): string { if (active) { return `${name} (!)`; } return name; } export function itemStateSelector(s: StoreState) { return { character: s.character, setDetailEntity: s.setDetailEntity, }; } export function worldStateSelector(s: StoreState) { return { world: s.world, setDetailEntity: s.setDetailEntity, }; } export function ItemItem(props: { item: Item } & BaseEntityItemProps) { const { item } = props; const state = useStore(store, itemStateSelector); const { setDetailEntity } = state; return setDetailEntity(item)} /> ; } export function ActorItem(props: { actor: Actor } & BaseEntityItemProps) { const { actor, setPlayer } = props; const state = useStore(store, itemStateSelector); const { character, setDetailEntity } = state; // TODO: include other players const active = doesExist(character) && actor.name === character.name; const label = formatLabel(actor.name, active); let playButton; if (active === false) { playButton = setPlayer(actor)} />; } return {playButton} setDetailEntity(actor)} /> {actor.items.map((item) => )} ; } export function RoomItem(props: { room: Room } & BaseEntityItemProps) { const { room, setPlayer } = props; const state = useStore(store, itemStateSelector); const { character, setDetailEntity } = state; const active = doesExist(character) && room.actors.some((it) => it.name === character.name); const label = formatLabel(room.name, active); return setDetailEntity(room)} /> {room.actors.map((actor) => )} {room.items.map((item) => )} ; } export function WorldPanel(props: BaseEntityItemProps) { const { setPlayer } = props; const state = useStore(store, worldStateSelector); const { world, setDetailEntity } = state; // eslint-disable-next-line no-restricted-syntax if (!doesExist(world)) { return No world data available ; } return {world.name} Theme: {world.theme} setDetailEntity(world)} /> {world.rooms.map((room) => )} ; }