From 3eedbfc36a5ccdc00cef7e65b45f3aed5b69f232 Mon Sep 17 00:00:00 2001 From: waterWang <672684719@qq.com> Date: Sat, 22 Aug 2026 18:38:25 +0800 Subject: [PATCH] fix: use apiRequest wrapper with API_CONFIG.BASE_URL in usePortfolio hook Replace direct fetch() calls with the centralized apiRequest wrapper that provides BASE_URL prefixing, retry logic (3 attempts), and AbortController timeout. This fixes the hook for non-same-origin deployments where relative API paths silently fail. Closes #66 --- frontend/src/hooks/usePortfolio.ts | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/frontend/src/hooks/usePortfolio.ts b/frontend/src/hooks/usePortfolio.ts index 56dfa88..3b7d0ce 100644 --- a/frontend/src/hooks/usePortfolio.ts +++ b/frontend/src/hooks/usePortfolio.ts @@ -1,4 +1,5 @@ import { useState, useEffect } from 'react' +import { apiRequest, API_CONFIG } from '../config/api' interface PortfolioData { id: string @@ -13,6 +14,11 @@ interface PortfolioData { lastRebalance: string } +interface PortfolioResponse { + success: boolean + portfolio: PortfolioData +} + export const usePortfolio = (portfolioId?: string) => { const [portfolio, setPortfolio] = useState(null) const [loading, setLoading] = useState(true) @@ -24,10 +30,9 @@ export const usePortfolio = (portfolioId?: string) => { const fetchPortfolio = async () => { try { setLoading(true) - const response = await fetch(`/api/portfolio/${portfolioId}`) - if (!response.ok) throw new Error('Failed to fetch portfolio') - - const data = await response.json() + const data = await apiRequest( + API_CONFIG.ENDPOINTS.PORTFOLIO_DETAIL(portfolioId) + ) setPortfolio(data.portfolio) setError(null) } catch (err) { @@ -48,14 +53,15 @@ export const usePortfolio = (portfolioId?: string) => { if (!portfolioId) return try { - const response = await fetch(`/api/portfolio/${portfolioId}/rebalance`, { - method: 'POST' - }) - if (!response.ok) throw new Error('Rebalance failed') + await apiRequest( + API_CONFIG.ENDPOINTS.PORTFOLIO_REBALANCE(portfolioId), + { method: 'POST' } + ) // Refresh portfolio data - const portfolioResponse = await fetch(`/api/portfolio/${portfolioId}`) - const data = await portfolioResponse.json() + const data = await apiRequest( + API_CONFIG.ENDPOINTS.PORTFOLIO_DETAIL(portfolioId) + ) setPortfolio(data.portfolio) } catch (err) { setError(err instanceof Error ? err.message : 'Rebalance failed')