File size: 1,180 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
import { create } from 'zustand';
import type { ChatMessage } from '../types';

interface ChatState {
  messages: ChatMessage[];
  typingUsers: Array<{ userId: string; userName: string }>;
  isOpen: boolean;
  unreadCount: number;

  addMessage: (message: ChatMessage) => void;
  setMessages: (messages: ChatMessage[]) => void;
  setTypingUser: (userId: string, userName: string, isTyping: boolean) => void;
  setOpen: (open: boolean) => void;
  reset: () => void;
}

export const useChatStore = create<ChatState>((set) => ({
  messages: [], typingUsers: [], isOpen: false, unreadCount: 0,

  addMessage: (message) => set((s) => ({ messages: [...s.messages, message], unreadCount: s.isOpen ? 0 : s.unreadCount + 1 })),
  setMessages: (messages) => set({ messages }),
  setTypingUser: (userId, userName, isTyping) => set((s) => ({
    typingUsers: isTyping
      ? [...s.typingUsers.filter((t) => t.userId !== userId), { userId, userName }]
      : s.typingUsers.filter((t) => t.userId !== userId),
  })),
  setOpen: (isOpen) => set({ isOpen, unreadCount: isOpen ? 0 : undefined } as any),
  reset: () => set({ messages: [], typingUsers: [], isOpen: false, unreadCount: 0 }),
}));