Overview
When a dispute is open on an invoice, all parties need a clear UI to follow the arbitration process, submit evidence, and (for arbitrators) cast votes. Build a dedicated dispute flow within the invoice detail page.
Requirements
- Dispute panel on
/invoice/[id] — visible only when invoice status is Disputed
- Shows: dispute reason, who opened it, time opened, arbitrator list, current vote tally
- "Submit Evidence" button: uploads a file to IPFS via the SDK, adds the CID to the dispute notes
- Arbitrator vote buttons: "Approve Release" / "Reject (Refund)" — calls
vote_dispute via SDK
- Real-time vote tally update via
useInvoiceStream
- Timeline component showing dispute lifecycle events in chronological order
- Write unit tests for the dispute panel, vote buttons, and timeline
Acceptance Criteria
Definition of Done
All CI checks must pass before the PR is reviewed.
Overview
When a dispute is open on an invoice, all parties need a clear UI to follow the arbitration process, submit evidence, and (for arbitrators) cast votes. Build a dedicated dispute flow within the invoice detail page.
Requirements
/invoice/[id]— visible only when invoice status isDisputedvote_disputevia SDKuseInvoiceStreamAcceptance Criteria
npm run lintpasses with zero errorsnpm run buildsucceedsDefinition of Done
All CI checks must pass before the PR is reviewed.