// src/views/Company/components/CompanyOverview/hooks/useShareholderData.ts // 股权结构数据 Hook - 用于股权结构 Tab import { useState, useEffect, useCallback } from "react"; import { logger } from "@utils/logger"; import { getApiBase } from "@utils/apiConfig"; import type { ActualControl, Concentration, Shareholder } from "../types"; const API_BASE_URL = getApiBase(); interface ApiResponse { success: boolean; data: T; } interface UseShareholderDataResult { actualControl: ActualControl[]; concentration: Concentration[]; topShareholders: Shareholder[]; topCirculationShareholders: Shareholder[]; loading: boolean; error: string | null; } /** * 股权结构数据 Hook * @param stockCode - 股票代码 */ export const useShareholderData = (stockCode?: string): UseShareholderDataResult => { const [actualControl, setActualControl] = useState([]); const [concentration, setConcentration] = useState([]); const [topShareholders, setTopShareholders] = useState([]); const [topCirculationShareholders, setTopCirculationShareholders] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const loadData = useCallback(async () => { if (!stockCode) return; setLoading(true); setError(null); try { const [actualRes, concentrationRes, shareholdersRes, circulationRes] = await Promise.all([ fetch(`${API_BASE_URL}/api/stock/${stockCode}/actual-control`).then((r) => r.json() ) as Promise>, fetch(`${API_BASE_URL}/api/stock/${stockCode}/concentration`).then((r) => r.json() ) as Promise>, fetch(`${API_BASE_URL}/api/stock/${stockCode}/top-shareholders?limit=10`).then((r) => r.json() ) as Promise>, fetch(`${API_BASE_URL}/api/stock/${stockCode}/top-circulation-shareholders?limit=10`).then((r) => r.json() ) as Promise>, ]); if (actualRes.success) setActualControl(actualRes.data); if (concentrationRes.success) setConcentration(concentrationRes.data); if (shareholdersRes.success) setTopShareholders(shareholdersRes.data); if (circulationRes.success) setTopCirculationShareholders(circulationRes.data); } catch (err) { logger.error("useShareholderData", "loadData", err, { stockCode }); setError("加载股权结构数据失败"); } finally { setLoading(false); } }, [stockCode]); useEffect(() => { loadData(); }, [loadData]); return { actualControl, concentration, topShareholders, topCirculationShareholders, loading, error, }; };