import { useState, useEffect } from 'react'; import { useRouter } from 'next/router'; import { isLoggedIn, searchRecords } from '../lib/api'; import { DEFAULT_CATEGORIES } from '../lib/categories'; import AppShell from '../components/AppShell'; import { Icon } from '../components/icons'; import { useToast } from '../components/ToastProvider'; export default function Search() { const router = useRouter(); const { showToast } = useToast(); const [keyword, setKeyword] = useState(''); const [results, setResults] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { if (!isLoggedIn()) { router.push('/login'); } }, [router]); const handleSearch = async (e) => { e.preventDefault(); if (!keyword.trim()) { showToast('请输入搜索关键词', { tone: 'info' }); return; } setLoading(true); try { const data = await searchRecords(keyword); setResults(data); } catch (err) { console.error(err); showToast(err.message, { tone: 'error' }); } finally { setLoading(false); } }; const formatMoney = (num) => (num || 0).toFixed(2); const groupedResults = results.reduce((groups, record) => { const date = record.date.split(' ')[0]; if (!groups[date]) groups[date] = []; groups[date].push(record); return groups; }, {}); const sortedDates = Object.keys(groupedResults).sort((a, b) => b.localeCompare(a)); const totalIncome = results.filter((record) => record.type === 'income').reduce((sum, record) => sum + record.amount, 0); const totalExpense = results.filter((record) => record.type === 'expense').reduce((sum, record) => sum + record.amount, 0); const totalBalance = totalIncome - totalExpense; const actions = ( router.push('/settings')}> ); return ( setKeyword(e.target.value)} placeholder="搜索分类或备注..." autoFocus disabled={loading} /> {loading ? ( 搜索中... ) : '搜索'} {results.length > 0 ? ( <> 收入 +{formatMoney(totalIncome)} 支出 -{formatMoney(totalExpense)} 结余 {formatMoney(totalBalance)} 找到 {results.length} 条记录 > ) : null} {loading ? ( 搜索中... ) : results.length > 0 ? ( {sortedDates.map((date) => ( {new Date(date).toLocaleDateString('zh-CN', { month: 'short', day: 'numeric', weekday: 'short' })} {groupedResults[date].map((record) => { const categories = DEFAULT_CATEGORIES[record.type]; const cat = categories.find((item) => item.name === record.category) || { icon: '📝' }; return ( {cat.icon} {record.category} {record.note && {record.note}} {record.type === 'income' ? '+' : '-'} {formatMoney(record.amount)} ); })} ))} ) : keyword ? ( 未找到相关记录 ) : ( 输入关键词开始搜索 )} ); }
未找到相关记录
输入关键词开始搜索