|
|
@ -3,21 +3,17 @@ import { View, Text } from '@tarojs/components' |
|
|
|
import { |
|
|
|
Empty, |
|
|
|
Tabs, |
|
|
|
Progress, |
|
|
|
Loading, |
|
|
|
PullToRefresh, |
|
|
|
Card, |
|
|
|
Button, |
|
|
|
DatePicker |
|
|
|
} from '@nutui/nutui-react-taro' |
|
|
|
import { |
|
|
|
User, |
|
|
|
Star, |
|
|
|
TrendingUp, |
|
|
|
ArrowUp, |
|
|
|
Calendar, |
|
|
|
Share, |
|
|
|
Target, |
|
|
|
Award |
|
|
|
Gift |
|
|
|
} from '@nutui/icons-react-taro' |
|
|
|
import Taro from '@tarojs/taro' |
|
|
|
import { useDealerUser } from '@/hooks/useDealerUser' |
|
|
@ -28,15 +24,14 @@ import { |
|
|
|
} from '@/api/invite' |
|
|
|
import type { |
|
|
|
InviteStats, |
|
|
|
InviteRecord, |
|
|
|
InviteRanking |
|
|
|
InviteRecord |
|
|
|
} from '@/api/invite' |
|
|
|
import { businessGradients } from '@/styles/gradients' |
|
|
|
import {InviteRanking} from "@/api/invite/model"; |
|
|
|
|
|
|
|
const InviteStatsPage: React.FC = () => { |
|
|
|
const [activeTab, setActiveTab] = useState<string>('stats') |
|
|
|
const [loading, setLoading] = useState<boolean>(false) |
|
|
|
const [refreshing, setRefreshing] = useState<boolean>(false) |
|
|
|
const [inviteStats, setInviteStats] = useState<InviteStats | null>(null) |
|
|
|
const [inviteRecords, setInviteRecords] = useState<InviteRecord[]>([]) |
|
|
|
const [ranking, setRanking] = useState<InviteRanking[]>([]) |
|
|
@ -50,7 +45,7 @@ const InviteStatsPage: React.FC = () => { |
|
|
|
try { |
|
|
|
setLoading(true) |
|
|
|
const stats = await getInviteStats(dealerUser.userId) |
|
|
|
setInviteStats(stats) |
|
|
|
stats && setInviteStats(stats) |
|
|
|
} catch (error) { |
|
|
|
console.error('获取邀请统计失败:', error) |
|
|
|
Taro.showToast({ |
|
|
@ -93,21 +88,19 @@ const InviteStatsPage: React.FC = () => { |
|
|
|
|
|
|
|
// 刷新数据
|
|
|
|
const handleRefresh = async () => { |
|
|
|
setRefreshing(true) |
|
|
|
await Promise.all([ |
|
|
|
fetchInviteStats(), |
|
|
|
fetchInviteRecords(), |
|
|
|
fetchRanking() |
|
|
|
]) |
|
|
|
setRefreshing(false) |
|
|
|
} |
|
|
|
|
|
|
|
// 初始化数据
|
|
|
|
useEffect(() => { |
|
|
|
if (dealerUser?.userId) { |
|
|
|
fetchInviteStats() |
|
|
|
fetchInviteRecords() |
|
|
|
fetchRanking() |
|
|
|
fetchInviteStats().then() |
|
|
|
fetchInviteRecords().then() |
|
|
|
fetchRanking().then() |
|
|
|
} |
|
|
|
}, [fetchInviteStats, fetchInviteRecords, fetchRanking]) |
|
|
|
|
|
|
@ -145,7 +138,7 @@ const InviteStatsPage: React.FC = () => { |
|
|
|
) : inviteStats ? ( |
|
|
|
<View className="grid grid-cols-2 gap-4"> |
|
|
|
<View className="text-center p-4 bg-blue-50 rounded-xl"> |
|
|
|
<TrendingUp size="24" className="text-blue-500 mx-auto mb-2" /> |
|
|
|
<ArrowUp size="24" className="text-blue-500 mx-auto mb-2" /> |
|
|
|
<Text className="text-2xl font-bold text-blue-600"> |
|
|
|
{inviteStats.totalInvites || 0} |
|
|
|
</Text> |
|
|
@ -252,7 +245,7 @@ const InviteStatsPage: React.FC = () => { |
|
|
|
const renderRanking = () => ( |
|
|
|
<View className="px-4"> |
|
|
|
<View className="mb-4"> |
|
|
|
<Tabs value={dateRange} onChange={setDateRange}> |
|
|
|
<Tabs value={dateRange} onChange={() => setDateRange}> |
|
|
|
<Tabs.TabPane title="日榜" value="day" /> |
|
|
|
<Tabs.TabPane title="周榜" value="week" /> |
|
|
|
<Tabs.TabPane title="月榜" value="month" /> |
|
|
@ -266,7 +259,7 @@ const InviteStatsPage: React.FC = () => { |
|
|
|
<View className="p-4 flex items-center"> |
|
|
|
<View className="flex items-center justify-center w-8 h-8 rounded-full bg-blue-100 mr-3"> |
|
|
|
{index < 3 ? ( |
|
|
|
<Award size="16" className={index === 0 ? 'text-yellow-500' : index === 1 ? 'text-gray-400' : 'text-orange-400'} /> |
|
|
|
<Gift size="16" className={index === 0 ? 'text-yellow-500' : index === 1 ? 'text-gray-400' : 'text-orange-400'} /> |
|
|
|
) : ( |
|
|
|
<Text className="text-sm font-bold text-gray-600">{index + 1}</Text> |
|
|
|
)} |
|
|
@ -321,7 +314,7 @@ const InviteStatsPage: React.FC = () => { |
|
|
|
|
|
|
|
{/* 标签页 */} |
|
|
|
<View className="px-4 mb-4"> |
|
|
|
<Tabs value={activeTab} onChange={setActiveTab}> |
|
|
|
<Tabs value={activeTab} onChange={() => setActiveTab}> |
|
|
|
<Tabs.TabPane title="统计概览" value="stats" /> |
|
|
|
<Tabs.TabPane title="邀请记录" value="records" /> |
|
|
|
<Tabs.TabPane title="排行榜" value="ranking" /> |
|
|
@ -329,7 +322,7 @@ const InviteStatsPage: React.FC = () => { |
|
|
|
</View> |
|
|
|
|
|
|
|
{/* 内容区域 */} |
|
|
|
<PullToRefresh onRefresh={handleRefresh} loading={refreshing}> |
|
|
|
<PullToRefresh onRefresh={handleRefresh}> |
|
|
|
<View className="pb-6"> |
|
|
|
{activeTab === 'stats' && renderStatsOverview()} |
|
|
|
{activeTab === 'records' && renderInviteRecords()} |
|
|
|