PR #298 MERGED
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
useSyncExternalStoresubscription 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, anddelegate_vesting_sharesoperations now show human-readable SP values usingformatSteemPowerFromVestsStringandglobalProps. - Resilient fallbacks: When
globalPropsis 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 untypedop[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-normalizedSteemHistoryItem[]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
RecentActivityvariants (empty, loading, error, populated) to aid future development.
🤝 Review & Collaboration Highlights
This PR benefited from detailed feedback by @ety001, resulting in meaningful improvements:
| Feedback | Resolution |
|---|---|
"-- 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,zhconfigurations - [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
globalPropsis 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:
| PR | Status | Focus |
|---|---|---|
| PR #298 | ✅ MERGED | User page refactor, VESTS→SP conversion, locale routing, accessibility |
| PR #290 | ✅ Merged | Server-side history filtering, pagination, hook refactor |
| PR #285 | 🟡 Open | RPC node failover system + accessibility fixes |
| PR #282 | ✅ Merged | Redux DevTools credential masking |
| PR #274 | ✅ Merged | SSR 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