import type { ItemStack } from 'deepslate-1.20.4/core' import { Identifier } from 'deepslate-1.20.4/core' import { useEffect, useRef, useState } from 'preact/hooks' import { useVersion } from '../contexts/Version.jsx' import { useAsync } from '../hooks/useAsync.js' import { fetchRegistries } from '../services/index.js' import { renderItem } from '../services/Resources1204.js' import { ItemTooltip1204 } from './ItemTooltip1204.jsx' import { Octicon } from './Octicon.jsx' import { itemHasGlint } from './previews/LootTable1204.js' interface Props { item: ItemStack, slotDecoration?: boolean, tooltip?: boolean, advancedTooltip?: boolean, } export function ItemDisplay1204({ item, slotDecoration, tooltip, advancedTooltip }: Props) { const el = useRef(null) const [tooltipOffset, setTooltipOffset] = useState<[number, number]>([0, 0]) const [tooltipSwap, setTooltipSwap] = useState(false) useEffect(() => { const onMove = (e: MouseEvent) => { requestAnimationFrame(() => { const { right, width } = el.current!.getBoundingClientRect() const swap = right + 200 > document.body.clientWidth setTooltipSwap(swap) setTooltipOffset([(swap ? width - e.offsetX : e.offsetX) + 20, e.offsetY - 40]) }) } el.current?.addEventListener('mousemove', onMove) return () => el.current?.removeEventListener('mousemove', onMove) }, []) const maxDamage = item.getItem().durability return
{item.count !== 1 && <> {item.count} {item.count} } {slotDecoration && <> {(maxDamage && item.tag.getNumber('Damage') > 0) && }
} {tooltip !== false &&
}
} function ItemItself({ item }: Props) { const { version } = useVersion() const hasGlint = itemHasGlint(item) if (item.id.namespace !== Identifier.DEFAULT_NAMESPACE) { return Octicon.package } const { value: allModels, loading: loadingModels } = useAsync(async () => { const registries = await fetchRegistries(version) return registries.get('model') }, [version]) if (loadingModels || allModels === undefined) { return null } const modelPath = `item/${item.id.path}` if (allModels && allModels.includes('minecraft:' + modelPath)) { return } return Octicon.package } function RenderedItem({ item, hasGlint }: Props & { hasGlint: boolean }) { const { version } = useVersion() const { value: src } = useAsync(() => renderItem(version, item), [version, item]) if (src) { return <> {item.id.toString()} {hasGlint &&
} } return
{Octicon.package}
}