RealBlocks / client /src /store /wsStore.ts
incognitolm
1
6919b2c
Raw
History Blame Contribute Delete
1.72 kB
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 }),
}));