import clsx from "clsx"; import { useMemo } from "react"; import { AbilityLookup, Action, Attack, CharacterTheme, Constants, DataOriginRefData, Item, ItemPlan, RuleData, Spell, SpellCasterInfo, WeaponSpellDamageGroup, } from "@dndbeyond/character-rules-engine/es"; import { RollContext } from "@dndbeyond/pocket-dimension-dice/types"; import CombatActionAttack from "../CombatAttack/CombatActionAttack"; import CombatItemAttack from "../CombatAttack/CombatItemAttack"; import CombatSpellAttack from "../CombatAttack/CombatSpellAttack"; import styles from "./styles.module.css"; interface AttackTableProps extends React.HTMLAttributes { theme: CharacterTheme; showNotes?: boolean; diceEnabled?: boolean; attacks: Array; weaponSpellDamageGroups: Array; abilityLookup: AbilityLookup; ruleData: RuleData; spellCasterInfo: SpellCasterInfo; onAttackClick?: (attack: Attack) => void; rollContext: RollContext; dataOriginRefData: DataOriginRefData; proficiencyBonus: number; itemPlans: Array; } export const AttackTable = ({ theme, attacks, weaponSpellDamageGroups, ruleData, abilityLookup, spellCasterInfo, onAttackClick, dataOriginRefData, proficiencyBonus, rollContext, showNotes = true, diceEnabled = false, itemPlans, ...props }: AttackTableProps) => { const columnClassNameBase = useMemo( () => [styles.col, theme?.isDarkMode && styles.darkMode], [theme] ); const getColumnClass = (addtionalClass: string) => clsx([...columnClassNameBase, addtionalClass]); const renderedAttacks = useMemo( (): React.ReactNode => !!attacks.length ? ( attacks.map((attack): React.ReactNode => { const commonCombatAttackProps = { key: attack.key, attack, ruleData, abilityLookup, onClick: onAttackClick, showNotes, diceEnabled, theme, rollContext, proficiencyBonus, className: styles.attack, }; switch (attack.type) { case Constants.AttackSourceTypeEnum.ACTION: case Constants.AttackSourceTypeEnum.CUSTOM: return ( ); case Constants.AttackSourceTypeEnum.ITEM: return ( ); case Constants.AttackSourceTypeEnum.SPELL: return ( ); default: return null; } }) ) : (
Equip weapons or add spells to see your attacks here.
), [ attacks, ruleData, abilityLookup, onAttackClick, showNotes, diceEnabled, theme, rollContext, proficiencyBonus, weaponSpellDamageGroups, spellCasterInfo, dataOriginRefData, itemPlans, ] ); return (
Attack
Range
Hit / DC
Damage
{showNotes &&
Notes
}
{renderedAttacks}
); };