import { useCallback, useEffect, useRef, useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import apiFetch from '@wordpress/api-fetch'; import type { BulkQuoteRequest, BulkQuoteResponse } from '../../../types'; import { getApiErrorMessage } from '../../../shared/utils'; import { addBreadcrumb, captureException, withSpan } from '../../../shared/sentry'; export interface UseBulkQuotesReturn { quotes: BulkQuoteResponse['quotes']; loading: boolean; error: string | null; fetchBulkQuotes: ( quoteRequests: BulkQuoteRequest[], currency?: string ) => Promise; reset: () => void; } export function useBulkQuotes(): UseBulkQuotesReturn { const [quotes, setQuotes] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const isMountedRef = useRef(true); useEffect(() => { isMountedRef.current = true; return () => { isMountedRef.current = false; }; }, []); const fetchBulkQuotes = useCallback( async ( quoteRequests: BulkQuoteRequest[], currency: string = 'GBP' ): Promise => { try { setLoading(true); setError(null); const response = (await withSpan( 'quotes.bulk', 'http.client', async () => apiFetch({ path: '/parcel2go-shipping/v1/quotes/bulk', method: 'POST', data: { quoteRequests, currency }, }) as Promise )) as BulkQuoteResponse; if (isMountedRef.current) { setQuotes(response?.quotes ?? []); } return response; } catch (e: unknown) { captureException(e instanceof Error ? e : new Error(String(e))); addBreadcrumb('Bulk quotes fetch failed', {}, 'api'); if (isMountedRef.current) { setQuotes([]); setError( getApiErrorMessage( e, __( 'Failed to load bulk quotes.', 'parcel2go-shipping' ) ) ); } return null; } finally { if (isMountedRef.current) { setLoading(false); } } }, [] ); const reset = useCallback(() => { setQuotes([]); setError(null); }, []); return { quotes, loading, error, fetchBulkQuotes, reset, }; }