refactor: App.js 3 sites to shared 1-list contract

delete/toggle/hp sites used OLD computeTurnOrderAfterRemoval/Addition
contract (return turnOrderIds). New 1-list contract: helpers return
advance-only + insertAt; list sync via syncTurnOrder at call site.

- delete: syncTurnOrder(updated) + advance-only removal
- toggle: stay-in-slot, flip isActive, sync, advance only if deact==current
- hp: FEAT-1 unchanged (death/revive no turn changes)

shared exports syncTurnOrder. Build green.
This commit is contained in:
david raistrick
2026-07-01 16:05:18 -04:00
parent 7c3ec105d5
commit 3ea67019d2
2 changed files with 16 additions and 10 deletions
+1
View File
@@ -565,6 +565,7 @@ module.exports = {
rollD20, rollD20,
formatInitMod, formatInitMod,
sortParticipantsByInitiative, sortParticipantsByInitiative,
syncTurnOrder,
computeTurnOrderAfterRemoval, computeTurnOrderAfterRemoval,
computeTurnOrderAfterAddition, computeTurnOrderAfterAddition,
makeParticipant, makeParticipant,
+15 -10
View File
@@ -47,7 +47,7 @@ if (typeof document !== 'undefined') {
// ============================================================================ // ============================================================================
const APP_VERSION = 'v0.3'; const APP_VERSION = 'v0.3';
const { DEFAULT_MAX_HP, DEFAULT_INIT_MOD, MONSTER_DEFAULT_INIT_MOD, generateId, rollD20, formatInitMod, sortParticipantsByInitiative, computeTurnOrderAfterRemoval, computeTurnOrderAfterAddition } = shared; const { DEFAULT_MAX_HP, DEFAULT_INIT_MOD, MONSTER_DEFAULT_INIT_MOD, generateId, rollD20, formatInitMod, sortParticipantsByInitiative, syncTurnOrder, computeTurnOrderAfterRemoval } = shared;
const ROLL_DISPLAY_DURATION = 5000; const ROLL_DISPLAY_DURATION = 5000;
const CONDITIONS = [ const CONDITIONS = [
@@ -967,7 +967,10 @@ function ParticipantManager({ encounter, encounterPath, campaignCharacters }) {
try { try {
await storage.updateDoc(encounterPath, { await storage.updateDoc(encounterPath, {
participants: updatedParticipants, participants: updatedParticipants,
...computeTurnOrderAfterRemoval(encounter, itemToDelete.id, updatedParticipants) ...(encounter.isStarted ? {
...syncTurnOrder(updatedParticipants),
...computeTurnOrderAfterRemoval(encounter, itemToDelete.id, updatedParticipants),
} : {}),
}); });
logAction(`${itemToDelete.name} removed from encounter`, { encounterName: encounter.name }, deleteUndoData); logAction(`${itemToDelete.name} removed from encounter`, { encounterName: encounter.name }, deleteUndoData);
} catch (err) { } catch (err) {
@@ -990,9 +993,15 @@ function ParticipantManager({ encounter, encounterPath, campaignCharacters }) {
p.id === participantId ? { ...p, isActive: newIsActive } : p p.id === participantId ? { ...p, isActive: newIsActive } : p
); );
const turnUpdates = newIsActive // 1-list: stay in slot, flip isActive only. Sync turnOrderIds. Advance
? computeTurnOrderAfterAddition(encounter, participantId) // current only if deact hits current.
: computeTurnOrderAfterRemoval(encounter, participantId, updatedParticipants); let turnUpdates = {};
if (encounter.isStarted) {
turnUpdates = syncTurnOrder(updatedParticipants);
if (!newIsActive && encounter.currentTurnParticipantId === participantId) {
turnUpdates = { ...turnUpdates, ...computeTurnOrderAfterRemoval(encounter, participantId, updatedParticipants) };
}
}
try { try {
await storage.updateDoc(encounterPath, { participants: updatedParticipants, ...turnUpdates }); await storage.updateDoc(encounterPath, { participants: updatedParticipants, ...turnUpdates });
@@ -1061,11 +1070,7 @@ function ParticipantManager({ encounter, encounterPath, campaignCharacters }) {
return p; return p;
}); });
const turnUpdates = (isDead && !wasDead) const turnUpdates = {};
? computeTurnOrderAfterRemoval(encounter, participantId, updatedParticipants)
: wasResurrected
? computeTurnOrderAfterAddition(encounter, participantId)
: {};
const hpUndoData = { const hpUndoData = {
encounterPath, encounterPath,