| import type { ChatMessage } from '@music-together/shared' |
| import { LIMITS } from '@music-together/shared' |
| import { create } from 'zustand' |
|
|
| interface ChatStore { |
| messages: ChatMessage[] |
| unreadCount: number |
| isChatOpen: boolean |
|
|
| addMessage: (message: ChatMessage) => void |
| setMessages: (messages: ChatMessage[]) => void |
| setIsChatOpen: (open: boolean) => void |
| clearUnread: () => void |
| reset: () => void |
| } |
|
|
| const getInitialChatOpen = () => typeof window !== 'undefined' && !window.matchMedia('(orientation: portrait)').matches |
|
|
| export const useChatStore = create<ChatStore>((set) => ({ |
| messages: [], |
| unreadCount: 0, |
| isChatOpen: getInitialChatOpen(), |
|
|
| addMessage: (message) => |
| set((state) => { |
| const next = [...state.messages, message] |
| return { |
| messages: next.length > LIMITS.CHAT_HISTORY_MAX ? next.slice(-LIMITS.CHAT_HISTORY_MAX) : next, |
| unreadCount: state.isChatOpen || message.type === 'system' ? state.unreadCount : state.unreadCount + 1, |
| } |
| }), |
| setMessages: (messages) => set({ messages, unreadCount: 0 }), |
| setIsChatOpen: (open) => |
| set((state) => ({ |
| isChatOpen: open, |
| |
| unreadCount: open && !state.isChatOpen ? 0 : state.unreadCount, |
| })), |
| clearUnread: () => set({ unreadCount: 0 }), |
| reset: () => set({ messages: [], unreadCount: 0, isChatOpen: getInitialChatOpen() }), |
| })) |
|
|