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.