更新ios
This commit is contained in:
@@ -3,14 +3,22 @@
|
|||||||
*
|
*
|
||||||
* 使用 /api/stock/{code}/quote-detail 接口获取完整行情数据
|
* 使用 /api/stock/{code}/quote-detail 接口获取完整行情数据
|
||||||
* 供 StockQuoteCard 内部使用
|
* 供 StockQuoteCard 内部使用
|
||||||
|
*
|
||||||
|
* 支持实时刷新功能:
|
||||||
|
* - 默认每 5 秒自动刷新股价数据
|
||||||
|
* - 可通过 refreshInterval 参数自定义刷新间隔
|
||||||
|
* - 设置 refreshInterval 为 0 可禁用自动刷新
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { useState, useEffect, useCallback } from 'react';
|
import { useState, useEffect, useCallback, useRef } from 'react';
|
||||||
import { logger } from '@utils/logger';
|
import { logger } from '@utils/logger';
|
||||||
import axios from '@utils/axiosConfig';
|
import axios from '@utils/axiosConfig';
|
||||||
import type { StockQuoteCardData } from '../types';
|
import type { StockQuoteCardData } from '../types';
|
||||||
import type { BasicInfo } from '../../CompanyOverview/types';
|
import type { BasicInfo } from '../../CompanyOverview/types';
|
||||||
|
|
||||||
|
// 默认刷新间隔(毫秒)
|
||||||
|
const DEFAULT_REFRESH_INTERVAL = 5000;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将 API 响应数据转换为 StockQuoteCard 所需格式
|
* 将 API 响应数据转换为 StockQuoteCard 所需格式
|
||||||
*/
|
*/
|
||||||
@@ -52,6 +60,11 @@ const transformQuoteData = (apiData: any, stockCode: string): StockQuoteCardData
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
interface UseStockQuoteDataOptions {
|
||||||
|
/** 自动刷新间隔(毫秒),默认 5000ms,设为 0 禁用自动刷新 */
|
||||||
|
refreshInterval?: number;
|
||||||
|
}
|
||||||
|
|
||||||
interface UseStockQuoteDataResult {
|
interface UseStockQuoteDataResult {
|
||||||
quoteData: StockQuoteCardData | null;
|
quoteData: StockQuoteCardData | null;
|
||||||
basicInfo: BasicInfo | null;
|
basicInfo: BasicInfo | null;
|
||||||
@@ -63,10 +76,17 @@ interface UseStockQuoteDataResult {
|
|||||||
/**
|
/**
|
||||||
* 股票行情数据获取 Hook
|
* 股票行情数据获取 Hook
|
||||||
* 合并获取行情数据和基本信息
|
* 合并获取行情数据和基本信息
|
||||||
|
* 支持定时自动刷新实现实时行情显示
|
||||||
*
|
*
|
||||||
* @param stockCode - 股票代码
|
* @param stockCode - 股票代码
|
||||||
|
* @param options - 配置选项
|
||||||
|
* @param options.refreshInterval - 自动刷新间隔(毫秒),默认 5000,设为 0 禁用
|
||||||
*/
|
*/
|
||||||
export const useStockQuoteData = (stockCode?: string): UseStockQuoteDataResult => {
|
export const useStockQuoteData = (
|
||||||
|
stockCode?: string,
|
||||||
|
options: UseStockQuoteDataOptions = {}
|
||||||
|
): UseStockQuoteDataResult => {
|
||||||
|
const { refreshInterval = DEFAULT_REFRESH_INTERVAL } = options;
|
||||||
const [quoteData, setQuoteData] = useState<StockQuoteCardData | null>(null);
|
const [quoteData, setQuoteData] = useState<StockQuoteCardData | null>(null);
|
||||||
const [basicInfo, setBasicInfo] = useState<BasicInfo | null>(null);
|
const [basicInfo, setBasicInfo] = useState<BasicInfo | null>(null);
|
||||||
const [quoteLoading, setQuoteLoading] = useState(false);
|
const [quoteLoading, setQuoteLoading] = useState(false);
|
||||||
@@ -186,6 +206,51 @@ export const useStockQuoteData = (stockCode?: string): UseStockQuoteDataResult =
|
|||||||
};
|
};
|
||||||
}, [stockCode]);
|
}, [stockCode]);
|
||||||
|
|
||||||
|
// 静默刷新行情数据(不触发 loading 状态,用于定时刷新)
|
||||||
|
const silentRefreshRef = useRef<() => Promise<void>>();
|
||||||
|
silentRefreshRef.current = async () => {
|
||||||
|
if (!stockCode) return;
|
||||||
|
|
||||||
|
const baseCode = stockCode.split('.')[0];
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 只刷新行情数据,不刷新基本信息(基本信息变化不频繁)
|
||||||
|
const quoteResult = await axios.get(`/api/stock/${baseCode}/quote-detail`);
|
||||||
|
|
||||||
|
if (quoteResult.data.success && quoteResult.data.data) {
|
||||||
|
const transformedData = transformQuoteData(quoteResult.data.data, stockCode);
|
||||||
|
setQuoteData(transformedData);
|
||||||
|
logger.debug('useStockQuoteData', '静默刷新行情成功', {
|
||||||
|
stockCode,
|
||||||
|
price: transformedData?.currentPrice,
|
||||||
|
changePercent: transformedData?.changePercent,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
// 静默刷新失败时不更新 error 状态,保持之前的数据显示
|
||||||
|
logger.warn('useStockQuoteData', '静默刷新失败', err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 定时自动刷新行情数据
|
||||||
|
useEffect(() => {
|
||||||
|
// 禁用刷新或没有股票代码时不启动定时器
|
||||||
|
if (!refreshInterval || refreshInterval <= 0 || !stockCode) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.debug('useStockQuoteData', '启动定时刷新', { stockCode, refreshInterval });
|
||||||
|
|
||||||
|
const intervalId = setInterval(() => {
|
||||||
|
silentRefreshRef.current?.();
|
||||||
|
}, refreshInterval);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
logger.debug('useStockQuoteData', '停止定时刷新', { stockCode });
|
||||||
|
clearInterval(intervalId);
|
||||||
|
};
|
||||||
|
}, [stockCode, refreshInterval]);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
quoteData,
|
quoteData,
|
||||||
basicInfo,
|
basicInfo,
|
||||||
|
|||||||
Reference in New Issue
Block a user