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 ? (