Spaces:
Sleeping
Sleeping
| import { create } from 'zustand'; | |
| import { Socket } from 'socket.io-client'; | |
| interface WsStore { | |
| connected: boolean; | |
| reconnectAttempts: number; | |
| latency: number; | |
| socket: Socket | null; | |
| pendingQueue: { action: string; data: any }[]; | |
| currentProjectId: string | null; | |
| setConnected: (connected: boolean) => void; | |
| setSocket: (socket: Socket | null) => void; | |
| incrementReconnect: () => void; | |
| resetReconnect: () => void; | |
| setLatency: (ms: number) => void; | |
| pushPending: (action: string, data: any) => void; | |
| clearPending: () => void; | |
| shiftPending: () => { action: string; data: any } | undefined; | |
| getSocket: () => Socket | null; | |
| setCurrentProjectId: (id: string | null) => void; | |
| } | |
| export const useWsStore = create<WsStore>((set, get) => ({ | |
| connected: false, | |
| reconnectAttempts: 0, | |
| latency: 0, | |
| socket: null, | |
| pendingQueue: [], | |
| currentProjectId: null, | |
| setConnected: (connected) => set({ connected }), | |
| setSocket: (socket) => set({ socket }), | |
| incrementReconnect: () => | |
| set((s) => ({ reconnectAttempts: s.reconnectAttempts + 1 })), | |
| resetReconnect: () => set({ reconnectAttempts: 0 }), | |
| setLatency: (latency) => set({ latency }), | |
| pushPending: (action, data) => | |
| set((s) => { | |
| if (s.pendingQueue.length >= 50) return s; | |
| return { pendingQueue: [...s.pendingQueue, { action, data }] }; | |
| }), | |
| clearPending: () => set({ pendingQueue: [] }), | |
| shiftPending: () => { | |
| const state = get(); | |
| if (state.pendingQueue.length === 0) return undefined; | |
| const [first, ...rest] = state.pendingQueue; | |
| set({ pendingQueue: rest }); | |
| return first; | |
| }, | |
| getSocket: () => get().socket, | |
| setCurrentProjectId: (id) => set({ currentProjectId: id }), | |
| })); | |