2024-10-28 17:56:23 +01:00
import { useCallback , useEffect , useState } 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
import { getQuery , updateQueryString } from '../../utils/navigation' ;
2024-10-24 13:54:50 +02:00
2024-10-28 15:47:53 +01:00
const TabNavigation = ( { tabs } ) => {
2024-10-28 16:58:50 +01:00
const { panel } = getQuery ( ) ;
2024-10-28 15:47:53 +01:00
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-24 13:54:50 +02:00
2024-10-28 16:58:50 +01:00
const getValidInitialPanel = ( ) => {
if ( ! panel || ! isValidTab ( tabs , panel ) ) {
return tabs [ 0 ] . name ;
}
return panel ;
} ;
const [ activePanel , setActivePanel ] = useState ( getValidInitialPanel ) ;
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 } ` ) ;
}
} ,
[ tabs ]
) ;
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 }
2024-10-24 13:54:50 +02:00
>
2025-01-10 13:57:53 +01:00
{ ( { Component } ) => Component }
2024-10-24 13:54:50 +02:00
< / T a b P a n e l >
) ;
} ;
export default TabNavigation ;