Skip to content

Conversation

@OpenStaxClaude
Copy link
Contributor

Summary

Phase 1 of Topbar refactoring: Convert from legacy connect() HOC pattern to modern hooks pattern.

This is the first phase of the refactoring proposed in CORE-1456. Roy requested each phase in a separate PR for easier review.

Changes Made

Converted the Topbar component from the legacy react-redux connect() HOC pattern to modern hooks:

  • Replaced connect() HOC with useSelector and useDispatch
  • Removed Props interface - no longer needed with hooks
  • Removed lodash/fp/flow composition - direct dispatch calls instead
  • Added JSDoc comments explaining component purpose
  • Updated type definitions to work without Props

Code Comparison

Before (connect HOC):

export default connect(
  (state: AppState) => ({
    bookTheme: selectContent.bookTheme(state),
    // ... 8 more props
  }),
  (dispatch: Dispatch) => ({
    clearSearch: flow(clearSearch, dispatch),
    // ... 5 more actions
  })
)(Topbar);

After (hooks):

function Topbar() {
  const dispatch = useDispatch();
  const bookTheme = useSelector((state: AppState) => selectContent.bookTheme(state));
  // ... direct access to state

  const handleClear = useCallback(() => {
    dispatch(clearSearch());
  }, [dispatch]);
  // ... direct dispatch calls
}

export default Topbar;

Benefits

  • Aligns with 95% of codebase - Only 5 of 83+ components use connect()
  • Simpler, more direct code - No HOC wrapper or flow composition
  • Better performance - Improved tree-shaking and code splitting
  • Easier to understand - Direct dispatch calls vs. composed functions
  • No functional changes - Maintains all existing behavior

Pattern Alignment

This change aligns Topbar with modern components in the codebase like:

  • BookBanner.tsx - uses hooks
  • Toolbar/index.tsx - uses hooks
  • SidebarControl/index.tsx - uses hooks

Next Phases (Future PRs)

  • Phase 2: Extract custom hooks (useSearchState, useMobileToolbar, useKeyboardNavigation)
  • Phase 3: Extract sub-components (SearchForm, DesktopSearchBar, MobileSearchBar, MobileMenuButton)

Testing

  • No functional changes - all existing behavior preserved
  • Existing test suite should pass

Related Issues

  • CORE-1452: Identify complex code needing refactoring
  • CORE-1456: Refactor Topbar/index.tsx

🤖 Generated with Claude Code

Convert Topbar component from legacy connect() HOC pattern to modern
useSelector/useDispatch hooks pattern, aligning with 95% of components
in the rex-web codebase.

Changes:
- Replace connect() HOC with useSelector for reading Redux state
- Replace mapDispatchToProps with useDispatch for dispatching actions
- Remove lodash/fp/flow composition in favor of direct dispatch calls
- Remove Props interface (no longer needed with hooks)
- Update CommonSearchInputParams type to not depend on Props
- Add comprehensive JSDoc comment explaining component purpose

Benefits:
- Aligns with modern React patterns used throughout codebase
- Eliminates prop drilling from HOC
- Simpler, more direct code
- Better tree-shaking and code splitting
- Easier to understand and maintain

No functional changes - maintains all existing behavior.

