PR #298 MERGED

in Steem Dev2 days ago (edited)

Hello community and fellow developers,

Great news! PR #298 has been merged into the Next.js version of the Steemit Wallet:
🔗 https://github.com/steemit/wallet/pull/298

This milestone delivers a polished, accessible, and performant user profile experience—with locale-aware routing, layout stability fixes, and intelligent VESTS-to-SP conversion in activity history. Special thanks to @ety001 for the thorough code review and collaborative feedback that strengthened this PR.


✅ User Profile Page Stability (src/app/[locale]/[username]/page.tsx)

  • Locale-aware routing: Dynamic [locale]/[username] routes now resolve correctly across all supported languages (en, es, fr, zh), preventing 404s on non-default locale profiles.
  • Username normalization: Case-insensitive, sanitized lookup ensures consistent profile resolution regardless of input format (@User@user).
  • Hydration & layout fixes: Deferred non-critical renders and useSyncExternalStore subscription eliminate CSS layout shifts and hydration mismatches.
  • Granular error boundaries: Activity feed errors no longer break the entire profile page—failures are isolated and gracefully handled.

✅ Recent Activity: VESTS → SP Conversion (src/components/wallet/recent-activity.tsx)

  • Smart SP display: withdraw_vesting, claim_reward_balance, and delegate_vesting_shares operations now show human-readable SP values using formatSteemPowerFromVestsString and globalProps.
  • Resilient fallbacks: When globalProps is unavailable, raw VESTS strings (e.g., "12345.000000 VESTS") are displayed instead of opaque "-- SP" placeholders—ensuring users always see meaningful data.
  • Type-safe helpers: Added asStr() utility to safely extract string values from untyped op[1] payloads, reducing runtime errors.
  • Accessibility upgrades: Added aria-label, role="list", and keyboard-focus states to activity containers for screen reader compatibility.

✅ Performance & Polish

  • Simplified rendering: Removed redundant useMemo/useCallback; leveraged server-normalized SteemHistoryItem[] from PR #290 to reduce client computation.
  • Mobile responsiveness: Fixed truncated operation descriptions and overlapping reward cards on small viewports.
  • Timestamp edge cases: Corrected formatting for locales with non-Gregorian calendars.
  • Storybook coverage: Added stories for RecentActivity variants (empty, loading, error, populated) to aid future development.

🤝 Review & Collaboration Highlights

This PR benefited from detailed feedback by @ety001, resulting in meaningful improvements:

FeedbackResolution
"-- SP" fallback unhelpful when globalProps missing✅ Now falls back to raw VESTS string ("12345.000000 VESTS") for transparency
claim_reward_balance filter hid VESTS rewards during loading✅ Updated filter logic to preserve raw values when conversion isn't ready
package-lock.json bloated diff in pnpm project✅ Removed lockfile; added to .gitignore per reviewer guidance
PR description didn't match SP conversion focus✅ Updated description to accurately reflect VESTS→SP display changes
fill_vesting_withdraw consistency check✅ Verified deposited is liquid STEEM; no conversion needed
Type assertions on data.* fields✅ Introduced asStr() helper for safer, reusable type narrowing

The collaborative review process ensured the final implementation is robust, user-friendly, and maintainable.


🔄 For Developers: Quick Integration Note

// Before: Raw VESTS display in activity rows
// "Started power down of 123456.000000 VESTS"

// After: Human-readable SP (when globalProps available)
// "Started power down of 1,234.567 SP"

// Fallback when globalProps loading:
// "Started power down of 123456.000000 VESTS" (still meaningful)

No breaking changes—existing components continue to work. The SP conversion is automatic when globalProps is provided by WalletPage.


✅ Validation Complete

  • [x] All unit/integration tests pass (Jest + React Testing Library)
  • [x] Locale routing validated across en, es, fr, zh configurations
  • [x] Username edge cases tested: uppercase, unicode, special chars, empty strings
  • [x] VESTS→SP conversion verified against live Steem node responses
  • [x] Fallback behavior confirmed when globalProps is null/undefined
  • [x] Accessibility audit passed (axe-core + manual screen reader testing)
  • [x] Zero visual regressions in profile/activity snapshots

📚 Contribution Series Recap

This merge continues the focused series of stability, UX, and performance improvements to the Steemit Wallet:

PRStatusFocus
PR #298MERGEDUser page refactor, VESTS→SP conversion, locale routing, accessibility
PR #290✅ MergedServer-side history filtering, pagination, hook refactor
PR #285🟡 OpenRPC node failover system + accessibility fixes
PR #282✅ MergedRedux DevTools credential masking
PR #274✅ MergedSSR Redux store isolation fix

Every contribution is designed to harden the wallet's foundation while keeping the developer experience smooth and the user experience fast.


Support Secure Steem Development

If you value proactive engineering, UX polish, and performance optimizations for the STEEM ecosystem, please consider supporting my witness: blaze.apps

🗳️ Vote Here:
Vote for blaze.apps Witness


Building performant, accessible tooling for the Steem ecosystem
PR #298 (Merged): https://github.com/steemit/wallet/pull/298
Previous Post: https://steemit.com/hive-151113/@blaze.apps/pr-298-user-page-and-recent-activity-refactor-layout-fixes-locale-routing-and-performance-improvements