Implement the 002-add-combatant feature that adds the possibility to add new combatants to an encounter

This commit is contained in:
Lukas
2026-03-03 23:11:07 +01:00
parent 187f98fc52
commit 0de68100c8
15 changed files with 914 additions and 16 deletions

View File

@@ -1,5 +1,8 @@
import type { EncounterStore } from "@initiative/application";
import { advanceTurnUseCase } from "@initiative/application";
import {
addCombatantUseCase,
advanceTurnUseCase,
} from "@initiative/application";
import type { DomainEvent, Encounter } from "@initiative/domain";
import {
combatantId,
@@ -28,20 +31,38 @@ export function useEncounter() {
const encounterRef = useRef(encounter);
encounterRef.current = encounter;
const advanceTurn = useCallback(() => {
const store: EncounterStore = {
const makeStore = useCallback((): EncounterStore => {
return {
get: () => encounterRef.current,
save: (e) => setEncounter(e),
};
}, []);
const result = advanceTurnUseCase(store);
const advanceTurn = useCallback(() => {
const result = advanceTurnUseCase(makeStore());
if (isDomainError(result)) {
return;
}
setEvents((prev) => [...prev, ...result]);
}, []);
}, [makeStore]);
return { encounter, events, advanceTurn } as const;
const nextId = useRef(0);
const addCombatant = useCallback(
(name: string) => {
const id = combatantId(`c-${++nextId.current}`);
const result = addCombatantUseCase(makeStore(), id, name);
if (isDomainError(result)) {
return;
}
setEvents((prev) => [...prev, ...result]);
},
[makeStore],
);
return { encounter, events, advanceTurn, addCombatant } as const;
}