nitro-v36-with-renderer-v36
/
src /
components /
inventory /
views /
furniture /
InventoryFurnitureItemView.tsx
InventoryFurnitureItemView.tsx 3.7 Ko
Télécharger le fichier
import { MouseEventType } from '@octane/renderer';
import { FC, MouseEvent, useState } from 'react';
import { attemptItemPlacement, getWiredChestOverlayColor, GroupItem } from '../../../../api';
import { LayoutLimitedEditionStyledNumberView } from '../../../../common';
import { classNames, InfiniteGrid } from '../../../../layout';
import { NativeTextTree } from '../../../../common/native-text/NativeTextTree';
export const InventoryFurnitureItemView: FC<{
groupItem: GroupItem;
isActive: boolean;
onSelect: (groupItem: GroupItem) => void;
}> = (props) => {
const { groupItem = null, isActive = false, onSelect = null } = props;
const [isMouseDown, setMouseDown] = useState(false);
const onMouseEvent = (event: MouseEvent) => {
switch (event.type) {
case MouseEventType.MOUSE_DOWN:
onSelect?.(groupItem);
setMouseDown(true);
return;
case MouseEventType.MOUSE_UP:
setMouseDown(false);
return;
case MouseEventType.ROLL_OUT:
if (!isMouseDown || !isActive) return;
attemptItemPlacement(groupItem);
return;
case 'dblclick':
attemptItemPlacement(groupItem);
return;
}
};
const count = groupItem.getUnlockedCount();
// AIR GroupItem.updateItemImageVisual: a chest tile shows its contents count on a gold (coins) or brown (furni) plaque.
// AIR GroupItem.updateItemImageVisual: a unique number wins, then a rarity plaque, then the chest plaque.
const rarityLevel = groupItem.stuffData.uniqueNumber > 0 ? -1 : (groupItem.stuffData.rarityLevel ?? -1);
const chestColor = rarityLevel >= 0 ? null : getWiredChestOverlayColor(groupItem.category, groupItem.stuffData);
return (
<NativeTextTree>
<InfiniteGrid.Item
className={classNames('octane-inventory-thumb', isActive && 'is-selected', groupItem.hasUnseenItems && 'is-unseen', !count && 'opacity-50')}
itemActive={isActive}
itemCount={count}
itemImage={groupItem.stuffData.uniqueNumber > 0 ? groupItem.iconUrl : undefined}
itemUniqueNumber={groupItem.stuffData.uniqueNumber}
itemUnseen={groupItem.hasUnseenItems}
onDoubleClick={onMouseEvent}
onMouseDown={onMouseEvent}
onMouseOut={onMouseEvent}
onMouseUp={onMouseEvent}
>
{chestColor && <div aria-hidden className={`octane-inventory-thumb-chest-background is-${ chestColor }`} />}
{groupItem.stuffData.uniqueNumber <= 0 && (
<div className="octane-inventory-thumb-image">
{groupItem.iconUrl && <img src={groupItem.iconUrl} alt="" draggable={false} />}
</div>
)}
{rarityLevel >= 0 && (
<div aria-hidden className="octane-inventory-thumb-rarity">
<div className="octane-inventory-thumb-rarity-count">
<LayoutLimitedEditionStyledNumberView value={rarityLevel} />
</div>
</div>
)}
{chestColor && (
<div aria-hidden className={`octane-inventory-thumb-chest is-${ chestColor }`}>
<div className="octane-inventory-thumb-chest-count">
<LayoutLimitedEditionStyledNumberView value={Math.max(0, groupItem.stuffData.contentsCount ?? 0)} />
</div>
</div>
)}
</InfiniteGrid.Item>
</NativeTextTree>
);
};
