Files
glt-taro/src/hooks/useOrderStats.ts
赵忠林 415e05cc4e feat(user): 添加用户卡片统计数据接口和优化性能
- 新增 UserCardStats 接口定义余额/积分/优惠券/礼品卡数据结构
- 实现 getUserCardStats 函数聚合返回用户卡片统计数据
- 替换原有多个独立请求为单一聚合接口提升性能
- 修改 useUserData Hook 使用新聚合接口并调整数据类型
- 移除废弃的 pageShopOrder 和相关 API 导入
- 优化用户登录后自动刷新卡片统计数据逻辑
2026-01-20 12:47:22 +08:00

117 lines
2.8 KiB
TypeScript

import { useState, useEffect, useCallback } from 'react';
import { getUserOrderStats, UserOrderStats } from '@/api/user';
import Taro from '@tarojs/taro';
/**
* 订单统计Hook
* 用于管理用户订单各状态的数量统计
*/
export const useOrderStats = () => {
const [orderStats, setOrderStats] = useState<UserOrderStats>({
pending: 0, // 待付款
paid: 0, // 待发货
shipped: 0, // 待收货
completed: 0, // 已完成
refund: 0, // 退货/售后
total: 0 // 总订单数
});
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
/**
* 获取订单统计数据
*/
const fetchOrderStats = useCallback(async (showToast = false) => {
try {
setLoading(true);
setError(null);
if(!Taro.getStorageSync('UserId')){
return false;
}
// 聚合接口:一次请求返回各状态数量(后台按用户做了缓存)
const stats = await getUserOrderStats();
setOrderStats({
pending: stats?.pending || 0,
paid: stats?.paid || 0,
shipped: stats?.shipped || 0,
completed: stats?.completed || 0,
refund: stats?.refund || 0,
total: stats?.total || 0
})
if (showToast) {
Taro.showToast({
title: '数据已更新',
icon: 'success',
duration: 1500
});
}
} catch (err: any) {
const errorMessage = err.message || '获取订单统计失败';
setError(errorMessage);
console.error('获取订单统计失败:', err);
if (showToast) {
Taro.showToast({
title: errorMessage,
icon: 'error',
duration: 2000
});
}
} finally {
setLoading(false);
}
}, []);
/**
* 刷新订单统计数据
*/
const refreshOrderStats = useCallback(() => {
return fetchOrderStats(true);
}, [fetchOrderStats]);
/**
* 获取指定状态的订单数量
*/
const getOrderCount = useCallback((status: keyof UserOrderStats) => {
return orderStats[status] || 0;
}, [orderStats]);
/**
* 检查是否有待处理的订单
*/
const hasPendingOrders = useCallback(() => {
return orderStats.pending > 0 || orderStats.paid > 0 || orderStats.shipped > 0;
}, [orderStats]);
/**
* 获取总的待处理订单数量
*/
const getTotalPendingCount = useCallback(() => {
return orderStats.pending + orderStats.paid + orderStats.shipped;
}, [orderStats]);
// 组件挂载时自动获取数据
useEffect(() => {
fetchOrderStats();
}, [fetchOrderStats]);
return {
orderStats,
loading,
error,
fetchOrderStats,
refreshOrderStats,
getOrderCount,
hasPendingOrders,
getTotalPendingCount
};
};
export default useOrderStats;