import React from "react"; import { connect, DispatchProp } from "react-redux"; import { Tooltip } from "@dndbeyond/character-common-components/es"; import { LightBuilderSvg, ThemedShareSvg, ThemedLongRestSvg, ThemedShortRestSvg, } from "@dndbeyond/character-components/es"; import { characterActions, CampaignDataContract, CharacterPreferences, characterSelectors, CharacterStatusSlug, CharacterTheme, Constants, HitPointInfo, Item, ItemUtils, RuleData, rulesEngineSelectors, } from "@dndbeyond/character-rules-engine/es"; import { Link } from "~/components/Link"; import { useSidebar } from "~/contexts/Sidebar"; import { PaneInfo } from "~/contexts/Sidebar/Sidebar"; import { PaneComponentEnum } from "~/subApps/sheet/components/Sidebar/types"; import { appEnvSelectors } from "../../../Shared/selectors"; import StatusSummaryMobile from "../../components/StatusSummaryMobile"; import WatchTourDialog from "../../components/WatchTourDialog"; import { sheetAppSelectors } from "../../selectors"; import { SheetAppState } from "../../typings"; import { CharacterHeaderInfo } from "../CharacterHeaderInfo"; interface Props extends DispatchProp { hitPointInfo: HitPointInfo; fails: number; successes: number; deathCause: Constants.DeathCauseEnum; inspiration: boolean; campaign: CampaignDataContract | null; builderUrl: string; items: Array; preferences: CharacterPreferences; ruleData: RuleData; isReadonly: boolean; theme: CharacterTheme; status: CharacterStatusSlug | null; paneHistoryStart: PaneInfo["paneHistoryStart"]; } class CharacterHeaderTablet extends React.PureComponent { handleCampaignShow = (): void => { const { paneHistoryStart } = this.props; paneHistoryStart(PaneComponentEnum.CAMPAIGN); }; handleShortResetClick = (evt: React.MouseEvent): void => { const { paneHistoryStart } = this.props; evt.stopPropagation(); evt.nativeEvent.stopImmediatePropagation(); paneHistoryStart(PaneComponentEnum.SHORT_REST); }; handleGameLogClick = (evt: React.MouseEvent): void => { const { paneHistoryStart } = this.props; evt.stopPropagation(); evt.nativeEvent.stopImmediatePropagation(); paneHistoryStart(PaneComponentEnum.GAME_LOG); }; handleLongResetClick = (evt: React.MouseEvent): void => { const { paneHistoryStart } = this.props; evt.stopPropagation(); evt.nativeEvent.stopImmediatePropagation(); paneHistoryStart(PaneComponentEnum.LONG_REST); }; handleShareClick = (evt: React.MouseEvent): void => { const { paneHistoryStart } = this.props; evt.stopPropagation(); evt.nativeEvent.stopImmediatePropagation(); paneHistoryStart(PaneComponentEnum.SHARE_URL); }; handleHealthSummaryClick = (): void => { const { paneHistoryStart, isReadonly } = this.props; if (!isReadonly) { paneHistoryStart(PaneComponentEnum.HEALTH_MANAGE); } }; handleInspirationClick = (): void => { const { inspiration, dispatch } = this.props; dispatch(characterActions.inspirationSet(!inspiration)); }; hasMagicItem = (): boolean => { const { items } = this.props; return !!items.find((item) => ItemUtils.isMagic(item)); }; renderSideContent = (): React.ReactNode => { const { hitPointInfo, fails, successes, deathCause, inspiration, builderUrl, preferences, isReadonly, ruleData, theme, status, } = this.props; if (isReadonly) { if (status === CharacterStatusSlug.PREMADE) { return (
); } return (
); } return ( {preferences !== null && preferences.privacyType === Constants.PreferencePrivacyTypeEnum.PUBLIC && (
Share
)}
Short Rest
Long Rest
); }; render() { return (
{this.renderSideContent()}
); } } function mapStateToProps(state: SheetAppState) { return { hitPointInfo: rulesEngineSelectors.getHitPointInfo(state), fails: rulesEngineSelectors.getDeathSavesFailCount(state), successes: rulesEngineSelectors.getDeathSavesSuccessCount(state), inspiration: rulesEngineSelectors.getInspiration(state), builderUrl: sheetAppSelectors.getBuilderUrl(state), campaign: rulesEngineSelectors.getCampaign(state), items: rulesEngineSelectors.getInventory(state), preferences: rulesEngineSelectors.getCharacterPreferences(state), isReadonly: appEnvSelectors.getIsReadonly(state), ruleData: rulesEngineSelectors.getRuleData(state), deathCause: rulesEngineSelectors.getDeathCause(state), theme: rulesEngineSelectors.getCharacterTheme(state), status: characterSelectors.getStatusSlug(state), }; } const CharacterHeaderTabletContainer = (props) => { const { pane: { paneHistoryStart }, } = useSidebar(); return ( ); }; export default connect(mapStateToProps)(CharacterHeaderTabletContainer);