Move React hooks out of component modules#7942
Conversation
|
|
There was a problem hiding this comment.
Pull request overview
Refactors Primer React exports to satisfy React Refresh “component-only exports” expectations by moving hook implementations (and shared experimental Tabs state/types) out of component modules while preserving the public root exports.
Changes:
- Added standalone theme hook/context modules (
useTheme.ts,ThemeContext.ts) and updated ThemeProvider consumers to import hooks from the new module. - Extracted experimental Tabs hook logic/context/types into dedicated modules and adjusted
experimental/Tabsexports accordingly. - Extracted
useConfirmintoConfirmationDialog/useConfirm.tsand updated imports/exports, tests, and stories.
Show a summary per file
| File | Description |
|---|---|
| packages/react/src/useTheme.ts | New module exporting useTheme/useColorSchemeVar hooks separate from ThemeProvider. |
| packages/react/src/ThemeProvider.tsx | Uses extracted ThemeContext + useTheme from new module; stops exporting hooks. |
| packages/react/src/ThemeContext.ts | New shared ThemeProvider context module. |
| packages/react/src/stories/ThemeProvider.stories.tsx | Updates story imports to use the new useTheme module. |
| packages/react/src/index.ts | Re-exports theme hooks from useTheme and useConfirm from its new module. |
| packages/react/src/experimental/Tabs/useTabs.ts | New internal hook for accessing Tabs context. |
| packages/react/src/experimental/Tabs/useTabPanel.ts | New extracted useTabPanel hook module. |
| packages/react/src/experimental/Tabs/useTabList.ts | New extracted useTabList hook module. |
| packages/react/src/experimental/Tabs/useTab.ts | New extracted useTab hook module. |
| packages/react/src/experimental/Tabs/types.ts | New shared types for Tabs component + hooks. |
| packages/react/src/experimental/Tabs/TabsContext.ts | New Tabs context module. |
| packages/react/src/experimental/Tabs/Tabs.tsx | Keeps components in module; imports hooks/context/types from new modules. |
| packages/react/src/experimental/Tabs/Tabs.examples.stories.tsx | Updates imports to use extracted Tabs hooks. |
| packages/react/src/experimental/Tabs/index.ts | Re-exports Tabs component and hooks/types from their new modules. |
| packages/react/src/ConfirmationDialog/useConfirm.ts | New extracted useConfirm hook module. |
| packages/react/src/ConfirmationDialog/ConfirmationDialog.tsx | Removes hook implementation; leaves component-only exports. |
| packages/react/src/ConfirmationDialog/ConfirmationDialog.test.tsx | Updates test imports to use extracted useConfirm. |
| packages/react/src/ConfirmationDialog/ConfirmationDialog.features.stories.tsx | Updates story imports to use extracted useConfirm. |
| packages/react/src/tests/ThemeProvider.test.tsx | Updates test imports to use new useTheme module. |
Copilot's findings
- Files reviewed: 19/19 changed files
- Comments generated: 2
| export type TabListHookProps<T extends HTMLElement> = TabListProps & { | ||
| /** Optional ref to use for the tablist. If none is provided, one will be generated automatically */ | ||
| ref?: React.RefObject<T> | ||
| } |
|
|
||
| const onKeyDown = (event: React.KeyboardEvent) => { | ||
| const {current: tablist} = ref | ||
| if (tablist === null) { |
Closes #
No linked issue.
Moves exported React hooks and shared Tabs state out of component implementation files so component modules can satisfy React Refresh component-only exports.
Changelog
New
ConfirmationDialog/useConfirm.ts.ThemeContext.tsanduseTheme.tsfor Primer React theme state access.Changed
useTab,useTabList, anduseTabPanelmodules.Removed
Rollout strategy
Testing & Reviewing
Review that hook modules follow
use{Name}.tsnaming and that Tabs component behavior is unchanged.Merge checklist