forked from gxwebsoft/mp-10550
- 重构 invite 工具函数,增强参数解析能力 - 添加参数调试工具,便于排查问题 - 优化用户登录后的邀请关系处理流程- 调整 API调用,统一使用 dealerId替代 refereeId - 移除未使用的导入和冗余代码
137 lines
3.3 KiB
TypeScript
137 lines
3.3 KiB
TypeScript
import { useState, useEffect, useCallback } from 'react'
|
|
import {pageShopUserCoupon} from "@/api/shop/shopUserCoupon";
|
|
import {pageShopGift} from "@/api/shop/shopGift";
|
|
import {useUser} from "@/hooks/useUser";
|
|
import Taro from '@tarojs/taro'
|
|
import {getUserInfo} from "@/api/layout";
|
|
|
|
interface UserData {
|
|
balance: number
|
|
points: number
|
|
coupons: number
|
|
giftCards: number
|
|
orders: {
|
|
pending: number
|
|
paid: number
|
|
shipped: number
|
|
completed: number
|
|
refund: number
|
|
}
|
|
}
|
|
|
|
interface UseUserDataReturn {
|
|
data: UserData | null
|
|
loading: boolean
|
|
error: string | null
|
|
refresh: () => Promise<void>
|
|
updateBalance: (newBalance: number) => void
|
|
updatePoints: (newPoints: number) => void
|
|
}
|
|
|
|
export const useUserData = (): UseUserDataReturn => {
|
|
const [data, setData] = useState<UserData | null>(null)
|
|
const [loading, setLoading] = useState(true)
|
|
const [error, setError] = useState<string | null>(null)
|
|
|
|
// 获取用户数据
|
|
const fetchUserData = useCallback(async () => {
|
|
try {
|
|
setLoading(true)
|
|
setError(null)
|
|
|
|
if(!Taro.getStorageSync('UserId')){
|
|
return;
|
|
}
|
|
|
|
// 并发请求所有数据
|
|
const [userDataRes, couponsRes, giftCardsRes] = await Promise.all([
|
|
getUserInfo(),
|
|
pageShopUserCoupon({ page: 1, limit: 1, userId: Taro.getStorageSync('UserId'), status: 0}),
|
|
pageShopGift({ page: 1, limit: 1, userId: Taro.getStorageSync('UserId'), status: 0})
|
|
])
|
|
|
|
const newData: UserData = {
|
|
balance: userDataRes?.balance || 0.00,
|
|
points: userDataRes?.points || 0,
|
|
coupons: couponsRes?.count || 0,
|
|
giftCards: giftCardsRes?.count || 0,
|
|
orders: {
|
|
pending: 0,
|
|
paid: 0,
|
|
shipped: 0,
|
|
completed: 0,
|
|
refund: 0
|
|
}
|
|
}
|
|
|
|
setData(newData)
|
|
} catch (err) {
|
|
setError(err instanceof Error ? err.message : '获取用户数据失败')
|
|
} finally {
|
|
setLoading(false)
|
|
}
|
|
}, [])
|
|
|
|
// 刷新数据
|
|
const refresh = useCallback(async () => {
|
|
await fetchUserData()
|
|
}, [fetchUserData])
|
|
|
|
// 更新余额(本地更新,避免频繁请求)
|
|
const updateBalance = useCallback((newBalance: number) => {
|
|
setData(prev => prev ? { ...prev, balance: newBalance } : null)
|
|
}, [])
|
|
|
|
// 更新积分
|
|
const updatePoints = useCallback((newPoints: number) => {
|
|
setData(prev => prev ? { ...prev, points: newPoints } : null)
|
|
}, [])
|
|
|
|
// 初始化加载
|
|
useEffect(() => {
|
|
fetchUserData().then()
|
|
}, [fetchUserData])
|
|
|
|
return {
|
|
data,
|
|
loading,
|
|
error,
|
|
refresh,
|
|
updateBalance,
|
|
updatePoints
|
|
}
|
|
}
|
|
|
|
// 轻量级版本 - 只获取基础数据
|
|
export const useUserBasicData = () => {
|
|
const {user} = useUser()
|
|
const [balance, setBalance] = useState<number>(0)
|
|
const [points, setPoints] = useState<number>(0)
|
|
const [loading, setLoading] = useState(false)
|
|
|
|
const fetchBasicData = useCallback(async () => {
|
|
setLoading(true)
|
|
try {
|
|
setBalance(user?.balance || 0)
|
|
setPoints(user?.points || 0)
|
|
} catch (error) {
|
|
console.error('获取基础数据失败:', error)
|
|
} finally {
|
|
setLoading(false)
|
|
}
|
|
}, [])
|
|
|
|
useEffect(() => {
|
|
fetchBasicData().then()
|
|
}, [fetchBasicData])
|
|
|
|
return {
|
|
balance,
|
|
points,
|
|
loading,
|
|
refresh: fetchBasicData,
|
|
updateBalance: setBalance,
|
|
updatePoints: setPoints
|
|
}
|
|
}
|