Grabbed dndbeyond's source code

```
~/go/bin/sourcemapper -output ddb -jsurl https://media.dndbeyond.com/character-app/static/js/main.90aa78c5.js
```
This commit is contained in:
2025-05-28 11:50:03 -07:00
commit 8df9031d27
3592 changed files with 319051 additions and 0 deletions
@@ -0,0 +1,242 @@
import React, { useCallback, useContext, useState } from "react";
import {
CharacterTheme,
ContainerManager,
ItemManager,
} from "@dndbeyond/character-rules-engine/es";
import { useSidebar } from "~/contexts/Sidebar";
import { PaneComponentEnum } from "~/subApps/sheet/components/Sidebar/types";
import { ThemeButton } from "../../../Shared/components/common/Button";
import { InventoryManagerContext } from "../../../Shared/managers/InventoryManagerContext";
import { PaneIdentifierUtils } from "../../../Shared/utils";
import InventoryItem from "../../components/InventoryItem";
import { InventoryTableHeader } from "../../components/InventoryTableHeader";
interface Props {
container: ContainerManager;
inventory: Array<ItemManager>;
showNotes?: boolean;
isReadonly: boolean;
theme: CharacterTheme;
showTableHeader?: boolean;
}
interface InventoryActionsProps
extends Pick<Props, "isReadonly" | "container" | "inventory"> {
onContainerClick: (
evt: React.MouseEvent | React.KeyboardEvent,
container: ContainerManager,
showAddItems: boolean
) => void;
showContents: boolean;
onShowContentsClick: (showContents: boolean) => void;
}
const InventoryActions: React.FC<InventoryActionsProps> = ({
isReadonly,
container,
inventory,
onContainerClick,
onShowContentsClick,
showContents,
}) => {
const { inventoryManager } = useContext(InventoryManagerContext);
if (isReadonly) {
return null;
}
const containerName = container.getName();
const classNames: Array<string> = ["ct-inventory__actions"];
if (inventory.length > 0 && showContents) {
classNames.push("ct-inventory__actions--collapsed");
}
return (
<div className={classNames.join(" ")}>
{inventoryManager.canAddToContainer(container.container) ? (
<span
role="button"
className="ct-inventory__action"
onClick={(evt) => onContainerClick(evt, container, true)}
onKeyDown={(evt) => {
if (evt.key === "Enter") {
onContainerClick(evt, container, true);
}
}}
>
{container.isCharacterContainer()
? `+ Add ${containerName}`
: `+ Add items to your ${containerName}`}
</span>
) : (
<span />
)}
{inventory.length > 0 && (
<span
role="button"
className="ct-inventory__action"
onClick={() => onShowContentsClick(!showContents)}
onKeyDown={(evt) => {
if (evt.key === "Enter") {
onShowContentsClick(!showContents);
}
}}
>
{showContents ? "Hide Contents" : "Show Contents"}
</span>
)}
</div>
);
};
const EmptyInventory: React.FC<InventoryActionsProps> = ({
isReadonly,
container,
inventory,
...restProps
}) => {
const {
pane: { paneHistoryStart },
} = useSidebar();
if (isReadonly) {
return (
<div className="ct-inventory__empty">
No equipment has been added for this character.
</div>
);
}
if (container.isCharacterContainer()) {
return (
<div className="ct-inventory__choose">
<div className="ct-inventory__choose-actions">
<div className="ct-inventory__choose-action">
<ThemeButton
block={true}
onClick={() =>
paneHistoryStart(PaneComponentEnum.STARTING_EQUIPMENT)
}
stopPropagation={true}
>
Starting Equipment or Gold
</ThemeButton>
</div>
<div className="ct-inventory__choose-action-sep">or</div>
<div className="ct-inventory__choose-action">
<ThemeButton
block={true}
onClick={() =>
paneHistoryStart(PaneComponentEnum.EQUIPMENT_MANAGE)
}
stopPropagation={true}
>
Add Items
</ThemeButton>
</div>
</div>
</div>
);
}
return (
<InventoryActions
inventory={inventory}
container={container}
isReadonly={isReadonly}
onContainerClick={restProps.onContainerClick}
showContents={restProps.showContents}
onShowContentsClick={restProps.onShowContentsClick}
/>
);
};
const Inventory: React.FC<Props> = ({
container,
inventory,
showNotes = true,
isReadonly,
theme,
showTableHeader = true,
}) => {
const [showContents, setShowContents] = useState(true);
const {
pane: { paneHistoryStart },
} = useSidebar();
const handleContainerShow = useCallback(
(
evt: React.MouseEvent | React.KeyboardEvent,
container: ContainerManager,
showAddItems: boolean
): void => {
evt.nativeEvent.stopImmediatePropagation();
evt.stopPropagation();
paneHistoryStart(
PaneComponentEnum.CONTAINER,
PaneIdentifierUtils.generateContainer(
container.getDefinitionKey(),
showAddItems
)
);
},
[container]
);
const isEmpty: boolean = inventory.length === 0;
return (
<div className="ct-inventory">
{/*<h2 style={visuallyHidden}>Inventory</h2>*/}
{showTableHeader && <InventoryTableHeader showNotes={showNotes} />}
<div className="ct-inventory__items">
{isEmpty ? (
<EmptyInventory
inventory={inventory}
container={container}
isReadonly={isReadonly}
onShowContentsClick={setShowContents}
showContents={showContents}
onContainerClick={handleContainerShow}
/>
) : (
<React.Fragment>
{showContents &&
inventory.map((item) => (
<InventoryItem
key={item.getUniqueKey()}
item={item}
onEquip={item.handleEquip}
onUnequip={item.handleUnequip}
onItemShow={(mappingId) =>
paneHistoryStart(
PaneComponentEnum.ITEM_DETAIL,
PaneIdentifierUtils.generateItem(mappingId)
)
}
showNotes={showNotes}
theme={theme}
isReadonly={isReadonly}
/>
))}
<InventoryActions
inventory={inventory}
container={container}
isReadonly={isReadonly}
onContainerClick={handleContainerShow}
onShowContentsClick={setShowContents}
showContents={showContents}
/>
</React.Fragment>
)}
</div>
</div>
);
};
export default Inventory;
@@ -0,0 +1,4 @@
import Inventory from "./Inventory";
export default Inventory;
export { Inventory };