Skip to content

Real-time WebSocket Activity Feed#1270

Open
sepulchralvoid666 wants to merge 1 commit into
SolFoundry:mainfrom
sepulchralvoid666:feat/bounty-860-activity-feed
Open

Real-time WebSocket Activity Feed#1270
sepulchralvoid666 wants to merge 1 commit into
SolFoundry:mainfrom
sepulchralvoid666:feat/bounty-860-activity-feed

Conversation

@sepulchralvoid666
Copy link
Copy Markdown

@sepulchralvoid666 sepulchralvoid666 commented May 14, 2026

Bounty #860 — Real-time WebSocket Activity Feed

What

  • WebSocket connection with automatic reconnect (exponential backoff, max 30s)
  • Polling fallback after 3 failed WS attempts (15s interval)
  • Event dedup and cap (200 events max)
  • Notification preferences persisted to localStorage
  • Filter bar by event type (platform + on-chain)
  • Activity event cards with icon, timestamp, actor, bounty link, amount, source badge
  • Shimmer skeleton loading state
  • Route at /activity with nav link in Navbar

Files

  • types/activity.ts — Full type system (ActivityEvent, FeedEventType, OnChainEventType, NotificationPreferences, ConnectionStatus, label/icon helpers)
  • hooks/useActivityFeed.ts — Core hook (WS, reconnect, polling, dedup, filter, prefs)
  • components/activity/ActivityFeed.tsx — Main feed with header, status, prefs panel, filters
  • components/activity/ActivityEventCard.tsx — Individual event card
  • components/activity/ActivityFilterBar.tsx — Event type filter pills
  • components/activity/NotificationPreferences.tsx — Per-type notification toggles
  • components/activity/ActivityFeedSkeleton.tsx — Shimmer loading state
  • pages/ActivityPage.tsx — Page wrapper
  • Route + nav link additions to App.tsx and Navbar.tsx

Acceptance Criteria

  • Real-time updates via WebSocket
  • Graceful reconnection with exponential backoff
  • Polling fallback when WS unavailable
  • Notification preferences (localStorage persisted)
  • Event filtering by type
  • Connection status indicator
  • Manual reconnect button
  • Skeleton loading states
  • Responsive layout

Closes #860

Solana wallet for payout: 9PmjWFwM2mdnjBNjJyfNMTWGCnGAKFpywsLF9xcRF8PK

WebSocket connection with exponential backoff reconnect,
polling fallback when WS unavailable after 3 attempts,
event dedup and cap (200 max), notification preferences
persisted to localStorage, filter bar by event type,
shimmer skeleton loading state, route at /activity
with nav link in Navbar.
@nagiexplorer88
Copy link
Copy Markdown

This PR currently has a build-blocking import in the new skeleton file.

frontend/src/components/activity/ActivityFeedSkeleton.tsx imports:

import { ShimmerBlock } from "./Skeleton";

There is no frontend/src/components/activity/Skeleton.tsx in this PR. The skeleton helper added in the repo is under frontend/src/components/ui/Skeleton.tsx, and in that file ShimmerBlock is not exported as a named export. So TypeScript/Vite will fail resolving this import before the /activity route can build.

The smallest fix is either to make ActivityFeedSkeleton use the exported skeleton components from ../ui/Skeleton, or export ShimmerBlock from the shared UI skeleton module and import it via the correct relative path.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

🏭 Bounty T3: Real-time WebSocket Activity Feed

2 participants