/** * BoostMedia AI Content Generator Admin - useApi Hook * * @package BoostMedia_AI * @license GPL-2.0-or-later */ import { useState, useCallback } from 'react' import type { ApiResponse, ApiError } from '../types' interface UseApiState { data: T | null loading: boolean error: ApiError | null } interface UseApiReturn extends UseApiState { execute: (...args: unknown[]) => Promise | null> reset: () => void } export function useApi( apiFunction: (...args: unknown[]) => Promise> ): UseApiReturn { const [state, setState] = useState>({ data: null, loading: false, error: null, }) const execute = useCallback( async (...args: unknown[]): Promise | null> => { setState((prev) => ({ ...prev, loading: true, error: null })) try { const response = await apiFunction(...args) setState({ data: response.data, loading: false, error: null }) return response } catch (err) { const error = err as ApiError setState({ data: null, loading: false, error }) return null } }, [apiFunction] ) const reset = useCallback(() => { setState({ data: null, loading: false, error: null }) }, []) return { ...state, execute, reset } }