All six vendor-portal dispatch mutation hooks lacked meta.suppressErrorToast,
so a failed checklist toggle, signoff, comment, or uplift request/withdraw/
revise raised both the global MutationCache toast (leaking the raw server
message) and the section's own inline error, contradicting this ticket's
"no behavior change" goal versus main's try/catch-only handling.
Also fixes a related gap in checklist-section.tsx: updateItem.isError only
reflects the latest call on the shared mutation observer, so a failed toggle
whose item was not the most recent click showed no error at all. Tracks
failure locally instead, mirroring main's per-call error state.
Added regression coverage with the app's real query client (createAppQueryClient)
for comments, signoff, and uplift withdraw, asserting the inline message shows
and the global toast does not fire; plus a mixed pass/fail concurrent-toggle
case for the checklist.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Two groups of components were calling the API directly instead of using
this codebase's standard React Query hooks, with no shared caching and
duplicated submit/error-handling boilerplate.
- checklist-section.tsx, comments-section.tsx, signoff-section.tsx,
uplift-requests-section.tsx: replace direct vendorPortalApi calls and
hand-rolled submitting/error state with mutation hooks in the new
use-vendor-portal-dispatch-actions.ts. uplift-requests-section keeps
its existing multi-step evidence-upload orchestration intact and only
swaps the 3 raw API calls for mutateAsync, since restructuring that
flow around declarative mutation callbacks carried more risk than
value. Caught and fixed a real bug along the way: two components were
passing a prop callback directly as a mutation's onSuccess, which
would have forwarded React Query's extra callback arguments into it.
- followups/index.tsx, vendors/preferences.tsx: split from a single
file doing state, API calls, and rendering into a hook (owns data
and handlers) plus small presentational components, matching the
task-templates refactor pattern. Added a missing centralized query
key (vendorOperations.sitePreferences) that preferences.tsx was
building as a raw inline array.
- use-list-page-filters.ts: small shared hook for search/page/pageSize
state, used by the new followups hook.
29 new/updated tests across all touched files; none of these had
coverage for their mutation/error paths before.