Show toast and open source panel when rolling initiative without loaded source

When a user clicks the d20 to roll initiative for a single combatant whose
bestiary source isn't cached, show an informative toast and open the stat
block panel so they can load the source directly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Lukas
2026-03-17 12:11:20 +01:00
parent f024562a7d
commit 827a3978e9

View File

@@ -117,6 +117,7 @@ export function App() {
const sidePanel = useSidePanelState();
const [rollSkippedCount, setRollSkippedCount] = useState(0);
const [rollSingleSkipped, setRollSingleSkipped] = useState(false);
const selectedCreature: Creature | null = sidePanel.selectedCreatureId
? (getCreature(sidePanel.selectedCreatureId) ?? null)
@@ -145,9 +146,21 @@ export function App() {
const handleRollInitiative = useCallback(
(id: CombatantId) => {
rollInitiativeUseCase(makeStore(), id, rollDice(), getCreature);
const result = rollInitiativeUseCase(
makeStore(),
id,
rollDice(),
getCreature,
);
if (isDomainError(result)) {
setRollSingleSkipped(true);
const combatant = encounter.combatants.find((c) => c.id === id);
if (combatant?.creatureId) {
sidePanel.showCreature(combatant.creatureId);
}
}
},
[makeStore, getCreature],
[makeStore, getCreature, encounter.combatants, sidePanel.showCreature],
);
const handleRollAllInitiative = useCallback(() => {
@@ -363,6 +376,14 @@ export function App() {
/>
)}
{!!rollSingleSkipped && (
<Toast
message="Can't roll — bestiary source not loaded"
onDismiss={() => setRollSingleSkipped(false)}
autoDismissMs={4000}
/>
)}
<PlayerCharacterSection
ref={playerCharacterRef}
characters={playerCharacters}