rushe-ui/src/pages/user/mine/PartnerCenterPage.tsx

117 lines
4.8 KiB
TypeScript
Raw Normal View History

import { useNavigate } from 'react-router-dom'
import { motion } from 'framer-motion'
import { ChevronLeft, Users, TrendingUp, Gift, ChevronRight, Share2 } from 'lucide-react'
import { partnerInfo, partnerProducts } from '@/mock/mineData'
export default function PartnerCenterPage() {
const navigate = useNavigate()
return (
<div className="min-h-screen bg-gray-50">
<div className="bg-white px-4 py-3 flex items-center border-b border-gray-100">
<button onClick={() => navigate(-1)} className="p-1">
<ChevronLeft size={24} className="text-gray-600" />
</button>
<h1 className="flex-1 text-center font-bold text-gray-800"></h1>
<div className="w-6" />
</div>
<div className="p-4">
<div className="bg-gradient-to-br from-primary-500 to-primary-600 rounded-xl p-4 text-white mb-4">
<div className="flex items-center gap-2 mb-4">
<Users size={20} />
<span className="font-medium">{partnerInfo.level}</span>
</div>
<div className="grid grid-cols-3 gap-4 text-center">
<div>
<p className="text-2xl font-bold">¥{partnerInfo.commission.toLocaleString()}</p>
<p className="text-xs text-primary-100"></p>
</div>
<div>
<p className="text-2xl font-bold">{partnerInfo.orders}</p>
<p className="text-xs text-primary-100">广</p>
</div>
<div>
<p className="text-2xl font-bold">{partnerInfo.teamSize}</p>
<p className="text-xs text-primary-100"></p>
</div>
</div>
</div>
<div className="bg-white rounded-xl shadow-sm p-4 mb-4">
<div className="flex items-center justify-between mb-3">
<h3 className="font-bold text-gray-800"></h3>
<span className="text-sm text-gray-500">
¥{partnerInfo.monthlyProgress.toLocaleString()} / ¥{partnerInfo.monthlyTarget.toLocaleString()}
</span>
</div>
<div className="h-3 bg-gray-100 rounded-full overflow-hidden">
<motion.div
className="h-full bg-gradient-to-r from-primary-400 to-primary-500 rounded-full"
initial={{ width: 0 }}
animate={{ width: `${(partnerInfo.monthlyProgress / partnerInfo.monthlyTarget) * 100}%` }}
transition={{ duration: 1, ease: 'easeOut' }}
/>
</div>
<p className="text-xs text-gray-400 mt-2">
¥{(partnerInfo.monthlyTarget - partnerInfo.monthlyProgress).toLocaleString()}
</p>
</div>
<div className="bg-white rounded-xl shadow-sm p-4 mb-4">
<div className="flex items-center justify-between mb-3">
<h3 className="font-bold text-gray-800">广</h3>
<ChevronRight size={20} className="text-gray-400" />
</div>
<div className="space-y-3">
{partnerProducts.map((product) => (
<motion.div
key={product.id}
className="flex gap-3 p-3 bg-gray-50 rounded-xl"
whileTap={{ scale: 0.98 }}
>
<img
src={product.image}
alt={product.title}
className="w-16 h-16 rounded-lg object-cover"
/>
<div className="flex-1">
<h4 className="font-medium text-gray-800 text-sm">{product.title}</h4>
<p className="text-xs text-gray-500 mt-1"> {product.sales} </p>
<p className="text-sm text-primary-500 font-medium mt-1">
¥{product.commission.toLocaleString()}
</p>
</div>
<motion.button
className="self-center p-2 rounded-full bg-primary-50 text-primary-500"
whileTap={{ scale: 0.9 }}
>
<Share2 size={18} />
</motion.button>
</motion.div>
))}
</div>
</div>
<div className="grid grid-cols-2 gap-4">
<motion.div
className="bg-white rounded-xl shadow-sm p-4 text-center"
whileTap={{ scale: 0.98 }}
>
<TrendingUp size={24} className="mx-auto text-primary-500 mb-2" />
<p className="text-sm text-gray-600">广</p>
</motion.div>
<motion.div
className="bg-white rounded-xl shadow-sm p-4 text-center"
whileTap={{ scale: 0.98 }}
>
<Gift size={24} className="mx-auto text-primary-500 mb-2" />
<p className="text-sm text-gray-600"></p>
</motion.div>
</div>
</div>
</div>
)
}