import { visuallyHidden } from "@mui/utils"; import React, { useContext } from "react"; import { connect, DispatchProp } from "react-redux"; import { rulesEngineSelectors, CharacterTheme, ExtrasFilterData, ExtraGroupInfo, Constants, ExtrasManager, ExtraManager, } from "@dndbeyond/character-rules-engine/es"; import { TabFilter } from "~/components/TabFilter"; import { useSidebar } from "~/contexts/Sidebar"; import { PaneInfo } from "~/contexts/Sidebar/Sidebar"; import { useExtras } from "~/hooks/useExtras"; import { PaneComponentEnum } from "~/subApps/sheet/components/Sidebar/types"; import ExtraList from "../../../Shared/components/ExtraList"; import { ThemeButton } from "../../../Shared/components/common/Button"; import { ExtrasManagerContext } from "../../../Shared/managers/ExtrasManagerContext"; import { appEnvSelectors } from "../../../Shared/selectors"; import { PaneIdentifierUtils } from "../../../Shared/utils"; import ContentGroup from "../../components/ContentGroup"; import ExtrasFilter from "../../components/ExtrasFilter"; import { SheetAppState } from "../../typings"; interface Props extends DispatchProp { extras: Array; extrasManager: ExtrasManager; isReadonly: boolean; showNotes: boolean; theme: CharacterTheme; paneHistoryStart: PaneInfo["paneHistoryStart"]; } interface State { filterData: ExtrasFilterData; } class Extras extends React.PureComponent { static defaultProps = { isReadonly: false, showNotes: true, }; constructor(props: Props) { super(props); this.state = { filterData: { filteredExtras: [], showAdvancedFilters: false, isFiltering: false, filterCount: 0, }, }; } handleFilterUpdate = (filterData: ExtrasFilterData): void => { this.setState({ filterData, }); }; handleManageClick = (): void => { const { paneHistoryStart } = this.props; paneHistoryStart(PaneComponentEnum.EXTRA_MANAGE); }; handleExtraShow = (extra: ExtraManager): void => { const { paneHistoryStart } = this.props; if (extra.isCreature()) { paneHistoryStart( PaneComponentEnum.CREATURE, PaneIdentifierUtils.generateCreature(extra.getMappingId()) ); } else if (extra.isVehicle()) { paneHistoryStart( PaneComponentEnum.VEHICLE, PaneIdentifierUtils.generateVehicle(extra.getMappingId()) ); } }; handleExtraStatusChange = (extra: ExtraManager, isActive: boolean): void => { extra.handleSetActive({ isActive }); }; renderManageButton = (): React.ReactNode => { const { isReadonly } = this.props; if (isReadonly) { return null; } return ( Manage Extras ); }; renderDefault = (): React.ReactNode => { return (
Extras that you add will display here.
); }; renderNoResults = (): React.ReactNode => { return (
No Extras Match the Current Filter
); }; renderContent = (): React.ReactNode => { const { filterData } = this.state; const { extras, extrasManager, showNotes, isReadonly, theme } = this.props; if (!extras.length) { return this.renderDefault(); } if (filterData.showAdvancedFilters) { return null; } if (!filterData.filteredExtras.length) { return this.renderNoResults(); } let groups = extrasManager.getExtrasGroups(filterData.filteredExtras); const orderedGroupInfos = extrasManager.getGroupInfosForExtras( filterData.filteredExtras ); let primaryGroups: Array = []; let otherGroups: Array = []; let vehicleGroups: Array = []; orderedGroupInfos.forEach((groupInfo) => { if (groupInfo) { if (groupInfo.isPrimary) { primaryGroups.push(groupInfo); } else if (groupInfo.id === Constants.ExtraGroupTypeEnum.VEHICLE) { vehicleGroups.push(groupInfo); } else { otherGroups.push(groupInfo); } } }); return (
({ label: groupInfo.name || "", content: ( ), })), ...(otherGroups.length > 0 ? [ { label: "Other", content: otherGroups.map((groupInfo) => ( )), }, ] : []), ...(vehicleGroups.length > 0 ? [ { label: "Vehicle", content: vehicleGroups.map((groupInfo) => ( )), }, ] : []), ]} />
); }; render() { const { extras, theme } = this.props; return (

Extras

{this.renderContent()}
); } } function mapStateToProps(state: SheetAppState) { return { isReadonly: appEnvSelectors.getIsReadonly(state), theme: rulesEngineSelectors.getCharacterTheme(state), }; } function ExtrasContainer(props) { const { extrasManager } = useContext(ExtrasManagerContext); const extras = useExtras(); const { pane: { paneHistoryStart }, } = useSidebar(); return ( ); } export default connect(mapStateToProps)(ExtrasContainer);