New source found from dndbeyond.com

This commit is contained in:
2026-07-08 01:00:09 -07:00
parent 9a983a6d7b
commit dcefa0d2f2
2865 changed files with 222467 additions and 49053 deletions
@@ -0,0 +1,107 @@
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<HTMLAttributes<HTMLDivElement>, "onClick"> {
infusion: Infusion;
onClick?: (infusion: Infusion) => void;
}
export const InfusionPreview: FC<Props> = ({
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<string> = [];
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 (
<div
className={clsx([onClick && styles.isInteractive, className])}
onClick={handleClick}
{...props}
>
<div className={styles.name}>
Infusion: {InfusionUtils.getName(infusion)}
</div>
<div className={styles.snippet}>
{isAccessible ? (
<Snippet
snippetData={snippetData}
classLevel={
InfusionUtils.getSelectedModifierData(infusion)?.value ?? null
}
proficiencyBonus={proficiencyBonus}
>
{InfusionUtils.getSnippet(infusion)}
</Snippet>
) : (
<MarketplaceCta
sourceName={getSourceNames()}
description="To unlock this infusion, check out the Marketplace to view purchase options."
/>
)}
</div>
</div>
);
};