4.9 KiB
Moderation action flow (end-to-end)
This document describes how moderation data flows from Nostr reports and block lists into local state and UI updates. It complements the broader guidance in docs/moderation/README.md.
Core services and responsibilities
js/services/moderationService.js
moderationService aggregates report events, contact lists, and trusted mute lists, then emits summarized moderation data for the rest of the application to consume.
- Contacts + trusted reporters: When contacts are rebuilt, the service emits a
contactsevent and recomputes every moderation summary. This ensures trusted reports stay in sync as the viewer’s social graph changes.【F:js/services/moderationService.js†L520-L569】 - Report summaries: For each event, the service recomputes a summary of total vs. trusted reports, stores it, and emits a
summaryevent with the updated data.【F:js/services/moderationService.js†L1869-L1998】 - Threshold transitions: The service logs when trusted report counts cross the autoplay/block or blur thresholds. These thresholds are defined in the service (
AUTOPLAY_TRUST_THRESHOLDandBLUR_TRUST_THRESHOLD) and used when trusted counts change.【F:js/services/moderationService.js†L7-L8】【F:js/services/moderationService.js†L668-L706】
js/services/moderationActionController.js
ModerationActionController is the orchestration layer for user-triggered moderation actions. It is responsible for:
- Overrides (“show anyway”):
handleOverridepersists the override, clears hide state on the target video, decorates moderation state, refreshes the card UI, dispatches an override event, and resumes playback if needed.【F:js/services/moderationActionController.js†L77-L126】 - Block actions:
handleBlockensures the viewer is logged in, updates the block list, clears overrides, re-decorates moderation state, refreshes the card UI, dispatches block/hide events, and triggers a list refresh so the feed reflects the new block state.【F:js/services/moderationActionController.js†L128-L224】 - Hide actions:
handleHideclears overrides, updates the moderation state, refreshes the card UI, and dispatches a hide event.【F:js/services/moderationActionController.js†L226-L263】
Local state updates
Moderation overrides are persisted in local state through the cache module:
setModerationOverridestores (and optionally persists) “show anyway” entries in the moderation override map and local storage.【F:js/state/cache.js†L1269-L1318】clearModerationOverrideremoves entries and persists the cleanup when requested.【F:js/state/cache.js†L1320-L1341】
ModerationActionController uses these helpers via injected services when users override, hide, or block content, ensuring the UI state and local storage stay consistent.【F:js/services/moderationActionController.js†L10-L24】【F:js/services/moderationActionController.js†L77-L224】
UI update flow
Application wiring (js/app.js)
bitvidApp wires ModerationActionController to application state and UI updates. The controller receives callbacks to:
- Decorate moderation state for videos.
- Refresh card moderation UI.
- Dispatch DOM events for moderation actions (
video:moderation-override,video:moderation-block,video:moderation-hide).【F:js/app.js†L6029-L6114】
This keeps moderation mutations in one place while delegating the UI refresh to controllers and card views.
Profile modal integration (js/ui/profileModalController.js)
ProfileModalController subscribes to moderationService contact updates and refreshes the friends list when the trusted contacts set changes. This keeps the moderation settings screen aligned with the viewer’s social graph.【F:js/ui/profileModalController.js†L891-L921】
End-to-end flow summary
- Ingest & summarize:
moderationServiceingests reports/mutes/contacts, recomputes summaries, emitssummaryandcontacts, and logs threshold transitions for autoplay and blur rules.【F:js/services/moderationService.js†L520-L706】【F:js/services/moderationService.js†L1869-L1998】 - Decorate playback state: Application-level logic consumes summaries and settings to decorate moderation state on videos (blur/autoplay/hide metadata) before rendering or playback decisions.【F:js/app.js†L5980-L6067】
- User action: UI triggers
ModerationActionController(handleOverride,handleHide,handleBlock) to mutate overrides, update block lists, and refresh UI with event dispatches.【F:js/services/moderationActionController.js†L77-L224】 - Persist & refresh: Overrides persist via
js/state/cache.js, and UI controllers refresh based on moderation events or service subscriptions.【F:js/state/cache.js†L1269-L1341】【F:js/ui/profileModalController.js†L891-L921】
For broader moderation policies and QA guidance, refer to docs/moderation/README.md.