Skip to content

fix(frontend): guard campaign loading, filter a11y, SSE backoff cap, and referral copy (#1477, #1479, #1480, #1481) - #1506

Merged
joelpeace48-cell merged 1 commit into
FinesseStudioLab:mainfrom
Rampop01:fix/wave10-issues-1477-1479-1480-1481
Oct 22, 2026
Merged

joelpeace48-cell merged 1 commit into
FinesseStudioLab:mainfrom
Rampop01:fix/wave10-issues-1477-1479-1480-1481

Conversation

@Rampop01

Copy link
Copy Markdown
Contributor

Summary

Targeted fixes addressing 4 assigned frontend issues (#1477, #1479, #1480, #1481) for Stellar Wave:

  1. frontend: campaign detail page crashes with undefined when campaign data is loading #1477 — Campaign detail loading crash guard

    • Guarded all nested campaign property accesses (campaign?.id, campaign?.name, campaign?.status, campaign?.description, campaign?.rewardPerAction, campaign?.createdAt, campaign?.tasks, campaign?.referralBonusPoints, campaign?.contractId) with optional chaining and fallback defaults in CampaignDetail.jsx and CampaignDetail.tsx.
    • Added robust loading skeleton, error alert, and missing campaign fallback states.
    • Added Vitest snapshot tests in frontend/src/CampaignDetail.test.jsx covering undefined campaign data, loading states, and error states.
  2. frontend: no keyboard navigation support in campaign filter dropdowns #1479 — Campaign filter dropdown keyboard navigation & ARIA

    • Implemented accessible custom combobox and listbox pattern for sort dropdown in CampaignFilters.jsx.
    • Added full keyboard navigation: ArrowDown/ArrowUp to navigate options, Enter/Space to select, Escape to close, Home/End to jump, and Tab to blur.
    • Added ARIA attributes: role="combobox", aria-haspopup="listbox", aria-expanded, aria-controls, aria-activedescendant, role="listbox", role="option", aria-selected.
    • Maintained hidden native select for automated form tests and fallback support.
    • Added axe-core accessibility test in frontend/tests/e2e/accessibility.spec.ts and unit tests in CampaignFilters.test.jsx.
  3. frontend: SSE event reconnection logic has exponential backoff but no max retry cap #1480 — SSE reconnection backoff cap & UI indicator

    • Ensured reconnection exponential backoff is capped at 30 seconds (DEFAULT_MAX_DELAY_MS = 30_000).
    • Added a visible 'Reconnecting…' indicator with pulsing badge in CampaignDetail.jsx and LiveCampaignUpdates.jsx.
    • Added unit test in frontend/src/hooks/realtimeClient.test.js verifying the backoff curve doubles and stays capped at 30 seconds across repeated connection failures.
  4. frontend: referral link copy button does not fall back when clipboard API is unavailable #1481 — Referral link copy fallback & failure toast

    • Added document.execCommand('copy') fallback for non-HTTPS contexts or older browsers when navigator.clipboard is unavailable.
    • Added error toast via useToast prompting manual copy if both clipboard API and fallback fail.
    • Added unit tests in frontend/src/ReferralLinkGenerator.test.jsx verifying standard clipboard copy, execCommand fallback when clipboard is undefined, and failure toast notification.

Motivation / Context

Closes #1477
Closes #1479
Closes #1480
Closes #1481

Changes

  • frontend/src/CampaignDetail.jsx: Optional chaining guards on all nested campaign properties, loading/error states, reconnecting badge, execCommand fallback.
  • frontend/src/CampaignDetail.css: Added .detail-reconnecting-badge style with pulse animation.
  • frontend/src/CampaignDetail.test.jsx: Vitest snapshot test suite with undefined campaign data.
  • frontend/src/components/CampaignDetail.tsx: Guarded stats grid nested accesses with optional chaining.
  • frontend/src/components/CampaignFilters.jsx: Accessible keyboard combobox/listbox with ARIA roles and expanded state.
  • frontend/src/components/CampaignFilters.test.jsx: Unit tests for arrow keys, Enter, and Escape navigation.
  • frontend/src/components/LiveCampaignUpdates.jsx: Added 'Reconnecting…' indicator state.
  • frontend/src/hooks/realtimeClient.test.js: Unit test verifying backoff delay caps at 30s.
  • frontend/src/ReferralLinkGenerator.jsx: Added execCommand fallback and toast on copy failure.
  • frontend/src/ReferralLinkGenerator.test.jsx: Unit tests simulating clipboard API unavailability and fallback/toast behavior.
  • frontend/tests/e2e/accessibility.spec.ts: Added axe-core test for campaign filter dropdowns.

…and referral copy (FinesseStudioLab#1477, FinesseStudioLab#1479, FinesseStudioLab#1480, FinesseStudioLab#1481)

- FinesseStudioLab#1477: Guard campaign property accesses with optional chaining, support loading/error/fallback states, and add Vitest tests for undefined campaign data
- FinesseStudioLab#1479: Add accessible combobox dropdown with full keyboard navigation (arrow keys, Enter, Escape) and ARIA attributes to campaign filters, with axe-core e2e test
- FinesseStudioLab#1480: Enforce 30s cap on SSE reconnection exponential backoff, add visible 'reconnecting…' indicator in UI, and unit test backoff curve hitting the cap
- FinesseStudioLab#1481: Add execCommand fallback for non-HTTPS contexts on referral link copy, show error toast prompting manual copy on failure, and add unit test simulating clipboard API unavailability

Closes FinesseStudioLab#1477, Closes FinesseStudioLab#1479, Closes FinesseStudioLab#1480, Closes FinesseStudioLab#1481
@drips-wave

drips-wave Bot commented Oct 21, 2026

Copy link
Copy Markdown

@Rampop01 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 44e5b5d into FinesseStudioLab:main Oct 22, 2026
5 of 21 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