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 = ( ); return (
setKeyword(e.target.value)} placeholder="搜索分类或备注..." autoFocus disabled={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 ? (

未找到相关记录

) : (

输入关键词开始搜索

)}
); }