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((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 }), }));