revert(orbit): drop maxPending cap feature, keep suggestion mute

The pending counter desynced from the actual approval list (state.queue
holds approved items as history, so the count never decreased after a
host approve). The host-pushed pendingApprovalCount workaround didn't
hold up under live testing either, so we're rolling the whole cap
feature back rather than ship something flaky.

What's gone:
- OrbitSettings.maxPending + state.pendingApprovalCount
- cap branch in applyOutboxSnapshotsToState (now back to mute-only)
- maxPending number input in settings popover
- pending counter chip in OrbitQueueHead
- 'cap-reached' branch in evaluateOrbitSuggestGate / OrbitSuggestGateReason
- cap-related toasts in ContextMenu / useOrbitSongRowBehavior
- cap-related i18n keys (suggestBlockedCap, settingMaxPending*, pendingCounter*)
- cap CSS (.orbit-queue-head__pending, .orbit-settings-pop__number)

What stays: per-guest suggestion mute (works correctly) and everything
that fed into both features (OrbitState.suggestionBlocked,
setOrbitSuggestionBlocked, evaluateOrbitSuggestGate, the participants
popover Mic/MicOff toggle, the suggestBlockedMuted toast).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Psychotoxical
2026-04-25 01:40:22 +02:00
parent 7c379c2111
commit e4cc54a1b5
16 changed files with 14 additions and 224 deletions
+1 -19
View File
@@ -87,12 +87,7 @@ export function useOrbitHost(): void {
let afterSweep = base;
try {
const snaps = await sweepGuestOutboxes(base.sid, base.host);
// Hand the cap-check the host's local merged/declined sets so it can
// tell which `state.queue` items are still actually awaiting approval.
afterSweep = applyOutboxSnapshotsToState(base, snaps, Date.now(), {
mergedKeys: new Set(store.mergedSuggestionKeys),
declinedKeys: new Set(store.declinedSuggestionKeys),
});
afterSweep = applyOutboxSnapshotsToState(base, snaps);
} catch { /* best-effort; keep old participants and queue */ }
// 2) Merge newly-suggested items into the host's local play queue so
@@ -130,24 +125,11 @@ export function useOrbitHost(): void {
trackId: t.id,
addedBy: suggesterByTrack.get(t.id) ?? base.host,
}));
// Authoritative pending count — same predicate the approval list uses
// (state.queue minus host-authored, minus merged, minus declined). We
// recompute fresh each tick from the *current* store sets so an approve
// / decline that happened mid-sweep is reflected on the very next push.
const mergedNow = new Set(useOrbitStore.getState().mergedSuggestionKeys);
const declinedNow = new Set(useOrbitStore.getState().declinedSuggestionKeys);
const pendingApprovalCount = afterShuffle.queue.filter(q =>
q.addedBy !== afterShuffle.host
&& !mergedNow.has(suggestionKey(q))
&& !declinedNow.has(suggestionKey(q))
).length;
const next: OrbitState = {
...afterShuffle,
...snapshotPlayerPatch(base.host),
playQueue,
playQueueTotal: upcoming.length,
pendingApprovalCount,
};
// 5) Commit locally + push remote.