From b14f6606f2e38c77f48dac0d9e37eeaf63ee9a1d Mon Sep 17 00:00:00 2001
From: 12975 <1297598740@qq.com>
Date: Sun, 1 Feb 2026 19:50:26 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=82=A8=E8=93=84?=
=?UTF-8?q?=E7=BD=90=E5=AD=98=E5=8F=96=E6=AC=BE=E6=A8=A1=E6=80=81=E6=A1=86?=
=?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E9=87=91=E9=A2=9D=E8=BE=93=E5=85=A5?=
=?UTF-8?q?=E3=80=81=E5=BF=AB=E9=80=9F=E9=80=89=E6=8B=A9=E3=80=81=E8=BF=9B?=
=?UTF-8?q?=E5=BA=A6=E5=B1=95=E7=A4=BA=E5=8F=8A=E8=B4=A6=E6=88=B7=E4=BD=99?=
=?UTF-8?q?=E9=A2=9D=E6=A0=A1=E9=AA=8C=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package-lock.json | 27 +++++++++++++++++++
package.json | 1 +
src/App.tsx | 2 ++
.../PiggyBankTransactionModal.tsx | 15 +++++------
4 files changed, 36 insertions(+), 9 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index d297282..714581f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,6 +21,7 @@
"react": "^19.2.0",
"react-confetti": "^6.4.0",
"react-dom": "^19.2.0",
+ "react-hot-toast": "^2.6.0",
"react-icons": "^5.5.0",
"react-markdown": "^10.1.0",
"react-router-dom": "^7.12.0",
@@ -3938,6 +3939,15 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/goober": {
+ "version": "2.1.18",
+ "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.18.tgz",
+ "integrity": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "csstype": "^3.0.10"
+ }
+ },
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
@@ -5867,6 +5877,23 @@
"react": "^19.2.3"
}
},
+ "node_modules/react-hot-toast": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.6.0.tgz",
+ "integrity": "sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==",
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.1.3",
+ "goober": "^2.1.16"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "react": ">=16",
+ "react-dom": ">=16"
+ }
+ },
"node_modules/react-icons": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz",
diff --git a/package.json b/package.json
index 8e47c5c..dcbaab0 100644
--- a/package.json
+++ b/package.json
@@ -29,6 +29,7 @@
"react": "^19.2.0",
"react-confetti": "^6.4.0",
"react-dom": "^19.2.0",
+ "react-hot-toast": "^2.6.0",
"react-icons": "^5.5.0",
"react-markdown": "^10.1.0",
"react-router-dom": "^7.12.0",
diff --git a/src/App.tsx b/src/App.tsx
index 81b2f33..b01fa81 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -4,6 +4,7 @@ import { router } from './router';
import { ThemeProvider, PrivacyProvider, NotificationProvider, GuideProvider, useAutoTokenRefresh } from './hooks';
import { SettingsProvider } from './contexts/SettingsContext';
+import { Toaster } from 'react-hot-toast';
/**
* App Content Component
@@ -28,6 +29,7 @@ function App() {
+
diff --git a/src/components/budget/PiggyBankTransactionModal/PiggyBankTransactionModal.tsx b/src/components/budget/PiggyBankTransactionModal/PiggyBankTransactionModal.tsx
index 33f9585..8de3aa6 100644
--- a/src/components/budget/PiggyBankTransactionModal/PiggyBankTransactionModal.tsx
+++ b/src/components/budget/PiggyBankTransactionModal/PiggyBankTransactionModal.tsx
@@ -4,6 +4,7 @@
*/
import React, { useState } from 'react';
+import toast from 'react-hot-toast';
import type { PiggyBank, Account } from '../../../types';
import { formatCurrency } from '../../../utils/format';
import { Icon } from '@iconify/react';
@@ -28,7 +29,6 @@ export const PiggyBankTransactionModal: React.FC
}) => {
const [amount, setAmount] = useState('');
const [note, setNote] = useState('');
- const [error, setError] = useState('');
const isDeposit = type === 'deposit';
const title = isDeposit ? '存入' : '取出';
@@ -38,7 +38,6 @@ export const PiggyBankTransactionModal: React.FC
const handleAmountChange = (e: React.ChangeEvent) => {
const value = e.target.value;
setAmount(value);
- setError('');
};
const handleSubmit = (e: React.FormEvent) => {
@@ -48,17 +47,17 @@ export const PiggyBankTransactionModal: React.FC
// Validation
if (!amount || isNaN(numAmount) || numAmount <= 0) {
- setError('请输入有效的金额');
+ toast.error('请输入有效的金额');
return;
}
if (!isDeposit && numAmount > piggyBank.currentAmount) {
- setError('取出金额不能超过当前余额');
+ toast.error('取出金额不能超过当前余额');
return;
}
if (isDeposit && linkedAccount && numAmount > linkedAccount.balance) {
- setError(`账户余额不足 (可用: ${formatCurrency(linkedAccount.balance, linkedAccount.currency)})`);
+ toast.error(`账户余额不足 (可用: ${formatCurrency(linkedAccount.balance, linkedAccount.currency)})`);
return;
}
@@ -67,7 +66,6 @@ export const PiggyBankTransactionModal: React.FC
const handleQuickAmount = (value: number) => {
setAmount(value.toString());
- setError('');
};
// Quick amount buttons
@@ -163,8 +161,7 @@ export const PiggyBankTransactionModal: React.FC
id="amount"
value={amount}
onChange={handleAmountChange}
- className={`piggy-bank-transaction-modal__input ${error ? 'piggy-bank-transaction-modal__input--error' : ''
- }`}
+ className="piggy-bank-transaction-modal__input"
placeholder="0.00"
step="0.01"
min="0"
@@ -172,7 +169,7 @@ export const PiggyBankTransactionModal: React.FC
disabled={isLoading}
autoFocus
/>
- {error && {error}}
+ {/* Error handled by toast */}
{linkedAccount ? (