import { useState, useEffect, useCallback, useMemo, useRef } from 'react'; export function usePages( { skipLoading = false } = {} ) { const [ pages, setPages ] = useState( [] ); const [ isLoading, setIsLoading ] = useState( false ); const [ error, setError ] = useState( null ); const [ hasMorePages, setHasMorePages ] = useState( true ); const isLoaded = useRef( null ); const fetchAllPages = useCallback( async () => { if ( isLoaded.current ) { return; } try { setIsLoading( true ); setError( null ); setPages( [] ); setHasMorePages( true ); let currentPage = 1; let allPages = []; while ( hasMorePages || 1 === currentPage ) { const baseUrl = new URL( elementorCommon.config.urls.rest, window.location.origin ); const isPlainPermalink = 'index.php' === baseUrl.pathname.replace( /\//g, '' ); baseUrl.pathname = isPlainPermalink ? baseUrl.pathname : `${ baseUrl.pathname }wp/v2/pages`; if ( isPlainPermalink ) { baseUrl.searchParams.set( 'rest_route', '/wp/v2/pages' ); } baseUrl.searchParams.append( 'page', 1 ); baseUrl.searchParams.append( 'per_page', 100 ); baseUrl.searchParams.append( '_embed', '' ); const response = await fetch( baseUrl.toString(), { method: 'GET', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': window.wpApiSettings?.nonce || '', }, } ); if ( ! response.ok ) { throw new Error( `HTTP error! status: ${ response.status }` ); } const data = await response.json(); const totalPages = parseInt( response.headers.get( 'X-WP-TotalPages' ) || '1' ); allPages = [ ...allPages, ...data ]; if ( totalPages <= currentPage ) { setHasMorePages( false ); break; } currentPage++; } setPages( allPages ); isLoaded.current = true; } catch ( err ) { setError( err.message ); } finally { setIsLoading( false ); } }, [ hasMorePages ] ); const refreshPages = useCallback( () => { fetchAllPages(); }, [ fetchAllPages ] ); const pageOptions = useMemo( () => { return pages.map( ( page ) => ( { value: page.id, label: page.title.rendered } ) ); }, [ pages ] ); useEffect( () => { if ( ! skipLoading ) { fetchAllPages(); } }, [ skipLoading ] ); return { pages, isLoading, error, refreshPages, pageOptions, isLoaded: isLoaded.current, }; }