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 { Character, Item, Portal, Room } from './models'; export type SetDetails = (entity: Maybe) => void; export type SetPlayer = (character: 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 { playerCharacter: s.playerCharacter, setDetailEntity: s.setDetailEntity, }; } export function characterStateSelector(s: StoreState) { return { playerCharacter: s.playerCharacter, players: s.players, setDetailEntity: s.setDetailEntity, }; } export function worldStateSelector(s: StoreState) { return { world: s.world, setDetailEntity: s.setDetailEntity, }; } export function PortalItem(props: { portal: Portal } & BaseEntityItemProps) { const { portal } = props; const state = useStore(store, itemStateSelector); const { setDetailEntity } = state; return setDetailEntity(portal)} /> ; } export function ItemItem(props: { item: Item } & BaseEntityItemProps) { const { item } = props; const state = useStore(store, itemStateSelector); const { setDetailEntity } = state; return setDetailEntity(item)} /> ; } export function CharacterItem(props: { character: Character } & BaseEntityItemProps) { const { character, setPlayer } = props; const state = useStore(store, characterStateSelector); const { playerCharacter, players, setDetailEntity } = state; const activeSelf = doesExist(playerCharacter) && character.name === playerCharacter.name; const activeOther = Object.values(players).some((it) => it === character.name); // TODO: are these the keys or the values? const label = formatLabel(character.name, activeSelf); let playButton; if (activeSelf) { playButton = setPlayer(undefined)} />; } else { if (activeOther) { // eslint-disable-next-line no-restricted-syntax const player = Object.entries(players).find((it) => it[1] === character.name)?.[0]; playButton = ; } else { playButton = setPlayer(character)} />; } } return {playButton} setDetailEntity(character)} /> {character.items.map((item) => )} ; } export function RoomItem(props: { room: Room } & BaseEntityItemProps) { const { room, setPlayer } = props; const state = useStore(store, itemStateSelector); const { playerCharacter, setDetailEntity } = state; const active = doesExist(playerCharacter) && room.characters.some((it) => it.name === playerCharacter.name); const label = formatLabel(room.name, active); return setDetailEntity(room)} /> {room.characters.map((character) => )} {room.items.map((item) => )} {room.portals.map((portal) => )} ; } 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) => )} ; }