import GameAccounts from '../../components/GameAccounts.jsx' import VendorSales from '../../components/VendorSales.jsx' import { useAsync } from '../../lib/useAsync.js' import { api } from '../../api/client.js' // The logged-in player's characters. Shows the link prompt when no game account // is linked, otherwise their characters grouped by account (shared component), // plus their own home status and recent vendor sales. const DECAY_TONE = { LikeNew: '#7fd0a4', Ageless: '#7fd0a4', Slightly: '#a9cf8a', Somewhat: '#d7c56a', Fairly: '#e0a95f', Greatly: '#d9736f', IDOC: '#e05a5a', Collapsed: '#8c96a5', } // The caller's own houses (home status). Only their own โ€” never anyone else's. function MyHouses() { const { data } = useAsync(() => api.player.shard.houses(), []) if (!data || data.length === 0) return null return (
My houses
{data.map((h) => { const label = h.isIdoc ? 'IDOC' : (h.decay || h.stage) const tone = h.isIdoc ? '#e05a5a' : (DECAY_TONE[label] || 'var(--muted)') return (
{h.name || 'An unnamed house'}
{h.region || h.map || 'โ€”'}{h.x != null ? ` ยท ${h.x}, ${h.y}` : ''}
{label && ( {label} )}
) })}

Keep an eye on the decay status โ€” refresh a house in game before it reaches IDOC.

) } export default function PlayerCharacters() { return (
`/player/char/${serial}`} />
) }