Skip to content

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
    • Help
    • Submit feedback
    • Contribute to GitLab
  • Sign in
F
finwise-miniapp-fe
  • Project
    • Project
    • Details
    • Activity
    • Releases
    • Cycle Analytics
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Charts
  • Issues 0
    • Issues 0
    • List
    • Board
    • Labels
    • Milestones
  • Merge Requests 0
    • Merge Requests 0
  • CI / CD
    • CI / CD
    • Pipelines
    • Jobs
    • Schedules
    • Charts
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Collapse sidebar
  • Activity
  • Graph
  • Charts
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
  • ThinhNC
  • finwise-miniapp-fe
  • Merge Requests
  • !36

Merged
Opened Sep 10, 2026 by ThinhNC@ThinhNC
  • Report abuse
Report abuse

feat(notifications): replace 30s short-polling with SSE stream and realtime toast alerts

Feature: Realtime Notifications via Server-Sent Events (SSE)

Overview

Replaced the legacy 30-second short-polling mechanism (refetchInterval: 30000) for notifications and unread counts with a persistent, low-overhead Server-Sent Events (SSE) connection. The app now receives instant updates for incoming notifications and badge counts without redundant network polling.


Key Changes

  • useNotificationSSE Hook (src/hooks/use-notification-sse.ts):
    • Automatically manages the lifecycle of an EventSource connection to /api/v1/notifications/stream.
    • Supports authentication via cookies and ?token=<access_token> query parameters for mobile webview compatibility.
    • Listens to unread_count events to dynamically update React Query cache (notificationKeys.unread()).
    • Listens to notification events to invalidate notifications list cache and trigger realtime toasts.
    • Handles automatic reconnection and graceful connection termination upon logout or component unmount.
  • NotificationRealtimeListener (src/components/shared/NotificationRealtimeListener.tsx):
    • Headless listener component mounted in Layout.tsx within SnackbarProvider and AuthInitializer.
    • Dispatches immediate snackbar notifications when alerts (e.g., budget warnings, saving goals, anomalies) are received.
  • Eliminated 30s Polling (src/hooks/use-notifications.ts):
    • Disabled refetchInterval (false) in both useUnreadNotificationCount and useNotifications.
    • Increased staleTime to 60_000ms, retaining refetchOnWindowFocus: true as a graceful fallback on device wake-up.
  • API Client Update (src/lib/api-client.ts):
    • Exported API_BASE_URL to ensure consistent endpoint resolution across all services and streams.
  • Memory Documentation (.agents/memory.md):
    • Documented the architectural transition from polling to SSE.

Performance & Efficiency Impact

  • Network Traffic: Eliminated continuous HTTP requests every 30 seconds per active client tab, saving battery and bandwidth on mobile devices.
  • Latency: Notification and unread badge updates are delivered with sub-second latency instead of up to a 30-second delay.

Check out, review, and merge locally

Step 1. Fetch and check out the branch for this merge request

git fetch origin
git checkout -b feat/notifications-sse-client origin/feat/notifications-sse-client

Step 2. Review the changes locally

Step 3. Merge the branch and fix any conflicts that come up

git fetch origin
git checkout origin/develop
git merge --no-ff feat/notifications-sse-client

Step 4. Push the result of the merge to GitLab

git push origin develop

Note that pushing to GitLab requires write access to this repository.

Tip: You can also checkout merge requests locally by following these guidelines.

  • Discussion 0
  • Commits 1
  • Changes 6
Assignee
No assignee
Assign to
None
Milestone
None
Assign milestone
Time tracking
0
Labels
None
Assign labels
  • View project labels
Reference: ThinhNC/finwise-miniapp-fe!36

Revert this merge request

This will create a new commit in order to revert the existing changes.

Switch branch
Cancel
A new branch will be created in your fork and a new merge request will be started.

Cherry-pick this merge request

Switch branch
Cancel
A new branch will be created in your fork and a new merge request will be started.