2025-01-22 19:24:52 +08:00
|
|
|
import { useState, useMemo } from 'react';
|
2025-01-24 15:05:03 +08:00
|
|
|
import { motion, AnimatePresence } from 'framer-motion';
|
2025-01-22 19:24:52 +08:00
|
|
|
import { Leader } from './types';
|
|
|
|
|
import { leaders } from './mock';
|
2025-01-22 23:19:58 +08:00
|
|
|
import Header from './header';
|
|
|
|
|
import Filter from './filter';
|
2025-01-24 15:05:03 +08:00
|
|
|
import LeaderCard from './LeaderCard';
|
2025-01-24 17:37:51 +08:00
|
|
|
import { Spin, Empty } from 'antd';
|
|
|
|
|
import { api } from 'packages/client/dist';
|
2025-01-22 19:24:52 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
export default function WriteLetterPage() {
|
2025-01-24 17:37:51 +08:00
|
|
|
|
2025-01-22 19:24:52 +08:00
|
|
|
const [selectedLeader, setSelectedLeader] = useState<Leader | null>(null);
|
|
|
|
|
const [searchQuery, setSearchQuery] = useState('');
|
|
|
|
|
const [selectedDivision, setSelectedDivision] = useState<string>('all');
|
|
|
|
|
|
|
|
|
|
const filteredLeaders = useMemo(() => {
|
|
|
|
|
return leaders.filter(leader => {
|
|
|
|
|
const matchesSearch = leader.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
|
|
|
|
|
leader.rank.toLowerCase().includes(searchQuery.toLowerCase());
|
|
|
|
|
const matchesDivision = selectedDivision === 'all' || leader.division === selectedDivision;
|
|
|
|
|
return matchesSearch && matchesDivision;
|
|
|
|
|
});
|
|
|
|
|
}, [searchQuery, selectedDivision]);
|
|
|
|
|
|
|
|
|
|
return (
|
2025-01-24 15:05:03 +08:00
|
|
|
<div className="min-h-screen bg-gradient-to-b from-slate-50 to-slate-100">
|
|
|
|
|
<Header />
|
|
|
|
|
|
|
|
|
|
<div className="container mx-auto px-4 py-8">
|
|
|
|
|
<Filter />
|
2025-01-22 19:24:52 +08:00
|
|
|
|
2025-01-24 15:05:03 +08:00
|
|
|
<AnimatePresence>
|
|
|
|
|
{filteredLeaders.length > 0 ? (
|
|
|
|
|
<motion.div
|
|
|
|
|
className="grid grid-cols-1 gap-6"
|
|
|
|
|
initial={{ opacity: 0 }}
|
|
|
|
|
animate={{ opacity: 1 }}
|
|
|
|
|
exit={{ opacity: 0 }}
|
|
|
|
|
>
|
|
|
|
|
{filteredLeaders.map((leader) => (
|
|
|
|
|
<LeaderCard
|
|
|
|
|
key={leader.id}
|
|
|
|
|
leader={leader}
|
|
|
|
|
isSelected={selectedLeader?.id === leader.id}
|
|
|
|
|
onSelect={() => setSelectedLeader(leader)}
|
|
|
|
|
/>
|
|
|
|
|
))}
|
|
|
|
|
</motion.div>
|
|
|
|
|
) : (
|
2025-01-22 19:24:52 +08:00
|
|
|
<motion.div
|
2025-01-24 15:05:03 +08:00
|
|
|
className="text-center py-12"
|
|
|
|
|
initial={{ opacity: 0 }}
|
|
|
|
|
animate={{ opacity: 1 }}
|
|
|
|
|
exit={{ opacity: 0 }}
|
2025-01-22 19:24:52 +08:00
|
|
|
>
|
2025-01-24 17:37:51 +08:00
|
|
|
<Empty></Empty>
|
2025-01-22 19:24:52 +08:00
|
|
|
</motion.div>
|
2025-01-24 15:05:03 +08:00
|
|
|
)}
|
|
|
|
|
</AnimatePresence>
|
2025-01-22 19:24:52 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|