ghp / packages /client /src /stores /chatStore.ts
QSLY's picture
deploy: build Hugging Face Space from source
00a912e
Raw
History Blame Contribute Delete
1.42 kB
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,
// Auto-clear unread when opening from closed state
unreadCount: open && !state.isChatOpen ? 0 : state.unreadCount,
})),
clearUnread: () => set({ unreadCount: 0 }),
reset: () => set({ messages: [], unreadCount: 0, isChatOpen: getInitialChatOpen() }),
}))