Related to CORE-1452 and CORE-1456

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
@OpenStaxClaude OpenStaxClaude requested a review from a team as a code owner December 23, 2025 18:59
@TomWoodward TomWoodward temporarily deployed to rex-web-core-1456-refac-phztgv December 23, 2025 19:00 Inactive
@TomWoodward TomWoodward had a problem deploying to rex-web-core-1456-refac-phztgv December 23, 2025 19:22 Failure
@TomWoodward TomWoodward had a problem deploying to rex-web-core-1456-refac-phztgv December 23, 2025 19:27 Failure
@TomWoodward TomWoodward temporarily deployed to rex-web-core-1456-refac-phztgv December 23, 2025 20:03 Inactive
@TomWoodward TomWoodward temporarily deployed to rex-web-core-1456-refac-phztgv December 23, 2025 20:09 Inactive
@RoyEJohnson RoyEJohnson changed the title Phase 1: Refactor Topbar - Convert to Modern Hooks Refactor Topbar - Convert to Modern Hooks Dec 23, 2025
@TomWoodward TomWoodward temporarily deployed to rex-web-core-1456-refac-phztgv December 23, 2025 20:48 Inactive
@TomWoodward TomWoodward temporarily deployed to rex-web-core-1456-refac-phztgv December 23, 2025 20:59 Inactive
@TomWoodward TomWoodward temporarily deployed to rex-web-core-1456-refac-phztgv December 23, 2025 22:00 Inactive
@RoyEJohnson RoyEJohnson force-pushed the core-1456-refactor-topbar-phase1 branch from 15be302 to 2510ae2 Compare December 23, 2025 22:24
@TomWoodward TomWoodward temporarily deployed to rex-web-core-1456-refac-phztgv December 23, 2025 22:24 Inactive
@RoyEJohnson RoyEJohnson force-pushed the core-1456-refactor-topbar-phase1 branch from 2510ae2 to 91fe4e8 Compare December 23, 2025 22:31
@TomWoodward TomWoodward temporarily deployed to rex-web-core-1456-refac-phztgv December 23, 2025 22:32 Inactive
@RoyEJohnson RoyEJohnson force-pushed the core-1456-refactor-topbar-phase1 branch from 91fe4e8 to 668efaa Compare December 23, 2025 22:42
@TomWoodward TomWoodward temporarily deployed to rex-web-core-1456-refac-phztgv December 23, 2025 22:42 Inactive
@RoyEJohnson RoyEJohnson force-pushed the core-1456-refactor-topbar-phase1 branch from 668efaa to c984e21 Compare December 23, 2025 23:03
@TomWoodward TomWoodward temporarily deployed to rex-web-core-1456-refac-phztgv December 23, 2025 23:03 Inactive
@RoyEJohnson RoyEJohnson force-pushed the core-1456-refactor-topbar-phase1 branch from c984e21 to b7774b2 Compare December 24, 2025 00:13
@TomWoodward TomWoodward had a problem deploying to rex-web-core-1456-refac-phztgv December 24, 2025 00:13 Failure
@RoyEJohnson RoyEJohnson force-pushed the core-1456-refactor-topbar-phase1 branch from b7774b2 to 8e583ee Compare December 24, 2025 01:08
@TomWoodward TomWoodward temporarily deployed to rex-web-core-1456-refac-phztgv December 24, 2025 01:08 Inactive
Extract business logic into reusable custom hooks following Single Responsibility Principle:

Created hooks.ts with two custom hooks:
- useSearchState: Manages search query state and synchronization with Redux
  - Handles complex sync between local state (for input responsiveness) and Redux state
  - Provides handlers for search change, clear, and submit
  - Eliminates manual synchronization logic from component

- useMobileToolbar: Manages mobile toolbar open/close state
  - Encapsulates toggle logic and search clearing behavior
  - Simplifies mobile-specific state management

Updated index.tsx to use new hooks:
- Replaced inline state management with hook calls
- Removed duplicate event handler logic
- Cleaned up imports (removed unused action creators)
- Component now focuses on composition rather than logic

Benefits:
- Better separation of concerns (logic vs presentation)
- Each hook testable in isolation
- Reduced component complexity (removed 40+ lines of logic)
- Improved code reusability
- Maintained SSR-safe conditional render of AltSCycler (typeof window check)

No functional changes - all existing behavior preserved.

Related to CORE-1456

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
@TomWoodward TomWoodward had a problem deploying to rex-web-core-1456-refac-phztgv December 24, 2025 01:25 Failure
@TomWoodward TomWoodward temporarily deployed to rex-web-core-1456-refac-phztgv December 24, 2025 03:22 Inactive
The handleSearchClear function was incorrectly dispatching clearSearch()
action, which resets all search state including closing the sidebar.

The test 'clears search input without affecting search results sidebar'
expects that clicking the clear button should:
1. Clear the search input text
2. Keep the search results sidebar open

Fixed by removing dispatch(clearSearch()) and only clearing local state
(query and formSubmitted). This matches the original behavior before
the refactoring.

Fixes failing test in SearchResultsSidebar/index.browserspec.tsx
@TomWoodward TomWoodward temporarily deployed to rex-web-core-1456-refac-phztgv December 24, 2025 15:28 Inactive
@TomWoodward TomWoodward temporarily deployed to rex-web-core-1456-refac-phztgv December 24, 2025 16:28 Inactive
@RoyEJohnson RoyEJohnson force-pushed the core-1456-refactor-topbar-phase1 branch from 8b8a56d to 85e2795 Compare December 24, 2025 18:34
@TomWoodward TomWoodward temporarily deployed to rex-web-core-1456-refac-phztgv December 24, 2025 18:35 Inactive
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants