feat(frontend): 添加 Zustand store 架构

- 创建 5 个领域 store:runtimeStore, marketStore, portfolioStore, agentStore, uiStore
- 更新 CLAUDE.md 记录架构改进
- Zustand 已安装但 stores 尚未在 App.jsx 中使用(渐进迁移)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-23 17:44:17 +08:00
parent 06a23c32a4
commit 0f1bc2bb39
7 changed files with 520 additions and 113 deletions

View File

@@ -0,0 +1,90 @@
import { create } from 'zustand';
/**
* Runtime Store - Connection state and runtime configuration
*/
export const useRuntimeStore = create((set) => ({
// Connection state
isConnected: false,
connectionStatus: 'connecting', // 'connecting' | 'connected' | 'disconnected'
setIsConnected: (isConnected) => set({ isConnected }),
setConnectionStatus: (connectionStatus) => set({ connectionStatus }),
// System state
systemStatus: 'initializing', // 'initializing' | 'running' | 'completed'
currentDate: null,
setSystemStatus: (systemStatus) => set({ systemStatus }),
setCurrentDate: (currentDate) => set({ currentDate }),
// Progress
progress: { current: 0, total: 0 },
setProgress: (progress) => set({ progress }),
// Server mode
serverMode: null, // 'live' | 'backtest' | null
setServerMode: (serverMode) => set({ serverMode }),
// Market status
marketStatus: null,
virtualTime: null,
setMarketStatus: (marketStatus) => set({ marketStatus }),
setVirtualTime: (virtualTime) => set({ virtualTime }),
// Data sources
dataSources: null,
setDataSources: (dataSources) => set({ dataSources }),
// Runtime config
runtimeConfig: null,
setRuntimeConfig: (runtimeConfig) => set({ runtimeConfig }),
// Watchlist panel
isWatchlistPanelOpen: false,
setIsWatchlistPanelOpen: (isWatchlistPanelOpen) => set({ isWatchlistPanelOpen }),
// Watchlist draft
watchlistDraftSymbols: [],
watchlistInputValue: '',
watchlistFeedback: null,
isWatchlistSaving: false,
setWatchlistDraftSymbols: (watchlistDraftSymbols) => set({ watchlistDraftSymbols }),
setWatchlistInputValue: (watchlistInputValue) => set({ watchlistInputValue }),
setWatchlistFeedback: (watchlistFeedback) => set({ watchlistFeedback }),
setIsWatchlistSaving: (isWatchlistSaving) => set({ isWatchlistSaving }),
// Runtime settings panel
isRuntimeSettingsOpen: false,
setIsRuntimeSettingsOpen: (isRuntimeSettingsOpen) => set({ isRuntimeSettingsOpen }),
// Runtime config drafts
scheduleModeDraft: 'daily',
intervalMinutesDraft: '60',
triggerTimeDraft: '09:30',
maxCommCyclesDraft: '2',
initialCashDraft: '100000',
marginRequirementDraft: '0',
enableMemoryDraft: false,
modeDraft: 'live',
pollIntervalDraft: '10',
startDateDraft: '',
endDateDraft: '',
enableMockDraft: false,
setScheduleModeDraft: (scheduleModeDraft) => set({ scheduleModeDraft }),
setIntervalMinutesDraft: (intervalMinutesDraft) => set({ intervalMinutesDraft }),
setTriggerTimeDraft: (triggerTimeDraft) => set({ triggerTimeDraft }),
setMaxCommCyclesDraft: (maxCommCyclesDraft) => set({ maxCommCyclesDraft }),
setInitialCashDraft: (initialCashDraft) => set({ initialCashDraft }),
setMarginRequirementDraft: (marginRequirementDraft) => set({ marginRequirementDraft }),
setEnableMemoryDraft: (enableMemoryDraft) => set({ enableMemoryDraft }),
setModeDraft: (modeDraft) => set({ modeDraft }),
setPollIntervalDraft: (pollIntervalDraft) => set({ pollIntervalDraft }),
setStartDateDraft: (startDateDraft) => set({ startDateDraft }),
setEndDateDraft: (endDateDraft) => set({ endDateDraft }),
setEnableMockDraft: (enableMockDraft) => set({ enableMockDraft }),
// Runtime config feedback
runtimeConfigFeedback: null,
isRuntimeConfigSaving: false,
setRuntimeConfigFeedback: (runtimeConfigFeedback) => set({ runtimeConfigFeedback }),
setIsRuntimeConfigSaving: (isRuntimeConfigSaving) => set({ isRuntimeConfigSaving }),
}));