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