mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-22 07:15:47 +00:00
fix(orbit): pending counter ignored merged/declined items
The "X / Y pending" counter in the queue head and the guest-side gate-check both used `state.queue.filter(non-host).length`, which is the *history* count — items the host has already approved or declined still sit in `state.queue` for attribution lookup, so the counter never decreased. Reported as "3 / 4 pending" with no actual rows in the approval list. The merged / declined sets only exist in the host's local store, so the guest can't filter them out itself. Solution: the host writes an authoritative `pendingApprovalCount` into the state blob each tick; guests (and the host's own UI) read it directly, with a fallback to the old over-counting behaviour for any older client that doesn't write the field. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -37,13 +37,13 @@ export default function OrbitQueueHead({ state }: Props) {
|
||||
const showPresence = role === 'guest' && state.positionAt > 0;
|
||||
const hostAway = showPresence && (nowMs - state.positionAt) > HOST_AWAY_THRESHOLD_MS;
|
||||
const cap = state.settings?.maxPending ?? 0;
|
||||
// Approximate visible-pending count — same heuristic as evaluateOrbitSuggestGate.
|
||||
// Conservative for guests (over-counts declined entries) but the host's
|
||||
// own queue view sees the exact number because it has the merged/declined
|
||||
// sets locally; we don't bother surfacing the exact count here either way
|
||||
// since guests just need to know if they're near the cap.
|
||||
// Authoritative count comes from the host's own tick (state.pendingApprovalCount).
|
||||
// Older clients that predate that field fall back to the raw queue length
|
||||
// — that one over-counts because merged/declined items stay in state.queue
|
||||
// as history, but it's the best a non-host client can do.
|
||||
const pendingCount = cap > 0
|
||||
? state.queue.filter(q => q.addedBy !== state.host).length
|
||||
? (state.pendingApprovalCount
|
||||
?? state.queue.filter(q => q.addedBy !== state.host).length)
|
||||
: 0;
|
||||
|
||||
return (
|
||||
|
||||
Reference in New Issue
Block a user