|
|
|
|
@@ -9,6 +9,7 @@ import { getMyClerk } from '@/api/shop/shopStoreUser'
|
|
|
|
|
import { listUserRole } from '@/api/system/userRole'
|
|
|
|
|
import type { UserRole } from '@/api/system/userRole/model'
|
|
|
|
|
import { checkAndCacheVipStatus } from '@/utils/vip'
|
|
|
|
|
import { requireLogin } from '@/utils/login-guard'
|
|
|
|
|
import MemberBadge from '@/components/business/MemberBadge'
|
|
|
|
|
|
|
|
|
|
const UserPage: React.FC = () => {
|
|
|
|
|
@@ -98,13 +99,13 @@ const UserPage: React.FC = () => {
|
|
|
|
|
|
|
|
|
|
const menuItems = [
|
|
|
|
|
// 升级VIP会员 - 醒目样式
|
|
|
|
|
{ icon: '👑', label: '升级VIP会员', url: '/pages/user/vip-upgrade/index', highlight: true },
|
|
|
|
|
{ icon: '👑', label: '升级VIP会员', url: '/pages/user/vip-upgrade/index', highlight: true, requireAuth: true },
|
|
|
|
|
// 门店中心:仅门店店员/店长显示(通过 /shop/shop-store-user/my 判断)
|
|
|
|
|
...(storeInfo ? [{ icon: '🏪', label: '门店中心', url: '/pages/store/center/index' }] : []),
|
|
|
|
|
{ icon: '💰', label: '我的钱包', url: '/pages/user/wallet' },
|
|
|
|
|
{ icon: '📍', label: '收货地址', url: '/pages/user/address-list' },
|
|
|
|
|
...(storeInfo ? [{ icon: '🏪', label: '门店中心', url: '/pages/store/center/index', requireAuth: true }] : []),
|
|
|
|
|
{ icon: '💰', label: '我的钱包', url: '/pages/user/wallet', requireAuth: true },
|
|
|
|
|
{ icon: '📍', label: '收货地址', url: '/pages/user/address-list', requireAuth: true },
|
|
|
|
|
// { icon: '⭐', label: '积分明细', url: '/pages/user/points-record' },
|
|
|
|
|
{ icon: '❤️', label: '我的收藏', url: '/pages/user/favorite-list/index' },
|
|
|
|
|
{ icon: '❤️', label: '我的收藏', url: '/pages/user/favorite-list/index', requireAuth: true },
|
|
|
|
|
// { icon: '🕐', label: '浏览历史', url: '/pages/user/history-list/index' },
|
|
|
|
|
{ icon: '❓', label: '帮助中心', url: '/pages/user/help-center/index' },
|
|
|
|
|
// { icon: '🔔', label: '消息通知', url: '/pages/index/notification' },
|
|
|
|
|
@@ -121,6 +122,30 @@ const UserPage: React.FC = () => {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 菜单项点击:需要登录的功能先拦截
|
|
|
|
|
const handleMenuClick = (item: typeof menuItems[number]) => {
|
|
|
|
|
if ((item as any).requireAuth) {
|
|
|
|
|
if (!requireLogin({
|
|
|
|
|
action: 'viewOrder',
|
|
|
|
|
redirect: item.url,
|
|
|
|
|
content: `登录后才能使用「${item.label}」功能,是否前往登录?`
|
|
|
|
|
})) return
|
|
|
|
|
}
|
|
|
|
|
Taro.navigateTo({ url: item.url })
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 订单快捷入口点击:需要登录
|
|
|
|
|
const handleOrderTabClick = (status: number) => {
|
|
|
|
|
if (!requireLogin({ action: 'viewOrder', redirect: '/pages/order/list', content: '登录后才能查看订单,是否前往登录?' })) return
|
|
|
|
|
Taro.setStorageSync('order_tab', status)
|
|
|
|
|
Taro.switchTab({ url: '/pages/order/list' })
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const handleViewAllOrders = () => {
|
|
|
|
|
if (!requireLogin({ action: 'viewOrder', redirect: '/pages/order/list', content: '登录后才能查看订单,是否前往登录?' })) return
|
|
|
|
|
Taro.switchTab({ url: '/pages/order/list' })
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const loading = cardStatsLoading || orderStatsLoading
|
|
|
|
|
|
|
|
|
|
// 是否有可用数据(缓存或请求结果),用于判断是否需要骨架屏
|
|
|
|
|
@@ -232,7 +257,7 @@ const UserPage: React.FC = () => {
|
|
|
|
|
<View className='bg-white rounded-xl mx-3 mt-3 p-4'>
|
|
|
|
|
<View className='flex justify-between items-center mb-3'>
|
|
|
|
|
<Text className='text-base font-medium text-gray-800'>我的订单</Text>
|
|
|
|
|
<Text className='text-xs text-gray-400' onClick={() => Taro.switchTab({ url: '/pages/order/list' })}>
|
|
|
|
|
<Text className='text-xs text-gray-400' onClick={handleViewAllOrders}>
|
|
|
|
|
全部订单 {'>'}
|
|
|
|
|
</Text>
|
|
|
|
|
</View>
|
|
|
|
|
@@ -245,8 +270,8 @@ const UserPage: React.FC = () => {
|
|
|
|
|
].map(item => (
|
|
|
|
|
<View
|
|
|
|
|
key={item.status}
|
|
|
|
|
className='flex flex-col items-center py-2 relative'
|
|
|
|
|
onClick={() => { Taro.setStorageSync('order_tab', item.status); Taro.switchTab({ url: '/pages/order/list' }) }}
|
|
|
|
|
className={`flex flex-col items-center py-2 relative ${!isLoggedIn ? 'opacity-50' : ''}`}
|
|
|
|
|
onClick={() => handleOrderTabClick(item.status)}
|
|
|
|
|
>
|
|
|
|
|
<Text className='text-xl mb-1'>{item.icon}</Text>
|
|
|
|
|
<Text className='text-xs text-gray-600'>{item.label}</Text>
|
|
|
|
|
@@ -267,11 +292,11 @@ const UserPage: React.FC = () => {
|
|
|
|
|
key={item.label}
|
|
|
|
|
className={`flex items-center justify-between px-4 py-3 ${
|
|
|
|
|
idx < menuItems.length - 1 ? 'border-b border-gray-50' : ''
|
|
|
|
|
} ${(item as any).highlight ? '' : ''}`}
|
|
|
|
|
} ${(item as any).highlight ? '' : ''} ${!isLoggedIn && (item as any).requireAuth ? 'opacity-50' : ''}`}
|
|
|
|
|
style={(item as any).highlight ? {
|
|
|
|
|
background: 'linear-gradient(135deg, #fef3c7 0%, #fde68a 100%)',
|
|
|
|
|
} : {}}
|
|
|
|
|
onClick={() => Taro.navigateTo({ url: item.url })}
|
|
|
|
|
onClick={() => handleMenuClick(item)}
|
|
|
|
|
>
|
|
|
|
|
<View className='flex items-center gap-3'>
|
|
|
|
|
<View className={`${(item as any).highlight ? 'w-8 h-8 rounded-lg flex items-center justify-center text-lg' : ''}`} style={(item as any).highlight ? { background: 'linear-gradient(135deg, #f59e0b, #d97706)' } : {}}>
|
|
|
|
|
|