refactor(api): 精简并移除多余的API接口和类型定义

- 移除多余的统计、预算、AI设置、用户偏好、数据同步及AI处理相关类型定义
- 删除大量未使用的API请求函数,简化导出接口
- 保留核心的用户认证、交易记录、聊天消息和账单提醒相关接口
- 优化App组件状态初始化,改为从localStorage加载持久化数据,避免重复请求
- VoiceInput组件重构,改用持续监听及更健壮的权限和错误处理逻辑
- 优化语音识别启动和停止机制,提升用户体验和错误恢复能力
- 更新依赖顺序,无功能性变更
This commit is contained in:
2026-01-23 11:15:25 +08:00
parent d83f34becc
commit d4aa67b97d
5 changed files with 193 additions and 402 deletions

78
App.tsx
View File

@@ -5,7 +5,6 @@ import LedgerPage from './components/LedgerPage';
import StatisticsPage from './components/StatisticsPage';
import EditTransactionModal from './components/EditTransactionModal';
import { Transaction, TransactionType, Message, ExpenseCategory, IncomeCategory, BillReminder } from './types';
import { v4 as uuidv4 } from 'uuid';
import {
deleteMessage, deleteTransaction, updateTransaction, createTransaction, createMessage, getMessages, getTransactions, loginOrRegister, getUserProfile,
createReminder, getReminders, updateReminder, toggleReminder, deleteReminder
@@ -84,10 +83,40 @@ const getCategoryIcon = (category: string, type: TransactionType) => {
const App: React.FC = () => {
const [activeTab, setActiveTab] = useState<Tab>('chat');
const [messages, setMessages] = useState<Message[]>([]);
const [transactions, setTransactions] = useState<Transaction[]>([]);
const [budgets, setBudgets] = useState<Record<string, number>>({ '总预算': 3000 });
const [reminders, setReminders] = useState<BillReminder[]>([]);
const [messages, setMessages] = useState<Message[]>(() => {
try {
const saved = localStorage.getItem('cui_messages');
return saved ? JSON.parse(saved) : [];
} catch (e) {
return [];
}
});
const [transactions, setTransactions] = useState<Transaction[]>(() => {
try {
const saved = localStorage.getItem('cui_transactions');
return saved ? JSON.parse(saved) : [];
} catch (e) {
return [];
}
});
const [budgets, setBudgets] = useState<Record<string, number>>(() => {
try {
const saved = localStorage.getItem('cui_budget');
if (saved) {
const parsed = JSON.parse(saved);
return typeof parsed === 'number' ? { '总预算': parsed } : parsed;
}
} catch (e) {}
return { '总预算': 3000 };
});
const [reminders, setReminders] = useState<BillReminder[]>(() => {
try {
const saved = localStorage.getItem('cui_reminders');
return saved ? JSON.parse(saved) : [];
} catch (e) {
return [];
}
});
const [inputText, setInputText] = useState('');
const [isProcessing, setIsProcessing] = useState(false);
const [editingTransaction, setEditingTransaction] = useState<Transaction | null>(null);
@@ -96,9 +125,23 @@ const App: React.FC = () => {
const [token, setToken] = useState<string | null>(null);
const [userInfo, setUserInfo] = useState<any>(null);
const [aiSettings, setAiSettings] = useState<AISettings>(DEFAULT_AI_SETTINGS);
const [aiSettings, setAiSettings] = useState<AISettings>(() => {
try {
const saved = localStorage.getItem('cui_ai_settings');
return saved ? JSON.parse(saved) : DEFAULT_AI_SETTINGS;
} catch (e) {
return DEFAULT_AI_SETTINGS;
}
});
const [isSettingsOpen, setIsSettingsOpen] = useState(false);
const [customPreset, setCustomPreset] = useState({ name: '自定义', description: '可以根据你喜欢的方式设定助手的语气和风格' });
const [customPreset, setCustomPreset] = useState(() => {
try {
const saved = localStorage.getItem('cui_custom_preset_info');
return saved ? JSON.parse(saved) : { name: '自定义', description: '可以根据你喜欢的方式设定助手的语气和风格' };
} catch (e) {
return { name: '自定义', description: '可以根据你喜欢的方式设定助手的语气和风格' };
}
});
const fileInputRef = useRef<HTMLInputElement>(null);
const avatarInputRef = useRef<HTMLInputElement>(null);
@@ -177,19 +220,6 @@ const App: React.FC = () => {
};
const loadInitialData = async () => {
const storedBudget = localStorage.getItem('cui_budget');
const storedReminders = localStorage.getItem('cui_reminders');
const storedAiSettings = localStorage.getItem('cui_ai_settings');
const storedCustom = localStorage.getItem('cui_custom_preset_info');
if (storedBudget) {
const parsed = JSON.parse(storedBudget);
setBudgets(typeof parsed === 'number' ? { '总预算': parsed } : parsed);
}
if (storedReminders) setReminders(JSON.parse(storedReminders));
if (storedAiSettings) setAiSettings(JSON.parse(storedAiSettings));
if (storedCustom) setCustomPreset(JSON.parse(storedCustom));
// 从数据库获取交易列表
try {
const response = await getTransactions();
@@ -238,7 +268,7 @@ const App: React.FC = () => {
console.log('消息列表已从数据库加载:', messagesFromDB.length);
} else {
// 如果数据库中没有消息,显示初始欢迎消息
const aiName = storedAiSettings ? JSON.parse(storedAiSettings).name : '崔经理';
const aiName = aiSettings.name;
setMessages([{
id: 'init',
role: 'assistant',
@@ -254,7 +284,7 @@ const App: React.FC = () => {
setMessages(JSON.parse(storedMessages));
} else {
// 显示初始欢迎消息
const aiName = storedAiSettings ? JSON.parse(storedAiSettings).name : '崔经理';
const aiName = aiSettings.name;
setMessages([{
id: 'init',
role: 'assistant',
@@ -452,7 +482,7 @@ const App: React.FC = () => {
}
};
const handleSendMessage = async (text: string, imageBase64?: string, mimeType?: string) => {
const handleSendMessage = React.useCallback(async (text: string, imageBase64?: string, mimeType?: string) => {
if (!text.trim() && !imageBase64) return;
// 先保存用户消息到数据库
@@ -542,7 +572,7 @@ const App: React.FC = () => {
} finally {
setIsProcessing(false);
}
};
}, [aiSettings, transactions, messages]);
const handleKeyPress = (e: React.KeyboardEvent) => {
if (e.key === 'Enter' && !e.shiftKey) {