components/bounty-detail/bounty-detail-mobile-cta.tsx:190 renders the Raise Dispute button as a permanently-disabled "Coming Soon" placeholder:
{canRaiseDispute && (
<Button variant="ghost" className="w-full mt-2 text-gray-400 text-xs h-8" disabled>
<Gavel className="size-3 mr-2" />
Raise a Dispute (Coming Soon)
</Button>
)}
But the flow already shipped in PRs #256 and #268: useRaiseDispute hook, RaiseDisputeDialog component, /api/disputes proxy. The desktop sidebar at components/bounty-detail/bounty-detail-sidebar-cta.tsx:248-262 wires all of this up correctly. Mobile users currently have no way to raise a dispute because of the stale stub.
What to do
Mirror the desktop sidebar pattern in bounty-detail-mobile-cta.tsx:
- Import
RaiseDisputeDialog from ./raise-dispute-dialog
- Add a local
const [disputeDialogOpen, setDisputeDialogOpen] = useState(false)
- Replace the disabled button with an enabled
Button whose onClick calls setDisputeDialogOpen(true)
- Drop the "(Coming Soon)" label, drop the
disabled prop, keep the Gavel icon and canRaiseDispute gate
- Render
<RaiseDisputeDialog open={disputeDialogOpen} onOpenChange={setDisputeDialogOpen} bountyId={bounty.id} /> near the other mobile dialogs
Acceptance criteria
- No "Coming Soon" string in
bounty-detail-mobile-cta.tsx
- Clicking the mobile button opens the same
RaiseDisputeDialog the desktop sidebar opens
- On a small viewport, the dispute flow works end to end (open dialog, pick reason, type description, submit, see toast, redirect)
pnpm tsc --noEmit and pnpm lint pass
Files
components/bounty-detail/bounty-detail-mobile-cta.tsx
components/bounty-detail/raise-dispute-dialog.tsx (reference)
components/bounty-detail/bounty-detail-sidebar-cta.tsx (reference for the pattern)
components/bounty-detail/bounty-detail-mobile-cta.tsx:190renders the Raise Dispute button as a permanently-disabled "Coming Soon" placeholder:But the flow already shipped in PRs #256 and #268:
useRaiseDisputehook,RaiseDisputeDialogcomponent,/api/disputesproxy. The desktop sidebar atcomponents/bounty-detail/bounty-detail-sidebar-cta.tsx:248-262wires all of this up correctly. Mobile users currently have no way to raise a dispute because of the stale stub.What to do
Mirror the desktop sidebar pattern in
bounty-detail-mobile-cta.tsx:RaiseDisputeDialogfrom./raise-dispute-dialogconst [disputeDialogOpen, setDisputeDialogOpen] = useState(false)ButtonwhoseonClickcallssetDisputeDialogOpen(true)disabledprop, keep theGavelicon andcanRaiseDisputegate<RaiseDisputeDialog open={disputeDialogOpen} onOpenChange={setDisputeDialogOpen} bountyId={bounty.id} />near the other mobile dialogsAcceptance criteria
bounty-detail-mobile-cta.tsxRaiseDisputeDialogthe desktop sidebar openspnpm tsc --noEmitandpnpm lintpassFiles
components/bounty-detail/bounty-detail-mobile-cta.tsxcomponents/bounty-detail/raise-dispute-dialog.tsx(reference)components/bounty-detail/bounty-detail-sidebar-cta.tsx(reference for the pattern)