2025-01-28 08:59:06 +01:00
import { useCallback , useEffect } from '@wordpress/element' ;
2025-01-02 13:55:32 +01:00
// TODO: Migrate to Tabs (TabPanel v2) once its API is publicly available, as it provides programmatic tab switching support: https://github.com/WordPress/gutenberg/issues/52997
2024-10-24 13:54:50 +02:00
import { TabPanel } from '@wordpress/components' ;
2024-12-13 12:40:09 +01:00
2025-01-28 08:59:06 +01:00
import { updateQueryString } from '../../utils/navigation' ;
2024-10-28 15:47:53 +01:00
2025-01-29 17:12:06 +01:00
const TabBar = ( { tabs , activePanel , setActivePanel } ) => {
2024-10-28 16:58:50 +01:00
const isValidTab = ( tabsList , checkTab ) => {
return tabsList . some ( ( tab ) => tab . name === checkTab ) ;
2024-10-28 15:47:53 +01:00
} ;
2024-10-28 17:56:23 +01:00
const updateActivePanel = useCallback (
2024-10-28 16:58:50 +01:00
( tabName ) => {
if ( isValidTab ( tabs , tabName ) ) {
setActivePanel ( tabName ) ;
} else {
console . warn ( ` Invalid tab name: ${ tabName } ` ) ;
}
} ,
2025-01-28 08:59:06 +01:00
[ tabs , setActivePanel ]
2024-10-28 16:58:50 +01:00
) ;
2024-10-28 15:58:40 +01:00
useEffect ( ( ) => {
2024-12-13 12:40:09 +01:00
updateQueryString ( { panel : activePanel } ) ;
2024-10-28 15:58:40 +01:00
} , [ activePanel ] ) ;
2024-10-24 13:54:50 +02:00
return (
< TabPanel
2024-10-28 15:56:11 +01:00
className = { ` ppcp-r-tabs ${ activePanel } ` }
initialTabName = { activePanel }
2024-10-28 17:56:23 +01:00
onSelect = { updateActivePanel }
2024-10-28 15:47:53 +01:00
tabs = { tabs }
2025-04-01 16:10:32 +02:00
orientation = "horizontal"
selectOnMove = { false }
2024-10-24 13:54:50 +02:00
>
2025-04-01 16:10:32 +02:00
{ ( tab ) => (
< div
className = { ` ppcp-r-tabpanel-content ppcp-r-tabpanel- ${ tab . name } ` }
>
{ tab . render ? tab . render ( ) : '' }
< / d i v >
) }
2024-10-24 13:54:50 +02:00
< / T a b P a n e l >
) ;
} ;
2025-01-29 17:12:06 +01:00
export default TabBar ;