+
- { isOpen && (
-
{ children }
+ { isOpen && children && (
+
{ children }
) }
);
diff --git a/modules/ppcp-settings/resources/js/hooks/useAccordionState.js b/modules/ppcp-settings/resources/js/hooks/useAccordionState.js
new file mode 100644
index 000000000..f54018262
--- /dev/null
+++ b/modules/ppcp-settings/resources/js/hooks/useAccordionState.js
@@ -0,0 +1,39 @@
+import { useEffect, useState } from '@wordpress/element';
+
+const checkIfCurrentTab = ( id ) => {
+ return id && window.location.hash === `#${ id }`;
+};
+
+const determineInitialState = ( id, initiallyOpen ) => {
+ if ( initiallyOpen !== null ) {
+ return initiallyOpen;
+ }
+ return checkIfCurrentTab( id );
+};
+
+export function useAccordionState( { id = '', initiallyOpen = null } ) {
+ const [ isOpen, setIsOpen ] = useState(
+ determineInitialState( id, initiallyOpen )
+ );
+
+ useEffect( () => {
+ const handleHashChange = () => {
+ if ( checkIfCurrentTab( id ) ) {
+ setIsOpen( true );
+ }
+ };
+
+ window.addEventListener( 'hashchange', handleHashChange );
+ return () => {
+ window.removeEventListener( 'hashchange', handleHashChange );
+ };
+ }, [ id ] );
+
+ const toggleOpen = ( ev ) => {
+ setIsOpen( ! isOpen );
+ ev?.preventDefault();
+ return false;
+ };
+
+ return { isOpen, toggleOpen };
+}