Skip to content

Transaction table a11y, date-range export, and Soroban panel/invoke fixes - #1024

Merged
k-deejah merged 5 commits into
Sorokit:mainfrom
theladyanina:feat/txn-table-soroban-panel-fixes
Oct 24, 2026
Merged

k-deejah merged 5 commits into
Sorokit:mainfrom
theladyanina:feat/txn-table-soroban-panel-fixes

Conversation

@theladyanina

Copy link
Copy Markdown
Contributor

Summary

Four scoped fixes/UX improvements across the transaction history and Soroban interaction components.

#902 - TransactionHistoryTable

aria-sort, directional chevrons, and the mobile card layout were already shipped on main. The remaining gap was an accessible way to copy a transaction hash, so I added a Copy01Icon button with aria-label="Copy transaction hash" next to the hash in both the desktop row and the mobile card, using the same clipboard pattern as AddressDisplay.

#903 - TransactionsScreen

Added a date-range filter (start/end) wired into TransactionHistory's existing startDate/endDate props, clamped so startDate <= endDate <= today: picking an end date before the start pulls it forward, picking a future date clamps to today. Added CSV/JSON export with a progress modal (percentage and record count) that appears once a history has 500+ records, with a Cancel button that aborts the in-flight export.

#904 - SorobanPanel

Contract IDs are now trimmed and validated against /^C[A-Z0-9]{55}$/ with inline feedback on blur; invoking/simulating is blocked before any RPC call goes out for a malformed ID. The loaded ABI's method dropdown is grouped into "Read (View)" and "Write (State Changes)" optgroups (inferred from an ABI entry's mutating/readonly/stateMutability field, falling back to a naming-convention heuristic). Added a "Load into form" button on each invocation-history entry that repopulates the contract ID, method, and args.

While wiring up "Load into form" I found a pre-existing bug in ContractInteractionDebugger: its action buttons (Show/Hide debugger, Copy buttons) didn't set type="button", so clicking them inside SorobanPanel's form silently re-submitted it (a second, unintended invokeContract call). Fixed as part of this change since the new button lives in the same component.

#905 - SorobanInvokeButton

Normalized error handling so a rejected/odd-shaped error (a bare contract-panic object, a non-Error throw, a response that doesn't destructure into { data, error }) always produces a friendly message instead of only handling plain strings and Error instances, plus a finally-block safety net so loading state can't get stuck on. Wrapped the disabled button in a tooltip naming the exact blocking reason (wallet disconnected, invocation already in flight, or missing contract ID/method). Added test coverage for abort-signal handling (user-aborted mid-flight, superseded invocation).

Validation

  • npm run lint: clean, 0 errors/warnings
  • npm run typecheck: clean
  • npm test (vitest): 2062/2062 passing (added/updated tests in TransactionHistoryTable.test.tsx, TransactionsScreen.test.tsx, SorobanPanel.test.tsx, SorobanInvokeButton.test.tsx)
  • npm run build: succeeds

No pre-existing failures encountered; the suite was clean on main before these changes and stays clean after.

Closes #902
Closes #903
Closes #904
Closes #905

aria-sort, directional chevrons, and the mobile card layout were already
in place; the remaining gap from Sorokit#902 was an accessible way to copy a
transaction hash. Adds a labeled copy button next to the hash in both
the desktop and mobile rows.
Clamps the export end date so it can never precede the start date or
fall in the future, enforcing startDate <= endDate <= today. Adds a CSV
and JSON export flow with a progress modal (percentage and record
count) for histories over 500 records, with cancellation support.
Trims and validates contract IDs against /^C[A-Z0-9]{55}$/ with inline
feedback, blocking invoke/simulate before any RPC call goes out for a
malformed ID. Groups the loaded ABI's methods into "Read (View)" and
"Write (State Changes)" sections, and adds a "Load into form" button
on each invocation-history entry to repopulate the builder inputs.

Also fixes a pre-existing bug in ContractInteractionDebugger where its
action buttons (Show/Hide debugger, Copy, and the new Load into form)
defaulted to type="submit" and silently re-submitted the parent form
when clicked.
…tooltips

Normalizes whatever a rejected/odd-shaped error looks like (a bare
contract-panic object, a non-Error throw, a response that doesn't
destructure into { data, error }) into a displayable message instead
of only handling plain strings and Error instances, and adds a
finally-block safety net so loading can never get stuck on. Wraps the
disabled button in a tooltip that names the exact blocking reason
(wallet disconnected, invocation in flight, or missing contract
ID/method), and adds abort-signal coverage for user-aborted and
superseded invocations.
@drips-wave

drips-wave Bot commented Oct 19, 2026

Copy link
Copy Markdown

@theladyanina 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

@theladyanina
theladyanina force-pushed the feat/txn-table-soroban-panel-fixes branch from 2aebf5d to ea9345d Compare October 19, 2026 23:32
@k-deejah
k-deejah merged commit 626f867 into Sorokit:main Oct 24, 2026
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