From 3ea67019d23570d70ed15353571be247ca94ee9f Mon Sep 17 00:00:00 2001 From: david raistrick <1108844+keen99@users.noreply.github.com> Date: Wed, 1 Jul 2026 16:05:18 -0400 Subject: [PATCH] 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. --- shared/turn.js | 1 + src/App.js | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/shared/turn.js b/shared/turn.js index d664a01..dcd8206 100644 --- a/shared/turn.js +++ b/shared/turn.js @@ -565,6 +565,7 @@ module.exports = { rollD20, formatInitMod, sortParticipantsByInitiative, + syncTurnOrder, computeTurnOrderAfterRemoval, computeTurnOrderAfterAddition, makeParticipant, diff --git a/src/App.js b/src/App.js index 05488e0..64934f5 100644 --- a/src/App.js +++ b/src/App.js @@ -47,7 +47,7 @@ if (typeof document !== 'undefined') { // ============================================================================ 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 CONDITIONS = [ @@ -967,7 +967,10 @@ function ParticipantManager({ encounter, encounterPath, campaignCharacters }) { try { await storage.updateDoc(encounterPath, { 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); } catch (err) { @@ -990,9 +993,15 @@ function ParticipantManager({ encounter, encounterPath, campaignCharacters }) { p.id === participantId ? { ...p, isActive: newIsActive } : p ); - const turnUpdates = newIsActive - ? computeTurnOrderAfterAddition(encounter, participantId) - : computeTurnOrderAfterRemoval(encounter, participantId, updatedParticipants); + // 1-list: stay in slot, flip isActive only. Sync turnOrderIds. Advance + // current only if deact hits current. + let turnUpdates = {}; + if (encounter.isStarted) { + turnUpdates = syncTurnOrder(updatedParticipants); + if (!newIsActive && encounter.currentTurnParticipantId === participantId) { + turnUpdates = { ...turnUpdates, ...computeTurnOrderAfterRemoval(encounter, participantId, updatedParticipants) }; + } + } try { await storage.updateDoc(encounterPath, { participants: updatedParticipants, ...turnUpdates }); @@ -1061,11 +1070,7 @@ function ParticipantManager({ encounter, encounterPath, campaignCharacters }) { return p; }); - const turnUpdates = (isDead && !wasDead) - ? computeTurnOrderAfterRemoval(encounter, participantId, updatedParticipants) - : wasResurrected - ? computeTurnOrderAfterAddition(encounter, participantId) - : {}; + const turnUpdates = {}; const hpUndoData = { encounterPath,