Skip to content

feat: add auto theme, Redis failover, weekly digest, and campaign map - #1500

Merged
joelpeace48-cell merged 6 commits into
FinesseStudioLab:mainfrom
osasfaith:feat/rebase-on-upstream
Oct 20, 2026
Merged

joelpeace48-cell merged 6 commits into
FinesseStudioLab:mainfrom
osasfaith:feat/rebase-on-upstream

Conversation

@osasfaith

Copy link
Copy Markdown
Contributor

Closes #1358, Closes #1356, Closes #1355, Closes #1357

Type of Change

  • New feature (non-breaking change that adds functionality)

Summary

This PR adds four features: (1) automatic light/dark theme switching based on local time, (2) Redis Sentinel/Cluster auto-failover for high availability, (3) weekly campaign performance email digest for operators, and (4) interactive campaign map with geographic region filtering.

Motivation / Context

Closes #1358 — Users want the UI to adapt to their local time automatically. An 'auto' theme preference resolves to light between 06:00–18:00 and dark otherwise, re-evaluating every minute.

Closes #1356 — Redis single-node is a SPOF. A createRedisClient factory selects standalone, Sentinel, or Cluster topology from environment config, giving zero-downtime failover.

Closes #1355 — Campaign operators need weekly participation analytics. A digest job aggregates 7-day stats per campaign and emails operators, idempotent per ISO week.

Closes #1357 — Visualizing global participation helps operators understand reach. A CampaignMap component renders hotspots on an SVG world map with clickable region filters.

Closes #1358, Closes #1356, Closes #1355, Closes #1357

Introduce an 'auto' theme preference that resolves to light between
06:00-18:00 local time and dark otherwise, re-evaluating every minute.
Theme toggle now cycles light -> dark -> auto.
Introduce a createRedisClient factory that selects standalone, Sentinel,
or Cluster topology from environment configuration, giving zero-downtime
failover when a Redis node fails. Wire it into the server bootstrap.
Introduce a pluggable email service (no-op without transport) and a
weekly digest job that aggregates 7-day participation analytics per
campaign and emails operators. Idempotent per ISO week via checkpoints.
Introduce a CampaignMap component that renders participation hotspots
on an SVG world map, sized by intensity, with clickable region filters.
Mount it on the campaign analytics dashboard.
- Mock window.localStorage directly instead of Storage.prototype for
  reliable test isolation in jsdom
- Add injectable transport support to createEmailService factory
@drips-wave

drips-wave Bot commented Oct 20, 2026

Copy link
Copy Markdown

@osasfaith Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits.

You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀

Learn more about application limits

@joelpeace48-cell
joelpeace48-cell merged commit e69ac56 into FinesseStudioLab:main Oct 20, 2026
9 of 28 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants