Commit graph

3 commits

Author SHA1 Message Date
npal
41ec771a0c fix: stop duplicate global toasts on vendor-portal dispatch actions
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>
2026-09-30 12:13:35 -05:00
npal
736157467c refactor: move vendor-portal dispatch actions and 2 pages onto proper data hooks
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.
2026-09-25 10:53:23 -05:00
Alexandre Brandizzi
bc5659eb2a fix(vendor-portal): clear stale refusal state 2026-08-10 18:25:57 -03:00