feat: new file
This commit is contained in:
82
src/store/situationStore.ts
Normal file
82
src/store/situationStore.ts
Normal file
@@ -0,0 +1,82 @@
|
||||
import { create } from 'zustand'
|
||||
import type { MilitarySituation } from '@/data/mockData'
|
||||
import { INITIAL_MOCK_DATA } from '@/data/mockData'
|
||||
|
||||
interface SituationState {
|
||||
situation: MilitarySituation
|
||||
isConnected: boolean
|
||||
lastError: string | null
|
||||
setSituation: (situation: MilitarySituation) => void
|
||||
updateFromWebSocket: (partial: Partial<MilitarySituation>) => void
|
||||
setConnected: (connected: boolean) => void
|
||||
setLastError: (error: string | null) => void
|
||||
}
|
||||
|
||||
export const useSituationStore = create<SituationState>((set) => ({
|
||||
situation: INITIAL_MOCK_DATA,
|
||||
isConnected: false,
|
||||
lastError: null,
|
||||
|
||||
setSituation: (situation) => set({ situation }),
|
||||
|
||||
updateFromWebSocket: (partial) =>
|
||||
set((state) => ({
|
||||
situation: {
|
||||
...state.situation,
|
||||
...partial,
|
||||
lastUpdated: new Date().toISOString(),
|
||||
},
|
||||
})),
|
||||
|
||||
setConnected: (isConnected) => set({ isConnected }),
|
||||
|
||||
setLastError: (lastError) => set({ lastError }),
|
||||
}))
|
||||
|
||||
// WebSocket mock logic - simulates real-time updates without actual simulation
|
||||
// In production, replace with actual WebSocket connection
|
||||
let mockWsInterval: ReturnType<typeof setInterval> | null = null
|
||||
|
||||
export function startWebSocketMock(): void {
|
||||
if (mockWsInterval) return
|
||||
|
||||
const store = useSituationStore.getState()
|
||||
store.setConnected(true)
|
||||
store.setLastError(null)
|
||||
|
||||
mockWsInterval = setInterval(() => {
|
||||
const { situation } = useSituationStore.getState()
|
||||
const now = Date.now()
|
||||
|
||||
// Simulate minor fluctuations in numbers (display-only, no logic)
|
||||
const fluctuation = () => Math.floor(Math.random() * 3) - 1
|
||||
|
||||
useSituationStore.getState().updateFromWebSocket({
|
||||
usForces: {
|
||||
...situation.usForces,
|
||||
summary: {
|
||||
...situation.usForces.summary,
|
||||
totalAssets: Math.max(40, situation.usForces.summary.totalAssets + fluctuation()),
|
||||
},
|
||||
},
|
||||
recentUpdates: [
|
||||
{
|
||||
id: `u-${now}`,
|
||||
timestamp: new Date(now).toISOString(),
|
||||
category: 'intel',
|
||||
summary: '例行状态同步 - 各系统正常',
|
||||
severity: 'low',
|
||||
},
|
||||
...situation.recentUpdates.slice(0, 3),
|
||||
],
|
||||
})
|
||||
}, 15000) // Update every 15 seconds
|
||||
}
|
||||
|
||||
export function stopWebSocketMock(): void {
|
||||
if (mockWsInterval) {
|
||||
clearInterval(mockWsInterval)
|
||||
mockWsInterval = null
|
||||
}
|
||||
useSituationStore.getState().setConnected(false)
|
||||
}
|
||||
Reference in New Issue
Block a user