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