Skip to content

Phase 4: Move version/interdiff derived data off the store #356

Description

@jennings

Move version-comparison and interdiff derived data off the store. After this phase, SHA-setter methods only mutate SHAs; derived data recomputes automatically via Phase 0 hooks.

Fields removed from store

  • versionDiffCounts
  • versionRebaseInfo
  • commitVersionHistory
  • commitsByVersion
  • parentCommitMessages
  • commitChangeIds
  • interdiffLoadedDiffs
  • versionCompareNoChangeFiles

Methods reduced or removed

  • setSelectedHeadSha — reduced to a pure SHA update. Remove side effects that populate versionDiffCounts, versionRebaseInfo, etc.
  • setSelectedCommitSha — same. Remove the fire-and-forget loadParentCommitMessages call.
  • setCompareToSha, setCompareToCommitSha, resetVersionSelectors — same.
  • getCommitChangeId, loadCommitChangeIds, loadParentCommitMessages — deleted; consumers use Phase 0 hooks.
  • computeFullBranchInterdiff — moved into a pure function in pr-review-derived.ts, called from useInterdiff / useVersionDiffCounts.

Consumer changes

  • pr-review.tsx, pr-overview.tsx, and any commit-list / version-picker UI switch from usePRReviewSelector(...) to the Phase 0 hooks.

Watch for

Today, SHA setters clear files + loadedDiffs atomically before refetching, so nothing sees a mid-transition state. After migration, files/diffs are keyed on SHA in RQ — swaps are atomic per-query, but consumers may momentarily see selectedHeadSha = new while useFiles() is still isPending. Audit each SHA-reading consumer for loading-state handling.

Tests

  • Test SHA-setter methods now only mutate SHAs (no side effects, no store mutations for derived fields).
  • Test derived hooks recompute correctly when SHAs change (fixture-driven).
  • Regression test: component reads selectedHeadSha + useFiles() — confirm it handles the "new SHA, files still loading" transitional state without crashing or showing stale data.
  • End-to-end style: switch push versions; version-picker updates without flicker.

Part of #351

Depends on #352, #353.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Default priority

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions