fix(deferred): close frontend UI/UX tails from the hygiene sweep

- player YB2: keepalive pagehide beacon (api.saveProgressBeacon) so the resume
  position isn't lost on F5/close within 5s of the last checkpoint (mirrors Plex).
- player YB4: bound consecutive unplayable items in auto-advance so an
  auto-advancing/loop=all queue can't spin over a run of dead videos.
- downloads B6 (client): localise structured quota/edit errors centrally in
  api.req() via localizeDetail() + Intl.NumberFormat (fixes HU/DE + decimal sep);
  + 3-locale download error strings.
- channels FB1: focusChannelToken bump so re-clicking the same channel re-seeds
  the search box; FB2: syncSubs invalidates feed/feed-count (set can change now).
- config CB2: reseed the ConfigPanel draft on a key-set dataVersion + explicit
  post-save token, so a mid-edit refetch can't clobber an in-progress edit.
- config AB3 (UI): a blank allow_empty field stores "" instead of resetting.
- admin SB2/SC2: confirm + success toast on demo-whitelist remove and deny-invite
  (+ trilingual strings); SC1: disable only the acted-on row (pendingId), not all;
  SB3: pause the 1s scheduler countdown ticker while the tab is hidden.
- messages CT4: only invalidate conversations/unread when the incoming-message
  count actually changed, not on every 20s poll; MB3 (client): react to the live
  unread ping (onUnread → invalidate); MC3: extract e2ee installKey (setup/unlock);
  CC2: hoist POLL_MS to messaging.ts; MB4: document the reload-scoped socket.
This commit is contained in:
npeter83 2026-07-12 05:59:25 +02:00
parent 4e80e2b39b
commit f0198f2e0a
19 changed files with 302 additions and 45 deletions

View file

@ -185,5 +185,17 @@
"added": "Hinzugefügt",
"user": "Nutzer"
},
"clipBadge": "Clip"
"clipBadge": "Clip",
"errors": {
"quota": {
"max_bytes": "Dein Download-Speicherkontingent ist aufgebraucht ({{size}} GB). Gib zuerst Speicher frei.",
"max_jobs": "Du hast dein Download-Limit erreicht ({{limit}} Objekte). Entferne zuerst einige.",
"generic": "Download-Kontingent überschritten."
},
"edit": {
"empty_edit": "Wähle zuerst einen Zuschneidebereich oder Ausschnitt.",
"source_not_ready": "Der Quell-Download ist noch nicht bearbeitbar.",
"generic": "Dieser Schnitt konnte nicht erstellt werden."
}
}
}

View file

@ -124,7 +124,10 @@
"resetTitle": "Demo-Zustand zurücksetzen?",
"resetConfirm": "Dies löscht alles, was das Demo-Konto angesammelt hat — Playlists, ausgeblendete/angesehene/gespeicherte Videos und Einstellungen — und legt ein paar Beispiel-Playlists neu an. Es kann nicht rückgängig gemacht werden.",
"resetDone": "Demo zurückgesetzt — {{count}} Beispiel-Playlist(s) angelegt",
"resetFailed": "Das Demo-Konto konnte nicht zurückgesetzt werden"
"resetFailed": "Das Demo-Konto konnte nicht zurückgesetzt werden",
"removed": "Von der Demo-Whitelist entfernt",
"removeTitle": "Demo-Zugang entfernen?",
"removeConfirm": "{{email}} von der Demo-Whitelist entfernen? Der Zugang zum Demo-Konto ist dann nicht mehr möglich."
},
"invites": {
"title": "Zugriffsanfragen",
@ -141,6 +144,9 @@
"approveHint": "Genehmigen — setzt diese E-Mail auf die Whitelist und benachrichtigt sie per E-Mail, dass sie dabei sind.",
"approve": "Genehmigen",
"denyHint": "Diese Anfrage ablehnen.",
"deny": "Ablehnen"
"deny": "Ablehnen",
"denied": "Anfrage abgelehnt",
"denyTitle": "Zugriffsanfrage ablehnen?",
"denyConfirm": "Die Zugriffsanfrage von {{email}} ablehnen?"
}
}

