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