import clsx from "clsx"; import { FC, HTMLAttributes, MouseEvent } from "react"; import { AccessUtils, CampaignUtils, FormatUtils, Infusion, InfusionUtils, RuleDataUtils, Constants, } from "@dndbeyond/character-rules-engine/es"; import { MarketplaceCta } from "~/components/MarketplaceCta"; import { useCharacterEngine } from "~/hooks/useCharacterEngine"; import Snippet from "../../tools/js/smartComponents/Snippet"; import styles from "./styles.module.css"; interface Props extends Omit, "onClick"> { infusion: Infusion; onClick?: (infusion: Infusion) => void; } export const InfusionPreview: FC = ({ infusion, onClick, className, ...props }) => { const { ruleData, snippetData, proficiencyBonus, partyInfo } = useCharacterEngine(); const itemMappingId = InfusionUtils.getInventoryMappingId(infusion); const partyRestrictions = partyInfo ? CampaignUtils.getPartyInventoryRestrictions(partyInfo) : []; const isInfusedItemInParty = partyRestrictions.some( (restriction) => restriction.type === Constants.PartyRestrictionTypeEnum.INFUSION && restriction.inventoryMappingId === itemMappingId ); const handleClick = (evt: MouseEvent): void => { if (onClick) { evt.stopPropagation(); evt.nativeEvent.stopImmediatePropagation(); onClick(infusion); } }; //if you have access to the infusion via entitlments or the infused item is in the party - you can see the details, othwise show marketplace cta const isAccessible = AccessUtils.isAccessible(InfusionUtils.getAccessType(infusion)) || isInfusedItemInParty; const getSourceNames = (): string | null => { const sources = InfusionUtils.getSources(infusion); let sourceNames: Array = []; if (sources.length > 0) { sources.forEach((source) => { let sourceInfo = RuleDataUtils.getSourceDataInfo( source.sourceId, ruleData ); if (sourceInfo !== null && sourceInfo.description !== null) { sourceNames.push(sourceInfo.description); } }); } return sourceNames.length > 0 ? FormatUtils.renderNonOxfordCommaList(sourceNames) : null; }; return (
Infusion: {InfusionUtils.getName(infusion)}
{isAccessible ? ( {InfusionUtils.getSnippet(infusion)} ) : ( )}
); };