View file

@ -185,5 +185,17 @@
"added": "Added",
"user": "User"
},
"clipBadge": "Clip"
"clipBadge": "Clip",
"errors": {
"quota": {
"max_bytes": "You've used your download storage quota ({{size}} GB). Free up space first.",
"max_jobs": "You've reached your download limit ({{limit}} items). Remove some first.",
"generic": "Download quota exceeded."
},
"edit": {
"empty_edit": "Choose a trim range or crop area first.",
"source_not_ready": "The source download isn't ready to edit.",
"generic": "That edit couldn't be created."
}
}
}

View file

@ -124,7 +124,10 @@
"resetTitle": "Reset demo state?",
"resetConfirm": "This clears everything the demo account has accumulated — playlists, hidden/watched/saved videos and settings — and re-seeds a few sample playlists. It can't be undone.",
"resetDone": "Demo reset — {{count}} sample playlist(s) seeded",
"resetFailed": "Couldn't reset the demo account"
"resetFailed": "Couldn't reset the demo account",
"removed": "Removed from the demo whitelist",
"removeTitle": "Remove demo access?",
"removeConfirm": "Remove {{email}} from the demo whitelist? They'll no longer be able to enter the demo account."
},
"invites": {
"title": "Access requests",
@ -141,6 +144,9 @@
"approveHint": "Approve — whitelist this email and email them they're in.",
"approve": "Approve",
"denyHint": "Deny this request.",
"deny": "Deny"
"deny": "Deny",
"denied": "Request denied",
"denyTitle": "Deny access request?",
"denyConfirm": "Deny the access request from {{email}}?"
}
}

View file

@ -185,5 +185,17 @@
"added": "Hozzáadva",
"user": "Felhasználó"
},
"clipBadge": "Klip"
"clipBadge": "Klip",
"errors": {
"quota": {
"max_bytes": "Elfogyott a letöltési tárhelykereted ({{size}} GB). Előbb szabadíts fel helyet.",
"max_jobs": "Elérted a letöltési korlátodat ({{limit}} elem). Előbb távolíts el néhányat.",
"generic": "Túllépted a letöltési kvótát."
},
"edit": {
"empty_edit": "Előbb válassz vágási tartományt vagy körbevágási területet.",
"source_not_ready": "A forrásletöltés még nem szerkeszthető.",
"generic": "Ezt a vágást nem sikerült létrehozni."
}
}
}

View file

@ -124,7 +124,10 @@
"resetTitle": "Visszaállítod a demo állapotot?",
"resetConfirm": "Ez törli mindazt, amit a demo fiók összegyűjtött — lejátszási listák, elrejtett/megnézett/mentett videók és beállítások —, és újra létrehoz pár minta lejátszási listát. Nem vonható vissza.",
"resetDone": "Demo visszaállítva — {{count}} minta lejátszási lista létrehozva",
"resetFailed": "Nem sikerült visszaállítani a demo fiókot"
"resetFailed": "Nem sikerült visszaállítani a demo fiókot",
"removed": "Eltávolítva a demo fehérlistáról",
"removeTitle": "Visszavonod a demo hozzáférést?",
"removeConfirm": "Eltávolítod {{email}} címet a demo fehérlistáról? Többé nem tud belépni a demo fiókba."
},
"invites": {
"title": "Hozzáférési kérelmek",
@ -141,6 +144,9 @@
"approveHint": "Jóváhagyás — fehérlistára teszi ezt az e-mailt és e-mailben értesíti őket, hogy bekerültek.",
"approve": "Jóváhagyás",
"denyHint": "Kérelem elutasítása.",
"deny": "Elutasítás"
"deny": "Elutasítás",
"denied": "Kérelem elutasítva",
"denyTitle": "Elutasítod a hozzáférési kérelmet?",
"denyConfirm": "Elutasítod {{email}} hozzáférési kérelmét?"
}
}