useFetch.js
2 days ago
useFileUploader.js
2 days ago
useModalState.js
2 days ago
useSearchCombobox.js
2 days ago
useFetch.js
33 lines
| 1 | /** |
| 2 | * WordPress Dependencies |
| 3 | */ |
| 4 | import apiFetch from '@wordpress/api-fetch'; |
| 5 | import { useState, useEffect } from '@wordpress/element'; |
| 6 | |
| 7 | export function useFetch( endpoint, extraArgs = {} ) { |
| 8 | const [ data, setData ] = useState( [] ); |
| 9 | const [ isLoading, setIsLoading ] = useState( true ); |
| 10 | const [ error, setError ] = useState( null ); |
| 11 | |
| 12 | useEffect( () => { |
| 13 | if ( ! endpoint ) { |
| 14 | return; |
| 15 | } |
| 16 | |
| 17 | const isExternal = endpoint.startsWith( 'http' ); |
| 18 | |
| 19 | let args = isExternal ? { url: endpoint } : { path: endpoint }; |
| 20 | if ( extraArgs && Object.keys( extraArgs ).length > 0 ) { |
| 21 | args = { ...args, method: 'POST', data: extraArgs }; |
| 22 | } |
| 23 | |
| 24 | setIsLoading( true ); |
| 25 | apiFetch( args ) |
| 26 | .then( ( json ) => setData( json ) ) |
| 27 | .catch( ( err ) => setError( err ) ) |
| 28 | .finally( () => setIsLoading( false ) ); |
| 29 | }, [ endpoint, extraArgs ] ); |
| 30 | |
| 31 | return { data, isLoading, error }; |
| 32 | } |
| 33 |