import { AbilityLookup, Action, Attack, CharacterTheme, Constants, DataOriginRefData, Item, RuleData, Spell, SpellCasterInfo, WeaponSpellDamageGroup, } from "@dndbeyond/character-rules-engine/es"; import { IRollContext } from "@dndbeyond/dice"; import CombatActionAttack from "../CombatAttack/CombatActionAttack"; import CombatItemAttack from "../CombatAttack/CombatItemAttack"; import CombatSpellAttack from "../CombatAttack/CombatSpellAttack"; import { useMemo } from "react"; import clsx from "clsx"; 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: IRollContext; dataOriginRefData: DataOriginRefData; proficiencyBonus: number; }; export const AttackTable = ({ theme, attacks, weaponSpellDamageGroups, ruleData, abilityLookup, spellCasterInfo, onAttackClick, dataOriginRefData, proficiencyBonus, rollContext, showNotes = true, diceEnabled = false, ...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 ] ); return (
Attack
Range
Hit / DC
Damage
{showNotes && (
Notes
)}
{renderedAttacks}
); };