Memento-based undo/redo with full encounter snapshots. Undo stack capped at 50 entries, persisted to localStorage. Triggered via buttons in the top bar (inboard of turn navigation) and keyboard shortcuts (Ctrl+Z / Ctrl+Shift+Z, Cmd on Mac, case-insensitive key matching). Clear encounter resets both stacks. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
24 lines
830 B
TypeScript
24 lines
830 B
TypeScript
import { createContext, type ReactNode, useContext } from "react";
|
|
import { useEncounter } from "../hooks/use-encounter.js";
|
|
import { useUndoRedoShortcuts } from "../hooks/use-undo-redo-shortcuts.js";
|
|
|
|
type EncounterContextValue = ReturnType<typeof useEncounter>;
|
|
|
|
const EncounterContext = createContext<EncounterContextValue | null>(null);
|
|
|
|
export function EncounterProvider({ children }: { children: ReactNode }) {
|
|
const value = useEncounter();
|
|
useUndoRedoShortcuts(value.undo, value.redo, value.canUndo, value.canRedo);
|
|
return (
|
|
<EncounterContext.Provider value={value}>
|
|
{children}
|
|
</EncounterContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function useEncounterContext(): EncounterContextValue {
|
|
const ctx = useContext(EncounterContext);
|
|
if (!ctx) throw new Error("useEncounterContext requires EncounterProvider");
|
|
return ctx;
|
|
}
|