File size: 1,495 Bytes
8f9c4ef | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | import { create } from 'zustand';
import type { Room, RoomMember, UserPresence, UserCursor } from '../types';
interface RoomState {
currentRoom: Room | null;
members: RoomMember[];
presence: UserPresence[];
cursors: UserCursor[];
isConnected: boolean;
isJoining: boolean;
setRoom: (room: Room) => void;
setMembers: (members: RoomMember[]) => void;
addMember: (member: RoomMember) => void;
removeMember: (userId: string) => void;
setPresence: (presence: UserPresence[]) => void;
setCursors: (cursors: UserCursor[]) => void;
setConnected: (connected: boolean) => void;
setJoining: (joining: boolean) => void;
reset: () => void;
}
export const useRoomStore = create<RoomState>((set) => ({
currentRoom: null, members: [], presence: [], cursors: [],
isConnected: false, isJoining: false,
setRoom: (currentRoom) => set({ currentRoom }),
setMembers: (members) => set({ members }),
addMember: (member) => set((s) => ({ members: [...s.members.filter((m) => m.userId !== member.userId), member] })),
removeMember: (userId) => set((s) => ({ members: s.members.filter((m) => m.userId !== userId), cursors: s.cursors.filter((c) => c.userId !== userId) })),
setPresence: (presence) => set({ presence }),
setCursors: (cursors) => set({ cursors }),
setConnected: (isConnected) => set({ isConnected }),
setJoining: (isJoining) => set({ isJoining }),
reset: () => set({ currentRoom: null, members: [], presence: [], cursors: [], isConnected: false }),
}));
|