feat(store): 新增门店中心及VIP会员升级功能
- 个人信息页新增门店名称和门店地址展示,支持异步加载与只读显示 - 用户信息卡片整体改为绿色渐变背景,添加光晕和白色边框样式 - 新增升级VIP会员入口,突出展示并添加推荐标签 - 新建VIP会员升级页面,包含门店信息表单和VIP权益预览 - 提交升级申请调用新增api,支持状态检测表单只读 - 门店中心页面重构,简化订单管理,新增功能卡片及VIP审核入口 - 页面加载校验店员身份,非店员拒绝访问并提示 - 购物相关页面和组件全面支持VIP会员价格优先显示dealerPrice - 新增ShopDealerApply模型门店相关字段,丰富会员申请数据记录
This commit is contained in:
48
src/hooks/useVipStatus.ts
Normal file
48
src/hooks/useVipStatus.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
import { useState, useEffect, useCallback } from 'react'
|
||||
import { checkAndCacheVipStatus, getVipStatusFromCache } from '@/utils/vip'
|
||||
import { useUser } from '@/hooks/useUser'
|
||||
|
||||
/**
|
||||
* useVipStatus - 判断当前用户是否为 VIP 会员
|
||||
*
|
||||
* 工作原理:
|
||||
* 1. 首先从 localStorage 缓存快速读取(即时返回)
|
||||
* 2. 异步调用后端接口验证并更新缓存
|
||||
*
|
||||
* 使用场景:
|
||||
* - 商品详情页价格展示
|
||||
* - 结算页价格计算
|
||||
* - 任何需要判断 VIP 身份的页面
|
||||
*/
|
||||
export const useVipStatus = () => {
|
||||
const { user, isLoggedIn } = useUser()
|
||||
const [isVip, setIsVip] = useState<boolean>(getVipStatusFromCache())
|
||||
const [loading, setLoading] = useState(false)
|
||||
|
||||
const refresh = useCallback(async () => {
|
||||
if (!isLoggedIn) {
|
||||
setIsVip(false)
|
||||
return
|
||||
}
|
||||
setLoading(true)
|
||||
try {
|
||||
const userId = (user as any)?.userId || (user as any)?.id
|
||||
const result = await checkAndCacheVipStatus(userId)
|
||||
setIsVip(result)
|
||||
} catch {
|
||||
// 保持缓存值
|
||||
} finally {
|
||||
setLoading(false)
|
||||
}
|
||||
}, [isLoggedIn, user])
|
||||
|
||||
useEffect(() => {
|
||||
if (isLoggedIn) {
|
||||
refresh()
|
||||
} else {
|
||||
setIsVip(false)
|
||||
}
|
||||
}, [isLoggedIn, refresh])
|
||||
|
||||
return { isVip, loading, refresh }
|
||||
}
|
||||
Reference in New Issue
Block a user