feat: 统计页面添加分类筛选与搜索优化

- 统计页面添加分类多选筛选功能
- 点击分类可跳转到搜索页面查看详情
- 搜索页面添加 URL 同步与自动搜索
- 提取 useCategories hook 消除重复代码
- 修复自定义分类图标显示问题
- 添加 useMemo 优化计算性能

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Developer
2026-03-17 13:35:40 +08:00
co-authored by Claude Opus 4.6
parent b5f9a238bb
commit a89d4f2402
6 changed files with 345 additions and 60 deletions
+5 -4
View File
@@ -1,16 +1,17 @@
import { useState, useEffect } from 'react';
import { useRouter } from 'next/router';
import { isLoggedIn, getRecurringBills, createRecurringBill, updateRecurringBill, deleteRecurringBill, applyRecurringBill } from '../lib/api';
import { DEFAULT_CATEGORIES } from '../lib/categories';
import AppShell from '../components/AppShell';
import { Icon } from '../components/icons';
import { useToast } from '../components/ToastProvider';
import { useConfirm } from '../components/ConfirmProvider';
import { useCategories } from '../hooks/useCategories';
export default function Recurring() {
const router = useRouter();
const { showToast } = useToast();
const { confirm } = useConfirm();
const { categories } = useCategories();
const [bills, setBills] = useState([]);
const [modalOpen, setModalOpen] = useState(false);
const [editingBill, setEditingBill] = useState(null);
@@ -197,8 +198,8 @@ export default function Recurring() {
</div>
<div className="bills-list">
{bills.map((bill) => {
const categories = DEFAULT_CATEGORIES[bill.type];
const cat = categories.find((item) => item.name === bill.category) || { icon: '📝' };
const categoryList = categories[bill.type];
const cat = categoryList.find((item) => item.name === bill.category) || { icon: '📝' };
return (
<button
key={bill.id}
@@ -304,7 +305,7 @@ export default function Recurring() {
<div className="form-group">
<label>分类</label>
<div className="category-grid">
{DEFAULT_CATEGORIES[formData.type].map((cat) => (
{categories[formData.type].map((cat) => (
<button
key={cat.name}
type="button"